@stemy/ngx-utils 17.1.4 → 19.0.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/fesm2022/stemy-ngx-utils-tools.mjs.map +1 -1
- package/fesm2022/stemy-ngx-utils.mjs +285 -222
- package/fesm2022/stemy-ngx-utils.mjs.map +1 -1
- package/ngx-utils/ngx-utils.module.d.ts +1 -1
- package/ngx-utils/utils/promise.utils.d.ts +5 -0
- package/package.json +13 -19
- package/public_api.d.ts +1 -0
- package/esm2022/ngx-utils/common-types.mjs +0 -122
- package/esm2022/ngx-utils/components/dynamic-table/dynamic-table.component.mjs +0 -210
- package/esm2022/ngx-utils/components/pagination-menu/pagination-menu.component.mjs +0 -101
- package/esm2022/ngx-utils/components/unordered-list/unordered-list.component.mjs +0 -65
- package/esm2022/ngx-utils/directives/async-method.base.mjs +0 -90
- package/esm2022/ngx-utils/directives/async-method.directive.mjs +0 -21
- package/esm2022/ngx-utils/directives/background.directive.mjs +0 -51
- package/esm2022/ngx-utils/directives/dynamic-table-template.directive.mjs +0 -20
- package/esm2022/ngx-utils/directives/global-template.directive.mjs +0 -28
- package/esm2022/ngx-utils/directives/icon.directive.mjs +0 -67
- package/esm2022/ngx-utils/directives/ngx-template-outlet.directive.mjs +0 -90
- package/esm2022/ngx-utils/directives/pagination-item.directive.mjs +0 -34
- package/esm2022/ngx-utils/directives/pagination.directive.mjs +0 -84
- package/esm2022/ngx-utils/directives/resource-if.directive.mjs +0 -50
- package/esm2022/ngx-utils/directives/sticky-class.directive.mjs +0 -34
- package/esm2022/ngx-utils/directives/sticky.directive.mjs +0 -55
- package/esm2022/ngx-utils/directives/unordered-list-item.directive.mjs +0 -79
- package/esm2022/ngx-utils/directives/unordered-list-template.directive.mjs +0 -20
- package/esm2022/ngx-utils/ngx-utils.imports.mjs +0 -178
- package/esm2022/ngx-utils/ngx-utils.module.mjs +0 -204
- package/esm2022/ngx-utils/pipes/chunk.pipe.mjs +0 -25
- package/esm2022/ngx-utils/pipes/entries.pipe.mjs +0 -28
- package/esm2022/ngx-utils/pipes/extra-item-properties.pipe.mjs +0 -31
- package/esm2022/ngx-utils/pipes/filter.pipe.mjs +0 -37
- package/esm2022/ngx-utils/pipes/find.pipe.mjs +0 -29
- package/esm2022/ngx-utils/pipes/format-number.pipe.mjs +0 -21
- package/esm2022/ngx-utils/pipes/get-offset.pipe.mjs +0 -17
- package/esm2022/ngx-utils/pipes/get-type.pipe.mjs +0 -16
- package/esm2022/ngx-utils/pipes/get-value.pipe.mjs +0 -17
- package/esm2022/ngx-utils/pipes/global-template.pipe.mjs +0 -39
- package/esm2022/ngx-utils/pipes/group-by.pipe.mjs +0 -27
- package/esm2022/ngx-utils/pipes/is-type.pipe.mjs +0 -16
- package/esm2022/ngx-utils/pipes/join.pipe.mjs +0 -19
- package/esm2022/ngx-utils/pipes/keys.pipe.mjs +0 -22
- package/esm2022/ngx-utils/pipes/map.pipe.mjs +0 -29
- package/esm2022/ngx-utils/pipes/max.pipe.mjs +0 -26
- package/esm2022/ngx-utils/pipes/min.pipe.mjs +0 -26
- package/esm2022/ngx-utils/pipes/pop.pipe.mjs +0 -16
- package/esm2022/ngx-utils/pipes/reduce.pipe.mjs +0 -30
- package/esm2022/ngx-utils/pipes/remap.pipe.mjs +0 -32
- package/esm2022/ngx-utils/pipes/replace.pipe.mjs +0 -17
- package/esm2022/ngx-utils/pipes/reverse.pipe.mjs +0 -24
- package/esm2022/ngx-utils/pipes/round.pipe.mjs +0 -21
- package/esm2022/ngx-utils/pipes/safe-html.pipe.mjs +0 -34
- package/esm2022/ngx-utils/pipes/shift.pipe.mjs +0 -16
- package/esm2022/ngx-utils/pipes/split.pipe.mjs +0 -16
- package/esm2022/ngx-utils/pipes/translate.pipe.mjs +0 -86
- package/esm2022/ngx-utils/pipes/values.pipe.mjs +0 -22
- package/esm2022/ngx-utils/plugins/resize-event.plugin.mjs +0 -78
- package/esm2022/ngx-utils/plugins/scroll-event.plugin.mjs +0 -39
- package/esm2022/ngx-utils/services/acl.service.mjs +0 -84
- package/esm2022/ngx-utils/services/api.service.mjs +0 -42
- package/esm2022/ngx-utils/services/auth.service.mjs +0 -14
- package/esm2022/ngx-utils/services/base-http.client.mjs +0 -47
- package/esm2022/ngx-utils/services/base-http.service.mjs +0 -305
- package/esm2022/ngx-utils/services/config.service.mjs +0 -130
- package/esm2022/ngx-utils/services/error-handler.service.mjs +0 -49
- package/esm2022/ngx-utils/services/events.service.mjs +0 -26
- package/esm2022/ngx-utils/services/formatter.service.mjs +0 -49
- package/esm2022/ngx-utils/services/global-template.service.mjs +0 -37
- package/esm2022/ngx-utils/services/icon.service.mjs +0 -26
- package/esm2022/ngx-utils/services/language.service.mjs +0 -124
- package/esm2022/ngx-utils/services/local-http.service.mjs +0 -47
- package/esm2022/ngx-utils/services/open-api.service.mjs +0 -40
- package/esm2022/ngx-utils/services/promise.service.mjs +0 -55
- package/esm2022/ngx-utils/services/state.service.mjs +0 -185
- package/esm2022/ngx-utils/services/static-language.service.mjs +0 -166
- package/esm2022/ngx-utils/services/storage.service.mjs +0 -49
- package/esm2022/ngx-utils/services/toaster.service.mjs +0 -32
- package/esm2022/ngx-utils/services/translated-url.serializer.mjs +0 -73
- package/esm2022/ngx-utils/services/universal.service.mjs +0 -81
- package/esm2022/ngx-utils/services/wasm.service.mjs +0 -46
- package/esm2022/ngx-utils/utils/ajax-request-handler.mjs +0 -40
- package/esm2022/ngx-utils/utils/array.utils.mjs +0 -107
- package/esm2022/ngx-utils/utils/auth.guard.mjs +0 -181
- package/esm2022/ngx-utils/utils/cached-factory.mjs +0 -30
- package/esm2022/ngx-utils/utils/canvas.utils.mjs +0 -388
- package/esm2022/ngx-utils/utils/date.utils.mjs +0 -29
- package/esm2022/ngx-utils/utils/file-system.mjs +0 -25
- package/esm2022/ngx-utils/utils/file.utils.mjs +0 -90
- package/esm2022/ngx-utils/utils/generic-value.mjs +0 -20
- package/esm2022/ngx-utils/utils/geometry.mjs +0 -132
- package/esm2022/ngx-utils/utils/initializer.mjs +0 -20
- package/esm2022/ngx-utils/utils/jsonfn.mjs +0 -45
- package/esm2022/ngx-utils/utils/loader.utils.mjs +0 -55
- package/esm2022/ngx-utils/utils/math.utils.mjs +0 -44
- package/esm2022/ngx-utils/utils/object.utils.mjs +0 -320
- package/esm2022/ngx-utils/utils/observable.utils.mjs +0 -59
- package/esm2022/ngx-utils/utils/reflect.utils.mjs +0 -33
- package/esm2022/ngx-utils/utils/set.utils.mjs +0 -20
- package/esm2022/ngx-utils/utils/string.utils.mjs +0 -41
- package/esm2022/ngx-utils/utils/timer.utils.mjs +0 -52
- package/esm2022/ngx-utils/utils/unique.utils.mjs +0 -24
- package/esm2022/ngx-utils/utils/vector.mjs +0 -77
- package/esm2022/ngx-utils/utils/wasi.mjs +0 -159
- package/esm2022/ngx-utils/utils/wasm-worker-proxy.mjs +0 -99
- package/esm2022/ngx-utils/utils/with-options-provider.mjs +0 -24
- package/esm2022/public_api.mjs +0 -95
- package/esm2022/stemy-ngx-utils.mjs +0 -5
- package/esm2022/tools/config.mjs +0 -71
- package/esm2022/tools/public_api.mjs +0 -2
- package/esm2022/tools/stemy-ngx-utils-tools.mjs +0 -5
|
@@ -1,388 +0,0 @@
|
|
|
1
|
-
import { CanvasColor } from "../common-types";
|
|
2
|
-
import { ObjectUtils } from "./object.utils";
|
|
3
|
-
class BlurStack {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.r = 0;
|
|
6
|
-
this.g = 0;
|
|
7
|
-
this.b = 0;
|
|
8
|
-
this.a = 0;
|
|
9
|
-
this.next = null;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
const mul_table = [
|
|
13
|
-
512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512,
|
|
14
|
-
454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512,
|
|
15
|
-
482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456,
|
|
16
|
-
437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512,
|
|
17
|
-
497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328,
|
|
18
|
-
320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456,
|
|
19
|
-
446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335,
|
|
20
|
-
329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512,
|
|
21
|
-
505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405,
|
|
22
|
-
399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328,
|
|
23
|
-
324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271,
|
|
24
|
-
268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456,
|
|
25
|
-
451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388,
|
|
26
|
-
385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335,
|
|
27
|
-
332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292,
|
|
28
|
-
289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259
|
|
29
|
-
];
|
|
30
|
-
const shg_table = [
|
|
31
|
-
9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17,
|
|
32
|
-
17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19,
|
|
33
|
-
19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,
|
|
34
|
-
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
|
|
35
|
-
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
|
|
36
|
-
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22,
|
|
37
|
-
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
|
|
38
|
-
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
|
|
39
|
-
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
|
|
40
|
-
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
|
|
41
|
-
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
|
|
42
|
-
23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
43
|
-
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
44
|
-
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
45
|
-
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
46
|
-
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24
|
|
47
|
-
];
|
|
48
|
-
export class CanvasUtils {
|
|
49
|
-
static manipulatePixels(canvas, ctx, colorTransformer) {
|
|
50
|
-
const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
51
|
-
const pixels = imgData.data;
|
|
52
|
-
for (let i = 0, n = pixels.length; i < n; i += 4) {
|
|
53
|
-
const clr = new CanvasColor(pixels[i], pixels[i + 1], pixels[i + 2], pixels[i + 3]);
|
|
54
|
-
const greyscale = clr.r * .3 + clr.g * .59 + clr.b * .11;
|
|
55
|
-
const color = colorTransformer(clr, greyscale);
|
|
56
|
-
pixels[i] = color.r;
|
|
57
|
-
pixels[i + 1] = color.g;
|
|
58
|
-
pixels[i + 2] = color.b;
|
|
59
|
-
pixels[i + 3] = color.a;
|
|
60
|
-
}
|
|
61
|
-
ctx.putImageData(imgData, 0, 0);
|
|
62
|
-
}
|
|
63
|
-
static thresholding(canvas, ctx, threshold = 50, colorTransformer) {
|
|
64
|
-
const min = new CanvasColor(0, 0, 0, 255);
|
|
65
|
-
const max = new CanvasColor(0, 0, 0, 0);
|
|
66
|
-
colorTransformer = ObjectUtils.isFunction(colorTransformer) ? colorTransformer : ((color, limit) => {
|
|
67
|
-
return limit ? max : min;
|
|
68
|
-
});
|
|
69
|
-
CanvasUtils.manipulatePixels(canvas, ctx, (color, greyscale) => {
|
|
70
|
-
return colorTransformer(color, greyscale > threshold, greyscale);
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
static stackBlur(canvas, ctx, radius = 10) {
|
|
74
|
-
if (isNaN(radius) || radius < 1)
|
|
75
|
-
return;
|
|
76
|
-
radius |= 0;
|
|
77
|
-
const top_x = 0;
|
|
78
|
-
const top_y = 0;
|
|
79
|
-
const width = canvas.width;
|
|
80
|
-
const height = canvas.height;
|
|
81
|
-
let imageData = null;
|
|
82
|
-
try {
|
|
83
|
-
try {
|
|
84
|
-
imageData = ctx.getImageData(top_x, top_y, width, height);
|
|
85
|
-
}
|
|
86
|
-
catch (e) {
|
|
87
|
-
// NOTE: this part is supposedly only needed if you want to work with local files
|
|
88
|
-
// so it might be okay to remove the whole try/catch block and just use
|
|
89
|
-
// imageData = ctx.getImageData( top_x, top_y, width, height );
|
|
90
|
-
try {
|
|
91
|
-
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
|
|
92
|
-
imageData = ctx.getImageData(top_x, top_y, width, height);
|
|
93
|
-
}
|
|
94
|
-
catch (e) {
|
|
95
|
-
alert("Cannot access local image");
|
|
96
|
-
throw new Error("unable to access local image data: " + e);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch (e) {
|
|
101
|
-
alert("Cannot access image");
|
|
102
|
-
throw new Error("unable to access image data: " + e);
|
|
103
|
-
}
|
|
104
|
-
const pixels = imageData.data;
|
|
105
|
-
let x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum, r_out_sum, g_out_sum, b_out_sum, a_out_sum, r_in_sum, g_in_sum, b_in_sum, a_in_sum, pr, pg, pb, pa, rbs;
|
|
106
|
-
const div = radius + radius + 1;
|
|
107
|
-
const widthMinus1 = width - 1;
|
|
108
|
-
const heightMinus1 = height - 1;
|
|
109
|
-
const radiusPlus1 = radius + 1;
|
|
110
|
-
const sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
|
|
111
|
-
const stackStart = new BlurStack();
|
|
112
|
-
let stackEnd = null;
|
|
113
|
-
let stack = stackStart;
|
|
114
|
-
for (i = 1; i < div; i++) {
|
|
115
|
-
stack = stack.next = new BlurStack();
|
|
116
|
-
if (i == radiusPlus1) {
|
|
117
|
-
stackEnd = stack;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
stack.next = stackStart;
|
|
121
|
-
let stackIn = null;
|
|
122
|
-
let stackOut = null;
|
|
123
|
-
yw = yi = 0;
|
|
124
|
-
const mul_sum = mul_table[radius];
|
|
125
|
-
const shg_sum = shg_table[radius];
|
|
126
|
-
for (y = 0; y < height; y++) {
|
|
127
|
-
r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;
|
|
128
|
-
r_out_sum = radiusPlus1 * (pr = pixels[yi]);
|
|
129
|
-
g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
|
|
130
|
-
b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
|
|
131
|
-
a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
|
|
132
|
-
r_sum += sumFactor * pr;
|
|
133
|
-
g_sum += sumFactor * pg;
|
|
134
|
-
b_sum += sumFactor * pb;
|
|
135
|
-
a_sum += sumFactor * pa;
|
|
136
|
-
stack = stackStart;
|
|
137
|
-
for (i = 0; i < radiusPlus1; i++) {
|
|
138
|
-
stack.r = pr;
|
|
139
|
-
stack.g = pg;
|
|
140
|
-
stack.b = pb;
|
|
141
|
-
stack.a = pa;
|
|
142
|
-
stack = stack.next;
|
|
143
|
-
}
|
|
144
|
-
for (i = 1; i < radiusPlus1; i++) {
|
|
145
|
-
p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);
|
|
146
|
-
r_sum += (stack.r = (pr = pixels[p])) * (rbs = radiusPlus1 - i);
|
|
147
|
-
g_sum += (stack.g = (pg = pixels[p + 1])) * rbs;
|
|
148
|
-
b_sum += (stack.b = (pb = pixels[p + 2])) * rbs;
|
|
149
|
-
a_sum += (stack.a = (pa = pixels[p + 3])) * rbs;
|
|
150
|
-
r_in_sum += pr;
|
|
151
|
-
g_in_sum += pg;
|
|
152
|
-
b_in_sum += pb;
|
|
153
|
-
a_in_sum += pa;
|
|
154
|
-
stack = stack.next;
|
|
155
|
-
}
|
|
156
|
-
stackIn = stackStart;
|
|
157
|
-
stackOut = stackEnd;
|
|
158
|
-
for (x = 0; x < width; x++) {
|
|
159
|
-
pixels[yi + 3] = pa = (a_sum * mul_sum) >> shg_sum;
|
|
160
|
-
if (pa != 0) {
|
|
161
|
-
pa = 255 / pa;
|
|
162
|
-
pixels[yi] = ((r_sum * mul_sum) >> shg_sum) * pa;
|
|
163
|
-
pixels[yi + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;
|
|
164
|
-
pixels[yi + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;
|
|
168
|
-
}
|
|
169
|
-
r_sum -= r_out_sum;
|
|
170
|
-
g_sum -= g_out_sum;
|
|
171
|
-
b_sum -= b_out_sum;
|
|
172
|
-
a_sum -= a_out_sum;
|
|
173
|
-
r_out_sum -= stackIn.r;
|
|
174
|
-
g_out_sum -= stackIn.g;
|
|
175
|
-
b_out_sum -= stackIn.b;
|
|
176
|
-
a_out_sum -= stackIn.a;
|
|
177
|
-
p = (yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1)) << 2;
|
|
178
|
-
r_in_sum += (stackIn.r = pixels[p]);
|
|
179
|
-
g_in_sum += (stackIn.g = pixels[p + 1]);
|
|
180
|
-
b_in_sum += (stackIn.b = pixels[p + 2]);
|
|
181
|
-
a_in_sum += (stackIn.a = pixels[p + 3]);
|
|
182
|
-
r_sum += r_in_sum;
|
|
183
|
-
g_sum += g_in_sum;
|
|
184
|
-
b_sum += b_in_sum;
|
|
185
|
-
a_sum += a_in_sum;
|
|
186
|
-
stackIn = stackIn.next;
|
|
187
|
-
r_out_sum += (pr = stackOut.r);
|
|
188
|
-
g_out_sum += (pg = stackOut.g);
|
|
189
|
-
b_out_sum += (pb = stackOut.b);
|
|
190
|
-
a_out_sum += (pa = stackOut.a);
|
|
191
|
-
r_in_sum -= pr;
|
|
192
|
-
g_in_sum -= pg;
|
|
193
|
-
b_in_sum -= pb;
|
|
194
|
-
a_in_sum -= pa;
|
|
195
|
-
stackOut = stackOut.next;
|
|
196
|
-
yi += 4;
|
|
197
|
-
}
|
|
198
|
-
yw += width;
|
|
199
|
-
}
|
|
200
|
-
for (x = 0; x < width; x++) {
|
|
201
|
-
g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;
|
|
202
|
-
yi = x << 2;
|
|
203
|
-
r_out_sum = radiusPlus1 * (pr = pixels[yi]);
|
|
204
|
-
g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
|
|
205
|
-
b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
|
|
206
|
-
a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
|
|
207
|
-
r_sum += sumFactor * pr;
|
|
208
|
-
g_sum += sumFactor * pg;
|
|
209
|
-
b_sum += sumFactor * pb;
|
|
210
|
-
a_sum += sumFactor * pa;
|
|
211
|
-
stack = stackStart;
|
|
212
|
-
for (i = 0; i < radiusPlus1; i++) {
|
|
213
|
-
stack.r = pr;
|
|
214
|
-
stack.g = pg;
|
|
215
|
-
stack.b = pb;
|
|
216
|
-
stack.a = pa;
|
|
217
|
-
stack = stack.next;
|
|
218
|
-
}
|
|
219
|
-
yp = width;
|
|
220
|
-
for (i = 1; i <= radius; i++) {
|
|
221
|
-
yi = (yp + x) << 2;
|
|
222
|
-
r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i);
|
|
223
|
-
g_sum += (stack.g = (pg = pixels[yi + 1])) * rbs;
|
|
224
|
-
b_sum += (stack.b = (pb = pixels[yi + 2])) * rbs;
|
|
225
|
-
a_sum += (stack.a = (pa = pixels[yi + 3])) * rbs;
|
|
226
|
-
r_in_sum += pr;
|
|
227
|
-
g_in_sum += pg;
|
|
228
|
-
b_in_sum += pb;
|
|
229
|
-
a_in_sum += pa;
|
|
230
|
-
stack = stack.next;
|
|
231
|
-
if (i < heightMinus1) {
|
|
232
|
-
yp += width;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
yi = x;
|
|
236
|
-
stackIn = stackStart;
|
|
237
|
-
stackOut = stackEnd;
|
|
238
|
-
for (y = 0; y < height; y++) {
|
|
239
|
-
p = yi << 2;
|
|
240
|
-
pixels[p + 3] = pa = (a_sum * mul_sum) >> shg_sum;
|
|
241
|
-
if (pa > 0) {
|
|
242
|
-
pa = 255 / pa;
|
|
243
|
-
pixels[p] = ((r_sum * mul_sum) >> shg_sum) * pa;
|
|
244
|
-
pixels[p + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;
|
|
245
|
-
pixels[p + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
pixels[p] = pixels[p + 1] = pixels[p + 2] = 0;
|
|
249
|
-
}
|
|
250
|
-
r_sum -= r_out_sum;
|
|
251
|
-
g_sum -= g_out_sum;
|
|
252
|
-
b_sum -= b_out_sum;
|
|
253
|
-
a_sum -= a_out_sum;
|
|
254
|
-
r_out_sum -= stackIn.r;
|
|
255
|
-
g_out_sum -= stackIn.g;
|
|
256
|
-
b_out_sum -= stackIn.b;
|
|
257
|
-
a_out_sum -= stackIn.a;
|
|
258
|
-
p = (x + (((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width)) << 2;
|
|
259
|
-
r_sum += (r_in_sum += (stackIn.r = pixels[p]));
|
|
260
|
-
g_sum += (g_in_sum += (stackIn.g = pixels[p + 1]));
|
|
261
|
-
b_sum += (b_in_sum += (stackIn.b = pixels[p + 2]));
|
|
262
|
-
a_sum += (a_in_sum += (stackIn.a = pixels[p + 3]));
|
|
263
|
-
stackIn = stackIn.next;
|
|
264
|
-
r_out_sum += (pr = stackOut.r);
|
|
265
|
-
g_out_sum += (pg = stackOut.g);
|
|
266
|
-
b_out_sum += (pb = stackOut.b);
|
|
267
|
-
a_out_sum += (pa = stackOut.a);
|
|
268
|
-
r_in_sum -= pr;
|
|
269
|
-
g_in_sum -= pg;
|
|
270
|
-
b_in_sum -= pb;
|
|
271
|
-
a_in_sum -= pa;
|
|
272
|
-
stackOut = stackOut.next;
|
|
273
|
-
yi += width;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
ctx.putImageData(imageData, top_x, top_y);
|
|
277
|
-
}
|
|
278
|
-
static measureTextFontSize(maxWidth, maxHeight, lines, font, lineHeightPercent = 1.1, canvas) {
|
|
279
|
-
const startSize = maxHeight;
|
|
280
|
-
const context = canvas.getContext("2d");
|
|
281
|
-
if (!canvas) {
|
|
282
|
-
canvas = document.createElement("canvas");
|
|
283
|
-
document.body.appendChild(canvas);
|
|
284
|
-
}
|
|
285
|
-
canvas.width = maxWidth + maxHeight;
|
|
286
|
-
canvas.height = maxHeight * 2;
|
|
287
|
-
let fontSize = CanvasUtils.halveValidateFontSize(startSize, (size) => {
|
|
288
|
-
CanvasUtils.setFontProps(context, font, size);
|
|
289
|
-
const maxTextLinesWidth = CanvasUtils.getTextWidth(context, lines);
|
|
290
|
-
return maxWidth - maxTextLinesWidth;
|
|
291
|
-
});
|
|
292
|
-
const bitmapHeight = CanvasUtils.getTextBitmapHeight(canvas, context, lines, font, fontSize, lineHeightPercent);
|
|
293
|
-
if (bitmapHeight > maxHeight) {
|
|
294
|
-
fontSize = CanvasUtils.halveValidateFontSize(fontSize, (size) => {
|
|
295
|
-
return maxHeight - CanvasUtils.getTextBitmapHeight(canvas, context, lines, font, size, lineHeightPercent);
|
|
296
|
-
});
|
|
297
|
-
}
|
|
298
|
-
return fontSize;
|
|
299
|
-
}
|
|
300
|
-
static drawLines(context, lines, font, size, lineHeightPercent = 1.1, align = "left", baseLine = "top", x = 0, y = 0) {
|
|
301
|
-
CanvasUtils.setFontProps(context, font, size, align, baseLine);
|
|
302
|
-
for (let i = 0; i < lines.length; i++) {
|
|
303
|
-
const line = lines[i];
|
|
304
|
-
context.fillText(line, x, y);
|
|
305
|
-
if (i < lines.length - 1) {
|
|
306
|
-
y += size * lineHeightPercent;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
return y;
|
|
310
|
-
}
|
|
311
|
-
static wrapText(context, text, x, y, maxWidth) {
|
|
312
|
-
const words = text.split(" ");
|
|
313
|
-
const lineHeight = context.measureText("M").width * 1.3;
|
|
314
|
-
const lines = [];
|
|
315
|
-
let line = "";
|
|
316
|
-
for (let n = 0; n < words.length; n++) {
|
|
317
|
-
const testLine = line + words[n] + " ";
|
|
318
|
-
const metrics = context.measureText(testLine);
|
|
319
|
-
const testWidth = metrics.width;
|
|
320
|
-
if (testWidth > maxWidth && n > 0) {
|
|
321
|
-
lines.push(line);
|
|
322
|
-
line = words[n] + " ";
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
line = testLine;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
lines.push(line);
|
|
329
|
-
y -= lineHeight * .5 * lines.length;
|
|
330
|
-
lines.forEach(l => {
|
|
331
|
-
context.fillText(l, x, y);
|
|
332
|
-
y += lineHeight;
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
static setFontProps(context, font, fontSize, align = "left", baseLine = "top") {
|
|
336
|
-
context.font = `${fontSize}px ${font}`;
|
|
337
|
-
context.textAlign = align;
|
|
338
|
-
context.textBaseline = baseLine;
|
|
339
|
-
}
|
|
340
|
-
static getTextWidth(context, lines) {
|
|
341
|
-
let maxWidth = 0;
|
|
342
|
-
for (let i = 0; i < lines.length; i++) {
|
|
343
|
-
const line = lines[i];
|
|
344
|
-
maxWidth = Math.max(maxWidth, context.measureText(line).width);
|
|
345
|
-
}
|
|
346
|
-
return maxWidth;
|
|
347
|
-
}
|
|
348
|
-
static getTextBitmapHeight(canvas, context, lines, font, fontSize, lineHeightPercent) {
|
|
349
|
-
const width = canvas.width;
|
|
350
|
-
const height = canvas.height;
|
|
351
|
-
context.clearRect(0, 0, width, height);
|
|
352
|
-
const textY = CanvasUtils.drawLines(context, lines, font, fontSize, lineHeightPercent, "left", "top", fontSize * .5, fontSize * .5);
|
|
353
|
-
const imageData = context.getImageData(0, 0, width, height);
|
|
354
|
-
let textHeight = 0;
|
|
355
|
-
yLoop: for (let y = 0; y < height; y++) {
|
|
356
|
-
for (let x = 0; x < width; x++) {
|
|
357
|
-
const index = (x + y * width) * 4;
|
|
358
|
-
if (imageData.data[index + 3] > 0) {
|
|
359
|
-
textHeight = y + 1;
|
|
360
|
-
continue yLoop;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
return Math.max(textHeight, textY + fontSize);
|
|
365
|
-
}
|
|
366
|
-
static halveValidateFontSize(startSize, callback) {
|
|
367
|
-
let fontSize = startSize;
|
|
368
|
-
let lastFontSize = 0;
|
|
369
|
-
let direction;
|
|
370
|
-
for (let i = 0; i < 20; i++) {
|
|
371
|
-
direction = callback(fontSize);
|
|
372
|
-
const tempSize = fontSize;
|
|
373
|
-
if (direction < 0) {
|
|
374
|
-
fontSize = fontSize - (Math.abs(fontSize - lastFontSize) / 2);
|
|
375
|
-
}
|
|
376
|
-
else {
|
|
377
|
-
fontSize = fontSize + (Math.abs(fontSize - lastFontSize) / 2);
|
|
378
|
-
}
|
|
379
|
-
lastFontSize = tempSize;
|
|
380
|
-
if (Math.abs(fontSize - lastFontSize) < 0.1) {
|
|
381
|
-
break;
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
fontSize = Math.floor(fontSize);
|
|
385
|
-
return fontSize;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25neC11dGlscy91dGlscy9jYW52YXMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUkzQyxNQUFNLFNBQVM7SUFBZjtRQUNJLE1BQUMsR0FBVyxDQUFDLENBQUM7UUFDZCxNQUFDLEdBQVcsQ0FBQyxDQUFDO1FBQ2QsTUFBQyxHQUFXLENBQUMsQ0FBQztRQUNkLE1BQUMsR0FBVyxDQUFDLENBQUM7UUFDZCxTQUFJLEdBQWMsSUFBSSxDQUFDO0lBQzNCLENBQUM7Q0FBQTtBQUVELE1BQU0sU0FBUyxHQUFHO0lBQ2QsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0NBQUMsQ0FBQztBQUUvRSxNQUFNLFNBQVMsR0FBRztJQUNkLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDN0QsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFF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QUFHLFFBQVEsQ0FBQztZQUN4QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUMxQyxNQUFNO1lBQ1YsQ0FBQztRQUNMLENBQUM7UUFDRCxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NhbnZhc0NvbG9yfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gXCIuL29iamVjdC51dGlsc1wiO1xyXG5cclxuZGVjbGFyZSBjb25zdCBuZXRzY2FwZTogYW55O1xyXG5cclxuY2xhc3MgQmx1clN0YWNrIHtcclxuICAgIHI6IG51bWJlciA9IDA7XHJcbiAgICBnOiBudW1iZXIgPSAwO1xyXG4gICAgYjogbnVtYmVyID0gMDtcclxuICAgIGE6IG51bWJlciA9IDA7XHJcbiAgICBuZXh0OiBCbHVyU3RhY2sgPSBudWxsO1xyXG59XHJcblxyXG5jb25zdCBtdWxfdGFibGUgPSBbXHJcbiAgICA1MTIsIDUxMiwgNDU2LCA1MTIsIDMyOCwgNDU2LCAzMzUsIDUxMiwgNDA1LCAzMjgsIDI3MSwgNDU2LCAzODgsIDMzNSwgMjkyLCA1MTIsXHJcbiAgICA0NTQsIDQwNSwgMzY0LCAzMjgsIDI5OCwgMjcxLCA0OTYsIDQ1NiwgNDIwLCAzODgsIDM2MCwgMzM1LCAzMTIsIDI5MiwgMjczLCA1MTIsXHJcbiAgICA0ODIsIDQ1NCwgNDI4LCA0MDUsIDM4MywgMzY0LCAzNDUsIDMyOCwgMzEyLCAyOTgsIDI4NCwgMjcxLCAyNTksIDQ5NiwgNDc1LCA0NTYsXHJcbiAgICA0MzcsIDQyMCwgNDA0LCAzODgsIDM3NCwgMzYwLCAzNDcsIDMzNSwgMzIzLCAzMTIsIDMwMiwgMjkyLCAyODIsIDI3MywgMjY1LCA1MTIsXHJcbiAgICA0OTcsIDQ4MiwgNDY4LCA0NTQsIDQ0MSwgNDI4LCA0MTcsIDQwNSwgMzk0LCAzODMsIDM3MywgMzY0LCAzNTQsIDM0NSwgMzM3LCAzMjgsXHJcbiAgICAzMjAsIDMxMiwgMzA1LCAyOTgsIDI5MSwgMjg0LCAyNzgsIDI3MSwgMjY1LCAyNTksIDUwNywgNDk2LCA0ODUsIDQ3NSwgNDY1LCA0NTYsXHJcbiAgICA0NDYsIDQzNywgNDI4LCA0MjAsIDQxMiwgNDA0LCAzOTYsIDM4OCwgMzgxLCAzNzQsIDM2NywgMzYwLCAzNTQsIDM0NywgMzQxLCAzMzUsXHJcbiAgICAzMjksIDMyMywgMzE4LCAzMTIsIDMwNywgMzAyLCAyOTcsIDI5MiwgMjg3LCAyODIsIDI3OCwgMjczLCAyNjksIDI2NSwgMjYxLCA1MTIsXHJcbiAgICA1MDUsIDQ5NywgNDg5LCA0ODIsIDQ3NSwgNDY4LCA0NjEsIDQ1NCwgNDQ3LCA0NDEsIDQzNSwgNDI4LCA0MjIsIDQxNywgNDExLCA0MDUsXHJcbiAgICAzOTksIDM5NCwgMzg5LCAzODMsIDM3OCwgMzczLCAzNjgsIDM2NCwgMzU5LCAzNTQsIDM1MCwgMzQ1LCAzNDEsIDMzNywgMzMyLCAzMjgsXHJcbiAgICAzMjQsIDMyMCwgMzE2LCAzMTIsIDMwOSwgMzA1LCAzMDEsIDI5OCwgMjk0LCAyOTEsIDI4NywgMjg0LCAyODEsIDI3OCwgMjc0LCAyNzEsXHJcbiAgICAyNjgsIDI2NSwgMjYyLCAyNTksIDI1NywgNTA3LCA1MDEsIDQ5NiwgNDkxLCA0ODUsIDQ4MCwgNDc1LCA0NzAsIDQ2NSwgNDYwLCA0NTYsXHJcbiAgICA0NTEsIDQ0NiwgNDQyLCA0MzcsIDQzMywgNDI4LCA0MjQsIDQyMCwgNDE2LCA0MTIsIDQwOCwgNDA0LCA0MDAsIDM5NiwgMzkyLCAzODgsXHJcbiAgICAzODUsIDM4MSwgMzc3LCAzNzQsIDM3MCwgMzY3LCAzNjMsIDM2MCwgMzU3LCAzNTQsIDM1MCwgMzQ3LCAzNDQsIDM0MSwgMzM4LCAzMzUsXHJcbiAgICAzMzIsIDMyOSwgMzI2LCAzMjMsIDMyMCwgMzE4LCAzMTUsIDMxMiwgMzEwLCAzMDcsIDMwNCwgMzAyLCAyOTksIDI5NywgMjk0LCAyOTIsXHJcbiAgICAyODksIDI4NywgMjg1LCAyODIsIDI4MCwgMjc4LCAyNzUsIDI3MywgMjcxLCAyNjksIDI2NywgMjY1LCAyNjMsIDI2MSwgMjU5XTtcclxuXHJcbmNvbnN0IHNoZ190YWJsZSA9IFtcclxuICAgIDksIDExLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTcsXHJcbiAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOSxcclxuICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLFxyXG4gICAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjEsXHJcbiAgICAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSxcclxuICAgIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLFxyXG4gICAgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsXHJcbiAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMyxcclxuICAgIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLFxyXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsXHJcbiAgICAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMyxcclxuICAgIDIzLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LFxyXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXHJcbiAgICAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCxcclxuICAgIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LFxyXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNF07XHJcblxyXG5leHBvcnQgY2xhc3MgQ2FudmFzVXRpbHMge1xyXG5cclxuICAgIHN0YXRpYyBtYW5pcHVsYXRlUGl4ZWxzKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBjb2xvclRyYW5zZm9ybWVyOiAoY29sb3I6IENhbnZhc0NvbG9yLCBncmV5c2NhbGU/OiBudW1iZXIpID0+IENhbnZhc0NvbG9yKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW1nRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgICAgICBjb25zdCBwaXhlbHMgPSBpbWdEYXRhLmRhdGE7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBwaXhlbHMubGVuZ3RoOyBpIDwgbjsgaSArPSA0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsciA9IG5ldyBDYW52YXNDb2xvcihwaXhlbHNbaV0sIHBpeGVsc1tpICsgMV0sIHBpeGVsc1tpICsgMl0sIHBpeGVsc1tpICsgM10pO1xyXG4gICAgICAgICAgICBjb25zdCBncmV5c2NhbGUgPSBjbHIuciAqIC4zICsgY2xyLmcgKiAuNTkgKyBjbHIuYiAqIC4xMTtcclxuICAgICAgICAgICAgY29uc3QgY29sb3IgPSBjb2xvclRyYW5zZm9ybWVyKGNsciwgZ3JleXNjYWxlKTtcclxuICAgICAgICAgICAgcGl4ZWxzW2ldID0gY29sb3IucjtcclxuICAgICAgICAgICAgcGl4ZWxzW2kgKyAxXSA9IGNvbG9yLmc7XHJcbiAgICAgICAgICAgIHBpeGVsc1tpICsgMl0gPSBjb2xvci5iO1xyXG4gICAgICAgICAgICBwaXhlbHNbaSArIDNdID0gY29sb3IuYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWdEYXRhLCAwLCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdGhyZXNob2xkaW5nKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCB0aHJlc2hvbGQ6IG51bWJlciA9IDUwLCBjb2xvclRyYW5zZm9ybWVyOiAoY29sb3I6IENhbnZhc0NvbG9yLCBsaW1pdDogYm9vbGVhbiwgZ3JleXNjYWxlPzogbnVtYmVyKSA9PiBDYW52YXNDb2xvcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG1pbiA9IG5ldyBDYW52YXNDb2xvcigwLCAwLCAwLCAyNTUpO1xyXG4gICAgICAgIGNvbnN0IG1heCA9IG5ldyBDYW52YXNDb2xvcigwLCAwLCAwLCAwKTtcclxuICAgICAgICBjb2xvclRyYW5zZm9ybWVyID0gT2JqZWN0VXRpbHMuaXNGdW5jdGlvbihjb2xvclRyYW5zZm9ybWVyKSA/IGNvbG9yVHJhbnNmb3JtZXIgOiAoKGNvbG9yOiBDYW52YXNDb2xvciwgbGltaXQ6IGJvb2xlYW4pOiBDYW52YXNDb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBsaW1pdCA/IG1heCA6IG1pbjtcclxuICAgICAgICB9KTtcclxuICAgICAgICBDYW52YXNVdGlscy5tYW5pcHVsYXRlUGl4ZWxzKGNhbnZhcywgY3R4LCAoY29sb3IsIGdyZXlzY2FsZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gY29sb3JUcmFuc2Zvcm1lcihjb2xvciwgZ3JleXNjYWxlID4gdGhyZXNob2xkLCBncmV5c2NhbGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzdGFja0JsdXIoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHJhZGl1czogbnVtYmVyID0gMTApOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXNOYU4ocmFkaXVzKSB8fCByYWRpdXMgPCAxKSByZXR1cm47XHJcbiAgICAgICAgcmFkaXVzIHw9IDA7XHJcblxyXG4gICAgICAgIGNvbnN0IHRvcF94ID0gMDtcclxuICAgICAgICBjb25zdCB0b3BfeSA9IDA7XHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBjYW52YXMud2lkdGg7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcclxuXHJcbiAgICAgICAgbGV0IGltYWdlRGF0YSA9IG51bGw7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKHRvcF94LCB0b3BfeSwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiB0aGlzIHBhcnQgaXMgc3VwcG9zZWRseSBvbmx5IG5lZWRlZCBpZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggbG9jYWwgZmlsZXNcclxuICAgICAgICAgICAgICAgIC8vIHNvIGl0IG1pZ2h0IGJlIG9rYXkgdG8gcmVtb3ZlIHRoZSB3aG9sZSB0cnkvY2F0Y2ggYmxvY2sgYW5kIGp1c3QgdXNlXHJcbiAgICAgICAgICAgICAgICAvLyBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKCB0b3BfeCwgdG9wX3ksIHdpZHRoLCBoZWlnaHQgKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV0c2NhcGUuc2VjdXJpdHkuUHJpdmlsZWdlTWFuYWdlci5lbmFibGVQcml2aWxlZ2UoXCJVbml2ZXJzYWxCcm93c2VyUmVhZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKHRvcF94LCB0b3BfeSwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoXCJDYW5ub3QgYWNjZXNzIGxvY2FsIGltYWdlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBhY2Nlc3MgbG9jYWwgaW1hZ2UgZGF0YTogXCIgKyBlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgYWxlcnQoXCJDYW5ub3QgYWNjZXNzIGltYWdlXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gYWNjZXNzIGltYWdlIGRhdGE6IFwiICsgZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwaXhlbHMgPSBpbWFnZURhdGEuZGF0YTtcclxuXHJcbiAgICAgICAgbGV0IHgsIHksIGksIHAsIHlwLCB5aSwgeXcsIHJfc3VtLCBnX3N1bSwgYl9zdW0sIGFfc3VtLFxyXG4gICAgICAgICAgICByX291dF9zdW0sIGdfb3V0X3N1bSwgYl9vdXRfc3VtLCBhX291dF9zdW0sXHJcbiAgICAgICAgICAgIHJfaW5fc3VtLCBnX2luX3N1bSwgYl9pbl9zdW0sIGFfaW5fc3VtLFxyXG4gICAgICAgICAgICBwciwgcGcsIHBiLCBwYSwgcmJzO1xyXG5cclxuICAgICAgICBjb25zdCBkaXYgPSByYWRpdXMgKyByYWRpdXMgKyAxO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoTWludXMxID0gd2lkdGggLSAxO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodE1pbnVzMSA9IGhlaWdodCAtIDE7XHJcbiAgICAgICAgY29uc3QgcmFkaXVzUGx1czEgPSByYWRpdXMgKyAxO1xyXG4gICAgICAgIGNvbnN0IHN1bUZhY3RvciA9IHJhZGl1c1BsdXMxICogKHJhZGl1c1BsdXMxICsgMSkgLyAyO1xyXG5cclxuICAgICAgICBjb25zdCBzdGFja1N0YXJ0ID0gbmV3IEJsdXJTdGFjaygpO1xyXG4gICAgICAgIGxldCBzdGFja0VuZCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHN0YWNrID0gc3RhY2tTdGFydDtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IGRpdjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHN0YWNrID0gc3RhY2submV4dCA9IG5ldyBCbHVyU3RhY2soKTtcclxuICAgICAgICAgICAgaWYgKGkgPT0gcmFkaXVzUGx1czEpIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrRW5kID0gc3RhY2s7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgc3RhY2submV4dCA9IHN0YWNrU3RhcnQ7XHJcbiAgICAgICAgbGV0IHN0YWNrSW4gPSBudWxsO1xyXG4gICAgICAgIGxldCBzdGFja091dCA9IG51bGw7XHJcblxyXG4gICAgICAgIHl3ID0geWkgPSAwO1xyXG5cclxuICAgICAgICBjb25zdCBtdWxfc3VtID0gbXVsX3RhYmxlW3JhZGl1c107XHJcbiAgICAgICAgY29uc3Qgc2hnX3N1bSA9IHNoZ190YWJsZVtyYWRpdXNdO1xyXG5cclxuICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcclxuICAgICAgICAgICAgcl9pbl9zdW0gPSBnX2luX3N1bSA9IGJfaW5fc3VtID0gYV9pbl9zdW0gPSByX3N1bSA9IGdfc3VtID0gYl9zdW0gPSBhX3N1bSA9IDA7XHJcblxyXG4gICAgICAgICAgICByX291dF9zdW0gPSByYWRpdXNQbHVzMSAqIChwciA9IHBpeGVsc1t5aV0pO1xyXG4gICAgICAgICAgICBnX291dF9zdW0gPSByYWRpdXNQbHVzMSAqIChwZyA9IHBpeGVsc1t5aSArIDFdKTtcclxuICAgICAgICAgICAgYl9vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGIgPSBwaXhlbHNbeWkgKyAyXSk7XHJcbiAgICAgICAgICAgIGFfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBhID0gcGl4ZWxzW3lpICsgM10pO1xyXG5cclxuICAgICAgICAgICAgcl9zdW0gKz0gc3VtRmFjdG9yICogcHI7XHJcbiAgICAgICAgICAgIGdfc3VtICs9IHN1bUZhY3RvciAqIHBnO1xyXG4gICAgICAgICAgICBiX3N1bSArPSBzdW1GYWN0b3IgKiBwYjtcclxuICAgICAgICAgICAgYV9zdW0gKz0gc3VtRmFjdG9yICogcGE7XHJcblxyXG4gICAgICAgICAgICBzdGFjayA9IHN0YWNrU3RhcnQ7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmFkaXVzUGx1czE7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgc3RhY2suciA9IHByO1xyXG4gICAgICAgICAgICAgICAgc3RhY2suZyA9IHBnO1xyXG4gICAgICAgICAgICAgICAgc3RhY2suYiA9IHBiO1xyXG4gICAgICAgICAgICAgICAgc3RhY2suYSA9IHBhO1xyXG4gICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcmFkaXVzUGx1czE7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcCA9IHlpICsgKCh3aWR0aE1pbnVzMSA8IGkgPyB3aWR0aE1pbnVzMSA6IGkpIDw8IDIpO1xyXG4gICAgICAgICAgICAgICAgcl9zdW0gKz0gKHN0YWNrLnIgPSAocHIgPSBwaXhlbHNbcF0pKSAqIChyYnMgPSByYWRpdXNQbHVzMSAtIGkpO1xyXG4gICAgICAgICAgICAgICAgZ19zdW0gKz0gKHN0YWNrLmcgPSAocGcgPSBwaXhlbHNbcCArIDFdKSkgKiByYnM7XHJcbiAgICAgICAgICAgICAgICBiX3N1bSArPSAoc3RhY2suYiA9IChwYiA9IHBpeGVsc1twICsgMl0pKSAqIHJicztcclxuICAgICAgICAgICAgICAgIGFfc3VtICs9IChzdGFjay5hID0gKHBhID0gcGl4ZWxzW3AgKyAzXSkpICogcmJzO1xyXG5cclxuICAgICAgICAgICAgICAgIHJfaW5fc3VtICs9IHByO1xyXG4gICAgICAgICAgICAgICAgZ19pbl9zdW0gKz0gcGc7XHJcbiAgICAgICAgICAgICAgICBiX2luX3N1bSArPSBwYjtcclxuICAgICAgICAgICAgICAgIGFfaW5fc3VtICs9IHBhO1xyXG5cclxuICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2submV4dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIHN0YWNrSW4gPSBzdGFja1N0YXJ0O1xyXG4gICAgICAgICAgICBzdGFja091dCA9IHN0YWNrRW5kO1xyXG4gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xyXG4gICAgICAgICAgICAgICAgcGl4ZWxzW3lpICsgM10gPSBwYSA9IChhX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW07XHJcbiAgICAgICAgICAgICAgICBpZiAocGEgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhID0gMjU1IC8gcGE7XHJcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3lpXSA9ICgocl9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtKSAqIHBhO1xyXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1t5aSArIDFdID0gKChnX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW0pICogcGE7XHJcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3lpICsgMl0gPSAoKGJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSkgKiBwYTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3lpXSA9IHBpeGVsc1t5aSArIDFdID0gcGl4ZWxzW3lpICsgMl0gPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJfc3VtIC09IHJfb3V0X3N1bTtcclxuICAgICAgICAgICAgICAgIGdfc3VtIC09IGdfb3V0X3N1bTtcclxuICAgICAgICAgICAgICAgIGJfc3VtIC09IGJfb3V0X3N1bTtcclxuICAgICAgICAgICAgICAgIGFfc3VtIC09IGFfb3V0X3N1bTtcclxuXHJcbiAgICAgICAgICAgICAgICByX291dF9zdW0gLT0gc3RhY2tJbi5yO1xyXG4gICAgICAgICAgICAgICAgZ19vdXRfc3VtIC09IHN0YWNrSW4uZztcclxuICAgICAgICAgICAgICAgIGJfb3V0X3N1bSAtPSBzdGFja0luLmI7XHJcbiAgICAgICAgICAgICAgICBhX291dF9zdW0gLT0gc3RhY2tJbi5hO1xyXG5cclxuICAgICAgICAgICAgICAgIHAgPSAoeXcgKyAoKHAgPSB4ICsgcmFkaXVzICsgMSkgPCB3aWR0aE1pbnVzMSA/IHAgOiB3aWR0aE1pbnVzMSkpIDw8IDI7XHJcblxyXG4gICAgICAgICAgICAgICAgcl9pbl9zdW0gKz0gKHN0YWNrSW4uciA9IHBpeGVsc1twXSk7XHJcbiAgICAgICAgICAgICAgICBnX2luX3N1bSArPSAoc3RhY2tJbi5nID0gcGl4ZWxzW3AgKyAxXSk7XHJcbiAgICAgICAgICAgICAgICBiX2luX3N1bSArPSAoc3RhY2tJbi5iID0gcGl4ZWxzW3AgKyAyXSk7XHJcbiAgICAgICAgICAgICAgICBhX2luX3N1bSArPSAoc3RhY2tJbi5hID0gcGl4ZWxzW3AgKyAzXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcl9zdW0gKz0gcl9pbl9zdW07XHJcbiAgICAgICAgICAgICAgICBnX3N1bSArPSBnX2luX3N1bTtcclxuICAgICAgICAgICAgICAgIGJfc3VtICs9IGJfaW5fc3VtO1xyXG4gICAgICAgICAgICAgICAgYV9zdW0gKz0gYV9pbl9zdW07XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhY2tJbiA9IHN0YWNrSW4ubmV4dDtcclxuXHJcbiAgICAgICAgICAgICAgICByX291dF9zdW0gKz0gKHByID0gc3RhY2tPdXQucik7XHJcbiAgICAgICAgICAgICAgICBnX291dF9zdW0gKz0gKHBnID0gc3RhY2tPdXQuZyk7XHJcbiAgICAgICAgICAgICAgICBiX291dF9zdW0gKz0gKHBiID0gc3RhY2tPdXQuYik7XHJcbiAgICAgICAgICAgICAgICBhX291dF9zdW0gKz0gKHBhID0gc3RhY2tPdXQuYSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcl9pbl9zdW0gLT0gcHI7XHJcbiAgICAgICAgICAgICAgICBnX2luX3N1bSAtPSBwZztcclxuICAgICAgICAgICAgICAgIGJfaW5fc3VtIC09IHBiO1xyXG4gICAgICAgICAgICAgICAgYV9pbl9zdW0gLT0gcGE7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhY2tPdXQgPSBzdGFja091dC5uZXh0O1xyXG5cclxuICAgICAgICAgICAgICAgIHlpICs9IDQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgeXcgKz0gd2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcclxuICAgICAgICAgICAgZ19pbl9zdW0gPSBiX2luX3N1bSA9IGFfaW5fc3VtID0gcl9pbl9zdW0gPSBnX3N1bSA9IGJfc3VtID0gYV9zdW0gPSByX3N1bSA9IDA7XHJcblxyXG4gICAgICAgICAgICB5aSA9IHggPDwgMjtcclxuICAgICAgICAgICAgcl9vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocHIgPSBwaXhlbHNbeWldKTtcclxuICAgICAgICAgICAgZ19vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGcgPSBwaXhlbHNbeWkgKyAxXSk7XHJcbiAgICAgICAgICAgIGJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBiID0gcGl4ZWxzW3lpICsgMl0pO1xyXG4gICAgICAgICAgICBhX291dF9zdW0gPSByYWRpdXNQbHVzMSAqIChwYSA9IHBpeGVsc1t5aSArIDNdKTtcclxuXHJcbiAgICAgICAgICAgIHJfc3VtICs9IHN1bUZhY3RvciAqIHByO1xyXG4gICAgICAgICAgICBnX3N1bSArPSBzdW1GYWN0b3IgKiBwZztcclxuICAgICAgICAgICAgYl9zdW0gKz0gc3VtRmFjdG9yICogcGI7XHJcbiAgICAgICAgICAgIGFfc3VtICs9IHN1bUZhY3RvciAqIHBhO1xyXG5cclxuICAgICAgICAgICAgc3RhY2sgPSBzdGFja1N0YXJ0O1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhZGl1c1BsdXMxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrLnIgPSBwcjtcclxuICAgICAgICAgICAgICAgIHN0YWNrLmcgPSBwZztcclxuICAgICAgICAgICAgICAgIHN0YWNrLmIgPSBwYjtcclxuICAgICAgICAgICAgICAgIHN0YWNrLmEgPSBwYTtcclxuICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2submV4dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgeXAgPSB3aWR0aDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gcmFkaXVzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHlpID0gKHlwICsgeCkgPDwgMjtcclxuXHJcbiAgICAgICAgICAgICAgICByX3N1bSArPSAoc3RhY2suciA9IChwciA9IHBpeGVsc1t5aV0pKSAqIChyYnMgPSByYWRpdXNQbHVzMSAtIGkpO1xyXG4gICAgICAgICAgICAgICAgZ19zdW0gKz0gKHN0YWNrLmcgPSAocGcgPSBwaXhlbHNbeWkgKyAxXSkpICogcmJzO1xyXG4gICAgICAgICAgICAgICAgYl9zdW0gKz0gKHN0YWNrLmIgPSAocGIgPSBwaXhlbHNbeWkgKyAyXSkpICogcmJzO1xyXG4gICAgICAgICAgICAgICAgYV9zdW0gKz0gKHN0YWNrLmEgPSAocGEgPSBwaXhlbHNbeWkgKyAzXSkpICogcmJzO1xyXG5cclxuICAgICAgICAgICAgICAgIHJfaW5fc3VtICs9IHByO1xyXG4gICAgICAgICAgICAgICAgZ19pbl9zdW0gKz0gcGc7XHJcbiAgICAgICAgICAgICAgICBiX2luX3N1bSArPSBwYjtcclxuICAgICAgICAgICAgICAgIGFfaW5fc3VtICs9IHBhO1xyXG5cclxuICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2submV4dDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGhlaWdodE1pbnVzMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHlwICs9IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB5aSA9IHg7XHJcbiAgICAgICAgICAgIHN0YWNrSW4gPSBzdGFja1N0YXJ0O1xyXG4gICAgICAgICAgICBzdGFja091dCA9IHN0YWNrRW5kO1xyXG4gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcclxuICAgICAgICAgICAgICAgIHAgPSB5aSA8PCAyO1xyXG4gICAgICAgICAgICAgICAgcGl4ZWxzW3AgKyAzXSA9IHBhID0gKGFfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bTtcclxuICAgICAgICAgICAgICAgIGlmIChwYSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBwYSA9IDI1NSAvIHBhO1xyXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1twXSA9ICgocl9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtKSAqIHBhO1xyXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1twICsgMV0gPSAoKGdfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSkgKiBwYTtcclxuICAgICAgICAgICAgICAgICAgICBwaXhlbHNbcCArIDJdID0gKChiX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW0pICogcGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1twXSA9IHBpeGVsc1twICsgMV0gPSBwaXhlbHNbcCArIDJdID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByX3N1bSAtPSByX291dF9zdW07XHJcbiAgICAgICAgICAgICAgICBnX3N1bSAtPSBnX291dF9zdW07XHJcbiAgICAgICAgICAgICAgICBiX3N1bSAtPSBiX291dF9zdW07XHJcbiAgICAgICAgICAgICAgICBhX3N1bSAtPSBhX291dF9zdW07XHJcblxyXG4gICAgICAgICAgICAgICAgcl9vdXRfc3VtIC09IHN0YWNrSW4ucjtcclxuICAgICAgICAgICAgICAgIGdfb3V0X3N1bSAtPSBzdGFja0luLmc7XHJcbiAgICAgICAgICAgICAgICBiX291dF9zdW0gLT0gc3RhY2tJbi5iO1xyXG4gICAgICAgICAgICAgICAgYV9vdXRfc3VtIC09IHN0YWNrSW4uYTtcclxuXHJcbiAgICAgICAgICAgICAgICBwID0gKHggKyAoKChwID0geSArIHJhZGl1c1BsdXMxKSA8IGhlaWdodE1pbnVzMSA/IHAgOiBoZWlnaHRNaW51czEpICogd2lkdGgpKSA8PCAyO1xyXG5cclxuICAgICAgICAgICAgICAgIHJfc3VtICs9IChyX2luX3N1bSArPSAoc3RhY2tJbi5yID0gcGl4ZWxzW3BdKSk7XHJcbiAgICAgICAgICAgICAgICBnX3N1bSArPSAoZ19pbl9zdW0gKz0gKHN0YWNrSW4uZyA9IHBpeGVsc1twICsgMV0pKTtcclxuICAgICAgICAgICAgICAgIGJfc3VtICs9IChiX2luX3N1bSArPSAoc3RhY2tJbi5iID0gcGl4ZWxzW3AgKyAyXSkpO1xyXG4gICAgICAgICAgICAgICAgYV9zdW0gKz0gKGFfaW5fc3VtICs9IChzdGFja0luLmEgPSBwaXhlbHNbcCArIDNdKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhY2tJbiA9IHN0YWNrSW4ubmV4dDtcclxuXHJcbiAgICAgICAgICAgICAgICByX291dF9zdW0gKz0gKHByID0gc3RhY2tPdXQucik7XHJcbiAgICAgICAgICAgICAgICBnX291dF9zdW0gKz0gKHBnID0gc3RhY2tPdXQuZyk7XHJcbiAgICAgICAgICAgICAgICBiX291dF9zdW0gKz0gKHBiID0gc3RhY2tPdXQuYik7XHJcbiAgICAgICAgICAgICAgICBhX291dF9zdW0gKz0gKHBhID0gc3RhY2tPdXQuYSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcl9pbl9zdW0gLT0gcHI7XHJcbiAgICAgICAgICAgICAgICBnX2luX3N1bSAtPSBwZztcclxuICAgICAgICAgICAgICAgIGJfaW5fc3VtIC09IHBiO1xyXG4gICAgICAgICAgICAgICAgYV9pbl9zdW0gLT0gcGE7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhY2tPdXQgPSBzdGFja091dC5uZXh0O1xyXG5cclxuICAgICAgICAgICAgICAgIHlpICs9IHdpZHRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgdG9wX3gsIHRvcF95KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbWVhc3VyZVRleHRGb250U2l6ZShtYXhXaWR0aDogbnVtYmVyLCBtYXhIZWlnaHQ6IG51bWJlciwgbGluZXM6IHN0cmluZ1tdLCBmb250OiBzdHJpbmcsIGxpbmVIZWlnaHRQZXJjZW50OiBudW1iZXIgPSAxLjEsIGNhbnZhcz86IEhUTUxDYW52YXNFbGVtZW50KTogbnVtYmVyIHtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RhcnRTaXplOiBudW1iZXIgPSBtYXhIZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFjYW52YXMpIHtcclxuICAgICAgICAgICAgY2FudmFzID0gPEhUTUxDYW52YXNFbGVtZW50PmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IG1heFdpZHRoICsgbWF4SGVpZ2h0O1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBtYXhIZWlnaHQgKiAyO1xyXG5cclxuICAgICAgICBsZXQgZm9udFNpemU6IG51bWJlciA9IENhbnZhc1V0aWxzLmhhbHZlVmFsaWRhdGVGb250U2l6ZShzdGFydFNpemUsIChzaXplOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgQ2FudmFzVXRpbHMuc2V0Rm9udFByb3BzKGNvbnRleHQsIGZvbnQsIHNpemUpO1xyXG4gICAgICAgICAgICBjb25zdCBtYXhUZXh0TGluZXNXaWR0aCA9IENhbnZhc1V0aWxzLmdldFRleHRXaWR0aChjb250ZXh0LCBsaW5lcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBtYXhXaWR0aCAtIG1heFRleHRMaW5lc1dpZHRoO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBiaXRtYXBIZWlnaHQ6IG51bWJlciA9IENhbnZhc1V0aWxzLmdldFRleHRCaXRtYXBIZWlnaHQoY2FudmFzLCBjb250ZXh0LCBsaW5lcywgZm9udCwgZm9udFNpemUsIGxpbmVIZWlnaHRQZXJjZW50KTtcclxuICAgICAgICBpZiAoYml0bWFwSGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIGZvbnRTaXplID0gQ2FudmFzVXRpbHMuaGFsdmVWYWxpZGF0ZUZvbnRTaXplKGZvbnRTaXplLCAoc2l6ZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF4SGVpZ2h0IC0gQ2FudmFzVXRpbHMuZ2V0VGV4dEJpdG1hcEhlaWdodChjYW52YXMsIGNvbnRleHQsIGxpbmVzLCBmb250LCBzaXplLCBsaW5lSGVpZ2h0UGVyY2VudCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvbnRTaXplO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBkcmF3TGluZXMoY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBsaW5lczogc3RyaW5nW10sIGZvbnQ6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBsaW5lSGVpZ2h0UGVyY2VudDogbnVtYmVyID0gMS4xLCBhbGlnbjogc3RyaW5nID0gXCJsZWZ0XCIsIGJhc2VMaW5lOiBzdHJpbmcgPSBcInRvcFwiLCB4OiBudW1iZXIgPSAwLCB5OiBudW1iZXIgPSAwKTogbnVtYmVyIHtcclxuICAgICAgICBDYW52YXNVdGlscy5zZXRGb250UHJvcHMoY29udGV4dCwgZm9udCwgc2l6ZSwgYWxpZ24sIGJhc2VMaW5lKTtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZTogc3RyaW5nID0gbGluZXNbaV07XHJcbiAgICAgICAgICAgIGNvbnRleHQuZmlsbFRleHQobGluZSwgeCwgeSk7XHJcbiAgICAgICAgICAgIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgeSArPSBzaXplICogbGluZUhlaWdodFBlcmNlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHdyYXBUZXh0KGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgdGV4dDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgbWF4V2lkdGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gdGV4dC5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IGNvbnRleHQubWVhc3VyZVRleHQoXCJNXCIpLndpZHRoICogMS4zO1xyXG4gICAgICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGxldCBsaW5lID0gXCJcIjtcclxuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHdvcmRzLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlc3RMaW5lID0gbGluZSArIHdvcmRzW25dICsgXCIgXCI7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSBjb250ZXh0Lm1lYXN1cmVUZXh0KHRlc3RMaW5lKTtcclxuICAgICAgICAgICAgY29uc3QgdGVzdFdpZHRoID0gbWV0cmljcy53aWR0aDtcclxuICAgICAgICAgICAgaWYgKHRlc3RXaWR0aCA+IG1heFdpZHRoICYmIG4gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgbGluZSA9IHdvcmRzW25dICsgXCIgXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsaW5lID0gdGVzdExpbmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGluZXMucHVzaChsaW5lKTtcclxuICAgICAgICB5IC09IGxpbmVIZWlnaHQgKiAuNSAqIGxpbmVzLmxlbmd0aDtcclxuICAgICAgICBsaW5lcy5mb3JFYWNoKGwgPT4ge1xyXG4gICAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KGwsIHgsIHkpO1xyXG4gICAgICAgICAgICB5ICs9IGxpbmVIZWlnaHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNldEZvbnRQcm9wcyhjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGZvbnQ6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgYWxpZ246IHN0cmluZyA9IFwibGVmdFwiLCBiYXNlTGluZTogc3RyaW5nID0gXCJ0b3BcIik6IHZvaWQge1xyXG4gICAgICAgIGNvbnRleHQuZm9udCA9IGAke2ZvbnRTaXplfXB4ICR7Zm9udH1gO1xyXG4gICAgICAgIGNvbnRleHQudGV4dEFsaWduID0gPGFueT5hbGlnbjtcclxuICAgICAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9IDxhbnk+YmFzZUxpbmU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGV4dFdpZHRoKGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgbGluZXM6IHN0cmluZ1tdKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgbWF4V2lkdGg6IG51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmU6IHN0cmluZyA9IGxpbmVzW2ldO1xyXG4gICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBjb250ZXh0Lm1lYXN1cmVUZXh0KGxpbmUpLndpZHRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1heFdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldFRleHRCaXRtYXBIZWlnaHQoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBsaW5lczogc3RyaW5nW10sIGZvbnQ6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgbGluZUhlaWdodFBlcmNlbnQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IGNhbnZhcy53aWR0aDtcclxuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IGNhbnZhcy5oZWlnaHQ7XHJcbiAgICAgICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRleHRZID0gQ2FudmFzVXRpbHMuZHJhd0xpbmVzKGNvbnRleHQsIGxpbmVzLCBmb250LCBmb250U2l6ZSwgbGluZUhlaWdodFBlcmNlbnQsIFwibGVmdFwiLCBcInRvcFwiLCBmb250U2l6ZSAqIC41LCBmb250U2l6ZSAqIC41KTtcclxuICAgICAgICBjb25zdCBpbWFnZURhdGE6IEltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICBsZXQgdGV4dEhlaWdodDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgICAgeUxvb3A6Zm9yIChsZXQgeTogbnVtYmVyID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHg6IG51bWJlciA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gKHggKyB5ICogd2lkdGgpICogNDtcclxuICAgICAgICAgICAgICAgIGlmIChpbWFnZURhdGEuZGF0YVtpbmRleCArIDNdID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHRIZWlnaHQgPSB5ICsgMTtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSB5TG9vcDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRleHRIZWlnaHQsIHRleHRZICsgZm9udFNpemUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGhhbHZlVmFsaWRhdGVGb250U2l6ZShzdGFydFNpemU6IG51bWJlciwgY2FsbGJhY2s6IChzaXplOiBudW1iZXIpID0+IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGZvbnRTaXplOiBudW1iZXIgPSBzdGFydFNpemU7XHJcbiAgICAgICAgbGV0IGxhc3RGb250U2l6ZTogbnVtYmVyID0gMDtcclxuICAgICAgICBsZXQgZGlyZWN0aW9uOiBudW1iZXI7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCAyMDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IGNhbGxiYWNrKGZvbnRTaXplKTtcclxuICAgICAgICAgICAgY29uc3QgdGVtcFNpemU6IG51bWJlciA9IGZvbnRTaXplO1xyXG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgZm9udFNpemUgPSBmb250U2l6ZSAtIChNYXRoLmFicyhmb250U2l6ZSAtIGxhc3RGb250U2l6ZSkgLyAyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvbnRTaXplID0gZm9udFNpemUgKyAoTWF0aC5hYnMoZm9udFNpemUgLSBsYXN0Rm9udFNpemUpIC8gMik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdEZvbnRTaXplID0gdGVtcFNpemU7XHJcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhmb250U2l6ZSAtIGxhc3RGb250U2l6ZSkgPCAwLjEpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvbnRTaXplID0gTWF0aC5mbG9vcihmb250U2l6ZSk7XHJcbiAgICAgICAgcmV0dXJuIGZvbnRTaXplO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import moment from "moment";
|
|
2
|
-
export class DateUtils {
|
|
3
|
-
static isHoliday(date) {
|
|
4
|
-
return moment(date).isoWeekday() > 5;
|
|
5
|
-
}
|
|
6
|
-
static isBusinessDay(date) {
|
|
7
|
-
return moment(date).isoWeekday() < 6;
|
|
8
|
-
}
|
|
9
|
-
static add(date, amount, unit) {
|
|
10
|
-
return moment(date).add(amount, unit).toDate();
|
|
11
|
-
}
|
|
12
|
-
static businessAdd(date, amount, unit, freeDays = []) {
|
|
13
|
-
const signal = amount < 0 ? -1 : 1;
|
|
14
|
-
const freeMoments = freeDays.map(d => moment(d));
|
|
15
|
-
let remaining = Math.abs(amount);
|
|
16
|
-
let day = date;
|
|
17
|
-
while (remaining) {
|
|
18
|
-
day = DateUtils.add(day, signal, unit);
|
|
19
|
-
if (DateUtils.isBusinessDay(day) && !freeMoments.some(m => m.isSame(day, "day"))) {
|
|
20
|
-
remaining--;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return day;
|
|
24
|
-
}
|
|
25
|
-
static businessSubtract(date, amount, unit) {
|
|
26
|
-
return DateUtils.businessAdd(date, -amount, unit);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtdXRpbHMvdXRpbHMvZGF0ZS51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsTUFBTSxPQUFPLFNBQVM7SUFFbEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFVO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFVO1FBQzNCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFVLEVBQUUsTUFBMEIsRUFBRSxJQUF3QjtRQUN2RSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQVUsRUFBRSxNQUFjLEVBQUUsSUFBd0IsRUFBRSxXQUFtQixFQUFFO1FBQzFGLE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2YsT0FBTyxTQUFTLEVBQUUsQ0FBQztZQUNmLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkMsSUFBSSxTQUFTLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDL0UsU0FBUyxFQUFFLENBQUM7WUFDaEIsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBVSxFQUFFLE1BQWMsRUFBRSxJQUF3QjtRQUN4RSxPQUFPLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RHVyYXRpb25JbnB1dEFyZzEsIER1cmF0aW9uSW5wdXRBcmcyfSBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERhdGVVdGlscyB7XHJcblxyXG4gICAgc3RhdGljIGlzSG9saWRheShkYXRlOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIG1vbWVudChkYXRlKS5pc29XZWVrZGF5KCkgPiA1O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0J1c2luZXNzRGF5KGRhdGU6IERhdGUpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmlzb1dlZWtkYXkoKSA8IDY7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGFkZChkYXRlOiBEYXRlLCBhbW91bnQ/OiBEdXJhdGlvbklucHV0QXJnMSwgdW5pdD86IER1cmF0aW9uSW5wdXRBcmcyKTogRGF0ZSB7XHJcbiAgICAgICAgcmV0dXJuIG1vbWVudChkYXRlKS5hZGQoYW1vdW50LCB1bml0KS50b0RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYnVzaW5lc3NBZGQoZGF0ZTogRGF0ZSwgYW1vdW50OiBudW1iZXIsIHVuaXQ/OiBEdXJhdGlvbklucHV0QXJnMiwgZnJlZURheXM6IERhdGVbXSA9IFtdKTogRGF0ZSB7XHJcbiAgICAgICAgY29uc3Qgc2lnbmFsID0gYW1vdW50IDwgMCA/IC0xIDogMTtcclxuICAgICAgICBjb25zdCBmcmVlTW9tZW50cyA9IGZyZWVEYXlzLm1hcChkID0+IG1vbWVudChkKSk7XHJcbiAgICAgICAgbGV0IHJlbWFpbmluZyA9IE1hdGguYWJzKGFtb3VudCk7XHJcbiAgICAgICAgbGV0IGRheSA9IGRhdGU7XHJcbiAgICAgICAgd2hpbGUgKHJlbWFpbmluZykge1xyXG4gICAgICAgICAgICBkYXkgPSBEYXRlVXRpbHMuYWRkKGRheSwgc2lnbmFsLCB1bml0KTtcclxuICAgICAgICAgICAgaWYgKERhdGVVdGlscy5pc0J1c2luZXNzRGF5KGRheSkgJiYgIWZyZWVNb21lbnRzLnNvbWUobSA9PiBtLmlzU2FtZShkYXksIFwiZGF5XCIpKSkge1xyXG4gICAgICAgICAgICAgICAgcmVtYWluaW5nLS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRheTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYnVzaW5lc3NTdWJ0cmFjdChkYXRlOiBEYXRlLCBhbW91bnQ6IG51bWJlciwgdW5pdD86IER1cmF0aW9uSW5wdXRBcmcyKTogRGF0ZSB7XHJcbiAgICAgICAgcmV0dXJuIERhdGVVdGlscy5idXNpbmVzc0FkZChkYXRlLCAtYW1vdW50LCB1bml0KTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export class FileSystemEntry {
|
|
2
|
-
constructor(label, meta, image, data, parent, openCb) {
|
|
3
|
-
this.label = label;
|
|
4
|
-
this.meta = meta;
|
|
5
|
-
this.image = image;
|
|
6
|
-
this.data = data;
|
|
7
|
-
this.parent = parent;
|
|
8
|
-
this.openCb = openCb;
|
|
9
|
-
this.path = !parent ? [this] : parent.path.concat([this]);
|
|
10
|
-
this.level = this.path.length - 1;
|
|
11
|
-
this.classes = this.path
|
|
12
|
-
.filter(t => typeof t.data === "string" && t.data.length > 0).map(t => t.data)
|
|
13
|
-
.concat([`level-${this.level}`]);
|
|
14
|
-
}
|
|
15
|
-
open() {
|
|
16
|
-
this.result = this.result || this.openCb(this.data, this);
|
|
17
|
-
this.result.then(res => {
|
|
18
|
-
if (Array.isArray(res))
|
|
19
|
-
return;
|
|
20
|
-
this.result = null;
|
|
21
|
-
});
|
|
22
|
-
return this.result;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zeXN0ZW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3V0aWxzL2ZpbGUtc3lzdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE1BQU0sT0FBTyxlQUFlO0lBUXhCLFlBQXFCLEtBQWEsRUFDYixJQUFZLEVBQ1osS0FBYSxFQUNiLElBQVMsRUFDVCxNQUF1QixFQUN0QixNQUE2QjtRQUw5QixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixTQUFJLEdBQUosSUFBSSxDQUFLO1FBQ1QsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUk7YUFDbkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2FBQzdFLE1BQU0sQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSTtRQUNBLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxPQUFPO1lBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEZpbGVTeXN0ZW1FbnRyeU9wZW5SZXN1bHQgPSBSZWFkb25seUFycmF5PEZpbGVTeXN0ZW1FbnRyeT4gfCBudWxsO1xyXG5cclxuZXhwb3J0IHR5cGUgRmlsZVN5c3RlbUVudHJ5T3BlbkNiID0gKGRhdGE6IGFueSwgcGFyZW50OiBGaWxlU3lzdGVtRW50cnkpID0+IFByb21pc2U8RmlsZVN5c3RlbUVudHJ5T3BlblJlc3VsdD47XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZVN5c3RlbUVudHJ5IHtcclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVzdWx0OiBQcm9taXNlPEZpbGVTeXN0ZW1FbnRyeU9wZW5SZXN1bHQ+O1xyXG5cclxuICAgIHJlYWRvbmx5IHBhdGg6IFJlYWRvbmx5QXJyYXk8RmlsZVN5c3RlbUVudHJ5PjtcclxuICAgIHJlYWRvbmx5IGxldmVsOiBudW1iZXI7XHJcbiAgICByZWFkb25seSBjbGFzc2VzOiBSZWFkb25seUFycmF5PHN0cmluZz47XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgbGFiZWw6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgIHJlYWRvbmx5IG1ldGE6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgIHJlYWRvbmx5IGltYWdlOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICByZWFkb25seSBkYXRhOiBhbnksXHJcbiAgICAgICAgICAgICAgICByZWFkb25seSBwYXJlbnQ6IEZpbGVTeXN0ZW1FbnRyeSxcclxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcGVuQ2I6IEZpbGVTeXN0ZW1FbnRyeU9wZW5DYikge1xyXG4gICAgICAgIHRoaXMucGF0aCA9ICFwYXJlbnQgPyBbdGhpc10gOiBwYXJlbnQucGF0aC5jb25jYXQoW3RoaXNdKTtcclxuICAgICAgICB0aGlzLmxldmVsID0gdGhpcy5wYXRoLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gdGhpcy5wYXRoXHJcbiAgICAgICAgICAgIC5maWx0ZXIodCA9PiB0eXBlb2YgdC5kYXRhID09PSBcInN0cmluZ1wiICYmIHQuZGF0YS5sZW5ndGggPiAwKS5tYXAodCA9PiB0LmRhdGEpXHJcbiAgICAgICAgICAgIC5jb25jYXQoW2BsZXZlbC0ke3RoaXMubGV2ZWx9YF0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9wZW4oKTogUHJvbWlzZTxGaWxlU3lzdGVtRW50cnlPcGVuUmVzdWx0PiB7XHJcbiAgICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLnJlc3VsdCB8fCB0aGlzLm9wZW5DYih0aGlzLmRhdGEsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVzdWx0LnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|