@stemy/ngx-utils 11.0.8 → 11.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.
- package/README.md +27 -27
- package/bundles/stemy-ngx-utils.umd.js +22 -7
- package/bundles/stemy-ngx-utils.umd.js.map +1 -1
- package/bundles/stemy-ngx-utils.umd.min.js +1 -1
- package/bundles/stemy-ngx-utils.umd.min.js.map +1 -1
- package/esm2015/ngx-utils/common-types.js +2 -1
- package/esm2015/ngx-utils/ngx-utils.module.js +6 -2
- package/esm2015/ngx-utils/services/config.service.js +8 -4
- package/esm2015/ngx-utils/services/promise.service.js +4 -1
- package/esm2015/ngx-utils/services/static-language.service.js +9 -7
- package/esm2015/ngx-utils/utils/unique.utils.js +1 -1
- package/esm2015/public_api.js +2 -2
- package/fesm2015/stemy-ngx-utils.js +22 -8
- package/fesm2015/stemy-ngx-utils.js.map +1 -1
- package/ngx-utils/common-types.d.ts +2 -0
- package/ngx-utils/services/config.service.d.ts +3 -1
- package/ngx-utils/services/promise.service.d.ts +5 -4
- package/ngx-utils/services/static-language.service.d.ts +3 -2
- package/package.json +1 -1
- package/public_api.d.ts +1 -1
- package/stemy-ngx-utils.metadata.json +1 -1
- package/esm5/ngx-utils/common-types.js +0 -553
- package/esm5/ngx-utils/components/dynamic-table/dynamic-table.component.js +0 -285
- package/esm5/ngx-utils/components/pagination-menu/pagination-menu.component.js +0 -198
- package/esm5/ngx-utils/components/unordered-list/unordered-list.component.js +0 -110
- package/esm5/ngx-utils/directives/async-method.directive.js +0 -105
- package/esm5/ngx-utils/directives/background.directive.js +0 -91
- package/esm5/ngx-utils/directives/dynamic-table-template.directive.js +0 -34
- package/esm5/ngx-utils/directives/icon.directive.js +0 -101
- package/esm5/ngx-utils/directives/ngx-template-outlet.directive.js +0 -182
- package/esm5/ngx-utils/directives/pagination-item.directive.js +0 -70
- package/esm5/ngx-utils/directives/pagination.directive.js +0 -148
- package/esm5/ngx-utils/directives/resource-if.directive.js +0 -97
- package/esm5/ngx-utils/directives/sticky.directive.js +0 -93
- package/esm5/ngx-utils/directives/unordered-list-item.directive.js +0 -143
- package/esm5/ngx-utils/directives/unordered-list-template.directive.js +0 -54
- package/esm5/ngx-utils/ngx-utils.module.js +0 -205
- package/esm5/ngx-utils/pipes/chunk.pipe.js +0 -41
- package/esm5/ngx-utils/pipes/entries.pipe.js +0 -54
- package/esm5/ngx-utils/pipes/extra-item-properties.pipe.js +0 -51
- package/esm5/ngx-utils/pipes/filter.pipe.js +0 -65
- package/esm5/ngx-utils/pipes/find.pipe.js +0 -51
- package/esm5/ngx-utils/pipes/format-number.pipe.js +0 -44
- package/esm5/ngx-utils/pipes/get-offset.pipe.js +0 -31
- package/esm5/ngx-utils/pipes/get-type.pipe.js +0 -28
- package/esm5/ngx-utils/pipes/group-by.pipe.js +0 -48
- package/esm5/ngx-utils/pipes/is-type.pipe.js +0 -30
- package/esm5/ngx-utils/pipes/join.pipe.js +0 -34
- package/esm5/ngx-utils/pipes/keys.pipe.js +0 -35
- package/esm5/ngx-utils/pipes/map.pipe.js +0 -52
- package/esm5/ngx-utils/pipes/max.pipe.js +0 -45
- package/esm5/ngx-utils/pipes/min.pipe.js +0 -45
- package/esm5/ngx-utils/pipes/reduce.pipe.js +0 -55
- package/esm5/ngx-utils/pipes/remap.pipe.js +0 -51
- package/esm5/ngx-utils/pipes/replace.pipe.js +0 -32
- package/esm5/ngx-utils/pipes/reverse.pipe.js +0 -38
- package/esm5/ngx-utils/pipes/round.pipe.js +0 -44
- package/esm5/ngx-utils/pipes/safe-html.pipe.js +0 -54
- package/esm5/ngx-utils/pipes/translate.pipe.js +0 -111
- package/esm5/ngx-utils/pipes/values.pipe.js +0 -35
- package/esm5/ngx-utils/plugins/resize-event.plugin.js +0 -122
- package/esm5/ngx-utils/plugins/scroll-event.plugin.js +0 -110
- package/esm5/ngx-utils/services/acl.service.js +0 -119
- package/esm5/ngx-utils/services/auth.service.js +0 -40
- package/esm5/ngx-utils/services/events.service.js +0 -33
- package/esm5/ngx-utils/services/formatter.service.js +0 -124
- package/esm5/ngx-utils/services/icon.service.js +0 -32
- package/esm5/ngx-utils/services/language.service.js +0 -199
- package/esm5/ngx-utils/services/promise.service.js +0 -123
- package/esm5/ngx-utils/services/state.service.js +0 -271
- package/esm5/ngx-utils/services/storage.service.js +0 -100
- package/esm5/ngx-utils/services/toaster.service.js +0 -100
- package/esm5/ngx-utils/services/universal.service.js +0 -153
- package/esm5/ngx-utils/utils/ajax-request-handler.js +0 -73
- package/esm5/ngx-utils/utils/array.utils.js +0 -182
- package/esm5/ngx-utils/utils/auth.guard.js +0 -205
- package/esm5/ngx-utils/utils/canvas.utils.js +0 -668
- package/esm5/ngx-utils/utils/date.utils.js +0 -91
- package/esm5/ngx-utils/utils/file.utils.js +0 -201
- package/esm5/ngx-utils/utils/loader.utils.js +0 -90
- package/esm5/ngx-utils/utils/math.utils.js +0 -62
- package/esm5/ngx-utils/utils/object.utils.js +0 -513
- package/esm5/ngx-utils/utils/observable.utils.js +0 -30
- package/esm5/ngx-utils/utils/reflect.utils.js +0 -95
- package/esm5/ngx-utils/utils/set.utils.js +0 -48
- package/esm5/ngx-utils/utils/string.utils.js +0 -94
- package/esm5/ngx-utils/utils/timer.utils.js +0 -100
- package/esm5/ngx-utils/utils/unique.utils.js +0 -54
- package/esm5/ngx-utils/utils/vector.js +0 -223
- package/esm5/public_api.js +0 -73
- package/esm5/stemy-ngx-utils.js +0 -11
- package/fesm5/stemy-ngx-utils.js +0 -6709
- package/fesm5/stemy-ngx-utils.js.map +0 -1
- package/typings.d.ts +0 -5
|
@@ -1,668 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
|
|
4
|
-
*/
|
|
5
|
-
import { CanvasColor } from "../common-types";
|
|
6
|
-
import { ObjectUtils } from "./object.utils";
|
|
7
|
-
var BlurStack = /** @class */ (function () {
|
|
8
|
-
function BlurStack() {
|
|
9
|
-
this.r = 0;
|
|
10
|
-
this.g = 0;
|
|
11
|
-
this.b = 0;
|
|
12
|
-
this.a = 0;
|
|
13
|
-
this.next = null;
|
|
14
|
-
}
|
|
15
|
-
return BlurStack;
|
|
16
|
-
}());
|
|
17
|
-
if (false) {
|
|
18
|
-
/** @type {?} */
|
|
19
|
-
BlurStack.prototype.r;
|
|
20
|
-
/** @type {?} */
|
|
21
|
-
BlurStack.prototype.g;
|
|
22
|
-
/** @type {?} */
|
|
23
|
-
BlurStack.prototype.b;
|
|
24
|
-
/** @type {?} */
|
|
25
|
-
BlurStack.prototype.a;
|
|
26
|
-
/** @type {?} */
|
|
27
|
-
BlurStack.prototype.next;
|
|
28
|
-
}
|
|
29
|
-
/** @type {?} */
|
|
30
|
-
var mul_table = [
|
|
31
|
-
512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512,
|
|
32
|
-
454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512,
|
|
33
|
-
482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456,
|
|
34
|
-
437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512,
|
|
35
|
-
497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328,
|
|
36
|
-
320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456,
|
|
37
|
-
446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335,
|
|
38
|
-
329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512,
|
|
39
|
-
505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405,
|
|
40
|
-
399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328,
|
|
41
|
-
324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271,
|
|
42
|
-
268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456,
|
|
43
|
-
451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388,
|
|
44
|
-
385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335,
|
|
45
|
-
332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292,
|
|
46
|
-
289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259
|
|
47
|
-
];
|
|
48
|
-
/** @type {?} */
|
|
49
|
-
var shg_table = [
|
|
50
|
-
9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17,
|
|
51
|
-
17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19,
|
|
52
|
-
19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,
|
|
53
|
-
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
|
|
54
|
-
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
|
|
55
|
-
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22,
|
|
56
|
-
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
|
|
57
|
-
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
|
|
58
|
-
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
|
|
59
|
-
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
|
|
60
|
-
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
|
|
61
|
-
23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
62
|
-
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
63
|
-
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
64
|
-
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
65
|
-
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24
|
|
66
|
-
];
|
|
67
|
-
var CanvasUtils = /** @class */ (function () {
|
|
68
|
-
function CanvasUtils() {
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* @param {?} canvas
|
|
72
|
-
* @param {?} ctx
|
|
73
|
-
* @param {?} colorTransformer
|
|
74
|
-
* @return {?}
|
|
75
|
-
*/
|
|
76
|
-
CanvasUtils.manipulatePixels = /**
|
|
77
|
-
* @param {?} canvas
|
|
78
|
-
* @param {?} ctx
|
|
79
|
-
* @param {?} colorTransformer
|
|
80
|
-
* @return {?}
|
|
81
|
-
*/
|
|
82
|
-
function (canvas, ctx, colorTransformer) {
|
|
83
|
-
/** @type {?} */
|
|
84
|
-
var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
85
|
-
/** @type {?} */
|
|
86
|
-
var pixels = imgData.data;
|
|
87
|
-
for (var i = 0, n = pixels.length; i < n; i += 4) {
|
|
88
|
-
/** @type {?} */
|
|
89
|
-
var clr = new CanvasColor(pixels[i], pixels[i + 1], pixels[i + 2], pixels[i + 3]);
|
|
90
|
-
/** @type {?} */
|
|
91
|
-
var greyscale = clr.r * .3 + clr.g * .59 + clr.b * .11;
|
|
92
|
-
/** @type {?} */
|
|
93
|
-
var color = colorTransformer(clr, greyscale);
|
|
94
|
-
pixels[i] = color.r;
|
|
95
|
-
pixels[i + 1] = color.g;
|
|
96
|
-
pixels[i + 2] = color.b;
|
|
97
|
-
pixels[i + 3] = color.a;
|
|
98
|
-
}
|
|
99
|
-
ctx.putImageData(imgData, 0, 0);
|
|
100
|
-
};
|
|
101
|
-
/**
|
|
102
|
-
* @param {?} canvas
|
|
103
|
-
* @param {?} ctx
|
|
104
|
-
* @param {?=} threshold
|
|
105
|
-
* @param {?=} colorTransformer
|
|
106
|
-
* @return {?}
|
|
107
|
-
*/
|
|
108
|
-
CanvasUtils.thresholding = /**
|
|
109
|
-
* @param {?} canvas
|
|
110
|
-
* @param {?} ctx
|
|
111
|
-
* @param {?=} threshold
|
|
112
|
-
* @param {?=} colorTransformer
|
|
113
|
-
* @return {?}
|
|
114
|
-
*/
|
|
115
|
-
function (canvas, ctx, threshold, colorTransformer) {
|
|
116
|
-
if (threshold === void 0) { threshold = 50; }
|
|
117
|
-
/** @type {?} */
|
|
118
|
-
var min = new CanvasColor(0, 0, 0, 255);
|
|
119
|
-
/** @type {?} */
|
|
120
|
-
var max = new CanvasColor(0, 0, 0, 0);
|
|
121
|
-
colorTransformer = ObjectUtils.isFunction(colorTransformer) ? colorTransformer : (function (color, limit) {
|
|
122
|
-
return limit ? max : min;
|
|
123
|
-
});
|
|
124
|
-
CanvasUtils.manipulatePixels(canvas, ctx, function (color, greyscale) {
|
|
125
|
-
return colorTransformer(color, greyscale > threshold, greyscale);
|
|
126
|
-
});
|
|
127
|
-
};
|
|
128
|
-
/**
|
|
129
|
-
* @param {?} canvas
|
|
130
|
-
* @param {?} ctx
|
|
131
|
-
* @param {?=} radius
|
|
132
|
-
* @return {?}
|
|
133
|
-
*/
|
|
134
|
-
CanvasUtils.stackBlur = /**
|
|
135
|
-
* @param {?} canvas
|
|
136
|
-
* @param {?} ctx
|
|
137
|
-
* @param {?=} radius
|
|
138
|
-
* @return {?}
|
|
139
|
-
*/
|
|
140
|
-
function (canvas, ctx, radius) {
|
|
141
|
-
if (radius === void 0) { radius = 10; }
|
|
142
|
-
if (isNaN(radius) || radius < 1)
|
|
143
|
-
return;
|
|
144
|
-
radius |= 0;
|
|
145
|
-
/** @type {?} */
|
|
146
|
-
var top_x = 0;
|
|
147
|
-
/** @type {?} */
|
|
148
|
-
var top_y = 0;
|
|
149
|
-
/** @type {?} */
|
|
150
|
-
var width = canvas.width;
|
|
151
|
-
/** @type {?} */
|
|
152
|
-
var height = canvas.height;
|
|
153
|
-
/** @type {?} */
|
|
154
|
-
var imageData = null;
|
|
155
|
-
try {
|
|
156
|
-
try {
|
|
157
|
-
imageData = ctx.getImageData(top_x, top_y, width, height);
|
|
158
|
-
}
|
|
159
|
-
catch (e) {
|
|
160
|
-
// NOTE: this part is supposedly only needed if you want to work with local files
|
|
161
|
-
// so it might be okay to remove the whole try/catch block and just use
|
|
162
|
-
// imageData = ctx.getImageData( top_x, top_y, width, height );
|
|
163
|
-
try {
|
|
164
|
-
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
|
|
165
|
-
imageData = ctx.getImageData(top_x, top_y, width, height);
|
|
166
|
-
}
|
|
167
|
-
catch (e) {
|
|
168
|
-
alert("Cannot access local image");
|
|
169
|
-
throw new Error("unable to access local image data: " + e);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
catch (e) {
|
|
174
|
-
alert("Cannot access image");
|
|
175
|
-
throw new Error("unable to access image data: " + e);
|
|
176
|
-
}
|
|
177
|
-
/** @type {?} */
|
|
178
|
-
var pixels = imageData.data;
|
|
179
|
-
/** @type {?} */
|
|
180
|
-
var x;
|
|
181
|
-
/** @type {?} */
|
|
182
|
-
var y;
|
|
183
|
-
/** @type {?} */
|
|
184
|
-
var i;
|
|
185
|
-
/** @type {?} */
|
|
186
|
-
var p;
|
|
187
|
-
/** @type {?} */
|
|
188
|
-
var yp;
|
|
189
|
-
/** @type {?} */
|
|
190
|
-
var yi;
|
|
191
|
-
/** @type {?} */
|
|
192
|
-
var yw;
|
|
193
|
-
/** @type {?} */
|
|
194
|
-
var r_sum;
|
|
195
|
-
/** @type {?} */
|
|
196
|
-
var g_sum;
|
|
197
|
-
/** @type {?} */
|
|
198
|
-
var b_sum;
|
|
199
|
-
/** @type {?} */
|
|
200
|
-
var a_sum;
|
|
201
|
-
/** @type {?} */
|
|
202
|
-
var r_out_sum;
|
|
203
|
-
/** @type {?} */
|
|
204
|
-
var g_out_sum;
|
|
205
|
-
/** @type {?} */
|
|
206
|
-
var b_out_sum;
|
|
207
|
-
/** @type {?} */
|
|
208
|
-
var a_out_sum;
|
|
209
|
-
/** @type {?} */
|
|
210
|
-
var r_in_sum;
|
|
211
|
-
/** @type {?} */
|
|
212
|
-
var g_in_sum;
|
|
213
|
-
/** @type {?} */
|
|
214
|
-
var b_in_sum;
|
|
215
|
-
/** @type {?} */
|
|
216
|
-
var a_in_sum;
|
|
217
|
-
/** @type {?} */
|
|
218
|
-
var pr;
|
|
219
|
-
/** @type {?} */
|
|
220
|
-
var pg;
|
|
221
|
-
/** @type {?} */
|
|
222
|
-
var pb;
|
|
223
|
-
/** @type {?} */
|
|
224
|
-
var pa;
|
|
225
|
-
/** @type {?} */
|
|
226
|
-
var rbs;
|
|
227
|
-
/** @type {?} */
|
|
228
|
-
var div = radius + radius + 1;
|
|
229
|
-
/** @type {?} */
|
|
230
|
-
var widthMinus1 = width - 1;
|
|
231
|
-
/** @type {?} */
|
|
232
|
-
var heightMinus1 = height - 1;
|
|
233
|
-
/** @type {?} */
|
|
234
|
-
var radiusPlus1 = radius + 1;
|
|
235
|
-
/** @type {?} */
|
|
236
|
-
var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
|
|
237
|
-
/** @type {?} */
|
|
238
|
-
var stackStart = new BlurStack();
|
|
239
|
-
/** @type {?} */
|
|
240
|
-
var stackEnd = null;
|
|
241
|
-
/** @type {?} */
|
|
242
|
-
var stack = stackStart;
|
|
243
|
-
for (i = 1; i < div; i++) {
|
|
244
|
-
stack = stack.next = new BlurStack();
|
|
245
|
-
if (i == radiusPlus1) {
|
|
246
|
-
stackEnd = stack;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
stack.next = stackStart;
|
|
250
|
-
/** @type {?} */
|
|
251
|
-
var stackIn = null;
|
|
252
|
-
/** @type {?} */
|
|
253
|
-
var stackOut = null;
|
|
254
|
-
yw = yi = 0;
|
|
255
|
-
/** @type {?} */
|
|
256
|
-
var mul_sum = mul_table[radius];
|
|
257
|
-
/** @type {?} */
|
|
258
|
-
var shg_sum = shg_table[radius];
|
|
259
|
-
for (y = 0; y < height; y++) {
|
|
260
|
-
r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;
|
|
261
|
-
r_out_sum = radiusPlus1 * (pr = pixels[yi]);
|
|
262
|
-
g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
|
|
263
|
-
b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
|
|
264
|
-
a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
|
|
265
|
-
r_sum += sumFactor * pr;
|
|
266
|
-
g_sum += sumFactor * pg;
|
|
267
|
-
b_sum += sumFactor * pb;
|
|
268
|
-
a_sum += sumFactor * pa;
|
|
269
|
-
stack = stackStart;
|
|
270
|
-
for (i = 0; i < radiusPlus1; i++) {
|
|
271
|
-
stack.r = pr;
|
|
272
|
-
stack.g = pg;
|
|
273
|
-
stack.b = pb;
|
|
274
|
-
stack.a = pa;
|
|
275
|
-
stack = stack.next;
|
|
276
|
-
}
|
|
277
|
-
for (i = 1; i < radiusPlus1; i++) {
|
|
278
|
-
p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);
|
|
279
|
-
r_sum += (stack.r = (pr = pixels[p])) * (rbs = radiusPlus1 - i);
|
|
280
|
-
g_sum += (stack.g = (pg = pixels[p + 1])) * rbs;
|
|
281
|
-
b_sum += (stack.b = (pb = pixels[p + 2])) * rbs;
|
|
282
|
-
a_sum += (stack.a = (pa = pixels[p + 3])) * rbs;
|
|
283
|
-
r_in_sum += pr;
|
|
284
|
-
g_in_sum += pg;
|
|
285
|
-
b_in_sum += pb;
|
|
286
|
-
a_in_sum += pa;
|
|
287
|
-
stack = stack.next;
|
|
288
|
-
}
|
|
289
|
-
stackIn = stackStart;
|
|
290
|
-
stackOut = stackEnd;
|
|
291
|
-
for (x = 0; x < width; x++) {
|
|
292
|
-
pixels[yi + 3] = pa = (a_sum * mul_sum) >> shg_sum;
|
|
293
|
-
if (pa != 0) {
|
|
294
|
-
pa = 255 / pa;
|
|
295
|
-
pixels[yi] = ((r_sum * mul_sum) >> shg_sum) * pa;
|
|
296
|
-
pixels[yi + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;
|
|
297
|
-
pixels[yi + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;
|
|
298
|
-
}
|
|
299
|
-
else {
|
|
300
|
-
pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;
|
|
301
|
-
}
|
|
302
|
-
r_sum -= r_out_sum;
|
|
303
|
-
g_sum -= g_out_sum;
|
|
304
|
-
b_sum -= b_out_sum;
|
|
305
|
-
a_sum -= a_out_sum;
|
|
306
|
-
r_out_sum -= stackIn.r;
|
|
307
|
-
g_out_sum -= stackIn.g;
|
|
308
|
-
b_out_sum -= stackIn.b;
|
|
309
|
-
a_out_sum -= stackIn.a;
|
|
310
|
-
p = (yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1)) << 2;
|
|
311
|
-
r_in_sum += (stackIn.r = pixels[p]);
|
|
312
|
-
g_in_sum += (stackIn.g = pixels[p + 1]);
|
|
313
|
-
b_in_sum += (stackIn.b = pixels[p + 2]);
|
|
314
|
-
a_in_sum += (stackIn.a = pixels[p + 3]);
|
|
315
|
-
r_sum += r_in_sum;
|
|
316
|
-
g_sum += g_in_sum;
|
|
317
|
-
b_sum += b_in_sum;
|
|
318
|
-
a_sum += a_in_sum;
|
|
319
|
-
stackIn = stackIn.next;
|
|
320
|
-
r_out_sum += (pr = stackOut.r);
|
|
321
|
-
g_out_sum += (pg = stackOut.g);
|
|
322
|
-
b_out_sum += (pb = stackOut.b);
|
|
323
|
-
a_out_sum += (pa = stackOut.a);
|
|
324
|
-
r_in_sum -= pr;
|
|
325
|
-
g_in_sum -= pg;
|
|
326
|
-
b_in_sum -= pb;
|
|
327
|
-
a_in_sum -= pa;
|
|
328
|
-
stackOut = stackOut.next;
|
|
329
|
-
yi += 4;
|
|
330
|
-
}
|
|
331
|
-
yw += width;
|
|
332
|
-
}
|
|
333
|
-
for (x = 0; x < width; x++) {
|
|
334
|
-
g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;
|
|
335
|
-
yi = x << 2;
|
|
336
|
-
r_out_sum = radiusPlus1 * (pr = pixels[yi]);
|
|
337
|
-
g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
|
|
338
|
-
b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
|
|
339
|
-
a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
|
|
340
|
-
r_sum += sumFactor * pr;
|
|
341
|
-
g_sum += sumFactor * pg;
|
|
342
|
-
b_sum += sumFactor * pb;
|
|
343
|
-
a_sum += sumFactor * pa;
|
|
344
|
-
stack = stackStart;
|
|
345
|
-
for (i = 0; i < radiusPlus1; i++) {
|
|
346
|
-
stack.r = pr;
|
|
347
|
-
stack.g = pg;
|
|
348
|
-
stack.b = pb;
|
|
349
|
-
stack.a = pa;
|
|
350
|
-
stack = stack.next;
|
|
351
|
-
}
|
|
352
|
-
yp = width;
|
|
353
|
-
for (i = 1; i <= radius; i++) {
|
|
354
|
-
yi = (yp + x) << 2;
|
|
355
|
-
r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i);
|
|
356
|
-
g_sum += (stack.g = (pg = pixels[yi + 1])) * rbs;
|
|
357
|
-
b_sum += (stack.b = (pb = pixels[yi + 2])) * rbs;
|
|
358
|
-
a_sum += (stack.a = (pa = pixels[yi + 3])) * rbs;
|
|
359
|
-
r_in_sum += pr;
|
|
360
|
-
g_in_sum += pg;
|
|
361
|
-
b_in_sum += pb;
|
|
362
|
-
a_in_sum += pa;
|
|
363
|
-
stack = stack.next;
|
|
364
|
-
if (i < heightMinus1) {
|
|
365
|
-
yp += width;
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
yi = x;
|
|
369
|
-
stackIn = stackStart;
|
|
370
|
-
stackOut = stackEnd;
|
|
371
|
-
for (y = 0; y < height; y++) {
|
|
372
|
-
p = yi << 2;
|
|
373
|
-
pixels[p + 3] = pa = (a_sum * mul_sum) >> shg_sum;
|
|
374
|
-
if (pa > 0) {
|
|
375
|
-
pa = 255 / pa;
|
|
376
|
-
pixels[p] = ((r_sum * mul_sum) >> shg_sum) * pa;
|
|
377
|
-
pixels[p + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;
|
|
378
|
-
pixels[p + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;
|
|
379
|
-
}
|
|
380
|
-
else {
|
|
381
|
-
pixels[p] = pixels[p + 1] = pixels[p + 2] = 0;
|
|
382
|
-
}
|
|
383
|
-
r_sum -= r_out_sum;
|
|
384
|
-
g_sum -= g_out_sum;
|
|
385
|
-
b_sum -= b_out_sum;
|
|
386
|
-
a_sum -= a_out_sum;
|
|
387
|
-
r_out_sum -= stackIn.r;
|
|
388
|
-
g_out_sum -= stackIn.g;
|
|
389
|
-
b_out_sum -= stackIn.b;
|
|
390
|
-
a_out_sum -= stackIn.a;
|
|
391
|
-
p = (x + (((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width)) << 2;
|
|
392
|
-
r_sum += (r_in_sum += (stackIn.r = pixels[p]));
|
|
393
|
-
g_sum += (g_in_sum += (stackIn.g = pixels[p + 1]));
|
|
394
|
-
b_sum += (b_in_sum += (stackIn.b = pixels[p + 2]));
|
|
395
|
-
a_sum += (a_in_sum += (stackIn.a = pixels[p + 3]));
|
|
396
|
-
stackIn = stackIn.next;
|
|
397
|
-
r_out_sum += (pr = stackOut.r);
|
|
398
|
-
g_out_sum += (pg = stackOut.g);
|
|
399
|
-
b_out_sum += (pb = stackOut.b);
|
|
400
|
-
a_out_sum += (pa = stackOut.a);
|
|
401
|
-
r_in_sum -= pr;
|
|
402
|
-
g_in_sum -= pg;
|
|
403
|
-
b_in_sum -= pb;
|
|
404
|
-
a_in_sum -= pa;
|
|
405
|
-
stackOut = stackOut.next;
|
|
406
|
-
yi += width;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
ctx.putImageData(imageData, top_x, top_y);
|
|
410
|
-
};
|
|
411
|
-
/**
|
|
412
|
-
* @param {?} maxWidth
|
|
413
|
-
* @param {?} maxHeight
|
|
414
|
-
* @param {?} lines
|
|
415
|
-
* @param {?} font
|
|
416
|
-
* @param {?=} lineHeightPercent
|
|
417
|
-
* @param {?=} canvas
|
|
418
|
-
* @return {?}
|
|
419
|
-
*/
|
|
420
|
-
CanvasUtils.measureTextFontSize = /**
|
|
421
|
-
* @param {?} maxWidth
|
|
422
|
-
* @param {?} maxHeight
|
|
423
|
-
* @param {?} lines
|
|
424
|
-
* @param {?} font
|
|
425
|
-
* @param {?=} lineHeightPercent
|
|
426
|
-
* @param {?=} canvas
|
|
427
|
-
* @return {?}
|
|
428
|
-
*/
|
|
429
|
-
function (maxWidth, maxHeight, lines, font, lineHeightPercent, canvas) {
|
|
430
|
-
if (lineHeightPercent === void 0) { lineHeightPercent = 1.1; }
|
|
431
|
-
/** @type {?} */
|
|
432
|
-
var startSize = maxHeight;
|
|
433
|
-
/** @type {?} */
|
|
434
|
-
var context = canvas.getContext("2d");
|
|
435
|
-
if (!canvas) {
|
|
436
|
-
canvas = (/** @type {?} */ (document.createElement("canvas")));
|
|
437
|
-
document.body.appendChild(canvas);
|
|
438
|
-
}
|
|
439
|
-
canvas.width = maxWidth + maxHeight;
|
|
440
|
-
canvas.height = maxHeight * 2;
|
|
441
|
-
/** @type {?} */
|
|
442
|
-
var fontSize = CanvasUtils.halveValidateFontSize(startSize, function (size) {
|
|
443
|
-
CanvasUtils.setFontProps(context, font, size);
|
|
444
|
-
/** @type {?} */
|
|
445
|
-
var maxTextLinesWidth = CanvasUtils.getTextWidth(context, lines);
|
|
446
|
-
return maxWidth - maxTextLinesWidth;
|
|
447
|
-
});
|
|
448
|
-
/** @type {?} */
|
|
449
|
-
var bitmapHeight = CanvasUtils.getTextBitmapHeight(canvas, context, lines, font, fontSize, lineHeightPercent);
|
|
450
|
-
if (bitmapHeight > maxHeight) {
|
|
451
|
-
fontSize = CanvasUtils.halveValidateFontSize(fontSize, function (size) {
|
|
452
|
-
return maxHeight - CanvasUtils.getTextBitmapHeight(canvas, context, lines, font, size, lineHeightPercent);
|
|
453
|
-
});
|
|
454
|
-
}
|
|
455
|
-
return fontSize;
|
|
456
|
-
};
|
|
457
|
-
/**
|
|
458
|
-
* @param {?} context
|
|
459
|
-
* @param {?} lines
|
|
460
|
-
* @param {?} font
|
|
461
|
-
* @param {?} size
|
|
462
|
-
* @param {?=} lineHeightPercent
|
|
463
|
-
* @param {?=} align
|
|
464
|
-
* @param {?=} baseLine
|
|
465
|
-
* @param {?=} x
|
|
466
|
-
* @param {?=} y
|
|
467
|
-
* @return {?}
|
|
468
|
-
*/
|
|
469
|
-
CanvasUtils.drawLines = /**
|
|
470
|
-
* @param {?} context
|
|
471
|
-
* @param {?} lines
|
|
472
|
-
* @param {?} font
|
|
473
|
-
* @param {?} size
|
|
474
|
-
* @param {?=} lineHeightPercent
|
|
475
|
-
* @param {?=} align
|
|
476
|
-
* @param {?=} baseLine
|
|
477
|
-
* @param {?=} x
|
|
478
|
-
* @param {?=} y
|
|
479
|
-
* @return {?}
|
|
480
|
-
*/
|
|
481
|
-
function (context, lines, font, size, lineHeightPercent, align, baseLine, x, y) {
|
|
482
|
-
if (lineHeightPercent === void 0) { lineHeightPercent = 1.1; }
|
|
483
|
-
if (align === void 0) { align = "left"; }
|
|
484
|
-
if (baseLine === void 0) { baseLine = "top"; }
|
|
485
|
-
if (x === void 0) { x = 0; }
|
|
486
|
-
if (y === void 0) { y = 0; }
|
|
487
|
-
CanvasUtils.setFontProps(context, font, size, align, baseLine);
|
|
488
|
-
for (var i = 0; i < lines.length; i++) {
|
|
489
|
-
/** @type {?} */
|
|
490
|
-
var line = lines[i];
|
|
491
|
-
context.fillText(line, x, y);
|
|
492
|
-
if (i < lines.length - 1) {
|
|
493
|
-
y += size * lineHeightPercent;
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
return y;
|
|
497
|
-
};
|
|
498
|
-
/**
|
|
499
|
-
* @param {?} context
|
|
500
|
-
* @param {?} text
|
|
501
|
-
* @param {?} x
|
|
502
|
-
* @param {?} y
|
|
503
|
-
* @param {?} maxWidth
|
|
504
|
-
* @return {?}
|
|
505
|
-
*/
|
|
506
|
-
CanvasUtils.wrapText = /**
|
|
507
|
-
* @param {?} context
|
|
508
|
-
* @param {?} text
|
|
509
|
-
* @param {?} x
|
|
510
|
-
* @param {?} y
|
|
511
|
-
* @param {?} maxWidth
|
|
512
|
-
* @return {?}
|
|
513
|
-
*/
|
|
514
|
-
function (context, text, x, y, maxWidth) {
|
|
515
|
-
/** @type {?} */
|
|
516
|
-
var words = text.split(" ");
|
|
517
|
-
/** @type {?} */
|
|
518
|
-
var lineHeight = context.measureText("M").width * 1.3;
|
|
519
|
-
/** @type {?} */
|
|
520
|
-
var lines = [];
|
|
521
|
-
/** @type {?} */
|
|
522
|
-
var line = "";
|
|
523
|
-
for (var n = 0; n < words.length; n++) {
|
|
524
|
-
/** @type {?} */
|
|
525
|
-
var testLine = line + words[n] + " ";
|
|
526
|
-
/** @type {?} */
|
|
527
|
-
var metrics = context.measureText(testLine);
|
|
528
|
-
/** @type {?} */
|
|
529
|
-
var testWidth = metrics.width;
|
|
530
|
-
if (testWidth > maxWidth && n > 0) {
|
|
531
|
-
lines.push(line);
|
|
532
|
-
line = words[n] + " ";
|
|
533
|
-
}
|
|
534
|
-
else {
|
|
535
|
-
line = testLine;
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
lines.push(line);
|
|
539
|
-
y -= lineHeight * .5 * lines.length;
|
|
540
|
-
lines.forEach(function (l) {
|
|
541
|
-
context.fillText(l, x, y);
|
|
542
|
-
y += lineHeight;
|
|
543
|
-
});
|
|
544
|
-
};
|
|
545
|
-
/**
|
|
546
|
-
* @param {?} context
|
|
547
|
-
* @param {?} font
|
|
548
|
-
* @param {?} fontSize
|
|
549
|
-
* @param {?=} align
|
|
550
|
-
* @param {?=} baseLine
|
|
551
|
-
* @return {?}
|
|
552
|
-
*/
|
|
553
|
-
CanvasUtils.setFontProps = /**
|
|
554
|
-
* @param {?} context
|
|
555
|
-
* @param {?} font
|
|
556
|
-
* @param {?} fontSize
|
|
557
|
-
* @param {?=} align
|
|
558
|
-
* @param {?=} baseLine
|
|
559
|
-
* @return {?}
|
|
560
|
-
*/
|
|
561
|
-
function (context, font, fontSize, align, baseLine) {
|
|
562
|
-
if (align === void 0) { align = "left"; }
|
|
563
|
-
if (baseLine === void 0) { baseLine = "top"; }
|
|
564
|
-
context.font = fontSize + "px " + font;
|
|
565
|
-
context.textAlign = (/** @type {?} */ (align));
|
|
566
|
-
context.textBaseline = (/** @type {?} */ (baseLine));
|
|
567
|
-
};
|
|
568
|
-
/**
|
|
569
|
-
* @param {?} context
|
|
570
|
-
* @param {?} lines
|
|
571
|
-
* @return {?}
|
|
572
|
-
*/
|
|
573
|
-
CanvasUtils.getTextWidth = /**
|
|
574
|
-
* @param {?} context
|
|
575
|
-
* @param {?} lines
|
|
576
|
-
* @return {?}
|
|
577
|
-
*/
|
|
578
|
-
function (context, lines) {
|
|
579
|
-
/** @type {?} */
|
|
580
|
-
var maxWidth = 0;
|
|
581
|
-
for (var i = 0; i < lines.length; i++) {
|
|
582
|
-
/** @type {?} */
|
|
583
|
-
var line = lines[i];
|
|
584
|
-
maxWidth = Math.max(maxWidth, context.measureText(line).width);
|
|
585
|
-
}
|
|
586
|
-
return maxWidth;
|
|
587
|
-
};
|
|
588
|
-
/**
|
|
589
|
-
* @param {?} canvas
|
|
590
|
-
* @param {?} context
|
|
591
|
-
* @param {?} lines
|
|
592
|
-
* @param {?} font
|
|
593
|
-
* @param {?} fontSize
|
|
594
|
-
* @param {?} lineHeightPercent
|
|
595
|
-
* @return {?}
|
|
596
|
-
*/
|
|
597
|
-
CanvasUtils.getTextBitmapHeight = /**
|
|
598
|
-
* @param {?} canvas
|
|
599
|
-
* @param {?} context
|
|
600
|
-
* @param {?} lines
|
|
601
|
-
* @param {?} font
|
|
602
|
-
* @param {?} fontSize
|
|
603
|
-
* @param {?} lineHeightPercent
|
|
604
|
-
* @return {?}
|
|
605
|
-
*/
|
|
606
|
-
function (canvas, context, lines, font, fontSize, lineHeightPercent) {
|
|
607
|
-
/** @type {?} */
|
|
608
|
-
var width = canvas.width;
|
|
609
|
-
/** @type {?} */
|
|
610
|
-
var height = canvas.height;
|
|
611
|
-
context.clearRect(0, 0, width, height);
|
|
612
|
-
/** @type {?} */
|
|
613
|
-
var textY = CanvasUtils.drawLines(context, lines, font, fontSize, lineHeightPercent, "left", "top", fontSize * .5, fontSize * .5);
|
|
614
|
-
/** @type {?} */
|
|
615
|
-
var imageData = context.getImageData(0, 0, width, height);
|
|
616
|
-
/** @type {?} */
|
|
617
|
-
var textHeight = 0;
|
|
618
|
-
yLoop: for (var y = 0; y < height; y++) {
|
|
619
|
-
for (var x = 0; x < width; x++) {
|
|
620
|
-
/** @type {?} */
|
|
621
|
-
var index = (x + y * width) * 4;
|
|
622
|
-
if (imageData.data[index + 3] > 0) {
|
|
623
|
-
textHeight = y + 1;
|
|
624
|
-
continue yLoop;
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
return Math.max(textHeight, textY + fontSize);
|
|
629
|
-
};
|
|
630
|
-
/**
|
|
631
|
-
* @param {?} startSize
|
|
632
|
-
* @param {?} callback
|
|
633
|
-
* @return {?}
|
|
634
|
-
*/
|
|
635
|
-
CanvasUtils.halveValidateFontSize = /**
|
|
636
|
-
* @param {?} startSize
|
|
637
|
-
* @param {?} callback
|
|
638
|
-
* @return {?}
|
|
639
|
-
*/
|
|
640
|
-
function (startSize, callback) {
|
|
641
|
-
/** @type {?} */
|
|
642
|
-
var fontSize = startSize;
|
|
643
|
-
/** @type {?} */
|
|
644
|
-
var lastFontSize = 0;
|
|
645
|
-
/** @type {?} */
|
|
646
|
-
var direction;
|
|
647
|
-
for (var i = 0; i < 20; i++) {
|
|
648
|
-
direction = callback(fontSize);
|
|
649
|
-
/** @type {?} */
|
|
650
|
-
var tempSize = fontSize;
|
|
651
|
-
if (direction < 0) {
|
|
652
|
-
fontSize = fontSize - (Math.abs(fontSize - lastFontSize) / 2);
|
|
653
|
-
}
|
|
654
|
-
else {
|
|
655
|
-
fontSize = fontSize + (Math.abs(fontSize - lastFontSize) / 2);
|
|
656
|
-
}
|
|
657
|
-
lastFontSize = tempSize;
|
|
658
|
-
if (Math.abs(fontSize - lastFontSize) < 0.1) {
|
|
659
|
-
break;
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
fontSize = Math.floor(fontSize);
|
|
663
|
-
return fontSize;
|
|
664
|
-
};
|
|
665
|
-
return CanvasUtils;
|
|
666
|
-
}());
|
|
667
|
-
export { CanvasUtils };
|
|
668
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0ZW15L25neC11dGlscy8iLCJzb3VyY2VzIjpbIm5neC11dGlscy91dGlscy9jYW52YXMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFJM0M7SUFBQTtRQUNJLE1BQUMsR0FBVyxDQUFDLENBQUM7UUFDZCxNQUFDLEdBQVcsQ0FBQyxDQUFDO1FBQ2QsTUFBQyxHQUFXLENBQUMsQ0FBQztRQUNkLE1BQUMsR0FBVyxDQUFDLENBQUM7UUFDZCxTQUFJLEdBQWMsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFBRCxnQkFBQztBQUFELENBQUMsQUFORCxJQU1DOzs7SUFMRyxzQkFBYzs7SUFDZCxzQkFBYzs7SUFDZCxzQkFBYzs7SUFDZCxzQkFBYzs7SUFDZCx5QkFBdUI7OztJQUdyQixTQUFTLEdBQUc7SUFDZCxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7Q0FBQzs7SUFFeEUsU0FBUyxHQUFHO0lBQ2QsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM3RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVB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cUMsU0FBaUIsRUFBRSxRQUFrQzs7WUFDbEYsUUFBUSxHQUFXLFNBQVM7O1lBQzVCLFlBQVksR0FBVyxDQUFDOztZQUN4QixTQUFpQjtRQUVyQixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pDLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7O2dCQUN6QixRQUFRLEdBQVcsUUFBUTtZQUNqQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2YsUUFBUSxHQUFHLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2pFO2lCQUFNO2dCQUNILFFBQVEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNqRTtZQUNELFlBQVksR0FBRyxRQUFRLENBQUM7WUFDeEIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxHQUFHLEVBQUU7Z0JBQ3pDLE1BQU07YUFDVDtTQUNKO1FBQ0QsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUNMLGtCQUFDO0FBQUQsQ0FBQyxBQTFaRCxJQTBaQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2FudmFzQ29sb3J9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4vb2JqZWN0LnV0aWxzXCI7XHJcblxyXG5kZWNsYXJlIGNvbnN0IG5ldHNjYXBlOiBhbnk7XHJcblxyXG5jbGFzcyBCbHVyU3RhY2sge1xyXG4gICAgcjogbnVtYmVyID0gMDtcclxuICAgIGc6IG51bWJlciA9IDA7XHJcbiAgICBiOiBudW1iZXIgPSAwO1xyXG4gICAgYTogbnVtYmVyID0gMDtcclxuICAgIG5leHQ6IEJsdXJTdGFjayA9IG51bGw7XHJcbn1cclxuXHJcbmNvbnN0IG11bF90YWJsZSA9IFtcclxuICAgIDUxMiwgNTEyLCA0NTYsIDUxMiwgMzI4LCA0NTYsIDMzNSwgNTEyLCA0MDUsIDMyOCwgMjcxLCA0NTYsIDM4OCwgMzM1LCAyOTIsIDUxMixcclxuICAgIDQ1NCwgNDA1LCAzNjQsIDMyOCwgMjk4LCAyNzEsIDQ5NiwgNDU2LCA0MjAsIDM4OCwgMzYwLCAzMzUsIDMxMiwgMjkyLCAyNzMsIDUxMixcclxuICAgIDQ4MiwgNDU0LCA0MjgsIDQwNSwgMzgzLCAzNjQsIDM0NSwgMzI4LCAzMTIsIDI5OCwgMjg0LCAyNzEsIDI1OSwgNDk2LCA0NzUsIDQ1NixcclxuICAgIDQzNywgNDIwLCA0MDQsIDM4OCwgMzc0LCAzNjAsIDM0NywgMzM1LCAzMjMsIDMxMiwgMzAyLCAyOTIsIDI4MiwgMjczLCAyNjUsIDUxMixcclxuICAgIDQ5NywgNDgyLCA0NjgsIDQ1NCwgNDQxLCA0MjgsIDQxNywgNDA1LCAzOTQsIDM4MywgMzczLCAzNjQsIDM1NCwgMzQ1LCAzMzcsIDMyOCxcclxuICAgIDMyMCwgMzEyLCAzMDUsIDI5OCwgMjkxLCAyODQsIDI3OCwgMjcxLCAyNjUsIDI1OSwgNTA3LCA0OTYsIDQ4NSwgNDc1LCA0NjUsIDQ1NixcclxuICAgIDQ0NiwgNDM3LCA0MjgsIDQyMCwgNDEyLCA0MDQsIDM5NiwgMzg4LCAzODEsIDM3NCwgMzY3LCAzNjAsIDM1NCwgMzQ3LCAzNDEsIDMzNSxcclxuICAgIDMyOSwgMzIzLCAzMTgsIDMxMiwgMzA3LCAzMDIsIDI5NywgMjkyLCAyODcsIDI4MiwgMjc4LCAyNzMsIDI2OSwgMjY1LCAyNjEsIDUxMixcclxuICAgIDUwNSwgNDk3LCA0ODksIDQ4MiwgNDc1LCA0NjgsIDQ2MSwgNDU0LCA0NDcsIDQ0MSwgNDM1LCA0MjgsIDQyMiwgNDE3LCA0MTEsIDQwNSxcclxuICAgIDM5OSwgMzk0LCAzODksIDM4MywgMzc4LCAzNzMsIDM2OCwgMzY0LCAzNTksIDM1NCwgMzUwLCAzNDUsIDM0MSwgMzM3LCAzMzIsIDMyOCxcclxuICAgIDMyNCwgMzIwLCAzMTYsIDMxMiwgMzA5LCAzMDUsIDMwMSwgMjk4LCAyOTQsIDI5MSwgMjg3LCAyODQsIDI4MSwgMjc4LCAyNzQsIDI3MSxcclxuICAgIDI2OCwgMjY1LCAyNjIsIDI1OSwgMjU3LCA1MDcsIDUwMSwgNDk2LCA0OTEsIDQ4NSwgNDgwLCA0NzUsIDQ3MCwgNDY1LCA0NjAsIDQ1NixcclxuICAgIDQ1MSwgNDQ2LCA0NDIsIDQzNywgNDMzLCA0MjgsIDQyNCwgNDIwLCA0MTYsIDQxMiwgNDA4LCA0MDQsIDQwMCwgMzk2LCAzOTIsIDM4OCxcclxuICAgIDM4NSwgMzgxLCAzNzcsIDM3NCwgMzcwLCAzNjcsIDM2MywgMzYwLCAzNTcsIDM1NCwgMzUwLCAzNDcsIDM0NCwgMzQxLCAzMzgsIDMzNSxcclxuICAgIDMzMiwgMzI5LCAzMjYsIDMyMywgMzIwLCAzMTgsIDMxNSwgMzEyLCAzMTAsIDMwNywgMzA0LCAzMDIsIDI5OSwgMjk3LCAyOTQsIDI5MixcclxuICAgIDI4OSwgMjg3LCAyODUsIDI4MiwgMjgwLCAyNzgsIDI3NSwgMjczLCAyNzEsIDI2OSwgMjY3LCAyNjUsIDI2MywgMjYxLCAyNTldO1xyXG5cclxuY29uc3Qgc2hnX3RhYmxlID0gW1xyXG4gICAgOSwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNyxcclxuICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE5LFxyXG4gICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsXHJcbiAgICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMSxcclxuICAgIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLFxyXG4gICAgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsXHJcbiAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMixcclxuICAgIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIzLFxyXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsXHJcbiAgICAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMyxcclxuICAgIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLFxyXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXHJcbiAgICAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCxcclxuICAgIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LFxyXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXHJcbiAgICAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0XTtcclxuXHJcbmV4cG9ydCBjbGFzcyBDYW52YXNVdGlscyB7XHJcblxyXG4gICAgc3RhdGljIG1hbmlwdWxhdGVQaXhlbHMoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGNvbG9yVHJhbnNmb3JtZXI6IChjb2xvcjogQ2FudmFzQ29sb3IsIGdyZXlzY2FsZT86IG51bWJlcikgPT4gQ2FudmFzQ29sb3IpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbWdEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG4gICAgICAgIGNvbnN0IHBpeGVscyA9IGltZ0RhdGEuZGF0YTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbiA9IHBpeGVscy5sZW5ndGg7IGkgPCBuOyBpICs9IDQpIHtcclxuICAgICAgICAgICAgY29uc3QgY2xyID0gbmV3IENhbnZhc0NvbG9yKHBpeGVsc1tpXSwgcGl4ZWxzW2kgKyAxXSwgcGl4ZWxzW2kgKyAyXSwgcGl4ZWxzW2kgKyAzXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyZXlzY2FsZSA9IGNsci5yICogLjMgKyBjbHIuZyAqIC41OSArIGNsci5iICogLjExO1xyXG4gICAgICAgICAgICBjb25zdCBjb2xvciA9IGNvbG9yVHJhbnNmb3JtZXIoY2xyLCBncmV5c2NhbGUpO1xyXG4gICAgICAgICAgICBwaXhlbHNbaV0gPSBjb2xvci5yO1xyXG4gICAgICAgICAgICBwaXhlbHNbaSArIDFdID0gY29sb3IuZztcclxuICAgICAgICAgICAgcGl4ZWxzW2kgKyAyXSA9IGNvbG9yLmI7XHJcbiAgICAgICAgICAgIHBpeGVsc1tpICsgM10gPSBjb2xvci5hO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGltZ0RhdGEsIDAsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0aHJlc2hvbGRpbmcoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHRocmVzaG9sZDogbnVtYmVyID0gNTAsIGNvbG9yVHJhbnNmb3JtZXI6IChjb2xvcjogQ2FudmFzQ29sb3IsIGxpbWl0OiBib29sZWFuLCBncmV5c2NhbGU/OiBudW1iZXIpID0+IENhbnZhc0NvbG9yKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbWluID0gbmV3IENhbnZhc0NvbG9yKDAsIDAsIDAsIDI1NSk7XHJcbiAgICAgICAgY29uc3QgbWF4ID0gbmV3IENhbnZhc0NvbG9yKDAsIDAsIDAsIDApO1xyXG4gICAgICAgIGNvbG9yVHJhbnNmb3JtZXIgPSBPYmplY3RVdGlscy5pc0Z1bmN0aW9uKGNvbG9yVHJhbnNmb3JtZXIpID8gY29sb3JUcmFuc2Zvcm1lciA6ICgoY29sb3I6IENhbnZhc0NvbG9yLCBsaW1pdDogYm9vbGVhbik6IENhbnZhc0NvbG9yID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGxpbWl0ID8gbWF4IDogbWluO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIENhbnZhc1V0aWxzLm1hbmlwdWxhdGVQaXhlbHMoY2FudmFzLCBjdHgsIChjb2xvciwgZ3JleXNjYWxlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb2xvclRyYW5zZm9ybWVyKGNvbG9yLCBncmV5c2NhbGUgPiB0aHJlc2hvbGQsIGdyZXlzY2FsZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHN0YWNrQmx1cihjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgcmFkaXVzOiBudW1iZXIgPSAxMCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpc05hTihyYWRpdXMpIHx8IHJhZGl1cyA8IDEpIHJldHVybjtcclxuICAgICAgICByYWRpdXMgfD0gMDtcclxuXHJcbiAgICAgICAgY29uc3QgdG9wX3ggPSAwO1xyXG4gICAgICAgIGNvbnN0IHRvcF95ID0gMDtcclxuICAgICAgICBjb25zdCB3aWR0aCA9IGNhbnZhcy53aWR0aDtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xyXG5cclxuICAgICAgICBsZXQgaW1hZ2VEYXRhID0gbnVsbDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEodG9wX3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgcGFydCBpcyBzdXBwb3NlZGx5IG9ubHkgbmVlZGVkIGlmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBsb2NhbCBmaWxlc1xyXG4gICAgICAgICAgICAgICAgLy8gc28gaXQgbWlnaHQgYmUgb2theSB0byByZW1vdmUgdGhlIHdob2xlIHRyeS9jYXRjaCBibG9jayBhbmQganVzdCB1c2VcclxuICAgICAgICAgICAgICAgIC8vIGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoIHRvcF94LCB0b3BfeSwgd2lkdGgsIGhlaWdodCApO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBuZXRzY2FwZS5zZWN1cml0eS5Qcml2aWxlZ2VNYW5hZ2VyLmVuYWJsZVByaXZpbGVnZShcIlVuaXZlcnNhbEJyb3dzZXJSZWFkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEodG9wX3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGVydChcIkNhbm5vdCBhY2Nlc3MgbG9jYWwgaW1hZ2VcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGFjY2VzcyBsb2NhbCBpbWFnZSBkYXRhOiBcIiArIGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBhbGVydChcIkNhbm5vdCBhY2Nlc3MgaW1hZ2VcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBhY2Nlc3MgaW1hZ2UgZGF0YTogXCIgKyBlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBpeGVscyA9IGltYWdlRGF0YS5kYXRhO1xyXG5cclxuICAgICAgICBsZXQgeCwgeSwgaSwgcCwgeXAsIHlpLCB5dywgcl9zdW0sIGdfc3VtLCBiX3N1bSwgYV9zdW0sXHJcbiAgICAgICAgICAgIHJfb3V0X3N1bSwgZ19vdXRfc3VtLCBiX291dF9zdW0sIGFfb3V0X3N1bSxcclxuICAgICAgICAgICAgcl9pbl9zdW0sIGdfaW5fc3VtLCBiX2luX3N1bSwgYV9pbl9zdW0sXHJcbiAgICAgICAgICAgIHByLCBwZywgcGIsIHBhLCByYnM7XHJcblxyXG4gICAgICAgIGNvbnN0IGRpdiA9IHJhZGl1cyArIHJhZGl1cyArIDE7XHJcbiAgICAgICAgY29uc3Qgd2lkdGhNaW51czEgPSB3aWR0aCAtIDE7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0TWludXMxID0gaGVpZ2h0IC0gMTtcclxuICAgICAgICBjb25zdCByYWRpdXNQbHVzMSA9IHJhZGl1cyArIDE7XHJcbiAgICAgICAgY29uc3Qgc3VtRmFjdG9yID0gcmFkaXVzUGx1czEgKiAocmFkaXVzUGx1czEgKyAxKSAvIDI7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YWNrU3RhcnQgPSBuZXcgQmx1clN0YWNrKCk7XHJcbiAgICAgICAgbGV0IHN0YWNrRW5kID0gbnVsbDtcclxuICAgICAgICBsZXQgc3RhY2sgPSBzdGFja1N0YXJ0O1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZGl2OyBpKyspIHtcclxuICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5uZXh0ID0gbmV3IEJsdXJTdGFjaygpO1xyXG4gICAgICAgICAgICBpZiAoaSA9PSByYWRpdXNQbHVzMSkge1xyXG4gICAgICAgICAgICAgICAgc3RhY2tFbmQgPSBzdGFjaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFjay5uZXh0ID0gc3RhY2tTdGFydDtcclxuICAgICAgICBsZXQgc3RhY2tJbiA9IG51bGw7XHJcbiAgICAgICAgbGV0IHN0YWNrT3V0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgeXcgPSB5aSA9IDA7XHJcblxyXG4gICAgICAgIGNvbnN0IG11bF9zdW0gPSBtdWxfdGFibGVbcmFkaXVzXTtcclxuICAgICAgICBjb25zdCBzaGdfc3VtID0gc2hnX3RhYmxlW3JhZGl1c107XHJcblxyXG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xyXG4gICAgICAgICAgICByX2luX3N1bSA9IGdfaW5fc3VtID0gYl9pbl9zdW0gPSBhX2luX3N1bSA9IHJfc3VtID0gZ19zdW0gPSBiX3N1bSA9IGFfc3VtID0gMDtcclxuXHJcbiAgICAgICAgICAgIHJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHByID0gcGl4ZWxzW3lpXSk7XHJcbiAgICAgICAgICAgIGdfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBnID0gcGl4ZWxzW3lpICsgMV0pO1xyXG4gICAgICAgICAgICBiX291dF9zdW0gPSByYWRpdXNQbHVzMSAqIChwYiA9IHBpeGVsc1t5aSArIDJdKTtcclxuICAgICAgICAgICAgYV9vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGEgPSBwaXhlbHNbeWkgKyAzXSk7XHJcblxyXG4gICAgICAgICAgICByX3N1bSArPSBzdW1GYWN0b3IgKiBwcjtcclxuICAgICAgICAgICAgZ19zdW0gKz0gc3VtRmFjdG9yICogcGc7XHJcbiAgICAgICAgICAgIGJfc3VtICs9IHN1bUZhY3RvciAqIHBiO1xyXG4gICAgICAgICAgICBhX3N1bSArPSBzdW1GYWN0b3IgKiBwYTtcclxuXHJcbiAgICAgICAgICAgIHN0YWNrID0gc3RhY2tTdGFydDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByYWRpdXNQbHVzMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5yID0gcHI7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5nID0gcGc7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5iID0gcGI7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5hID0gcGE7XHJcbiAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByYWRpdXNQbHVzMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBwID0geWkgKyAoKHdpZHRoTWludXMxIDwgaSA/IHdpZHRoTWludXMxIDogaSkgPDwgMik7XHJcbiAgICAgICAgICAgICAgICByX3N1bSArPSAoc3RhY2suciA9IChwciA9IHBpeGVsc1twXSkpICogKHJicyA9IHJhZGl1c1BsdXMxIC0gaSk7XHJcbiAgICAgICAgICAgICAgICBnX3N1bSArPSAoc3RhY2suZyA9IChwZyA9IHBpeGVsc1twICsgMV0pKSAqIHJicztcclxuICAgICAgICAgICAgICAgIGJfc3VtICs9IChzdGFjay5iID0gKHBiID0gcGl4ZWxzW3AgKyAyXSkpICogcmJzO1xyXG4gICAgICAgICAgICAgICAgYV9zdW0gKz0gKHN0YWNrLmEgPSAocGEgPSBwaXhlbHNbcCArIDNdKSkgKiByYnM7XHJcblxyXG4gICAgICAgICAgICAgICAgcl9pbl9zdW0gKz0gcHI7XHJcbiAgICAgICAgICAgICAgICBnX2luX3N1bSArPSBwZztcclxuICAgICAgICAgICAgICAgIGJfaW5fc3VtICs9IHBiO1xyXG4gICAgICAgICAgICAgICAgYV9pbl9zdW0gKz0gcGE7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgc3RhY2tJbiA9IHN0YWNrU3RhcnQ7XHJcbiAgICAgICAgICAgIHN0YWNrT3V0ID0gc3RhY2tFbmQ7XHJcbiAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XHJcbiAgICAgICAgICAgICAgICBwaXhlbHNbeWkgKyAzXSA9IHBhID0gKGFfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bTtcclxuICAgICAgICAgICAgICAgIGlmIChwYSAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGEgPSAyNTUgLyBwYTtcclxuICAgICAgICAgICAgICAgICAgICBwaXhlbHNbeWldID0gKChyX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW0pICogcGE7XHJcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3lpICsgMV0gPSAoKGdfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSkgKiBwYTtcclxuICAgICAgICAgICAgICAgICAgICBwaXhlbHNbeWkgKyAyXSA9ICgoYl9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtKSAqIHBhO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwaXhlbHNbeWldID0gcGl4ZWxzW3lpICsgMV0gPSBwaXhlbHNbeWkgKyAyXSA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcl9zdW0gLT0gcl9vdXRfc3VtO1xyXG4gICAgICAgICAgICAgICAgZ19zdW0gLT0gZ19vdXRfc3VtO1xyXG4gICAgICAgICAgICAgICAgYl9zdW0gLT0gYl9vdXRfc3VtO1xyXG4gICAgICAgICAgICAgICAgYV9zdW0gLT0gYV9vdXRfc3VtO1xyXG5cclxuICAgICAgICAgICAgICAgIHJfb3V0X3N1bSAtPSBzdGFja0luLnI7XHJcbiAgICAgICAgICAgICAgICBnX291dF9zdW0gLT0gc3RhY2tJbi5nO1xyXG4gICAgICAgICAgICAgICAgYl9vdXRfc3VtIC09IHN0YWNrSW4uYjtcclxuICAgICAgICAgICAgICAgIGFfb3V0X3N1bSAtPSBzdGFja0luLmE7XHJcblxyXG4gICAgICAgICAgICAgICAgcCA9ICh5dyArICgocCA9IHggKyByYWRpdXMgKyAxKSA8IHdpZHRoTWludXMxID8gcCA6IHdpZHRoTWludXMxKSkgPDwgMjtcclxuXHJcbiAgICAgICAgICAgICAgICByX2luX3N1bSArPSAoc3RhY2tJbi5yID0gcGl4ZWxzW3BdKTtcclxuICAgICAgICAgICAgICAgIGdfaW5fc3VtICs9IChzdGFja0luLmcgPSBwaXhlbHNbcCArIDFdKTtcclxuICAgICAgICAgICAgICAgIGJfaW5fc3VtICs9IChzdGFja0luLmIgPSBwaXhlbHNbcCArIDJdKTtcclxuICAgICAgICAgICAgICAgIGFfaW5fc3VtICs9IChzdGFja0luLmEgPSBwaXhlbHNbcCArIDNdKTtcclxuXHJcbiAgICAgICAgICAgICAgICByX3N1bSArPSByX2luX3N1bTtcclxuICAgICAgICAgICAgICAgIGdfc3VtICs9IGdfaW5fc3VtO1xyXG4gICAgICAgICAgICAgICAgYl9zdW0gKz0gYl9pbl9zdW07XHJcbiAgICAgICAgICAgICAgICBhX3N1bSArPSBhX2luX3N1bTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGFja0luID0gc3RhY2tJbi5uZXh0O1xyXG5cclxuICAgICAgICAgICAgICAgIHJfb3V0X3N1bSArPSAocHIgPSBzdGFja091dC5yKTtcclxuICAgICAgICAgICAgICAgIGdfb3V0X3N1bSArPSAocGcgPSBzdGFja091dC5nKTtcclxuICAgICAgICAgICAgICAgIGJfb3V0X3N1bSArPSAocGIgPSBzdGFja091dC5iKTtcclxuICAgICAgICAgICAgICAgIGFfb3V0X3N1bSArPSAocGEgPSBzdGFja091dC5hKTtcclxuXHJcbiAgICAgICAgICAgICAgICByX2luX3N1bSAtPSBwcjtcclxuICAgICAgICAgICAgICAgIGdfaW5fc3VtIC09IHBnO1xyXG4gICAgICAgICAgICAgICAgYl9pbl9zdW0gLT0gcGI7XHJcbiAgICAgICAgICAgICAgICBhX2luX3N1bSAtPSBwYTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGFja091dCA9IHN0YWNrT3V0Lm5leHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgeWkgKz0gNDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB5dyArPSB3aWR0aDtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xyXG4gICAgICAgICAgICBnX2luX3N1bSA9IGJfaW5fc3VtID0gYV9pbl9zdW0gPSByX2luX3N1bSA9IGdfc3VtID0gYl9zdW0gPSBhX3N1bSA9IHJfc3VtID0gMDtcclxuXHJcbiAgICAgICAgICAgIHlpID0geCA8PCAyO1xyXG4gICAgICAgICAgICByX291dF9zdW0gPSByYWRpdXNQbHVzMSAqIChwciA9IHBpeGVsc1t5aV0pO1xyXG4gICAgICAgICAgICBnX291dF9zdW0gPSByYWRpdXNQbHVzMSAqIChwZyA9IHBpeGVsc1t5aSArIDFdKTtcclxuICAgICAgICAgICAgYl9vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGIgPSBwaXhlbHNbeWkgKyAyXSk7XHJcbiAgICAgICAgICAgIGFfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBhID0gcGl4ZWxzW3lpICsgM10pO1xyXG5cclxuICAgICAgICAgICAgcl9zdW0gKz0gc3VtRmFjdG9yICogcHI7XHJcbiAgICAgICAgICAgIGdfc3VtICs9IHN1bUZhY3RvciAqIHBnO1xyXG4gICAgICAgICAgICBiX3N1bSArPSBzdW1GYWN0b3IgKiBwYjtcclxuICAgICAgICAgICAgYV9zdW0gKz0gc3VtRmFjdG9yICogcGE7XHJcblxyXG4gICAgICAgICAgICBzdGFjayA9IHN0YWNrU3RhcnQ7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmFkaXVzUGx1czE7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgc3RhY2suciA9IHByO1xyXG4gICAgICAgICAgICAgICAgc3RhY2suZyA9IHBnO1xyXG4gICAgICAgICAgICAgICAgc3RhY2suYiA9IHBiO1xyXG4gICAgICAgICAgICAgICAgc3RhY2suYSA9IHBhO1xyXG4gICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB5cCA9IHdpZHRoO1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSByYWRpdXM7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgeWkgPSAoeXAgKyB4KSA8PCAyO1xyXG5cclxuICAgICAgICAgICAgICAgIHJfc3VtICs9IChzdGFjay5yID0gKHByID0gcGl4ZWxzW3lpXSkpICogKHJicyA9IHJhZGl1c1BsdXMxIC0gaSk7XHJcbiAgICAgICAgICAgICAgICBnX3N1bSArPSAoc3RhY2suZyA9IChwZyA9IHBpeGVsc1t5aSArIDFdKSkgKiByYnM7XHJcbiAgICAgICAgICAgICAgICBiX3N1bSArPSAoc3RhY2suYiA9IChwYiA9IHBpeGVsc1t5aSArIDJdKSkgKiByYnM7XHJcbiAgICAgICAgICAgICAgICBhX3N1bSArPSAoc3RhY2suYSA9IChwYSA9IHBpeGVsc1t5aSArIDNdKSkgKiByYnM7XHJcblxyXG4gICAgICAgICAgICAgICAgcl9pbl9zdW0gKz0gcHI7XHJcbiAgICAgICAgICAgICAgICBnX2luX3N1bSArPSBwZztcclxuICAgICAgICAgICAgICAgIGJfaW5fc3VtICs9IHBiO1xyXG4gICAgICAgICAgICAgICAgYV9pbl9zdW0gKz0gcGE7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpIDwgaGVpZ2h0TWludXMxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeXAgKz0gd2lkdGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHlpID0geDtcclxuICAgICAgICAgICAgc3RhY2tJbiA9IHN0YWNrU3RhcnQ7XHJcbiAgICAgICAgICAgIHN0YWNrT3V0ID0gc3RhY2tFbmQ7XHJcbiAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xyXG4gICAgICAgICAgICAgICAgcCA9IHlpIDw8IDI7XHJcbiAgICAgICAgICAgICAgICBwaXhlbHNbcCArIDNdID0gcGEgPSAoYV9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhID0gMjU1IC8gcGE7XHJcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3BdID0gKChyX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW0pICogcGE7XHJcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3AgKyAxXSA9ICgoZ19zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtKSAqIHBhO1xyXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1twICsgMl0gPSAoKGJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSkgKiBwYTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3BdID0gcGl4ZWxzW3AgKyAxXSA9IHBpeGVsc1twICsgMl0gPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJfc3VtIC09IHJfb3V0X3N1bTtcclxuICAgICAgICAgICAgICAgIGdfc3VtIC09IGdfb3V0X3N1bTtcclxuICAgICAgICAgICAgICAgIGJfc3VtIC09IGJfb3V0X3N1bTtcclxuICAgICAgICAgICAgICAgIGFfc3VtIC09IGFfb3V0X3N1bTtcclxuXHJcbiAgICAgICAgICAgICAgICByX291dF9zdW0gLT0gc3RhY2tJbi5yO1xyXG4gICAgICAgICAgICAgICAgZ19vdXRfc3VtIC09IHN0YWNrSW4uZztcclxuICAgICAgICAgICAgICAgIGJfb3V0X3N1bSAtPSBzdGFja0luLmI7XHJcbiAgICAgICAgICAgICAgICBhX291dF9zdW0gLT0gc3RhY2tJbi5hO1xyXG5cclxuICAgICAgICAgICAgICAgIHAgPSAoeCArICgoKHAgPSB5ICsgcmFkaXVzUGx1czEpIDwgaGVpZ2h0TWludXMxID8gcCA6IGhlaWdodE1pbnVzMSkgKiB3aWR0aCkpIDw8IDI7XHJcblxyXG4gICAgICAgICAgICAgICAgcl9zdW0gKz0gKHJfaW5fc3VtICs9IChzdGFja0luLnIgPSBwaXhlbHNbcF0pKTtcclxuICAgICAgICAgICAgICAgIGdfc3VtICs9IChnX2luX3N1bSArPSAoc3RhY2tJbi5nID0gcGl4ZWxzW3AgKyAxXSkpO1xyXG4gICAgICAgICAgICAgICAgYl9zdW0gKz0gKGJfaW5fc3VtICs9IChzdGFja0luLmIgPSBwaXhlbHNbcCArIDJdKSk7XHJcbiAgICAgICAgICAgICAgICBhX3N1bSArPSAoYV9pbl9zdW0gKz0gKHN0YWNrSW4uYSA9IHBpeGVsc1twICsgM10pKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGFja0luID0gc3RhY2tJbi5uZXh0O1xyXG5cclxuICAgICAgICAgICAgICAgIHJfb3V0X3N1bSArPSAocHIgPSBzdGFja091dC5yKTtcclxuICAgICAgICAgICAgICAgIGdfb3V0X3N1bSArPSAocGcgPSBzdGFja091dC5nKTtcclxuICAgICAgICAgICAgICAgIGJfb3V0X3N1bSArPSAocGIgPSBzdGFja091dC5iKTtcclxuICAgICAgICAgICAgICAgIGFfb3V0X3N1bSArPSAocGEgPSBzdGFja091dC5hKTtcclxuXHJcbiAgICAgICAgICAgICAgICByX2luX3N1bSAtPSBwcjtcclxuICAgICAgICAgICAgICAgIGdfaW5fc3VtIC09IHBnO1xyXG4gICAgICAgICAgICAgICAgYl9pbl9zdW0gLT0gcGI7XHJcbiAgICAgICAgICAgICAgICBhX2luX3N1bSAtPSBwYTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGFja091dCA9IHN0YWNrT3V0Lm5leHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgeWkgKz0gd2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCB0b3BfeCwgdG9wX3kpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBtZWFzdXJlVGV4dEZvbnRTaXplKG1heFdpZHRoOiBudW1iZXIsIG1heEhlaWdodDogbnVtYmVyLCBsaW5lczogc3RyaW5nW10sIGZvbnQ6IHN0cmluZywgbGluZUhlaWdodFBlcmNlbnQ6IG51bWJlciA9IDEuMSwgY2FudmFzPzogSFRNTENhbnZhc0VsZW1lbnQpOiBudW1iZXIge1xyXG5cclxuICAgICAgICBjb25zdCBzdGFydFNpemU6IG51bWJlciA9IG1heEhlaWdodDtcclxuICAgICAgICBjb25zdCBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWNhbnZhcykge1xyXG4gICAgICAgICAgICBjYW52YXMgPSA8SFRNTENhbnZhc0VsZW1lbnQ+ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FudmFzLndpZHRoID0gbWF4V2lkdGggKyBtYXhIZWlnaHQ7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IG1heEhlaWdodCAqIDI7XHJcblxyXG4gICAgICAgIGxldCBmb250U2l6ZTogbnVtYmVyID0gQ2FudmFzVXRpbHMuaGFsdmVWYWxpZGF0ZUZvbnRTaXplKHN0YXJ0U2l6ZSwgKHNpemU6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICBDYW52YXNVdGlscy5zZXRGb250UHJvcHMoY29udGV4dCwgZm9udCwgc2l6ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1heFRleHRMaW5lc1dpZHRoID0gQ2FudmFzVXRpbHMuZ2V0VGV4dFdpZHRoKGNvbnRleHQsIGxpbmVzKTtcclxuICAgICAgICAgICAgcmV0dXJuIG1heFdpZHRoIC0gbWF4VGV4dExpbmVzV2lkdGg7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJpdG1hcEhlaWdodDogbnVtYmVyID0gQ2FudmFzVXRpbHMuZ2V0VGV4dEJpdG1hcEhlaWdodChjYW52YXMsIGNvbnRleHQsIGxpbmVzLCBmb250LCBmb250U2l6ZSwgbGluZUhlaWdodFBlcmNlbnQpO1xyXG4gICAgICAgIGlmIChiaXRtYXBIZWlnaHQgPiBtYXhIZWlnaHQpIHtcclxuICAgICAgICAgICAgZm9udFNpemUgPSBDYW52YXNVdGlscy5oYWx2ZVZhbGlkYXRlRm9udFNpemUoZm9udFNpemUsIChzaXplOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtYXhIZWlnaHQgLSBDYW52YXNVdGlscy5nZXRUZXh0Qml0bWFwSGVpZ2h0KGNhbnZhcywgY29udGV4dCwgbGluZXMsIGZvbnQsIHNpemUsIGxpbmVIZWlnaHRQZXJjZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZm9udFNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGRyYXdMaW5lcyhjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGxpbmVzOiBzdHJpbmdbXSwgZm9udDogc3RyaW5nLCBzaXplOiBudW1iZXIsIGxpbmVIZWlnaHRQZXJjZW50OiBudW1iZXIgPSAxLjEsIGFsaWduOiBzdHJpbmcgPSBcImxlZnRcIiwgYmFzZUxpbmU6IHN0cmluZyA9IFwidG9wXCIsIHg6IG51bWJlciA9IDAsIHk6IG51bWJlciA9IDApOiBudW1iZXIge1xyXG4gICAgICAgIENhbnZhc1V0aWxzLnNldEZvbnRQcm9wcyhjb250ZXh0LCBmb250LCBzaXplLCBhbGlnbiwgYmFzZUxpbmUpO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lOiBzdHJpbmcgPSBsaW5lc1tpXTtcclxuICAgICAgICAgICAgY29udGV4dC5maWxsVGV4dChsaW5lLCB4LCB5KTtcclxuICAgICAgICAgICAgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICB5ICs9IHNpemUgKiBsaW5lSGVpZ2h0UGVyY2VudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgd3JhcFRleHQoY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCB0ZXh0OiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBtYXhXaWR0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgd29yZHMgPSB0ZXh0LnNwbGl0KFwiIFwiKTtcclxuICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gY29udGV4dC5tZWFzdXJlVGV4dChcIk1cIikud2lkdGggKiAxLjM7XHJcbiAgICAgICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgbGV0IGxpbmUgPSBcIlwiO1xyXG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgd29yZHMubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdGVzdExpbmUgPSBsaW5lICsgd29yZHNbbl0gKyBcIiBcIjtcclxuICAgICAgICAgICAgY29uc3QgbWV0cmljcyA9IGNvbnRleHQubWVhc3VyZVRleHQodGVzdExpbmUpO1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0V2lkdGggPSBtZXRyaWNzLndpZHRoO1xyXG4gICAgICAgICAgICBpZiAodGVzdFdpZHRoID4gbWF4V2lkdGggJiYgbiA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XHJcbiAgICAgICAgICAgICAgICBsaW5lID0gd29yZHNbbl0gKyBcIiBcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxpbmUgPSB0ZXN0TGluZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xyXG4gICAgICAgIHkgLT0gbGluZUhlaWdodCAqIC41ICogbGluZXMubGVuZ3RoO1xyXG4gICAgICAgIGxpbmVzLmZvckVhY2gobCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZmlsbFRleHQobCwgeCwgeSk7XHJcbiAgICAgICAgICAgIHkgKz0gbGluZUhlaWdodDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2V0Rm9udFByb3BzKGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgZm9udDogc3RyaW5nLCBmb250U2l6ZTogbnVtYmVyLCBhbGlnbjogc3RyaW5nID0gXCJsZWZ0XCIsIGJhc2VMaW5lOiBzdHJpbmcgPSBcInRvcFwiKTogdm9pZCB7XHJcbiAgICAgICAgY29udGV4dC5mb250ID0gYCR7Zm9udFNpemV9cHggJHtmb250fWA7XHJcbiAgICAgICAgY29udGV4dC50ZXh0QWxpZ24gPSA8YW55PmFsaWduO1xyXG4gICAgICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gPGFueT5iYXNlTGluZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUZXh0V2lkdGgoY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBsaW5lczogc3RyaW5nW10pOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBtYXhXaWR0aDogbnVtYmVyID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZTogc3RyaW5nID0gbGluZXNbaV07XHJcbiAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGNvbnRleHQubWVhc3VyZVRleHQobGluZSkud2lkdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWF4V2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGV4dEJpdG1hcEhlaWdodChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGxpbmVzOiBzdHJpbmdbXSwgZm9udDogc3RyaW5nLCBmb250U2l6ZTogbnVtYmVyLCBsaW5lSGVpZ2h0UGVyY2VudDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gY2FudmFzLndpZHRoO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gY2FudmFzLmhlaWdodDtcclxuICAgICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgY29uc3QgdGV4dFkgPSBDYW52YXNVdGlscy5kcmF3TGluZXMoY29udGV4dCwgbGluZXMsIGZvbnQsIGZvbnRTaXplLCBsaW5lSGVpZ2h0UGVyY2VudCwgXCJsZWZ0XCIsIFwidG9wXCIsIGZvbnRTaXplICogLjUsIGZvbnRTaXplICogLjUpO1xyXG4gICAgICAgIGNvbnN0IGltYWdlRGF0YTogSW1hZ2VEYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGxldCB0ZXh0SGVpZ2h0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgICB5TG9vcDpmb3IgKGxldCB5OiBudW1iZXIgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgeDogbnVtYmVyID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSAoeCArIHkgKiB3aWR0aCkgKiA0O1xyXG4gICAgICAgICAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhW2luZGV4ICsgM10gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEhlaWdodCA9IHkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHlMb29wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gTWF0aC5tYXgodGV4dEhlaWdodCwgdGV4dFkgKyBmb250U2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaGFsdmVWYWxpZGF0ZUZvbnRTaXplKHN0YXJ0U2l6ZTogbnVtYmVyLCBjYWxsYmFjazogKHNpemU6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgZm9udFNpemU6IG51bWJlciA9IHN0YXJ0U2l6ZTtcclxuICAgICAgICBsZXQgbGFzdEZvbnRTaXplOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxldCBkaXJlY3Rpb246IG51bWJlcjtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDIwOyBpKyspIHtcclxuICAgICAgICAgICAgZGlyZWN0aW9uID0gY2FsbGJhY2soZm9udFNpemUpO1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wU2l6ZTogbnVtYmVyID0gZm9udFNpemU7XHJcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb250U2l6ZSA9IGZvbnRTaXplIC0gKE1hdGguYWJzKGZvbnRTaXplIC0gbGFzdEZvbnRTaXplKSAvIDIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9udFNpemUgPSBmb250U2l6ZSArIChNYXRoLmFicyhmb250U2l6ZSAtIGxhc3RGb250U2l6ZSkgLyAyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsYXN0Rm9udFNpemUgPSB0ZW1wU2l6ZTtcclxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGZvbnRTaXplIC0gbGFzdEZvbnRTaXplKSA8IDAuMSkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9udFNpemUgPSBNYXRoLmZsb29yKGZvbnRTaXplKTtcclxuICAgICAgICByZXR1cm4gZm9udFNpemU7XHJcbiAgICB9XHJcbn1cclxuIl19
|