UNPKG

159 kBJavaScriptView Raw
1/**
2 * @license
3 * Copyright 2017 Google LLC. All Rights Reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 * =============================================================================
16 */
17import * as conv_util from './conv_util';
18describe('conv_util computeConv2DInfo', () => {
19 it('1x1 conv over 1x1 array with same pad', () => {
20 const inShape = [1, 1, 1, 1];
21 const stride = 1;
22 const dilation = 1;
23 const convInfo = conv_util.computeConv2DInfo(inShape, [1, 1, 1, 1], stride, dilation, 'same');
24 expect(convInfo.batchSize).toEqual(1);
25 expect(convInfo.outHeight).toEqual(1);
26 expect(convInfo.outWidth).toEqual(1);
27 expect(convInfo.outChannels).toEqual(1);
28 expect(convInfo.effectiveFilterWidth).toEqual(1);
29 expect(convInfo.effectiveFilterHeight).toEqual(1);
30 });
31 it('2x2 conv over 3x3 array with same pad', () => {
32 const inShape = [1, 3, 3, 1];
33 const stride = 1;
34 const dilation = 1;
35 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 2, 1, 1], stride, dilation, 'same');
36 expect(convInfo.batchSize).toEqual(1);
37 expect(convInfo.outHeight).toEqual(3);
38 expect(convInfo.outWidth).toEqual(3);
39 expect(convInfo.outChannels).toEqual(1);
40 expect(convInfo.effectiveFilterWidth).toEqual(2);
41 expect(convInfo.effectiveFilterHeight).toEqual(2);
42 // Should produce non-even padding with extra pixel at the right/bottom.
43 expect(convInfo.padInfo.left).toBe(0);
44 expect(convInfo.padInfo.right).toBe(1);
45 expect(convInfo.padInfo.top).toBe(0);
46 expect(convInfo.padInfo.bottom).toBe(1);
47 });
48 it('2x2 conv over 3x3 array with same pad', () => {
49 const inShape = [1, 3, 3, 1];
50 const stride = 1;
51 const dilation = 1;
52 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 2, 1, 1], stride, dilation, 'same');
53 expect(convInfo.batchSize).toEqual(1);
54 expect(convInfo.outHeight).toEqual(3);
55 expect(convInfo.outWidth).toEqual(3);
56 expect(convInfo.outChannels).toEqual(1);
57 expect(convInfo.effectiveFilterWidth).toEqual(2);
58 expect(convInfo.effectiveFilterHeight).toEqual(2);
59 });
60 it('2x2 conv over 3x3 array with valid pad', () => {
61 const inShape = [1, 3, 3, 1];
62 const stride = 1;
63 const dilation = 1;
64 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 2, 1, 1], stride, dilation, 'valid');
65 expect(convInfo.batchSize).toEqual(1);
66 expect(convInfo.outHeight).toEqual(2);
67 expect(convInfo.outWidth).toEqual(2);
68 expect(convInfo.outChannels).toEqual(1);
69 expect(convInfo.effectiveFilterWidth).toEqual(2);
70 expect(convInfo.effectiveFilterHeight).toEqual(2);
71 });
72 it('3x3 conv over 5x5 array with same pad with stride 2', () => {
73 const inShape = [1, 5, 5, 1];
74 const stride = 2;
75 const dilation = 1;
76 const convInfo = conv_util.computeConv2DInfo(inShape, [3, 3, 1, 1], stride, dilation, 'same');
77 expect(convInfo.batchSize).toEqual(1);
78 expect(convInfo.outHeight).toEqual(3);
79 expect(convInfo.outWidth).toEqual(3);
80 expect(convInfo.outChannels).toEqual(1);
81 expect(convInfo.effectiveFilterWidth).toEqual(3);
82 expect(convInfo.effectiveFilterHeight).toEqual(3);
83 expect(convInfo.padInfo.left).toBe(1);
84 expect(convInfo.padInfo.right).toBe(1);
85 expect(convInfo.padInfo.top).toBe(1);
86 expect(convInfo.padInfo.bottom).toBe(1);
87 });
88 it('2x2 conv over 3x3 array with valid pad with stride 2', () => {
89 const inShape = [1, 3, 3, 1];
90 const stride = 2;
91 const dilation = 1;
92 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 2, 1, 1], stride, dilation, 'valid');
93 expect(convInfo.batchSize).toEqual(1);
94 expect(convInfo.outHeight).toEqual(1);
95 expect(convInfo.outWidth).toEqual(1);
96 expect(convInfo.outChannels).toEqual(1);
97 expect(convInfo.effectiveFilterWidth).toEqual(2);
98 expect(convInfo.effectiveFilterHeight).toEqual(2);
99 });
100 it('2x1 conv over 3x3 array with valid pad with stride 1', () => {
101 const inShape = [1, 3, 3, 1];
102 const stride = 1;
103 const dilation = 1;
104 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 1, 1, 1], stride, dilation, 'valid');
105 expect(convInfo.batchSize).toEqual(1);
106 expect(convInfo.outHeight).toEqual(2);
107 expect(convInfo.outWidth).toEqual(3);
108 expect(convInfo.outChannels).toEqual(1);
109 expect(convInfo.effectiveFilterWidth).toEqual(1);
110 expect(convInfo.effectiveFilterHeight).toEqual(2);
111 });
112 it('2x1 conv over 3x3 array with valid pad with strides h=2, w=1', () => {
113 const inShape = [1, 3, 3, 1];
114 const strides = [2, 1];
115 const dilation = 1;
116 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 1, 1, 1], strides, dilation, 'valid');
117 expect(convInfo.batchSize).toEqual(1);
118 expect(convInfo.outHeight).toEqual(1);
119 expect(convInfo.outWidth).toEqual(3);
120 expect(convInfo.outChannels).toEqual(1);
121 expect(convInfo.effectiveFilterWidth).toEqual(1);
122 expect(convInfo.effectiveFilterHeight).toEqual(2);
123 });
124 it('1x2 conv over 3x3 array with valid pad with stride 1', () => {
125 const inShape = [1, 3, 3, 1];
126 const stride = 1;
127 const dilation = 1;
128 const convInfo = conv_util.computeConv2DInfo(inShape, [1, 2, 1, 1], stride, dilation, 'valid');
129 expect(convInfo.batchSize).toEqual(1);
130 expect(convInfo.outHeight).toEqual(3);
131 expect(convInfo.outWidth).toEqual(2);
132 expect(convInfo.outChannels).toEqual(1);
133 expect(convInfo.effectiveFilterWidth).toEqual(2);
134 expect(convInfo.effectiveFilterHeight).toEqual(1);
135 });
136 it('1x2 conv over 3x3 array with valid pad with stride 1, batch=5', () => {
137 const inShape = [5, 3, 3, 1];
138 const stride = 1;
139 const dilation = 1;
140 const convInfo = conv_util.computeConv2DInfo(inShape, [1, 2, 1, 1], stride, dilation, 'valid');
141 expect(convInfo.batchSize).toEqual(5);
142 expect(convInfo.outHeight).toEqual(3);
143 expect(convInfo.outWidth).toEqual(2);
144 expect(convInfo.outChannels).toEqual(1);
145 expect(convInfo.effectiveFilterWidth).toEqual(2);
146 expect(convInfo.effectiveFilterHeight).toEqual(1);
147 });
148 it('2x2 conv over 3x3 array with same pad with dilations 2', () => {
149 const inShape = [1, 3, 3, 1];
150 const stride = 1;
151 const dilations = 2;
152 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 2, 1, 1], stride, dilations, 'same');
153 expect(convInfo.batchSize).toEqual(1);
154 expect(convInfo.outHeight).toEqual(3);
155 expect(convInfo.outWidth).toEqual(3);
156 expect(convInfo.outChannels).toEqual(1);
157 // pad evenly on all sides
158 expect(convInfo.padInfo.left).toBe(1);
159 expect(convInfo.padInfo.right).toBe(1);
160 expect(convInfo.padInfo.top).toBe(1);
161 expect(convInfo.padInfo.bottom).toBe(1);
162 expect(convInfo.effectiveFilterWidth).toEqual(3);
163 expect(convInfo.effectiveFilterHeight).toEqual(3);
164 });
165 it('2x1 conv over 3x3 array with same pad with dilations 2', () => {
166 const inShape = [1, 3, 3, 1];
167 const stride = 1;
168 const dilations = 2;
169 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 1, 1, 1], stride, dilations, 'same');
170 expect(convInfo.batchSize).toEqual(1);
171 expect(convInfo.outHeight).toEqual(3);
172 expect(convInfo.outWidth).toEqual(3);
173 expect(convInfo.outChannels).toEqual(1);
174 // pad top and bottom
175 expect(convInfo.padInfo.left).toBe(0);
176 expect(convInfo.padInfo.right).toBe(0);
177 expect(convInfo.padInfo.top).toBe(1);
178 expect(convInfo.padInfo.bottom).toBe(1);
179 expect(convInfo.effectiveFilterWidth).toEqual(1);
180 expect(convInfo.effectiveFilterHeight).toEqual(3);
181 });
182 it('3x4 conv over 8x8 array with same pad with dilations h=4 w=3', () => {
183 const inShape = [1, 8, 8, 1];
184 const stride = 1;
185 const dilations = [4, 3];
186 const convInfo = conv_util.computeConv2DInfo(inShape, [3, 4, 1, 1], stride, dilations, 'same');
187 expect(convInfo.batchSize).toEqual(1);
188 expect(convInfo.outHeight).toEqual(8);
189 expect(convInfo.outWidth).toEqual(8);
190 expect(convInfo.outChannels).toEqual(1);
191 expect(convInfo.effectiveFilterWidth).toEqual(10);
192 expect(convInfo.effectiveFilterHeight).toEqual(9);
193 expect(convInfo.padInfo.left).toBe(4);
194 expect(convInfo.padInfo.right).toBe(5);
195 expect(convInfo.padInfo.top).toBe(4);
196 expect(convInfo.padInfo.bottom).toBe(4);
197 });
198 it('2x1 conv over 3x3 array with valid pad with dilations 2', () => {
199 const inShape = [1, 3, 3, 1];
200 const stride = 1;
201 const dilations = 2;
202 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 1, 1, 1], stride, dilations, 'valid');
203 expect(convInfo.batchSize).toEqual(1);
204 expect(convInfo.outHeight).toEqual(1);
205 expect(convInfo.outWidth).toEqual(3);
206 expect(convInfo.outChannels).toEqual(1);
207 expect(convInfo.effectiveFilterWidth).toEqual(1);
208 expect(convInfo.effectiveFilterHeight).toEqual(3);
209 });
210 it('2x2 conv over 3x3 array with valid pad with dilations 2', () => {
211 const inShape = [1, 3, 3, 1];
212 const stride = 1;
213 const dilations = 2;
214 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 2, 1, 1], stride, dilations, 'valid');
215 expect(convInfo.batchSize).toEqual(1);
216 expect(convInfo.outHeight).toEqual(1);
217 expect(convInfo.outWidth).toEqual(1);
218 expect(convInfo.outChannels).toEqual(1);
219 expect(convInfo.effectiveFilterWidth).toEqual(3);
220 expect(convInfo.effectiveFilterHeight).toEqual(3);
221 });
222 it('2x2 conv over 4x4 array with valid pad with dilations 2', () => {
223 const inShape = [1, 4, 4, 1];
224 const stride = 1;
225 const dilations = 2;
226 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 2, 1, 1], stride, dilations, 'valid');
227 expect(convInfo.batchSize).toEqual(1);
228 expect(convInfo.outHeight).toEqual(2);
229 expect(convInfo.outWidth).toEqual(2);
230 expect(convInfo.outChannels).toEqual(1);
231 expect(convInfo.effectiveFilterWidth).toEqual(3);
232 expect(convInfo.effectiveFilterHeight).toEqual(3);
233 });
234});
235describe('conv_util computeConv3DInfo', () => {
236 it('1x1x1 conv over 1x1x1 array with same pad', () => {
237 const inShape = [1, 1, 1, 1, 1];
238 const stride = 1;
239 const dilation = 1;
240 const convInfo = conv_util.computeConv3DInfo(inShape, [1, 1, 1, 1, 1], stride, dilation, 'same');
241 expect(convInfo.batchSize).toEqual(1);
242 expect(convInfo.outDepth).toEqual(1);
243 expect(convInfo.outHeight).toEqual(1);
244 expect(convInfo.outWidth).toEqual(1);
245 expect(convInfo.outChannels).toEqual(1);
246 });
247 it('2x2x2 conv over 3x3x3 array with same pad', () => {
248 const inShape = [1, 3, 3, 3, 1];
249 const stride = 1;
250 const dilation = 1;
251 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 2, 2, 1, 1], stride, dilation, 'same');
252 expect(convInfo.batchSize).toEqual(1);
253 expect(convInfo.outDepth).toEqual(3);
254 expect(convInfo.outHeight).toEqual(3);
255 expect(convInfo.outWidth).toEqual(3);
256 expect(convInfo.outChannels).toEqual(1);
257 // Should produce non-even padding with extra pixel at the back/right/bottom
258 expect(convInfo.padInfo.front).toBe(0);
259 expect(convInfo.padInfo.back).toBe(1);
260 expect(convInfo.padInfo.left).toBe(0);
261 expect(convInfo.padInfo.right).toBe(1);
262 expect(convInfo.padInfo.top).toBe(0);
263 expect(convInfo.padInfo.bottom).toBe(1);
264 });
265 it('2x2x2 conv over 3x3x3 array with same pad', () => {
266 const inShape = [1, 3, 3, 3, 1];
267 const stride = 1;
268 const dilation = 1;
269 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 2, 2, 1, 1], stride, dilation, 'same');
270 expect(convInfo.batchSize).toEqual(1);
271 expect(convInfo.outDepth).toEqual(3);
272 expect(convInfo.outHeight).toEqual(3);
273 expect(convInfo.outWidth).toEqual(3);
274 expect(convInfo.outChannels).toEqual(1);
275 });
276 it('2x2x2 conv over 3x3x3 array with valid pad', () => {
277 const inShape = [1, 3, 3, 3, 1];
278 const stride = 1;
279 const dilation = 1;
280 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 2, 2, 1, 1], stride, dilation, 'valid');
281 expect(convInfo.batchSize).toEqual(1);
282 expect(convInfo.outDepth).toEqual(2);
283 expect(convInfo.outHeight).toEqual(2);
284 expect(convInfo.outWidth).toEqual(2);
285 expect(convInfo.outChannels).toEqual(1);
286 });
287 it('3x3x3 conv over 5x5x5 array with same pad with stride 2', () => {
288 const inShape = [1, 5, 5, 5, 1];
289 const stride = 2;
290 const dilation = 1;
291 const convInfo = conv_util.computeConv3DInfo(inShape, [3, 3, 3, 1, 1], stride, dilation, 'same');
292 expect(convInfo.batchSize).toEqual(1);
293 expect(convInfo.outDepth).toEqual(3);
294 expect(convInfo.outHeight).toEqual(3);
295 expect(convInfo.outWidth).toEqual(3);
296 expect(convInfo.outChannels).toEqual(1);
297 expect(convInfo.padInfo.front).toBe(1);
298 expect(convInfo.padInfo.back).toBe(1);
299 expect(convInfo.padInfo.left).toBe(1);
300 expect(convInfo.padInfo.right).toBe(1);
301 expect(convInfo.padInfo.top).toBe(1);
302 expect(convInfo.padInfo.bottom).toBe(1);
303 });
304 it('2x2x2 conv over 3x3x3 array with valid pad with stride 2', () => {
305 const inShape = [1, 3, 3, 3, 1];
306 const stride = 2;
307 const dilation = 1;
308 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 2, 2, 1, 1], stride, dilation, 'valid');
309 expect(convInfo.batchSize).toEqual(1);
310 expect(convInfo.outDepth).toEqual(1);
311 expect(convInfo.outHeight).toEqual(1);
312 expect(convInfo.outWidth).toEqual(1);
313 expect(convInfo.outChannels).toEqual(1);
314 });
315 it('2x1x1 conv over 3x3x3 array with valid pad with stride 1', () => {
316 const inShape = [1, 3, 3, 3, 1];
317 const stride = 1;
318 const dilation = 1;
319 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 1, 1, 1, 1], stride, dilation, 'valid');
320 expect(convInfo.batchSize).toEqual(1);
321 expect(convInfo.outDepth).toEqual(2);
322 expect(convInfo.outHeight).toEqual(3);
323 expect(convInfo.outWidth).toEqual(3);
324 expect(convInfo.outChannels).toEqual(1);
325 });
326 it('2x1x1 conv over 3x3x3 array with valid pad with strides d=2, h=1, w=1', () => {
327 const inShape = [1, 3, 3, 3, 1];
328 const strides = [2, 1, 1];
329 const dilation = 1;
330 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 1, 1, 1, 1], strides, dilation, 'valid');
331 expect(convInfo.batchSize).toEqual(1);
332 expect(convInfo.outDepth).toEqual(1);
333 expect(convInfo.outHeight).toEqual(3);
334 expect(convInfo.outWidth).toEqual(3);
335 expect(convInfo.outChannels).toEqual(1);
336 });
337 it('1x2x2 conv over 3x3x3 array with valid pad with stride 1', () => {
338 const inShape = [1, 3, 3, 3, 1];
339 const stride = 1;
340 const dilation = 1;
341 const convInfo = conv_util.computeConv3DInfo(inShape, [1, 2, 2, 1, 1], stride, dilation, 'valid');
342 expect(convInfo.batchSize).toEqual(1);
343 expect(convInfo.outDepth).toEqual(3);
344 expect(convInfo.outHeight).toEqual(2);
345 expect(convInfo.outWidth).toEqual(2);
346 expect(convInfo.outChannels).toEqual(1);
347 });
348 it('1x2x2 conv over 3x3x3 array with valid pad with stride 1, batch=5', () => {
349 const inShape = [5, 3, 3, 3, 1];
350 const stride = 1;
351 const dilation = 1;
352 const convInfo = conv_util.computeConv3DInfo(inShape, [1, 2, 2, 1, 1], stride, dilation, 'valid');
353 expect(convInfo.batchSize).toEqual(5);
354 expect(convInfo.outDepth).toEqual(3);
355 expect(convInfo.outHeight).toEqual(2);
356 expect(convInfo.outWidth).toEqual(2);
357 expect(convInfo.outChannels).toEqual(1);
358 });
359 it('2x2x2 conv over 3x3x3 array with same pad with dilations 2', () => {
360 const inShape = [1, 3, 3, 3, 1];
361 const stride = 1;
362 const dilations = 2;
363 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 2, 2, 1, 1], stride, dilations, 'same');
364 expect(convInfo.batchSize).toEqual(1);
365 expect(convInfo.outDepth).toEqual(3);
366 expect(convInfo.outHeight).toEqual(3);
367 expect(convInfo.outWidth).toEqual(3);
368 expect(convInfo.outChannels).toEqual(1);
369 // pad evenly on all sides
370 expect(convInfo.padInfo.front).toBe(1);
371 expect(convInfo.padInfo.back).toBe(1);
372 expect(convInfo.padInfo.left).toBe(1);
373 expect(convInfo.padInfo.right).toBe(1);
374 expect(convInfo.padInfo.top).toBe(1);
375 expect(convInfo.padInfo.bottom).toBe(1);
376 });
377 it('2x1x1 conv over 3x3x3 array with same pad with dilations 2', () => {
378 const inShape = [1, 3, 3, 3, 1];
379 const stride = 1;
380 const dilations = 2;
381 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 1, 1, 1, 1], stride, dilations, 'same');
382 expect(convInfo.batchSize).toEqual(1);
383 expect(convInfo.outDepth).toEqual(3);
384 expect(convInfo.outHeight).toEqual(3);
385 expect(convInfo.outWidth).toEqual(3);
386 expect(convInfo.outChannels).toEqual(1);
387 // pad top and bottom
388 expect(convInfo.padInfo.front).toBe(1);
389 expect(convInfo.padInfo.back).toBe(1);
390 expect(convInfo.padInfo.left).toBe(0);
391 expect(convInfo.padInfo.right).toBe(0);
392 expect(convInfo.padInfo.top).toBe(0);
393 expect(convInfo.padInfo.bottom).toBe(0);
394 });
395 it('3x4x4 conv over 8x8 array with same pad with dilations d=4 h=3 w=3', () => {
396 const inShape = [1, 8, 8, 8, 1];
397 const stride = 1;
398 const dilations = [4, 3, 3];
399 const convInfo = conv_util.computeConv3DInfo(inShape, [3, 4, 4, 1, 1], stride, dilations, 'same');
400 expect(convInfo.batchSize).toEqual(1);
401 expect(convInfo.outDepth).toEqual(8);
402 expect(convInfo.outHeight).toEqual(8);
403 expect(convInfo.outWidth).toEqual(8);
404 expect(convInfo.outChannels).toEqual(1);
405 expect(convInfo.padInfo.front).toBe(4);
406 expect(convInfo.padInfo.back).toBe(4);
407 expect(convInfo.padInfo.left).toBe(4);
408 expect(convInfo.padInfo.right).toBe(5);
409 expect(convInfo.padInfo.top).toBe(4);
410 expect(convInfo.padInfo.bottom).toBe(5);
411 });
412 it('2x1x1 conv over 3x3x3 array with valid pad with dilations 2', () => {
413 const inShape = [1, 3, 3, 3, 1];
414 const stride = 1;
415 const dilations = 2;
416 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 1, 1, 1, 1], stride, dilations, 'valid');
417 expect(convInfo.batchSize).toEqual(1);
418 expect(convInfo.outDepth).toEqual(1);
419 expect(convInfo.outHeight).toEqual(3);
420 expect(convInfo.outWidth).toEqual(3);
421 expect(convInfo.outChannels).toEqual(1);
422 });
423 it('2x2x2 conv over 3x3x3 array with valid pad with dilations 2', () => {
424 const inShape = [1, 3, 3, 3, 1];
425 const stride = 1;
426 const dilations = 2;
427 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 2, 2, 1, 1], stride, dilations, 'valid');
428 expect(convInfo.batchSize).toEqual(1);
429 expect(convInfo.outDepth).toEqual(1);
430 expect(convInfo.outHeight).toEqual(1);
431 expect(convInfo.outWidth).toEqual(1);
432 expect(convInfo.outChannels).toEqual(1);
433 });
434 it('2x2x2 conv over 4x4x4 array with valid pad with dilations 2', () => {
435 const inShape = [1, 4, 4, 4, 1];
436 const stride = 1;
437 const dilations = 2;
438 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 2, 2, 1, 1], stride, dilations, 'valid');
439 expect(convInfo.batchSize).toEqual(1);
440 expect(convInfo.outDepth).toEqual(2);
441 expect(convInfo.outHeight).toEqual(2);
442 expect(convInfo.outWidth).toEqual(2);
443 expect(convInfo.outChannels).toEqual(1);
444 });
445});
446describe('conv_util computeConv2DInfo with depthwise=true', () => {
447 it('1x1 filter over 1x1 array with same pad', () => {
448 const inChannels = 1;
449 const inShape = [1, 1, 1, inChannels];
450 const fSize = 1;
451 const chMul = 1;
452 const stride = 1;
453 const dilation = 1;
454 const pad = 'same';
455 const convInfo = conv_util.computeConv2DInfo(inShape, [fSize, fSize, inChannels, chMul], stride, dilation, pad, null, true);
456 expect(convInfo.batchSize).toEqual(1);
457 expect(convInfo.outHeight).toEqual(1);
458 expect(convInfo.outWidth).toEqual(1);
459 expect(convInfo.outChannels).toEqual(1);
460 expect(convInfo.effectiveFilterWidth).toEqual(1);
461 expect(convInfo.effectiveFilterHeight).toEqual(1);
462 });
463 it('2x2 filter over 3x3 array with same pad, chMul=3, depth=2', () => {
464 const inChannels = 2;
465 const batchSize = 1;
466 const inSize = 3;
467 const inShape = [batchSize, inSize, inSize, inChannels];
468 const fSize = 2;
469 const chMul = 3;
470 const stride = 1;
471 const dilation = 1;
472 const pad = 'same';
473 const convInfo = conv_util.computeConv2DInfo(inShape, [fSize, fSize, inChannels, chMul], stride, dilation, pad, null, true);
474 expect(convInfo.batchSize).toEqual(1);
475 expect(convInfo.outHeight).toEqual(3);
476 expect(convInfo.outWidth).toEqual(3);
477 expect(convInfo.outChannels).toEqual(6);
478 expect(convInfo.effectiveFilterWidth).toEqual(2);
479 expect(convInfo.effectiveFilterHeight).toEqual(2);
480 });
481 it('2x2 filter over 3x3 array with valid pad, chMul=3, depth=2', () => {
482 const inChannels = 2;
483 const batchSize = 1;
484 const inSize = 3;
485 const inShape = [batchSize, inSize, inSize, inChannels];
486 const fSize = 2;
487 const chMul = 3;
488 const stride = 1;
489 const dilation = 1;
490 const pad = 'valid';
491 const convInfo = conv_util.computeConv2DInfo(inShape, [fSize, fSize, inChannels, chMul], stride, dilation, pad, null, true);
492 expect(convInfo.batchSize).toEqual(1);
493 expect(convInfo.outHeight).toEqual(2);
494 expect(convInfo.outWidth).toEqual(2);
495 expect(convInfo.outChannels).toEqual(6);
496 expect(convInfo.effectiveFilterWidth).toEqual(2);
497 expect(convInfo.effectiveFilterHeight).toEqual(2);
498 });
499});
500describe('conv_util computeConv3DInfo with depthwise=true', () => {
501 it('1x1x1 filter over 1x1x1 array with same pad', () => {
502 const inChannels = 1;
503 const inShape = [1, 1, 1, 1, inChannels];
504 const fSize = 1;
505 const chMul = 1;
506 const stride = 1;
507 const dilation = 1;
508 const pad = 'same';
509 const convInfo = conv_util.computeConv3DInfo(inShape, [fSize, fSize, fSize, inChannels, chMul], stride, dilation, pad, true);
510 expect(convInfo.batchSize).toEqual(1);
511 expect(convInfo.outDepth).toEqual(1);
512 expect(convInfo.outHeight).toEqual(1);
513 expect(convInfo.outWidth).toEqual(1);
514 expect(convInfo.outChannels).toEqual(1);
515 });
516 it('2x2x2 filter over 3x3x3 array with same pad, chMul=3, depth=2', () => {
517 const inChannels = 2;
518 const batchSize = 1;
519 const inSize = 3;
520 const inShape = [batchSize, inSize, inSize, inSize, inChannels];
521 const fSize = 2;
522 const chMul = 3;
523 const stride = 1;
524 const dilation = 1;
525 const pad = 'same';
526 const convInfo = conv_util.computeConv3DInfo(inShape, [fSize, fSize, fSize, inChannels, chMul], stride, dilation, pad, true);
527 expect(convInfo.batchSize).toEqual(1);
528 expect(convInfo.outDepth).toEqual(3);
529 expect(convInfo.outHeight).toEqual(3);
530 expect(convInfo.outWidth).toEqual(3);
531 expect(convInfo.outChannels).toEqual(6);
532 });
533 it('2x2x2 filter over 3x3x3 array with valid pad, chMul=3, depth=2', () => {
534 const inChannels = 2;
535 const batchSize = 1;
536 const inSize = 3;
537 const inShape = [batchSize, inSize, inSize, inSize, inChannels];
538 const fSize = 2;
539 const chMul = 3;
540 const stride = 1;
541 const dilation = 1;
542 const pad = 'valid';
543 const convInfo = conv_util.computeConv3DInfo(inShape, [fSize, fSize, fSize, inChannels, chMul], stride, dilation, pad, true);
544 expect(convInfo.batchSize).toEqual(1);
545 expect(convInfo.outDepth).toEqual(2);
546 expect(convInfo.outHeight).toEqual(2);
547 expect(convInfo.outWidth).toEqual(2);
548 expect(convInfo.outChannels).toEqual(6);
549 });
550});
551describe('conv_util computeConv2DInfo channelsFirst', () => {
552 it('2x2 conv over 3x3 array with same pad', () => {
553 const inDepth = 2;
554 const outDepth = 4;
555 const inShape = [1, inDepth, 3, 3];
556 const stride = 1;
557 const dilation = 1;
558 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 2, inDepth, outDepth], stride, dilation, 'same', null, false, 'channelsFirst');
559 expect(convInfo.batchSize).toEqual(1);
560 expect(convInfo.outHeight).toEqual(3);
561 expect(convInfo.outWidth).toEqual(3);
562 expect(convInfo.outChannels).toEqual(4);
563 expect(convInfo.outShape).toEqual([1, 4, 3, 3]);
564 expect(convInfo.effectiveFilterWidth).toEqual(2);
565 expect(convInfo.effectiveFilterHeight).toEqual(2);
566 // Should produce non-even padding with extra pixel at the right/bottom.
567 expect(convInfo.padInfo.left).toBe(0);
568 expect(convInfo.padInfo.right).toBe(1);
569 expect(convInfo.padInfo.top).toBe(0);
570 expect(convInfo.padInfo.bottom).toBe(1);
571 });
572 it('2x2 conv over 3x3 array with valid pad', () => {
573 const inDepth = 6;
574 const outDepth = 16;
575 const inShape = [1, inDepth, 3, 3];
576 const stride = 1;
577 const dilation = 1;
578 const convInfo = conv_util.computeConv2DInfo(inShape, [2, 2, inDepth, outDepth], stride, dilation, 'valid', null, false, 'channelsFirst');
579 expect(convInfo.batchSize).toEqual(1);
580 expect(convInfo.outHeight).toEqual(2);
581 expect(convInfo.outWidth).toEqual(2);
582 expect(convInfo.outChannels).toEqual(16);
583 expect(convInfo.outShape).toEqual([1, 16, 2, 2]);
584 expect(convInfo.effectiveFilterWidth).toEqual(2);
585 expect(convInfo.effectiveFilterHeight).toEqual(2);
586 // Should produce no padding.
587 expect(convInfo.padInfo.left).toBe(0);
588 expect(convInfo.padInfo.right).toBe(0);
589 expect(convInfo.padInfo.top).toBe(0);
590 expect(convInfo.padInfo.bottom).toBe(0);
591 });
592});
593describe('conv_util computeConv3DInfo channelsFirst', () => {
594 it('2x2x2 conv over 3x3x3 array with same pad', () => {
595 const inDepth = 2;
596 const outDepth = 4;
597 const inShape = [1, inDepth, 3, 3, 3];
598 const stride = 1;
599 const dilation = 1;
600 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 2, 2, inDepth, outDepth], stride, dilation, 'same', false, 'channelsFirst');
601 expect(convInfo.batchSize).toEqual(1);
602 expect(convInfo.outDepth).toEqual(3);
603 expect(convInfo.outHeight).toEqual(3);
604 expect(convInfo.outWidth).toEqual(3);
605 expect(convInfo.outChannels).toEqual(4);
606 expect(convInfo.outShape).toEqual([1, 4, 3, 3, 3]);
607 // Should produce non-even padding with extra pixel at the back/right/bottom
608 expect(convInfo.padInfo.front).toBe(0);
609 expect(convInfo.padInfo.back).toBe(1);
610 expect(convInfo.padInfo.left).toBe(0);
611 expect(convInfo.padInfo.right).toBe(1);
612 expect(convInfo.padInfo.top).toBe(0);
613 expect(convInfo.padInfo.bottom).toBe(1);
614 });
615 it('2x2x2 conv over 3x3x3 array with valid pad', () => {
616 const inDepth = 6;
617 const outDepth = 16;
618 const inShape = [1, inDepth, 3, 3, 3];
619 const stride = 1;
620 const dilation = 1;
621 const convInfo = conv_util.computeConv3DInfo(inShape, [2, 2, 2, inDepth, outDepth], stride, dilation, 'valid', false, 'channelsFirst');
622 expect(convInfo.batchSize).toEqual(1);
623 expect(convInfo.outDepth).toEqual(2);
624 expect(convInfo.outHeight).toEqual(2);
625 expect(convInfo.outWidth).toEqual(2);
626 expect(convInfo.outChannels).toEqual(16);
627 expect(convInfo.outShape).toEqual([1, 16, 2, 2, 2]);
628 // Should produce no padding.
629 expect(convInfo.padInfo.front).toBe(0);
630 expect(convInfo.padInfo.back).toBe(0);
631 expect(convInfo.padInfo.left).toBe(0);
632 expect(convInfo.padInfo.right).toBe(0);
633 expect(convInfo.padInfo.top).toBe(0);
634 expect(convInfo.padInfo.bottom).toBe(0);
635 });
636});
637describe('conv_util computeConv2DInfo roundingMode', () => {
638 const inChannels = 6;
639 const batchSize = 1;
640 const inSize = 5;
641 const inShape = [batchSize, inSize, inSize, inChannels];
642 const fSize = 2;
643 const chMul = 12;
644 const stride = 2;
645 const dilation = 1;
646 const pad = 1;
647 it('Default truncate the output dimension of Conv Layer', () => {
648 const convInfo = conv_util.computeConv2DInfo(inShape, [fSize, fSize, inChannels, chMul], stride, dilation, pad);
649 expect(convInfo.outShape).toEqual([batchSize, 3, 3, chMul]);
650 });
651 it('Floor the output dimension of Conv Layer', () => {
652 const convInfo = conv_util.computeConv2DInfo(inShape, [fSize, fSize, inChannels, chMul], stride, dilation, pad, 'floor');
653 expect(convInfo.outShape).toEqual([batchSize, 3, 3, chMul]);
654 });
655 it('Round the output dimension of Conv Layer', () => {
656 const convInfo = conv_util.computeConv2DInfo(inShape, [fSize, fSize, inChannels, chMul], stride, dilation, pad, 'round');
657 expect(convInfo.outShape).toEqual([batchSize, 4, 4, chMul]);
658 });
659 it('Ceil the output dimension of Conv Layer', () => {
660 const convInfo = conv_util.computeConv2DInfo(inShape, [fSize, fSize, inChannels, chMul], stride, dilation, pad, 'ceil');
661 expect(convInfo.outShape).toEqual([batchSize, 4, 4, chMul]);
662 });
663});
664describe('conv_util computePoolInfo roundingMode', () => {
665 const inChannels = 6;
666 const batchSize = 1;
667 const inSize = 5;
668 const inShape = [batchSize, inSize, inSize, inChannels];
669 const fSize = 2;
670 const stride = 2;
671 const dilation = 1;
672 const pad = 1;
673 it('Default truncate the output dimension of Pool Layer', () => {
674 const poolInfo = conv_util.computePool2DInfo(inShape, [fSize, fSize], stride, pad, dilation, 'floor');
675 expect(poolInfo.outShape).toEqual([batchSize, 3, 3, inChannels]);
676 });
677 it('Floor the output dimension of Pool Layer', () => {
678 const poolInfo = conv_util.computePool2DInfo(inShape, [fSize, fSize], stride, pad, dilation, 'floor');
679 expect(poolInfo.outShape).toEqual([batchSize, 3, 3, inChannels]);
680 });
681 it('Round the output dimension of Pool Layer', () => {
682 const poolInfo = conv_util.computePool2DInfo(inShape, [fSize, fSize], stride, pad, dilation, 'round');
683 expect(poolInfo.outShape).toEqual([batchSize, 4, 4, inChannels]);
684 });
685 it('Ceil the output dimension of Pool Layer', () => {
686 const poolInfo = conv_util.computePool2DInfo(inShape, [fSize, fSize], stride, pad, dilation, 'ceil');
687 expect(poolInfo.outShape).toEqual([batchSize, 4, 4, inChannels]);
688 });
689});
690describe('conv_util computePool3dInfo', () => {
691 it('1x1x1 pool over 1x1x1 array with valid pad', () => {
692 const inShape = [1, 1, 1, 1, 1];
693 const filterSize = 1;
694 const stride = 1;
695 const dilation = 1;
696 const convInfo = conv_util.computePool3DInfo(inShape, filterSize, stride, dilation, 'valid');
697 expect(convInfo.batchSize).toEqual(1);
698 expect(convInfo.outDepth).toEqual(1);
699 expect(convInfo.outHeight).toEqual(1);
700 expect(convInfo.outWidth).toEqual(1);
701 expect(convInfo.outChannels).toEqual(1);
702 expect(convInfo.effectiveFilterDepth).toEqual(1);
703 expect(convInfo.effectiveFilterWidth).toEqual(1);
704 expect(convInfo.effectiveFilterHeight).toEqual(1);
705 });
706 it('1x1x1 pool over 3x3x3 array with valid pad', () => {
707 const inShape = [1, 3, 3, 3, 1];
708 const filterSize = 1;
709 const stride = 1;
710 const dilation = 1;
711 const convInfo = conv_util.computePool3DInfo(inShape, filterSize, stride, dilation, 'valid');
712 expect(convInfo.batchSize).toEqual(1);
713 expect(convInfo.outDepth).toEqual(3);
714 expect(convInfo.outHeight).toEqual(3);
715 expect(convInfo.outWidth).toEqual(3);
716 expect(convInfo.outChannels).toEqual(1);
717 expect(convInfo.effectiveFilterDepth).toEqual(1);
718 expect(convInfo.effectiveFilterWidth).toEqual(1);
719 expect(convInfo.effectiveFilterHeight).toEqual(1);
720 });
721 it('2x2x2 pool over 3x3x3 array with same pad', () => {
722 const inShape = [1, 3, 3, 3, 1];
723 const filterSize = 2;
724 const stride = 1;
725 const dilation = 1;
726 const convInfo = conv_util.computePool3DInfo(inShape, filterSize, stride, dilation, 'same');
727 expect(convInfo.batchSize).toEqual(1);
728 expect(convInfo.outDepth).toEqual(3);
729 expect(convInfo.outHeight).toEqual(3);
730 expect(convInfo.outWidth).toEqual(3);
731 expect(convInfo.outChannels).toEqual(1);
732 expect(convInfo.effectiveFilterDepth).toEqual(2);
733 expect(convInfo.effectiveFilterWidth).toEqual(2);
734 expect(convInfo.effectiveFilterHeight).toEqual(2);
735 expect(convInfo.padInfo.top).toEqual(0);
736 expect(convInfo.padInfo.bottom).toEqual(1);
737 expect(convInfo.padInfo.left).toEqual(0);
738 expect(convInfo.padInfo.right).toEqual(1);
739 expect(convInfo.padInfo.front).toEqual(0);
740 expect(convInfo.padInfo.back).toEqual(1);
741 expect(convInfo.padInfo.type).toEqual('SAME');
742 });
743 it('2x2x2 pool over 3x3x3 array with valid pad', () => {
744 const inShape = [1, 3, 3, 3, 1];
745 const filterSize = 2;
746 const stride = 1;
747 const dilation = 1;
748 const convInfo = conv_util.computePool3DInfo(inShape, filterSize, stride, dilation, 'valid');
749 expect(convInfo.batchSize).toEqual(1);
750 expect(convInfo.outDepth).toEqual(2);
751 expect(convInfo.outHeight).toEqual(2);
752 expect(convInfo.outWidth).toEqual(2);
753 expect(convInfo.outChannels).toEqual(1);
754 expect(convInfo.effectiveFilterDepth).toEqual(2);
755 expect(convInfo.effectiveFilterWidth).toEqual(2);
756 expect(convInfo.effectiveFilterHeight).toEqual(2);
757 });
758 it('2x2x2 pool over 4x4x4 array with valid pad, stride 2', () => {
759 const inShape = [1, 4, 4, 4, 1];
760 const filterSize = 2;
761 const stride = 2;
762 const dilation = 1;
763 const convInfo = conv_util.computePool3DInfo(inShape, filterSize, stride, dilation, 'valid');
764 expect(convInfo.batchSize).toEqual(1);
765 expect(convInfo.outDepth).toEqual(2);
766 expect(convInfo.outHeight).toEqual(2);
767 expect(convInfo.outWidth).toEqual(2);
768 expect(convInfo.outChannels).toEqual(1);
769 expect(convInfo.effectiveFilterDepth).toEqual(2);
770 expect(convInfo.effectiveFilterWidth).toEqual(2);
771 expect(convInfo.effectiveFilterHeight).toEqual(2);
772 });
773 it('2x2x2 pool over 3x3x3 array with valid pad, dilation 2', () => {
774 const inShape = [1, 3, 3, 3, 1];
775 const filterSize = 2;
776 const stride = 1;
777 const dilation = 2;
778 const convInfo = conv_util.computePool3DInfo(inShape, filterSize, stride, dilation, 'valid');
779 expect(convInfo.batchSize).toEqual(1);
780 expect(convInfo.outDepth).toEqual(1);
781 expect(convInfo.outHeight).toEqual(1);
782 expect(convInfo.outWidth).toEqual(1);
783 expect(convInfo.outChannels).toEqual(1);
784 expect(convInfo.effectiveFilterDepth).toEqual(3);
785 expect(convInfo.effectiveFilterWidth).toEqual(3);
786 expect(convInfo.effectiveFilterHeight).toEqual(3);
787 });
788 it('2x2x2 pool over 3x3x3 array with pad 1, roundingMode floor', () => {
789 const inShape = [1, 3, 3, 3, 1];
790 const filterSize = 2;
791 const stride = 1;
792 const dilation = 1;
793 const convInfo = conv_util.computePool3DInfo(inShape, filterSize, stride, dilation, 1, 'floor');
794 expect(convInfo.batchSize).toEqual(1);
795 expect(convInfo.outDepth).toEqual(4);
796 expect(convInfo.outHeight).toEqual(4);
797 expect(convInfo.outWidth).toEqual(4);
798 expect(convInfo.outChannels).toEqual(1);
799 expect(convInfo.effectiveFilterDepth).toEqual(2);
800 expect(convInfo.effectiveFilterWidth).toEqual(2);
801 expect(convInfo.effectiveFilterHeight).toEqual(2);
802 expect(convInfo.padInfo.top).toEqual(1);
803 expect(convInfo.padInfo.bottom).toEqual(1);
804 expect(convInfo.padInfo.left).toEqual(1);
805 expect(convInfo.padInfo.right).toEqual(1);
806 expect(convInfo.padInfo.front).toEqual(1);
807 expect(convInfo.padInfo.back).toEqual(1);
808 expect(convInfo.padInfo.type).toEqual('NUMBER');
809 });
810 it('throws unknown dataFormat', () => {
811 const inShape = [1, 3, 3, 3, 1];
812 const filterSize = 2;
813 const stride = 1;
814 const dilation = 1;
815 const fakeDataFormat = 'fakeFormat';
816 expect(() => conv_util.computePool3DInfo(inShape, filterSize, stride, dilation, 1, 'floor', fakeDataFormat))
817 .toThrowError();
818 });
819});
820describe('conv_util convertConv2DDataFormat', () => {
821 it('convert NHWC to channelsLast', () => {
822 const dataFormat = 'NHWC';
823 const $dataFormat = conv_util.convertConv2DDataFormat(dataFormat);
824 expect($dataFormat).toEqual('channelsLast');
825 });
826 it('convert NCHW to channelsFirst', () => {
827 const dataFormat = 'NCHW';
828 const $dataFormat = conv_util.convertConv2DDataFormat(dataFormat);
829 expect($dataFormat).toEqual('channelsFirst');
830 });
831 it('throws unknown dataFormat', () => {
832 const dataFormat = 'FakeFormat';
833 expect(() => conv_util.convertConv2DDataFormat(dataFormat))
834 .toThrowError();
835 });
836});
837//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl91dGlsX3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9jb252X3V0aWxfdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEtBQUssU0FBUyxNQUFNLGFBQWEsQ0FBQztBQUV6QyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0lBQzNDLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7UUFDL0MsTUFBTSxPQUFPLEdBQXFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNuQixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQ3hDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxNQUFNLENB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QVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RCxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4QyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRSxHQUFHLEVBQUU7UUFDbEUsTUFBTSxPQUFPLEdBQTZDLENBQUMsQ0FBQyxF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QUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLDBCQUEwQjtRQUMxQixNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxD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QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkRBQTZELEVBQUUsR0FBRyxFQUFFO1FBQ3JFLE1BQU0sT0FBTyxHQUE2QyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FDeEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFD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Q0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsK0JBQStCLEVBQUUsR0FBRyxFQUFFO1FBQ3ZDLE1BQU0sVUFBVSxHQUFrQixNQUFNLENBQUM7UUFDekMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztRQUNoQyxNQUFNLENBQ0YsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLFVBQTZCLENBQUMsQ0FBQzthQUN0RSxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuXG5kZXNjcmliZSgnY29udl91dGlsIGNvbXB1dGVDb252MkRJbmZvJywgKCkgPT4ge1xuICBpdCgnMXgxIGNvbnYgb3ZlciAxeDEgYXJyYXkgd2l0aCBzYW1lIHBhZCcsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAxLCAxLCAxXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzEsIDEsIDEsIDFdLCBzdHJpZGUsIGRpbGF0aW9uLCAnc2FtZScpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0KS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdCgnMngyIGNvbnYgb3ZlciAzeDMgYXJyYXkgd2l0aCBzYW1lIHBhZCcsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAzLCAzLCAxXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzIsIDIsIDEsIDFdLCBzdHJpZGUsIGRpbGF0aW9uLCAnc2FtZScpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0KS50b0VxdWFsKDIpO1xuICAgIC8vIFNob3VsZCBwcm9kdWNlIG5vbi1ldmVuIHBhZGRpbmcgd2l0aCBleHRyYSBwaXhlbCBhdCB0aGUgcmlnaHQvYm90dG9tLlxuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLmxlZnQpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8ucmlnaHQpLnRvQmUoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8udG9wKS50b0JlKDApO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLmJvdHRvbSkudG9CZSgxKTtcbiAgfSk7XG5cbiAgaXQoJzJ4MiBjb252IG92ZXIgM3gzIGFycmF5IHdpdGggc2FtZSBwYWQnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMywgMywgMV07XG4gICAgY29uc3Qgc3RyaWRlID0gMTtcbiAgICBjb25zdCBkaWxhdGlvbiA9IDE7XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICAgIGluU2hhcGUsIFsyLCAyLCAxLCAxXSwgc3RyaWRlLCBkaWxhdGlvbiwgJ3NhbWUnKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodCkudG9FcXVhbCgyKTtcbiAgfSk7XG5cbiAgaXQoJzJ4MiBjb252IG92ZXIgM3gzIGFycmF5IHdpdGggdmFsaWQgcGFkJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDMsIDMsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMiwgMiwgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb24sICd2YWxpZCcpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0KS50b0VxdWFsKDIpO1xuICB9KTtcblxuICBpdCgnM3gzIGNvbnYgb3ZlciA1eDUgYXJyYXkgd2l0aCBzYW1lIHBhZCB3aXRoIHN0cmlkZSAyJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDUsIDUsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDI7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMywgMywgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb24sICdzYW1lJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQpLnRvRXF1YWwoMyk7XG5cbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5sZWZ0KS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnJpZ2h0KS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnRvcCkudG9CZSgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5ib3R0b20pLnRvQmUoMSk7XG4gIH0pO1xuXG4gIGl0KCcyeDIgY29udiBvdmVyIDN4MyBhcnJheSB3aXRoIHZhbGlkIHBhZCB3aXRoIHN0cmlkZSAyJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDMsIDMsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDI7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMiwgMiwgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb24sICd2YWxpZCcpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0KS50b0VxdWFsKDIpO1xuICB9KTtcblxuICBpdCgnMngxIGNvbnYgb3ZlciAzeDMgYXJyYXkgd2l0aCB2YWxpZCBwYWQgd2l0aCBzdHJpZGUgMScsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAzLCAzLCAxXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzIsIDEsIDEsIDFdLCBzdHJpZGUsIGRpbGF0aW9uLCAndmFsaWQnKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodCkudG9FcXVhbCgyKTtcbiAgfSk7XG5cbiAgaXQoJzJ4MSBjb252IG92ZXIgM3gzIGFycmF5IHdpdGggdmFsaWQgcGFkIHdpdGggc3RyaWRlcyBoPTIsIHc9MScsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAzLCAzLCAxXTtcbiAgICBjb25zdCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdID0gWzIsIDFdO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzIsIDEsIDEsIDFdLCBzdHJpZGVzLCBkaWxhdGlvbiwgJ3ZhbGlkJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQpLnRvRXF1YWwoMik7XG4gIH0pO1xuXG4gIGl0KCcxeDIgY29udiBvdmVyIDN4MyBhcnJheSB3aXRoIHZhbGlkIHBhZCB3aXRoIHN0cmlkZSAxJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDMsIDMsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMSwgMiwgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb24sICd2YWxpZCcpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0KS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdCgnMXgyIGNvbnYgb3ZlciAzeDMgYXJyYXkgd2l0aCB2YWxpZCBwYWQgd2l0aCBzdHJpZGUgMSwgYmF0Y2g9NScsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFs1LCAzLCAzLCAxXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzEsIDIsIDEsIDFdLCBzdHJpZGUsIGRpbGF0aW9uLCAndmFsaWQnKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDUpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDIpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodCkudG9FcXVhbCgxKTtcbiAgfSk7XG5cbiAgaXQoJzJ4MiBjb252IG92ZXIgM3gzIGFycmF5IHdpdGggc2FtZSBwYWQgd2l0aCBkaWxhdGlvbnMgMicsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAzLCAzLCAxXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9ucyA9IDI7XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICAgIGluU2hhcGUsIFsyLCAyLCAxLCAxXSwgc3RyaWRlLCBkaWxhdGlvbnMsICdzYW1lJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoMSk7XG4gICAgLy8gcGFkIGV2ZW5seSBvbiBhbGwgc2lkZXNcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5sZWZ0KS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnJpZ2h0KS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnRvcCkudG9CZSgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5ib3R0b20pLnRvQmUoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQpLnRvRXF1YWwoMyk7XG4gIH0pO1xuXG4gIGl0KCcyeDEgY29udiBvdmVyIDN4MyBhcnJheSB3aXRoIHNhbWUgcGFkIHdpdGggZGlsYXRpb25zIDInLCAoKSA9PiB7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMywgMywgMV07XG4gICAgY29uc3Qgc3RyaWRlID0gMTtcbiAgICBjb25zdCBkaWxhdGlvbnMgPSAyO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMiwgMSwgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb25zLCAnc2FtZScpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIC8vIHBhZCB0b3AgYW5kIGJvdHRvbVxuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLmxlZnQpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8ucmlnaHQpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8udG9wKS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLmJvdHRvbSkudG9CZSgxKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodCkudG9FcXVhbCgzKTtcbiAgfSk7XG5cbiAgaXQoJzN4NCBjb252IG92ZXIgOHg4IGFycmF5IHdpdGggc2FtZSBwYWQgd2l0aCBkaWxhdGlvbnMgaD00IHc9MycsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCA4LCA4LCAxXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyXSA9IFs0LCAzXTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzMsIDQsIDEsIDFdLCBzdHJpZGUsIGRpbGF0aW9ucywgJ3NhbWUnKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoOCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDgpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGgpLnRvRXF1YWwoMTApO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQpLnRvRXF1YWwoOSk7XG5cbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5sZWZ0KS50b0JlKDQpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnJpZ2h0KS50b0JlKDUpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnRvcCkudG9CZSg0KTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5ib3R0b20pLnRvQmUoNCk7XG4gIH0pO1xuXG4gIGl0KCcyeDEgY29udiBvdmVyIDN4MyBhcnJheSB3aXRoIHZhbGlkIHBhZCB3aXRoIGRpbGF0aW9ucyAyJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDMsIDMsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMjtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzIsIDEsIDEsIDFdLCBzdHJpZGUsIGRpbGF0aW9ucywgJ3ZhbGlkJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQpLnRvRXF1YWwoMyk7XG4gIH0pO1xuXG4gIGl0KCcyeDIgY29udiBvdmVyIDN4MyBhcnJheSB3aXRoIHZhbGlkIHBhZCB3aXRoIGRpbGF0aW9ucyAyJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDMsIDMsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMjtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzIsIDIsIDEsIDFdLCBzdHJpZGUsIGRpbGF0aW9ucywgJ3ZhbGlkJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQpLnRvRXF1YWwoMyk7XG4gIH0pO1xuXG4gIGl0KCcyeDIgY29udiBvdmVyIDR4NCBhcnJheSB3aXRoIHZhbGlkIHBhZCB3aXRoIGRpbGF0aW9ucyAyJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDQsIDQsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMjtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzIsIDIsIDEsIDFdLCBzdHJpZGUsIGRpbGF0aW9ucywgJ3ZhbGlkJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDIpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQpLnRvRXF1YWwoMyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdjb252X3V0aWwgY29tcHV0ZUNvbnYzREluZm8nLCAoKSA9PiB7XG4gIGl0KCcxeDF4MSBjb252IG92ZXIgMXgxeDEgYXJyYXkgd2l0aCBzYW1lIHBhZCcsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDEsIDEsIDEsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMSwgMSwgMSwgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb24sICdzYW1lJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdCgnMngyeDIgY29udiBvdmVyIDN4M3gzIGFycmF5IHdpdGggc2FtZSBwYWQnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAzLCAzLCAzLCAxXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzIsIDIsIDIsIDEsIDFdLCBzdHJpZGUsIGRpbGF0aW9uLCAnc2FtZScpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dERlcHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCgxKTtcbiAgICAvLyBTaG91bGQgcHJvZHVjZSBub24tZXZlbiBwYWRkaW5nIHdpdGggZXh0cmEgcGl4ZWwgYXQgdGhlIGJhY2svcmlnaHQvYm90dG9tXG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uZnJvbnQpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uYmFjaykudG9CZSgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5sZWZ0KS50b0JlKDApO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnJpZ2h0KS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnRvcCkudG9CZSgwKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5ib3R0b20pLnRvQmUoMSk7XG4gIH0pO1xuXG4gIGl0KCcyeDJ4MiBjb252IG92ZXIgM3gzeDMgYXJyYXkgd2l0aCBzYW1lIHBhZCcsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDMsIDMsIDMsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMiwgMiwgMiwgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb24sICdzYW1lJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdCgnMngyeDIgY29udiBvdmVyIDN4M3gzIGFycmF5IHdpdGggdmFsaWQgcGFkJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMywgMywgMywgMV07XG4gICAgY29uc3Qgc3RyaWRlID0gMTtcbiAgICBjb25zdCBkaWxhdGlvbiA9IDE7XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYzREluZm8oXG4gICAgICAgIGluU2hhcGUsIFsyLCAyLCAyLCAxLCAxXSwgc3RyaWRlLCBkaWxhdGlvbiwgJ3ZhbGlkJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdCgnM3gzeDMgY29udiBvdmVyIDV4NXg1IGFycmF5IHdpdGggc2FtZSBwYWQgd2l0aCBzdHJpZGUgMicsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDUsIDUsIDUsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDI7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMywgMywgMywgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb24sICdzYW1lJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuXG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uZnJvbnQpLnRvQmUoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uYmFjaykudG9CZSgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5sZWZ0KS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnJpZ2h0KS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnRvcCkudG9CZSgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5ib3R0b20pLnRvQmUoMSk7XG4gIH0pO1xuXG4gIGl0KCcyeDJ4MiBjb252IG92ZXIgM3gzeDMgYXJyYXkgd2l0aCB2YWxpZCBwYWQgd2l0aCBzdHJpZGUgMicsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDMsIDMsIDMsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDI7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMiwgMiwgMiwgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb24sICd2YWxpZCcpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dERlcHRoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCgxKTtcbiAgfSk7XG5cbiAgaXQoJzJ4MXgxIGNvbnYgb3ZlciAzeDN4MyBhcnJheSB3aXRoIHZhbGlkIHBhZCB3aXRoIHN0cmlkZSAxJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMywgMywgMywgMV07XG4gICAgY29uc3Qgc3RyaWRlID0gMTtcbiAgICBjb25zdCBkaWxhdGlvbiA9IDE7XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYzREluZm8oXG4gICAgICAgIGluU2hhcGUsIFsyLCAxLCAxLCAxLCAxXSwgc3RyaWRlLCBkaWxhdGlvbiwgJ3ZhbGlkJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdCgnMngxeDEgY29udiBvdmVyIDN4M3gzIGFycmF5IHdpdGggdmFsaWQgcGFkIHdpdGggc3RyaWRlcyBkPTIsIGg9MSwgdz0xJyxcbiAgICAgKCkgPT4ge1xuICAgICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPVxuICAgICAgICAgICBbMSwgMywgMywgMywgMV07XG4gICAgICAgY29uc3Qgc3RyaWRlczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzIsIDEsIDFdO1xuICAgICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgICAgICAgaW5TaGFwZSwgWzIsIDEsIDEsIDEsIDFdLCBzdHJpZGVzLCBkaWxhdGlvbiwgJ3ZhbGlkJyk7XG4gICAgICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMSk7XG4gICAgICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgICB9KTtcblxuICBpdCgnMXgyeDIgY29udiBvdmVyIDN4M3gzIGFycmF5IHdpdGggdmFsaWQgcGFkIHdpdGggc3RyaWRlIDEnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAzLCAzLCAzLCAxXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzEsIDIsIDIsIDEsIDFdLCBzdHJpZGUsIGRpbGF0aW9uLCAndmFsaWQnKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXREZXB0aCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDIpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoMSk7XG4gIH0pO1xuXG4gIGl0KCcxeDJ4MiBjb252IG92ZXIgM3gzeDMgYXJyYXkgd2l0aCB2YWxpZCBwYWQgd2l0aCBzdHJpZGUgMSwgYmF0Y2g9NScsXG4gICAgICgpID0+IHtcbiAgICAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID1cbiAgICAgICAgICAgWzUsIDMsIDMsIDMsIDFdO1xuICAgICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgICAgICBpblNoYXBlLCBbMSwgMiwgMiwgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb24sICd2YWxpZCcpO1xuICAgICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoNSk7XG4gICAgICAgZXhwZWN0KGNvbnZJbmZvLm91dERlcHRoKS50b0VxdWFsKDMpO1xuICAgICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoMik7XG4gICAgICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDIpO1xuICAgICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCgxKTtcbiAgICAgfSk7XG5cbiAgaXQoJzJ4MngyIGNvbnYgb3ZlciAzeDN4MyBhcnJheSB3aXRoIHNhbWUgcGFkIHdpdGggZGlsYXRpb25zIDInLCAoKSA9PiB7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAzLCAzLCAzLCAxXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9ucyA9IDI7XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYzREluZm8oXG4gICAgICAgIGluU2hhcGUsIFsyLCAyLCAyLCAxLCAxXSwgc3RyaWRlLCBkaWxhdGlvbnMsICdzYW1lJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIC8vIHBhZCBldmVubHkgb24gYWxsIHNpZGVzXG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uZnJvbnQpLnRvQmUoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uYmFjaykudG9CZSgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5sZWZ0KS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnJpZ2h0KS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnRvcCkudG9CZSgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5ib3R0b20pLnRvQmUoMSk7XG4gIH0pO1xuXG4gIGl0KCcyeDF4MSBjb252IG92ZXIgM3gzeDMgYXJyYXkgd2l0aCBzYW1lIHBhZCB3aXRoIGRpbGF0aW9ucyAyJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMywgMywgMywgMV07XG4gICAgY29uc3Qgc3RyaWRlID0gMTtcbiAgICBjb25zdCBkaWxhdGlvbnMgPSAyO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMiwgMSwgMSwgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb25zLCAnc2FtZScpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dERlcHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCgxKTtcbiAgICAvLyBwYWQgdG9wIGFuZCBib3R0b21cbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5mcm9udCkudG9CZSgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5iYWNrKS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLmxlZnQpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8ucmlnaHQpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8udG9wKS50b0JlKDApO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLmJvdHRvbSkudG9CZSgwKTtcbiAgfSk7XG5cbiAgaXQoJzN4NHg0IGNvbnYgb3ZlciA4eDggYXJyYXkgd2l0aCBzYW1lIHBhZCB3aXRoIGRpbGF0aW9ucyBkPTQgaD0zIHc9MycsXG4gICAgICgpID0+IHtcbiAgICAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID1cbiAgICAgICAgICAgWzEsIDgsIDgsIDgsIDFdO1xuICAgICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgICAgY29uc3QgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbNCwgMywgM107XG4gICAgICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYzREluZm8oXG4gICAgICAgICAgIGluU2hhcGUsIFszLCA0LCA0LCAxLCAxXSwgc3RyaWRlLCBkaWxhdGlvbnMsICdzYW1lJyk7XG4gICAgICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoOCk7XG4gICAgICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCg4KTtcbiAgICAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoOCk7XG4gICAgICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuXG4gICAgICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uZnJvbnQpLnRvQmUoNCk7XG4gICAgICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uYmFjaykudG9CZSg0KTtcbiAgICAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5sZWZ0KS50b0JlKDQpO1xuICAgICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnJpZ2h0KS50b0JlKDUpO1xuICAgICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnRvcCkudG9CZSg0KTtcbiAgICAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5ib3R0b20pLnRvQmUoNSk7XG4gICAgIH0pO1xuXG4gIGl0KCcyeDF4MSBjb252IG92ZXIgM3gzeDMgYXJyYXkgd2l0aCB2YWxpZCBwYWQgd2l0aCBkaWxhdGlvbnMgMicsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDMsIDMsIDMsIDFdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb25zID0gMjtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzIsIDEsIDEsIDEsIDFdLCBzdHJpZGUsIGRpbGF0aW9ucywgJ3ZhbGlkJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdCgnMngyeDIgY29udiBvdmVyIDN4M3gzIGFycmF5IHdpdGggdmFsaWQgcGFkIHdpdGggZGlsYXRpb25zIDInLCAoKSA9PiB7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAzLCAzLCAzLCAxXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9ucyA9IDI7XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYzREluZm8oXG4gICAgICAgIGluU2hhcGUsIFsyLCAyLCAyLCAxLCAxXSwgc3RyaWRlLCBkaWxhdGlvbnMsICd2YWxpZCcpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dERlcHRoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCgxKTtcbiAgfSk7XG5cbiAgaXQoJzJ4MngyIGNvbnYgb3ZlciA0eDR4NCBhcnJheSB3aXRoIHZhbGlkIHBhZCB3aXRoIGRpbGF0aW9ucyAyJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgNCwgNCwgNCwgMV07XG4gICAgY29uc3Qgc3RyaWRlID0gMTtcbiAgICBjb25zdCBkaWxhdGlvbnMgPSAyO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMiwgMiwgMiwgMSwgMV0sIHN0cmlkZSwgZGlsYXRpb25zLCAndmFsaWQnKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXREZXB0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDIpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoMSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdjb252X3V0aWwgY29tcHV0ZUNvbnYyREluZm8gd2l0aCBkZXB0aHdpc2U9dHJ1ZScsICgpID0+IHtcbiAgaXQoJzF4MSBmaWx0ZXIgb3ZlciAxeDEgYXJyYXkgd2l0aCBzYW1lIHBhZCcsICgpID0+IHtcbiAgICBjb25zdCBpbkNoYW5uZWxzID0gMTtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAxLCAxLCBpbkNoYW5uZWxzXTtcbiAgICBjb25zdCBmU2l6ZSA9IDE7XG4gICAgY29uc3QgY2hNdWwgPSAxO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IHBhZCA9ICdzYW1lJztcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgW2ZTaXplLCBmU2l6ZSwgaW5DaGFubmVscywgY2hNdWxdLCBzdHJpZGUsIGRpbGF0aW9uLCBwYWQsIG51bGwsXG4gICAgICAgIHRydWUpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0KS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdCgnMngyIGZpbHRlciBvdmVyIDN4MyBhcnJheSB3aXRoIHNhbWUgcGFkLCBjaE11bD0zLCBkZXB0aD0yJywgKCkgPT4ge1xuICAgIGNvbnN0IGluQ2hhbm5lbHMgPSAyO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDE7XG4gICAgY29uc3QgaW5TaXplID0gMztcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9XG4gICAgICAgIFtiYXRjaFNpemUsIGluU2l6ZSwgaW5TaXplLCBpbkNoYW5uZWxzXTtcbiAgICBjb25zdCBmU2l6ZSA9IDI7XG4gICAgY29uc3QgY2hNdWwgPSAzO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IHBhZCA9ICdzYW1lJztcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgW2ZTaXplLCBmU2l6ZSwgaW5DaGFubmVscywgY2hNdWxdLCBzdHJpZGUsIGRpbGF0aW9uLCBwYWQsIG51bGwsXG4gICAgICAgIHRydWUpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDYpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0KS50b0VxdWFsKDIpO1xuICB9KTtcblxuICBpdCgnMngyIGZpbHRlciBvdmVyIDN4MyBhcnJheSB3aXRoIHZhbGlkIHBhZCwgY2hNdWw9MywgZGVwdGg9MicsICgpID0+IHtcbiAgICBjb25zdCBpbkNoYW5uZWxzID0gMjtcbiAgICBjb25zdCBiYXRjaFNpemUgPSAxO1xuICAgIGNvbnN0IGluU2l6ZSA9IDM7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPVxuICAgICAgICBbYmF0Y2hTaXplLCBpblNpemUsIGluU2l6ZSwgaW5DaGFubmVsc107XG4gICAgY29uc3QgZlNpemUgPSAyO1xuICAgIGNvbnN0IGNoTXVsID0gMztcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBwYWQgPSAndmFsaWQnO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgICBpblNoYXBlLCBbZlNpemUsIGZTaXplLCBpbkNoYW5uZWxzLCBjaE11bF0sIHN0cmlkZSwgZGlsYXRpb24sIHBhZCwgbnVsbCxcbiAgICAgICAgdHJ1ZSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDIpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoNik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoKS50b0VxdWFsKDIpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQpLnRvRXF1YWwoMik7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdjb252X3V0aWwgY29tcHV0ZUNvbnYzREluZm8gd2l0aCBkZXB0aHdpc2U9dHJ1ZScsICgpID0+IHtcbiAgaXQoJzF4MXgxIGZpbHRlciBvdmVyIDF4MXgxIGFycmF5IHdpdGggc2FtZSBwYWQnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5DaGFubmVscyA9IDE7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9XG4gICAgICAgIFsxLCAxLCAxLCAxLCBpbkNoYW5uZWxzXTtcbiAgICBjb25zdCBmU2l6ZSA9IDE7XG4gICAgY29uc3QgY2hNdWwgPSAxO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IHBhZCA9ICdzYW1lJztcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgW2ZTaXplLCBmU2l6ZSwgZlNpemUsIGluQ2hhbm5lbHMsIGNoTXVsXSwgc3RyaWRlLCBkaWxhdGlvbixcbiAgICAgICAgcGFkLCB0cnVlKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXREZXB0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoMSk7XG4gIH0pO1xuXG4gIGl0KCcyeDJ4MiBmaWx0ZXIgb3ZlciAzeDN4MyBhcnJheSB3aXRoIHNhbWUgcGFkLCBjaE11bD0zLCBkZXB0aD0yJywgKCkgPT4ge1xuICAgIGNvbnN0IGluQ2hhbm5lbHMgPSAyO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDE7XG4gICAgY29uc3QgaW5TaXplID0gMztcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID1cbiAgICAgICAgW2JhdGNoU2l6ZSwgaW5TaXplLCBpblNpemUsIGluU2l6ZSwgaW5DaGFubmVsc107XG4gICAgY29uc3QgZlNpemUgPSAyO1xuICAgIGNvbnN0IGNoTXVsID0gMztcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBwYWQgPSAnc2FtZSc7XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYzREluZm8oXG4gICAgICAgIGluU2hhcGUsIFtmU2l6ZSwgZlNpemUsIGZTaXplLCBpbkNoYW5uZWxzLCBjaE11bF0sIHN0cmlkZSwgZGlsYXRpb24sXG4gICAgICAgIHBhZCwgdHJ1ZSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDYpO1xuICB9KTtcblxuICBpdCgnMngyeDIgZmlsdGVyIG92ZXIgM3gzeDMgYXJyYXkgd2l0aCB2YWxpZCBwYWQsIGNoTXVsPTMsIGRlcHRoPTInLCAoKSA9PiB7XG4gICAgY29uc3QgaW5DaGFubmVscyA9IDI7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gMTtcbiAgICBjb25zdCBpblNpemUgPSAzO1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPVxuICAgICAgICBbYmF0Y2hTaXplLCBpblNpemUsIGluU2l6ZSwgaW5TaXplLCBpbkNoYW5uZWxzXTtcbiAgICBjb25zdCBmU2l6ZSA9IDI7XG4gICAgY29uc3QgY2hNdWwgPSAzO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IHBhZCA9ICd2YWxpZCc7XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYzREluZm8oXG4gICAgICAgIGluU2hhcGUsIFtmU2l6ZSwgZlNpemUsIGZTaXplLCBpbkNoYW5uZWxzLCBjaE11bF0sIHN0cmlkZSwgZGlsYXRpb24sXG4gICAgICAgIHBhZCwgdHJ1ZSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDYpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY29udl91dGlsIGNvbXB1dGVDb252MkRJbmZvIGNoYW5uZWxzRmlyc3QnLCAoKSA9PiB7XG4gIGl0KCcyeDIgY29udiBvdmVyIDN4MyBhcnJheSB3aXRoIHNhbWUgcGFkJywgKCkgPT4ge1xuICAgIGNvbnN0IGluRGVwdGggPSAyO1xuICAgIGNvbnN0IG91dERlcHRoID0gNDtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCBpbkRlcHRoLCAzLCAzXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzIsIDIsIGluRGVwdGgsIG91dERlcHRoXSwgc3RyaWRlLCBkaWxhdGlvbiwgJ3NhbWUnLCBudWxsLFxuICAgICAgICBmYWxzZSwgJ2NoYW5uZWxzRmlyc3QnKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCg0KTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0U2hhcGUpLnRvRXF1YWwoWzEsIDQsIDMsIDNdKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodCkudG9FcXVhbCgyKTtcbiAgICAvLyBTaG91bGQgcHJvZHVjZSBub24tZXZlbiBwYWRkaW5nIHdpdGggZXh0cmEgcGl4ZWwgYXQgdGhlIHJpZ2h0L2JvdHRvbS5cbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5sZWZ0KS50b0JlKDApO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnJpZ2h0KS50b0JlKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnRvcCkudG9CZSgwKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5ib3R0b20pLnRvQmUoMSk7XG4gIH0pO1xuXG4gIGl0KCcyeDIgY29udiBvdmVyIDN4MyBhcnJheSB3aXRoIHZhbGlkIHBhZCcsICgpID0+IHtcbiAgICBjb25zdCBpbkRlcHRoID0gNjtcbiAgICBjb25zdCBvdXREZXB0aCA9IDE2O1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIGluRGVwdGgsIDMsIDNdO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgICBpblNoYXBlLCBbMiwgMiwgaW5EZXB0aCwgb3V0RGVwdGhdLCBzdHJpZGUsIGRpbGF0aW9uLCAndmFsaWQnLCBudWxsLFxuICAgICAgICBmYWxzZSwgJ2NoYW5uZWxzRmlyc3QnKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDIpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCgxNik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFNoYXBlKS50b0VxdWFsKFsxLCAxNiwgMiwgMl0pO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0KS50b0VxdWFsKDIpO1xuICAgIC8vIFNob3VsZCBwcm9kdWNlIG5vIHBhZGRpbmcuXG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8ubGVmdCkudG9CZSgwKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5yaWdodCkudG9CZSgwKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby50b3ApLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uYm90dG9tKS50b0JlKDApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY29udl91dGlsIGNvbXB1dGVDb252M0RJbmZvIGNoYW5uZWxzRmlyc3QnLCAoKSA9PiB7XG4gIGl0KCcyeDJ4MiBjb252IG92ZXIgM3gzeDMgYXJyYXkgd2l0aCBzYW1lIHBhZCcsICgpID0+IHtcbiAgICBjb25zdCBpbkRlcHRoID0gMjtcbiAgICBjb25zdCBvdXREZXB0aCA9IDQ7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9XG4gICAgICAgIFsxLCBpbkRlcHRoLCAzLCAzLCAzXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzIsIDIsIDIsIGluRGVwdGgsIG91dERlcHRoXSwgc3RyaWRlLCBkaWxhdGlvbiwgJ3NhbWUnLCBmYWxzZSxcbiAgICAgICAgJ2NoYW5uZWxzRmlyc3QnKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXREZXB0aCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoNCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFNoYXBlKS50b0VxdWFsKFsxLCA0LCAzLCAzLCAzXSk7XG4gICAgLy8gU2hvdWxkIHByb2R1Y2Ugbm9uLWV2ZW4gcGFkZGluZyB3aXRoIGV4dHJhIHBpeGVsIGF0IHRoZSBiYWNrL3JpZ2h0L2JvdHRvbVxuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLmZyb250KS50b0JlKDApO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLmJhY2spLnRvQmUoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8ubGVmdCkudG9CZSgwKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5yaWdodCkudG9CZSgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby50b3ApLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uYm90dG9tKS50b0JlKDEpO1xuICB9KTtcblxuICBpdCgnMngyeDIgY29udiBvdmVyIDN4M3gzIGFycmF5IHdpdGggdmFsaWQgcGFkJywgKCkgPT4ge1xuICAgIGNvbnN0IGluRGVwdGggPSA2O1xuICAgIGNvbnN0IG91dERlcHRoID0gMTY7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9XG4gICAgICAgIFsxLCBpbkRlcHRoLCAzLCAzLCAzXTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgWzIsIDIsIDIsIGluRGVwdGgsIG91dERlcHRoXSwgc3RyaWRlLCBkaWxhdGlvbiwgJ3ZhbGlkJywgZmFsc2UsXG4gICAgICAgICdjaGFubmVsc0ZpcnN0Jyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDE2KTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0U2hhcGUpLnRvRXF1YWwoWzEsIDE2LCAyLCAyLCAyXSk7XG4gICAgLy8gU2hvdWxkIHByb2R1Y2Ugbm8gcGFkZGluZy5cbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5mcm9udCkudG9CZSgwKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5iYWNrKS50b0JlKDApO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLmxlZnQpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8ucmlnaHQpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8udG9wKS50b0JlKDApO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLmJvdHRvbSkudG9CZSgwKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2NvbnZfdXRpbCBjb21wdXRlQ29udjJESW5mbyByb3VuZGluZ01vZGUnLCAoKSA9PiB7XG4gIGNvbnN0IGluQ2hhbm5lbHMgPSA2O1xuICBjb25zdCBiYXRjaFNpemUgPSAxO1xuICBjb25zdCBpblNpemUgPSA1O1xuICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9XG4gICAgICBbYmF0Y2hTaXplLCBpblNpemUsIGluU2l6ZSwgaW5DaGFubmVsc107XG4gIGNvbnN0IGZTaXplID0gMjtcbiAgY29uc3QgY2hNdWwgPSAxMjtcbiAgY29uc3Qgc3RyaWRlID0gMjtcbiAgY29uc3QgZGlsYXRpb24gPSAxO1xuICBjb25zdCBwYWQgPSAxO1xuXG4gIGl0KCdEZWZhdWx0IHRydW5jYXRlIHRoZSBvdXRwdXQgZGltZW5zaW9uIG9mIENvbnYgTGF5ZXInLCAoKSA9PiB7XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICAgIGluU2hhcGUsIFtmU2l6ZSwgZlNpemUsIGluQ2hhbm5lbHMsIGNoTXVsXSwgc3RyaWRlLCBkaWxhdGlvbiwgcGFkKTtcblxuICAgIGV4cGVjdChjb252SW5mby5vdXRTaGFwZSkudG9FcXVhbChbYmF0Y2hTaXplLCAzLCAzLCBjaE11bF0pO1xuICB9KTtcblxuICBpdCgnRmxvb3IgdGhlIG91dHB1dCBkaW1lbnNpb24gb2YgQ29udiBMYXllcicsICgpID0+IHtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgW2ZTaXplLCBmU2l6ZSwgaW5DaGFubmVscywgY2hNdWxdLCBzdHJpZGUsIGRpbGF0aW9uLCBwYWQsXG4gICAgICAgICdmbG9vcicpO1xuXG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFNoYXBlKS50b0VxdWFsKFtiYXRjaFNpemUsIDMsIDMsIGNoTXVsXSk7XG4gIH0pO1xuXG4gIGl0KCdSb3VuZCB0aGUgb3V0cHV0IGRpbWVuc2lvbiBvZiBDb252IExheWVyJywgKCkgPT4ge1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgICBpblNoYXBlLCBbZlNpemUsIGZTaXplLCBpbkNoYW5uZWxzLCBjaE11bF0sIHN0cmlkZSwgZGlsYXRpb24sIHBhZCxcbiAgICAgICAgJ3JvdW5kJyk7XG5cbiAgICBleHBlY3QoY29udkluZm8ub3V0U2hhcGUpLnRvRXF1YWwoW2JhdGNoU2l6ZSwgNCwgNCwgY2hNdWxdKTtcbiAgfSk7XG5cbiAgaXQoJ0NlaWwgdGhlIG91dHB1dCBkaW1lbnNpb24gb2YgQ29udiBMYXllcicsICgpID0+IHtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgW2ZTaXplLCBmU2l6ZSwgaW5DaGFubmVscywgY2hNdWxdLCBzdHJpZGUsIGRpbGF0aW9uLCBwYWQsXG4gICAgICAgICdjZWlsJyk7XG5cbiAgICBleHBlY3QoY29udkluZm8ub3V0U2hhcGUpLnRvRXF1YWwoW2JhdGNoU2l6ZSwgNCwgNCwgY2hNdWxdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2NvbnZfdXRpbCBjb21wdXRlUG9vbEluZm8gcm91bmRpbmdNb2RlJywgKCkgPT4ge1xuICBjb25zdCBpbkNoYW5uZWxzID0gNjtcbiAgY29uc3QgYmF0Y2hTaXplID0gMTtcbiAgY29uc3QgaW5TaXplID0gNTtcbiAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPVxuICAgICAgW2JhdGNoU2l6ZSwgaW5TaXplLCBpblNpemUsIGluQ2hhbm5lbHNdO1xuICBjb25zdCBmU2l6ZSA9IDI7XG4gIGNvbnN0IHN0cmlkZSA9IDI7XG4gIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgY29uc3QgcGFkID0gMTtcblxuICBpdCgnRGVmYXVsdCB0cnVuY2F0ZSB0aGUgb3V0cHV0IGRpbWVuc2lvbiBvZiBQb29sIExheWVyJywgKCkgPT4ge1xuICAgIGNvbnN0IHBvb2xJbmZvID0gY29udl91dGlsLmNvbXB1dGVQb29sMkRJbmZvKFxuICAgICAgICBpblNoYXBlLCBbZlNpemUsIGZTaXplXSwgc3RyaWRlLCBwYWQsIGRpbGF0aW9uLCAnZmxvb3InKTtcblxuICAgIGV4cGVjdChwb29sSW5mby5vdXRTaGFwZSkudG9FcXVhbChbYmF0Y2hTaXplLCAzLCAzLCBpbkNoYW5uZWxzXSk7XG4gIH0pO1xuXG4gIGl0KCdGbG9vciB0aGUgb3V0cHV0IGRpbWVuc2lvbiBvZiBQb29sIExheWVyJywgKCkgPT4ge1xuICAgIGNvbnN0IHBvb2xJbmZvID0gY29udl91dGlsLmNvbXB1dGVQb29sMkRJbmZvKFxuICAgICAgICBpblNoYXBlLCBbZlNpemUsIGZTaXplXSwgc3RyaWRlLCBwYWQsIGRpbGF0aW9uLCAnZmxvb3InKTtcblxuICAgIGV4cGVjdChwb29sSW5mby5vdXRTaGFwZSkudG9FcXVhbChbYmF0Y2hTaXplLCAzLCAzLCBpbkNoYW5uZWxzXSk7XG4gIH0pO1xuXG4gIGl0KCdSb3VuZCB0aGUgb3V0cHV0IGRpbWVuc2lvbiBvZiBQb29sIExheWVyJywgKCkgPT4ge1xuICAgIGNvbnN0IHBvb2xJbmZvID0gY29udl91dGlsLmNvbXB1dGVQb29sMkRJbmZvKFxuICAgICAgICBpblNoYXBlLCBbZlNpemUsIGZTaXplXSwgc3RyaWRlLCBwYWQsIGRpbGF0aW9uLCAncm91bmQnKTtcblxuICAgIGV4cGVjdChwb29sSW5mby5vdXRTaGFwZSkudG9FcXVhbChbYmF0Y2hTaXplLCA0LCA0LCBpbkNoYW5uZWxzXSk7XG4gIH0pO1xuXG4gIGl0KCdDZWlsIHRoZSBvdXRwdXQgZGltZW5zaW9uIG9mIFBvb2wgTGF5ZXInLCAoKSA9PiB7XG4gICAgY29uc3QgcG9vbEluZm8gPSBjb252X3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICAgIGluU2hhcGUsIFtmU2l6ZSwgZlNpemVdLCBzdHJpZGUsIHBhZCwgZGlsYXRpb24sICdjZWlsJyk7XG5cbiAgICBleHBlY3QocG9vbEluZm8ub3V0U2hhcGUpLnRvRXF1YWwoW2JhdGNoU2l6ZSwgNCwgNCwgaW5DaGFubmVsc10pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY29udl91dGlsIGNvbXB1dGVQb29sM2RJbmZvJywgKCkgPT4ge1xuICBpdCgnMXgxeDEgcG9vbCBvdmVyIDF4MXgxIGFycmF5IHdpdGggdmFsaWQgcGFkJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMSwgMSwgMSwgMV07XG4gICAgY29uc3QgZmlsdGVyU2l6ZSA9IDE7XG4gICAgY29uc3Qgc3RyaWRlID0gMTtcbiAgICBjb25zdCBkaWxhdGlvbiA9IDE7XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICAgIGluU2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZSwgZGlsYXRpb24sICd2YWxpZCcpO1xuICAgIGV4cGVjdChjb252SW5mby5iYXRjaFNpemUpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dERlcHRoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRIZWlnaHQpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dFdpZHRoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRDaGFubmVscykudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVyRGVwdGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQpLnRvRXF1YWwoMSk7XG4gIH0pO1xuXG4gIGl0KCcxeDF4MSBwb29sIG92ZXIgM3gzeDMgYXJyYXkgd2l0aCB2YWxpZCBwYWQnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAzLCAzLCAzLCAxXTtcbiAgICBjb25zdCBmaWx0ZXJTaXplID0gMTtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlLCBkaWxhdGlvbiwgJ3ZhbGlkJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodCkudG9FcXVhbCgxKTtcbiAgfSk7XG5cbiAgaXQoJzJ4MngyIHBvb2wgb3ZlciAzeDN4MyBhcnJheSB3aXRoIHNhbWUgcGFkJywgKCkgPT4ge1xuICAgIGNvbnN0IGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMywgMywgMywgMV07XG4gICAgY29uc3QgZmlsdGVyU2l6ZSA9IDI7XG4gICAgY29uc3Qgc3RyaWRlID0gMTtcbiAgICBjb25zdCBkaWxhdGlvbiA9IDE7XG4gICAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICAgIGluU2hhcGUsIGZpbHRlclNpemUsIHN0cmlkZSwgZGlsYXRpb24sICdzYW1lJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby50b3ApLnRvRXF1YWwoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uYm90dG9tKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLmxlZnQpLnRvRXF1YWwoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8ucmlnaHQpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uZnJvbnQpLnRvRXF1YWwoMCk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8uYmFjaykudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby50eXBlKS50b0VxdWFsKCdTQU1FJyk7XG4gIH0pO1xuXG4gIGl0KCcyeDJ4MiBwb29sIG92ZXIgM3gzeDMgYXJyYXkgd2l0aCB2YWxpZCBwYWQnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAzLCAzLCAzLCAxXTtcbiAgICBjb25zdCBmaWx0ZXJTaXplID0gMjtcbiAgICBjb25zdCBzdHJpZGUgPSAxO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlLCBkaWxhdGlvbiwgJ3ZhbGlkJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodCkudG9FcXVhbCgyKTtcbiAgfSk7XG5cbiAgaXQoJzJ4MngyIHBvb2wgb3ZlciA0eDR4NCBhcnJheSB3aXRoIHZhbGlkIHBhZCwgc3RyaWRlIDInLCAoKSA9PiB7XG4gICAgY29uc3QgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCA0LCA0LCA0LCAxXTtcbiAgICBjb25zdCBmaWx0ZXJTaXplID0gMjtcbiAgICBjb25zdCBzdHJpZGUgPSAyO1xuICAgIGNvbnN0IGRpbGF0aW9uID0gMTtcbiAgICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhcbiAgICAgICAgaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlLCBkaWxhdGlvbiwgJ3ZhbGlkJyk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmJhdGNoU2l6ZSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0RGVwdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dEhlaWdodCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0V2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLm91dENoYW5uZWxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGgpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodCkudG9FcXVhbCgyKTtcbiAgfSk7XG5cbiAgaXQoJzJ4MngyIHBvb2wgb3ZlciAzeDN4MyBhcnJheSB3aXRoIHZhbGlkIHBhZCwgZGlsYXRpb24gMicsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDMsIDMsIDMsIDFdO1xuICAgIGNvbnN0IGZpbHRlclNpemUgPSAyO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAyO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVQb29sM0RJbmZvKFxuICAgICAgICBpblNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGUsIGRpbGF0aW9uLCAndmFsaWQnKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXREZXB0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0KS50b0VxdWFsKDMpO1xuICB9KTtcblxuICBpdCgnMngyeDIgcG9vbCBvdmVyIDN4M3gzIGFycmF5IHdpdGggcGFkIDEsIHJvdW5kaW5nTW9kZSBmbG9vcicsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDMsIDMsIDMsIDFdO1xuICAgIGNvbnN0IGZpbHRlclNpemUgPSAyO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVQb29sM0RJbmZvKFxuICAgICAgICBpblNoYXBlLCBmaWx0ZXJTaXplLCBzdHJpZGUsIGRpbGF0aW9uLCAxLCAnZmxvb3InKTtcbiAgICBleHBlY3QoY29udkluZm8uYmF0Y2hTaXplKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXREZXB0aCkudG9FcXVhbCg0KTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0SGVpZ2h0KS50b0VxdWFsKDQpO1xuICAgIGV4cGVjdChjb252SW5mby5vdXRXaWR0aCkudG9FcXVhbCg0KTtcbiAgICBleHBlY3QoY29udkluZm8ub3V0Q2hhbm5lbHMpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoKS50b0VxdWFsKDIpO1xuICAgIGV4cGVjdChjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aCkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0KS50b0VxdWFsKDIpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnRvcCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5ib3R0b20pLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGNvbnZJbmZvLnBhZEluZm8ubGVmdCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5yaWdodCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5mcm9udCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoY29udkluZm8ucGFkSW5mby5iYWNrKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChjb252SW5mby5wYWRJbmZvLnR5cGUpLnRvRXF1YWwoJ05VTUJFUicpO1xuICB9KTtcblxuICBpdCgndGhyb3dzIHVua25vd24gZGF0YUZvcm1hdCcsICgpID0+IHtcbiAgICBjb25zdCBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDMsIDMsIDMsIDFdO1xuICAgIGNvbnN0IGZpbHRlclNpemUgPSAyO1xuICAgIGNvbnN0IHN0cmlkZSA9IDE7XG4gICAgY29uc3QgZGlsYXRpb24gPSAxO1xuICAgIGNvbnN0IGZha2VEYXRhRm9ybWF0ID0gJ2Zha2VGb3JtYXQnIGFzICdOREhXQycgfCAnTkNESFcnO1xuICAgIGV4cGVjdChcbiAgICAgICAgKCkgPT4gY29udl91dGlsLmNvbXB1dGVQb29sM0RJbmZvKFxuICAgICAgICAgICAgaW5TaGFwZSwgZmlsdGVyU2l6ZSwgc3RyaWRlLCBkaWxhdGlvbiwgMSwgJ2Zsb29yJywgZmFrZURhdGFGb3JtYXQpKVxuICAgICAgICAudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdjb252X3V0aWwgY29udmVydENvbnYyRERhdGFGb3JtYXQnLCAoKSA9PiB7XG4gIGl0KCdjb252ZXJ0IE5IV0MgdG8gY2hhbm5lbHNMYXN0JywgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycgPSAnTkhXQyc7XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBjb252X3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgZXhwZWN0KCRkYXRhRm9ybWF0KS50b0VxdWFsKCdjaGFubmVsc0xhc3QnKTtcbiAgfSk7XG5cbiAgaXQoJ2NvbnZlcnQgTkNIVyB0byBjaGFubmVsc0ZpcnN0JywgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycgPSAnTkNIVyc7XG4gICAgY29uc3QgJGRhdGFGb3JtYXQgPSBjb252X3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgZXhwZWN0KCRkYXRhRm9ybWF0KS50b0VxdWFsKCdjaGFubmVsc0ZpcnN0Jyk7XG4gIH0pO1xuXG4gIGl0KCd0aHJvd3MgdW5rbm93biBkYXRhRm9ybWF0JywgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGFGb3JtYXQgPSAnRmFrZUZvcm1hdCc7XG4gICAgZXhwZWN0KFxuICAgICAgICAoKSA9PiBjb252X3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCBhcyAnTkhXQycgfCAnTkNIVycpKVxuICAgICAgICAudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xufSk7XG4iXX0=
\No newline at end of file