@rljson/io 0.0.34 → 0.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,47 @@
1
1
  {
2
- "_hash": "oaiqP8PNizeUP47zdXDXRe",
2
+ "_hash": "O6ctI717FuhDeecsczUYLn",
3
3
  "tableCfgs": {
4
4
  "_data": [
5
+ {
6
+ "key": "revisions",
7
+ "type": "ingredients",
8
+ "isHead": true,
9
+ "isRoot": true,
10
+ "isShared": false,
11
+ "columns": [
12
+ {
13
+ "key": "_hash",
14
+ "type": "string",
15
+ "_hash": "df4oYftB-71Njv9FprRCeg"
16
+ },
17
+ {
18
+ "key": "table",
19
+ "type": "string",
20
+ "_hash": "FmsYjsit04XJi02Sihdwl-"
21
+ },
22
+ {
23
+ "key": "predecessor",
24
+ "type": "string",
25
+ "_hash": "RlAk7Lj-lZf2KDlUk5fekZ"
26
+ },
27
+ {
28
+ "key": "successor",
29
+ "type": "string",
30
+ "_hash": "MJlFtQVty5oUJKVzzj5hyB"
31
+ },
32
+ {
33
+ "key": "timestamp",
34
+ "type": "number",
35
+ "_hash": "XpKYGh23thW6vONgQuoMHf"
36
+ },
37
+ {
38
+ "key": "id",
39
+ "type": "string",
40
+ "_hash": "eq2P3RIaSgy81i7PomNUvn"
41
+ }
42
+ ],
43
+ "_hash": "CubBZQUGTMLa5wMqqzHLXz"
44
+ },
5
45
  {
6
46
  "_hash": "oS4O57K1hbZY9hQzRID9nO",
7
47
  "key": "tableCfgs",
@@ -52,50 +92,10 @@
52
92
  "_hash": "aPmGTcNng9E1RvlEj1LtxB"
53
93
  }
54
94
  ]
55
- },
56
- {
57
- "key": "revisions",
58
- "type": "ingredients",
59
- "isHead": true,
60
- "isRoot": true,
61
- "isShared": false,
62
- "columns": [
63
- {
64
- "key": "_hash",
65
- "type": "string",
66
- "_hash": "df4oYftB-71Njv9FprRCeg"
67
- },
68
- {
69
- "key": "table",
70
- "type": "string",
71
- "_hash": "FmsYjsit04XJi02Sihdwl-"
72
- },
73
- {
74
- "key": "predecessor",
75
- "type": "string",
76
- "_hash": "RlAk7Lj-lZf2KDlUk5fekZ"
77
- },
78
- {
79
- "key": "successor",
80
- "type": "string",
81
- "_hash": "MJlFtQVty5oUJKVzzj5hyB"
82
- },
83
- {
84
- "key": "timestamp",
85
- "type": "number",
86
- "_hash": "XpKYGh23thW6vONgQuoMHf"
87
- },
88
- {
89
- "key": "id",
90
- "type": "string",
91
- "_hash": "eq2P3RIaSgy81i7PomNUvn"
92
- }
93
- ],
94
- "_hash": "CubBZQUGTMLa5wMqqzHLXz"
95
95
  }
96
96
  ],
97
97
  "_tableCfg": "oS4O57K1hbZY9hQzRID9nO",
98
- "_hash": "Yd82KsMDBGtpbGxISEZQ-n"
98
+ "_hash": "Rq-oDdFCeBCeW3HTiFMhhN"
99
99
  },
100
100
  "revisions": {
101
101
  "_data": [],
@@ -1,58 +1,7 @@
1
1
  {
2
- "_hash": "Q2Vn-Ek8tdD_hFzDUe8Dql",
2
+ "_hash": "YqwSqooi7GRv1Fnl7zWaV9",
3
3
  "tableCfgs": {
4
4
  "_data": [
5
- {
6
- "_hash": "oS4O57K1hbZY9hQzRID9nO",
7
- "key": "tableCfgs",
8
- "type": "ingredients",
9
- "isHead": false,
10
- "isRoot": false,
11
- "isShared": true,
12
- "previous": "",
13
- "columns": [
14
- {
15
- "key": "_hash",
16
- "type": "string",
17
- "_hash": "df4oYftB-71Njv9FprRCeg"
18
- },
19
- {
20
- "key": "key",
21
- "type": "string",
22
- "_hash": "tapEY-QdaJwWhz1PPZoG35"
23
- },
24
- {
25
- "key": "type",
26
- "type": "string",
27
- "_hash": "zE7ALsNzu5JPgDD4AxeRCh"
28
- },
29
- {
30
- "key": "isHead",
31
- "type": "boolean",
32
- "_hash": "ar8Hajt2UZDn-F21QLMyC_"
33
- },
34
- {
35
- "key": "isRoot",
36
- "type": "boolean",
37
- "_hash": "hedsCm_HtiiTuzJyTeMqhm"
38
- },
39
- {
40
- "key": "isShared",
41
- "type": "boolean",
42
- "_hash": "pxXOf3-3qCo9Z3FzC9JXSH"
43
- },
44
- {
45
- "key": "previous",
46
- "type": "string",
47
- "_hash": "e0TEeDmSvJcLEMtrVxc0oW"
48
- },
49
- {
50
- "key": "columns",
51
- "type": "jsonArray",
52
- "_hash": "aPmGTcNng9E1RvlEj1LtxB"
53
- }
54
- ]
55
- },
56
5
  {
57
6
  "key": "revisions",
58
7
  "type": "ingredients",
@@ -94,7 +43,7 @@
94
43
  "_hash": "CubBZQUGTMLa5wMqqzHLXz"
95
44
  },
96
45
  {
97
- "key": "table1",
46
+ "key": "table2",
98
47
  "columns": [
99
48
  {
100
49
  "key": "_hash",
@@ -116,10 +65,10 @@
116
65
  "isHead": true,
117
66
  "isRoot": true,
118
67
  "isShared": false,
119
- "_hash": "LM5fm8eNChH3kE3D38X0Fa"
68
+ "_hash": "GGPEyV5H-4C3fZr_emK8iC"
120
69
  },
121
70
  {
122
- "key": "table2",
71
+ "key": "table1",
123
72
  "columns": [
124
73
  {
125
74
  "key": "_hash",
@@ -141,11 +90,62 @@
141
90
  "isHead": true,
142
91
  "isRoot": true,
143
92
  "isShared": false,
144
- "_hash": "GGPEyV5H-4C3fZr_emK8iC"
93
+ "_hash": "LM5fm8eNChH3kE3D38X0Fa"
94
+ },
95
+ {
96
+ "_hash": "oS4O57K1hbZY9hQzRID9nO",
97
+ "key": "tableCfgs",
98
+ "type": "ingredients",
99
+ "isHead": false,
100
+ "isRoot": false,
101
+ "isShared": true,
102
+ "previous": "",
103
+ "columns": [
104
+ {
105
+ "key": "_hash",
106
+ "type": "string",
107
+ "_hash": "df4oYftB-71Njv9FprRCeg"
108
+ },
109
+ {
110
+ "key": "key",
111
+ "type": "string",
112
+ "_hash": "tapEY-QdaJwWhz1PPZoG35"
113
+ },
114
+ {
115
+ "key": "type",
116
+ "type": "string",
117
+ "_hash": "zE7ALsNzu5JPgDD4AxeRCh"
118
+ },
119
+ {
120
+ "key": "isHead",
121
+ "type": "boolean",
122
+ "_hash": "ar8Hajt2UZDn-F21QLMyC_"
123
+ },
124
+ {
125
+ "key": "isRoot",
126
+ "type": "boolean",
127
+ "_hash": "hedsCm_HtiiTuzJyTeMqhm"
128
+ },
129
+ {
130
+ "key": "isShared",
131
+ "type": "boolean",
132
+ "_hash": "pxXOf3-3qCo9Z3FzC9JXSH"
133
+ },
134
+ {
135
+ "key": "previous",
136
+ "type": "string",
137
+ "_hash": "e0TEeDmSvJcLEMtrVxc0oW"
138
+ },
139
+ {
140
+ "key": "columns",
141
+ "type": "jsonArray",
142
+ "_hash": "aPmGTcNng9E1RvlEj1LtxB"
143
+ }
144
+ ]
145
145
  }
146
146
  ],
147
147
  "_tableCfg": "oS4O57K1hbZY9hQzRID9nO",
148
- "_hash": "vdQgUbSErXgVaD6cFsPoSk"
148
+ "_hash": "hiWhWYx-PreD9EvDuG64rT"
149
149
  },
150
150
  "revisions": {
151
151
  "_data": [],
@@ -0,0 +1,123 @@
1
+ [
2
+ {
3
+ "key": "revisions",
4
+ "type": "ingredients",
5
+ "isHead": true,
6
+ "isRoot": true,
7
+ "isShared": false,
8
+ "columns": [
9
+ {
10
+ "key": "_hash",
11
+ "type": "string",
12
+ "_hash": "df4oYftB-71Njv9FprRCeg"
13
+ },
14
+ {
15
+ "key": "table",
16
+ "type": "string",
17
+ "_hash": "FmsYjsit04XJi02Sihdwl-"
18
+ },
19
+ {
20
+ "key": "predecessor",
21
+ "type": "string",
22
+ "_hash": "RlAk7Lj-lZf2KDlUk5fekZ"
23
+ },
24
+ {
25
+ "key": "successor",
26
+ "type": "string",
27
+ "_hash": "MJlFtQVty5oUJKVzzj5hyB"
28
+ },
29
+ {
30
+ "key": "timestamp",
31
+ "type": "number",
32
+ "_hash": "XpKYGh23thW6vONgQuoMHf"
33
+ },
34
+ {
35
+ "key": "id",
36
+ "type": "string",
37
+ "_hash": "eq2P3RIaSgy81i7PomNUvn"
38
+ }
39
+ ],
40
+ "_hash": "CubBZQUGTMLa5wMqqzHLXz"
41
+ },
42
+ {
43
+ "key": "table0",
44
+ "type": "ingredients",
45
+ "isHead": false,
46
+ "isRoot": false,
47
+ "isShared": true,
48
+ "columns": [
49
+ {
50
+ "key": "_hash",
51
+ "type": "string",
52
+ "_hash": "df4oYftB-71Njv9FprRCeg"
53
+ },
54
+ {
55
+ "key": "col0",
56
+ "type": "string",
57
+ "_hash": "LyqWPAOnRnSAofi4I1aMIv"
58
+ },
59
+ {
60
+ "key": "col1",
61
+ "type": "string",
62
+ "_hash": "aD2OJziZ76JeLyPuV4ioKe"
63
+ },
64
+ {
65
+ "key": "col2",
66
+ "type": "string",
67
+ "_hash": "yd4AdprM2Z0vqKieWOibX5"
68
+ }
69
+ ],
70
+ "_hash": "SmI9Z47zQXdHKsZYDCLRVN"
71
+ },
72
+ {
73
+ "_hash": "oS4O57K1hbZY9hQzRID9nO",
74
+ "key": "tableCfgs",
75
+ "type": "ingredients",
76
+ "isHead": false,
77
+ "isRoot": false,
78
+ "isShared": true,
79
+ "previous": "",
80
+ "columns": [
81
+ {
82
+ "key": "_hash",
83
+ "type": "string",
84
+ "_hash": "df4oYftB-71Njv9FprRCeg"
85
+ },
86
+ {
87
+ "key": "key",
88
+ "type": "string",
89
+ "_hash": "tapEY-QdaJwWhz1PPZoG35"
90
+ },
91
+ {
92
+ "key": "type",
93
+ "type": "string",
94
+ "_hash": "zE7ALsNzu5JPgDD4AxeRCh"
95
+ },
96
+ {
97
+ "key": "isHead",
98
+ "type": "boolean",
99
+ "_hash": "ar8Hajt2UZDn-F21QLMyC_"
100
+ },
101
+ {
102
+ "key": "isRoot",
103
+ "type": "boolean",
104
+ "_hash": "hedsCm_HtiiTuzJyTeMqhm"
105
+ },
106
+ {
107
+ "key": "isShared",
108
+ "type": "boolean",
109
+ "_hash": "pxXOf3-3qCo9Z3FzC9JXSH"
110
+ },
111
+ {
112
+ "key": "previous",
113
+ "type": "string",
114
+ "_hash": "e0TEeDmSvJcLEMtrVxc0oW"
115
+ },
116
+ {
117
+ "key": "columns",
118
+ "type": "jsonArray",
119
+ "_hash": "aPmGTcNng9E1RvlEj1LtxB"
120
+ }
121
+ ]
122
+ }
123
+ ]
@@ -1,6 +1,46 @@
1
1
  {
2
2
  "tableCfgs": {
3
3
  "_data": [
4
+ {
5
+ "key": "revisions",
6
+ "type": "ingredients",
7
+ "isHead": true,
8
+ "isRoot": true,
9
+ "isShared": false,
10
+ "columns": [
11
+ {
12
+ "key": "_hash",
13
+ "type": "string",
14
+ "_hash": "df4oYftB-71Njv9FprRCeg"
15
+ },
16
+ {
17
+ "key": "table",
18
+ "type": "string",
19
+ "_hash": "FmsYjsit04XJi02Sihdwl-"
20
+ },
21
+ {
22
+ "key": "predecessor",
23
+ "type": "string",
24
+ "_hash": "RlAk7Lj-lZf2KDlUk5fekZ"
25
+ },
26
+ {
27
+ "key": "successor",
28
+ "type": "string",
29
+ "_hash": "MJlFtQVty5oUJKVzzj5hyB"
30
+ },
31
+ {
32
+ "key": "timestamp",
33
+ "type": "number",
34
+ "_hash": "XpKYGh23thW6vONgQuoMHf"
35
+ },
36
+ {
37
+ "key": "id",
38
+ "type": "string",
39
+ "_hash": "eq2P3RIaSgy81i7PomNUvn"
40
+ }
41
+ ],
42
+ "_hash": "CubBZQUGTMLa5wMqqzHLXz"
43
+ },
4
44
  {
5
45
  "_hash": "oS4O57K1hbZY9hQzRID9nO",
6
46
  "key": "tableCfgs",
@@ -51,49 +91,9 @@
51
91
  "_hash": "aPmGTcNng9E1RvlEj1LtxB"
52
92
  }
53
93
  ]
54
- },
55
- {
56
- "key": "revisions",
57
- "type": "ingredients",
58
- "isHead": true,
59
- "isRoot": true,
60
- "isShared": false,
61
- "columns": [
62
- {
63
- "key": "_hash",
64
- "type": "string",
65
- "_hash": "df4oYftB-71Njv9FprRCeg"
66
- },
67
- {
68
- "key": "table",
69
- "type": "string",
70
- "_hash": "FmsYjsit04XJi02Sihdwl-"
71
- },
72
- {
73
- "key": "predecessor",
74
- "type": "string",
75
- "_hash": "RlAk7Lj-lZf2KDlUk5fekZ"
76
- },
77
- {
78
- "key": "successor",
79
- "type": "string",
80
- "_hash": "MJlFtQVty5oUJKVzzj5hyB"
81
- },
82
- {
83
- "key": "timestamp",
84
- "type": "number",
85
- "_hash": "XpKYGh23thW6vONgQuoMHf"
86
- },
87
- {
88
- "key": "id",
89
- "type": "string",
90
- "_hash": "eq2P3RIaSgy81i7PomNUvn"
91
- }
92
- ],
93
- "_hash": "CubBZQUGTMLa5wMqqzHLXz"
94
94
  }
95
95
  ],
96
96
  "_tableCfg": "oS4O57K1hbZY9hQzRID9nO",
97
- "_hash": "Yd82KsMDBGtpbGxISEZQ-n"
97
+ "_hash": "Rq-oDdFCeBCeW3HTiFMhhN"
98
98
  }
99
99
  }
@@ -19,7 +19,6 @@ import { hip, hsh, rmhsh } from '@rljson/hash';
19
19
  import {
20
20
  addColumnsToTableCfg,
21
21
  exampleTableCfg,
22
- IngredientsTable,
23
22
  Rljson,
24
23
  TableCfg,
25
24
  TableType,
@@ -62,6 +61,22 @@ export const runIoConformanceTests = () => {
62
61
  });
63
62
  });
64
63
 
64
+ describe('isOpen()', () => {
65
+ it('should return false before init, true after and false after close', async () => {
66
+ const setup = testSetup();
67
+ await setup.init();
68
+
69
+ const io = setup.io;
70
+ expect(io.isOpen).toBe(false);
71
+
72
+ await io.init();
73
+ expect(io.isOpen).toBe(true);
74
+
75
+ await io.close();
76
+ expect(io.isOpen).toBe(false);
77
+ });
78
+ });
79
+
65
80
  const createExampleTable = async (key: string) => {
66
81
  // Register a new table config and generate the table
67
82
  const tableCfg: TableCfg = exampleTableCfg({ key });
@@ -107,13 +122,11 @@ export const runIoConformanceTests = () => {
107
122
  await io.createOrExtendTable({ tableCfg: tableV2 });
108
123
 
109
124
  // Check the tableCfgs
110
- const actualTableCfgs = (await io.tableCfgs()).tableCfgs
111
- ._data as unknown as TableCfg[];
125
+ const actualTableCfgs = await ioTools.tableCfgs();
112
126
 
113
- expect(actualTableCfgs.length).toBe(3);
114
- expect((actualTableCfgs[0] as TableCfg).key).toBe('tableCfgs');
115
- expect((actualTableCfgs[1] as TableCfg).key).toBe('revisions');
116
- expect((actualTableCfgs[2] as TableCfg).key).toBe('table0');
127
+ await expectGolden('io-conformance/tableCfgs-1.json', ego).toBe(
128
+ actualTableCfgs,
129
+ );
117
130
  });
118
131
  });
119
132
 
@@ -243,10 +256,8 @@ export const runIoConformanceTests = () => {
243
256
 
244
257
  it('should add a table and a table config', async () => {
245
258
  const tablesFromConfig = async () => {
246
- const tables = (await io.tableCfgs())
247
- .tableCfgs as IngredientsTable<TableCfg>;
248
-
249
- return tables._data.map((e) => e.key);
259
+ const tables = await ioTools.tableCfgs();
260
+ return tables.map((e) => e.key);
250
261
  };
251
262
 
252
263
  const physicalTables = async () => await ioTools.allTableKeys();
@@ -255,33 +266,33 @@ export const runIoConformanceTests = () => {
255
266
  await createExampleTable('table1');
256
267
 
257
268
  expect(await tablesFromConfig()).toEqual([
258
- 'tableCfgs',
259
269
  'revisions',
260
270
  'table',
261
271
  'table1',
272
+ 'tableCfgs',
262
273
  ]);
263
274
  expect(await physicalTables()).toEqual([
264
- 'tableCfgs',
265
275
  'revisions',
266
276
  'table',
267
277
  'table1',
278
+ 'tableCfgs',
268
279
  ]);
269
280
 
270
281
  // Create a second table
271
282
  await createExampleTable('table2');
272
283
  expect(await tablesFromConfig()).toEqual([
273
- 'tableCfgs',
274
284
  'revisions',
275
285
  'table',
276
286
  'table1',
277
287
  'table2',
288
+ 'tableCfgs',
278
289
  ]);
279
290
  expect(await physicalTables()).toEqual([
280
- 'tableCfgs',
281
291
  'revisions',
282
292
  'table',
283
293
  'table1',
284
294
  'table2',
295
+ 'tableCfgs',
285
296
  ]);
286
297
  });
287
298
 
@@ -508,7 +519,7 @@ export const runIoConformanceTests = () => {
508
519
  expect(rowCountAfterFirstWrite).toEqual(2);
509
520
 
510
521
  // Write the same item again
511
- expect(io.write({ data: testData }));
522
+ await io.write({ data: testData });
512
523
 
513
524
  // Nothing changes because the data is the same
514
525
  const rowCountAfterSecondWrite = await io.rowCount(tableName);
@@ -648,16 +659,16 @@ export const runIoConformanceTests = () => {
648
659
  {
649
660
  array: [1, 2, { a: 10 }],
650
661
  boolean: true,
651
- number: 5,
652
- object: { a: 1, b: { c: 3 } },
653
- string: 'hello',
662
+ number: 6,
663
+ object: { a: 1, b: 2 },
664
+ string: 'world',
654
665
  },
655
666
  {
656
667
  array: [1, 2, { a: 10 }],
657
668
  boolean: true,
658
- number: 6,
659
- object: { a: 1, b: 2 },
660
- string: 'world',
669
+ number: 5,
670
+ object: { a: 1, b: { c: 3 } },
671
+ string: 'hello',
661
672
  },
662
673
  ],
663
674
  },
@@ -678,16 +689,16 @@ export const runIoConformanceTests = () => {
678
689
  {
679
690
  array: [1, 2, { a: 10 }],
680
691
  boolean: true,
681
- number: 5,
682
- object: { a: 1, b: { c: 3 } },
683
- string: 'hello',
692
+ number: 6,
693
+ object: { a: 1, b: 2 },
694
+ string: 'world',
684
695
  },
685
696
  {
686
697
  array: [1, 2, { a: 10 }],
687
698
  boolean: true,
688
- number: 6,
689
- object: { a: 1, b: 2 },
690
- string: 'world',
699
+ number: 5,
700
+ object: { a: 1, b: { c: 3 } },
701
+ string: 'hello',
691
702
  },
692
703
  ],
693
704
  },
@@ -711,16 +722,16 @@ export const runIoConformanceTests = () => {
711
722
  {
712
723
  array: [1, 2, { a: 10 }],
713
724
  boolean: true,
714
- number: 5,
715
- object: { a: 1, b: { c: 3 } },
716
- string: 'hello',
725
+ number: 6,
726
+ object: { a: 1, b: 2 },
727
+ string: 'world',
717
728
  },
718
729
  {
719
730
  array: [1, 2, { a: 10 }],
720
731
  boolean: true,
721
- number: 6,
722
- object: { a: 1, b: 2 },
723
- string: 'world',
732
+ number: 5,
733
+ object: { a: 1, b: { c: 3 } },
734
+ string: 'hello',
724
735
  },
725
736
  ],
726
737
  },
package/dist/io-mem.d.ts CHANGED
@@ -5,9 +5,9 @@ import { Io } from './io.ts';
5
5
  * In-Memory implementation of the Rljson Io interface.
6
6
  */
7
7
  export declare class IoMem implements Io {
8
- constructor();
9
8
  init(): Promise<void>;
10
9
  close(): Promise<void>;
10
+ get isOpen(): boolean;
11
11
  static example: () => Promise<IoMem>;
12
12
  isReady(): Promise<void>;
13
13
  dump(): Promise<Rljson>;
@@ -28,9 +28,9 @@ export declare class IoMem implements Io {
28
28
  createOrExtendTable(request: {
29
29
  tableCfg: TableCfg;
30
30
  }): Promise<void>;
31
- tableCfgs(): Promise<Rljson>;
32
31
  private _ioTools;
33
32
  private _isReady;
33
+ private _isOpen;
34
34
  private _mem;
35
35
  private _init;
36
36
  private _initTableCfgs;
@@ -1,4 +1,4 @@
1
- import { Rljson, TableCfg, TableKey } from '@rljson/rljson';
1
+ import { Rljson, TableCfg, TableKey, TableType } from '@rljson/rljson';
2
2
  import { Io } from './io.ts';
3
3
  /**
4
4
  * Provides utility functions for the Io interface.
@@ -32,6 +32,11 @@ export declare class IoTools {
32
32
  * @param rljson - The Rljson object to check
33
33
  */
34
34
  throwWhenTablesDoNotExist(rljson: Rljson): Promise<void>;
35
+ /**
36
+ * Returns the current table cfgs of all tables
37
+ * @returns The table configuration of all tables
38
+ */
39
+ tableCfgs(): Promise<TableCfg[]>;
35
40
  /**
36
41
  * Returns a list with all table names
37
42
  */
@@ -64,4 +69,8 @@ export declare class IoTools {
64
69
  * Throws if the data in the table do not match the table configuration
65
70
  */
66
71
  throwWhenTableDataDoesNotMatchCfg(data: Rljson): Promise<void>;
72
+ /**
73
+ * Sorts the data of a table by the hash and updates the table hash in place
74
+ */
75
+ sortTableDataAndUpdateHash(table: TableType): void;
67
76
  }
package/dist/io.d.ts CHANGED
@@ -5,6 +5,8 @@ export interface Io {
5
5
  init(): Promise<void>;
6
6
  /** Closes the io */
7
7
  close(): Promise<void>;
8
+ /** Returns true if io is opened */
9
+ isOpen: boolean;
8
10
  /** A promise resolving once the Io interface is ready
9
11
  *
10
12
  * 💡 Use @rljson/is-ready
@@ -30,10 +32,6 @@ export interface Io {
30
32
  createOrExtendTable(request: {
31
33
  tableCfg: TableCfg;
32
34
  }): Promise<void>;
33
- /**
34
- * Returns a json structure returning current table configurations
35
- */
36
- tableCfgs(): Promise<Rljson>;
37
35
  /** Writes Rljson data into the database */
38
36
  write(request: {
39
37
  data: Rljson;
package/dist/io.js CHANGED
@@ -88,13 +88,37 @@ const _IoTools = class _IoTools {
88
88
  );
89
89
  }
90
90
  }
91
+ /**
92
+ * Returns the current table cfgs of all tables
93
+ * @returns The table configuration of all tables
94
+ */
95
+ async tableCfgs() {
96
+ const tableCfgDump = await this.io.dumpTable({ table: "tableCfgs" });
97
+ const tables = tableCfgDump.tableCfgs._data;
98
+ const newestVersion = {};
99
+ for (let i = tables.length - 1; i >= 0; i--) {
100
+ const table = tables[i];
101
+ const existing = newestVersion[table.key];
102
+ if (!existing || existing.columns.length < table.columns.length) {
103
+ newestVersion[table.key] = table;
104
+ }
105
+ }
106
+ const resultData = Object.values(newestVersion).sort((a, b) => {
107
+ if (a.key < b.key) {
108
+ return -1;
109
+ }
110
+ if (a.key > b.key) {
111
+ return 1;
112
+ }
113
+ return 0;
114
+ });
115
+ return resultData;
116
+ }
91
117
  /**
92
118
  * Returns a list with all table names
93
119
  */
94
120
  async allTableKeys() {
95
- const result = (await this.io.tableCfgs()).tableCfgs._data.map(
96
- (e) => e.key
97
- );
121
+ const result = (await this.tableCfgs()).map((e) => e.key);
98
122
  return result;
99
123
  }
100
124
  /**
@@ -112,8 +136,8 @@ const _IoTools = class _IoTools {
112
136
 
113
137
  */
114
138
  async tableCfgOrNull(table) {
115
- const tableCfgs = await this.io.tableCfgs();
116
- const tableCfg = tableCfgs.tableCfgs._data.find((e) => e.key === table);
139
+ const tableCfgs = await this.tableCfgs();
140
+ const tableCfg = tableCfgs.find((e) => e.key === table);
117
141
  return tableCfg ?? null;
118
142
  }
119
143
  /**
@@ -203,6 +227,27 @@ ${errors.map((e) => `- ${e}`).join("\n")}`
203
227
  );
204
228
  }
205
229
  }
230
+ /**
231
+ * Sorts the data of a table by the hash and updates the table hash in place
232
+ */
233
+ sortTableDataAndUpdateHash(table) {
234
+ table._data.sort((a, b) => {
235
+ const hashA = a._hash;
236
+ const hashB = b._hash;
237
+ if (hashA < hashB) {
238
+ return -1;
239
+ }
240
+ if (hashA > hashB) {
241
+ return 1;
242
+ }
243
+ return 0;
244
+ });
245
+ table._hash = "";
246
+ hip(table, {
247
+ updateExistingHashes: false,
248
+ throwOnWrongHashes: false
249
+ });
250
+ }
206
251
  };
207
252
  /**
208
253
  * Example object for test purposes
@@ -217,14 +262,13 @@ __publicField(_IoTools, "example", async () => {
217
262
  let IoTools = _IoTools;
218
263
  // @license
219
264
  const _IoMem = class _IoMem {
220
- // ...........................................................................
221
- // Constructor & example
222
265
  constructor() {
223
266
  // ######################
224
267
  // Private
225
268
  // ######################
226
269
  __publicField(this, "_ioTools");
227
270
  __publicField(this, "_isReady", new IsReady());
271
+ __publicField(this, "_isOpen", false);
228
272
  __publicField(this, "_mem", hip({}));
229
273
  // ...........................................................................
230
274
  __publicField(this, "_initTableCfgs", () => {
@@ -235,12 +279,19 @@ const _IoMem = class _IoMem {
235
279
  });
236
280
  });
237
281
  }
282
+ // ...........................................................................
283
+ // Constructor & example
238
284
  init() {
285
+ this._isOpen = true;
239
286
  return this._init();
240
287
  }
241
288
  close() {
289
+ this._isOpen = false;
242
290
  return Promise.resolve();
243
291
  }
292
+ get isOpen() {
293
+ return this._isOpen;
294
+ }
244
295
  // ...........................................................................
245
296
  // General
246
297
  isReady() {
@@ -280,23 +331,6 @@ const _IoMem = class _IoMem {
280
331
  createOrExtendTable(request) {
281
332
  return this._createOrExtendTable(request);
282
333
  }
283
- async tableCfgs() {
284
- const tables = this._mem.tableCfgs._data;
285
- const newestVersion = {};
286
- for (let i = tables.length - 1; i >= 0; i--) {
287
- const table = tables[i];
288
- const existing = newestVersion[table.key];
289
- if (!existing) {
290
- newestVersion[table.key] = table;
291
- }
292
- }
293
- const resultData = Object.values(newestVersion).reverse();
294
- return hip({
295
- tableCfgs: {
296
- _data: resultData
297
- }
298
- });
299
- }
300
334
  // ...........................................................................
301
335
  async _init() {
302
336
  this._ioTools = new IoTools(this);
@@ -337,7 +371,7 @@ const _IoMem = class _IoMem {
337
371
  var _a;
338
372
  newConfig = hsh(newConfig);
339
373
  this._mem.tableCfgs._data.push(newConfig);
340
- this._updateTableHash("tableCfgs");
374
+ this._ioTools.sortTableDataAndUpdateHash(this._mem.tableCfgs);
341
375
  const table = {
342
376
  _data: [],
343
377
  _tableCfg: newConfig._hash
@@ -353,9 +387,9 @@ const _IoMem = class _IoMem {
353
387
  }
354
388
  newConfig = hsh(newConfig);
355
389
  this._mem.tableCfgs._data.push(newConfig);
390
+ this._ioTools.sortTableDataAndUpdateHash(this._mem.tableCfgs);
356
391
  const table = this._mem[newConfig.key];
357
392
  table._tableCfg = newConfig._hash;
358
- this._updateTableHash("tableCfgs");
359
393
  this._updateTableHash(newConfig.key);
360
394
  this._updateGlobalHash();
361
395
  }
@@ -392,7 +426,7 @@ const _IoMem = class _IoMem {
392
426
  oldTable._data.push(item);
393
427
  }
394
428
  }
395
- this._updateTableHash(table);
429
+ this._ioTools.sortTableDataAndUpdateHash(oldTable);
396
430
  }
397
431
  this._updateGlobalHash();
398
432
  }
@@ -561,4 +595,4 @@ export {
561
595
  exampleIo,
562
596
  exampleTestSetup
563
597
  };
564
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8tdGVzdC1zZXR1cC50cyIsIi4uL3NyYy9pby50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICB0aHJvd09uSW52YWxpZFRhYmxlQ2ZnLFxuICB2YWxpZGF0ZVJsanNvbkFnYWluc3RUYWJsZUNmZyxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5pbXBvcnQgeyBJb01lbSB9IGZyb20gJy4vaW8tbWVtLnRzJztcbmltcG9ydCB7IElvIH0gZnJvbSAnLi9pby50cyc7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb1Rvb2xzIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBpbyBUaGUgSW8gaW50ZXJmYWNlIHRvIHVzZVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlvOiBJbykge31cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFibGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFibGVDZmdzIHRhYmxlLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZUNmZ3NUYWJsZUNmZygpIHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGhpcDxUYWJsZUNmZz4oe1xuICAgICAgX2hhc2g6ICcnLFxuICAgICAga2V5OiAndGFibGVDZmdzJyxcbiAgICAgIHR5cGU6ICdpbmdyZWRpZW50cycsXG4gICAgICBpc0hlYWQ6IGZhbHNlLFxuICAgICAgaXNSb290OiBmYWxzZSxcbiAgICAgIGlzU2hhcmVkOiB0cnVlLFxuICAgICAgcHJldmlvdXM6ICcnLFxuXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHsga2V5OiAnX2hhc2gnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ2tleScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnaXNIZWFkJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAnaXNSb290JywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAnaXNTaGFyZWQnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdwcmV2aW91cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnY29sdW1ucycsIHR5cGU6ICdqc29uQXJyYXknIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRhYmxlQ2ZnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSByZXZpc2lvbnMgdGFibGUuXG4gICAqL1xuICBpbml0UmV2aXNpb25zVGFibGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmc6IFRhYmxlQ2ZnID0ge1xuICAgICAga2V5OiAncmV2aXNpb25zJyxcbiAgICAgIHR5cGU6ICdpbmdyZWRpZW50cycsXG4gICAgICBpc0hlYWQ6IHRydWUsXG4gICAgICBpc1Jvb3Q6IHRydWUsXG4gICAgICBpc1NoYXJlZDogZmFsc2UsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBrZXk6ICdfaGFzaCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndGFibGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3ByZWRlY2Vzc29yJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdzdWNjZXNzb3InLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3RpbWVzdGFtcCcsIHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgIHsga2V5OiAnaWQnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5pby5jcmVhdGVPckV4dGVuZFRhYmxlKHsgdGFibGVDZmcgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEV4YW1wbGUgb2JqZWN0IGZvciB0ZXN0IHB1cnBvc2VzXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGlvIHRvb2xzXG4gICAqL1xuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpby5pbml0KCk7XG4gICAgYXdhaXQgaW8uaXNSZWFkeSgpO1xuICAgIHJldHVybiBuZXcgSW9Ub29scyhpbyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRG9lc05vdEV4aXN0KHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuaW8udGFibGVFeGlzdHModGFibGUpO1xuICAgIGlmICghZXhpc3RzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIGFueSBvZiB0aGUgdGFibGVzIGluIHJsanNvbiBkbyBub3QgZXhpc3RcbiAgICogQHBhcmFtIHJsanNvbiAtIFRoZSBSbGpzb24gb2JqZWN0IHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJsanNvbjogUmxqc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMocmxqc29uLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZUtleSk7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGVLZXl9XCIgbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdUYWJsZXMgPSAoZSBhcyBBcnJheTxhbnk+KS5tYXAoKGUpID0+IGUudGFibGVLZXkpO1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIHRhYmxlcyBkbyBub3QgZXhpc3Q6ICR7bWlzc2luZ1RhYmxlcy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCB3aXRoIGFsbCB0YWJsZSBuYW1lc1xuICAgKi9cbiAgYXN5bmMgYWxsVGFibGVLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgdGhpcy5pby50YWJsZUNmZ3MoKSkudGFibGVDZmdzLl9kYXRhLm1hcChcbiAgICAgIChlKSA9PiBlLmtleSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZyh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHRhYmxlKTtcbiAgICBpZiAoIXRhYmxlQ2ZnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGVDZmchO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZSBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZ09yTnVsbCh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnIHwgbnVsbD4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZncyA9IGF3YWl0IHRoaXMuaW8udGFibGVDZmdzKCk7XG4gICAgY29uc3QgdGFibGVDZmcgPSB0YWJsZUNmZ3MudGFibGVDZmdzLl9kYXRhLmZpbmQoKGUpID0+IGUua2V5ID09PSB0YWJsZSk7XG4gICAgcmV0dXJuIHRhYmxlQ2ZnID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNvbHVtbiBuYW1lcyBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyBhbGxDb2x1bW5LZXlzKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRhYmxlQ2ZnLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIHdoZW4gYSBjb2x1bW4gZG9lcyBub3QgZXhpc3QgaW4gYSBnaXZlbiB0YWJsZVxuICAgKiBAcGFyYW0gdGFibGUgLSBUaGUgdGFibGUgdG8gY2hlY2tcbiAgICogQHBhcmFtIGNvbHVtbnMgLSBUaGUgY29sdW1uIHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgdGFibGU6IFRhYmxlS2V5LFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbHVtbikgPT4gIWNvbHVtbktleXMuaW5jbHVkZXMoY29sdW1uKSxcbiAgICApO1xuICAgIGlmIChtaXNzaW5nQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIGNvbHVtbnMgZG8gbm90IGV4aXN0IGluIHRhYmxlIFwiJHt0YWJsZX1cIjogJHttaXNzaW5nQ29sdW1ucy5qb2luKFxuICAgICAgICAgICcsICcsXG4gICAgICAgICl9LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIHRhYmxlIHVwZGF0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRhYmxlXG4gICAqIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh1cGRhdGU6IFRhYmxlQ2ZnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ID0gYEludmFsaWQgdXBkYXRlIG9mIHRhYmxlIGFibGUgXCIke3VwZGF0ZS5rZXl9XCJgO1xuXG4gICAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyh1cGRhdGUpO1xuXG4gICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHVwZGF0ZS5rZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gSGF2ZSBjb2x1bW5zIGJlZW4gZGVsZXRlZD9cbiAgICAgIGlmIChleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA+IHVwZGF0ZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1uS2V5cyA9IGV4aXN0aW5nLmNvbHVtbnNcbiAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChrZXkpID0+ICF1cGRhdGUuY29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlbGV0ZWRDb2x1bW5LZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1ucyA9IGRlbGV0ZWRDb2x1bW5LZXlzLmpvaW4oJywgJyk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogQ29sdW1ucyBtdXN0IG5vdCBiZSBkZWxldGVkLiBgICtcbiAgICAgICAgICAgICAgYERlbGV0ZWQgY29sdW1uczogJHtkZWxldGVkQ29sdW1uc319YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIGtleXMgY2hhbmdlZD9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGlmIChiZWZvcmUgIT09IGFmdGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4ga2V5cyBtdXN0IG5vdCBjaGFuZ2UhIGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIFwiJHtiZWZvcmV9XCIgd2FzIHJlbmFtZWQgaW50byBcIiR7YWZ0ZXJ9XCIuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIHR5cGVzIGNoYW5nZWQ/XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGV4aXN0aW5nLmNvbHVtbnNbaV0udHlwZTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS50eXBlO1xuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIHR5cGVzIG11c3Qgbm90IGNoYW5nZSEgYCArXG4gICAgICAgICAgICAgIGBUeXBlIG9mIGNvbHVtbiBcIiR7Y29sdW1ufVwiIHdhcyBjaGFuZ2VkIGZyb20gXCIke2JlZm9yZX1cIiB0byAke2FmdGVyfS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIHRoZSBkYXRhIGluIHRoZSB0YWJsZSBkbyBub3QgbWF0Y2ggdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRGF0YURvZXNOb3RNYXRjaENmZyhkYXRhOiBSbGpzb24pIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBhd2FpdCBpdGVyYXRlVGFibGVzKGRhdGEsIGFzeW5jICh0YWJsZUtleSkgPT4ge1xuICAgICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlS2V5KTtcbiAgICAgIGNvbnN0IHRhYmxlID0gZGF0YVt0YWJsZUtleV07XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVJsanNvbkFnYWluc3RUYWJsZUNmZyh0YWJsZS5fZGF0YSwgdGFibGVDZmcpKTtcbiAgICB9KTtcblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGFibGUgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgY29uZmlndXJhdGlvbi5cXG5cXG5FcnJvcnM6XFxuJHtlcnJvcnNcbiAgICAgICAgICAubWFwKChlKSA9PiBgLSAke2V9YClcbiAgICAgICAgICAuam9pbignXFxuJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwLCBoc2ggfSBmcm9tICdAcmxqc29uL2hhc2gnO1xuaW1wb3J0IHsgSXNSZWFkeSB9IGZyb20gJ0BybGpzb24vaXMtcmVhZHknO1xuaW1wb3J0IHsgY29weSwgZXF1YWxzLCBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHtcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9Ub29scyB9IGZyb20gJy4vaW8tdG9vbHMudHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuLyoqXG4gKiBJbi1NZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJsanNvbiBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb01lbSBpbXBsZW1lbnRzIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIENvbnN0cnVjdG9yICYgZXhhbXBsZVxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgc3RhdGljIGV4YW1wbGUgPSBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBJb01lbSgpO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmFsXG4gIGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVhZHkucHJvbWlzZTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wKCk7XG4gIH1cblxuICBhc3luYyBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUm93c1xuXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZFJvd3MocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICBpZiAoIXRhYmxlRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlIG1hbmFnZW1lbnRcbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICByZXR1cm4gdGFibGUgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIGFzeW5jIHRhYmxlQ2ZncygpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIGNvbnN0IHRhYmxlcyA9IHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEgYXMgVGFibGVDZmdbXTtcblxuICAgIC8vIFRha2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggdHlwZSBrZXlcbiAgICBjb25zdCBuZXdlc3RWZXJzaW9uOiBSZWNvcmQ8VGFibGVLZXksIFRhYmxlQ2ZnPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSB0YWJsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzW2ldO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV07XG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgIG5ld2VzdFZlcnNpb25bdGFibGUua2V5XSA9IHRhYmxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdERhdGEgPSBPYmplY3QudmFsdWVzKG5ld2VzdFZlcnNpb24pLnJldmVyc2UoKTtcblxuICAgIHJldHVybiBoaXAoe1xuICAgICAgdGFibGVDZmdzOiB7XG4gICAgICAgIF9kYXRhOiByZXN1bHREYXRhLFxuICAgICAgfSxcbiAgICB9IGFzIFJsanNvbik7XG4gIH1cblxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gIC8vIFByaXZhdGVcbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gIHByaXZhdGUgX2lvVG9vbHMhOiBJb1Rvb2xzO1xuXG4gIHByaXZhdGUgX2lzUmVhZHkgPSBuZXcgSXNSZWFkeSgpO1xuXG4gIHByaXZhdGUgX21lbTogUmxqc29uID0gaGlwKHt9IGFzIFJsanNvbik7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5faW9Ub29scyA9IG5ldyBJb1Rvb2xzKHRoaXMpO1xuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy5pbml0UmV2aXNpb25zVGFibGUoKTtcbiAgICBoc2godGhpcy5fbWVtKTtcblxuICAgIHRoaXMuX2lzUmVhZHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2luaXRUYWJsZUNmZ3MgPSAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBJb1Rvb2xzLnRhYmxlQ2Znc1RhYmxlQ2ZnO1xuXG4gICAgdGhpcy5fbWVtLnRhYmxlQ2ZncyA9IGhpcCh7XG4gICAgICBfZGF0YTogW3RhYmxlQ2ZnXSxcbiAgICAgIF90YWJsZUNmZzogdGFibGVDZmcuX2hhc2ggYXMgc3RyaW5nLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVHbG9iYWxIYXNoKCkge1xuICAgICh0aGlzLl9tZW0gYXMgYW55KS5faGFzaCA9ICcnO1xuICAgIGhpcCh0aGlzLl9tZW0sIHtcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVUYWJsZUhhc2godGFibGVLZXk6IFRhYmxlS2V5KSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwgeyB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7XG4gICAgdGFibGVDZmc6IFRhYmxlQ2ZnO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGNvbmZpZyBpcyBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBhbiBwb3RlbnRpYWwgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZUNmZyA9IHJlcXVlc3QudGFibGVDZmc7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh0YWJsZUNmZyk7XG5cbiAgICBjb25zdCB7IGtleSB9ID0gdGFibGVDZmc7XG5cbiAgICAvLyBSZWNyZWF0ZSBoYXNoZXMgaW4gdGhlIGNhc2UgdGhlIGV4aXN0aW5nIGhhc2hlcyBhcmUgd3JvbmdcbiAgICBjb25zdCBuZXdDb25maWcgPSBoc2godGFibGVDZmcpO1xuXG4gICAgLy8gRmluZCBhbiBleGlzdGluZyB0YWJsZSBjb25maWcgd2l0aCB0aGUgc2FtZSBoYXNoXG4gICAgY29uc3QgZXhpc3RpbmdDb25maWcgPSBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRhYmxlQ2ZnT3JOdWxsKGtleSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGlmICghZXhpc3RpbmdDb25maWcpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWcsIG5ld0NvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZzogVGFibGVDZmcsIHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIC8vIFdyaXRlIHRoZSB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl91cGRhdGVUYWJsZUhhc2goJ3RhYmxlQ2ZncycpO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIHdyaXRlIGl0IGludG8gdGhlIGRhdGFiYXNlXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF9kYXRhOiBbXSxcbiAgICAgIF90YWJsZUNmZzogbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fbWVtW3RhYmxlS2V5XSA/Pz0gaGlwKHRhYmxlKTtcblxuICAgIC8vIFVwZGF0ZSBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVUYWJsZUhhc2godGFibGVLZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9leHRlbmRUYWJsZShleGlzdGluZ0NvbmZpZzogVGFibGVDZmcsIG5ld0NvbmZpZzogVGFibGVDZmcpIHtcbiAgICAvLyBObyBjb2x1bW5zIGFkZGVkPyBSZXR1cm4uXG4gICAgaWYgKGV4aXN0aW5nQ29uZmlnLmNvbHVtbnMubGVuZ3RoID09PSBuZXdDb25maWcuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IHRhYmxlIGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb25maWcgb2YgdGhlIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bbmV3Q29uZmlnLmtleV0gYXMgVGFibGVUeXBlO1xuICAgIHRhYmxlLl90YWJsZUNmZyA9IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZVRhYmxlSGFzaCgndGFibGVDZmdzJyk7XG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKG5ld0NvbmZpZy5rZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG4gIHByaXZhdGUgYXN5bmMgX2R1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9tZW0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2R1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICBbcmVxdWVzdC50YWJsZV06IGNvcHkodGFibGUpLFxuICAgIH07XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFkZGVkRGF0YSA9IGhzaChyZXF1ZXN0LmRhdGEpO1xuICAgIHRoaXMuX3JlbW92ZU51bGxWYWx1ZXMoYWRkZWREYXRhKTtcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3Qua2V5cyhhZGRlZERhdGEpO1xuICAgIGhzaChhZGRlZERhdGEpO1xuXG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJlcXVlc3QuZGF0YSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcocmVxdWVzdC5kYXRhKTtcblxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBpZiAodGFibGUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGRUYWJsZSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgICAgY29uc3QgbmV3VGFibGUgPSBhZGRlZERhdGFbdGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgICAgLy8gVGFibGUgZXhpc3RzLiBNZXJnZSBkYXRhXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3VGFibGUuX2RhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGl0ZW0uX2hhc2g7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG9sZFRhYmxlLl9kYXRhLmZpbmQoKGkpID0+IGkuX2hhc2ggPT09IGhhc2gpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIG9sZFRhYmxlLl9kYXRhLnB1c2goaXRlbSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3VwZGF0ZVRhYmxlSGFzaCh0YWJsZSk7XG4gICAgfVxuXG4gICAgLy8gUmVjYWxjIG1haW4gaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlR2xvYmFsSGFzaCgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX3JlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlblRhYmxlRG9lc05vdEV4aXN0KHJlcXVlc3QudGFibGUpO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuQ29sdW1uRG9lc05vdEV4aXN0KFxuICAgICAgcmVxdWVzdC50YWJsZSxcbiAgICAgIE9iamVjdC5rZXlzKHJlcXVlc3Qud2hlcmUpLFxuICAgICk7XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICBjb25zdCByZXN1bHQ6IFJsanNvbiA9IHtcbiAgICAgIFtyZXF1ZXN0LnRhYmxlXToge1xuICAgICAgICBfZGF0YTogdGFibGUuX2RhdGEuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBpbiByZXF1ZXN0LndoZXJlKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gcm93W2NvbHVtbl07XG4gICAgICAgICAgICBjb25zdCBiID0gcmVxdWVzdC53aGVyZVtjb2x1bW5dO1xuICAgICAgICAgICAgaWYgKGIgPT09IG51bGwgJiYgYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSBhcyBhbnk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgX3JlbW92ZU51bGxWYWx1ZXMocmxqc29uOiBSbGpzb24pIHtcbiAgICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sICh0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHJsanNvblt0YWJsZV0uX2RhdGE7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93KSB7XG4gICAgICAgICAgaWYgKHJvd1trZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgcm93W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBJbywgSW9NZW0gfSBmcm9tICcuL2luZGV4LnRzJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogSW8gaW1wbGVtZW50YXRpb24gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gYmUgdXNlZCBpblxuICogY29uZm9ybWFuY2UgdGVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW9UZXN0U2V0dXAge1xuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBpbml0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUZWFycyBkb3duIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgdGVhckRvd246ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBpbyBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIGluIHRoZSBjb25mb3JtYW5jZSB0ZXN0cy5cbiAgICovXG4gIGlvOiBJbztcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIElvVGVzdFNldHVwIGludGVyZmFjZVxuZXhwb3J0IGNvbnN0IGV4YW1wbGVUZXN0U2V0dXAgPSAoKTogSW9UZXN0U2V0dXAgPT4ge1xuICByZXR1cm4ge1xuICAgIGlvOiBuZXcgSW9NZW0oKSxcbiAgICBpbml0OiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBpbyBpbXBsZW1lbnRhdGlvblxuICAgIH0sXG4gICAgdGVhckRvd246IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRlYXIgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb25cbiAgICB9LFxuICB9O1xufTtcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHsgUmxqc29uLCBUYWJsZUNmZywgVGFibGVLZXkgfSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgaW50ZXJmYWNlIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcblxuICAvKiogU3RhcnRzIHRoZSBpbml0aWFsaXphdGlvbiAqL1xuICBpbml0KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIENsb3NlcyB0aGUgaW8gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogQSBwcm9taXNlIHJlc29sdmluZyBvbmNlIHRoZSBJbyBpbnRlcmZhY2UgaXMgcmVhZHlcbiAgICpcbiAgICog8J+SoSBVc2UgQHJsanNvbi9pcy1yZWFkeVxuICAgKi9cbiAgaXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgLyoqIFJldHVybnMgdGhlIGNvbXBsZXRlIGRiIGNvbnRlbnQgYXMgUmxqc29uICovXG4gIGR1bXAoKTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBkdW1wIG9mIGEgY29tcGxldGUgdGFibGUgKi9cbiAgZHVtcFRhYmxlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBUYWJsZXNcblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0YWJsZSBleGlzdHNcbiAgICovXG4gIHRhYmxlRXhpc3RzKHRhYmxlS2V5OiBUYWJsZUtleSk6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGEgZ2l2ZW4gY29uZmlnLlxuICAgKiBJZiB0aGUgdGFibGUgYWxyZWFkeSBleGlzdHMsIG5ldyBjb2x1bW5zIGFyZSBhZGRlZCB0byB0aGUgZXhpc3RpbmcgdGFibGUuXG4gICAqIElmIHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBleGlzdHMgYW5kIGNvbHVtbnMgYXJlIHJlbW92ZWQsIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgdGhlIGNvbHVtbiB0eXBlIGlzIGNoYW5nZWQsIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICovXG4gIGNyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDogeyB0YWJsZUNmZzogVGFibGVDZmcgfSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBqc29uIHN0cnVjdHVyZSByZXR1cm5pbmcgY3VycmVudCB0YWJsZSBjb25maWd1cmF0aW9uc1xuICAgKi9cbiAgdGFibGVDZmdzKCk6IFByb21pc2U8Umxqc29uPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICAvKiogV3JpdGVzIFJsanNvbiBkYXRhIGludG8gdGhlIGRhdGFiYXNlICovXG4gIHdyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBSZWFkIHJvd3NcblxuICAvKiogUXVlcmllcyBhIGxpc3Qgb2Ygcm93cyAqL1xuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfCBudWxsIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBnaXZlbiB0YWJsZSAqL1xuICByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuZXhwb3J0IGNvbnN0IGV4YW1wbGVJbyA9XG4gICdDaGVja291dCBAcmxqc29uL2lvLW1lbSBmb3IgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbic7XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSnNvbiB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQge1xuICBCdWZmZXQsXG4gIENha2UsXG4gIGl0ZXJhdGVUYWJsZXNTeW5jLFxuICBMYXllcixcbiAgUmVmLFxuICBSbGpzb24sXG4gIFRhYmxlS2V5LFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIERlc2NyaWJlcyBhIHJvdyB0aGF0IHJlZmVyZW5jZXMgYSBjaGlsZCB0YWJsZSByb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJlbnRSZWYge1xuICAvKipcbiAgICogVGhlIHBhcmVudCB0YWJsZSB0aGF0IHJlZmVyZW5jZXMgdGhlIGNoaWxkIHRhYmxlXG4gICAqL1xuICBbcGFyZW50VGFibGU6IFRhYmxlS2V5XToge1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJlbnQgcm93IHRoYXQgcmVmZXJlbmNlcyB0aGUgY2hpbGQgcm93XG4gICAgICovXG4gICAgW3BhcmVudFJvdzogUmVmXToge1xuICAgICAgLyoqXG4gICAgICAgKiBEZXRhaWxzIGFib3V0IHRoZSByZWZlcmVuY2UsIGUuZy4gYW4gYXJyYXkgaW5kZXggZXRjLlxuICAgICAgICovXG4gICAgICBkZXRhaWxzPzogSnNvbjtcbiAgICB9O1xuICB9O1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIHBhcmVudCB0YWJsZSByb3dzIHJlZmVyZW5jaW5nIGEgY2hpbGQgdGFibGUgcm93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV2ZXJzZVJlZnMge1xuICAvKipcbiAgICogVGhlIGNoaWxkIHRhYmxlIHdlIG5lZWQgdGhlIHJlZmVyZW5jaW5nIHJvd3MgZm9yXG4gICAqL1xuICBbY2hpbGRUYWJsZTogVGFibGVLZXldOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdyBoYXNod2UgbmVlZCB0aGUgcmVmZXJlbmNpbmcgcm93cyBmb3JcbiAgICAgKi9cbiAgICBbY2hpbGRSb3c6IFJlZl06IFBhcmVudFJlZjtcbiAgfTtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0ICovXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHJldmVyc2UgcmVmZXJlbmNlcyBmb3IgYSBnaXZlbiBybGpzb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBjYWxjUmV2ZXJzZVJlZnMgPSAocmxqc29uOiBSbGpzb24pOiBSZXZlcnNlUmVmcyA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmV2ZXJzZVJlZnMgPSB7fTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFByZXBhcmUgZGF0YSBzdHJ1Y3R1cmVcbiAgaXRlcmF0ZVRhYmxlc1N5bmMocmxqc29uLCAoY2hpbGRUYWJsZUtleSwgdGFibGUpID0+IHtcbiAgICBjb25zdCBjaGlsZFRhYmxlOiB7IFtjaGlsZFJvd0hhc2g6IHN0cmluZ106IFBhcmVudFJlZiB9ID0ge307XG4gICAgcmVzdWx0W2NoaWxkVGFibGVLZXldID0gY2hpbGRUYWJsZTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkUm93IG9mIHRhYmxlLl9kYXRhKSB7XG4gICAgICBjaGlsZFRhYmxlW2NoaWxkUm93Ll9oYXNoXSA9IHt9O1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmF0ZSByZXZlcnNlIHJlZmVyZW5jZXNcbiAgaXRlcmF0ZVRhYmxlc1N5bmMocmxqc29uLCAocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlKSA9PiB7XG4gICAgLy8gSXRlcmF0ZSBhbGwgcm93cyBvZiBlYWNoIHRhYmxlXG4gICAgZm9yIChjb25zdCBwYXJlbnRUYWJsZVJvdyBvZiBwYXJlbnRUYWJsZS5fZGF0YSkge1xuICAgICAgLy8gRmluZCBvdXQgd2hlIG90aGVyIHRhYmxlcyAmIHJvd3MgYXJlIHJlZmVyZW5jZWQgYnkgdGhpcyByb3dcbiAgICAgIC8vIFdyaXRlIHRoZXNlIGluZm9ybWF0aW9uIGludHRvIHJlc3VsdFxuICAgICAgc3dpdGNoIChwYXJlbnRUYWJsZS5fdHlwZSkge1xuICAgICAgICBjYXNlICdpbmdyZWRpZW50cyc6XG4gICAgICAgICAgX3dyaXRlSW5ncmVkaWVudFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2xheWVycyc6IHtcbiAgICAgICAgICBfd3JpdGVMYXllclJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xpY2VJZHMnOiB7XG4gICAgICAgICAgLy8gU2xpY2UgaWRzIGRvIG5vdCByZWZlcmVuY2Ugb3RoZXIgdGFibGVzXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdjYWtlcyc6IHtcbiAgICAgICAgICBfd3JpdGVDYWtlUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdidWZmZXRzJzoge1xuICAgICAgICAgIF93cml0ZUJ1ZmZldFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogdjggaWdub3JlIGVuZCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlSW5ncmVkaWVudFJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogSnNvbixcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IHBhcmVudENvbHVtbk5hbWUgaW4gcGFyZW50Um93KSB7XG4gICAgaWYgKHBhcmVudENvbHVtbk5hbWUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudENvbHVtbk5hbWUuZW5kc1dpdGgoJ1JlZicpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IHBhcmVudENvbHVtbk5hbWUuc2xpY2UoMCwgLTMpO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IHBhcmVudFJvd1twYXJlbnRDb2x1bW5OYW1lXSBhcyBzdHJpbmc7XG5cbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUxheWVyUmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBMYXllcixcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IHBhcmVudFJvdy5pbmdyZWRpZW50c1RhYmxlO1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IHNsaWNlSWQgaW4gcGFyZW50Um93LmFzc2lnbikge1xuICAgIGlmIChzbGljZUlkLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2xpY2VIYXNoID0gcGFyZW50Um93LmFzc2lnbltzbGljZUlkXSBhcyBzdHJpbmc7XG5cbiAgICBfd3JpdGUocmVzdWx0LCBjaGlsZFRhYmxlTmFtZSwgc2xpY2VIYXNoLCBwYXJlbnRUYWJsZU5hbWUsIHBhcmVudFJvd0hhc2gpO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQ2FrZVJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogQ2FrZSxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGxheWVyIGluIHBhcmVudFJvdy5sYXllcnMpIHtcbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IHBhcmVudFJvdy5sYXllcnNUYWJsZTtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3cubGF5ZXJzW2xheWVyXSBhcyBzdHJpbmc7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVCdWZmZXRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEJ1ZmZldCxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50Um93Lml0ZW1zKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBpdGVtLnRhYmxlO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IGl0ZW0ucmVmO1xuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlID0gKFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuICBjaGlsZFRhYmxlTmFtZTogc3RyaW5nLFxuICBjaGlsZFJvd0hhc2g6IHN0cmluZyxcbiAgcGFyZW50VGFibGVOYW1lOiBzdHJpbmcsXG4gIHBhcmVudFJvd0hhc2g6IHN0cmluZyxcbikgPT4ge1xuICBjb25zdCByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZSA9IChyZXN1bHRbY2hpbGRUYWJsZU5hbWVdID8/PSB7fSk7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93ID0gKHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlW2NoaWxkUm93SGFzaF0gPz89XG4gICAge30pO1xuXG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV0gPz89IHt9O1xuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdW3BhcmVudFJvd0hhc2hdID8/PSB7fTtcbn07XG4iXSwibmFtZXMiOlsiZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBc0JPLE1BQU0sV0FBTixNQUFNLFNBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS25CLFlBQTRCLElBQVE7QUFpQ3BDO0FBQUE7QUFBQTtBQUFBLDhDQUFxQixZQUFZO0FBQy9CLFlBQU0sV0FBcUI7QUFBQSxRQUN6QixLQUFLO0FBQUEsUUFDTCxNQUFNO0FBQUEsUUFDTixRQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixVQUFVO0FBQUEsUUFFVixTQUFTO0FBQUEsVUFDUCxFQUFFLEtBQUssU0FBUyxNQUFNLFNBQVM7QUFBQSxVQUMvQixFQUFFLEtBQUssU0FBUyxNQUFNLFNBQVM7QUFBQSxVQUMvQixFQUFFLEtBQUssZUFBZSxNQUFNLFNBQVM7QUFBQSxVQUNyQyxFQUFFLEtBQUssYUFBYSxNQUFNLFNBQVM7QUFBQSxVQUNuQyxFQUFFLEtBQUssYUFBYSxNQUFNLFNBQVM7QUFBQSxVQUNuQyxFQUFFLEtBQUssTUFBTSxNQUFNLFNBQVM7QUFBQSxRQUFBO0FBQUEsTUFFaEM7QUFFQSxZQUFNLEtBQUssR0FBRyxvQkFBb0IsRUFBRSxVQUFVO0FBQUEsSUFDaEQ7QUFwRDRCLFNBQUEsS0FBQTtBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUs1QixXQUFXLG9CQUFvQjtBQUM3QixVQUFNLFdBQVcsSUFBYztBQUFBLE1BQzdCLE9BQU87QUFBQSxNQUNQLEtBQUs7QUFBQSxNQUNMLE1BQU07QUFBQSxNQUNOLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFVBQVU7QUFBQSxNQUVWLFNBQVM7QUFBQSxRQUNQLEVBQUUsS0FBSyxTQUFTLE1BQU0sU0FBUztBQUFBLFFBQy9CLEVBQUUsS0FBSyxPQUFPLE1BQU0sU0FBUztBQUFBLFFBQzdCLEVBQUUsS0FBSyxRQUFRLE1BQU0sU0FBUztBQUFBLFFBQzlCLEVBQUUsS0FBSyxVQUFVLE1BQU0sVUFBVTtBQUFBLFFBQ2pDLEVBQUUsS0FBSyxVQUFVLE1BQU0sVUFBVTtBQUFBLFFBQ2pDLEVBQUUsS0FBSyxZQUFZLE1BQU0sVUFBVTtBQUFBLFFBQ25DLEVBQUUsS0FBSyxZQUFZLE1BQU0sU0FBUztBQUFBLFFBQ2xDLEVBQUUsS0FBSyxXQUFXLE1BQU0sWUFBWTtBQUFBLE1BQUE7QUFBQSxJQUN0QyxDQUNEO0FBRU0sV0FBQTtBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXlDVCxNQUFNLDJCQUEyQixPQUFnQztBQUMvRCxVQUFNLFNBQVMsTUFBTSxLQUFLLEdBQUcsWUFBWSxLQUFLO0FBQzlDLFFBQUksQ0FBQyxRQUFRO0FBQ1gsWUFBTSxJQUFJLE1BQU0sVUFBVSxLQUFLLGFBQWE7QUFBQSxJQUFBO0FBQUEsRUFDOUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0YsTUFBTSwwQkFBMEIsUUFBK0I7QUFDekQsUUFBQTtBQUNJLFlBQUEsY0FBYyxRQUFRLE9BQU8sYUFBYTtBQUM5QyxjQUFNLFNBQVMsTUFBTSxLQUFLLEdBQUcsWUFBWSxRQUFRO0FBQ2pELFlBQUksQ0FBQyxRQUFRO0FBQ1gsZ0JBQU0sSUFBSSxNQUFNLFVBQVUsUUFBUSxhQUFhO0FBQUEsUUFBQTtBQUFBLE1BQ2pELENBQ0Q7QUFBQSxhQUNNLEdBQUc7QUFDVixZQUFNLGdCQUFpQixFQUFpQixJQUFJLENBQUNBLE9BQU1BLEdBQUUsUUFBUTtBQUU3RCxZQUFNLElBQUk7QUFBQSxRQUNSLHNDQUFzQyxjQUFjLEtBQUssSUFBSSxDQUFDO0FBQUEsTUFDaEU7QUFBQSxJQUFBO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUYsTUFBTSxlQUFrQztBQUN0QyxVQUFNLFVBQVUsTUFBTSxLQUFLLEdBQUcsYUFBYSxVQUFVLE1BQU07QUFBQSxNQUN6RCxDQUFDLE1BQU0sRUFBRTtBQUFBLElBQ1g7QUFDTyxXQUFBO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTVQsTUFBTSxTQUFTLE9BQW9DO0FBQ2pELFVBQU0sV0FBVyxNQUFNLEtBQUssZUFBZSxLQUFLO0FBQ2hELFFBQUksQ0FBQyxVQUFVO0FBQ2IsWUFBTSxJQUFJLE1BQU0sVUFBVSxLQUFLLGFBQWE7QUFBQSxJQUFBO0FBR3ZDLFdBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9ULE1BQU0sZUFBZSxPQUEyQztBQUM5RCxVQUFNLFlBQVksTUFBTSxLQUFLLEdBQUcsVUFBVTtBQUNwQyxVQUFBLFdBQVcsVUFBVSxVQUFVLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLEtBQUs7QUFDdEUsV0FBTyxZQUFZO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTXJCLE1BQU0sY0FBYyxPQUFvQztBQUN0RCxVQUFNLFdBQVcsTUFBTSxLQUFLLFNBQVMsS0FBSztBQUMxQyxVQUFNLFNBQVMsU0FBUyxRQUFRLElBQUksQ0FBQyxXQUFXLE9BQU8sR0FBRztBQUNuRCxXQUFBO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFULE1BQU0sNEJBQ0osT0FDQSxTQUNlO0FBQ2YsVUFBTSxXQUFXLE1BQU0sS0FBSyxTQUFTLEtBQUs7QUFDMUMsVUFBTSxhQUFhLFNBQVMsUUFBUSxJQUFJLENBQUMsV0FBVyxPQUFPLEdBQUc7QUFDOUQsVUFBTSxpQkFBaUIsUUFBUTtBQUFBLE1BQzdCLENBQUMsV0FBVyxDQUFDLFdBQVcsU0FBUyxNQUFNO0FBQUEsSUFDekM7QUFDSSxRQUFBLGVBQWUsU0FBUyxHQUFHO0FBQzdCLFlBQU0sSUFBSTtBQUFBLFFBQ1IsZ0RBQWdELEtBQUssTUFBTSxlQUFlO0FBQUEsVUFDeEU7QUFBQSxRQUFBLENBQ0Q7QUFBQSxNQUNIO0FBQUEsSUFBQTtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0YsTUFBTSw4QkFBOEIsUUFBaUM7QUFDN0QsVUFBQSxTQUFTLGlDQUFpQyxPQUFPLEdBQUc7QUFFMUQsMkJBQXVCLE1BQU07QUFHN0IsVUFBTSxXQUFXLE1BQU0sS0FBSyxlQUFlLE9BQU8sR0FBRztBQUNyRCxRQUFJLFVBQVU7QUFFWixVQUFJLFNBQVMsUUFBUSxTQUFTLE9BQU8sUUFBUSxRQUFRO0FBQzdDLGNBQUEsb0JBQW9CLFNBQVMsUUFDaEMsSUFBSSxDQUFDLFdBQVcsT0FBTyxHQUFHLEVBQzFCO0FBQUEsVUFDQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLFFBQVEsS0FBSyxDQUFDLFdBQVcsT0FBTyxRQUFRLEdBQUc7QUFBQSxRQUM5RDtBQUNFLFlBQUEsa0JBQWtCLFNBQVMsR0FBRztBQUMxQixnQkFBQSxpQkFBaUIsa0JBQWtCLEtBQUssSUFBSTtBQUNsRCxnQkFBTSxJQUFJO0FBQUEsWUFDUixHQUFHLE1BQU0sbURBQ2EsY0FBYztBQUFBLFVBQ3RDO0FBQUEsUUFBQTtBQUFBLE1BQ0Y7QUFJRixlQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUSxRQUFRLEtBQUs7QUFDaEQsY0FBTSxTQUFTLFNBQVMsUUFBUSxDQUFDLEVBQUU7QUFDbkMsY0FBTSxRQUFRLE9BQU8sUUFBUSxDQUFDLEVBQUU7QUFDaEMsWUFBSSxXQUFXLE9BQU87QUFDcEIsZ0JBQU0sSUFBSTtBQUFBLFlBQ1IsR0FBRyxNQUFNLDBDQUVJLE1BQU0sdUJBQXVCLEtBQUs7QUFBQSxVQUNqRDtBQUFBLFFBQUE7QUFBQSxNQUNGO0FBSUYsZUFBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsUUFBUSxLQUFLO0FBQ2hELGNBQU0sU0FBUyxTQUFTLFFBQVEsQ0FBQyxFQUFFO0FBQ25DLGNBQU0sU0FBUyxTQUFTLFFBQVEsQ0FBQyxFQUFFO0FBQ25DLGNBQU0sUUFBUSxPQUFPLFFBQVEsQ0FBQyxFQUFFO0FBQ2hDLFlBQUksV0FBVyxPQUFPO0FBQ3BCLGdCQUFNLElBQUk7QUFBQSxZQUNSLEdBQUcsTUFBTSxtREFFWSxNQUFNLHVCQUF1QixNQUFNLFFBQVEsS0FBSztBQUFBLFVBQ3ZFO0FBQUEsUUFBQTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUYsTUFBTSxrQ0FBa0MsTUFBYztBQUNwRCxVQUFNLFNBQW1CLENBQUM7QUFFcEIsVUFBQSxjQUFjLE1BQU0sT0FBTyxhQUFhO0FBQzVDLFlBQU0sV0FBVyxNQUFNLEtBQUssU0FBUyxRQUFRO0FBQ3ZDLFlBQUEsUUFBUSxLQUFLLFFBQVE7QUFDM0IsYUFBTyxLQUFLLEdBQUcsOEJBQThCLE1BQU0sT0FBTyxRQUFRLENBQUM7QUFBQSxJQUFBLENBQ3BFO0FBRUcsUUFBQSxPQUFPLFNBQVMsR0FBRztBQUNyQixZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUE7QUFBQTtBQUFBLEVBQTRELE9BQ3pELElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLEVBQ25CLEtBQUssSUFBSSxDQUFDO0FBQUEsTUFDZjtBQUFBLElBQUE7QUFBQSxFQUNGO0FBRUo7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW5MRSxjQS9EVyxVQStESixXQUFVLFlBQVk7QUFDckIsUUFBQSxLQUFLLE1BQU0sTUFBTSxRQUFRO0FBQy9CLFFBQU0sR0FBRyxLQUFLO0FBQ2QsUUFBTSxHQUFHLFFBQVE7QUFDVixTQUFBLElBQUksU0FBUSxFQUFFO0FBQ3ZCO0FBcEVLLElBQU0sVUFBTjtBQ3RCUDtBQXVCTyxNQUFNLFNBQU4sTUFBTSxPQUFvQjtBQUFBO0FBQUE7QUFBQSxFQUcvQixjQUFjO0FBNkZOO0FBQUE7QUFBQTtBQUFBO0FBRUEsb0NBQVcsSUFBSSxRQUFRO0FBRXZCLGdDQUFlLElBQUksRUFBWTtBQWMvQjtBQUFBLDBDQUFpQixNQUFNO0FBQzdCLFlBQU0sV0FBVyxRQUFRO0FBRXBCLFdBQUEsS0FBSyxZQUFZLElBQUk7QUFBQSxRQUN4QixPQUFPLENBQUMsUUFBUTtBQUFBLFFBQ2hCLFdBQVcsU0FBUztBQUFBLE1BQUEsQ0FDckI7QUFBQSxJQUNIO0FBQUEsRUF0SGM7QUFBQSxFQUVkLE9BQXNCO0FBQ3BCLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFBQTtBQUFBLEVBR3BCLFFBQXVCO0FBQ3JCLFdBQU8sUUFBUSxRQUFRO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQSxFQVN6QixVQUFVO0FBQ1IsV0FBTyxLQUFLLFNBQVM7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBLEVBTXZCLE9BQXdCO0FBQ3RCLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFBQTtBQUFBLEVBR3BCLE1BQU0sVUFBVSxTQUE2QztBQUNwRCxXQUFBLEtBQUssV0FBVyxPQUFPO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1oQyxTQUFTLFNBR1c7QUFDWCxXQUFBLEtBQUssVUFBVSxPQUFPO0FBQUEsRUFBQTtBQUFBLEVBRy9CLE1BQU0sU0FBUyxPQUFnQztBQUN2QyxVQUFBLFlBQVksS0FBSyxLQUFLLEtBQUs7QUFDakMsUUFBSSxDQUFDLFdBQVc7QUFDZCxZQUFNLElBQUksTUFBTSxVQUFVLEtBQUssYUFBYTtBQUFBLElBQUE7QUFFOUMsV0FBTyxRQUFRLFFBQVEsVUFBVSxNQUFNLE1BQU07QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBLEVBTS9DLE1BQU0sU0FBMEM7QUFDdkMsV0FBQSxLQUFLLE9BQU8sT0FBTztBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUEsRUFLNUIsTUFBTSxZQUFZLFVBQXNDO0FBQ2hELFVBQUEsUUFBUSxLQUFLLEtBQUssUUFBUTtBQUNoQyxXQUFPLFFBQVEsT0FBTztBQUFBLEVBQUE7QUFBQSxFQUd4QixvQkFBb0IsU0FBZ0Q7QUFDM0QsV0FBQSxLQUFLLHFCQUFxQixPQUFPO0FBQUEsRUFBQTtBQUFBLEVBRzFDLE1BQU0sWUFBNkI7QUFDM0IsVUFBQSxTQUFTLEtBQUssS0FBSyxVQUFVO0FBR25DLFVBQU0sZ0JBQTRDLENBQUM7QUFDbkQsYUFBUyxJQUFJLE9BQU8sU0FBUyxHQUFHLEtBQUssR0FBRyxLQUFLO0FBQ3JDLFlBQUEsUUFBUSxPQUFPLENBQUM7QUFDaEIsWUFBQSxXQUFXLGNBQWMsTUFBTSxHQUFHO0FBQ3hDLFVBQUksQ0FBQyxVQUFVO0FBQ0Msc0JBQUEsTUFBTSxHQUFHLElBQUk7QUFBQSxNQUFBO0FBQUEsSUFDN0I7QUFHRixVQUFNLGFBQWEsT0FBTyxPQUFPLGFBQWEsRUFBRSxRQUFRO0FBRXhELFdBQU8sSUFBSTtBQUFBLE1BQ1QsV0FBVztBQUFBLFFBQ1QsT0FBTztBQUFBLE1BQUE7QUFBQSxJQUNULENBQ1M7QUFBQSxFQUFBO0FBQUE7QUFBQSxFQWNiLE1BQWMsUUFBUTtBQUNmLFNBQUEsV0FBVyxJQUFJLFFBQVEsSUFBSTtBQUNoQyxTQUFLLGVBQWU7QUFDcEIsU0FBSyxrQkFBa0I7QUFDakIsVUFBQSxLQUFLLFNBQVMsbUJBQW1CO0FBQ3ZDLFFBQUksS0FBSyxJQUFJO0FBRWIsU0FBSyxTQUFTLFFBQVE7QUFBQSxFQUFBO0FBQUE7QUFBQSxFQWNoQixvQkFBb0I7QUFDekIsU0FBSyxLQUFhLFFBQVE7QUFDM0IsUUFBSSxLQUFLLE1BQU07QUFBQSxNQUNiLHNCQUFzQjtBQUFBLElBQUEsQ0FDdkI7QUFBQSxFQUFBO0FBQUE7QUFBQSxFQUlLLGlCQUFpQixVQUFvQjtBQUNyQyxVQUFBLFFBQVEsS0FBSyxLQUFLLFFBQVE7QUFDaEMsVUFBTSxRQUFRO0FBQ2QsUUFBSSxPQUFPLEVBQUUsc0JBQXNCLE1BQUEsQ0FBTztBQUFBLEVBQUE7QUFBQTtBQUFBLEVBSTVDLE1BQWMscUJBQXFCLFNBRWpCO0FBR2hCLFVBQU0sV0FBVyxRQUFRO0FBQ25CLFVBQUEsS0FBSyxTQUFTLDhCQUE4QixRQUFRO0FBRXBELFVBQUEsRUFBRSxRQUFRO0FBR1YsVUFBQSxZQUFZLElBQUksUUFBUTtBQUc5QixVQUFNLGlCQUFpQixNQUFNLEtBQUssU0FBUyxlQUFlLEdBQUc7QUFHN0QsUUFBSSxDQUFDLGdCQUFnQjtBQUNkLFdBQUEsYUFBYSxXQUFXLEdBQUc7QUFBQSxJQUFBLE9BQzNCO0FBQ0EsV0FBQSxhQUFhLGdCQUFnQixTQUFTO0FBQUEsSUFBQTtBQUFBLEVBQzdDO0FBQUE7QUFBQSxFQUlNLGFBQWEsV0FBcUIsVUFBb0I7O0FBRTVELGdCQUFZLElBQUksU0FBUztBQUN6QixTQUFLLEtBQUssVUFBVSxNQUFNLEtBQUssU0FBUztBQUN4QyxTQUFLLGlCQUFpQixXQUFXO0FBR2pDLFVBQU0sUUFBbUI7QUFBQSxNQUN2QixPQUFPLENBQUM7QUFBQSxNQUNSLFdBQVcsVUFBVTtBQUFBLElBQ3ZCO0FBRUEsZUFBSyxNQUFMLDZCQUF3QixJQUFJLEtBQUs7QUFHakMsU0FBSyxpQkFBaUIsUUFBUTtBQUM5QixTQUFLLGtCQUFrQjtBQUFBLEVBQUE7QUFBQTtBQUFBLEVBSWpCLGFBQWEsZ0JBQTBCLFdBQXFCO0FBRWxFLFFBQUksZUFBZSxRQUFRLFdBQVcsVUFBVSxRQUFRLFFBQVE7QUFDOUQ7QUFBQSxJQUFBO0FBSUYsZ0JBQVksSUFBSSxTQUFTO0FBQ3pCLFNBQUssS0FBSyxVQUFVLE1BQU0sS0FBSyxTQUFTO0FBR3hDLFVBQU0sUUFBUSxLQUFLLEtBQUssVUFBVSxHQUFHO0FBQ3JDLFVBQU0sWUFBWSxVQUFVO0FBRzVCLFNBQUssaUJBQWlCLFdBQVc7QUFDNUIsU0FBQSxpQkFBaUIsVUFBVSxHQUFHO0FBQ25DLFNBQUssa0JBQWtCO0FBQUEsRUFBQTtBQUFBO0FBQUEsRUFLekIsTUFBYyxRQUF5QjtBQUM5QixXQUFBLEtBQUssS0FBSyxJQUFJO0FBQUEsRUFBQTtBQUFBO0FBQUEsRUFJdkIsTUFBYyxXQUFXLFNBQTZDO0FBQ3BFLFVBQU0sS0FBSyxTQUFTLDJCQUEyQixRQUFRLEtBQUs7QUFFNUQsVUFBTSxRQUFRLEtBQUssS0FBSyxRQUFRLEtBQUs7QUFFOUIsV0FBQTtBQUFBLE1BQ0wsQ0FBQyxRQUFRLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFBQSxJQUM3QjtBQUFBLEVBQUE7QUFBQTtBQUFBLEVBSUYsTUFBYyxPQUFPLFNBQTBDO0FBQ3ZELFVBQUEsWUFBWSxJQUFJLFFBQVEsSUFBSTtBQUNsQyxTQUFLLGtCQUFrQixTQUFTO0FBQzFCLFVBQUEsU0FBUyxPQUFPLEtBQUssU0FBUztBQUNwQyxRQUFJLFNBQVM7QUFFYixVQUFNLEtBQUssU0FBUywwQkFBMEIsUUFBUSxJQUFJO0FBQzFELFVBQU0sS0FBSyxTQUFTLGtDQUFrQyxRQUFRLElBQUk7QUFFbEUsZUFBVyxTQUFTLFFBQVE7QUFDdEIsVUFBQSxNQUFNLFdBQVcsR0FBRyxHQUFHO0FBQ3pCO0FBQUEsTUFBQTtBQUdJLFlBQUEsV0FBVyxLQUFLLEtBQUssS0FBSztBQUMxQixZQUFBLFdBQVcsVUFBVSxLQUFLO0FBR3JCLGlCQUFBLFFBQVEsU0FBUyxPQUFPO0FBQ2pDLGNBQU0sT0FBTyxLQUFLO0FBQ1osY0FBQSxTQUFTLFNBQVMsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsSUFBSTtBQUMxRCxZQUFJLENBQUMsUUFBUTtBQUNGLG1CQUFBLE1BQU0sS0FBSyxJQUFXO0FBQUEsUUFBQTtBQUFBLE1BQ2pDO0FBR0YsV0FBSyxpQkFBaUIsS0FBSztBQUFBLElBQUE7QUFJN0IsU0FBSyxrQkFBa0I7QUFBQSxFQUFBO0FBQUE7QUFBQSxFQUl6QixNQUFjLFVBQVUsU0FHSjtBQUNsQixVQUFNLEtBQUssU0FBUywyQkFBMkIsUUFBUSxLQUFLO0FBQzVELFVBQU0sS0FBSyxTQUFTO0FBQUEsTUFDbEIsUUFBUTtBQUFBLE1BQ1IsT0FBTyxLQUFLLFFBQVEsS0FBSztBQUFBLElBQzNCO0FBRUEsVUFBTSxRQUFRLEtBQUssS0FBSyxRQUFRLEtBQUs7QUFFckMsVUFBTSxTQUFpQjtBQUFBLE1BQ3JCLENBQUMsUUFBUSxLQUFLLEdBQUc7QUFBQSxRQUNmLE9BQU8sTUFBTSxNQUFNLE9BQU8sQ0FBQyxRQUFRO0FBQ3RCLHFCQUFBLFVBQVUsUUFBUSxPQUFPO0FBQzVCLGtCQUFBLElBQUksSUFBSSxNQUFNO0FBQ2Qsa0JBQUEsSUFBSSxRQUFRLE1BQU0sTUFBTTtBQUMxQixnQkFBQSxNQUFNLFFBQVEsTUFBTSxRQUFXO0FBQzFCLHFCQUFBO0FBQUEsWUFBQTtBQUdULGdCQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRztBQUNWLHFCQUFBO0FBQUEsWUFBQTtBQUFBLFVBQ1Q7QUFFSyxpQkFBQTtBQUFBLFFBQ1IsQ0FBQTtBQUFBLE1BQUE7QUFBQSxJQUVMO0FBRU8sV0FBQTtBQUFBLEVBQUE7QUFBQSxFQUdULGtCQUFrQixRQUFnQjtBQUNkLHNCQUFBLFFBQVEsQ0FBQyxVQUFVO0FBQzdCLFlBQUEsT0FBTyxPQUFPLEtBQUssRUFBRTtBQUUzQixpQkFBVyxPQUFPLE1BQU07QUFDdEIsbUJBQVcsT0FBTyxLQUFLO0FBQ2pCLGNBQUEsSUFBSSxHQUFHLE1BQU0sTUFBTTtBQUNyQixtQkFBTyxJQUFJLEdBQUc7QUFBQSxVQUFBO0FBQUEsUUFDaEI7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUNEO0FBQUEsRUFBQTtBQUVMO0FBbFNFLGNBYlcsUUFhSixXQUFVLFlBQVk7QUFDM0IsU0FBTyxJQUFJLE9BQU07QUFDbkI7QUFmSyxJQUFNLFFBQU47QUN2QlA7QUFrQ08sTUFBTSxtQkFBbUIsTUFBbUI7QUFDMUMsU0FBQTtBQUFBLElBQ0wsSUFBSSxJQUFJLE1BQU07QUFBQSxJQUNkLE1BQU0sWUFBWTtBQUFBLElBRWxCO0FBQUEsSUFDQSxVQUFVLFlBQVk7QUFBQSxJQUFBO0FBQUEsRUFHeEI7QUFDRjtBQzVDQTtBQTZFTyxNQUFNLFlBQ1g7QUM5RUY7QUE0RGEsTUFBQSxrQkFBa0IsQ0FBQyxXQUFnQztBQUM5RCxRQUFNLFNBQXNCLENBQUM7QUFJWCxvQkFBQSxRQUFRLENBQUMsZUFBZSxVQUFVO0FBQ2xELFVBQU0sYUFBb0QsQ0FBQztBQUMzRCxXQUFPLGFBQWEsSUFBSTtBQUNiLGVBQUEsWUFBWSxNQUFNLE9BQU87QUFDdkIsaUJBQUEsU0FBUyxLQUFLLElBQUksQ0FBQztBQUFBLElBQUE7QUFBQSxFQUNoQyxDQUNEO0FBSWlCLG9CQUFBLFFBQVEsQ0FBQyxnQkFBZ0IsZ0JBQWdCO0FBRTlDLGVBQUEsa0JBQWtCLFlBQVksT0FBTztBQUc5QyxjQUFRLFlBQVksT0FBTztBQUFBLFFBQ3pCLEtBQUs7QUFDa0IsK0JBQUEsZ0JBQWdCLGdCQUFnQixNQUFNO0FBQzNEO0FBQUEsUUFFRixLQUFLLFVBQVU7QUFDRywwQkFBQSxnQkFBZ0IsZ0JBQWdCLE1BQU07QUFDdEQ7QUFBQSxRQUFBO0FBQUEsUUFHRixLQUFLLFlBQVk7QUFFZjtBQUFBLFFBQUE7QUFBQSxRQUdGLEtBQUssU0FBUztBQUNHLHlCQUFBLGdCQUFnQixnQkFBZ0IsTUFBTTtBQUNyRDtBQUFBLFFBQUE7QUFBQSxRQUdGLEtBQUssV0FBVztBQUNHLDJCQUFBLGdCQUFnQixnQkFBZ0IsTUFBTTtBQUN2RDtBQUFBLFFBQUE7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FDRDtBQUVNLFNBQUE7QUFDVDtBQUtBLE1BQU0sdUJBQXVCLENBQzNCLGlCQUNBLFdBQ0EsV0FDRztBQUNILFFBQU0sZ0JBQWdCLFVBQVU7QUFFaEMsYUFBVyxvQkFBb0IsV0FBVztBQUNwQyxRQUFBLGlCQUFpQixXQUFXLEdBQUcsR0FBRztBQUNwQztBQUFBLElBQUE7QUFHRixRQUFJLENBQUMsaUJBQWlCLFNBQVMsS0FBSyxHQUFHO0FBQ3JDO0FBQUEsSUFBQTtBQUdGLFVBQU0saUJBQWlCLGlCQUFpQixNQUFNLEdBQUcsRUFBRTtBQUM3QyxVQUFBLGVBQWUsVUFBVSxnQkFBZ0I7QUFFL0M7QUFBQSxNQUNFO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUFBO0FBRUo7QUFHQSxNQUFNLGtCQUFrQixDQUN0QixpQkFDQSxXQUNBLFdBQ0c7QUFDSCxRQUFNLGlCQUFpQixVQUFVO0FBQ2pDLFFBQU0sZ0JBQWdCLFVBQVU7QUFFckIsYUFBQSxXQUFXLFVBQVUsUUFBUTtBQUNsQyxRQUFBLFFBQVEsV0FBVyxHQUFHLEdBQUc7QUFDM0I7QUFBQSxJQUFBO0FBR0ksVUFBQSxZQUFZLFVBQVUsT0FBTyxPQUFPO0FBRTFDLFdBQU8sUUFBUSxnQkFBZ0IsV0FBVyxpQkFBaUIsYUFBYTtBQUFBLEVBQUE7QUFFNUU7QUFHQSxNQUFNLGlCQUFpQixDQUNyQixpQkFDQSxXQUNBLFdBQ0c7QUFDSCxRQUFNLGdCQUFnQixVQUFVO0FBRXJCLGFBQUEsU0FBUyxVQUFVLFFBQVE7QUFDcEMsVUFBTSxpQkFBaUIsVUFBVTtBQUMzQixVQUFBLGVBQWUsVUFBVSxPQUFPLEtBQUs7QUFDM0M7QUFBQSxNQUNFO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUFBO0FBRUo7QUFHQSxNQUFNLG1CQUFtQixDQUN2QixpQkFDQSxXQUNBLFdBQ0c7QUFDSCxRQUFNLGdCQUFnQixVQUFVO0FBRXJCLGFBQUEsUUFBUSxVQUFVLE9BQU87QUFDbEMsVUFBTSxpQkFBaUIsS0FBSztBQUM1QixVQUFNLGVBQWUsS0FBSztBQUMxQjtBQUFBLE1BQ0U7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQUE7QUFFSjtBQUdBLE1BQU0sU0FBUyxDQUNiLFFBQ0EsZ0JBQ0EsY0FDQSxpQkFDQSxrQkFDRzs7QUFDSCxRQUFNLDBCQUEyQixvREFBMkIsQ0FBQztBQUM3RCxRQUFNLDZCQUE4QixrRkFDbEMsQ0FBQztBQUV3QixnR0FBcUIsQ0FBQztBQUNqRCxtQ0FBMkIsZUFBZSxHQUExQyx1Q0FBK0QsQ0FBQztBQUNsRTsifQ==
598
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8tdGVzdC1zZXR1cC50cyIsIi4uL3NyYy9pby50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG4gIHRocm93T25JbnZhbGlkVGFibGVDZmcsXG4gIHZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuLyoqXG4gKiBQcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIElvIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvVG9vbHMge1xuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIGlvIFRoZSBJbyBpbnRlcmZhY2UgdG8gdXNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgaW86IElvKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uIG9mIHRoZSB0YWJsZUNmZ3MgdGFibGUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlQ2Znc1RhYmxlQ2ZnKCkge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gaGlwPFRhYmxlQ2ZnPih7XG4gICAgICBfaGFzaDogJycsXG4gICAgICBrZXk6ICd0YWJsZUNmZ3MnLFxuICAgICAgdHlwZTogJ2luZ3JlZGllbnRzJyxcbiAgICAgIGlzSGVhZDogZmFsc2UsXG4gICAgICBpc1Jvb3Q6IGZhbHNlLFxuICAgICAgaXNTaGFyZWQ6IHRydWUsXG4gICAgICBwcmV2aW91czogJycsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBrZXk6ICdfaGFzaCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAna2V5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICd0eXBlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdpc0hlYWQnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdpc1Jvb3QnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdpc1NoYXJlZCcsIHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICB7IGtleTogJ3ByZXZpb3VzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdjb2x1bW5zJywgdHlwZTogJ2pzb25BcnJheScgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGFibGVDZmc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHJldmlzaW9ucyB0YWJsZS5cbiAgICovXG4gIGluaXRSZXZpc2lvbnNUYWJsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZUNmZzogVGFibGVDZmcgPSB7XG4gICAgICBrZXk6ICdyZXZpc2lvbnMnLFxuICAgICAgdHlwZTogJ2luZ3JlZGllbnRzJyxcbiAgICAgIGlzSGVhZDogdHJ1ZSxcbiAgICAgIGlzUm9vdDogdHJ1ZSxcbiAgICAgIGlzU2hhcmVkOiBmYWxzZSxcblxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7IGtleTogJ19oYXNoJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICd0YWJsZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAncHJlZGVjZXNzb3InLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3N1Y2Nlc3NvcicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndGltZXN0YW1wJywgdHlwZTogJ251bWJlcicgfSxcbiAgICAgICAgeyBrZXk6ICdpZCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLmlvLmNyZWF0ZU9yRXh0ZW5kVGFibGUoeyB0YWJsZUNmZyB9KTtcbiAgfTtcblxuICAvKipcbiAgICogRXhhbXBsZSBvYmplY3QgZm9yIHRlc3QgcHVycG9zZXNcbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgaW8gdG9vbHNcbiAgICovXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvID0gYXdhaXQgSW9NZW0uZXhhbXBsZSgpO1xuICAgIGF3YWl0IGlvLmluaXQoKTtcbiAgICBhd2FpdCBpby5pc1JlYWR5KCk7XG4gICAgcmV0dXJuIG5ldyBJb1Rvb2xzKGlvKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhyb3dzIGlmIHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdFxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZSk7XG4gICAgaWYgKCFleGlzdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgYW55IG9mIHRoZSB0YWJsZXMgaW4gcmxqc29uIGRvIG5vdCBleGlzdFxuICAgKiBAcGFyYW0gcmxqc29uIC0gVGhlIFJsanNvbiBvYmplY3QgdG8gY2hlY2tcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlc0RvTm90RXhpc3Qocmxqc29uOiBSbGpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhybGpzb24sIGFzeW5jICh0YWJsZUtleSkgPT4ge1xuICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmlvLnRhYmxlRXhpc3RzKHRhYmxlS2V5KTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZUtleX1cIiBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbWlzc2luZ1RhYmxlcyA9IChlIGFzIEFycmF5PGFueT4pLm1hcCgoZSkgPT4gZS50YWJsZUtleSk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgdGFibGVzIGRvIG5vdCBleGlzdDogJHttaXNzaW5nVGFibGVzLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGFibGUgY2ZncyBvZiBhbGwgdGFibGVzXG4gICAqIEByZXR1cm5zIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uIG9mIGFsbCB0YWJsZXNcbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICBjb25zdCB0YWJsZUNmZ0R1bXAgPSBhd2FpdCB0aGlzLmlvLmR1bXBUYWJsZSh7IHRhYmxlOiAndGFibGVDZmdzJyB9KTtcbiAgICBjb25zdCB0YWJsZXMgPSB0YWJsZUNmZ0R1bXAudGFibGVDZmdzLl9kYXRhIGFzIFRhYmxlQ2ZnW107XG5cbiAgICAvLyBUYWtlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlYWNoIHR5cGUga2V5XG4gICAgY29uc3QgbmV3ZXN0VmVyc2lvbjogUmVjb3JkPFRhYmxlS2V5LCBUYWJsZUNmZz4gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gdGFibGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCB0YWJsZSA9IHRhYmxlc1tpXTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbmV3ZXN0VmVyc2lvblt0YWJsZS5rZXldO1xuICAgICAgaWYgKCFleGlzdGluZyB8fCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA8IHRhYmxlLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIG5ld2VzdFZlcnNpb25bdGFibGUua2V5XSA9IHRhYmxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdERhdGEgPSBPYmplY3QudmFsdWVzKG5ld2VzdFZlcnNpb24pLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmIChhLmtleSA8IGIua2V5KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChhLmtleSA+IGIua2V5KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgICAvKiB2OCBpZ25vcmUgZW5kICovXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdERhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgd2l0aCBhbGwgdGFibGUgbmFtZXNcbiAgICovXG4gIGFzeW5jIGFsbFRhYmxlS2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHRoaXMudGFibGVDZmdzKCkpLm1hcCgoZSkgPT4gZS5rZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZyh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHRhYmxlKTtcbiAgICBpZiAoIXRhYmxlQ2ZnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGVDZmchO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZSBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZ09yTnVsbCh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnIHwgbnVsbD4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZncyA9IGF3YWl0IHRoaXMudGFibGVDZmdzKCk7XG4gICAgY29uc3QgdGFibGVDZmcgPSB0YWJsZUNmZ3MuZmluZCgoZSkgPT4gZS5rZXkgPT09IHRhYmxlKTtcbiAgICByZXR1cm4gdGFibGVDZmcgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY29sdW1uIG5hbWVzIG9mIGEgZ2l2ZW4gdGFibGVcbiAgICovXG4gIGFzeW5jIGFsbENvbHVtbktleXModGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGFibGVDZmcuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIGNvbHVtbiBkb2VzIG5vdCBleGlzdCBpbiBhIGdpdmVuIHRhYmxlXG4gICAqIEBwYXJhbSB0YWJsZSAtIFRoZSB0YWJsZSB0byBjaGVja1xuICAgKiBAcGFyYW0gY29sdW1ucyAtIFRoZSBjb2x1bW4gdG8gY2hlY2tcbiAgICovXG4gIGFzeW5jIHRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcbiAgICB0YWJsZTogVGFibGVLZXksXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZSk7XG4gICAgY29uc3QgY29sdW1uS2V5cyA9IHRhYmxlQ2ZnLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpO1xuICAgIGNvbnN0IG1pc3NpbmdDb2x1bW5zID0gY29sdW1ucy5maWx0ZXIoXG4gICAgICAoY29sdW1uKSA9PiAhY29sdW1uS2V5cy5pbmNsdWRlcyhjb2x1bW4pLFxuICAgICk7XG4gICAgaWYgKG1pc3NpbmdDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgY29sdW1ucyBkbyBub3QgZXhpc3QgaW4gdGFibGUgXCIke3RhYmxlfVwiOiAke21pc3NpbmdDb2x1bW5zLmpvaW4oXG4gICAgICAgICAgJywgJyxcbiAgICAgICAgKX0uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyB3aGVuIGEgdGFibGUgdXBkYXRlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdGFibGVcbiAgICogY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlSXNOb3RDb21wYXRpYmxlKHVwZGF0ZTogVGFibGVDZmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmVmaXggPSBgSW52YWxpZCB1cGRhdGUgb2YgdGFibGUgYWJsZSBcIiR7dXBkYXRlLmtleX1cImA7XG5cbiAgICB0aHJvd09uSW52YWxpZFRhYmxlQ2ZnKHVwZGF0ZSk7XG5cbiAgICAvLyBDaGVjayBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMudGFibGVDZmdPck51bGwodXBkYXRlLmtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAvLyBIYXZlIGNvbHVtbnMgYmVlbiBkZWxldGVkP1xuICAgICAgaWYgKGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoID4gdXBkYXRlLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDb2x1bW5LZXlzID0gZXhpc3RpbmcuY29sdW1uc1xuICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSlcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGtleSkgPT4gIXVwZGF0ZS5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLmtleSA9PT0ga2V5KSxcbiAgICAgICAgICApO1xuICAgICAgICBpZiAoZGVsZXRlZENvbHVtbktleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRlbGV0ZWRDb2x1bW5zID0gZGVsZXRlZENvbHVtbktleXMuam9pbignLCAnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBDb2x1bW5zIG11c3Qgbm90IGJlIGRlbGV0ZWQuIGAgK1xuICAgICAgICAgICAgICBgRGVsZXRlZCBjb2x1bW5zOiAke2RlbGV0ZWRDb2x1bW5zfX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGF2ZSBjb2x1bW4ga2V5cyBjaGFuZ2VkP1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGV4aXN0aW5nLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBjb25zdCBhZnRlciA9IHVwZGF0ZS5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgaWYgKGJlZm9yZSAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiBrZXlzIG11c3Qgbm90IGNoYW5nZSEgYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4gXCIke2JlZm9yZX1cIiB3YXMgcmVuYW1lZCBpbnRvIFwiJHthZnRlcn1cIi5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGF2ZSBjb2x1bW4gdHlwZXMgY2hhbmdlZD9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBleGlzdGluZy5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS50eXBlO1xuICAgICAgICBjb25zdCBhZnRlciA9IHVwZGF0ZS5jb2x1bW5zW2ldLnR5cGU7XG4gICAgICAgIGlmIChiZWZvcmUgIT09IGFmdGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4gdHlwZXMgbXVzdCBub3QgY2hhbmdlISBgICtcbiAgICAgICAgICAgICAgYFR5cGUgb2YgY29sdW1uIFwiJHtjb2x1bW59XCIgd2FzIGNoYW5nZWQgZnJvbSBcIiR7YmVmb3JlfVwiIHRvICR7YWZ0ZXJ9LmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgdGhlIGRhdGEgaW4gdGhlIHRhYmxlIGRvIG5vdCBtYXRjaCB0aGUgdGFibGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEYXRhRG9lc05vdE1hdGNoQ2ZnKGRhdGE6IFJsanNvbikge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMoZGF0YSwgYXN5bmMgKHRhYmxlS2V5KSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGVLZXkpO1xuICAgICAgY29uc3QgdGFibGUgPSBkYXRhW3RhYmxlS2V5XTtcbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnKHRhYmxlLl9kYXRhLCB0YWJsZUNmZykpO1xuICAgIH0pO1xuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYWJsZSBkYXRhIGRvZXMgbm90IG1hdGNoIHRoZSBjb25maWd1cmF0aW9uLlxcblxcbkVycm9yczpcXG4ke2Vycm9yc1xuICAgICAgICAgIC5tYXAoKGUpID0+IGAtICR7ZX1gKVxuICAgICAgICAgIC5qb2luKCdcXG4nKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIGRhdGEgb2YgYSB0YWJsZSBieSB0aGUgaGFzaCBhbmQgdXBkYXRlcyB0aGUgdGFibGUgaGFzaCBpbiBwbGFjZVxuICAgKi9cbiAgc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGFibGU6IFRhYmxlVHlwZSk6IHZvaWQge1xuICAgIHRhYmxlLl9kYXRhLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGhhc2hBID0gYS5faGFzaCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBoYXNoQiA9IGIuX2hhc2ggYXMgc3RyaW5nO1xuICAgICAgaWYgKGhhc2hBIDwgaGFzaEIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGhhc2hBID4gaGFzaEIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICAgIC8qIHY4IGlnbm9yZSBlbmQgKi9cbiAgICB9KTtcblxuICAgIHRhYmxlLl9oYXNoID0gJyc7XG4gICAgaGlwKHRhYmxlLCB7XG4gICAgICB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UsXG4gICAgICB0aHJvd09uV3JvbmdIYXNoZXM6IGZhbHNlLFxuICAgIH0pO1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwLCBoc2ggfSBmcm9tICdAcmxqc29uL2hhc2gnO1xuaW1wb3J0IHsgSXNSZWFkeSB9IGZyb20gJ0BybGpzb24vaXMtcmVhZHknO1xuaW1wb3J0IHsgY29weSwgZXF1YWxzLCBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHtcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9Ub29scyB9IGZyb20gJy4vaW8tdG9vbHMudHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuLyoqXG4gKiBJbi1NZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJsanNvbiBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb01lbSBpbXBsZW1lbnRzIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIENvbnN0cnVjdG9yICYgZXhhbXBsZVxuXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xuICB9XG5cbiAgc3RhdGljIGV4YW1wbGUgPSBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBJb01lbSgpO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmFsXG4gIGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVhZHkucHJvbWlzZTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wKCk7XG4gIH1cblxuICBhc3luYyBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUm93c1xuXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZFJvd3MocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICBpZiAoIXRhYmxlRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlIG1hbmFnZW1lbnRcbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICByZXR1cm4gdGFibGUgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgLy8gUHJpdmF0ZVxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgcHJpdmF0ZSBfaW9Ub29scyE6IElvVG9vbHM7XG5cbiAgcHJpdmF0ZSBfaXNSZWFkeSA9IG5ldyBJc1JlYWR5KCk7XG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21lbTogUmxqc29uID0gaGlwKHt9IGFzIFJsanNvbik7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5faW9Ub29scyA9IG5ldyBJb1Rvb2xzKHRoaXMpO1xuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy5pbml0UmV2aXNpb25zVGFibGUoKTtcbiAgICBoc2godGhpcy5fbWVtKTtcblxuICAgIHRoaXMuX2lzUmVhZHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2luaXRUYWJsZUNmZ3MgPSAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBJb1Rvb2xzLnRhYmxlQ2Znc1RhYmxlQ2ZnO1xuXG4gICAgdGhpcy5fbWVtLnRhYmxlQ2ZncyA9IGhpcCh7XG4gICAgICBfZGF0YTogW3RhYmxlQ2ZnXSxcbiAgICAgIF90YWJsZUNmZzogdGFibGVDZmcuX2hhc2ggYXMgc3RyaW5nLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVHbG9iYWxIYXNoKCkge1xuICAgICh0aGlzLl9tZW0gYXMgYW55KS5faGFzaCA9ICcnO1xuICAgIGhpcCh0aGlzLl9tZW0sIHtcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVUYWJsZUhhc2godGFibGVLZXk6IFRhYmxlS2V5KSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwgeyB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7XG4gICAgdGFibGVDZmc6IFRhYmxlQ2ZnO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGNvbmZpZyBpcyBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBhbiBwb3RlbnRpYWwgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZUNmZyA9IHJlcXVlc3QudGFibGVDZmc7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh0YWJsZUNmZyk7XG5cbiAgICBjb25zdCB7IGtleSB9ID0gdGFibGVDZmc7XG5cbiAgICAvLyBSZWNyZWF0ZSBoYXNoZXMgaW4gdGhlIGNhc2UgdGhlIGV4aXN0aW5nIGhhc2hlcyBhcmUgd3JvbmdcbiAgICBjb25zdCBuZXdDb25maWcgPSBoc2godGFibGVDZmcpO1xuXG4gICAgLy8gRmluZCBhbiBleGlzdGluZyB0YWJsZSBjb25maWcgd2l0aCB0aGUgc2FtZSBoYXNoXG4gICAgY29uc3QgZXhpc3RpbmdDb25maWcgPSBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRhYmxlQ2ZnT3JOdWxsKGtleSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGlmICghZXhpc3RpbmdDb25maWcpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWcsIG5ld0NvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZzogVGFibGVDZmcsIHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIC8vIFdyaXRlIHRoZSB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIHdyaXRlIGl0IGludG8gdGhlIGRhdGFiYXNlXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF9kYXRhOiBbXSxcbiAgICAgIF90YWJsZUNmZzogbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fbWVtW3RhYmxlS2V5XSA/Pz0gaGlwKHRhYmxlKTtcblxuICAgIC8vIFVwZGF0ZSBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVUYWJsZUhhc2godGFibGVLZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9leHRlbmRUYWJsZShleGlzdGluZ0NvbmZpZzogVGFibGVDZmcsIG5ld0NvbmZpZzogVGFibGVDZmcpIHtcbiAgICAvLyBObyBjb2x1bW5zIGFkZGVkPyBSZXR1cm4uXG4gICAgaWYgKGV4aXN0aW5nQ29uZmlnLmNvbHVtbnMubGVuZ3RoID09PSBuZXdDb25maWcuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IHRhYmxlIGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGhpcy5fbWVtLnRhYmxlQ2Zncyk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZyBvZiB0aGUgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtuZXdDb25maWcua2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX3RhYmxlQ2ZnID0gbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZztcblxuICAgIC8vIFVwZGF0ZSB0aGUgaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKG5ld0NvbmZpZy5rZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG4gIHByaXZhdGUgYXN5bmMgX2R1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9tZW0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2R1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICBbcmVxdWVzdC50YWJsZV06IGNvcHkodGFibGUpLFxuICAgIH07XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFkZGVkRGF0YSA9IGhzaChyZXF1ZXN0LmRhdGEpO1xuICAgIHRoaXMuX3JlbW92ZU51bGxWYWx1ZXMoYWRkZWREYXRhKTtcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3Qua2V5cyhhZGRlZERhdGEpO1xuICAgIGhzaChhZGRlZERhdGEpO1xuXG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJlcXVlc3QuZGF0YSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcocmVxdWVzdC5kYXRhKTtcblxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBpZiAodGFibGUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGRUYWJsZSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgICAgY29uc3QgbmV3VGFibGUgPSBhZGRlZERhdGFbdGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgICAgLy8gVGFibGUgZXhpc3RzLiBNZXJnZSBkYXRhXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3VGFibGUuX2RhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGl0ZW0uX2hhc2g7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG9sZFRhYmxlLl9kYXRhLmZpbmQoKGkpID0+IGkuX2hhc2ggPT09IGhhc2gpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIG9sZFRhYmxlLl9kYXRhLnB1c2goaXRlbSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2gob2xkVGFibGUpO1xuICAgIH1cblxuICAgIC8vIFJlY2FsYyBtYWluIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9yZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcbiAgICAgIHJlcXVlc3QudGFibGUsXG4gICAgICBPYmplY3Qua2V5cyhyZXF1ZXN0LndoZXJlKSxcbiAgICApO1xuXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bcmVxdWVzdC50YWJsZV0gYXMgVGFibGVUeXBlO1xuXG4gICAgY29uc3QgcmVzdWx0OiBSbGpzb24gPSB7XG4gICAgICBbcmVxdWVzdC50YWJsZV06IHtcbiAgICAgICAgX2RhdGE6IHRhYmxlLl9kYXRhLmZpbHRlcigocm93KSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gaW4gcmVxdWVzdC53aGVyZSkge1xuICAgICAgICAgICAgY29uc3QgYSA9IHJvd1tjb2x1bW5dO1xuICAgICAgICAgICAgY29uc3QgYiA9IHJlcXVlc3Qud2hlcmVbY29sdW1uXTtcbiAgICAgICAgICAgIGlmIChiID09PSBudWxsICYmIGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFlcXVhbHMoYSwgYikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0gYXMgYW55O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIF9yZW1vdmVOdWxsVmFsdWVzKHJsanNvbjogUmxqc29uKSB7XG4gICAgaXRlcmF0ZVRhYmxlc1N5bmMocmxqc29uLCAodGFibGUpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBybGpzb25bdGFibGVdLl9kYXRhO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJvdykge1xuICAgICAgICAgIGlmIChyb3dba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZGVsZXRlIHJvd1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSW8sIElvTWVtIH0gZnJvbSAnLi9pbmRleC50cyc7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIElvIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGJlIHVzZWQgaW5cbiAqIGNvbmZvcm1hbmNlIHRlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElvVGVzdFNldHVwIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgaW5pdDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGVhcnMgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIHRlYXJEb3duOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgaW8gaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCBpbiB0aGUgY29uZm9ybWFuY2UgdGVzdHMuXG4gICAqL1xuICBpbzogSW87XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vLyBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJb1Rlc3RTZXR1cCBpbnRlcmZhY2VcbmV4cG9ydCBjb25zdCBleGFtcGxlVGVzdFNldHVwID0gKCk6IElvVGVzdFNldHVwID0+IHtcbiAgcmV0dXJuIHtcbiAgICBpbzogbmV3IElvTWVtKCksXG4gICAgaW5pdDogYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaW8gaW1wbGVtZW50YXRpb25cbiAgICB9LFxuICAgIHRlYXJEb3duOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUZWFyIGRvd24gdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcbiAgfTtcbn07XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSnNvblZhbHVlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7IFJsanNvbiwgVGFibGVDZmcsIFRhYmxlS2V5IH0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuZXhwb3J0IGludGVyZmFjZSBJbyB7XG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmFsXG5cbiAgLyoqIFN0YXJ0cyB0aGUgaW5pdGlhbGl6YXRpb24gKi9cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBDbG9zZXMgdGhlIGlvICovXG4gIGNsb3NlKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIFJldHVybnMgdHJ1ZSBpZiBpbyBpcyBvcGVuZWQgKi9cbiAgaXNPcGVuOiBib29sZWFuO1xuXG4gIC8qKiBBIHByb21pc2UgcmVzb2x2aW5nIG9uY2UgdGhlIElvIGludGVyZmFjZSBpcyByZWFkeVxuICAgKlxuICAgKiDwn5KhIFVzZSBAcmxqc29uL2lzLXJlYWR5XG4gICAqL1xuICBpc1JlYWR5KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIER1bXBcblxuICAvKiogUmV0dXJucyB0aGUgY29tcGxldGUgZGIgY29udGVudCBhcyBSbGpzb24gKi9cbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIGR1bXAgb2YgYSBjb21wbGV0ZSB0YWJsZSAqL1xuICBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlc1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGV4aXN0c1xuICAgKi9cbiAgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggYSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbmV3IGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgY29sdW1ucyBhcmUgcmVtb3ZlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCB0aGUgY29sdW1uIHR5cGUgaXMgY2hhbmdlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICAvKiogV3JpdGVzIFJsanNvbiBkYXRhIGludG8gdGhlIGRhdGFiYXNlICovXG4gIHdyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBSZWFkIHJvd3NcblxuICAvKiogUXVlcmllcyBhIGxpc3Qgb2Ygcm93cyAqL1xuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfCBudWxsIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBnaXZlbiB0YWJsZSAqL1xuICByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuZXhwb3J0IGNvbnN0IGV4YW1wbGVJbyA9XG4gICdDaGVja291dCBAcmxqc29uL2lvLW1lbSBmb3IgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbic7XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSnNvbiB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQge1xuICBCdWZmZXQsXG4gIENha2UsXG4gIGl0ZXJhdGVUYWJsZXNTeW5jLFxuICBMYXllcixcbiAgUmVmLFxuICBSbGpzb24sXG4gIFRhYmxlS2V5LFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIERlc2NyaWJlcyBhIHJvdyB0aGF0IHJlZmVyZW5jZXMgYSBjaGlsZCB0YWJsZSByb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJlbnRSZWYge1xuICAvKipcbiAgICogVGhlIHBhcmVudCB0YWJsZSB0aGF0IHJlZmVyZW5jZXMgdGhlIGNoaWxkIHRhYmxlXG4gICAqL1xuICBbcGFyZW50VGFibGU6IFRhYmxlS2V5XToge1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJlbnQgcm93IHRoYXQgcmVmZXJlbmNlcyB0aGUgY2hpbGQgcm93XG4gICAgICovXG4gICAgW3BhcmVudFJvdzogUmVmXToge1xuICAgICAgLyoqXG4gICAgICAgKiBEZXRhaWxzIGFib3V0IHRoZSByZWZlcmVuY2UsIGUuZy4gYW4gYXJyYXkgaW5kZXggZXRjLlxuICAgICAgICovXG4gICAgICBkZXRhaWxzPzogSnNvbjtcbiAgICB9O1xuICB9O1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIHBhcmVudCB0YWJsZSByb3dzIHJlZmVyZW5jaW5nIGEgY2hpbGQgdGFibGUgcm93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV2ZXJzZVJlZnMge1xuICAvKipcbiAgICogVGhlIGNoaWxkIHRhYmxlIHdlIG5lZWQgdGhlIHJlZmVyZW5jaW5nIHJvd3MgZm9yXG4gICAqL1xuICBbY2hpbGRUYWJsZTogVGFibGVLZXldOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdyBoYXNod2UgbmVlZCB0aGUgcmVmZXJlbmNpbmcgcm93cyBmb3JcbiAgICAgKi9cbiAgICBbY2hpbGRSb3c6IFJlZl06IFBhcmVudFJlZjtcbiAgfTtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0ICovXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHJldmVyc2UgcmVmZXJlbmNlcyBmb3IgYSBnaXZlbiBybGpzb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBjYWxjUmV2ZXJzZVJlZnMgPSAocmxqc29uOiBSbGpzb24pOiBSZXZlcnNlUmVmcyA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmV2ZXJzZVJlZnMgPSB7fTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFByZXBhcmUgZGF0YSBzdHJ1Y3R1cmVcbiAgaXRlcmF0ZVRhYmxlc1N5bmMocmxqc29uLCAoY2hpbGRUYWJsZUtleSwgdGFibGUpID0+IHtcbiAgICBjb25zdCBjaGlsZFRhYmxlOiB7IFtjaGlsZFJvd0hhc2g6IHN0cmluZ106IFBhcmVudFJlZiB9ID0ge307XG4gICAgcmVzdWx0W2NoaWxkVGFibGVLZXldID0gY2hpbGRUYWJsZTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkUm93IG9mIHRhYmxlLl9kYXRhKSB7XG4gICAgICBjaGlsZFRhYmxlW2NoaWxkUm93Ll9oYXNoXSA9IHt9O1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmF0ZSByZXZlcnNlIHJlZmVyZW5jZXNcbiAgaXRlcmF0ZVRhYmxlc1N5bmMocmxqc29uLCAocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlKSA9PiB7XG4gICAgLy8gSXRlcmF0ZSBhbGwgcm93cyBvZiBlYWNoIHRhYmxlXG4gICAgZm9yIChjb25zdCBwYXJlbnRUYWJsZVJvdyBvZiBwYXJlbnRUYWJsZS5fZGF0YSkge1xuICAgICAgLy8gRmluZCBvdXQgd2hlIG90aGVyIHRhYmxlcyAmIHJvd3MgYXJlIHJlZmVyZW5jZWQgYnkgdGhpcyByb3dcbiAgICAgIC8vIFdyaXRlIHRoZXNlIGluZm9ybWF0aW9uIGludHRvIHJlc3VsdFxuICAgICAgc3dpdGNoIChwYXJlbnRUYWJsZS5fdHlwZSkge1xuICAgICAgICBjYXNlICdpbmdyZWRpZW50cyc6XG4gICAgICAgICAgX3dyaXRlSW5ncmVkaWVudFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2xheWVycyc6IHtcbiAgICAgICAgICBfd3JpdGVMYXllclJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xpY2VJZHMnOiB7XG4gICAgICAgICAgLy8gU2xpY2UgaWRzIGRvIG5vdCByZWZlcmVuY2Ugb3RoZXIgdGFibGVzXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdjYWtlcyc6IHtcbiAgICAgICAgICBfd3JpdGVDYWtlUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdidWZmZXRzJzoge1xuICAgICAgICAgIF93cml0ZUJ1ZmZldFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogdjggaWdub3JlIGVuZCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlSW5ncmVkaWVudFJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogSnNvbixcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IHBhcmVudENvbHVtbk5hbWUgaW4gcGFyZW50Um93KSB7XG4gICAgaWYgKHBhcmVudENvbHVtbk5hbWUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudENvbHVtbk5hbWUuZW5kc1dpdGgoJ1JlZicpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IHBhcmVudENvbHVtbk5hbWUuc2xpY2UoMCwgLTMpO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IHBhcmVudFJvd1twYXJlbnRDb2x1bW5OYW1lXSBhcyBzdHJpbmc7XG5cbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUxheWVyUmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBMYXllcixcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IHBhcmVudFJvdy5pbmdyZWRpZW50c1RhYmxlO1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IHNsaWNlSWQgaW4gcGFyZW50Um93LmFzc2lnbikge1xuICAgIGlmIChzbGljZUlkLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2xpY2VIYXNoID0gcGFyZW50Um93LmFzc2lnbltzbGljZUlkXSBhcyBzdHJpbmc7XG5cbiAgICBfd3JpdGUocmVzdWx0LCBjaGlsZFRhYmxlTmFtZSwgc2xpY2VIYXNoLCBwYXJlbnRUYWJsZU5hbWUsIHBhcmVudFJvd0hhc2gpO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQ2FrZVJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogQ2FrZSxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGxheWVyIGluIHBhcmVudFJvdy5sYXllcnMpIHtcbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IHBhcmVudFJvdy5sYXllcnNUYWJsZTtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3cubGF5ZXJzW2xheWVyXSBhcyBzdHJpbmc7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVCdWZmZXRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEJ1ZmZldCxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50Um93Lml0ZW1zKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBpdGVtLnRhYmxlO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IGl0ZW0ucmVmO1xuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlID0gKFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuICBjaGlsZFRhYmxlTmFtZTogc3RyaW5nLFxuICBjaGlsZFJvd0hhc2g6IHN0cmluZyxcbiAgcGFyZW50VGFibGVOYW1lOiBzdHJpbmcsXG4gIHBhcmVudFJvd0hhc2g6IHN0cmluZyxcbikgPT4ge1xuICBjb25zdCByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZSA9IChyZXN1bHRbY2hpbGRUYWJsZU5hbWVdID8/PSB7fSk7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93ID0gKHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlW2NoaWxkUm93SGFzaF0gPz89XG4gICAge30pO1xuXG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV0gPz89IHt9O1xuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdW3BhcmVudFJvd0hhc2hdID8/PSB7fTtcbn07XG4iXSwibmFtZXMiOlsiZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBdUJPLE1BQU0sV0FBTixNQUFNLFNBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS25CLFlBQTRCLElBQVE7QUFpQ3BDO0FBQUE7QUFBQTtBQUFBLDhDQUFxQixZQUFZO0FBQy9CLFlBQU0sV0FBcUI7QUFBQSxRQUN6QixLQUFLO0FBQUEsUUFDTCxNQUFNO0FBQUEsUUFDTixRQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixVQUFVO0FBQUEsUUFFVixTQUFTO0FBQUEsVUFDUCxFQUFFLEtBQUssU0FBUyxNQUFNLFNBQVM7QUFBQSxVQUMvQixFQUFFLEtBQUssU0FBUyxNQUFNLFNBQVM7QUFBQSxVQUMvQixFQUFFLEtBQUssZUFBZSxNQUFNLFNB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rljson/io",
3
- "version": "0.0.34",
3
+ "version": "0.0.36",
4
4
  "packageManager": "pnpm@10.9.0",
5
5
  "description": "Low level interface for reading and writing RLJSON data",
6
6
  "homepage": "https://github.com/rljson/io",
@@ -29,7 +29,7 @@
29
29
  "updateGoldens": "cross-env UPDATE_GOLDENS=true pnpm test"
30
30
  },
31
31
  "devDependencies": {
32
- "@types/node": "^22.15.17",
32
+ "@types/node": "^22.15.18",
33
33
  "@typescript-eslint/eslint-plugin": "^8.32.1",
34
34
  "@typescript-eslint/parser": "^8.32.1",
35
35
  "@vitest/coverage-v8": "^3.1.3",