@rljson/io 0.0.46 → 0.0.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/conformance-tests/io-conformance.spec.ts +5 -144
- package/dist/io-mem.d.ts +0 -4
- package/dist/io-peer.d.ts +0 -9
- package/dist/io-server.d.ts +0 -1
- package/dist/io-tools.d.ts +0 -32
- package/dist/io.d.ts +0 -8
- package/dist/io.js +1 -75
- package/dist/peer-socket-mock.d.ts +8 -46
- package/dist/socket.d.ts +0 -7
- package/package.json +6 -6
|
@@ -16,34 +16,16 @@
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
import { hip, hsh, rmhsh } from '@rljson/hash';
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
Rljson,
|
|
23
|
-
TableCfg,
|
|
24
|
-
TableType,
|
|
25
|
-
} from '@rljson/rljson';
|
|
26
|
-
|
|
27
|
-
import {
|
|
28
|
-
afterAll,
|
|
29
|
-
afterEach,
|
|
30
|
-
beforeAll,
|
|
31
|
-
beforeEach,
|
|
32
|
-
describe,
|
|
33
|
-
expect,
|
|
34
|
-
it,
|
|
35
|
-
vi,
|
|
36
|
-
} from 'vitest';
|
|
19
|
+
import { addColumnsToTableCfg, exampleTableCfg, Rljson, TableCfg, TableType } from '@rljson/rljson';
|
|
20
|
+
|
|
21
|
+
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from 'vitest';
|
|
37
22
|
|
|
38
23
|
import { Io, IoTestSetup, IoTools } from '@rljson/io';
|
|
39
24
|
|
|
40
|
-
import {
|
|
41
|
-
testMemSetup,
|
|
42
|
-
testPeerServerSetup,
|
|
43
|
-
testPeerSetup,
|
|
44
|
-
} from './io-conformance.setup.ts';
|
|
25
|
+
import { testMemSetup, testPeerServerSetup, testPeerSetup } from './io-conformance.setup.ts';
|
|
45
26
|
import { expectGolden, ExpectGoldenOptions } from './setup/goldens.ts';
|
|
46
27
|
|
|
28
|
+
|
|
47
29
|
const ego: ExpectGoldenOptions = {
|
|
48
30
|
npmUpdateGoldensEnabled: false,
|
|
49
31
|
};
|
|
@@ -1028,127 +1010,6 @@ export const runIoConformanceTests = (
|
|
|
1028
1010
|
);
|
|
1029
1011
|
});
|
|
1030
1012
|
});
|
|
1031
|
-
|
|
1032
|
-
describe('observeTable(table, callback)', () => {
|
|
1033
|
-
it('should call listener on table changes', async () => {
|
|
1034
|
-
//Create example table and add initial data
|
|
1035
|
-
await createExampleTable('table1');
|
|
1036
|
-
await io.write({
|
|
1037
|
-
data: {
|
|
1038
|
-
table1: {
|
|
1039
|
-
_type: 'components',
|
|
1040
|
-
_data: [{ a: 'a1' }],
|
|
1041
|
-
},
|
|
1042
|
-
},
|
|
1043
|
-
});
|
|
1044
|
-
|
|
1045
|
-
//Create listener
|
|
1046
|
-
const cb = vi.fn();
|
|
1047
|
-
|
|
1048
|
-
//Data to write
|
|
1049
|
-
const data = {
|
|
1050
|
-
table1: {
|
|
1051
|
-
_type: 'components',
|
|
1052
|
-
_data: [{ a: 'a2' }],
|
|
1053
|
-
},
|
|
1054
|
-
} as Rljson;
|
|
1055
|
-
|
|
1056
|
-
//Subscribe to changes
|
|
1057
|
-
io.observeTable('table1', cb);
|
|
1058
|
-
|
|
1059
|
-
//Write new data triggering the listener
|
|
1060
|
-
await io.write({
|
|
1061
|
-
data,
|
|
1062
|
-
});
|
|
1063
|
-
|
|
1064
|
-
//Check that the listener was called with the latest data only
|
|
1065
|
-
expect(cb).toHaveBeenCalledTimes(1);
|
|
1066
|
-
expect(cb).toHaveBeenCalledWith({ table1: hsh(data.table1) });
|
|
1067
|
-
});
|
|
1068
|
-
});
|
|
1069
|
-
|
|
1070
|
-
describe('unobserveTable(table, callback) and unobserveAll(table)', () => {
|
|
1071
|
-
it('should not call listener after unobserve', async () => {
|
|
1072
|
-
await createExampleTable('table1');
|
|
1073
|
-
|
|
1074
|
-
const cb = vi.fn();
|
|
1075
|
-
const data = {
|
|
1076
|
-
table1: {
|
|
1077
|
-
_type: 'components',
|
|
1078
|
-
_data: [{ a: 'a2' }],
|
|
1079
|
-
},
|
|
1080
|
-
} as Rljson;
|
|
1081
|
-
|
|
1082
|
-
//Subscribe to changes
|
|
1083
|
-
io.observeTable('table1', cb);
|
|
1084
|
-
|
|
1085
|
-
await io.write({
|
|
1086
|
-
data,
|
|
1087
|
-
});
|
|
1088
|
-
|
|
1089
|
-
//Unsubscribe
|
|
1090
|
-
io.unobserveTable('table1', cb);
|
|
1091
|
-
|
|
1092
|
-
await io.write({
|
|
1093
|
-
data,
|
|
1094
|
-
});
|
|
1095
|
-
|
|
1096
|
-
expect(cb).toHaveBeenCalledTimes(1);
|
|
1097
|
-
});
|
|
1098
|
-
});
|
|
1099
|
-
describe('unobserveAll(table)', () => {
|
|
1100
|
-
it('should not call listener after unobserve all', async () => {
|
|
1101
|
-
await createExampleTable('table1');
|
|
1102
|
-
|
|
1103
|
-
const cb = vi.fn();
|
|
1104
|
-
const data = {
|
|
1105
|
-
table1: {
|
|
1106
|
-
_type: 'components',
|
|
1107
|
-
_data: [{ a: 'a2' }],
|
|
1108
|
-
},
|
|
1109
|
-
} as Rljson;
|
|
1110
|
-
|
|
1111
|
-
//Subscribe to changes
|
|
1112
|
-
io.observeTable('table1', cb);
|
|
1113
|
-
|
|
1114
|
-
await io.write({
|
|
1115
|
-
data,
|
|
1116
|
-
});
|
|
1117
|
-
|
|
1118
|
-
//Unsubscribe all listeners from table1
|
|
1119
|
-
io.unobserveAll('table1');
|
|
1120
|
-
|
|
1121
|
-
await io.write({
|
|
1122
|
-
data,
|
|
1123
|
-
});
|
|
1124
|
-
|
|
1125
|
-
expect(cb).toHaveBeenCalledTimes(1);
|
|
1126
|
-
});
|
|
1127
|
-
});
|
|
1128
|
-
|
|
1129
|
-
describe('observers(table)', () => {
|
|
1130
|
-
it('get a list of all observers', async () => {
|
|
1131
|
-
await createExampleTable('table1');
|
|
1132
|
-
await createExampleTable('table2');
|
|
1133
|
-
|
|
1134
|
-
const cb1 = vi.fn();
|
|
1135
|
-
const cb2 = vi.fn();
|
|
1136
|
-
|
|
1137
|
-
//Subscribe to changes
|
|
1138
|
-
io.observeTable('table1', cb1);
|
|
1139
|
-
io.observeTable('table1', cb2);
|
|
1140
|
-
io.observeTable('table2', cb2);
|
|
1141
|
-
|
|
1142
|
-
const observers = io.observers('table1');
|
|
1143
|
-
expect(observers.length).toBe(2);
|
|
1144
|
-
expect(observers).toContain(cb1);
|
|
1145
|
-
expect(observers).toContain(cb2);
|
|
1146
|
-
|
|
1147
|
-
const observers2 = io.observers('table2');
|
|
1148
|
-
expect(observers2.length).toBe(1);
|
|
1149
|
-
expect(observers2).toContain(cb2);
|
|
1150
|
-
});
|
|
1151
|
-
});
|
|
1152
1013
|
});
|
|
1153
1014
|
};
|
|
1154
1015
|
|
package/dist/io-mem.d.ts
CHANGED
|
@@ -49,8 +49,4 @@ export declare class IoMem implements Io {
|
|
|
49
49
|
private _write;
|
|
50
50
|
private _readRows;
|
|
51
51
|
_removeNullValues(rljson: Rljson): void;
|
|
52
|
-
observeTable(table: string, callback: (data: Rljson) => void): void;
|
|
53
|
-
unobserveTable(table: string, callback: (data: Rljson) => void): void;
|
|
54
|
-
unobserveAll(table: string): void;
|
|
55
|
-
observers(table: string): ((data: Rljson) => void)[];
|
|
56
52
|
}
|
package/dist/io-peer.d.ts
CHANGED
|
@@ -5,7 +5,6 @@ import { Socket } from './socket.ts';
|
|
|
5
5
|
export declare class IoPeer implements Io {
|
|
6
6
|
private _socket;
|
|
7
7
|
isOpen: boolean;
|
|
8
|
-
private _ioTools;
|
|
9
8
|
constructor(_socket: Socket);
|
|
10
9
|
/**
|
|
11
10
|
*
|
|
@@ -88,13 +87,5 @@ export declare class IoPeer implements Io {
|
|
|
88
87
|
* @returns A promise that resolves to the number of rows in the specified table.
|
|
89
88
|
*/
|
|
90
89
|
rowCount(table: string): Promise<number>;
|
|
91
|
-
/** Start observing changes on a specific table */
|
|
92
|
-
observeTable(table: string, callback: (data: Rljson) => void): Promise<void>;
|
|
93
|
-
/** Stop observing changes on a specific table */
|
|
94
|
-
unobserveTable(table: string, callback: (data: Rljson) => void): void;
|
|
95
|
-
/** Stop observing all changes on a specific table */
|
|
96
|
-
unobserveAll(table: string): void;
|
|
97
|
-
/** Returns all observers for a specific table */
|
|
98
|
-
observers(table: string): ((data: Rljson) => void)[];
|
|
99
90
|
static example: () => Promise<IoPeer>;
|
|
100
91
|
}
|
package/dist/io-server.d.ts
CHANGED
|
@@ -21,7 +21,6 @@ export declare class IoServer {
|
|
|
21
21
|
private _addTransportLayer;
|
|
22
22
|
/**
|
|
23
23
|
* Creates or extends a table with the given configuration.
|
|
24
|
-
* Also sets up observation for the new or extended table on all connected sockets.
|
|
25
24
|
* @param request - An object containing the table configuration.
|
|
26
25
|
*/
|
|
27
26
|
private createOrExtendTable;
|
package/dist/io-tools.d.ts
CHANGED
|
@@ -6,7 +6,6 @@ export type IoObserver = (data: Rljson) => void;
|
|
|
6
6
|
*/
|
|
7
7
|
export declare class IoTools {
|
|
8
8
|
readonly io: Io;
|
|
9
|
-
private _observers;
|
|
10
9
|
/**
|
|
11
10
|
* Constructor
|
|
12
11
|
* @param io The Io interface to use
|
|
@@ -56,37 +55,6 @@ export declare class IoTools {
|
|
|
56
55
|
* Returns a list of all column names of a given table
|
|
57
56
|
*/
|
|
58
57
|
allColumnKeys(table: TableKey): Promise<string[]>;
|
|
59
|
-
/**
|
|
60
|
-
* Observes changes to a given table
|
|
61
|
-
* @param table - The table to observe
|
|
62
|
-
* @param observer - The observer function to call on changes
|
|
63
|
-
* @returns
|
|
64
|
-
*/
|
|
65
|
-
observeTable(table: string, observer: IoObserver): void;
|
|
66
|
-
/**
|
|
67
|
-
* Stops observing changes to a given table
|
|
68
|
-
* @param table - The table to stop observing
|
|
69
|
-
* @param observer - The observer function to remove
|
|
70
|
-
* @returns
|
|
71
|
-
*/
|
|
72
|
-
unobserveTable(table: string, observer: IoObserver): void;
|
|
73
|
-
/**
|
|
74
|
-
* Stops observing all tables or all changes on a specific table
|
|
75
|
-
* @param table - The table to stop observing or undefined to stop observing all tables
|
|
76
|
-
*/
|
|
77
|
-
unobserveAll(table?: string): void;
|
|
78
|
-
/**
|
|
79
|
-
* Returns all observers of a given table
|
|
80
|
-
* @param table - The table to get observers for
|
|
81
|
-
* @returns A list of observers for the given table
|
|
82
|
-
*/
|
|
83
|
-
observers(table: string): IoObserver[];
|
|
84
|
-
/**
|
|
85
|
-
* Notifies all observers of a given table
|
|
86
|
-
* @param table - The table to notify observers of
|
|
87
|
-
* @param data - The data to pass to the observers
|
|
88
|
-
*/
|
|
89
|
-
notifyObservers(table: string, data: Rljson): void;
|
|
90
58
|
/**
|
|
91
59
|
* Throws when a column does not exist in a given table
|
|
92
60
|
* @param table - The table to check
|
package/dist/io.d.ts
CHANGED
|
@@ -52,13 +52,5 @@ export interface Io {
|
|
|
52
52
|
}): Promise<Rljson>;
|
|
53
53
|
/** Returns the number of rows in the given table */
|
|
54
54
|
rowCount(table: string): Promise<number>;
|
|
55
|
-
/** Observe changes on a specific table */
|
|
56
|
-
observeTable(table: string, callback: (data: Rljson) => void): void;
|
|
57
|
-
/** Stop observing changes on a specific table */
|
|
58
|
-
unobserveTable(table: string, callback: (data: Rljson) => void): void;
|
|
59
|
-
/** Stop observing all changes on a specific table */
|
|
60
|
-
unobserveAll(table?: string): void;
|
|
61
|
-
/** Returns all observers for a specific table */
|
|
62
|
-
observers(table: string): ((data: Rljson) => void)[];
|
|
63
55
|
}
|
|
64
56
|
export declare const exampleIo = "Checkout @rljson/io-mem for an example implementation";
|
package/dist/io.js
CHANGED
|
@@ -11,7 +11,6 @@ class IoTools {
|
|
|
11
11
|
constructor(io) {
|
|
12
12
|
this.io = io;
|
|
13
13
|
}
|
|
14
|
-
_observers = /* @__PURE__ */ new Map();
|
|
15
14
|
/**
|
|
16
15
|
* Returns the table configuration of the tableCfgs table.
|
|
17
16
|
*/
|
|
@@ -155,66 +154,6 @@ class IoTools {
|
|
|
155
154
|
const result = tableCfg.columns.map((column) => column.key);
|
|
156
155
|
return result;
|
|
157
156
|
}
|
|
158
|
-
/**
|
|
159
|
-
* Observes changes to a given table
|
|
160
|
-
* @param table - The table to observe
|
|
161
|
-
* @param observer - The observer function to call on changes
|
|
162
|
-
* @returns
|
|
163
|
-
*/
|
|
164
|
-
observeTable(table, observer) {
|
|
165
|
-
if (!this._observers.has(table)) {
|
|
166
|
-
this._observers.set(table, []);
|
|
167
|
-
}
|
|
168
|
-
this._observers.get(table).push(observer);
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Stops observing changes to a given table
|
|
172
|
-
* @param table - The table to stop observing
|
|
173
|
-
* @param observer - The observer function to remove
|
|
174
|
-
* @returns
|
|
175
|
-
*/
|
|
176
|
-
unobserveTable(table, observer) {
|
|
177
|
-
if (!this._observers.has(table)) return;
|
|
178
|
-
const observers = this._observers.get(table);
|
|
179
|
-
const index = observers.indexOf(observer);
|
|
180
|
-
if (index !== -1) {
|
|
181
|
-
observers.splice(index, 1);
|
|
182
|
-
}
|
|
183
|
-
if (observers.length === 0) {
|
|
184
|
-
this._observers.delete(table);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Stops observing all tables or all changes on a specific table
|
|
189
|
-
* @param table - The table to stop observing or undefined to stop observing all tables
|
|
190
|
-
*/
|
|
191
|
-
unobserveAll(table) {
|
|
192
|
-
if (table) {
|
|
193
|
-
this._observers.delete(table);
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
this._observers.clear();
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Returns all observers of a given table
|
|
200
|
-
* @param table - The table to get observers for
|
|
201
|
-
* @returns A list of observers for the given table
|
|
202
|
-
*/
|
|
203
|
-
observers(table) {
|
|
204
|
-
return this._observers.get(table) ?? [];
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Notifies all observers of a given table
|
|
208
|
-
* @param table - The table to notify observers of
|
|
209
|
-
* @param data - The data to pass to the observers
|
|
210
|
-
*/
|
|
211
|
-
notifyObservers(table, data) {
|
|
212
|
-
if (!this._observers.has(table)) return;
|
|
213
|
-
const observers = this._observers.get(table);
|
|
214
|
-
for (const observer of observers) {
|
|
215
|
-
observer(data);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
157
|
/**
|
|
219
158
|
* Throws when a column does not exist in a given table
|
|
220
159
|
* @param table - The table to check
|
|
@@ -502,7 +441,6 @@ class IoMem {
|
|
|
502
441
|
}
|
|
503
442
|
}
|
|
504
443
|
this._ioTools.sortTableDataAndUpdateHash(oldTable);
|
|
505
|
-
this._ioTools.notifyObservers(table, { [table]: newTable });
|
|
506
444
|
}
|
|
507
445
|
this._updateGlobalHash();
|
|
508
446
|
}
|
|
@@ -549,18 +487,6 @@ class IoMem {
|
|
|
549
487
|
}
|
|
550
488
|
});
|
|
551
489
|
}
|
|
552
|
-
observeTable(table, callback) {
|
|
553
|
-
this._ioTools.observeTable(table, callback);
|
|
554
|
-
}
|
|
555
|
-
unobserveTable(table, callback) {
|
|
556
|
-
this._ioTools.unobserveTable(table, callback);
|
|
557
|
-
}
|
|
558
|
-
unobserveAll(table) {
|
|
559
|
-
this._ioTools.unobserveAll(table);
|
|
560
|
-
}
|
|
561
|
-
observers(table) {
|
|
562
|
-
return this._ioTools.observers(table);
|
|
563
|
-
}
|
|
564
490
|
}
|
|
565
491
|
// @license
|
|
566
492
|
const exampleTestSetup = () => {
|
|
@@ -686,4 +612,4 @@ export {
|
|
|
686
612
|
exampleIo,
|
|
687
613
|
exampleTestSetup
|
|
688
614
|
};
|
|
689
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8tdGVzdC1zZXR1cC50cyIsIi4uL3NyYy9pby50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG4gIHRocm93T25JbnZhbGlkVGFibGVDZmcsXG4gIHZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuZXhwb3J0IHR5cGUgSW9PYnNlcnZlciA9IChkYXRhOiBSbGpzb24pID0+IHZvaWQ7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb1Rvb2xzIHtcbiAgcHJpdmF0ZSBfb2JzZXJ2ZXJzOiBNYXA8c3RyaW5nLCBJb09ic2VydmVyW10+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gaW8gVGhlIElvIGludGVyZmFjZSB0byB1c2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBpbzogSW8pIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhYmxlQ2ZncyB0YWJsZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVDZmdzVGFibGVDZmcoKSB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBoaXA8VGFibGVDZmc+KHtcbiAgICAgIF9oYXNoOiAnJyxcbiAgICAgIGtleTogJ3RhYmxlQ2ZncycsXG4gICAgICB0eXBlOiAndGFibGVDZmdzJyxcbiAgICAgIGlzSGVhZDogZmFsc2UsXG4gICAgICBpc1Jvb3Q6IGZhbHNlLFxuICAgICAgaXNTaGFyZWQ6IHRydWUsXG4gICAgICBwcmV2aW91czogJycsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBrZXk6ICdfaGFzaCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAna2V5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICd0eXBlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdpc0hlYWQnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdpc1Jvb3QnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdpc1NoYXJlZCcsIHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICB7IGtleTogJ3ByZXZpb3VzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdjb2x1bW5zJywgdHlwZTogJ2pzb25BcnJheScgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGFibGVDZmc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHJldmlzaW9ucyB0YWJsZS5cbiAgICovXG4gIGluaXRSZXZpc2lvbnNUYWJsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZUNmZzogVGFibGVDZmcgPSB7XG4gICAgICBrZXk6ICdyZXZpc2lvbnMnLFxuICAgICAgdHlwZTogJ3JldmlzaW9ucycsXG4gICAgICBpc0hlYWQ6IHRydWUsXG4gICAgICBpc1Jvb3Q6IHRydWUsXG4gICAgICBpc1NoYXJlZDogZmFsc2UsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBrZXk6ICdfaGFzaCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndGFibGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3ByZWRlY2Vzc29yJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdzdWNjZXNzb3InLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3RpbWVzdGFtcCcsIHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgIHsga2V5OiAnaWQnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5pby5jcmVhdGVPckV4dGVuZFRhYmxlKHsgdGFibGVDZmcgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEV4YW1wbGUgb2JqZWN0IGZvciB0ZXN0IHB1cnBvc2VzXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGlvIHRvb2xzXG4gICAqL1xuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpby5pbml0KCk7XG4gICAgYXdhaXQgaW8uaXNSZWFkeSgpO1xuICAgIHJldHVybiBuZXcgSW9Ub29scyhpbyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRG9lc05vdEV4aXN0KHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuaW8udGFibGVFeGlzdHModGFibGUpO1xuICAgIGlmICghZXhpc3RzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIGFueSBvZiB0aGUgdGFibGVzIGluIHJsanNvbiBkbyBub3QgZXhpc3RcbiAgICogQHBhcmFtIHJsanNvbiAtIFRoZSBSbGpzb24gb2JqZWN0IHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJsanNvbjogUmxqc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMocmxqc29uLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZUtleSk7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGVLZXl9XCIgbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdUYWJsZXMgPSAoZSBhcyBBcnJheTxhbnk+KS5tYXAoKGUpID0+IGUudGFibGVLZXkpO1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIHRhYmxlcyBkbyBub3QgZXhpc3Q6ICR7bWlzc2luZ1RhYmxlcy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRhYmxlIGNmZ3Mgb2YgYWxsIHRhYmxlc1xuICAgKiBAcmV0dXJucyBUaGUgdGFibGUgY29uZmlndXJhdGlvbiBvZiBhbGwgdGFibGVzXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPiB7XG4gICAgY29uc3QgdGFibGVzID0gYXdhaXQgdGhpcy5pby5yYXdUYWJsZUNmZ3MoKTtcblxuICAgIC8vIFRha2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggdHlwZSBrZXlcbiAgICBjb25zdCBuZXdlc3RWZXJzaW9uOiBSZWNvcmQ8VGFibGVLZXksIFRhYmxlQ2ZnPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSB0YWJsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzW2ldO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV07XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgIGlmICghZXhpc3RpbmcgfHwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGggPCB0YWJsZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV0gPSB0YWJsZTtcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBlbmQgKi9cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSB0YWJsZXMgYnkga2V5XG4gICAgY29uc3QgcmVzdWx0RGF0YSA9IE9iamVjdC52YWx1ZXMobmV3ZXN0VmVyc2lvbikuc29ydCgoYSwgYikgPT4ge1xuICAgICAgaWYgKGEua2V5IDwgYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGEua2V5ID4gYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICAgIC8qIHY4IGlnbm9yZSBlbmQgKi9cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCB3aXRoIGFsbCB0YWJsZSBuYW1lc1xuICAgKi9cbiAgYXN5bmMgYWxsVGFibGVLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgdGhpcy50YWJsZUNmZ3MoKSkubWFwKChlKSA9PiBlLmtleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFibGVcbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZnKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8VGFibGVDZmc+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmdPck51bGwodGFibGUpO1xuICAgIGlmICghdGFibGVDZmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZUNmZyE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhYmxlIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG5cbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZnT3JOdWxsKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8VGFibGVDZmcgfCBudWxsPiB7XG4gICAgY29uc3QgdGFibGVDZmdzID0gYXdhaXQgdGhpcy50YWJsZUNmZ3MoKTtcbiAgICBjb25zdCB0YWJsZUNmZyA9IHRhYmxlQ2Zncy5maW5kKChlKSA9PiBlLmtleSA9PT0gdGFibGUpO1xuICAgIHJldHVybiB0YWJsZUNmZyA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBjb2x1bW4gbmFtZXMgb2YgYSBnaXZlbiB0YWJsZVxuICAgKi9cbiAgYXN5bmMgYWxsQ29sdW1uS2V5cyh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlKTtcbiAgICBjb25zdCByZXN1bHQgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmVzIGNoYW5nZXMgdG8gYSBnaXZlbiB0YWJsZVxuICAgKiBAcGFyYW0gdGFibGUgLSBUaGUgdGFibGUgdG8gb2JzZXJ2ZVxuICAgKiBAcGFyYW0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgZnVuY3Rpb24gdG8gY2FsbCBvbiBjaGFuZ2VzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBvYnNlcnZlVGFibGUodGFibGU6IHN0cmluZywgb2JzZXJ2ZXI6IElvT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX29ic2VydmVycy5oYXModGFibGUpKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlcnMuc2V0KHRhYmxlLCBbXSk7XG4gICAgfVxuICAgIHRoaXMuX29ic2VydmVycy5nZXQodGFibGUpIS5wdXNoKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyBvYnNlcnZpbmcgY2hhbmdlcyB0byBhIGdpdmVuIHRhYmxlXG4gICAqIEBwYXJhbSB0YWJsZSAtIFRoZSB0YWJsZSB0byBzdG9wIG9ic2VydmluZ1xuICAgKiBAcGFyYW0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgZnVuY3Rpb24gdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB1bm9ic2VydmVUYWJsZSh0YWJsZTogc3RyaW5nLCBvYnNlcnZlcjogSW9PYnNlcnZlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fb2JzZXJ2ZXJzLmhhcyh0YWJsZSkpIHJldHVybjtcbiAgICBjb25zdCBvYnNlcnZlcnMgPSB0aGlzLl9vYnNlcnZlcnMuZ2V0KHRhYmxlKSE7XG4gICAgY29uc3QgaW5kZXggPSBvYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgb2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIGlmIChvYnNlcnZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlcnMuZGVsZXRlKHRhYmxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgb2JzZXJ2aW5nIGFsbCB0YWJsZXMgb3IgYWxsIGNoYW5nZXMgb24gYSBzcGVjaWZpYyB0YWJsZVxuICAgKiBAcGFyYW0gdGFibGUgLSBUaGUgdGFibGUgdG8gc3RvcCBvYnNlcnZpbmcgb3IgdW5kZWZpbmVkIHRvIHN0b3Agb2JzZXJ2aW5nIGFsbCB0YWJsZXNcbiAgICovXG4gIHVub2JzZXJ2ZUFsbCh0YWJsZT86IHN0cmluZykge1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXJzLmRlbGV0ZSh0YWJsZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX29ic2VydmVycy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIG9ic2VydmVycyBvZiBhIGdpdmVuIHRhYmxlXG4gICAqIEBwYXJhbSB0YWJsZSAtIFRoZSB0YWJsZSB0byBnZXQgb2JzZXJ2ZXJzIGZvclxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2Ygb2JzZXJ2ZXJzIGZvciB0aGUgZ2l2ZW4gdGFibGVcbiAgICovXG5cbiAgb2JzZXJ2ZXJzKHRhYmxlOiBzdHJpbmcpOiBJb09ic2VydmVyW10ge1xuICAgIHJldHVybiB0aGlzLl9vYnNlcnZlcnMuZ2V0KHRhYmxlKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGEgZ2l2ZW4gdGFibGVcbiAgICogQHBhcmFtIHRhYmxlIC0gVGhlIHRhYmxlIHRvIG5vdGlmeSBvYnNlcnZlcnMgb2ZcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBvYnNlcnZlcnNcbiAgICovXG4gIG5vdGlmeU9ic2VydmVycyh0YWJsZTogc3RyaW5nLCBkYXRhOiBSbGpzb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX29ic2VydmVycy5oYXModGFibGUpKSByZXR1cm47XG4gICAgY29uc3Qgb2JzZXJ2ZXJzID0gdGhpcy5fb2JzZXJ2ZXJzLmdldCh0YWJsZSkhO1xuICAgIGZvciAoY29uc3Qgb2JzZXJ2ZXIgb2Ygb2JzZXJ2ZXJzKSB7XG4gICAgICBvYnNlcnZlcihkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIHdoZW4gYSBjb2x1bW4gZG9lcyBub3QgZXhpc3QgaW4gYSBnaXZlbiB0YWJsZVxuICAgKiBAcGFyYW0gdGFibGUgLSBUaGUgdGFibGUgdG8gY2hlY2tcbiAgICogQHBhcmFtIGNvbHVtbnMgLSBUaGUgY29sdW1uIHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgdGFibGU6IFRhYmxlS2V5LFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbHVtbikgPT4gIWNvbHVtbktleXMuaW5jbHVkZXMoY29sdW1uKSxcbiAgICApO1xuICAgIGlmIChtaXNzaW5nQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIGNvbHVtbnMgZG8gbm90IGV4aXN0IGluIHRhYmxlIFwiJHt0YWJsZX1cIjogJHttaXNzaW5nQ29sdW1ucy5qb2luKFxuICAgICAgICAgICcsICcsXG4gICAgICAgICl9LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIHRhYmxlIHVwZGF0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRhYmxlXG4gICAqIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh1cGRhdGU6IFRhYmxlQ2ZnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ID0gYEludmFsaWQgdXBkYXRlIG9mIHRhYmxlIGFibGUgXCIke3VwZGF0ZS5rZXl9XCJgO1xuXG4gICAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyh1cGRhdGUpO1xuXG4gICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHVwZGF0ZS5rZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gSGF2ZSBjb2x1bW5zIGJlZW4gZGVsZXRlZD9cbiAgICAgIGlmIChleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA+IHVwZGF0ZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1uS2V5cyA9IGV4aXN0aW5nLmNvbHVtbnNcbiAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChrZXkpID0+ICF1cGRhdGUuY29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlbGV0ZWRDb2x1bW5LZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1ucyA9IGRlbGV0ZWRDb2x1bW5LZXlzLmpvaW4oJywgJyk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogQ29sdW1ucyBtdXN0IG5vdCBiZSBkZWxldGVkLiBgICtcbiAgICAgICAgICAgICAgYERlbGV0ZWQgY29sdW1uczogJHtkZWxldGVkQ29sdW1uc319YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIGtleXMgY2hhbmdlZD9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGlmIChiZWZvcmUgIT09IGFmdGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4ga2V5cyBtdXN0IG5vdCBjaGFuZ2UhIGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIFwiJHtiZWZvcmV9XCIgd2FzIHJlbmFtZWQgaW50byBcIiR7YWZ0ZXJ9XCIuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIHR5cGVzIGNoYW5nZWQ/XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGV4aXN0aW5nLmNvbHVtbnNbaV0udHlwZTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS50eXBlO1xuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIHR5cGVzIG11c3Qgbm90IGNoYW5nZSEgYCArXG4gICAgICAgICAgICAgIGBUeXBlIG9mIGNvbHVtbiBcIiR7Y29sdW1ufVwiIHdhcyBjaGFuZ2VkIGZyb20gXCIke2JlZm9yZX1cIiB0byAke2FmdGVyfS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIHRoZSBkYXRhIGluIHRoZSB0YWJsZSBkbyBub3QgbWF0Y2ggdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRGF0YURvZXNOb3RNYXRjaENmZyhkYXRhOiBSbGpzb24pIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBhd2FpdCBpdGVyYXRlVGFibGVzKGRhdGEsIGFzeW5jICh0YWJsZUtleSkgPT4ge1xuICAgICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlS2V5KTtcbiAgICAgIGNvbnN0IHRhYmxlID0gZGF0YVt0YWJsZUtleV07XG5cbiAgICAgIC8vIElnbm9yZSB0YWJsZUNmZ3MgdGFibGVcbiAgICAgIGlmICh0YWJsZS5fdHlwZSA9PT0gJ3RhYmxlQ2ZncycpIHJldHVybjtcblxuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVSbGpzb25BZ2FpbnN0VGFibGVDZmcodGFibGUuX2RhdGEsIHRhYmxlQ2ZnKSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRhYmxlIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIGNvbmZpZ3VyYXRpb24uXFxuXFxuRXJyb3JzOlxcbiR7ZXJyb3JzXG4gICAgICAgICAgLm1hcCgoZSkgPT4gYC0gJHtlfWApXG4gICAgICAgICAgLmpvaW4oJ1xcbicpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgZGF0YSBvZiBhIHRhYmxlIGJ5IHRoZSBoYXNoIGFuZCB1cGRhdGVzIHRoZSB0YWJsZSBoYXNoIGluIHBsYWNlXG4gICAqL1xuICBzb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZTogVGFibGVUeXBlKTogdm9pZCB7XG4gICAgdGFibGUuX2RhdGEuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgaGFzaEEgPSBhLl9oYXNoIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGhhc2hCID0gYi5faGFzaCBhcyBzdHJpbmc7XG4gICAgICBpZiAoaGFzaEEgPCBoYXNoQikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZiAoaGFzaEEgPiBoYXNoQikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0ICovXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgICAgLyogdjggaWdub3JlIGVuZCAqL1xuICAgIH0pO1xuXG4gICAgdGFibGUuX2hhc2ggPSAnJztcbiAgICBoaXAodGFibGUsIHtcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICAgIHRocm93T25Xcm9uZ0hhc2hlczogZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBoaXAsIGhzaCB9IGZyb20gJ0BybGpzb24vaGFzaCc7XG5pbXBvcnQgeyBJc1JlYWR5IH0gZnJvbSAnQHJsanNvbi9pcy1yZWFkeSc7XG5pbXBvcnQgeyBjb3B5LCBlcXVhbHMsIEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQge1xuICBDb250ZW50VHlwZSxcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9Ub29scyB9IGZyb20gJy4vaW8tdG9vbHMudHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuLyoqXG4gKiBJbi1NZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJsanNvbiBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb01lbSBpbXBsZW1lbnRzIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIENvbnN0cnVjdG9yICYgZXhhbXBsZVxuXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xuICB9XG5cbiAgc3RhdGljIGV4YW1wbGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW8gPSBuZXcgSW9NZW0oKTtcbiAgICBhd2FpdCBpby5pbml0KCk7XG4gICAgcmV0dXJuIGlvO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmFsXG4gIGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVhZHkucHJvbWlzZTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wKCk7XG4gIH1cblxuICBhc3luYyBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gTWV0YSBEYXRhXG5cbiAgYXN5bmMgY29udGVudFR5cGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPENvbnRlbnRUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRUeXBlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFJvd3NcblxuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRSb3dzKHJlcXVlc3QpO1xuICB9XG5cbiAgYXN5bmMgcm93Q291bnQodGFibGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdGFibGVEYXRhID0gdGhpcy5fbWVtW3RhYmxlXSBhcyBUYWJsZVR5cGU7XG4gICAgaWYgKCF0YWJsZURhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRhYmxlRGF0YS5fZGF0YS5sZW5ndGgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFdyaXRlXG5cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93cml0ZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBUYWJsZSBtYW5hZ2VtZW50XG4gIGFzeW5jIHRhYmxlRXhpc3RzKHRhYmxlS2V5OiBUYWJsZUtleSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3RhYmxlS2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgcmV0dXJuIHRhYmxlID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByYXdUYWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPiB7XG4gICAgY29uc3QgdGFibGVzID0gdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YSBhcyBUYWJsZUNmZ1tdO1xuICAgIHJldHVybiB0YWJsZXM7XG4gIH1cblxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gIC8vIFByaXZhdGVcbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gIHByaXZhdGUgX2lvVG9vbHMhOiBJb1Rvb2xzO1xuXG4gIHByaXZhdGUgX2lzUmVhZHkgPSBuZXcgSXNSZWFkeSgpO1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9tZW06IFJsanNvbiA9IGhpcCh7fSBhcyBSbGpzb24pO1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9pbml0KCkge1xuICAgIHRoaXMuX2lvVG9vbHMgPSBuZXcgSW9Ub29scyh0aGlzKTtcbiAgICB0aGlzLl9pbml0VGFibGVDZmdzKCk7XG4gICAgdGhpcy5fdXBkYXRlR2xvYmFsSGFzaCgpO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMuaW5pdFJldmlzaW9uc1RhYmxlKCk7XG4gICAgaHNoKHRoaXMuX21lbSk7XG5cbiAgICB0aGlzLl9pc1JlYWR5LnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9pbml0VGFibGVDZmdzID0gKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gSW9Ub29scy50YWJsZUNmZ3NUYWJsZUNmZztcblxuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MgPSBoaXAoe1xuICAgICAgX3R5cGU6ICd0YWJsZUNmZ3MnLFxuICAgICAgX2RhdGE6IFt0YWJsZUNmZ10sXG4gICAgICBfdGFibGVDZmc6IHRhYmxlQ2ZnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9KTtcbiAgfTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfdXBkYXRlR2xvYmFsSGFzaCgpIHtcbiAgICAodGhpcy5fbWVtIGFzIGFueSkuX2hhc2ggPSAnJztcbiAgICBoaXAodGhpcy5fbWVtLCB7XG4gICAgICB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfdXBkYXRlVGFibGVIYXNoKHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3RhYmxlS2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX2hhc2ggPSAnJztcbiAgICBoaXAodGFibGUsIHsgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IGZhbHNlIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDoge1xuICAgIHRhYmxlQ2ZnOiBUYWJsZUNmZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBjb25maWcgaXMgY29tcGF0aWJsZVxuICAgIC8vIHdpdGggYW4gcG90ZW50aWFsIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGVDZmcgPSByZXF1ZXN0LnRhYmxlQ2ZnO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVJc05vdENvbXBhdGlibGUodGFibGVDZmcpO1xuXG4gICAgY29uc3QgeyBrZXkgfSA9IHRhYmxlQ2ZnO1xuXG4gICAgLy8gUmVjcmVhdGUgaGFzaGVzIGluIHRoZSBjYXNlIHRoZSBleGlzdGluZyBoYXNoZXMgYXJlIHdyb25nXG4gICAgY29uc3QgbmV3Q29uZmlnID0gaHNoKHRhYmxlQ2ZnKTtcblxuICAgIC8vIEZpbmQgYW4gZXhpc3RpbmcgdGFibGUgY29uZmlnIHdpdGggdGhlIHNhbWUgaGFzaFxuICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gYXdhaXQgdGhpcy5faW9Ub29scy50YWJsZUNmZ09yTnVsbChrZXkpO1xuXG4gICAgLy8gV3JpdGUgdGhlIG5ldyBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBpZiAoIWV4aXN0aW5nQ29uZmlnKSB7XG4gICAgICB0aGlzLl9jcmVhdGVUYWJsZShuZXdDb25maWcsIGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4dGVuZFRhYmxlKGV4aXN0aW5nQ29uZmlnLCBuZXdDb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9jcmVhdGVUYWJsZShuZXdDb25maWc6IFRhYmxlQ2ZnLCB0YWJsZUtleTogVGFibGVLZXkpIHtcbiAgICAvLyBXcml0ZSB0aGUgdGFibGUgY29uZmlnIGludG8gdGhlIGRhdGFiYXNlXG4gICAgbmV3Q29uZmlnID0gaHNoKG5ld0NvbmZpZyk7XG4gICAgdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YS5wdXNoKG5ld0NvbmZpZyk7XG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0aGlzLl9tZW0udGFibGVDZmdzKTtcblxuICAgIC8vIENyZWF0ZSBhIHRhYmxlIGFuZCB3cml0ZSBpdCBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGNvbnN0IHRhYmxlOiBUYWJsZVR5cGUgPSB7XG4gICAgICBfdHlwZTogbmV3Q29uZmlnLnR5cGUsXG4gICAgICBfZGF0YTogW10sXG4gICAgICBfdGFibGVDZmc6IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmcsXG4gICAgfTtcblxuICAgIHRoaXMuX21lbVt0YWJsZUtleV0gPz89IGhpcCh0YWJsZSk7XG5cbiAgICAvLyBVcGRhdGUgaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKHRhYmxlS2V5KTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWc6IFRhYmxlQ2ZnLCBuZXdDb25maWc6IFRhYmxlQ2ZnKSB7XG4gICAgLy8gTm8gY29sdW1ucyBhZGRlZD8gUmV0dXJuLlxuICAgIGlmIChleGlzdGluZ0NvbmZpZy5jb2x1bW5zLmxlbmd0aCA9PT0gbmV3Q29uZmlnLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV3JpdGUgdGhlIG5ldyB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb25maWcgb2YgdGhlIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bbmV3Q29uZmlnLmtleV0gYXMgVGFibGVUeXBlO1xuICAgIHRhYmxlLl90YWJsZUNmZyA9IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZVRhYmxlSGFzaChuZXdDb25maWcua2V5KTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblxuICBwcml2YXRlIGFzeW5jIF9kdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIGNvcHkodGhpcy5fbWVtKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9kdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiBjb3B5KHRhYmxlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2NvbnRlbnRUeXBlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxDb250ZW50VHlwZT4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG5cbiAgICByZXR1cm4gKHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGUpLl90eXBlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX3dyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhZGRlZERhdGEgPSBoc2gocmVxdWVzdC5kYXRhKTtcbiAgICB0aGlzLl9yZW1vdmVOdWxsVmFsdWVzKGFkZGVkRGF0YSk7XG4gICAgY29uc3QgdGFibGVzID0gT2JqZWN0LmtleXMoYWRkZWREYXRhKTtcbiAgICBoc2goYWRkZWREYXRhKTtcblxuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVzRG9Ob3RFeGlzdChyZXF1ZXN0LmRhdGEpO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEYXRhRG9lc05vdE1hdGNoQ2ZnKHJlcXVlc3QuZGF0YSk7XG5cbiAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIHRhYmxlcykge1xuICAgICAgaWYgKHRhYmxlLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2xkVGFibGUgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICAgIGNvbnN0IG5ld1RhYmxlID0gYWRkZWREYXRhW3RhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICAgIC8vIFRhYmxlIGV4aXN0cy4gTWVyZ2UgZGF0YVxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG5ld1RhYmxlLl9kYXRhKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBpdGVtLl9oYXNoO1xuICAgICAgICBjb25zdCBleGlzdHMgPSBvbGRUYWJsZS5fZGF0YS5maW5kKChpKSA9PiBpLl9oYXNoID09PSBoYXNoKTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICBvbGRUYWJsZS5fZGF0YS5wdXNoKGl0ZW0gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKG9sZFRhYmxlKTtcblxuICAgICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgICAgdGhpcy5faW9Ub29scy5ub3RpZnlPYnNlcnZlcnModGFibGUsIHsgW3RhYmxlXTogbmV3VGFibGUgfSBhcyBSbGpzb24pO1xuICAgIH1cblxuICAgIC8vIFJlY2FsYyBtYWluIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9yZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcbiAgICAgIHJlcXVlc3QudGFibGUsXG4gICAgICBPYmplY3Qua2V5cyhyZXF1ZXN0LndoZXJlKSxcbiAgICApO1xuXG4gICAgLy8gUmVhZCB0YWJsZSBmcm9tIGRhdGFcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICAvLyBGaWx0ZXIgdGFibGUgZGF0YVxuICAgIGNvbnN0IHRhYmxlRGF0YUZpbHRlcmVkID0gdGFibGUuX2RhdGEuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHJlcXVlc3Qud2hlcmUpIHtcbiAgICAgICAgY29uc3QgYSA9IHJvd1tjb2x1bW5dO1xuICAgICAgICBjb25zdCBiID0gcmVxdWVzdC53aGVyZVtjb2x1bW5dO1xuICAgICAgICBpZiAoYiA9PT0gbnVsbCAmJiBhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiB0YWJsZVxuICAgIGNvbnN0IHRhYmxlRmlsdGVyZWQ6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiB0YWJsZS5fdHlwZSxcbiAgICAgIF9kYXRhOiB0YWJsZURhdGFGaWx0ZXJlZCxcbiAgICB9O1xuXG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZUZpbHRlcmVkKTtcblxuICAgIGNvbnN0IHJlc3VsdDogUmxqc29uID0ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiB0YWJsZUZpbHRlcmVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgX3JlbW92ZU51bGxWYWx1ZXMocmxqc29uOiBSbGpzb24pIHtcbiAgICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sICh0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHJsanNvblt0YWJsZV0uX2RhdGE7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93KSB7XG4gICAgICAgICAgaWYgKHJvd1trZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgcm93W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvYnNlcnZlVGFibGUodGFibGU6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhOiBSbGpzb24pID0+IHZvaWQpIHtcbiAgICB0aGlzLl9pb1Rvb2xzLm9ic2VydmVUYWJsZSh0YWJsZSwgY2FsbGJhY2spO1xuICB9XG5cbiAgdW5vYnNlcnZlVGFibGUodGFibGU6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhOiBSbGpzb24pID0+IHZvaWQpIHtcbiAgICB0aGlzLl9pb1Rvb2xzLnVub2JzZXJ2ZVRhYmxlKHRhYmxlLCBjYWxsYmFjayk7XG4gIH1cblxuICB1bm9ic2VydmVBbGwodGFibGU6IHN0cmluZykge1xuICAgIHRoaXMuX2lvVG9vbHMudW5vYnNlcnZlQWxsKHRhYmxlKTtcbiAgfVxuXG4gIG9ic2VydmVycyh0YWJsZTogc3RyaW5nKTogKChkYXRhOiBSbGpzb24pID0+IHZvaWQpW10ge1xuICAgIHJldHVybiB0aGlzLl9pb1Rvb2xzLm9ic2VydmVycyh0YWJsZSk7XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBJbywgSW9NZW0gfSBmcm9tICcuL2luZGV4LnRzJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogSW8gaW1wbGVtZW50YXRpb24gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gYmUgdXNlZCBpblxuICogY29uZm9ybWFuY2UgdGVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW9UZXN0U2V0dXAge1xuICAvKiogc2V0dXAgYmVmb3JlIHRoZSBzaW5nbGUgc2V0dXBzICovXG4gIGJlZm9yZUFsbDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBiZWZvcmVFYWNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUZWFycyBkb3duIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgYWZ0ZXJFYWNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBjbGVhbnVwIGFmdGVyIGFsbCB0ZXN0cyAqL1xuICBhZnRlckFsbDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGlvIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgaW4gdGhlIGNvbmZvcm1hbmNlIHRlc3RzLlxuICAgKi9cbiAgaW86IElvO1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLy8gRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW9UZXN0U2V0dXAgaW50ZXJmYWNlXG5leHBvcnQgY29uc3QgZXhhbXBsZVRlc3RTZXR1cCA9ICgpOiBJb1Rlc3RTZXR1cCA9PiB7XG4gIHJldHVybiB7XG4gICAgaW86IG5ldyBJb01lbSgpLFxuICAgIGJlZm9yZUFsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGFueSBhZGRpdGlvbmFsIHNldHVwIHJlcXVpcmVkIGJlZm9yZSBpbml0LlxuICAgICAgLy8gQ3VycmVudGx5LCBpdCBkb2VzIG5vdGhpbmcuXG4gICAgfSxcblxuICAgIGJlZm9yZUVhY2g6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcbiAgICBhZnRlckVhY2g6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRlYXIgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb25cbiAgICB9LFxuXG4gICAgYWZ0ZXJBbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhbnkgYWRkaXRpb25hbCBjbGVhbnVwIGFmdGVyIHRlYXJEb3duLlxuICAgIH0sXG4gIH07XG59O1xuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQgeyBDb250ZW50VHlwZSwgUmxqc29uLCBUYWJsZUNmZywgVGFibGVLZXkgfSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgaW50ZXJmYWNlIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcblxuICAvKiogU3RhcnRzIHRoZSBpbml0aWFsaXphdGlvbiAqL1xuICBpbml0KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIENsb3NlcyB0aGUgaW8gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogUmV0dXJucyB0cnVlIGlmIGlvIGlzIG9wZW5lZCAqL1xuICBpc09wZW46IGJvb2xlYW47XG5cbiAgLyoqIEEgcHJvbWlzZSByZXNvbHZpbmcgb25jZSB0aGUgSW8gaW50ZXJmYWNlIGlzIHJlYWR5XG4gICAqXG4gICAqIPCfkqEgVXNlIEBybGpzb24vaXMtcmVhZHlcbiAgICovXG4gIGlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gRHVtcFxuXG4gIC8qKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBkYiBjb250ZW50IGFzIFJsanNvbiAqL1xuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgZHVtcCBvZiBhIGNvbXBsZXRlIHRhYmxlICovXG4gIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gTWV0YSBEYXRhXG4gIGNvbnRlbnRUeXBlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxDb250ZW50VHlwZT47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlc1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGV4aXN0c1xuICAgKi9cbiAgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggYSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbmV3IGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgY29sdW1ucyBhcmUgcmVtb3ZlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCB0aGUgY29sdW1uIHR5cGUgaXMgY2hhbmdlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGpzb24gc3RydWN0dXJlIHJldHVybmluZyBjdXJyZW50IHRhYmxlIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByYXdUYWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICAvKiogV3JpdGVzIFJsanNvbiBkYXRhIGludG8gdGhlIGRhdGFiYXNlICovXG4gIHdyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBSZWFkIHJvd3NcblxuICAvKiogUXVlcmllcyBhIGxpc3Qgb2Ygcm93cyAqL1xuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfCBudWxsIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBnaXZlbiB0YWJsZSAqL1xuICByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBPYnNlcnZpbmdcblxuICAvKiogT2JzZXJ2ZSBjaGFuZ2VzIG9uIGEgc3BlY2lmaWMgdGFibGUgKi9cbiAgb2JzZXJ2ZVRhYmxlKHRhYmxlOiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YTogUmxqc29uKSA9PiB2b2lkKTogdm9pZDtcblxuICAvKiogU3RvcCBvYnNlcnZpbmcgY2hhbmdlcyBvbiBhIHNwZWNpZmljIHRhYmxlICovXG4gIHVub2JzZXJ2ZVRhYmxlKHRhYmxlOiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YTogUmxqc29uKSA9PiB2b2lkKTogdm9pZDtcblxuICAvKiogU3RvcCBvYnNlcnZpbmcgYWxsIGNoYW5nZXMgb24gYSBzcGVjaWZpYyB0YWJsZSAqL1xuICB1bm9ic2VydmVBbGwodGFibGU/OiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKiBSZXR1cm5zIGFsbCBvYnNlcnZlcnMgZm9yIGEgc3BlY2lmaWMgdGFibGUgKi9cbiAgb2JzZXJ2ZXJzKHRhYmxlOiBzdHJpbmcpOiAoKGRhdGE6IFJsanNvbikgPT4gdm9pZClbXTtcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmV4cG9ydCBjb25zdCBleGFtcGxlSW8gPVxuICAnQ2hlY2tvdXQgQHJsanNvbi9pby1tZW0gZm9yIGFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24nO1xuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb24gfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHtcbiAgQnVmZmV0LFxuICBDYWtlLFxuICBpdGVyYXRlVGFibGVzU3luYyxcbiAgTGF5ZXIsXG4gIFJlZixcbiAgUmxqc29uLFxuICBUYWJsZUtleSxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBEZXNjcmliZXMgYSByb3cgdGhhdCByZWZlcmVuY2VzIGEgY2hpbGQgdGFibGUgcm93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyZW50UmVmIHtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgdGFibGUgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCB0YWJsZVxuICAgKi9cbiAgW3BhcmVudFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFyZW50IHJvdyB0aGF0IHJlZmVyZW5jZXMgdGhlIGNoaWxkIHJvd1xuICAgICAqL1xuICAgIFtwYXJlbnRSb3c6IFJlZl06IHtcbiAgICAgIC8qKlxuICAgICAgICogRGV0YWlscyBhYm91dCB0aGUgcmVmZXJlbmNlLCBlLmcuIGFuIGFycmF5IGluZGV4IGV0Yy5cbiAgICAgICAqL1xuICAgICAgZGV0YWlscz86IEpzb247XG4gICAgfTtcbiAgfTtcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBwYXJlbnQgdGFibGUgcm93cyByZWZlcmVuY2luZyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldmVyc2VSZWZzIHtcbiAgLyoqXG4gICAqIFRoZSBjaGlsZCB0YWJsZSB3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgKi9cbiAgW2NoaWxkVGFibGU6IFRhYmxlS2V5XToge1xuICAgIC8qKlxuICAgICAqIFRoZSByb3cgaGFzaHdlIG5lZWQgdGhlIHJlZmVyZW5jaW5nIHJvd3MgZm9yXG4gICAgICovXG4gICAgW2NoaWxkUm93OiBSZWZdOiBQYXJlbnRSZWY7XG4gIH07XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSByZXZlcnNlIHJlZmVyZW5jZXMgZm9yIGEgZ2l2ZW4gcmxqc29uIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgY2FsY1JldmVyc2VSZWZzID0gKHJsanNvbjogUmxqc29uKTogUmV2ZXJzZVJlZnMgPT4ge1xuICBjb25zdCByZXN1bHQ6IFJldmVyc2VSZWZzID0ge307XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBQcmVwYXJlIGRhdGEgc3RydWN0dXJlXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKGNoaWxkVGFibGVLZXksIHRhYmxlKSA9PiB7XG4gICAgY29uc3QgY2hpbGRUYWJsZTogeyBbY2hpbGRSb3dIYXNoOiBzdHJpbmddOiBQYXJlbnRSZWYgfSA9IHt9O1xuICAgIHJlc3VsdFtjaGlsZFRhYmxlS2V5XSA9IGNoaWxkVGFibGU7XG4gICAgZm9yIChjb25zdCBjaGlsZFJvdyBvZiB0YWJsZS5fZGF0YSkge1xuICAgICAgY2hpbGRUYWJsZVtjaGlsZFJvdy5faGFzaF0gPSB7fTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhdGUgcmV2ZXJzZSByZWZlcmVuY2VzXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZSkgPT4ge1xuICAgIC8vIEl0ZXJhdGUgYWxsIHJvd3Mgb2YgZWFjaCB0YWJsZVxuICAgIGZvciAoY29uc3QgcGFyZW50VGFibGVSb3cgb2YgcGFyZW50VGFibGUuX2RhdGEpIHtcbiAgICAgIC8vIEZpbmQgb3V0IHdoZSBvdGhlciB0YWJsZXMgJiByb3dzIGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgcm93XG4gICAgICAvLyBXcml0ZSB0aGVzZSBpbmZvcm1hdGlvbiBpbnR0byByZXN1bHRcbiAgICAgIHN3aXRjaCAocGFyZW50VGFibGUuX3R5cGUpIHtcbiAgICAgICAgY2FzZSAnY29tcG9uZW50cyc6XG4gICAgICAgICAgX3dyaXRlQ29tcG9uZW50UmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbGF5ZXJzJzoge1xuICAgICAgICAgIF93cml0ZUxheWVyUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdzbGljZUlkcyc6IHtcbiAgICAgICAgICAvLyBTbGljZSBpZHMgZG8gbm90IHJlZmVyZW5jZSBvdGhlciB0YWJsZXNcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2Nha2VzJzoge1xuICAgICAgICAgIF93cml0ZUNha2VSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2J1ZmZldHMnOiB7XG4gICAgICAgICAgX3dyaXRlQnVmZmV0UmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiB2OCBpZ25vcmUgZW5kICovXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVDb21wb25lbnRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEpzb24sXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBwYXJlbnRDb2x1bW5OYW1lIGluIHBhcmVudFJvdykge1xuICAgIGlmIChwYXJlbnRDb2x1bW5OYW1lLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnRDb2x1bW5OYW1lLmVuZHNXaXRoKCdSZWYnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRDb2x1bW5OYW1lLnNsaWNlKDAsIC0zKTtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3dbcGFyZW50Q29sdW1uTmFtZV0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVMYXllclJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogTGF5ZXIsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRSb3cuY29tcG9uZW50c1RhYmxlO1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IHNsaWNlSWQgaW4gcGFyZW50Um93LmFkZCkge1xuICAgIGlmIChzbGljZUlkLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2xpY2VIYXNoID0gcGFyZW50Um93LmFkZFtzbGljZUlkXSBhcyBzdHJpbmc7XG5cbiAgICBfd3JpdGUocmVzdWx0LCBjaGlsZFRhYmxlTmFtZSwgc2xpY2VIYXNoLCBwYXJlbnRUYWJsZU5hbWUsIHBhcmVudFJvd0hhc2gpO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQ2FrZVJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogQ2FrZSxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGxheWVyIGluIHBhcmVudFJvdy5sYXllcnMpIHtcbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IGxheWVyO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IHBhcmVudFJvdy5sYXllcnNbbGF5ZXJdIGFzIHN0cmluZztcbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUJ1ZmZldFJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogQnVmZmV0LFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRSb3cuaXRlbXMpIHtcbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IGl0ZW0udGFibGU7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gaXRlbS5yZWY7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGUgPSAoXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4gIGNoaWxkVGFibGVOYW1lOiBzdHJpbmcsXG4gIGNoaWxkUm93SGFzaDogc3RyaW5nLFxuICBwYXJlbnRUYWJsZU5hbWU6IHN0cmluZyxcbiAgcGFyZW50Um93SGFzaDogc3RyaW5nLFxuKSA9PiB7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlID0gKHJlc3VsdFtjaGlsZFRhYmxlTmFtZV0gPz89IHt9KTtcbiAgY29uc3QgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3cgPSAocmVmZXJlbmNlc0ZvckNoaWxkVGFibGVbY2hpbGRSb3dIYXNoXSA/Pz1cbiAgICB7fSk7XG5cbiAgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3dbcGFyZW50VGFibGVOYW1lXSA/Pz0ge307XG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV1bcGFyZW50Um93SGFzaF0gPz89IHt9O1xufTtcbiJdLCJuYW1lcyI6WyJlIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUF5Qk8sTUFBTSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9uQixZQUE0QixJQUFRO0FBQVIsU0FBQSxLQUFBO0FBQUEsRUFBUztBQUFBLEVBTjdCLGlDQUE0QyxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXcEQsV0FBVyxvQkFBb0I7QUFDN0IsVUFBTSxXQUFXLElBQWM7QUFBQSxNQUM3QixPQUFPO0FBQUEsTUFDUCxLQUFLO0FBQUEsTUFDTCxNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVixVQUFVO0FBQUEsTUFFVixTQUFTO0FBQUEsUUFDUCxFQUFFLEtBQUssU0FBUyxNQUFNLFNBQUE7QUFBQSxRQUN0QixFQUFFLEtBQUssT0FBTyxNQUFNLFNBQUE7QUFBQSxRQUNwQixFQUFFLEtBQUssUUFBUSxNQUFNLFNBQUE7QUFBQSxRQUNyQixFQUFFLEtBQUssVUFBVSxNQUFNLFVBQUE7QUFBQSxRQUN2QixFQUFFLEtBQUssVUFBVSxNQUFNLFVBQUE7QUFBQSxRQUN2QixFQUFFLEtBQUssWUFBWSxNQUFNLFVBQUE7QUFBQSxRQUN6QixFQUFFLEtBQUssWUFBWSxNQUFNLFNBQUE7QUFBQSxRQUN6QixFQUFFLEtBQUssV0FBVyxNQUFNLFlBQUE7QUFBQSxNQUFZO0FBQUEsSUFDdEMsQ0FDRDtBQUVELFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxxQkFBcUIsWUFBWTtBQUMvQixVQUFNLFdBQXFCO0FBQUEsTUFDekIsS0FBSztBQUFBLE1BQ0wsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BRVYsU0FBUztBQUFBLFFBQ1AsRUFBRSxLQUFLLFNBQVMsTUFBTSxTQUFBO0FB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
|
|
615
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8tdGVzdC1zZXR1cC50cyIsIi4uL3NyYy9pby50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsIFJsanNvbiwgVGFibGVDZmcsIFRhYmxlS2V5LCBUYWJsZVR5cGUsIHRocm93T25JbnZhbGlkVGFibGVDZmcsXG4gIHZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9NZW0gfSBmcm9tICcuL2lvLW1lbS50cyc7XG5pbXBvcnQgeyBJbyB9IGZyb20gJy4vaW8udHMnO1xuXG5cbmV4cG9ydCB0eXBlIElvT2JzZXJ2ZXIgPSAoZGF0YTogUmxqc29uKSA9PiB2b2lkO1xuXG4vKipcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgSW8gaW50ZXJmYWNlLlxuICovXG5leHBvcnQgY2xhc3MgSW9Ub29scyB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gaW8gVGhlIElvIGludGVyZmFjZSB0byB1c2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBpbzogSW8pIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhYmxlQ2ZncyB0YWJsZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVDZmdzVGFibGVDZmcoKSB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBoaXA8VGFibGVDZmc+KHtcbiAgICAgIF9oYXNoOiAnJyxcbiAgICAgIGtleTogJ3RhYmxlQ2ZncycsXG4gICAgICB0eXBlOiAndGFibGVDZmdzJyxcbiAgICAgIGlzSGVhZDogZmFsc2UsXG4gICAgICBpc1Jvb3Q6IGZhbHNlLFxuICAgICAgaXNTaGFyZWQ6IHRydWUsXG4gICAgICBwcmV2aW91czogJycsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBrZXk6ICdfaGFzaCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAna2V5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICd0eXBlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdpc0hlYWQnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdpc1Jvb3QnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdpc1NoYXJlZCcsIHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICB7IGtleTogJ3ByZXZpb3VzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdjb2x1bW5zJywgdHlwZTogJ2pzb25BcnJheScgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGFibGVDZmc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHJldmlzaW9ucyB0YWJsZS5cbiAgICovXG4gIGluaXRSZXZpc2lvbnNUYWJsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZUNmZzogVGFibGVDZmcgPSB7XG4gICAgICBrZXk6ICdyZXZpc2lvbnMnLFxuICAgICAgdHlwZTogJ3JldmlzaW9ucycsXG4gICAgICBpc0hlYWQ6IHRydWUsXG4gICAgICBpc1Jvb3Q6IHRydWUsXG4gICAgICBpc1NoYXJlZDogZmFsc2UsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBrZXk6ICdfaGFzaCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndGFibGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3ByZWRlY2Vzc29yJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdzdWNjZXNzb3InLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3RpbWVzdGFtcCcsIHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgIHsga2V5OiAnaWQnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5pby5jcmVhdGVPckV4dGVuZFRhYmxlKHsgdGFibGVDZmcgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEV4YW1wbGUgb2JqZWN0IGZvciB0ZXN0IHB1cnBvc2VzXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGlvIHRvb2xzXG4gICAqL1xuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpby5pbml0KCk7XG4gICAgYXdhaXQgaW8uaXNSZWFkeSgpO1xuICAgIHJldHVybiBuZXcgSW9Ub29scyhpbyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRG9lc05vdEV4aXN0KHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuaW8udGFibGVFeGlzdHModGFibGUpO1xuICAgIGlmICghZXhpc3RzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIGFueSBvZiB0aGUgdGFibGVzIGluIHJsanNvbiBkbyBub3QgZXhpc3RcbiAgICogQHBhcmFtIHJsanNvbiAtIFRoZSBSbGpzb24gb2JqZWN0IHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJsanNvbjogUmxqc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMocmxqc29uLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZUtleSk7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGVLZXl9XCIgbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdUYWJsZXMgPSAoZSBhcyBBcnJheTxhbnk+KS5tYXAoKGUpID0+IGUudGFibGVLZXkpO1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIHRhYmxlcyBkbyBub3QgZXhpc3Q6ICR7bWlzc2luZ1RhYmxlcy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRhYmxlIGNmZ3Mgb2YgYWxsIHRhYmxlc1xuICAgKiBAcmV0dXJucyBUaGUgdGFibGUgY29uZmlndXJhdGlvbiBvZiBhbGwgdGFibGVzXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPiB7XG4gICAgY29uc3QgdGFibGVzID0gYXdhaXQgdGhpcy5pby5yYXdUYWJsZUNmZ3MoKTtcblxuICAgIC8vIFRha2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggdHlwZSBrZXlcbiAgICBjb25zdCBuZXdlc3RWZXJzaW9uOiBSZWNvcmQ8VGFibGVLZXksIFRhYmxlQ2ZnPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSB0YWJsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzW2ldO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV07XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgIGlmICghZXhpc3RpbmcgfHwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGggPCB0YWJsZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV0gPSB0YWJsZTtcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBlbmQgKi9cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSB0YWJsZXMgYnkga2V5XG4gICAgY29uc3QgcmVzdWx0RGF0YSA9IE9iamVjdC52YWx1ZXMobmV3ZXN0VmVyc2lvbikuc29ydCgoYSwgYikgPT4ge1xuICAgICAgaWYgKGEua2V5IDwgYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGEua2V5ID4gYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICAgIC8qIHY4IGlnbm9yZSBlbmQgKi9cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCB3aXRoIGFsbCB0YWJsZSBuYW1lc1xuICAgKi9cbiAgYXN5bmMgYWxsVGFibGVLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgdGhpcy50YWJsZUNmZ3MoKSkubWFwKChlKSA9PiBlLmtleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFibGVcbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZnKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8VGFibGVDZmc+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmdPck51bGwodGFibGUpO1xuICAgIGlmICghdGFibGVDZmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZUNmZyE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhYmxlIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG5cbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZnT3JOdWxsKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8VGFibGVDZmcgfCBudWxsPiB7XG4gICAgY29uc3QgdGFibGVDZmdzID0gYXdhaXQgdGhpcy50YWJsZUNmZ3MoKTtcbiAgICBjb25zdCB0YWJsZUNmZyA9IHRhYmxlQ2Zncy5maW5kKChlKSA9PiBlLmtleSA9PT0gdGFibGUpO1xuICAgIHJldHVybiB0YWJsZUNmZyA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBjb2x1bW4gbmFtZXMgb2YgYSBnaXZlbiB0YWJsZVxuICAgKi9cbiAgYXN5bmMgYWxsQ29sdW1uS2V5cyh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlKTtcbiAgICBjb25zdCByZXN1bHQgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyB3aGVuIGEgY29sdW1uIGRvZXMgbm90IGV4aXN0IGluIGEgZ2l2ZW4gdGFibGVcbiAgICogQHBhcmFtIHRhYmxlIC0gVGhlIHRhYmxlIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBjb2x1bW5zIC0gVGhlIGNvbHVtbiB0byBjaGVja1xuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuQ29sdW1uRG9lc05vdEV4aXN0KFxuICAgIHRhYmxlOiBUYWJsZUtleSxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlKTtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gdGFibGVDZmcuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSk7XG4gICAgY29uc3QgbWlzc2luZ0NvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihcbiAgICAgIChjb2x1bW4pID0+ICFjb2x1bW5LZXlzLmluY2x1ZGVzKGNvbHVtbiksXG4gICAgKTtcbiAgICBpZiAobWlzc2luZ0NvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGZvbGxvd2luZyBjb2x1bW5zIGRvIG5vdCBleGlzdCBpbiB0YWJsZSBcIiR7dGFibGV9XCI6ICR7bWlzc2luZ0NvbHVtbnMuam9pbihcbiAgICAgICAgICAnLCAnLFxuICAgICAgICApfS5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIHdoZW4gYSB0YWJsZSB1cGRhdGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0YWJsZVxuICAgKiBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVJc05vdENvbXBhdGlibGUodXBkYXRlOiBUYWJsZUNmZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZWZpeCA9IGBJbnZhbGlkIHVwZGF0ZSBvZiB0YWJsZSBhYmxlIFwiJHt1cGRhdGUua2V5fVwiYDtcblxuICAgIHRocm93T25JbnZhbGlkVGFibGVDZmcodXBkYXRlKTtcblxuICAgIC8vIENoZWNrIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyB0YWJsZVxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy50YWJsZUNmZ09yTnVsbCh1cGRhdGUua2V5KTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIC8vIEhhdmUgY29sdW1ucyBiZWVuIGRlbGV0ZWQ/XG4gICAgICBpZiAoZXhpc3RpbmcuY29sdW1ucy5sZW5ndGggPiB1cGRhdGUuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGVsZXRlZENvbHVtbktleXMgPSBleGlzdGluZy5jb2x1bW5zXG4gICAgICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoa2V5KSA9PiAhdXBkYXRlLmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ua2V5ID09PSBrZXkpLFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChkZWxldGVkQ29sdW1uS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZGVsZXRlZENvbHVtbnMgPSBkZWxldGVkQ29sdW1uS2V5cy5qb2luKCcsICcpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IENvbHVtbnMgbXVzdCBub3QgYmUgZGVsZXRlZC4gYCArXG4gICAgICAgICAgICAgIGBEZWxldGVkIGNvbHVtbnM6ICR7ZGVsZXRlZENvbHVtbnN9fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYXZlIGNvbHVtbiBrZXlzIGNoYW5nZWQ/XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdXBkYXRlLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIGtleXMgbXVzdCBub3QgY2hhbmdlISBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiBcIiR7YmVmb3JlfVwiIHdhcyByZW5hbWVkIGludG8gXCIke2FmdGVyfVwiLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYXZlIGNvbHVtbiB0eXBlcyBjaGFuZ2VkP1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGV4aXN0aW5nLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5jb2x1bW5zW2ldLnR5cGU7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdXBkYXRlLmNvbHVtbnNbaV0udHlwZTtcbiAgICAgICAgaWYgKGJlZm9yZSAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiB0eXBlcyBtdXN0IG5vdCBjaGFuZ2UhIGAgK1xuICAgICAgICAgICAgICBgVHlwZSBvZiBjb2x1bW4gXCIke2NvbHVtbn1cIiB3YXMgY2hhbmdlZCBmcm9tIFwiJHtiZWZvcmV9XCIgdG8gJHthZnRlcn0uYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgZGF0YSBpbiB0aGUgdGFibGUgZG8gbm90IG1hdGNoIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcoZGF0YTogUmxqc29uKSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhkYXRhLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZUtleSk7XG4gICAgICBjb25zdCB0YWJsZSA9IGRhdGFbdGFibGVLZXldO1xuXG4gICAgICAvLyBJZ25vcmUgdGFibGVDZmdzIHRhYmxlXG4gICAgICBpZiAodGFibGUuX3R5cGUgPT09ICd0YWJsZUNmZ3MnKSByZXR1cm47XG5cbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnKHRhYmxlLl9kYXRhLCB0YWJsZUNmZykpO1xuICAgIH0pO1xuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYWJsZSBkYXRhIGRvZXMgbm90IG1hdGNoIHRoZSBjb25maWd1cmF0aW9uLlxcblxcbkVycm9yczpcXG4ke2Vycm9yc1xuICAgICAgICAgIC5tYXAoKGUpID0+IGAtICR7ZX1gKVxuICAgICAgICAgIC5qb2luKCdcXG4nKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIGRhdGEgb2YgYSB0YWJsZSBieSB0aGUgaGFzaCBhbmQgdXBkYXRlcyB0aGUgdGFibGUgaGFzaCBpbiBwbGFjZVxuICAgKi9cbiAgc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGFibGU6IFRhYmxlVHlwZSk6IHZvaWQge1xuICAgIHRhYmxlLl9kYXRhLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGhhc2hBID0gYS5faGFzaCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBoYXNoQiA9IGIuX2hhc2ggYXMgc3RyaW5nO1xuICAgICAgaWYgKGhhc2hBIDwgaGFzaEIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGhhc2hBID4gaGFzaEIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICAgIC8qIHY4IGlnbm9yZSBlbmQgKi9cbiAgICB9KTtcblxuICAgIHRhYmxlLl9oYXNoID0gJyc7XG4gICAgaGlwKHRhYmxlLCB7XG4gICAgICB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UsXG4gICAgICB0aHJvd09uV3JvbmdIYXNoZXM6IGZhbHNlLFxuICAgIH0pO1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwLCBoc2ggfSBmcm9tICdAcmxqc29uL2hhc2gnO1xuaW1wb3J0IHsgSXNSZWFkeSB9IGZyb20gJ0BybGpzb24vaXMtcmVhZHknO1xuaW1wb3J0IHsgY29weSwgZXF1YWxzLCBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHtcbiAgQ29udGVudFR5cGUsIGl0ZXJhdGVUYWJsZXNTeW5jLCBSbGpzb24sIFRhYmxlQ2ZnLCBUYWJsZUtleSwgVGFibGVUeXBlXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9Ub29scyB9IGZyb20gJy4vaW8tdG9vbHMudHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuXG4vKipcbiAqIEluLU1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmxqc29uIElvIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvTWVtIGltcGxlbWVudHMgSW8ge1xuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gQ29uc3RydWN0b3IgJiBleGFtcGxlXG5cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSBmYWxzZTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cblxuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IG5ldyBJb01lbSgpO1xuICAgIGF3YWl0IGlvLmluaXQoKTtcbiAgICByZXR1cm4gaW87XG4gIH07XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWFkeS5wcm9taXNlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIER1bXBcblxuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXAoKTtcbiAgfVxuXG4gIGFzeW5jIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXBUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBNZXRhIERhdGFcblxuICBhc3luYyBjb250ZW50VHlwZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGVudFR5cGU+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudFR5cGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUm93c1xuXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZFJvd3MocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICBpZiAoIXRhYmxlRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlIG1hbmFnZW1lbnRcbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICByZXR1cm4gdGFibGUgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIGFzeW5jIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICBjb25zdCB0YWJsZXMgPSB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhIGFzIFRhYmxlQ2ZnW107XG4gICAgcmV0dXJuIHRhYmxlcztcbiAgfVxuXG4gIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgLy8gUHJpdmF0ZVxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgcHJpdmF0ZSBfaW9Ub29scyE6IElvVG9vbHM7XG5cbiAgcHJpdmF0ZSBfaXNSZWFkeSA9IG5ldyBJc1JlYWR5KCk7XG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21lbTogUmxqc29uID0gaGlwKHt9IGFzIFJsanNvbik7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5faW9Ub29scyA9IG5ldyBJb1Rvb2xzKHRoaXMpO1xuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy5pbml0UmV2aXNpb25zVGFibGUoKTtcbiAgICBoc2godGhpcy5fbWVtKTtcblxuICAgIHRoaXMuX2lzUmVhZHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2luaXRUYWJsZUNmZ3MgPSAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBJb1Rvb2xzLnRhYmxlQ2Znc1RhYmxlQ2ZnO1xuXG4gICAgdGhpcy5fbWVtLnRhYmxlQ2ZncyA9IGhpcCh7XG4gICAgICBfdHlwZTogJ3RhYmxlQ2ZncycsXG4gICAgICBfZGF0YTogW3RhYmxlQ2ZnXSxcbiAgICAgIF90YWJsZUNmZzogdGFibGVDZmcuX2hhc2ggYXMgc3RyaW5nLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVHbG9iYWxIYXNoKCkge1xuICAgICh0aGlzLl9tZW0gYXMgYW55KS5faGFzaCA9ICcnO1xuICAgIGhpcCh0aGlzLl9tZW0sIHtcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVUYWJsZUhhc2godGFibGVLZXk6IFRhYmxlS2V5KSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwgeyB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7XG4gICAgdGFibGVDZmc6IFRhYmxlQ2ZnO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGNvbmZpZyBpcyBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBhbiBwb3RlbnRpYWwgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZUNmZyA9IHJlcXVlc3QudGFibGVDZmc7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh0YWJsZUNmZyk7XG5cbiAgICBjb25zdCB7IGtleSB9ID0gdGFibGVDZmc7XG5cbiAgICAvLyBSZWNyZWF0ZSBoYXNoZXMgaW4gdGhlIGNhc2UgdGhlIGV4aXN0aW5nIGhhc2hlcyBhcmUgd3JvbmdcbiAgICBjb25zdCBuZXdDb25maWcgPSBoc2godGFibGVDZmcpO1xuXG4gICAgLy8gRmluZCBhbiBleGlzdGluZyB0YWJsZSBjb25maWcgd2l0aCB0aGUgc2FtZSBoYXNoXG4gICAgY29uc3QgZXhpc3RpbmdDb25maWcgPSBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRhYmxlQ2ZnT3JOdWxsKGtleSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGlmICghZXhpc3RpbmdDb25maWcpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWcsIG5ld0NvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZzogVGFibGVDZmcsIHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIC8vIFdyaXRlIHRoZSB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIHdyaXRlIGl0IGludG8gdGhlIGRhdGFiYXNlXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiBuZXdDb25maWcudHlwZSxcbiAgICAgIF9kYXRhOiBbXSxcbiAgICAgIF90YWJsZUNmZzogbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fbWVtW3RhYmxlS2V5XSA/Pz0gaGlwKHRhYmxlKTtcblxuICAgIC8vIFVwZGF0ZSBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVUYWJsZUhhc2godGFibGVLZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9leHRlbmRUYWJsZShleGlzdGluZ0NvbmZpZzogVGFibGVDZmcsIG5ld0NvbmZpZzogVGFibGVDZmcpIHtcbiAgICAvLyBObyBjb2x1bW5zIGFkZGVkPyBSZXR1cm4uXG4gICAgaWYgKGV4aXN0aW5nQ29uZmlnLmNvbHVtbnMubGVuZ3RoID09PSBuZXdDb25maWcuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IHRhYmxlIGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGhpcy5fbWVtLnRhYmxlQ2Zncyk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZyBvZiB0aGUgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtuZXdDb25maWcua2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX3RhYmxlQ2ZnID0gbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZztcblxuICAgIC8vIFVwZGF0ZSB0aGUgaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKG5ld0NvbmZpZy5rZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG4gIHByaXZhdGUgYXN5bmMgX2R1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9tZW0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2R1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICBbcmVxdWVzdC50YWJsZV06IGNvcHkodGFibGUpLFxuICAgIH07XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY29udGVudFR5cGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPENvbnRlbnRUeXBlPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIHJldHVybiAodGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZSkuX3R5cGU7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFkZGVkRGF0YSA9IGhzaChyZXF1ZXN0LmRhdGEpO1xuICAgIHRoaXMuX3JlbW92ZU51bGxWYWx1ZXMoYWRkZWREYXRhKTtcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3Qua2V5cyhhZGRlZERhdGEpO1xuICAgIGhzaChhZGRlZERhdGEpO1xuXG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJlcXVlc3QuZGF0YSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcocmVxdWVzdC5kYXRhKTtcblxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBpZiAodGFibGUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGRUYWJsZSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgICAgY29uc3QgbmV3VGFibGUgPSBhZGRlZERhdGFbdGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgICAgLy8gVGFibGUgZXhpc3RzLiBNZXJnZSBkYXRhXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3VGFibGUuX2RhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGl0ZW0uX2hhc2g7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG9sZFRhYmxlLl9kYXRhLmZpbmQoKGkpID0+IGkuX2hhc2ggPT09IGhhc2gpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIG9sZFRhYmxlLl9kYXRhLnB1c2goaXRlbSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2gob2xkVGFibGUpO1xuICAgIH1cblxuICAgIC8vIFJlY2FsYyBtYWluIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9yZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcbiAgICAgIHJlcXVlc3QudGFibGUsXG4gICAgICBPYmplY3Qua2V5cyhyZXF1ZXN0LndoZXJlKSxcbiAgICApO1xuXG4gICAgLy8gUmVhZCB0YWJsZSBmcm9tIGRhdGFcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICAvLyBGaWx0ZXIgdGFibGUgZGF0YVxuICAgIGNvbnN0IHRhYmxlRGF0YUZpbHRlcmVkID0gdGFibGUuX2RhdGEuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHJlcXVlc3Qud2hlcmUpIHtcbiAgICAgICAgY29uc3QgYSA9IHJvd1tjb2x1bW5dO1xuICAgICAgICBjb25zdCBiID0gcmVxdWVzdC53aGVyZVtjb2x1bW5dO1xuICAgICAgICBpZiAoYiA9PT0gbnVsbCAmJiBhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiB0YWJsZVxuICAgIGNvbnN0IHRhYmxlRmlsdGVyZWQ6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiB0YWJsZS5fdHlwZSxcbiAgICAgIF9kYXRhOiB0YWJsZURhdGFGaWx0ZXJlZCxcbiAgICB9O1xuXG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZUZpbHRlcmVkKTtcblxuICAgIGNvbnN0IHJlc3VsdDogUmxqc29uID0ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiB0YWJsZUZpbHRlcmVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgX3JlbW92ZU51bGxWYWx1ZXMocmxqc29uOiBSbGpzb24pIHtcbiAgICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sICh0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHJsanNvblt0YWJsZV0uX2RhdGE7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93KSB7XG4gICAgICAgICAgaWYgKHJvd1trZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgcm93W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBJbywgSW9NZW0gfSBmcm9tICcuL2luZGV4LnRzJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogSW8gaW1wbGVtZW50YXRpb24gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gYmUgdXNlZCBpblxuICogY29uZm9ybWFuY2UgdGVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW9UZXN0U2V0dXAge1xuICAvKiogc2V0dXAgYmVmb3JlIHRoZSBzaW5nbGUgc2V0dXBzICovXG4gIGJlZm9yZUFsbDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBiZWZvcmVFYWNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUZWFycyBkb3duIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgYWZ0ZXJFYWNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBjbGVhbnVwIGFmdGVyIGFsbCB0ZXN0cyAqL1xuICBhZnRlckFsbDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGlvIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgaW4gdGhlIGNvbmZvcm1hbmNlIHRlc3RzLlxuICAgKi9cbiAgaW86IElvO1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLy8gRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW9UZXN0U2V0dXAgaW50ZXJmYWNlXG5leHBvcnQgY29uc3QgZXhhbXBsZVRlc3RTZXR1cCA9ICgpOiBJb1Rlc3RTZXR1cCA9PiB7XG4gIHJldHVybiB7XG4gICAgaW86IG5ldyBJb01lbSgpLFxuICAgIGJlZm9yZUFsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGFueSBhZGRpdGlvbmFsIHNldHVwIHJlcXVpcmVkIGJlZm9yZSBpbml0LlxuICAgICAgLy8gQ3VycmVudGx5LCBpdCBkb2VzIG5vdGhpbmcuXG4gICAgfSxcblxuICAgIGJlZm9yZUVhY2g6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcbiAgICBhZnRlckVhY2g6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRlYXIgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb25cbiAgICB9LFxuXG4gICAgYWZ0ZXJBbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhbnkgYWRkaXRpb25hbCBjbGVhbnVwIGFmdGVyIHRlYXJEb3duLlxuICAgIH0sXG4gIH07XG59O1xuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQgeyBDb250ZW50VHlwZSwgUmxqc29uLCBUYWJsZUNmZywgVGFibGVLZXkgfSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmV4cG9ydCBpbnRlcmZhY2UgSW8ge1xuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhbFxuXG4gIC8qKiBTdGFydHMgdGhlIGluaXRpYWxpemF0aW9uICovXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogQ2xvc2VzIHRoZSBpbyAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgaW8gaXMgb3BlbmVkICovXG4gIGlzT3BlbjogYm9vbGVhbjtcblxuICAvKiogQSBwcm9taXNlIHJlc29sdmluZyBvbmNlIHRoZSBJbyBpbnRlcmZhY2UgaXMgcmVhZHlcbiAgICpcbiAgICog8J+SoSBVc2UgQHJsanNvbi9pcy1yZWFkeVxuICAgKi9cbiAgaXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgLyoqIFJldHVybnMgdGhlIGNvbXBsZXRlIGRiIGNvbnRlbnQgYXMgUmxqc29uICovXG4gIGR1bXAoKTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBkdW1wIG9mIGEgY29tcGxldGUgdGFibGUgKi9cbiAgZHVtcFRhYmxlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBNZXRhIERhdGFcbiAgY29udGVudFR5cGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPENvbnRlbnRUeXBlPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gVGFibGVzXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFibGUgZXhpc3RzXG4gICAqL1xuICB0YWJsZUV4aXN0cyh0YWJsZUtleTogVGFibGVLZXkpOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGFibGUgd2l0aCBhIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGFscmVhZHkgZXhpc3RzLCBuZXcgY29sdW1ucyBhcmUgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIHRhYmxlLlxuICAgKiBJZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlnLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCBjb2x1bW5zIGFyZSByZW1vdmVkLCBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqIElmIHRoZSB0YWJsZSBleGlzdHMgYW5kIHRoZSBjb2x1bW4gdHlwZSBpcyBjaGFuZ2VkLCBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqL1xuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEganNvbiBzdHJ1Y3R1cmUgcmV0dXJuaW5nIGN1cnJlbnQgdGFibGUgY29uZmlndXJhdGlvbnNcbiAgICovXG4gIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBXcml0ZVxuXG4gIC8qKiBXcml0ZXMgUmxqc29uIGRhdGEgaW50byB0aGUgZGF0YWJhc2UgKi9cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFJlYWQgcm93c1xuXG4gIC8qKiBRdWVyaWVzIGEgbGlzdCBvZiByb3dzICovXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB8IG51bGwgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGdpdmVuIHRhYmxlICovXG4gIHJvd0NvdW50KHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgY29uc3QgZXhhbXBsZUlvID1cbiAgJ0NoZWNrb3V0IEBybGpzb24vaW8tbWVtIGZvciBhbiBleGFtcGxlIGltcGxlbWVudGF0aW9uJztcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIEJ1ZmZldCxcbiAgQ2FrZSxcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIExheWVyLFxuICBSZWYsXG4gIFJsanNvbixcbiAgVGFibGVLZXksXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIGEgcm93IHRoYXQgcmVmZXJlbmNlcyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IHRhYmxlIHRoYXQgcmVmZXJlbmNlcyB0aGUgY2hpbGQgdGFibGVcbiAgICovXG4gIFtwYXJlbnRUYWJsZTogVGFibGVLZXldOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcmVudCByb3cgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCByb3dcbiAgICAgKi9cbiAgICBbcGFyZW50Um93OiBSZWZdOiB7XG4gICAgICAvKipcbiAgICAgICAqIERldGFpbHMgYWJvdXQgdGhlIHJlZmVyZW5jZSwgZS5nLiBhbiBhcnJheSBpbmRleCBldGMuXG4gICAgICAgKi9cbiAgICAgIGRldGFpbHM/OiBKc29uO1xuICAgIH07XG4gIH07XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcGFyZW50IHRhYmxlIHJvd3MgcmVmZXJlbmNpbmcgYSBjaGlsZCB0YWJsZSByb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZlcnNlUmVmcyB7XG4gIC8qKlxuICAgKiBUaGUgY2hpbGQgdGFibGUgd2UgbmVlZCB0aGUgcmVmZXJlbmNpbmcgcm93cyBmb3JcbiAgICovXG4gIFtjaGlsZFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IGhhc2h3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgICAqL1xuICAgIFtjaGlsZFJvdzogUmVmXTogUGFyZW50UmVmO1xuICB9O1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgKi9cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcmV2ZXJzZSByZWZlcmVuY2VzIGZvciBhIGdpdmVuIHJsanNvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGNhbGNSZXZlcnNlUmVmcyA9IChybGpzb246IFJsanNvbik6IFJldmVyc2VSZWZzID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZXZlcnNlUmVmcyA9IHt9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUHJlcGFyZSBkYXRhIHN0cnVjdHVyZVxuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChjaGlsZFRhYmxlS2V5LCB0YWJsZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkVGFibGU6IHsgW2NoaWxkUm93SGFzaDogc3RyaW5nXTogUGFyZW50UmVmIH0gPSB7fTtcbiAgICByZXN1bHRbY2hpbGRUYWJsZUtleV0gPSBjaGlsZFRhYmxlO1xuICAgIGZvciAoY29uc3QgY2hpbGRSb3cgb2YgdGFibGUuX2RhdGEpIHtcbiAgICAgIGNoaWxkVGFibGVbY2hpbGRSb3cuX2hhc2hdID0ge307XG4gICAgfVxuICB9KTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYXRlIHJldmVyc2UgcmVmZXJlbmNlc1xuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGUpID0+IHtcbiAgICAvLyBJdGVyYXRlIGFsbCByb3dzIG9mIGVhY2ggdGFibGVcbiAgICBmb3IgKGNvbnN0IHBhcmVudFRhYmxlUm93IG9mIHBhcmVudFRhYmxlLl9kYXRhKSB7XG4gICAgICAvLyBGaW5kIG91dCB3aGUgb3RoZXIgdGFibGVzICYgcm93cyBhcmUgcmVmZXJlbmNlZCBieSB0aGlzIHJvd1xuICAgICAgLy8gV3JpdGUgdGhlc2UgaW5mb3JtYXRpb24gaW50dG8gcmVzdWx0XG4gICAgICBzd2l0Y2ggKHBhcmVudFRhYmxlLl90eXBlKSB7XG4gICAgICAgIGNhc2UgJ2NvbXBvbmVudHMnOlxuICAgICAgICAgIF93cml0ZUNvbXBvbmVudFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2xheWVycyc6IHtcbiAgICAgICAgICBfd3JpdGVMYXllclJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xpY2VJZHMnOiB7XG4gICAgICAgICAgLy8gU2xpY2UgaWRzIGRvIG5vdCByZWZlcmVuY2Ugb3RoZXIgdGFibGVzXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdjYWtlcyc6IHtcbiAgICAgICAgICBfd3JpdGVDYWtlUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdidWZmZXRzJzoge1xuICAgICAgICAgIF93cml0ZUJ1ZmZldFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogdjggaWdub3JlIGVuZCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQ29tcG9uZW50UmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBKc29uLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgcGFyZW50Q29sdW1uTmFtZSBpbiBwYXJlbnRSb3cpIHtcbiAgICBpZiAocGFyZW50Q29sdW1uTmFtZS5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50Q29sdW1uTmFtZS5lbmRzV2l0aCgnUmVmJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Q29sdW1uTmFtZS5zbGljZSgwLCAtMyk7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gcGFyZW50Um93W3BhcmVudENvbHVtbk5hbWVdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlTGF5ZXJSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IExheWVyLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Um93LmNvbXBvbmVudHNUYWJsZTtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBzbGljZUlkIGluIHBhcmVudFJvdy5hZGQpIHtcbiAgICBpZiAoc2xpY2VJZC5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNsaWNlSGFzaCA9IHBhcmVudFJvdy5hZGRbc2xpY2VJZF0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKHJlc3VsdCwgY2hpbGRUYWJsZU5hbWUsIHNsaWNlSGFzaCwgcGFyZW50VGFibGVOYW1lLCBwYXJlbnRSb3dIYXNoKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUNha2VSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IENha2UsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBsYXllciBpbiBwYXJlbnRSb3cubGF5ZXJzKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBsYXllcjtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3cubGF5ZXJzW2xheWVyXSBhcyBzdHJpbmc7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVCdWZmZXRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEJ1ZmZldCxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50Um93Lml0ZW1zKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBpdGVtLnRhYmxlO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IGl0ZW0ucmVmO1xuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlID0gKFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuICBjaGlsZFRhYmxlTmFtZTogc3RyaW5nLFxuICBjaGlsZFJvd0hhc2g6IHN0cmluZyxcbiAgcGFyZW50VGFibGVOYW1lOiBzdHJpbmcsXG4gIHBhcmVudFJvd0hhc2g6IHN0cmluZyxcbikgPT4ge1xuICBjb25zdCByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZSA9IChyZXN1bHRbY2hpbGRUYWJsZU5hbWVdID8/PSB7fSk7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93ID0gKHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlW2NoaWxkUm93SGFzaF0gPz89XG4gICAge30pO1xuXG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV0gPz89IHt9O1xuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdW3BhcmVudFJvd0hhc2hdID8/PSB7fTtcbn07XG4iXSwibmFtZXMiOlsiZSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBcUJPLE1BQU0sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLbkIsWUFBNEIsSUFBUTtBQUFSLFNBQUEsS0FBQTtBQUFBLEVBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtyQyxXQUFXLG9CQUFvQjtBQUM3QixVQUFNLFdBQVcsSUFBYztBQUFBLE1BQzdCLE9BQU87QUFBQSxNQUNQLEtBQUs7QUFBQSxNQUNMLE1BQU07QUFBQSxNQUNOLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFVBQVU7QUFBQSxNQUVWLFNBQVM7QUFBQSxRQUNQLEVBQUUsS0FBSyxTQUFTLE1BQU0sU0FBQTtBQUFBLFFBQ3RC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
|
|
@@ -2,10 +2,17 @@ import { Io } from './io.ts';
|
|
|
2
2
|
import { Socket } from './socket.ts';
|
|
3
3
|
export declare class PeerSocketMock implements Socket {
|
|
4
4
|
private _io;
|
|
5
|
-
private
|
|
5
|
+
private _listenersMap;
|
|
6
6
|
connected: boolean;
|
|
7
7
|
disconnected: boolean;
|
|
8
8
|
constructor(_io: Io);
|
|
9
|
+
/**
|
|
10
|
+
* Registers an event listener for the specified event.
|
|
11
|
+
* @param eventName - The name of the event to listen for.
|
|
12
|
+
* @param listener - The callback function to invoke when the event is emitted.
|
|
13
|
+
* @returns The PeerSocketMock instance for chaining.
|
|
14
|
+
*/
|
|
15
|
+
on(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
9
16
|
/**
|
|
10
17
|
* Simulates a connection event.
|
|
11
18
|
*
|
|
@@ -18,51 +25,6 @@ export declare class PeerSocketMock implements Socket {
|
|
|
18
25
|
* Emits the 'disconnect' event to all registered listeners.
|
|
19
26
|
*/
|
|
20
27
|
disconnect(): void;
|
|
21
|
-
/**
|
|
22
|
-
* Adds a listener for the specified event.
|
|
23
|
-
* @param eventName - The name of the event to listen for.
|
|
24
|
-
* @param listener - The callback function to invoke when the event is emitted.
|
|
25
|
-
* @returns The current PeerSocketMock instance.
|
|
26
|
-
*/
|
|
27
|
-
addListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
28
|
-
/**
|
|
29
|
-
* Alias for addListener method.
|
|
30
|
-
* @param eventName - The name of the event to listen for.
|
|
31
|
-
* @param listener - The callback function to invoke when the event is emitted.
|
|
32
|
-
* @returns The current PeerSocketMock instance.
|
|
33
|
-
*/
|
|
34
|
-
on(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
35
|
-
/**
|
|
36
|
-
* Adds a one-time listener for the specified event.
|
|
37
|
-
* The listener is invoked only the next time the event is emitted, after which it is removed.
|
|
38
|
-
* @param eventName - The name of the event to listen for.
|
|
39
|
-
* @param listener - The callback function to invoke when the event is emitted.
|
|
40
|
-
* @returns The current PeerSocketMock instance.
|
|
41
|
-
*/
|
|
42
|
-
once(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
43
|
-
/**
|
|
44
|
-
* Removes a listener for the specified event.
|
|
45
|
-
* @param eventName - The name of the event to stop listening for.
|
|
46
|
-
* @param listener - The callback function to remove.
|
|
47
|
-
* @returns The current PeerSocketMock instance.
|
|
48
|
-
*/
|
|
49
|
-
removeListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
50
|
-
/**
|
|
51
|
-
* Alias for removeListener method.
|
|
52
|
-
* @param eventName - The name of the event to stop listening for.
|
|
53
|
-
* @param listener - The callback function to remove.
|
|
54
|
-
* @returns The current PeerSocketMock instance.
|
|
55
|
-
*/
|
|
56
|
-
off(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
57
|
-
/**
|
|
58
|
-
* Removes all listeners for the specified event.
|
|
59
|
-
* If no event is specified, all listeners for all events are removed.
|
|
60
|
-
* @param eventName - The name of the event to stop listening for (optional).
|
|
61
|
-
* @returns The current PeerSocketMock instance.
|
|
62
|
-
*/
|
|
63
|
-
removeAllListeners(eventName?: string | symbol | undefined): this;
|
|
64
|
-
listeners(eventName: string | symbol): ((data: import('@rljson/rljson').Rljson) => void)[];
|
|
65
|
-
rawListeners(eventName: string | symbol): ((data: import('@rljson/rljson').Rljson) => void)[];
|
|
66
28
|
/**
|
|
67
29
|
* Emits an event, invoking the corresponding method on the Io instance.
|
|
68
30
|
* @param eventName - The name of the event to emit.
|
package/dist/socket.d.ts
CHANGED
|
@@ -3,13 +3,6 @@ export interface Socket {
|
|
|
3
3
|
disconnected: boolean;
|
|
4
4
|
connect(): void;
|
|
5
5
|
disconnect(): void;
|
|
6
|
-
addListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
7
6
|
on(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
8
|
-
once(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
9
|
-
removeListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
10
|
-
off(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
11
|
-
removeAllListeners(event?: string | symbol): this;
|
|
12
|
-
listeners(eventName: string | symbol): ((...args: any[]) => void)[];
|
|
13
|
-
rawListeners(eventName: string | symbol): ((...args: any[]) => void)[];
|
|
14
7
|
emit(eventName: string | symbol, ...args: any[]): boolean;
|
|
15
8
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rljson/io",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.47",
|
|
4
4
|
"description": "Low level interface for reading and writing RLJSON data",
|
|
5
5
|
"homepage": "https://github.com/rljson/io",
|
|
6
6
|
"bugs": "https://github.com/rljson/io/issues",
|
|
@@ -20,19 +20,19 @@
|
|
|
20
20
|
],
|
|
21
21
|
"type": "module",
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@types/node": "^24.
|
|
24
|
-
"@typescript-eslint/eslint-plugin": "^8.46.
|
|
25
|
-
"@typescript-eslint/parser": "^8.46.
|
|
23
|
+
"@types/node": "^24.9.1",
|
|
24
|
+
"@typescript-eslint/eslint-plugin": "^8.46.2",
|
|
25
|
+
"@typescript-eslint/parser": "^8.46.2",
|
|
26
26
|
"@vitest/coverage-v8": "^3.2.4",
|
|
27
27
|
"cross-env": "^10.1.0",
|
|
28
28
|
"eslint": "^9.38.0",
|
|
29
|
-
"eslint-plugin-jsdoc": "^61.1.
|
|
29
|
+
"eslint-plugin-jsdoc": "^61.1.5",
|
|
30
30
|
"eslint-plugin-tsdoc": "^0.4.0",
|
|
31
31
|
"globals": "^16.4.0",
|
|
32
32
|
"jsdoc": "^4.0.5",
|
|
33
33
|
"read-pkg": "^9.0.1",
|
|
34
34
|
"typescript": "~5.9.3",
|
|
35
|
-
"typescript-eslint": "^8.46.
|
|
35
|
+
"typescript-eslint": "^8.46.2",
|
|
36
36
|
"vite": "^7.1.11",
|
|
37
37
|
"vite-node": "^3.2.4",
|
|
38
38
|
"vite-plugin-dts": "^4.5.4",
|