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 | */
|
17 | import * as conv_util from './conv_util';
|
18 | describe('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 | });
|
235 | describe('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 | });
|
446 | describe('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 | });
|
500 | describe('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 | });
|
551 | describe('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 | });
|
593 | describe('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 | });
|
637 | describe('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 | });
|
664 | describe('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 | });
|
690 | describe('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 | });
|
820 | describe('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 |