1 | /**
|
2 | * @license
|
3 | * Copyright 2020 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 { getTestImageAsTensor4d } from '../../image_test_util';
|
18 | import * as tf from '../../index';
|
19 | import { ALL_ENVS, describeWithFlags } from '../../jasmine_util';
|
20 | import { expectArraysClose } from '../../test_util';
|
21 | describeWithFlags('flipLeftRight', ALL_ENVS, () => {
|
22 | it('should flip (1x2x2x4)', async () => {
|
23 | const image = tf.tensor([
|
24 | // batch 1
|
25 | [
|
26 | // row 1
|
27 | [
|
28 | [1, 2, 3, 255],
|
29 | [4, 5, 6, 255],
|
30 | ],
|
31 | // row 2
|
32 | [
|
33 | [7, 8, 9, 255],
|
34 | [10, 11, 12, 255],
|
35 | ],
|
36 | ],
|
37 | ]);
|
38 | const flipped = tf.image.flipLeftRight(image);
|
39 | expectArraysClose([4, 5, 6, 255, 1, 2, 3, 255, 10, 11, 12, 255, 7, 8, 9, 255], await flipped.data());
|
40 | });
|
41 | it('should flip (2x2x2x4)', async () => {
|
42 | const image = tf.tensor([
|
43 | // batch 1
|
44 | [
|
45 | // row 1
|
46 | [
|
47 | [1, 2, 3, 255],
|
48 | [4, 5, 6, 255],
|
49 | ],
|
50 | // row 2
|
51 | [
|
52 | [7, 8, 9, 255],
|
53 | [10, 11, 12, 255],
|
54 | ],
|
55 | ],
|
56 | // batch 2
|
57 | [
|
58 | // row 1
|
59 | [
|
60 | [101, 102, 103, 255],
|
61 | [104, 105, 106, 255],
|
62 | ],
|
63 | // row 2
|
64 | [
|
65 | [107, 108, 109, 255],
|
66 | [110, 111, 112, 255],
|
67 | ],
|
68 | ],
|
69 | ]);
|
70 | const flipped = tf.image.flipLeftRight(image);
|
71 | expectArraysClose([
|
72 | // batch 1
|
73 | ...[4, 5, 6, 255, 1, 2, 3, 255, 10, 11, 12, 255, 7, 8, 9, 255],
|
74 | // batch 2
|
75 | ...[104, 105, 106, 255, 101, 102, 103, 255, 110, 111, 112, 255, 107,
|
76 | 108, 109, 255],
|
77 | ], await flipped.data());
|
78 | });
|
79 | it('should flip (from image)', async () => {
|
80 | const flippedPixels = tf.image.flipLeftRight(getTestImageAsTensor4d()).toInt();
|
81 | const flippedPixelsData = await flippedPixels.data();
|
82 | const expected = [
|
83 | 230, 133, 18, 255, 241, 153, 43, 255, 224, 156, 55, 255, 212, 157, 75,
|
84 | 255, 200, 155, 98, 255, 183, 138, 109, 255, 171, 120, 117, 255, 156, 100,
|
85 | 111, 255, 233, 148, 31, 255, 250, 177, 64, 255, 241, 188, 82, 255, 230,
|
86 | 193, 104, 255, 220, 190, 128, 255, 202, 174, 137, 255, 186, 152, 140, 255,
|
87 | 168, 129, 130, 255, 222, 164, 41, 255, 247, 201, 81, 255, 243, 220, 106,
|
88 | 255, 235, 227, 128, 255, 225, 228, 151, 255, 211, 216, 162, 255, 199, 198,
|
89 | 168, 255, 179, 176, 159, 255, 191, 170, 61, 255, 218, 210, 103, 255, 213,
|
90 | 230, 126, 255, 201, 236, 142, 255, 191, 239, 165, 255, 184, 234, 181, 255,
|
91 | 179, 226, 194, 255, 163, 208, 187, 255, 135, 166, 86, 255, 162, 206, 127,
|
92 | 255, 155, 226, 146, 255, 141, 232, 162, 255, 130, 235, 179, 255, 121, 231,
|
93 | 192, 255, 119, 226, 206, 255, 108, 214, 202, 255, 71, 143, 97, 255, 98,
|
94 | 181, 135, 255, 94, 206, 156, 255, 87, 220, 175, 255, 76, 225, 193, 255,
|
95 | 64, 219, 201, 255, 62, 217, 213, 255, 55, 207, 212, 255, 15, 115, 105,
|
96 | 255, 39, 150, 141, 255, 37, 177, 164, 255, 35, 200, 186, 255, 30, 209,
|
97 | 205, 255, 19, 203, 211, 255, 19, 204, 222, 255, 18, 200, 224, 255, 0,
|
98 | 102, 113, 255, 6, 133, 140, 255, 3, 158, 162, 255, 4, 182, 186, 255,
|
99 | 0, 194, 204, 255, 0, 189, 209, 255, 0, 192, 221, 255, 0, 193, 228,
|
100 | 255
|
101 | ];
|
102 | expectArraysClose(expected, flippedPixelsData);
|
103 | });
|
104 | it('throws when input is int32', async () => {
|
105 | const image = tf.tensor([[[[1, 2, 3, 255]], [[7, 8, 9, 255]]]], [1, 2, 1, 4], 'int32');
|
106 | expect(() => tf.image.flipLeftRight(image))
|
107 | .toThrowError(/Argument 'image' passed to 'flipLeftRight' must be float32/);
|
108 | });
|
109 | });
|
110 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxpcF9sZWZ0X3JpZ2h0X3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9pbWFnZS9mbGlwX2xlZnRfcmlnaHRfdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsaUJBQWlCLENBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7SUFDaEQsRUFBRSxDQUFDLHVCQUF1QixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3JDLE1BQU0sS0FBSyxHQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ25DLFVBQVU7WUFDVjtnQkFDRSxRQUFRO2dCQUNSO29CQUNFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDO29CQUNkLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDO2lCQUNmO2dCQUNELFFBQVE7Z0JBQ1I7b0JBQ0UsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7b0JBQ2QsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7aUJBQ2xCO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxpQkFBaUIsQ0FDYixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUs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R0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFDekUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFHLEdBQUcsRUFBRSxHQUFHO1lBQ3pFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUN6RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFDekUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1lBQ3pFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUN6RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFDekUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1lBQ3pFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUN6RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUcsR0FBRyxFQUFFLEVBQUU7WUFDeEUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1lBQ3pFLEVBQUUsRUFBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRyxHQUFHLEVBQUUsR0FBRztZQUN6RSxHQUFHLEVBQUUsRUFBRSxFQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFHLEdBQUc7WUFDekUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3ZFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUN6RSxDQUFDLEVBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUksR0FBRyxFQUFFLEdBQUc7WUFDekUsR0FBRztTQUNKLENBQUM7UUFFRixpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxQyxNQUFNLEtBQUssR0FBZ0IsRUFBRSxDQUFDLE1BQU0sQ0FDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QyxZQUFZLENBQ1QsNERBQTRELENBQUMsQ0FBQztJQUN4RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtnZXRUZXN0SW1hZ2VBc1RlbnNvcjRkfSBmcm9tICcuLi8uLi9pbWFnZV90ZXN0X3V0aWwnO1xuaW1wb3J0ICogYXMgdGYgZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHtBTExfRU5WUywgZGVzY3JpYmVXaXRoRmxhZ3N9IGZyb20gJy4uLy4uL2phc21pbmVfdXRpbCc7XG5pbXBvcnQge2V4cGVjdEFycmF5c0Nsb3NlfSBmcm9tICcuLi8uLi90ZXN0X3V0aWwnO1xuXG5kZXNjcmliZVdpdGhGbGFncygnZmxpcExlZnRSaWdodCcsIEFMTF9FTlZTLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgZmxpcCAoMXgyeDJ4NCknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW1hZ2U6IHRmLlRlbnNvcjREID0gdGYudGVuc29yKFtcbiAgICAgIC8vIGJhdGNoIDFcbiAgICAgIFtcbiAgICAgICAgLy8gcm93IDFcbiAgICAgICAgW1xuICAgICAgICAgIFsxLCAyLCAzLCAyNTVdLFxuICAgICAgICAgIFs0LCA1LCA2LCAyNTVdLFxuICAgICAgICBdLFxuICAgICAgICAvLyByb3cgMlxuICAgICAgICBbXG4gICAgICAgICAgWzcsIDgsIDksIDI1NV0sXG4gICAgICAgICAgWzEwLCAxMSwgMTIsIDI1NV0sXG4gICAgICAgIF0sXG4gICAgICBdLFxuICAgIF0pO1xuICAgIGNvbnN0IGZsaXBwZWQgPSB0Zi5pbWFnZS5mbGlwTGVmdFJpZ2h0KGltYWdlKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShcbiAgICAgICAgWzQsIDUsIDYsIDI1NSwgMSwgMiwgMywgMjU1LCAxMCwgMTEsIDEyLCAyNTUsIDcsIDgsIDksIDI1NV0sXG4gICAgICAgIGF3YWl0IGZsaXBwZWQuZGF0YSgpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmbGlwICgyeDJ4Mng0KScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbWFnZTogdGYuVGVuc29yNEQgPSB0Zi50ZW5zb3IoW1xuICAgICAgLy8gYmF0Y2ggMVxuICAgICAgW1xuICAgICAgICAvLyByb3cgMVxuICAgICAgICBbXG4gICAgICAgICAgWzEsIDIsIDMsIDI1NV0sXG4gICAgICAgICAgWzQsIDUsIDYsIDI1NV0sXG4gICAgICAgIF0sXG4gICAgICAgIC8vIHJvdyAyXG4gICAgICAgIFtcbiAgICAgICAgICBbNywgOCwgOSwgMjU1XSxcbiAgICAgICAgICBbMTAsIDExLCAxMiwgMjU1XSxcbiAgICAgICAgXSxcbiAgICAgIF0sXG4gICAgICAvLyBiYXRjaCAyXG4gICAgICBbXG4gICAgICAgIC8vIHJvdyAxXG4gICAgICAgIFtcbiAgICAgICAgICBbMTAxLCAxMDIsIDEwMywgMjU1XSxcbiAgICAgICAgICBbMTA0LCAxMDUsIDEwNiwgMjU1XSxcbiAgICAgICAgXSxcbiAgICAgICAgLy8gcm93IDJcbiAgICAgICAgW1xuICAgICAgICAgIFsxMDcsIDEwOCwgMTA5LCAyNTVdLFxuICAgICAgICAgIFsxMTAsIDExMSwgMTEyLCAyNTVdLFxuICAgICAgICBdLFxuICAgICAgXSxcbiAgICBdKTtcbiAgICBjb25zdCBmbGlwcGVkID0gdGYuaW1hZ2UuZmxpcExlZnRSaWdodChpbWFnZSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoXG4gICAgICAgIFtcbiAgICAgICAgICAvLyBiYXRjaCAxXG4gICAgICAgICAgLi4uWzQsIDUsIDYsIDI1NSwgMSwgMiwgMywgMjU1LCAxMCwgMTEsIDEyLCAyNTUsIDcsIDgsIDksIDI1NV0sXG4gICAgICAgICAgLy8gYmF0Y2ggMlxuICAgICAgICAgIC4uLlsxMDQsIDEwNSwgMTA2LCAyNTUsIDEwMSwgMTAyLCAxMDMsIDI1NSwgMTEwLCAxMTEsIDExMiwgMjU1LCAxMDcsXG4gICAgICAgICAgICAgIDEwOCwgMTA5LCAyNTVdLFxuICAgICAgICBdLFxuICAgICAgICBhd2FpdCBmbGlwcGVkLmRhdGEoKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmxpcCAoZnJvbSBpbWFnZSknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmxpcHBlZFBpeGVscyA9XG4gICAgICAgIHRmLmltYWdlLmZsaXBMZWZ0UmlnaHQoZ2V0VGVzdEltYWdlQXNUZW5zb3I0ZCgpKS50b0ludCgpO1xuICAgIGNvbnN0IGZsaXBwZWRQaXhlbHNEYXRhID0gYXdhaXQgZmxpcHBlZFBpeGVscy5kYXRhKCk7XG5cbiAgICBjb25zdCBleHBlY3RlZCA9IFtcbiAgICAgIDIzMCwgMTMzLCAxOCwgIDI1NSwgMjQxLCAxNTMsIDQzLCAgMjU1LCAyMjQsIDE1NiwgNTUsICAyNTUsIDIxMiwgMTU3LCA3NSxcbiAgICAgIDI1NSwgMjAwLCAxNTUsIDk4LCAgMjU1LCAxODMsIDEzOCwgMTA5LCAyNTUsIDE3MSwgMTIwLCAxMTcsIDI1NSwgMTU2LCAxMDAsXG4gICAgICAxMTEsIDI1NSwgMjMzLCAxNDgsIDMxLCAgMjU1LCAyNTAsIDE3NywgNjQsICAyNTUsIDI0MSwgMTg4LCA4MiwgIDI1NSwgMjMwLFxuICAgICAgMTkzLCAxMDQsIDI1NSwgMjIwLCAxOTAsIDEyOCwgMjU1LCAyMDIsIDE3NCwgMTM3LCAyNTUsIDE4NiwgMTUyLCAxNDAsIDI1NSxcbiAgICAgIDE2OCwgMTI5LCAxMzAsIDI1NSwgMjIyLCAxNjQsIDQxLCAgMjU1LCAyNDcsIDIwMSwgODEsICAyNTUsIDI0MywgMjIwLCAxMDYsXG4gICAgICAyNTUsIDIzNSwgMjI3LCAxMjgsIDI1NSwgMjI1LCAyMjgsIDE1MSwgMjU1LCAyMTEsIDIxNiwgMTYyLCAyNTUsIDE5OSwgMTk4LFxuICAgICAgMTY4LCAyNTUsIDE3OSwgMTc2LCAxNTksIDI1NSwgMTkxLCAxNzAsIDYxLCAgMjU1LCAyMTgsIDIxMCwgMTAzLCAyNTUsIDIxMyxcbiAgICAgIDIzMCwgMTI2LCAyNTUsIDIwMSwgMjM2LCAxNDIsIDI1NSwgMTkxLCAyMzksIDE2NSwgMjU1LCAxODQsIDIzNCwgMTgxLCAyNTUsXG4gICAgICAxNzksIDIyNiwgMTk0LCAyNTUsIDE2MywgMjA4LCAxODcsIDI1NSwgMTM1LCAxNjYsIDg2LCAgMjU1LCAxNjIsIDIwNiwgMTI3LFxuICAgICAgMjU1LCAxNTUsIDIyNiwgMTQ2LCAyNTUsIDE0MSwgMjMyLCAxNjIsIDI1NSwgMTMwLCAyMzUsIDE3OSwgMjU1LCAxMjEsIDIzMSxcbiAgICAgIDE5MiwgMjU1LCAxMTksIDIyNiwgMjA2LCAyNTUsIDEwOCwgMjE0LCAyMDIsIDI1NSwgNzEsICAxNDMsIDk3LCAgMjU1LCA5OCxcbiAgICAgIDE4MSwgMTM1LCAyNTUsIDk0LCAgMjA2LCAxNTYsIDI1NSwgODcsICAyMjAsIDE3NSwgMjU1LCA3NiwgIDIyNSwgMTkzLCAyNTUsXG4gICAgICA2NCwgIDIxOSwgMjAxLCAyNTUsIDYyLCAgMjE3LCAyMTMsIDI1NSwgNTUsICAyMDcsIDIxMiwgMjU1LCAxNSwgIDExNSwgMTA1LFxuICAgICAgMjU1LCAzOSwgIDE1MCwgMTQxLCAyNTUsIDM3LCAgMTc3LCAxNjQsIDI1NSwgMzUsICAyMDAsIDE4NiwgMjU1LCAzMCwgIDIwOSxcbiAgICAgIDIwNSwgMjU1LCAxOSwgIDIwMywgMjExLCAyNTUsIDE5LCAgMjA0LCAyMjIsIDI1NSwgMTgsICAyMDAsIDIyNCwgMjU1LCAwLFxuICAgICAgMTAyLCAxMTMsIDI1NSwgNiwgICAxMzMsIDE0MCwgMjU1LCAzLCAgIDE1OCwgMTYyLCAyNTUsIDQsICAgMTgyLCAxODYsIDI1NSxcbiAgICAgIDAsICAgMTk0LCAyMDQsIDI1NSwgMCwgICAxODksIDIwOSwgMjU1LCAwLCAgIDE5MiwgMjIxLCAyNTUsIDAsICAgMTkzLCAyMjgsXG4gICAgICAyNTVcbiAgICBdO1xuXG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoZXhwZWN0ZWQsIGZsaXBwZWRQaXhlbHNEYXRhKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyB3aGVuIGlucHV0IGlzIGludDMyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGltYWdlOiB0Zi5UZW5zb3I0RCA9IHRmLnRlbnNvcihcbiAgICAgICAgW1tbWzEsIDIsIDMsIDI1NV1dLCBbWzcsIDgsIDksIDI1NV1dXV0sIFsxLCAyLCAxLCA0XSwgJ2ludDMyJyk7XG4gICAgZXhwZWN0KCgpID0+IHRmLmltYWdlLmZsaXBMZWZ0UmlnaHQoaW1hZ2UpKVxuICAgICAgICAudG9UaHJvd0Vycm9yKFxuICAgICAgICAgICAgL0FyZ3VtZW50ICdpbWFnZScgcGFzc2VkIHRvICdmbGlwTGVmdFJpZ2h0JyBtdXN0IGJlIGZsb2F0MzIvKTtcbiAgfSk7XG59KTtcbiJdfQ== |
\ | No newline at end of file |