appium-chromedriver 5.2.4 → 5.2.6
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/CHANGELOG.md +1 -0
- package/build/index.js +1 -6
- package/build/lib/chromedriver.js +5 -138
- package/build/lib/chromedriver.js.map +1 -1
- package/build/lib/install.js +1 -13
- package/build/lib/install.js.map +1 -1
- package/build/lib/protocol-helpers.js +1 -10
- package/build/lib/protocol-helpers.js.map +1 -1
- package/build/lib/storage-client.js +1 -85
- package/build/lib/storage-client.js.map +1 -1
- package/build/lib/utils.js +1 -37
- package/build/lib/utils.js.map +1 -1
- package/config/mapping.json +1 -0
- package/package.json +4 -2
|
@@ -1,78 +1,55 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _utils = require("./utils");
|
|
13
|
-
|
|
14
10
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
|
-
|
|
16
11
|
var _xpath = _interopRequireDefault(require("xpath"));
|
|
17
|
-
|
|
18
12
|
var _xmldom = require("@xmldom/xmldom");
|
|
19
|
-
|
|
20
13
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
21
|
-
|
|
22
14
|
var _path = _interopRequireDefault(require("path"));
|
|
23
|
-
|
|
24
15
|
var _support = require("appium/support");
|
|
25
|
-
|
|
26
16
|
const TIMEOUT_MS = 15000;
|
|
27
17
|
const MAX_PARALLEL_DOWNLOADS = 5;
|
|
28
|
-
|
|
29
18
|
const log = _support.logger.getLogger('ChromedriverStorageClient');
|
|
30
|
-
|
|
31
19
|
async function isCrcOk(src, checksum) {
|
|
32
20
|
const md5 = await _support.fs.hash(src, 'md5');
|
|
33
21
|
return _lodash.default.toLower(md5) === _lodash.default.toLower(checksum);
|
|
34
22
|
}
|
|
35
|
-
|
|
36
23
|
function findChildNode(parent, childName = null, text = null) {
|
|
37
24
|
if (!childName && !text) {
|
|
38
25
|
return null;
|
|
39
26
|
}
|
|
40
|
-
|
|
41
27
|
if (!parent.hasChildNodes()) {
|
|
42
28
|
return null;
|
|
43
29
|
}
|
|
44
|
-
|
|
45
30
|
for (let childNodeIdx = 0; childNodeIdx < parent.childNodes.length; childNodeIdx++) {
|
|
46
31
|
const childNode = parent.childNodes[childNodeIdx];
|
|
47
|
-
|
|
48
32
|
if (childName && !text && childName === childNode.localName) {
|
|
49
33
|
return childNode;
|
|
50
34
|
}
|
|
51
|
-
|
|
52
35
|
if (text) {
|
|
53
36
|
const childText = extractNodeText(childNode);
|
|
54
|
-
|
|
55
37
|
if (!childText) {
|
|
56
38
|
continue;
|
|
57
39
|
}
|
|
58
|
-
|
|
59
40
|
if (childName && childName === childNode.localName && text === childText) {
|
|
60
41
|
return childNode;
|
|
61
42
|
}
|
|
62
|
-
|
|
63
43
|
if (!childName && text === childText) {
|
|
64
44
|
return childNode;
|
|
65
45
|
}
|
|
66
46
|
}
|
|
67
47
|
}
|
|
68
|
-
|
|
69
48
|
return null;
|
|
70
49
|
}
|
|
71
|
-
|
|
72
50
|
function extractNodeText(node) {
|
|
73
51
|
return !node || !node.firstChild || !_support.util.hasValue(node.firstChild.nodeValue) ? null : node.firstChild.nodeValue;
|
|
74
52
|
}
|
|
75
|
-
|
|
76
53
|
class ChromedriverStorageClient {
|
|
77
54
|
constructor(args = {}) {
|
|
78
55
|
const {
|
|
@@ -87,17 +64,13 @@ class ChromedriverStorageClient {
|
|
|
87
64
|
parseNotes(content) {
|
|
88
65
|
const result = {};
|
|
89
66
|
const versionMatch = /^\s*[-]+ChromeDriver[\D]+([\d.]+)/im.exec(content);
|
|
90
|
-
|
|
91
67
|
if (versionMatch) {
|
|
92
68
|
result.version = versionMatch[1];
|
|
93
69
|
}
|
|
94
|
-
|
|
95
70
|
const minBrowserVersionMatch = /^\s*Supports Chrome[\D]+(\d+)/im.exec(content);
|
|
96
|
-
|
|
97
71
|
if (minBrowserVersionMatch) {
|
|
98
72
|
result.minBrowserVersion = minBrowserVersionMatch[1];
|
|
99
73
|
}
|
|
100
|
-
|
|
101
74
|
return result;
|
|
102
75
|
}
|
|
103
76
|
|
|
@@ -111,40 +84,30 @@ class ChromedriverStorageClient {
|
|
|
111
84
|
const {
|
|
112
85
|
minBrowserVersion
|
|
113
86
|
} = this.parseNotes(notes);
|
|
114
|
-
|
|
115
87
|
if (!minBrowserVersion) {
|
|
116
88
|
log.debug(`The driver '${driverKey}' does not contain valid release notes at ${notesUrl}. ` + `Skipping it`);
|
|
117
89
|
return;
|
|
118
90
|
}
|
|
119
|
-
|
|
120
91
|
infoDict.minBrowserVersion = minBrowserVersion;
|
|
121
92
|
}
|
|
122
93
|
|
|
123
94
|
async parseStorageXml(doc, shouldParseNotes = true) {
|
|
124
95
|
const driverNodes = _xpath.default.select(`//*[local-name(.)='Contents']`, doc);
|
|
125
|
-
|
|
126
96
|
log.debug(`Parsed ${driverNodes.length} entries from storage XML`);
|
|
127
|
-
|
|
128
97
|
if (_lodash.default.isEmpty(driverNodes)) {
|
|
129
98
|
return;
|
|
130
99
|
}
|
|
131
|
-
|
|
132
100
|
const promises = [];
|
|
133
|
-
|
|
134
101
|
for (const driverNode of driverNodes) {
|
|
135
102
|
const key = extractNodeText(findChildNode(driverNode, 'Key'));
|
|
136
|
-
|
|
137
103
|
if (!_lodash.default.includes(key, '/chromedriver_')) {
|
|
138
104
|
continue;
|
|
139
105
|
}
|
|
140
|
-
|
|
141
106
|
const etag = extractNodeText(findChildNode(driverNode, 'ETag'));
|
|
142
|
-
|
|
143
107
|
if (!etag) {
|
|
144
108
|
log.debug(`The entry '${key}' does not contain the checksum. Skipping it`);
|
|
145
109
|
continue;
|
|
146
110
|
}
|
|
147
|
-
|
|
148
111
|
const cdInfo = {
|
|
149
112
|
url: `${_utils.CD_CDN}/${key}`,
|
|
150
113
|
etag: _lodash.default.trim(etag, '"'),
|
|
@@ -153,26 +116,20 @@ class ChromedriverStorageClient {
|
|
|
153
116
|
this.mapping[key] = cdInfo;
|
|
154
117
|
const notesPath = `${cdInfo.version}/notes.txt`;
|
|
155
118
|
const isNotesPresent = !!driverNodes.reduce((acc, node) => acc || findChildNode(node, 'Key', notesPath), false);
|
|
156
|
-
|
|
157
119
|
if (!isNotesPresent) {
|
|
158
120
|
cdInfo.minBrowserVersion = null;
|
|
159
|
-
|
|
160
121
|
if (shouldParseNotes) {
|
|
161
122
|
log.info(`The entry '${key}' does not contain any notes. Skipping it`);
|
|
162
123
|
}
|
|
163
|
-
|
|
164
124
|
continue;
|
|
165
125
|
} else if (!shouldParseNotes) {
|
|
166
126
|
continue;
|
|
167
127
|
}
|
|
168
|
-
|
|
169
128
|
promises.push(this.retrieveAdditionalDriverInfo(key, `${_utils.CD_CDN}/${notesPath}`, cdInfo));
|
|
170
|
-
|
|
171
129
|
if (promises.length % MAX_PARALLEL_DOWNLOADS === 0) {
|
|
172
130
|
await _bluebird.default.all(promises);
|
|
173
131
|
}
|
|
174
132
|
}
|
|
175
|
-
|
|
176
133
|
await _bluebird.default.all(promises);
|
|
177
134
|
log.info(`The total count of entries in the mapping: ${_lodash.default.size(this.mapping)}`);
|
|
178
135
|
}
|
|
@@ -191,15 +148,12 @@ class ChromedriverStorageClient {
|
|
|
191
148
|
|
|
192
149
|
async unzipDriver(src, dst) {
|
|
193
150
|
const tmpRoot = await _support.tempDir.openDir();
|
|
194
|
-
|
|
195
151
|
try {
|
|
196
152
|
await _support.zip.extractAllTo(src, tmpRoot);
|
|
197
153
|
const chromedriverPath = await _support.fs.walkDir(tmpRoot, true, (itemPath, isDirectory) => !isDirectory && _lodash.default.toLower(_path.default.parse(itemPath).name) === 'chromedriver');
|
|
198
|
-
|
|
199
154
|
if (!chromedriverPath) {
|
|
200
155
|
throw new Error('The archive was unzipped properly, but we could not find any chromedriver executable');
|
|
201
156
|
}
|
|
202
|
-
|
|
203
157
|
log.debug(`Moving the extracted '${_path.default.basename(chromedriverPath)}' to '${dst}'`);
|
|
204
158
|
await _support.fs.mv(chromedriverPath, dst, {
|
|
205
159
|
mkdirp: true
|
|
@@ -214,63 +168,49 @@ class ChromedriverStorageClient {
|
|
|
214
168
|
minBrowserVersion,
|
|
215
169
|
versions = []
|
|
216
170
|
} = opts;
|
|
217
|
-
|
|
218
171
|
let driversToSync = _lodash.default.keys(this.mapping);
|
|
219
|
-
|
|
220
172
|
if (!_lodash.default.isEmpty(versions)) {
|
|
221
173
|
log.debug(`Selecting chromedrivers whose versions match to ${versions}`);
|
|
222
174
|
driversToSync = driversToSync.filter(cdName => versions.includes(`${this.mapping[cdName].version}`));
|
|
223
175
|
log.debug(`Got ${_support.util.pluralize('item', driversToSync.length, true)}`);
|
|
224
|
-
|
|
225
176
|
if (_lodash.default.isEmpty(driversToSync)) {
|
|
226
177
|
return [];
|
|
227
178
|
}
|
|
228
179
|
}
|
|
229
|
-
|
|
230
180
|
if (!isNaN(minBrowserVersion)) {
|
|
231
181
|
const minBrowserVersionInt = parseInt(minBrowserVersion, 10);
|
|
232
182
|
log.debug(`Selecting chromedrivers whose minimum supported browser version matches to ${minBrowserVersionInt}`);
|
|
233
183
|
let closestMatchedVersionNumber = 0;
|
|
234
|
-
|
|
235
184
|
for (const cdName of driversToSync) {
|
|
236
185
|
const currentMinBrowserVersion = parseInt(this.mapping[cdName].minBrowserVersion, 10);
|
|
237
|
-
|
|
238
186
|
if (!isNaN(currentMinBrowserVersion) && currentMinBrowserVersion <= minBrowserVersionInt && closestMatchedVersionNumber < currentMinBrowserVersion) {
|
|
239
187
|
closestMatchedVersionNumber = currentMinBrowserVersion;
|
|
240
188
|
}
|
|
241
189
|
}
|
|
242
|
-
|
|
243
190
|
driversToSync = driversToSync.filter(cdName => `${this.mapping[cdName].minBrowserVersion}` === `${closestMatchedVersionNumber > 0 ? closestMatchedVersionNumber : minBrowserVersionInt}`);
|
|
244
191
|
log.debug(`Got ${_support.util.pluralize('item', driversToSync.length, true)}`);
|
|
245
|
-
|
|
246
192
|
if (_lodash.default.isEmpty(driversToSync)) {
|
|
247
193
|
return [];
|
|
248
194
|
}
|
|
249
|
-
|
|
250
195
|
log.debug(`Will select candidate ${_support.util.pluralize('driver', driversToSync.length)} ` + `versioned as '${_lodash.default.uniq(driversToSync.map(cdName => this.mapping[cdName].version))}'`);
|
|
251
196
|
}
|
|
252
|
-
|
|
253
197
|
if (!_lodash.default.isEmpty(osInfo)) {
|
|
254
198
|
let {
|
|
255
199
|
name,
|
|
256
200
|
arch,
|
|
257
201
|
hardwareName
|
|
258
202
|
} = osInfo;
|
|
259
|
-
|
|
260
203
|
if (arch === _utils.X64 && !driversToSync.some(cdName => cdName.includes(`_${name}${_utils.X64}`))) {
|
|
261
204
|
arch = _utils.X86;
|
|
262
205
|
}
|
|
263
|
-
|
|
264
206
|
if (name === _utils.OS.mac && _lodash.default.includes(hardwareName, 'arm') && driversToSync.some(cdName => cdName.includes(_utils.M1_ARCH_SUFFIX))) {
|
|
265
207
|
arch += _utils.M1_ARCH_SUFFIX;
|
|
266
208
|
}
|
|
267
|
-
|
|
268
209
|
log.debug(`Selecting chromedrivers whose platform matches to ${name}${arch}`);
|
|
269
210
|
const platformRe = new RegExp(`(\\b|_)${name}${arch}\\b`);
|
|
270
211
|
driversToSync = driversToSync.filter(cdName => platformRe.test(cdName));
|
|
271
212
|
log.debug(`Got ${_support.util.pluralize('item', driversToSync.length, true)}`);
|
|
272
213
|
}
|
|
273
|
-
|
|
274
214
|
return driversToSync;
|
|
275
215
|
}
|
|
276
216
|
|
|
@@ -280,11 +220,8 @@ class ChromedriverStorageClient {
|
|
|
280
220
|
etag,
|
|
281
221
|
version
|
|
282
222
|
} = this.mapping[driverKey];
|
|
283
|
-
|
|
284
223
|
const archivePath = _path.default.resolve(archivesRoot, `${index}.zip`);
|
|
285
|
-
|
|
286
224
|
log.debug(`Retrieving '${url}' to '${archivePath}'`);
|
|
287
|
-
|
|
288
225
|
try {
|
|
289
226
|
await _support.net.downloadFile(url, archivePath, {
|
|
290
227
|
isMetered: false,
|
|
@@ -292,30 +229,22 @@ class ChromedriverStorageClient {
|
|
|
292
229
|
});
|
|
293
230
|
} catch (e) {
|
|
294
231
|
const msg = `Cannot download chromedriver archive. Original error: ${e.message}`;
|
|
295
|
-
|
|
296
232
|
if (isStrict) {
|
|
297
233
|
throw new Error(msg);
|
|
298
234
|
}
|
|
299
|
-
|
|
300
235
|
log.error(msg);
|
|
301
236
|
return false;
|
|
302
237
|
}
|
|
303
|
-
|
|
304
238
|
if (!(await isCrcOk(archivePath, etag))) {
|
|
305
239
|
const msg = `The checksum for the downloaded chromedriver '${driverKey}' did not match`;
|
|
306
|
-
|
|
307
240
|
if (isStrict) {
|
|
308
241
|
throw new Error(msg);
|
|
309
242
|
}
|
|
310
|
-
|
|
311
243
|
log.error(msg);
|
|
312
244
|
return false;
|
|
313
245
|
}
|
|
314
|
-
|
|
315
246
|
const fileName = `${_path.default.parse(url).name}_v${version}` + (_support.system.isWindows() ? '.exe' : '');
|
|
316
|
-
|
|
317
247
|
const targetPath = _path.default.resolve(this.chromedriverDir, fileName);
|
|
318
|
-
|
|
319
248
|
try {
|
|
320
249
|
await this.unzipDriver(archivePath, targetPath);
|
|
321
250
|
await _support.fs.chmod(targetPath, 0o755);
|
|
@@ -324,11 +253,9 @@ class ChromedriverStorageClient {
|
|
|
324
253
|
if (isStrict) {
|
|
325
254
|
throw e;
|
|
326
255
|
}
|
|
327
|
-
|
|
328
256
|
log.error(e.message);
|
|
329
257
|
return false;
|
|
330
258
|
}
|
|
331
|
-
|
|
332
259
|
return true;
|
|
333
260
|
}
|
|
334
261
|
|
|
@@ -336,23 +263,18 @@ class ChromedriverStorageClient {
|
|
|
336
263
|
if (_lodash.default.isEmpty(this.mapping)) {
|
|
337
264
|
await this.retrieveMapping(!!opts.minBrowserVersion);
|
|
338
265
|
}
|
|
339
|
-
|
|
340
266
|
if (_lodash.default.isEmpty(this.mapping)) {
|
|
341
267
|
throw new Error('Cannot retrieve chromedrivers mapping from Google storage');
|
|
342
268
|
}
|
|
343
|
-
|
|
344
269
|
const driversToSync = this.selectMatchingDrivers(opts.osInfo ?? (await (0, _utils.getOsInfo)()), opts);
|
|
345
|
-
|
|
346
270
|
if (_lodash.default.isEmpty(driversToSync)) {
|
|
347
271
|
log.debug(`There are no drivers to sync. Exiting`);
|
|
348
272
|
return [];
|
|
349
273
|
}
|
|
350
|
-
|
|
351
274
|
log.debug(`Got ${_support.util.pluralize('driver', driversToSync.length, true)} to sync: ` + JSON.stringify(driversToSync, null, 2));
|
|
352
275
|
const synchronizedDrivers = [];
|
|
353
276
|
const promises = [];
|
|
354
277
|
const archivesRoot = await _support.tempDir.openDir();
|
|
355
|
-
|
|
356
278
|
try {
|
|
357
279
|
for (const [idx, driverKey] of driversToSync.entries()) {
|
|
358
280
|
promises.push((async () => {
|
|
@@ -360,28 +282,22 @@ class ChromedriverStorageClient {
|
|
|
360
282
|
synchronizedDrivers.push(driverKey);
|
|
361
283
|
}
|
|
362
284
|
})());
|
|
363
|
-
|
|
364
285
|
if (promises.length % MAX_PARALLEL_DOWNLOADS === 0) {
|
|
365
286
|
await _bluebird.default.all(promises);
|
|
366
287
|
}
|
|
367
288
|
}
|
|
368
|
-
|
|
369
289
|
await _bluebird.default.all(promises);
|
|
370
290
|
} finally {
|
|
371
291
|
await _support.fs.rimraf(archivesRoot);
|
|
372
292
|
}
|
|
373
|
-
|
|
374
293
|
if (!_lodash.default.isEmpty(synchronizedDrivers)) {
|
|
375
294
|
log.info(`Successfully synchronized ` + `${_support.util.pluralize('chromedriver', synchronizedDrivers.length, true)}`);
|
|
376
295
|
} else {
|
|
377
296
|
log.info(`No chromedrivers were synchronized`);
|
|
378
297
|
}
|
|
379
|
-
|
|
380
298
|
return synchronizedDrivers;
|
|
381
299
|
}
|
|
382
|
-
|
|
383
300
|
}
|
|
384
|
-
|
|
385
301
|
var _default = ChromedriverStorageClient;
|
|
386
302
|
exports.default = _default;
|
|
387
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ3JjT2siLCJzcmMiLCJjaGVja3N1bSIsIm1kNSIsImZzIiwiaGFzaCIsIl8iLCJ0b0xvd2VyIiwiZmluZENoaWxkTm9kZSIsInBhcmVudCIsImNoaWxkTmFtZSIsInRleHQiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGROb2RlSWR4IiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkTm9kZSIsImxvY2FsTmFtZSIsImNoaWxkVGV4dCIsImV4dHJhY3ROb2RlVGV4dCIsIm5vZGUiLCJmaXJzdENoaWxkIiwidXRpbCIsImhhc1ZhbHVlIiwibm9kZVZhbHVlIiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsImNocm9tZWRyaXZlckRpciIsImdldENocm9tZWRyaXZlckRpciIsInRpbWVvdXQiLCJtYXBwaW5nIiwicGFyc2VOb3RlcyIsImNvbnRlbnQiLCJyZXN1bHQiLCJ2ZXJzaW9uTWF0Y2giLCJleGVjIiwidmVyc2lvbiIsIm1pbkJyb3dzZXJWZXJzaW9uTWF0Y2giLCJtaW5Ccm93c2VyVmVyc2lvbiIsInJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8iLCJkcml2ZXJLZXkiLCJub3Rlc1VybCIsImluZm9EaWN0Iiwibm90ZXMiLCJyZXRyaWV2ZURhdGEiLCJhY2NlcHQiLCJkZWJ1ZyIsInBhcnNlU3RvcmFnZVhtbCIsImRvYyIsInNob3VsZFBhcnNlTm90ZXMiLCJkcml2ZXJOb2RlcyIsInhwYXRoIiwic2VsZWN0IiwiaXNFbXB0eSIsInByb21pc2VzIiwiZHJpdmVyTm9kZSIsImtleSIsImluY2x1ZGVzIiwiZXRhZyIsImNkSW5mbyIsInVybCIsIkNEX0NETiIsInRyaW0iLCJmaXJzdCIsInNwbGl0Iiwibm90ZXNQYXRoIiwiaXNOb3Rlc1ByZXNlbnQiLCJyZWR1Y2UiLCJhY2MiLCJpbmZvIiwicHVzaCIsIkIiLCJhbGwiLCJzaXplIiwicmV0cmlldmVNYXBwaW5nIiwieG1sIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiY2xvbmVEZWVwIiwidW56aXBEcml2ZXIiLCJkc3QiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJjaHJvbWVkcml2ZXJQYXRoIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXJlY3RvcnkiLCJwYXRoIiwicGFyc2UiLCJuYW1lIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwiYXJjaCIsImhhcmR3YXJlTmFtZSIsIlg2NCIsInNvbWUiLCJYODYiLCJPUyIsIm1hYyIsIk0xX0FSQ0hfU1VGRklYIiwicGxhdGZvcm1SZSIsIlJlZ0V4cCIsInRlc3QiLCJyZXRyaWV2ZURyaXZlciIsImluZGV4IiwiYXJjaGl2ZXNSb290IiwiaXNTdHJpY3QiLCJhcmNoaXZlUGF0aCIsInJlc29sdmUiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJpc01ldGVyZWQiLCJlIiwibXNnIiwibWVzc2FnZSIsImVycm9yIiwiZmlsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJ0YXJnZXRQYXRoIiwiY2htb2QiLCJzeW5jRHJpdmVycyIsImdldE9zSW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzeW5jaHJvbml6ZWREcml2ZXJzIiwiaWR4IiwiZW50cmllcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBnZXRDaHJvbWVkcml2ZXJEaXIsIENEX0NETiwgcmV0cmlldmVEYXRhLCBnZXRPc0luZm8sXG4gIE9TLCBYNjQsIFg4NiwgTTFfQVJDSF9TVUZGSVgsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB4cGF0aCBmcm9tICd4cGF0aCc7XG5pbXBvcnQgeyBET01QYXJzZXIgfSBmcm9tICdAeG1sZG9tL3htbGRvbSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHN5c3RlbSwgZnMsIGxvZ2dlciwgdGVtcERpciwgemlwLCB1dGlsLCBuZXQgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5cblxuY29uc3QgVElNRU9VVF9NUyA9IDE1MDAwO1xuY29uc3QgTUFYX1BBUkFMTEVMX0RPV05MT0FEUyA9IDU7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0Nocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQnKTtcblxuXG5hc3luYyBmdW5jdGlvbiBpc0NyY09rIChzcmMsIGNoZWNrc3VtKSB7XG4gIGNvbnN0IG1kNSA9IGF3YWl0IGZzLmhhc2goc3JjLCAnbWQ1Jyk7XG4gIHJldHVybiBfLnRvTG93ZXIobWQ1KSA9PT0gXy50b0xvd2VyKGNoZWNrc3VtKTtcbn1cblxuZnVuY3Rpb24gZmluZENoaWxkTm9kZSAocGFyZW50LCBjaGlsZE5hbWUgPSBudWxsLCB0ZXh0ID0gbnVsbCkge1xuICBpZiAoIWNoaWxkTmFtZSAmJiAhdGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChsZXQgY2hpbGROb2RlSWR4ID0gMDsgY2hpbGROb2RlSWR4IDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBjaGlsZE5vZGVJZHgrKykge1xuICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBhcmVudC5jaGlsZE5vZGVzW2NoaWxkTm9kZUlkeF07XG4gICAgaWYgKGNoaWxkTmFtZSAmJiAhdGV4dCAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUpIHtcbiAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgfVxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBjaGlsZFRleHQgPSBleHRyYWN0Tm9kZVRleHQoY2hpbGROb2RlKTtcbiAgICAgIGlmICghY2hpbGRUZXh0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkTmFtZSAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUgJiYgdGV4dCA9PT0gY2hpbGRUZXh0KSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgICB9XG4gICAgICBpZiAoIWNoaWxkTmFtZSAmJiB0ZXh0ID09PSBjaGlsZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3ROb2RlVGV4dCAobm9kZSkge1xuICByZXR1cm4gKCFub2RlIHx8ICFub2RlLmZpcnN0Q2hpbGQgfHwgIXV0aWwuaGFzVmFsdWUobm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZSkpXG4gICAgPyBudWxsXG4gICAgOiBub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlO1xufVxuXG5cbmNsYXNzIENocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hyb21lZHJpdmVyRGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKCksXG4gICAgICB0aW1lb3V0ID0gVElNRU9VVF9NUyxcbiAgICB9ID0gYXJncztcbiAgICB0aGlzLmNocm9tZWRyaXZlckRpciA9IGNocm9tZWRyaXZlckRpcjtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIHRoaXMubWFwcGluZyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmVyc2lvbiAtIENocm9tZWRyaXZlciB2ZXJzaW9uXG4gICAqIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBtaW5Ccm93c2VyVmVyc2lvbiAtIFRoZSBtaW5pbXVtIGJyb3dzZXIgdmVyc2lvblxuICAgKiBzdXBwb3J0ZWQgYnkgY2hyb21lZHJpdmVyIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEdldHMgYWRkaXRpb25hbCBjaHJvbWVkcml2ZXIgZGV0YWlscyBmcm9tIGNocm9tZWRyaXZlclxuICAgKiByZWxlYXNlIG5vdGVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gUmVsZWFzZSBub3RlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjaHJvbWVkcml2ZXJcbiAgICogQHJldHVybnMge0FkZGl0aW9uYWxEcml2ZXJEZXRhaWxzfVxuICAgKi9cbiAgcGFyc2VOb3RlcyAoY29udGVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IC9eXFxzKlstXStDaHJvbWVEcml2ZXJbXFxEXSsoW1xcZC5dKykvaW0uZXhlYyhjb250ZW50KTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQudmVyc2lvbiA9IHZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gICAgY29uc3QgbWluQnJvd3NlclZlcnNpb25NYXRjaCA9IC9eXFxzKlN1cHBvcnRzIENocm9tZVtcXERdKyhcXGQrKS9pbS5leGVjKGNvbnRlbnQpO1xuICAgIGlmIChtaW5Ccm93c2VyVmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQubWluQnJvd3NlclZlcnNpb24gPSBtaW5Ccm93c2VyVmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkcyBjaHJvbWVkcml2ZXIgcmVsZWFzZSBub3RlcyBhbmQgcHV0cyB0aGVtXG4gICAqIGludG8gdGhlIGRpY3Rpb25hcnkgYXJndW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRyaXZlcktleSAtIERyaXZlciB2ZXJzaW9uIHBsdXMgYXJjaGl2ZSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBub3Rlc1VybCAtIFRoZSBVUkwgb2YgY2hyb21lZHJpdmVyIG5vdGVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvRGljdCAtIFRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgZHJpdmVyIGluZm8uXG4gICAqIFRoZSBtZXRob2QgY2FsbCBtdXRhdGVzIGJ5IG1lcmdpbmcgYEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzYFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHJlbGVhc2Ugbm90ZXMgY2Fubm90IGJlIGRvd25sb2FkZWRcbiAgICovXG4gIGFzeW5jIHJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8gKGRyaXZlcktleSwgbm90ZXNVcmwsIGluZm9EaWN0KSB7XG4gICAgY29uc3Qgbm90ZXMgPSBhd2FpdCByZXRyaWV2ZURhdGEobm90ZXNVcmwsIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICcqLyonLFxuICAgIH0sIHsgdGltZW91dDogdGhpcy50aW1lb3V0IH0pO1xuICAgIGNvbnN0IHsgbWluQnJvd3NlclZlcnNpb24gfSA9IHRoaXMucGFyc2VOb3Rlcyhub3Rlcyk7XG4gICAgaWYgKCFtaW5Ccm93c2VyVmVyc2lvbikge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgZHJpdmVyICcke2RyaXZlcktleX0nIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgcmVsZWFzZSBub3RlcyBhdCAke25vdGVzVXJsfS4gYCArXG4gICAgICAgIGBTa2lwcGluZyBpdGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbmZvRGljdC5taW5Ccm93c2VyVmVyc2lvbiA9IG1pbkJyb3dzZXJWZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUwgYW5kIHN0b3Jlc1xuICAgKiB0aGUgcGFyc2VkIHJlc3VsdHMgaW50byBgdGhpcy5tYXBwaW5nYFxuICAgKlxuICAgKiBAcGFyYW0ge0RPTURvY3VtZW50fSBkb2MgLSBUaGUgRE9NIHJlcHJlc2VudGF0aW9uXG4gICAqIG9mIHRoZSBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUxcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIElmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGRyaXZlcnMgaW5mb3JtYXRpb24gaXMgZ29pbmcgdG8gYmUgcGFyc2VkXG4gICAqIGFuZCBhc3NpZ25lZCB0byBgdGhpcy5tYXBwaW5nYFxuICAgKi9cbiAgYXN5bmMgcGFyc2VTdG9yYWdlWG1sIChkb2MsIHNob3VsZFBhcnNlTm90ZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgZHJpdmVyTm9kZXMgPSB4cGF0aC5zZWxlY3QoYC8vKltsb2NhbC1uYW1lKC4pPSdDb250ZW50cyddYCwgZG9jKTtcbiAgICBsb2cuZGVidWcoYFBhcnNlZCAke2RyaXZlck5vZGVzLmxlbmd0aH0gZW50cmllcyBmcm9tIHN0b3JhZ2UgWE1MYCk7XG4gICAgaWYgKF8uaXNFbXB0eShkcml2ZXJOb2RlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZHJpdmVyTm9kZSBvZiBkcml2ZXJOb2Rlcykge1xuICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0tleScpKTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhrZXksICcvY2hyb21lZHJpdmVyXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBldGFnID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0VUYWcnKSk7XG4gICAgICBpZiAoIWV0YWcpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgZW50cnkgJyR7a2V5fScgZG9lcyBub3QgY29udGFpbiB0aGUgY2hlY2tzdW0uIFNraXBwaW5nIGl0YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjZEluZm8gPSB7XG4gICAgICAgIHVybDogYCR7Q0RfQ0ROfS8ke2tleX1gLFxuICAgICAgICBldGFnOiBfLnRyaW0oZXRhZywgJ1wiJyksXG4gICAgICAgIHZlcnNpb246IF8uZmlyc3Qoa2V5LnNwbGl0KCcvJykpLFxuICAgICAgfTtcbiAgICAgIHRoaXMubWFwcGluZ1trZXldID0gY2RJbmZvO1xuXG4gICAgICBjb25zdCBub3Rlc1BhdGggPSBgJHtjZEluZm8udmVyc2lvbn0vbm90ZXMudHh0YDtcbiAgICAgIGNvbnN0IGlzTm90ZXNQcmVzZW50ID0gISFkcml2ZXJOb2Rlc1xuICAgICAgICAucmVkdWNlKChhY2MsIG5vZGUpID0+IGFjYyB8fCBmaW5kQ2hpbGROb2RlKG5vZGUsICdLZXknLCBub3Rlc1BhdGgpLCBmYWxzZSk7XG4gICAgICBpZiAoIWlzTm90ZXNQcmVzZW50KSB7XG4gICAgICAgIGNkSW5mby5taW5Ccm93c2VyVmVyc2lvbiA9IG51bGw7XG4gICAgICAgIGlmIChzaG91bGRQYXJzZU5vdGVzKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFRoZSBlbnRyeSAnJHtrZXl9JyBkb2VzIG5vdCBjb250YWluIGFueSBub3Rlcy4gU2tpcHBpbmcgaXRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZFBhcnNlTm90ZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHByb21pc2VzLnB1c2godGhpcy5yZXRyaWV2ZUFkZGl0aW9uYWxEcml2ZXJJbmZvKGtleSwgYCR7Q0RfQ0ROfS8ke25vdGVzUGF0aH1gLCBjZEluZm8pKTtcbiAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggJSBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID09PSAwKSB7XG4gICAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgIGxvZy5pbmZvKGBUaGUgdG90YWwgY291bnQgb2YgZW50cmllcyBpbiB0aGUgbWFwcGluZzogJHtfLnNpemUodGhpcy5tYXBwaW5nKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgLSBUaGUgZnVsbCB1cmwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIGluXG4gICAqIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXRhZyAtIFRoZSBDUkMgb2YgdGhlIGRyaXZlciBhcmNoaXZlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uIC0gQ2hyb21lZHJpdmVyIHZlcnNpb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IENocm9tZWRyaXZlcnNNYXBwaW5nXG4gICAqIEBwcm9wZXJ0eSB7RHJpdmVyRGV0YWlsc30gLSBUaGUga2V5cyBhcmUgdW5pcXVlIGRyaXZlciBpZGVudGlmaWVyc1xuICAgKiAodmVyc2lvbi9hcmNoaXZlIG5hbWUpLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgaGF2ZSBgRHJpdmVyRGV0YWlsc2BcbiAgICogY29udGFpbmluZyBjaHJvbWVkcml2ZXIgZGV0YWlsc1xuICAgKi9cblxuICAvKipcbiAgICogUmV0cmlldmVzIGNocm9tZWRyaXZlciBtYXBwaW5nIGZyb20gdGhlIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIGlmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGNocm9tZWRyaXZlcnMgaW5mbyBpcyBnb2luZyB0byBiZSByZXRyaWV2ZWQgYW5kXG4gICAqIHBhcnNlZCBmcm9tIHJlbGVhc2Ugbm90ZXNcbiAgICogQHJldHVybnMge0Nocm9tZWRyaXZlcnNNYXBwaW5nfVxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVNYXBwaW5nIChzaG91bGRQYXJzZU5vdGVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHhtbCA9IGF3YWl0IHJldHJpZXZlRGF0YShDRF9DRE4sIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi94bWwsICovKicsXG4gICAgfSwgeyB0aW1lb3V0OiB0aGlzLnRpbWVvdXQgfSk7XG4gICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWwpO1xuICAgIGF3YWl0IHRoaXMucGFyc2VTdG9yYWdlWG1sKGRvYywgc2hvdWxkUGFyc2VOb3Rlcyk7XG4gICAgcmV0dXJuIF8uY2xvbmVEZWVwKHRoaXMubWFwcGluZyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXIgYXJjaGl2ZVxuICAgKiBpbnRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjIC0gVGhlIHNvdXJjZSBhcmNoaXZlIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRzdCAtIFRoZSBkZXN0aW5hdGlvbiBjaHJvbWVkcml2ZXIgcGF0aFxuICAgKi9cbiAgYXN5bmMgdW56aXBEcml2ZXIgKHNyYywgZHN0KSB7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHNyYywgdG1wUm9vdCk7XG4gICAgICBjb25zdCBjaHJvbWVkcml2ZXJQYXRoID0gYXdhaXQgZnMud2Fsa0Rpcih0bXBSb290LCB0cnVlLCAoaXRlbVBhdGgsIGlzRGlyZWN0b3J5KSA9PlxuICAgICAgICAhaXNEaXJlY3RvcnkgJiYgXy50b0xvd2VyKHBhdGgucGFyc2UoaXRlbVBhdGgpLm5hbWUpID09PSAnY2hyb21lZHJpdmVyJyk7XG4gICAgICBpZiAoIWNocm9tZWRyaXZlclBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYXJjaGl2ZSB3YXMgdW56aXBwZWQgcHJvcGVybHksIGJ1dCB3ZSBjb3VsZCBub3QgZmluZCBhbnkgY2hyb21lZHJpdmVyIGV4ZWN1dGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgTW92aW5nIHRoZSBleHRyYWN0ZWQgJyR7cGF0aC5iYXNlbmFtZShjaHJvbWVkcml2ZXJQYXRoKX0nIHRvICcke2RzdH0nYCk7XG4gICAgICBhd2FpdCBmcy5tdihjaHJvbWVkcml2ZXJQYXRoLCBkc3QsIHtcbiAgICAgICAgbWtkaXJwOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPU0luZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaG9zdCBPU1xuICAgKiBDYW4gYmUgZWl0aGVyIGBtYWNgLCBgd2luZG93c2Agb3IgYGxpbnV4YFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXJjaCAtIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGhvc3QgT0QuXG4gICAqIENhbiBiZSBlaXRoZXIgYDMyYCBvciBgNjRgXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaGFyZHdhcmVOYW1lIC0gVGhlIG91dHB1dCBvZiBgdW5hbWUgLW1gIGNvbW1hbmRcbiAgICogb24gbGludXggYW5kIG1hYyBzeXN0ZW1zLiBgbnVsbGAgb24gV2luZG93c1xuICAgKi9cblxuICAvKipcbiAgICogRmlsdGVycyBgdGhpcy5tYXBwaW5nYCB0byBvbmx5IHNlbGVjdCBtYXRjaGluZ1xuICAgKiBjaHJvbWVkcml2ZXIgZW50cmllcyBieSBvcGVyYXRpbmcgc3lzdGVtIGluZm9ybWF0aW9uXG4gICAqIGFuZC9vciBhZGRpdGlvbmFsIHN5bmNocm9uaXphdGlvbiBvcHRpb25zIChpZiBwcm92aWRlZClcbiAgICpcbiAgICogQHBhcmFtIHs/T1NJbmZvfSBvc0luZm9cbiAgICogQHBhcmFtIHs/U3luY09wdGlvbnN9IG9wdHNcbiAgICogQHJldHVybnMge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGZpbHRlcmVkIGNocm9tZWRyaXZlclxuICAgKiBlbnRyeSBuYW1lcyAodmVyc2lvbi9hcmNoaXZlIG5hbWUpXG4gICAqL1xuICBzZWxlY3RNYXRjaGluZ0RyaXZlcnMgKG9zSW5mbywgb3B0cyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbWluQnJvd3NlclZlcnNpb24sXG4gICAgICB2ZXJzaW9ucyA9IFtdLFxuICAgIH0gPSBvcHRzO1xuICAgIGxldCBkcml2ZXJzVG9TeW5jID0gXy5rZXlzKHRoaXMubWFwcGluZyk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eSh2ZXJzaW9ucykpIHtcbiAgICAgIC8vIEhhbmRsZSBvbmx5IHNlbGVjdGVkIHZlcnNpb25zIGlmIHJlcXVlc3RlZFxuICAgICAgbG9nLmRlYnVnKGBTZWxlY3RpbmcgY2hyb21lZHJpdmVycyB3aG9zZSB2ZXJzaW9ucyBtYXRjaCB0byAke3ZlcnNpb25zfWApO1xuICAgICAgZHJpdmVyc1RvU3luYyA9IGRyaXZlcnNUb1N5bmNcbiAgICAgICAgLmZpbHRlcigoY2ROYW1lKSA9PiB2ZXJzaW9ucy5pbmNsdWRlcyhgJHt0aGlzLm1hcHBpbmdbY2ROYW1lXS52ZXJzaW9ufWApKTtcblxuICAgICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnaXRlbScsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyc1RvU3luYykpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNOYU4obWluQnJvd3NlclZlcnNpb24pKSB7XG4gICAgICAvLyBPbmx5IHNlbGVjdCBkcml2ZXJzIHRoYXQgc3VwcG9ydCB0aGUgY3VycmVudCBicm93c2VyIHdob3NlIG1ham9yIHZlcnNpb24gbnVtYmVyIGVxdWFscyB0byBgbWluQnJvd3NlclZlcnNpb25gXG4gICAgICBjb25zdCBtaW5Ccm93c2VyVmVyc2lvbkludCA9IHBhcnNlSW50KG1pbkJyb3dzZXJWZXJzaW9uLCAxMCk7XG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIG1pbmltdW0gc3VwcG9ydGVkIGJyb3dzZXIgdmVyc2lvbiBtYXRjaGVzIHRvICR7bWluQnJvd3NlclZlcnNpb25JbnR9YCk7XG4gICAgICBsZXQgY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyID0gMDtcbiAgICAgIC8vIFNlbGVjdCB0aGUgbmV3ZXN0IGF2YWlsYWJsZSBhbmQgY29tcGF0aWJsZSBjaHJvbWVkcml2ZXJcbiAgICAgIGZvciAoY29uc3QgY2ROYW1lIG9mIGRyaXZlcnNUb1N5bmMpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uID0gcGFyc2VJbnQodGhpcy5tYXBwaW5nW2NkTmFtZV0ubWluQnJvd3NlclZlcnNpb24sIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTihjdXJyZW50TWluQnJvd3NlclZlcnNpb24pXG4gICAgICAgICAgICAmJiBjdXJyZW50TWluQnJvd3NlclZlcnNpb24gPD0gbWluQnJvd3NlclZlcnNpb25JbnRcbiAgICAgICAgICAgICYmIGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA8IGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbikge1xuICAgICAgICAgIGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA9IGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZHJpdmVyc1RvU3luYyA9IGRyaXZlcnNUb1N5bmMuZmlsdGVyKChjZE5hbWUpID0+IGAke3RoaXMubWFwcGluZ1tjZE5hbWVdLm1pbkJyb3dzZXJWZXJzaW9ufWAgPT09XG4gICAgICAgIGAke2Nsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA+IDAgPyBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgOiBtaW5Ccm93c2VyVmVyc2lvbkludH1gKTtcblxuICAgICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnaXRlbScsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyc1RvU3luYykpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBXaWxsIHNlbGVjdCBjYW5kaWRhdGUgJHt1dGlsLnBsdXJhbGl6ZSgnZHJpdmVyJywgZHJpdmVyc1RvU3luYy5sZW5ndGgpfSBgICtcbiAgICAgICAgYHZlcnNpb25lZCBhcyAnJHtfLnVuaXEoZHJpdmVyc1RvU3luYy5tYXAoKGNkTmFtZSkgPT4gdGhpcy5tYXBwaW5nW2NkTmFtZV0udmVyc2lvbikpfSdgKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNFbXB0eShvc0luZm8pKSB7XG4gICAgICAvLyBGaWx0ZXIgb3V0IGRyaXZlcnMgZm9yIHVuc3VwcG9ydGVkIHN5c3RlbSBhcmNoaXRlY3R1cmVzXG4gICAgICBsZXQge25hbWUsIGFyY2gsIGhhcmR3YXJlTmFtZX0gPSBvc0luZm87XG4gICAgICBpZiAoYXJjaCA9PT0gWDY0ICYmICFkcml2ZXJzVG9TeW5jLnNvbWUoKGNkTmFtZSkgPT4gY2ROYW1lLmluY2x1ZGVzKGBfJHtuYW1lfSR7WDY0fWApKSkge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8geDg2IGJ1aWxkIGlmIHg2NCBvbmUgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlIGdpdmVuIE9TXG4gICAgICAgIGFyY2ggPSBYODY7XG4gICAgICB9XG4gICAgICBpZiAobmFtZSA9PT0gT1MubWFjICYmIF8uaW5jbHVkZXMoaGFyZHdhcmVOYW1lLCAnYXJtJylcbiAgICAgICAgICAmJiBkcml2ZXJzVG9TeW5jLnNvbWUoKGNkTmFtZSkgPT4gY2ROYW1lLmluY2x1ZGVzKE0xX0FSQ0hfU1VGRklYKSkpIHtcbiAgICAgICAgLy8gcHJlZmVyIGV4ZWN1dGFibGUgZm9yIE0xIGFyY2ggaWYgcHJlc2VudFxuICAgICAgICBhcmNoICs9IE0xX0FSQ0hfU1VGRklYO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBTZWxlY3RpbmcgY2hyb21lZHJpdmVycyB3aG9zZSBwbGF0Zm9ybSBtYXRjaGVzIHRvICR7bmFtZX0ke2FyY2h9YCk7XG4gICAgICBjb25zdCBwbGF0Zm9ybVJlID0gbmV3IFJlZ0V4cChgKFxcXFxifF8pJHtuYW1lfSR7YXJjaH1cXFxcYmApO1xuICAgICAgZHJpdmVyc1RvU3luYyA9IGRyaXZlcnNUb1N5bmMuZmlsdGVyKChjZE5hbWUpID0+IHBsYXRmb3JtUmUudGVzdChjZE5hbWUpKTtcbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyaXZlcnNUb1N5bmM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBnaXZlbiBjaHJvbWVkcml2ZXIgZnJvbSB0aGUgc3RvcmFnZVxuICAgKiBhbmQgdW5wYWNrcyBpdCBpbnRvIGB0aGlzLmNocm9tZWRyaXZlckRpcmAgZm9sZGVyXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSB1bmlxdWUgZHJpdmVyIGluZGV4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkcml2ZXJLZXkgLSBUaGUgZHJpdmVyIGtleSBpbiBgdGhpcy5tYXBwaW5nYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZXNSb290IC0gVGhlIHRlbXBvcmFyeSBmb2xkZXIgcGF0aCB0byBleHRyYWN0XG4gICAqIGRvd25sb2FkZWQgYXJjaGl2ZXMgdG9cbiAgICogQHBhcmFtIHtib29sZWFufSBpc1N0cmljdCBbdHJ1ZV0gLSBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIChgdHJ1ZWApXG4gICAqIG9yIHJldHVybiBhIGJvb2xlYW4gcmVzdWx0IGlmIHRoZSBkcml2ZXIgcmV0cmlldmFsIHByb2Nlc3MgZmFpbHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgZHJpdmVyXG4gICAqIGFuZCBgaXNTdHJpY3RgIGlzIHNldCB0byBgdHJ1ZWBcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGlmIGB0cnVlYCB0aGVuIHRoZSBjaHJvbWVkcml2ZXIgaXMgc3VjY2Vzc2Z1bGx5XG4gICAqIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZC5cbiAgICovXG4gIGFzeW5jIHJldHJpZXZlRHJpdmVyIChpbmRleCwgZHJpdmVyS2V5LCBhcmNoaXZlc1Jvb3QsIGlzU3RyaWN0ID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHVybCwgZXRhZywgdmVyc2lvbiB9ID0gdGhpcy5tYXBwaW5nW2RyaXZlcktleV07XG4gICAgY29uc3QgYXJjaGl2ZVBhdGggPSBwYXRoLnJlc29sdmUoYXJjaGl2ZXNSb290LCBgJHtpbmRleH0uemlwYCk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nICcke3VybH0nIHRvICcke2FyY2hpdmVQYXRofSdgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV0LmRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCB7XG4gICAgICAgIGlzTWV0ZXJlZDogZmFsc2UsXG4gICAgICAgIHRpbWVvdXQ6IFRJTUVPVVRfTVNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBDYW5ub3QgZG93bmxvYWQgY2hyb21lZHJpdmVyIGFyY2hpdmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gO1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghYXdhaXQgaXNDcmNPayhhcmNoaXZlUGF0aCwgZXRhZykpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBUaGUgY2hlY2tzdW0gZm9yIHRoZSBkb3dubG9hZGVkIGNocm9tZWRyaXZlciAnJHtkcml2ZXJLZXl9JyBkaWQgbm90IG1hdGNoYDtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihtc2cpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBmaWxlTmFtZSA9IGAke3BhdGgucGFyc2UodXJsKS5uYW1lfV92JHt2ZXJzaW9ufWAgK1xuICAgICAgKHN5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnKTtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuY2hyb21lZHJpdmVyRGlyLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudW56aXBEcml2ZXIoYXJjaGl2ZVBhdGgsIHRhcmdldFBhdGgpO1xuICAgICAgYXdhaXQgZnMuY2htb2QodGFyZ2V0UGF0aCwgMG83NTUpO1xuICAgICAgbG9nLmRlYnVnKGBQZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSAnJHt0YXJnZXRQYXRofScgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gNzU1YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gU3luY09wdGlvbnNcbiAgICogQHByb3BlcnR5IHtBcnJheTxTdHJpbmc+fSB2ZXJzaW9ucyAtIFRoZSBsaXN0IG9mIGNocm9tZWRyaXZlclxuICAgKiB2ZXJzaW9ucyB0byBzeW5jLiBJZiBlbXB0eSAodGhlIGRlZmF1bHQgdmFsdWUpIHRoZW4gYWxsIGF2YWlsYWJsZVxuICAgKiBjaHJvbWVkcml2ZXJzIGFyZSBnb2luZyB0byBiZSBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSBtaW5Ccm93c2VyVmVyc2lvbiAtIFRoZSBtaW51bXVtIHN1cHBvcnRlZFxuICAgKiBDaHJvbWUgdmVyc2lvbiB0aGF0IGRvd25sb2FkZWQgY2hyb21lZHJpdmVycyBzaG91bGQgc3VwcG9ydC4gQ2FuIG1hdGNoXG4gICAqIG11bHRpcGxlIGRyaXZlcnMuXG4gICAqIEBwcm9wZXJ0eSB7P09TSW5mb30gb3NJbmZvIC0gU3lzdGVtIGluZm9ybWF0aW9uIHVzZWQgdG8gZmlsdGVyIG91dFxuICAgKiB0aGUgbGlzdCBvZiB0aGUgcmV0cmlldmVkIGRyaXZlcnMuIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBzY3JpcHRcbiAgICogd2lsbCB0cnkgdG8gcmV0cmlldmUgaXQuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgY2hyb21lZHJpdmVycyBmcm9tIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKiB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW1cbiAgICpcbiAgICogQHBhcmFtIHs/U3luY09wdGlvbnN9IG9wdHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2hpbGUgcmV0cmlldmluZ1xuICAgKiB0aGUgZHJpdmVyc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nfSBUaGUgbGlzdCBvZiBzdWNjZXNzZnVsbHkgc3luY2hyb25pemVkIGRyaXZlciBrZXlzXG4gICAqL1xuICBhc3luYyBzeW5jRHJpdmVycyAob3B0cyA9IHt9KSB7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLm1hcHBpbmcpKSB7XG4gICAgICBhd2FpdCB0aGlzLnJldHJpZXZlTWFwcGluZyghIW9wdHMubWluQnJvd3NlclZlcnNpb24pO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMubWFwcGluZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJldHJpZXZlIGNocm9tZWRyaXZlcnMgbWFwcGluZyBmcm9tIEdvb2dsZSBzdG9yYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHJpdmVyc1RvU3luYyA9IHRoaXMuc2VsZWN0TWF0Y2hpbmdEcml2ZXJzKG9wdHMub3NJbmZvID8/IGF3YWl0IGdldE9zSW5mbygpLCBvcHRzKTtcbiAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGFyZSBubyBkcml2ZXJzIHRvIHN5bmMuIEV4aXRpbmdgKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnZHJpdmVyJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfSB0byBzeW5jOiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRyaXZlcnNUb1N5bmMsIG51bGwsIDIpKTtcblxuICAgIGNvbnN0IHN5bmNocm9uaXplZERyaXZlcnMgPSBbXTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGNvbnN0IGFyY2hpdmVzUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IFtpZHgsIGRyaXZlcktleV0gb2YgZHJpdmVyc1RvU3luYy5lbnRyaWVzKCkpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmIChhd2FpdCB0aGlzLnJldHJpZXZlRHJpdmVyKGlkeCwgZHJpdmVyS2V5LCBhcmNoaXZlc1Jvb3QsICFfLmlzRW1wdHkob3B0cykpKSB7XG4gICAgICAgICAgICBzeW5jaHJvbml6ZWREcml2ZXJzLnB1c2goZHJpdmVyS2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkpO1xuXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggJSBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID09PSAwKSB7XG4gICAgICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZihhcmNoaXZlc1Jvb3QpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShzeW5jaHJvbml6ZWREcml2ZXJzKSkge1xuICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBzeW5jaHJvbml6ZWQgYCArXG4gICAgICAgIGAke3V0aWwucGx1cmFsaXplKCdjaHJvbWVkcml2ZXInLCBzeW5jaHJvbml6ZWREcml2ZXJzLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKGBObyBjaHJvbWVkcml2ZXJzIHdlcmUgc3luY2hyb25pemVkYCk7XG4gICAgfVxuICAgIHJldHVybiBzeW5jaHJvbml6ZWREcml2ZXJzO1xuICB9XG59XG5cblxuZXhwb3J0IGRlZmF1bHQgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVu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
|
|
303
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ3JjT2siLCJzcmMiLCJjaGVja3N1bSIsIm1kNSIsImZzIiwiaGFzaCIsIl8iLCJ0b0xvd2VyIiwiZmluZENoaWxkTm9kZSIsInBhcmVudCIsImNoaWxkTmFtZSIsInRleHQiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGROb2RlSWR4IiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkTm9kZSIsImxvY2FsTmFtZSIsImNoaWxkVGV4dCIsImV4dHJhY3ROb2RlVGV4dCIsIm5vZGUiLCJmaXJzdENoaWxkIiwidXRpbCIsImhhc1ZhbHVlIiwibm9kZVZhbHVlIiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsImNocm9tZWRyaXZlckRpciIsImdldENocm9tZWRyaXZlckRpciIsInRpbWVvdXQiLCJtYXBwaW5nIiwicGFyc2VOb3RlcyIsImNvbnRlbnQiLCJyZXN1bHQiLCJ2ZXJzaW9uTWF0Y2giLCJleGVjIiwidmVyc2lvbiIsIm1pbkJyb3dzZXJWZXJzaW9uTWF0Y2giLCJtaW5Ccm93c2VyVmVyc2lvbiIsInJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8iLCJkcml2ZXJLZXkiLCJub3Rlc1VybCIsImluZm9EaWN0Iiwibm90ZXMiLCJyZXRyaWV2ZURhdGEiLCJhY2NlcHQiLCJkZWJ1ZyIsInBhcnNlU3RvcmFnZVhtbCIsImRvYyIsInNob3VsZFBhcnNlTm90ZXMiLCJkcml2ZXJOb2RlcyIsInhwYXRoIiwic2VsZWN0IiwiaXNFbXB0eSIsInByb21pc2VzIiwiZHJpdmVyTm9kZSIsImtleSIsImluY2x1ZGVzIiwiZXRhZyIsImNkSW5mbyIsInVybCIsIkNEX0NETiIsInRyaW0iLCJmaXJzdCIsInNwbGl0Iiwibm90ZXNQYXRoIiwiaXNOb3Rlc1ByZXNlbnQiLCJyZWR1Y2UiLCJhY2MiLCJpbmZvIiwicHVzaCIsIkIiLCJhbGwiLCJzaXplIiwicmV0cmlldmVNYXBwaW5nIiwieG1sIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiY2xvbmVEZWVwIiwidW56aXBEcml2ZXIiLCJkc3QiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJjaHJvbWVkcml2ZXJQYXRoIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXJlY3RvcnkiLCJwYXRoIiwicGFyc2UiLCJuYW1lIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwiYXJjaCIsImhhcmR3YXJlTmFtZSIsIlg2NCIsInNvbWUiLCJYODYiLCJPUyIsIm1hYyIsIk0xX0FSQ0hfU1VGRklYIiwicGxhdGZvcm1SZSIsIlJlZ0V4cCIsInRlc3QiLCJyZXRyaWV2ZURyaXZlciIsImluZGV4IiwiYXJjaGl2ZXNSb290IiwiaXNTdHJpY3QiLCJhcmNoaXZlUGF0aCIsInJlc29sdmUiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJpc01ldGVyZWQiLCJlIiwibXNnIiwibWVzc2FnZSIsImVycm9yIiwiZmlsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJ0YXJnZXRQYXRoIiwiY2htb2QiLCJzeW5jRHJpdmVycyIsImdldE9zSW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzeW5jaHJvbml6ZWREcml2ZXJzIiwiaWR4IiwiZW50cmllcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBnZXRDaHJvbWVkcml2ZXJEaXIsIENEX0NETiwgcmV0cmlldmVEYXRhLCBnZXRPc0luZm8sXG4gIE9TLCBYNjQsIFg4NiwgTTFfQVJDSF9TVUZGSVgsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB4cGF0aCBmcm9tICd4cGF0aCc7XG5pbXBvcnQgeyBET01QYXJzZXIgfSBmcm9tICdAeG1sZG9tL3htbGRvbSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHN5c3RlbSwgZnMsIGxvZ2dlciwgdGVtcERpciwgemlwLCB1dGlsLCBuZXQgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5cblxuY29uc3QgVElNRU9VVF9NUyA9IDE1MDAwO1xuY29uc3QgTUFYX1BBUkFMTEVMX0RPV05MT0FEUyA9IDU7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0Nocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQnKTtcblxuXG5hc3luYyBmdW5jdGlvbiBpc0NyY09rIChzcmMsIGNoZWNrc3VtKSB7XG4gIGNvbnN0IG1kNSA9IGF3YWl0IGZzLmhhc2goc3JjLCAnbWQ1Jyk7XG4gIHJldHVybiBfLnRvTG93ZXIobWQ1KSA9PT0gXy50b0xvd2VyKGNoZWNrc3VtKTtcbn1cblxuZnVuY3Rpb24gZmluZENoaWxkTm9kZSAocGFyZW50LCBjaGlsZE5hbWUgPSBudWxsLCB0ZXh0ID0gbnVsbCkge1xuICBpZiAoIWNoaWxkTmFtZSAmJiAhdGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChsZXQgY2hpbGROb2RlSWR4ID0gMDsgY2hpbGROb2RlSWR4IDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBjaGlsZE5vZGVJZHgrKykge1xuICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBhcmVudC5jaGlsZE5vZGVzW2NoaWxkTm9kZUlkeF07XG4gICAgaWYgKGNoaWxkTmFtZSAmJiAhdGV4dCAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUpIHtcbiAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgfVxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBjaGlsZFRleHQgPSBleHRyYWN0Tm9kZVRleHQoY2hpbGROb2RlKTtcbiAgICAgIGlmICghY2hpbGRUZXh0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkTmFtZSAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUgJiYgdGV4dCA9PT0gY2hpbGRUZXh0KSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgICB9XG4gICAgICBpZiAoIWNoaWxkTmFtZSAmJiB0ZXh0ID09PSBjaGlsZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3ROb2RlVGV4dCAobm9kZSkge1xuICByZXR1cm4gKCFub2RlIHx8ICFub2RlLmZpcnN0Q2hpbGQgfHwgIXV0aWwuaGFzVmFsdWUobm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZSkpXG4gICAgPyBudWxsXG4gICAgOiBub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlO1xufVxuXG5cbmNsYXNzIENocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hyb21lZHJpdmVyRGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKCksXG4gICAgICB0aW1lb3V0ID0gVElNRU9VVF9NUyxcbiAgICB9ID0gYXJncztcbiAgICB0aGlzLmNocm9tZWRyaXZlckRpciA9IGNocm9tZWRyaXZlckRpcjtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIHRoaXMubWFwcGluZyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmVyc2lvbiAtIENocm9tZWRyaXZlciB2ZXJzaW9uXG4gICAqIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBtaW5Ccm93c2VyVmVyc2lvbiAtIFRoZSBtaW5pbXVtIGJyb3dzZXIgdmVyc2lvblxuICAgKiBzdXBwb3J0ZWQgYnkgY2hyb21lZHJpdmVyIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEdldHMgYWRkaXRpb25hbCBjaHJvbWVkcml2ZXIgZGV0YWlscyBmcm9tIGNocm9tZWRyaXZlclxuICAgKiByZWxlYXNlIG5vdGVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gUmVsZWFzZSBub3RlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjaHJvbWVkcml2ZXJcbiAgICogQHJldHVybnMge0FkZGl0aW9uYWxEcml2ZXJEZXRhaWxzfVxuICAgKi9cbiAgcGFyc2VOb3RlcyAoY29udGVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IC9eXFxzKlstXStDaHJvbWVEcml2ZXJbXFxEXSsoW1xcZC5dKykvaW0uZXhlYyhjb250ZW50KTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQudmVyc2lvbiA9IHZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gICAgY29uc3QgbWluQnJvd3NlclZlcnNpb25NYXRjaCA9IC9eXFxzKlN1cHBvcnRzIENocm9tZVtcXERdKyhcXGQrKS9pbS5leGVjKGNvbnRlbnQpO1xuICAgIGlmIChtaW5Ccm93c2VyVmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQubWluQnJvd3NlclZlcnNpb24gPSBtaW5Ccm93c2VyVmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkcyBjaHJvbWVkcml2ZXIgcmVsZWFzZSBub3RlcyBhbmQgcHV0cyB0aGVtXG4gICAqIGludG8gdGhlIGRpY3Rpb25hcnkgYXJndW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRyaXZlcktleSAtIERyaXZlciB2ZXJzaW9uIHBsdXMgYXJjaGl2ZSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBub3Rlc1VybCAtIFRoZSBVUkwgb2YgY2hyb21lZHJpdmVyIG5vdGVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvRGljdCAtIFRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgZHJpdmVyIGluZm8uXG4gICAqIFRoZSBtZXRob2QgY2FsbCBtdXRhdGVzIGJ5IG1lcmdpbmcgYEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzYFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHJlbGVhc2Ugbm90ZXMgY2Fubm90IGJlIGRvd25sb2FkZWRcbiAgICovXG4gIGFzeW5jIHJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8gKGRyaXZlcktleSwgbm90ZXNVcmwsIGluZm9EaWN0KSB7XG4gICAgY29uc3Qgbm90ZXMgPSBhd2FpdCByZXRyaWV2ZURhdGEobm90ZXNVcmwsIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICcqLyonLFxuICAgIH0sIHsgdGltZW91dDogdGhpcy50aW1lb3V0IH0pO1xuICAgIGNvbnN0IHsgbWluQnJvd3NlclZlcnNpb24gfSA9IHRoaXMucGFyc2VOb3Rlcyhub3Rlcyk7XG4gICAgaWYgKCFtaW5Ccm93c2VyVmVyc2lvbikge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgZHJpdmVyICcke2RyaXZlcktleX0nIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgcmVsZWFzZSBub3RlcyBhdCAke25vdGVzVXJsfS4gYCArXG4gICAgICAgIGBTa2lwcGluZyBpdGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbmZvRGljdC5taW5Ccm93c2VyVmVyc2lvbiA9IG1pbkJyb3dzZXJWZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUwgYW5kIHN0b3Jlc1xuICAgKiB0aGUgcGFyc2VkIHJlc3VsdHMgaW50byBgdGhpcy5tYXBwaW5nYFxuICAgKlxuICAgKiBAcGFyYW0ge0RPTURvY3VtZW50fSBkb2MgLSBUaGUgRE9NIHJlcHJlc2VudGF0aW9uXG4gICAqIG9mIHRoZSBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUxcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIElmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGRyaXZlcnMgaW5mb3JtYXRpb24gaXMgZ29pbmcgdG8gYmUgcGFyc2VkXG4gICAqIGFuZCBhc3NpZ25lZCB0byBgdGhpcy5tYXBwaW5nYFxuICAgKi9cbiAgYXN5bmMgcGFyc2VTdG9yYWdlWG1sIChkb2MsIHNob3VsZFBhcnNlTm90ZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgZHJpdmVyTm9kZXMgPSB4cGF0aC5zZWxlY3QoYC8vKltsb2NhbC1uYW1lKC4pPSdDb250ZW50cyddYCwgZG9jKTtcbiAgICBsb2cuZGVidWcoYFBhcnNlZCAke2RyaXZlck5vZGVzLmxlbmd0aH0gZW50cmllcyBmcm9tIHN0b3JhZ2UgWE1MYCk7XG4gICAgaWYgKF8uaXNFbXB0eShkcml2ZXJOb2RlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZHJpdmVyTm9kZSBvZiBkcml2ZXJOb2Rlcykge1xuICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0tleScpKTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhrZXksICcvY2hyb21lZHJpdmVyXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBldGFnID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0VUYWcnKSk7XG4gICAgICBpZiAoIWV0YWcpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgZW50cnkgJyR7a2V5fScgZG9lcyBub3QgY29udGFpbiB0aGUgY2hlY2tzdW0uIFNraXBwaW5nIGl0YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjZEluZm8gPSB7XG4gICAgICAgIHVybDogYCR7Q0RfQ0ROfS8ke2tleX1gLFxuICAgICAgICBldGFnOiBfLnRyaW0oZXRhZywgJ1wiJyksXG4gICAgICAgIHZlcnNpb246IF8uZmlyc3Qoa2V5LnNwbGl0KCcvJykpLFxuICAgICAgfTtcbiAgICAgIHRoaXMubWFwcGluZ1trZXldID0gY2RJbmZvO1xuXG4gICAgICBjb25zdCBub3Rlc1BhdGggPSBgJHtjZEluZm8udmVyc2lvbn0vbm90ZXMudHh0YDtcbiAgICAgIGNvbnN0IGlzTm90ZXNQcmVzZW50ID0gISFkcml2ZXJOb2Rlc1xuICAgICAgICAucmVkdWNlKChhY2MsIG5vZGUpID0+IGFjYyB8fCBmaW5kQ2hpbGROb2RlKG5vZGUsICdLZXknLCBub3Rlc1BhdGgpLCBmYWxzZSk7XG4gICAgICBpZiAoIWlzTm90ZXNQcmVzZW50KSB7XG4gICAgICAgIGNkSW5mby5taW5Ccm93c2VyVmVyc2lvbiA9IG51bGw7XG4gICAgICAgIGlmIChzaG91bGRQYXJzZU5vdGVzKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFRoZSBlbnRyeSAnJHtrZXl9JyBkb2VzIG5vdCBjb250YWluIGFueSBub3Rlcy4gU2tpcHBpbmcgaXRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZFBhcnNlTm90ZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHByb21pc2VzLnB1c2godGhpcy5yZXRyaWV2ZUFkZGl0aW9uYWxEcml2ZXJJbmZvKGtleSwgYCR7Q0RfQ0ROfS8ke25vdGVzUGF0aH1gLCBjZEluZm8pKTtcbiAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggJSBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID09PSAwKSB7XG4gICAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgIGxvZy5pbmZvKGBUaGUgdG90YWwgY291bnQgb2YgZW50cmllcyBpbiB0aGUgbWFwcGluZzogJHtfLnNpemUodGhpcy5tYXBwaW5nKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgLSBUaGUgZnVsbCB1cmwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIGluXG4gICAqIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXRhZyAtIFRoZSBDUkMgb2YgdGhlIGRyaXZlciBhcmNoaXZlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uIC0gQ2hyb21lZHJpdmVyIHZlcnNpb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IENocm9tZWRyaXZlcnNNYXBwaW5nXG4gICAqIEBwcm9wZXJ0eSB7RHJpdmVyRGV0YWlsc30gLSBUaGUga2V5cyBhcmUgdW5pcXVlIGRyaXZlciBpZGVudGlmaWVyc1xuICAgKiAodmVyc2lvbi9hcmNoaXZlIG5hbWUpLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgaGF2ZSBgRHJpdmVyRGV0YWlsc2BcbiAgICogY29udGFpbmluZyBjaHJvbWVkcml2ZXIgZGV0YWlsc1xuICAgKi9cblxuICAvKipcbiAgICogUmV0cmlldmVzIGNocm9tZWRyaXZlciBtYXBwaW5nIGZyb20gdGhlIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIGlmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGNocm9tZWRyaXZlcnMgaW5mbyBpcyBnb2luZyB0byBiZSByZXRyaWV2ZWQgYW5kXG4gICAqIHBhcnNlZCBmcm9tIHJlbGVhc2Ugbm90ZXNcbiAgICogQHJldHVybnMge0Nocm9tZWRyaXZlcnNNYXBwaW5nfVxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVNYXBwaW5nIChzaG91bGRQYXJzZU5vdGVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHhtbCA9IGF3YWl0IHJldHJpZXZlRGF0YShDRF9DRE4sIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi94bWwsICovKicsXG4gICAgfSwgeyB0aW1lb3V0OiB0aGlzLnRpbWVvdXQgfSk7XG4gICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWwpO1xuICAgIGF3YWl0IHRoaXMucGFyc2VTdG9yYWdlWG1sKGRvYywgc2hvdWxkUGFyc2VOb3Rlcyk7XG4gICAgcmV0dXJuIF8uY2xvbmVEZWVwKHRoaXMubWFwcGluZyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXIgYXJjaGl2ZVxuICAgKiBpbnRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjIC0gVGhlIHNvdXJjZSBhcmNoaXZlIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRzdCAtIFRoZSBkZXN0aW5hdGlvbiBjaHJvbWVkcml2ZXIgcGF0aFxuICAgKi9cbiAgYXN5bmMgdW56aXBEcml2ZXIgKHNyYywgZHN0KSB7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHNyYywgdG1wUm9vdCk7XG4gICAgICBjb25zdCBjaHJvbWVkcml2ZXJQYXRoID0gYXdhaXQgZnMud2Fsa0Rpcih0bXBSb290LCB0cnVlLCAoaXRlbVBhdGgsIGlzRGlyZWN0b3J5KSA9PlxuICAgICAgICAhaXNEaXJlY3RvcnkgJiYgXy50b0xvd2VyKHBhdGgucGFyc2UoaXRlbVBhdGgpLm5hbWUpID09PSAnY2hyb21lZHJpdmVyJyk7XG4gICAgICBpZiAoIWNocm9tZWRyaXZlclBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYXJjaGl2ZSB3YXMgdW56aXBwZWQgcHJvcGVybHksIGJ1dCB3ZSBjb3VsZCBub3QgZmluZCBhbnkgY2hyb21lZHJpdmVyIGV4ZWN1dGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgTW92aW5nIHRoZSBleHRyYWN0ZWQgJyR7cGF0aC5iYXNlbmFtZShjaHJvbWVkcml2ZXJQYXRoKX0nIHRvICcke2RzdH0nYCk7XG4gICAgICBhd2FpdCBmcy5tdihjaHJvbWVkcml2ZXJQYXRoLCBkc3QsIHtcbiAgICAgICAgbWtkaXJwOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPU0luZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaG9zdCBPU1xuICAgKiBDYW4gYmUgZWl0aGVyIGBtYWNgLCBgd2luZG93c2Agb3IgYGxpbnV4YFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXJjaCAtIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGhvc3QgT0QuXG4gICAqIENhbiBiZSBlaXRoZXIgYDMyYCBvciBgNjRgXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaGFyZHdhcmVOYW1lIC0gVGhlIG91dHB1dCBvZiBgdW5hbWUgLW1gIGNvbW1hbmRcbiAgICogb24gbGludXggYW5kIG1hYyBzeXN0ZW1zLiBgbnVsbGAgb24gV2luZG93c1xuICAgKi9cblxuICAvKipcbiAgICogRmlsdGVycyBgdGhpcy5tYXBwaW5nYCB0byBvbmx5IHNlbGVjdCBtYXRjaGluZ1xuICAgKiBjaHJvbWVkcml2ZXIgZW50cmllcyBieSBvcGVyYXRpbmcgc3lzdGVtIGluZm9ybWF0aW9uXG4gICAqIGFuZC9vciBhZGRpdGlvbmFsIHN5bmNocm9uaXphdGlvbiBvcHRpb25zIChpZiBwcm92aWRlZClcbiAgICpcbiAgICogQHBhcmFtIHs/T1NJbmZvfSBvc0luZm9cbiAgICogQHBhcmFtIHs/U3luY09wdGlvbnN9IG9wdHNcbiAgICogQHJldHVybnMge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGZpbHRlcmVkIGNocm9tZWRyaXZlclxuICAgKiBlbnRyeSBuYW1lcyAodmVyc2lvbi9hcmNoaXZlIG5hbWUpXG4gICAqL1xuICBzZWxlY3RNYXRjaGluZ0RyaXZlcnMgKG9zSW5mbywgb3B0cyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbWluQnJvd3NlclZlcnNpb24sXG4gICAgICB2ZXJzaW9ucyA9IFtdLFxuICAgIH0gPSBvcHRzO1xuICAgIGxldCBkcml2ZXJzVG9TeW5jID0gXy5rZXlzKHRoaXMubWFwcGluZyk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eSh2ZXJzaW9ucykpIHtcbiAgICAgIC8vIEhhbmRsZSBvbmx5IHNlbGVjdGVkIHZlcnNpb25zIGlmIHJlcXVlc3RlZFxuICAgICAgbG9nLmRlYnVnKGBTZWxlY3RpbmcgY2hyb21lZHJpdmVycyB3aG9zZSB2ZXJzaW9ucyBtYXRjaCB0byAke3ZlcnNpb25zfWApO1xuICAgICAgZHJpdmVyc1RvU3luYyA9IGRyaXZlcnNUb1N5bmNcbiAgICAgICAgLmZpbHRlcigoY2ROYW1lKSA9PiB2ZXJzaW9ucy5pbmNsdWRlcyhgJHt0aGlzLm1hcHBpbmdbY2ROYW1lXS52ZXJzaW9ufWApKTtcblxuICAgICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnaXRlbScsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyc1RvU3luYykpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNOYU4obWluQnJvd3NlclZlcnNpb24pKSB7XG4gICAgICAvLyBPbmx5IHNlbGVjdCBkcml2ZXJzIHRoYXQgc3VwcG9ydCB0aGUgY3VycmVudCBicm93c2VyIHdob3NlIG1ham9yIHZlcnNpb24gbnVtYmVyIGVxdWFscyB0byBgbWluQnJvd3NlclZlcnNpb25gXG4gICAgICBjb25zdCBtaW5Ccm93c2VyVmVyc2lvbkludCA9IHBhcnNlSW50KG1pbkJyb3dzZXJWZXJzaW9uLCAxMCk7XG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIG1pbmltdW0gc3VwcG9ydGVkIGJyb3dzZXIgdmVyc2lvbiBtYXRjaGVzIHRvICR7bWluQnJvd3NlclZlcnNpb25JbnR9YCk7XG4gICAgICBsZXQgY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyID0gMDtcbiAgICAgIC8vIFNlbGVjdCB0aGUgbmV3ZXN0IGF2YWlsYWJsZSBhbmQgY29tcGF0aWJsZSBjaHJvbWVkcml2ZXJcbiAgICAgIGZvciAoY29uc3QgY2ROYW1lIG9mIGRyaXZlcnNUb1N5bmMpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uID0gcGFyc2VJbnQodGhpcy5tYXBwaW5nW2NkTmFtZV0ubWluQnJvd3NlclZlcnNpb24sIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTihjdXJyZW50TWluQnJvd3NlclZlcnNpb24pXG4gICAgICAgICAgICAmJiBjdXJyZW50TWluQnJvd3NlclZlcnNpb24gPD0gbWluQnJvd3NlclZlcnNpb25JbnRcbiAgICAgICAgICAgICYmIGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA8IGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbikge1xuICAgICAgICAgIGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA9IGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZHJpdmVyc1RvU3luYyA9IGRyaXZlcnNUb1N5bmMuZmlsdGVyKChjZE5hbWUpID0+IGAke3RoaXMubWFwcGluZ1tjZE5hbWVdLm1pbkJyb3dzZXJWZXJzaW9ufWAgPT09XG4gICAgICAgIGAke2Nsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA+IDAgPyBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgOiBtaW5Ccm93c2VyVmVyc2lvbkludH1gKTtcblxuICAgICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnaXRlbScsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyc1RvU3luYykpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBXaWxsIHNlbGVjdCBjYW5kaWRhdGUgJHt1dGlsLnBsdXJhbGl6ZSgnZHJpdmVyJywgZHJpdmVyc1RvU3luYy5sZW5ndGgpfSBgICtcbiAgICAgICAgYHZlcnNpb25lZCBhcyAnJHtfLnVuaXEoZHJpdmVyc1RvU3luYy5tYXAoKGNkTmFtZSkgPT4gdGhpcy5tYXBwaW5nW2NkTmFtZV0udmVyc2lvbikpfSdgKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNFbXB0eShvc0luZm8pKSB7XG4gICAgICAvLyBGaWx0ZXIgb3V0IGRyaXZlcnMgZm9yIHVuc3VwcG9ydGVkIHN5c3RlbSBhcmNoaXRlY3R1cmVzXG4gICAgICBsZXQge25hbWUsIGFyY2gsIGhhcmR3YXJlTmFtZX0gPSBvc0luZm87XG4gICAgICBpZiAoYXJjaCA9PT0gWDY0ICYmICFkcml2ZXJzVG9TeW5jLnNvbWUoKGNkTmFtZSkgPT4gY2ROYW1lLmluY2x1ZGVzKGBfJHtuYW1lfSR7WDY0fWApKSkge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8geDg2IGJ1aWxkIGlmIHg2NCBvbmUgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlIGdpdmVuIE9TXG4gICAgICAgIGFyY2ggPSBYODY7XG4gICAgICB9XG4gICAgICBpZiAobmFtZSA9PT0gT1MubWFjICYmIF8uaW5jbHVkZXMoaGFyZHdhcmVOYW1lLCAnYXJtJylcbiAgICAgICAgICAmJiBkcml2ZXJzVG9TeW5jLnNvbWUoKGNkTmFtZSkgPT4gY2ROYW1lLmluY2x1ZGVzKE0xX0FSQ0hfU1VGRklYKSkpIHtcbiAgICAgICAgLy8gcHJlZmVyIGV4ZWN1dGFibGUgZm9yIE0xIGFyY2ggaWYgcHJlc2VudFxuICAgICAgICBhcmNoICs9IE0xX0FSQ0hfU1VGRklYO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBTZWxlY3RpbmcgY2hyb21lZHJpdmVycyB3aG9zZSBwbGF0Zm9ybSBtYXRjaGVzIHRvICR7bmFtZX0ke2FyY2h9YCk7XG4gICAgICBjb25zdCBwbGF0Zm9ybVJlID0gbmV3IFJlZ0V4cChgKFxcXFxifF8pJHtuYW1lfSR7YXJjaH1cXFxcYmApO1xuICAgICAgZHJpdmVyc1RvU3luYyA9IGRyaXZlcnNUb1N5bmMuZmlsdGVyKChjZE5hbWUpID0+IHBsYXRmb3JtUmUudGVzdChjZE5hbWUpKTtcbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyaXZlcnNUb1N5bmM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBnaXZlbiBjaHJvbWVkcml2ZXIgZnJvbSB0aGUgc3RvcmFnZVxuICAgKiBhbmQgdW5wYWNrcyBpdCBpbnRvIGB0aGlzLmNocm9tZWRyaXZlckRpcmAgZm9sZGVyXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSB1bmlxdWUgZHJpdmVyIGluZGV4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkcml2ZXJLZXkgLSBUaGUgZHJpdmVyIGtleSBpbiBgdGhpcy5tYXBwaW5nYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZXNSb290IC0gVGhlIHRlbXBvcmFyeSBmb2xkZXIgcGF0aCB0byBleHRyYWN0XG4gICAqIGRvd25sb2FkZWQgYXJjaGl2ZXMgdG9cbiAgICogQHBhcmFtIHtib29sZWFufSBpc1N0cmljdCBbdHJ1ZV0gLSBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIChgdHJ1ZWApXG4gICAqIG9yIHJldHVybiBhIGJvb2xlYW4gcmVzdWx0IGlmIHRoZSBkcml2ZXIgcmV0cmlldmFsIHByb2Nlc3MgZmFpbHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgZHJpdmVyXG4gICAqIGFuZCBgaXNTdHJpY3RgIGlzIHNldCB0byBgdHJ1ZWBcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGlmIGB0cnVlYCB0aGVuIHRoZSBjaHJvbWVkcml2ZXIgaXMgc3VjY2Vzc2Z1bGx5XG4gICAqIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZC5cbiAgICovXG4gIGFzeW5jIHJldHJpZXZlRHJpdmVyIChpbmRleCwgZHJpdmVyS2V5LCBhcmNoaXZlc1Jvb3QsIGlzU3RyaWN0ID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHVybCwgZXRhZywgdmVyc2lvbiB9ID0gdGhpcy5tYXBwaW5nW2RyaXZlcktleV07XG4gICAgY29uc3QgYXJjaGl2ZVBhdGggPSBwYXRoLnJlc29sdmUoYXJjaGl2ZXNSb290LCBgJHtpbmRleH0uemlwYCk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nICcke3VybH0nIHRvICcke2FyY2hpdmVQYXRofSdgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV0LmRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCB7XG4gICAgICAgIGlzTWV0ZXJlZDogZmFsc2UsXG4gICAgICAgIHRpbWVvdXQ6IFRJTUVPVVRfTVNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBDYW5ub3QgZG93bmxvYWQgY2hyb21lZHJpdmVyIGFyY2hpdmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gO1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghYXdhaXQgaXNDcmNPayhhcmNoaXZlUGF0aCwgZXRhZykpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBUaGUgY2hlY2tzdW0gZm9yIHRoZSBkb3dubG9hZGVkIGNocm9tZWRyaXZlciAnJHtkcml2ZXJLZXl9JyBkaWQgbm90IG1hdGNoYDtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihtc2cpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBmaWxlTmFtZSA9IGAke3BhdGgucGFyc2UodXJsKS5uYW1lfV92JHt2ZXJzaW9ufWAgK1xuICAgICAgKHN5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnKTtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuY2hyb21lZHJpdmVyRGlyLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudW56aXBEcml2ZXIoYXJjaGl2ZVBhdGgsIHRhcmdldFBhdGgpO1xuICAgICAgYXdhaXQgZnMuY2htb2QodGFyZ2V0UGF0aCwgMG83NTUpO1xuICAgICAgbG9nLmRlYnVnKGBQZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSAnJHt0YXJnZXRQYXRofScgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gNzU1YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gU3luY09wdGlvbnNcbiAgICogQHByb3BlcnR5IHtBcnJheTxTdHJpbmc+fSB2ZXJzaW9ucyAtIFRoZSBsaXN0IG9mIGNocm9tZWRyaXZlclxuICAgKiB2ZXJzaW9ucyB0byBzeW5jLiBJZiBlbXB0eSAodGhlIGRlZmF1bHQgdmFsdWUpIHRoZW4gYWxsIGF2YWlsYWJsZVxuICAgKiBjaHJvbWVkcml2ZXJzIGFyZSBnb2luZyB0byBiZSBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSBtaW5Ccm93c2VyVmVyc2lvbiAtIFRoZSBtaW51bXVtIHN1cHBvcnRlZFxuICAgKiBDaHJvbWUgdmVyc2lvbiB0aGF0IGRvd25sb2FkZWQgY2hyb21lZHJpdmVycyBzaG91bGQgc3VwcG9ydC4gQ2FuIG1hdGNoXG4gICAqIG11bHRpcGxlIGRyaXZlcnMuXG4gICAqIEBwcm9wZXJ0eSB7P09TSW5mb30gb3NJbmZvIC0gU3lzdGVtIGluZm9ybWF0aW9uIHVzZWQgdG8gZmlsdGVyIG91dFxuICAgKiB0aGUgbGlzdCBvZiB0aGUgcmV0cmlldmVkIGRyaXZlcnMuIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBzY3JpcHRcbiAgICogd2lsbCB0cnkgdG8gcmV0cmlldmUgaXQuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgY2hyb21lZHJpdmVycyBmcm9tIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKiB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW1cbiAgICpcbiAgICogQHBhcmFtIHs/U3luY09wdGlvbnN9IG9wdHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2hpbGUgcmV0cmlldmluZ1xuICAgKiB0aGUgZHJpdmVyc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nfSBUaGUgbGlzdCBvZiBzdWNjZXNzZnVsbHkgc3luY2hyb25pemVkIGRyaXZlciBrZXlzXG4gICAqL1xuICBhc3luYyBzeW5jRHJpdmVycyAob3B0cyA9IHt9KSB7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLm1hcHBpbmcpKSB7XG4gICAgICBhd2FpdCB0aGlzLnJldHJpZXZlTWFwcGluZyghIW9wdHMubWluQnJvd3NlclZlcnNpb24pO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMubWFwcGluZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJldHJpZXZlIGNocm9tZWRyaXZlcnMgbWFwcGluZyBmcm9tIEdvb2dsZSBzdG9yYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHJpdmVyc1RvU3luYyA9IHRoaXMuc2VsZWN0TWF0Y2hpbmdEcml2ZXJzKG9wdHMub3NJbmZvID8/IGF3YWl0IGdldE9zSW5mbygpLCBvcHRzKTtcbiAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGFyZSBubyBkcml2ZXJzIHRvIHN5bmMuIEV4aXRpbmdgKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnZHJpdmVyJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfSB0byBzeW5jOiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRyaXZlcnNUb1N5bmMsIG51bGwsIDIpKTtcblxuICAgIGNvbnN0IHN5bmNocm9uaXplZERyaXZlcnMgPSBbXTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGNvbnN0IGFyY2hpdmVzUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IFtpZHgsIGRyaXZlcktleV0gb2YgZHJpdmVyc1RvU3luYy5lbnRyaWVzKCkpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmIChhd2FpdCB0aGlzLnJldHJpZXZlRHJpdmVyKGlkeCwgZHJpdmVyS2V5LCBhcmNoaXZlc1Jvb3QsICFfLmlzRW1wdHkob3B0cykpKSB7XG4gICAgICAgICAgICBzeW5jaHJvbml6ZWREcml2ZXJzLnB1c2goZHJpdmVyS2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkpO1xuXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggJSBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID09PSAwKSB7XG4gICAgICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZihhcmNoaXZlc1Jvb3QpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShzeW5jaHJvbml6ZWREcml2ZXJzKSkge1xuICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBzeW5jaHJvbml6ZWQgYCArXG4gICAgICAgIGAke3V0aWwucGx1cmFsaXplKCdjaHJvbWVkcml2ZXInLCBzeW5jaHJvbml6ZWREcml2ZXJzLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKGBObyBjaHJvbWVkcml2ZXJzIHdlcmUgc3luY2hyb25pemVkYCk7XG4gICAgfVxuICAgIHJldHVybiBzeW5jaHJvbml6ZWREcml2ZXJzO1xuICB9XG59XG5cblxuZXhwb3J0IGRlZmF1bHQgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVu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
|