appium-chromedriver 5.2.4 → 5.2.5
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/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 +1 -1
|
@@ -1,40 +1,24 @@
|
|
|
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 = exports.Chromedriver = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _events = _interopRequireDefault(require("events"));
|
|
13
|
-
|
|
14
10
|
var _driver = require("appium/driver");
|
|
15
|
-
|
|
16
11
|
var _child_process = _interopRequireDefault(require("child_process"));
|
|
17
|
-
|
|
18
12
|
var _support = require("appium/support");
|
|
19
|
-
|
|
20
13
|
var _asyncbox = require("asyncbox");
|
|
21
|
-
|
|
22
14
|
var _teen_process = require("teen_process");
|
|
23
|
-
|
|
24
15
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
25
|
-
|
|
26
16
|
var _utils = require("./utils");
|
|
27
|
-
|
|
28
17
|
var _semver = _interopRequireDefault(require("semver"));
|
|
29
|
-
|
|
30
18
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
31
|
-
|
|
32
19
|
var _path = _interopRequireDefault(require("path"));
|
|
33
|
-
|
|
34
20
|
var _compareVersions = require("compare-versions");
|
|
35
|
-
|
|
36
21
|
var _storageClient = _interopRequireDefault(require("./storage-client"));
|
|
37
|
-
|
|
38
22
|
var _protocolHelpers = require("./protocol-helpers");
|
|
39
23
|
|
|
40
24
|
const NEW_CD_VERSION_FORMAT_MAJOR_VERSION = 73;
|
|
@@ -46,7 +30,6 @@ const WEBVIEW_SHELL_BUNDLE_ID = 'org.chromium.webview_shell';
|
|
|
46
30
|
const WEBVIEW_BUNDLE_IDS = ['com.google.android.webview', 'com.android.webview'];
|
|
47
31
|
const VERSION_PATTERN = /([\d.]+)/;
|
|
48
32
|
const CD_VERSION_TIMEOUT = 5000;
|
|
49
|
-
|
|
50
33
|
class Chromedriver extends _events.default.EventEmitter {
|
|
51
34
|
constructor(args = {}) {
|
|
52
35
|
super();
|
|
@@ -94,17 +77,13 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
94
77
|
this.capabilities = {};
|
|
95
78
|
this.desiredProtocol = _driver.PROTOCOLS.MJSONWP;
|
|
96
79
|
}
|
|
97
|
-
|
|
98
80
|
get log() {
|
|
99
81
|
return this._log;
|
|
100
82
|
}
|
|
101
|
-
|
|
102
83
|
async getDriversMapping() {
|
|
103
84
|
let mapping = _lodash.default.cloneDeep(_utils.CHROMEDRIVER_CHROME_MAPPING);
|
|
104
|
-
|
|
105
85
|
if (this.mappingPath) {
|
|
106
86
|
this.log.debug(`Attempting to use Chromedriver->Chrome mapping from '${this.mappingPath}'`);
|
|
107
|
-
|
|
108
87
|
if (!(await _support.fs.exists(this.mappingPath))) {
|
|
109
88
|
this.log.warn(`No file found at '${this.mappingPath}'`);
|
|
110
89
|
this.log.info('Defaulting to the static Chromedriver->Chrome mapping');
|
|
@@ -122,17 +101,14 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
122
101
|
|
|
123
102
|
for (const [cdVersion, chromeVersion] of _lodash.default.toPairs(mapping)) {
|
|
124
103
|
const coercedVersion = _semver.default.coerce(chromeVersion);
|
|
125
|
-
|
|
126
104
|
if (coercedVersion) {
|
|
127
105
|
mapping[cdVersion] = coercedVersion.version;
|
|
128
106
|
} else {
|
|
129
107
|
this.log.info(`'${chromeVersion}' is not a valid version number. Skipping it`);
|
|
130
108
|
}
|
|
131
109
|
}
|
|
132
|
-
|
|
133
110
|
return mapping;
|
|
134
111
|
}
|
|
135
|
-
|
|
136
112
|
async getChromedrivers(mapping) {
|
|
137
113
|
const executables = await _support.fs.glob('*', {
|
|
138
114
|
cwd: this.executableDir,
|
|
@@ -148,22 +124,17 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
148
124
|
stderr = null
|
|
149
125
|
}) => {
|
|
150
126
|
let errMsg = `Cannot retrieve version number from '${_path.default.basename(executable)}' Chromedriver binary. ` + `Make sure it returns a valid version string in response to '--version' command line argument. ${message}`;
|
|
151
|
-
|
|
152
127
|
if (stdout) {
|
|
153
128
|
errMsg += `\nStdout: ${stdout}`;
|
|
154
129
|
}
|
|
155
|
-
|
|
156
130
|
if (stderr) {
|
|
157
131
|
errMsg += `\nStderr: ${stderr}`;
|
|
158
132
|
}
|
|
159
|
-
|
|
160
133
|
this.log.warn(errMsg);
|
|
161
134
|
return null;
|
|
162
135
|
};
|
|
163
|
-
|
|
164
136
|
let stdout;
|
|
165
137
|
let stderr;
|
|
166
|
-
|
|
167
138
|
try {
|
|
168
139
|
({
|
|
169
140
|
stdout,
|
|
@@ -178,9 +149,7 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
178
149
|
|
|
179
150
|
stdout = err.stdout;
|
|
180
151
|
}
|
|
181
|
-
|
|
182
152
|
const match = /ChromeDriver\s+\(?v?([\d.]+)\)?/i.exec(stdout);
|
|
183
|
-
|
|
184
153
|
if (!match) {
|
|
185
154
|
return logError({
|
|
186
155
|
message: 'Cannot parse the version string',
|
|
@@ -188,81 +157,62 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
188
157
|
stderr
|
|
189
158
|
});
|
|
190
159
|
}
|
|
191
|
-
|
|
192
160
|
let version = match[1];
|
|
193
161
|
let minChromeVersion = mapping[version];
|
|
194
|
-
|
|
195
162
|
const coercedVersion = _semver.default.coerce(version);
|
|
196
|
-
|
|
197
163
|
if (coercedVersion) {
|
|
198
164
|
if (coercedVersion.major < NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {
|
|
199
165
|
version = `${coercedVersion.major}.${coercedVersion.minor}`;
|
|
200
166
|
minChromeVersion = mapping[version];
|
|
201
167
|
}
|
|
202
|
-
|
|
203
168
|
if (!minChromeVersion && coercedVersion.major >= NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {
|
|
204
169
|
minChromeVersion = `${coercedVersion.major}`;
|
|
205
170
|
}
|
|
206
171
|
}
|
|
207
|
-
|
|
208
172
|
return {
|
|
209
173
|
executable,
|
|
210
174
|
version,
|
|
211
175
|
minChromeVersion
|
|
212
176
|
};
|
|
213
177
|
})).filter(cd => !!cd).sort((a, b) => (0, _compareVersions.compareVersions)(b.version, a.version));
|
|
214
|
-
|
|
215
178
|
if (_lodash.default.isEmpty(cds)) {
|
|
216
179
|
this.log.info(`No Chromedrivers were found in '${this.executableDir}'`);
|
|
217
180
|
return cds;
|
|
218
181
|
}
|
|
219
|
-
|
|
220
182
|
this.log.debug(`The following Chromedriver executables were found:`);
|
|
221
|
-
|
|
222
183
|
for (const cd of cds) {
|
|
223
184
|
this.log.debug(` '${cd.executable}' (version '${cd.version}', minimum Chrome version '${cd.minChromeVersion ? cd.minChromeVersion : 'Unknown'}')`);
|
|
224
185
|
}
|
|
225
|
-
|
|
226
186
|
return cds;
|
|
227
187
|
}
|
|
228
|
-
|
|
229
188
|
async getChromeVersion() {
|
|
230
189
|
var _this$details, _this$details3, _this$details3$info;
|
|
231
|
-
|
|
232
190
|
if ((_this$details = this.details) !== null && _this$details !== void 0 && _this$details.info) {
|
|
233
191
|
var _this$details2, _this$details2$info;
|
|
234
|
-
|
|
235
192
|
this.log.debug(`Browser version in the supplied details: ${(_this$details2 = this.details) === null || _this$details2 === void 0 ? void 0 : (_this$details2$info = _this$details2.info) === null || _this$details2$info === void 0 ? void 0 : _this$details2$info.Browser}`);
|
|
236
193
|
}
|
|
237
|
-
|
|
238
194
|
const versionMatch = VERSION_PATTERN.exec((_this$details3 = this.details) === null || _this$details3 === void 0 ? void 0 : (_this$details3$info = _this$details3.info) === null || _this$details3$info === void 0 ? void 0 : _this$details3$info.Browser);
|
|
239
|
-
|
|
240
195
|
if (versionMatch) {
|
|
241
196
|
const coercedVersion = _semver.default.coerce(versionMatch[1]);
|
|
242
|
-
|
|
243
197
|
if (coercedVersion) {
|
|
244
198
|
return coercedVersion;
|
|
245
199
|
}
|
|
246
200
|
}
|
|
247
|
-
|
|
248
201
|
let chromeVersion;
|
|
249
202
|
|
|
250
203
|
if (this.bundleId === WEBVIEW_SHELL_BUNDLE_ID) {
|
|
251
204
|
for (const bundleId of WEBVIEW_BUNDLE_IDS) {
|
|
252
205
|
chromeVersion = await (0, _utils.getChromeVersion)(this.adb, bundleId);
|
|
253
|
-
|
|
254
206
|
if (chromeVersion) {
|
|
255
207
|
this.bundleId = bundleId;
|
|
256
208
|
return _semver.default.coerce(chromeVersion);
|
|
257
209
|
}
|
|
258
210
|
}
|
|
259
|
-
|
|
260
211
|
return null;
|
|
261
212
|
}
|
|
262
213
|
|
|
263
214
|
if (this.adb) {
|
|
264
215
|
const apiLevel = await this.adb.getApiLevel();
|
|
265
|
-
|
|
266
216
|
if (apiLevel >= 24 && apiLevel <= 28 && [WEBVIEW_SHELL_BUNDLE_ID, ...WEBVIEW_BUNDLE_IDS].includes(this.bundleId)) {
|
|
267
217
|
this.bundleId = CHROME_BUNDLE_ID;
|
|
268
218
|
}
|
|
@@ -273,7 +223,6 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
273
223
|
|
|
274
224
|
for (const bundleId of WEBVIEW_BUNDLE_IDS) {
|
|
275
225
|
chromeVersion = await (0, _utils.getChromeVersion)(this.adb, bundleId);
|
|
276
|
-
|
|
277
226
|
if (chromeVersion) {
|
|
278
227
|
this.bundleId = bundleId;
|
|
279
228
|
break;
|
|
@@ -287,10 +236,8 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
287
236
|
|
|
288
237
|
return chromeVersion ? _semver.default.coerce(chromeVersion) : null;
|
|
289
238
|
}
|
|
290
|
-
|
|
291
239
|
async updateDriversMapping(newMapping) {
|
|
292
240
|
let shouldUpdateStaticMapping = true;
|
|
293
|
-
|
|
294
241
|
if (await _support.fs.exists(this.mappingPath)) {
|
|
295
242
|
try {
|
|
296
243
|
await _support.fs.writeFile(this.mappingPath, JSON.stringify(newMapping, null, 2), 'utf8');
|
|
@@ -299,25 +246,19 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
299
246
|
this.log.warn(`Cannot store the updated chromedrivers mapping into '${this.mappingPath}'. ` + `This may reduce the performance of further executions. Original error: ${e.message}`);
|
|
300
247
|
}
|
|
301
248
|
}
|
|
302
|
-
|
|
303
249
|
if (shouldUpdateStaticMapping) {
|
|
304
250
|
Object.assign(_utils.CHROMEDRIVER_CHROME_MAPPING, newMapping);
|
|
305
251
|
}
|
|
306
252
|
}
|
|
307
|
-
|
|
308
253
|
async getCompatibleChromedriver() {
|
|
309
254
|
if (!this.adb) {
|
|
310
255
|
return await (0, _utils.getChromedriverBinaryPath)();
|
|
311
256
|
}
|
|
312
|
-
|
|
313
257
|
const mapping = await this.getDriversMapping();
|
|
314
|
-
|
|
315
258
|
if (!_lodash.default.isEmpty(mapping)) {
|
|
316
259
|
this.log.debug(`The most recent known Chrome version: ${_lodash.default.values(mapping)[0]}`);
|
|
317
260
|
}
|
|
318
|
-
|
|
319
261
|
let didStorageSync = false;
|
|
320
|
-
|
|
321
262
|
const syncChromedrivers = async chromeVersion => {
|
|
322
263
|
didStorageSync = true;
|
|
323
264
|
const retrievedMapping = await this.storageClient.retrieveMapping();
|
|
@@ -325,11 +266,9 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
325
266
|
const driverKeys = await this.storageClient.syncDrivers({
|
|
326
267
|
minBrowserVersion: chromeVersion.major
|
|
327
268
|
});
|
|
328
|
-
|
|
329
269
|
if (_lodash.default.isEmpty(driverKeys)) {
|
|
330
270
|
return false;
|
|
331
271
|
}
|
|
332
|
-
|
|
333
272
|
const synchronizedDriversMapping = driverKeys.reduce((acc, x) => {
|
|
334
273
|
const {
|
|
335
274
|
version,
|
|
@@ -342,11 +281,9 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
342
281
|
await this.updateDriversMapping(mapping);
|
|
343
282
|
return true;
|
|
344
283
|
};
|
|
345
|
-
|
|
346
284
|
do {
|
|
347
285
|
const cds = await this.getChromedrivers(mapping);
|
|
348
286
|
const missingVersions = {};
|
|
349
|
-
|
|
350
287
|
for (const {
|
|
351
288
|
version,
|
|
352
289
|
minChromeVersion
|
|
@@ -354,26 +291,20 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
354
291
|
if (!minChromeVersion || mapping[version]) {
|
|
355
292
|
continue;
|
|
356
293
|
}
|
|
357
|
-
|
|
358
294
|
const coercedVer = _semver.default.coerce(version);
|
|
359
|
-
|
|
360
295
|
if (!coercedVer || coercedVer.major < NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {
|
|
361
296
|
continue;
|
|
362
297
|
}
|
|
363
|
-
|
|
364
298
|
missingVersions[version] = minChromeVersion;
|
|
365
299
|
}
|
|
366
|
-
|
|
367
300
|
if (!_lodash.default.isEmpty(missingVersions)) {
|
|
368
301
|
this.log.info(`Found ${_support.util.pluralize('Chromedriver', _lodash.default.size(missingVersions), true)}, ` + `which ${_lodash.default.size(missingVersions) === 1 ? 'is' : 'are'} missing in the list of known versions: ` + JSON.stringify(missingVersions));
|
|
369
302
|
await this.updateDriversMapping(Object.assign(mapping, missingVersions));
|
|
370
303
|
}
|
|
371
|
-
|
|
372
304
|
if (this.disableBuildCheck) {
|
|
373
305
|
if (_lodash.default.isEmpty(cds)) {
|
|
374
306
|
this.log.errorAndThrow(`There must be at least one Chromedriver executable available for use if ` + `'chromedriverDisableBuildCheck' capability is set to 'true'`);
|
|
375
307
|
}
|
|
376
|
-
|
|
377
308
|
const {
|
|
378
309
|
version,
|
|
379
310
|
executable
|
|
@@ -382,14 +313,11 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
382
313
|
this.log.warn(`If this is wrong, set 'chromedriverDisableBuildCheck' capability to 'false'`);
|
|
383
314
|
return executable;
|
|
384
315
|
}
|
|
385
|
-
|
|
386
316
|
const chromeVersion = await this.getChromeVersion();
|
|
387
|
-
|
|
388
317
|
if (!chromeVersion) {
|
|
389
318
|
if (_lodash.default.isEmpty(cds)) {
|
|
390
319
|
this.log.errorAndThrow(`There must be at least one Chromedriver executable available for use if ` + `the current Chrome version cannot be determined`);
|
|
391
320
|
}
|
|
392
|
-
|
|
393
321
|
const {
|
|
394
322
|
version,
|
|
395
323
|
executable
|
|
@@ -397,20 +325,16 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
397
325
|
this.log.warn(`Unable to discover Chrome version. Using Chromedriver ${version} at '${executable}'`);
|
|
398
326
|
return executable;
|
|
399
327
|
}
|
|
400
|
-
|
|
401
328
|
this.log.debug(`Found Chrome bundle '${this.bundleId}' version '${chromeVersion}'`);
|
|
402
329
|
const matchingDrivers = cds.filter(({
|
|
403
330
|
minChromeVersion
|
|
404
331
|
}) => {
|
|
405
332
|
const minChromeVersionS = minChromeVersion && _semver.default.coerce(minChromeVersion);
|
|
406
|
-
|
|
407
333
|
if (!minChromeVersionS) {
|
|
408
334
|
return false;
|
|
409
335
|
}
|
|
410
|
-
|
|
411
336
|
return chromeVersion.major > NEW_CD_VERSION_FORMAT_MAJOR_VERSION ? minChromeVersionS.major === chromeVersion.major : _semver.default.gte(chromeVersion, minChromeVersionS);
|
|
412
337
|
});
|
|
413
|
-
|
|
414
338
|
if (_lodash.default.isEmpty(matchingDrivers)) {
|
|
415
339
|
if (this.storageClient && !didStorageSync) {
|
|
416
340
|
try {
|
|
@@ -422,105 +346,84 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
422
346
|
this.log.debug(e.stack);
|
|
423
347
|
}
|
|
424
348
|
}
|
|
425
|
-
|
|
426
349
|
const autodownloadSuggestion = 'You could also try to enable automated chromedrivers download as ' + 'a possible workaround.';
|
|
427
350
|
throw new Error(`No Chromedriver found that can automate Chrome '${chromeVersion}'.` + (this.storageClient ? '' : ` ${autodownloadSuggestion}`));
|
|
428
351
|
}
|
|
429
|
-
|
|
430
352
|
const binPath = matchingDrivers[0].executable;
|
|
431
353
|
this.log.debug(`Found ${_support.util.pluralize('executable', matchingDrivers.length, true)} ` + `capable of automating Chrome '${chromeVersion}'.\nChoosing the most recent, '${binPath}'.`);
|
|
432
354
|
this.log.debug('If a specific version is required, specify it with the `chromedriverExecutable`' + 'desired capability.');
|
|
433
355
|
return binPath;
|
|
434
356
|
} while (true);
|
|
435
357
|
}
|
|
436
|
-
|
|
437
358
|
async initChromedriverPath() {
|
|
438
359
|
if (this.executableVerified) return;
|
|
439
360
|
|
|
440
361
|
if (!this.chromedriver) {
|
|
441
362
|
this.chromedriver = this.useSystemExecutable ? await (0, _utils.getChromedriverBinaryPath)() : await this.getCompatibleChromedriver();
|
|
442
363
|
}
|
|
443
|
-
|
|
444
364
|
if (!(await _support.fs.exists(this.chromedriver))) {
|
|
445
365
|
throw new Error(`Trying to use a chromedriver binary at the path ` + `${this.chromedriver}, but it doesn't exist!`);
|
|
446
366
|
}
|
|
447
|
-
|
|
448
367
|
this.executableVerified = true;
|
|
449
368
|
this.log.info(`Set chromedriver binary as: ${this.chromedriver}`);
|
|
450
369
|
}
|
|
451
|
-
|
|
452
370
|
syncProtocol(cdVersion = null) {
|
|
453
371
|
const coercedVersion = _semver.default.coerce(cdVersion);
|
|
454
|
-
|
|
455
372
|
if (!coercedVersion || coercedVersion.major < MIN_CD_VERSION_WITH_W3C_SUPPORT) {
|
|
456
373
|
this.log.debug(`Chromedriver v. ${cdVersion} does not fully support ${_driver.PROTOCOLS.W3C} protocol. ` + `Defaulting to ${_driver.PROTOCOLS.MJSONWP}`);
|
|
457
374
|
return;
|
|
458
375
|
}
|
|
459
|
-
|
|
460
376
|
const chromeOptions = (0, _protocolHelpers.getCapValue)(this.capabilities, 'chromeOptions', {});
|
|
461
|
-
|
|
462
377
|
if (chromeOptions.w3c === false) {
|
|
463
378
|
this.log.info(`Chromedriver v. ${cdVersion} supports ${_driver.PROTOCOLS.W3C} protocol, ` + `but ${_driver.PROTOCOLS.MJSONWP} one has been explicitly requested`);
|
|
464
379
|
return;
|
|
465
380
|
}
|
|
466
|
-
|
|
467
381
|
this.desiredProtocol = _driver.PROTOCOLS.W3C;
|
|
468
382
|
this.capabilities = (0, _protocolHelpers.toW3cCapNames)(this.capabilities);
|
|
469
383
|
}
|
|
470
|
-
|
|
471
384
|
async start(caps, emitStartingState = true) {
|
|
472
385
|
this.capabilities = _lodash.default.cloneDeep(caps);
|
|
473
|
-
this.capabilities.loggingPrefs = _lodash.default.cloneDeep((0, _protocolHelpers.getCapValue)(caps, 'loggingPrefs', {}));
|
|
474
386
|
|
|
387
|
+
this.capabilities.loggingPrefs = _lodash.default.cloneDeep((0, _protocolHelpers.getCapValue)(caps, 'loggingPrefs', {}));
|
|
475
388
|
if (_lodash.default.isEmpty(this.capabilities.loggingPrefs.browser)) {
|
|
476
389
|
this.capabilities.loggingPrefs.browser = 'ALL';
|
|
477
390
|
}
|
|
478
|
-
|
|
479
391
|
if (emitStartingState) {
|
|
480
392
|
this.changeState(Chromedriver.STATE_STARTING);
|
|
481
393
|
}
|
|
482
|
-
|
|
483
394
|
const args = [`--port=${this.proxyPort}`];
|
|
484
|
-
|
|
485
395
|
if (this.adb && this.adb.adbPort) {
|
|
486
396
|
args.push(`--adb-port=${this.adb.adbPort}`);
|
|
487
397
|
}
|
|
488
|
-
|
|
489
398
|
if (_lodash.default.isArray(this.cmdArgs)) {
|
|
490
399
|
args.push(...this.cmdArgs);
|
|
491
400
|
}
|
|
492
|
-
|
|
493
401
|
if (this.logPath) {
|
|
494
402
|
args.push(`--log-path=${this.logPath}`);
|
|
495
403
|
}
|
|
496
|
-
|
|
497
404
|
if (this.disableBuildCheck) {
|
|
498
405
|
args.push('--disable-build-check');
|
|
499
406
|
}
|
|
500
|
-
|
|
501
407
|
args.push('--verbose');
|
|
502
|
-
|
|
503
408
|
const startDetector = stdout => stdout.startsWith('Starting ');
|
|
504
|
-
|
|
505
409
|
let processIsAlive = false;
|
|
506
410
|
let webviewVersion;
|
|
507
|
-
|
|
508
411
|
try {
|
|
509
412
|
await this.initChromedriverPath();
|
|
510
413
|
await this.killAll();
|
|
414
|
+
|
|
511
415
|
this.proc = new _teen_process.SubProcess(this.chromedriver, args);
|
|
512
416
|
processIsAlive = true;
|
|
417
|
+
|
|
513
418
|
this.proc.on('output', (stdout, stderr) => {
|
|
514
419
|
const out = stdout + stderr;
|
|
515
420
|
let match = /"Browser": "(.*)"/.exec(out);
|
|
516
|
-
|
|
517
421
|
if (match) {
|
|
518
422
|
webviewVersion = match[1];
|
|
519
423
|
this.log.debug(`Webview version: '${webviewVersion}'`);
|
|
520
424
|
}
|
|
521
425
|
|
|
522
426
|
match = /Starting ChromeDriver ([.\d]+)/.exec(out);
|
|
523
|
-
|
|
524
427
|
if (match) {
|
|
525
428
|
this.log.debug(`Chromedriver version: '${match[1]}'`);
|
|
526
429
|
this.syncProtocol(match[1]);
|
|
@@ -531,16 +434,15 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
531
434
|
if (!line.trim().length) continue;
|
|
532
435
|
this.log.debug(`[STDOUT] ${line}`);
|
|
533
436
|
}
|
|
534
|
-
|
|
535
437
|
for (let line of (stderr || '').trim().split('\n')) {
|
|
536
438
|
if (!line.trim().length) continue;
|
|
537
439
|
this.log.error(`[STDERR] ${line}`);
|
|
538
440
|
}
|
|
539
441
|
}
|
|
540
442
|
});
|
|
443
|
+
|
|
541
444
|
this.proc.on('exit', (code, signal) => {
|
|
542
445
|
processIsAlive = false;
|
|
543
|
-
|
|
544
446
|
if (this.state !== Chromedriver.STATE_STOPPED && this.state !== Chromedriver.STATE_STOPPING && this.state !== Chromedriver.STATE_RESTARTING) {
|
|
545
447
|
const msg = `Chromedriver exited unexpectedly with code ${code}, signal ${signal}`;
|
|
546
448
|
this.log.error(msg);
|
|
@@ -554,52 +456,38 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
554
456
|
} catch (e) {
|
|
555
457
|
this.log.debug(e);
|
|
556
458
|
this.emit(Chromedriver.EVENT_ERROR, e);
|
|
557
|
-
|
|
558
459
|
if (processIsAlive) {
|
|
559
460
|
await this.proc.stop();
|
|
560
461
|
}
|
|
561
|
-
|
|
562
462
|
let message = '';
|
|
563
|
-
|
|
564
463
|
if (e.message.includes('Chrome version must be')) {
|
|
565
464
|
var _exec;
|
|
566
|
-
|
|
567
465
|
message += 'Unable to automate Chrome version because it is not supported by this version of Chromedriver.\n';
|
|
568
|
-
|
|
569
466
|
if (webviewVersion) {
|
|
570
467
|
message += `Chrome version on the device: ${webviewVersion}\n`;
|
|
571
468
|
}
|
|
572
|
-
|
|
573
469
|
const versionsSupportedByDriver = ((_exec = /Chrome version must be (.+)/.exec(e.message)) === null || _exec === void 0 ? void 0 : _exec[1]) || '';
|
|
574
|
-
|
|
575
470
|
if (versionsSupportedByDriver) {
|
|
576
471
|
message += `Chromedriver supports Chrome version(s): ${versionsSupportedByDriver}\n`;
|
|
577
472
|
}
|
|
578
|
-
|
|
579
473
|
message += 'Check the driver tutorial for troubleshooting.\n';
|
|
580
474
|
}
|
|
581
|
-
|
|
582
475
|
message += e.message;
|
|
583
476
|
this.log.errorAndThrow(message);
|
|
584
477
|
}
|
|
585
478
|
}
|
|
586
|
-
|
|
587
479
|
sessionId() {
|
|
588
480
|
return this.state === Chromedriver.STATE_ONLINE ? this.jwproxy.sessionId : null;
|
|
589
481
|
}
|
|
590
|
-
|
|
591
482
|
async restart() {
|
|
592
483
|
this.log.info('Restarting chromedriver');
|
|
593
|
-
|
|
594
484
|
if (this.state !== Chromedriver.STATE_ONLINE) {
|
|
595
485
|
throw new Error("Can't restart when we're not online");
|
|
596
486
|
}
|
|
597
|
-
|
|
598
487
|
this.changeState(Chromedriver.STATE_RESTARTING);
|
|
599
488
|
await this.stop(false);
|
|
600
489
|
await this.start(this.capabilities, false);
|
|
601
490
|
}
|
|
602
|
-
|
|
603
491
|
async waitForOnline() {
|
|
604
492
|
let chromedriverStopped = false;
|
|
605
493
|
await (0, _asyncbox.retryInterval)(20, 200, async () => {
|
|
@@ -607,19 +495,15 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
607
495
|
chromedriverStopped = true;
|
|
608
496
|
return;
|
|
609
497
|
}
|
|
610
|
-
|
|
611
498
|
await this.getStatus();
|
|
612
499
|
});
|
|
613
|
-
|
|
614
500
|
if (chromedriverStopped) {
|
|
615
501
|
throw new Error('ChromeDriver crashed during startup.');
|
|
616
502
|
}
|
|
617
503
|
}
|
|
618
|
-
|
|
619
504
|
async getStatus() {
|
|
620
505
|
return await this.jwproxy.command('/status', 'GET');
|
|
621
506
|
}
|
|
622
|
-
|
|
623
507
|
async startSession() {
|
|
624
508
|
const sessionCaps = this.desiredProtocol === _driver.PROTOCOLS.W3C ? {
|
|
625
509
|
capabilities: {
|
|
@@ -633,12 +517,10 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
633
517
|
this.log.prefix = (0, _utils.generateLogPrefix)(this, this.jwproxy.sessionId);
|
|
634
518
|
this.changeState(Chromedriver.STATE_ONLINE);
|
|
635
519
|
}
|
|
636
|
-
|
|
637
520
|
async stop(emitStates = true) {
|
|
638
521
|
if (emitStates) {
|
|
639
522
|
this.changeState(Chromedriver.STATE_STOPPING);
|
|
640
523
|
}
|
|
641
|
-
|
|
642
524
|
const runSafeStep = async f => {
|
|
643
525
|
try {
|
|
644
526
|
return await f();
|
|
@@ -647,16 +529,13 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
647
529
|
this.log.debug(e.stack);
|
|
648
530
|
}
|
|
649
531
|
};
|
|
650
|
-
|
|
651
532
|
await runSafeStep(() => this.jwproxy.command('', 'DELETE'));
|
|
652
533
|
await runSafeStep(() => this.proc.stop('SIGTERM', 20000));
|
|
653
534
|
this.log.prefix = (0, _utils.generateLogPrefix)(this);
|
|
654
|
-
|
|
655
535
|
if (emitStates) {
|
|
656
536
|
this.changeState(Chromedriver.STATE_STOPPED);
|
|
657
537
|
}
|
|
658
538
|
}
|
|
659
|
-
|
|
660
539
|
changeState(state) {
|
|
661
540
|
this.state = state;
|
|
662
541
|
this.log.debug(`Changed state to '${state}'`);
|
|
@@ -664,44 +543,35 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
664
543
|
state
|
|
665
544
|
});
|
|
666
545
|
}
|
|
667
|
-
|
|
668
546
|
async sendCommand(url, method, body) {
|
|
669
547
|
return await this.jwproxy.command(url, method, body);
|
|
670
548
|
}
|
|
671
|
-
|
|
672
549
|
async proxyReq(req, res) {
|
|
673
550
|
return await this.jwproxy.proxyReqRes(req, res);
|
|
674
551
|
}
|
|
675
|
-
|
|
676
552
|
async killAll() {
|
|
677
553
|
let cmd = _support.system.isWindows() ? `wmic process where "commandline like '%chromedriver.exe%--port=${this.proxyPort}%'" delete` : `pkill -15 -f "${this.chromedriver}.*--port=${this.proxyPort}"`;
|
|
678
554
|
this.log.debug(`Killing any old chromedrivers, running: ${cmd}`);
|
|
679
|
-
|
|
680
555
|
try {
|
|
681
556
|
await _bluebird.default.promisify(_child_process.default.exec)(cmd);
|
|
682
557
|
this.log.debug('Successfully cleaned up old chromedrivers');
|
|
683
558
|
} catch (err) {
|
|
684
559
|
this.log.warn('No old chromedrivers seem to exist');
|
|
685
560
|
}
|
|
686
|
-
|
|
687
561
|
if (this.adb) {
|
|
688
562
|
const udidIndex = this.adb.executable.defaultArgs.findIndex(item => item === '-s');
|
|
689
563
|
const udid = udidIndex > -1 ? this.adb.executable.defaultArgs[udidIndex + 1] : null;
|
|
690
|
-
|
|
691
564
|
if (udid) {
|
|
692
565
|
this.log.debug(`Cleaning this device's adb forwarded port socket connections: ${udid}`);
|
|
693
566
|
} else {
|
|
694
567
|
this.log.debug(`Cleaning any old adb forwarded port socket connections`);
|
|
695
568
|
}
|
|
696
|
-
|
|
697
569
|
try {
|
|
698
570
|
for (let conn of await this.adb.getForwardList()) {
|
|
699
571
|
if (!(conn.includes('webview_devtools') && (!udid || conn.includes(udid)))) {
|
|
700
572
|
continue;
|
|
701
573
|
}
|
|
702
|
-
|
|
703
574
|
let params = conn.split(/\s+/);
|
|
704
|
-
|
|
705
575
|
if (params.length > 1) {
|
|
706
576
|
await this.adb.removePortForward(params[1].replace(/[\D]*/, ''));
|
|
707
577
|
}
|
|
@@ -711,7 +581,6 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
711
581
|
}
|
|
712
582
|
}
|
|
713
583
|
}
|
|
714
|
-
|
|
715
584
|
async hasWorkingWebview() {
|
|
716
585
|
try {
|
|
717
586
|
await this.jwproxy.command('/url', 'GET');
|
|
@@ -720,9 +589,7 @@ class Chromedriver extends _events.default.EventEmitter {
|
|
|
720
589
|
return false;
|
|
721
590
|
}
|
|
722
591
|
}
|
|
723
|
-
|
|
724
592
|
}
|
|
725
|
-
|
|
726
593
|
exports.Chromedriver = Chromedriver;
|
|
727
594
|
Chromedriver.EVENT_ERROR = 'chromedriver_error';
|
|
728
595
|
Chromedriver.EVENT_CHANGED = 'stateChanged';
|
|
@@ -733,4 +600,4 @@ Chromedriver.STATE_STOPPING = 'stopping';
|
|
|
733
600
|
Chromedriver.STATE_RESTARTING = 'restarting';
|
|
734
601
|
var _default = Chromedriver;
|
|
735
602
|
exports.default = _default;
|
|
736
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTiIsIkRFRkFVTFRfSE9TVCIsIk1JTl9DRF9WRVJTSU9OX1dJVEhfVzNDX1NVUFBPUlQiLCJERUZBVUxUX1BPUlQiLCJDSFJPTUVfQlVORExFX0lEIiwiV0VCVklFV19TSEVMTF9CVU5ETEVfSUQiLCJXRUJWSUVXX0JVTkRMRV9JRFMiLCJWRVJTSU9OX1BBVFRFUk4iLCJDRF9WRVJTSU9OX1RJTUVPVVQiLCJDaHJvbWVkcml2ZXIiLCJldmVudHMiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJob3N0IiwicG9ydCIsInVzZVN5c3RlbUV4ZWN1dGFibGUiLCJleGVjdXRhYmxlIiwiZXhlY3V0YWJsZURpciIsImdldENocm9tZWRyaXZlckRpciIsImJ1bmRsZUlkIiwibWFwcGluZ1BhdGgiLCJjbWRBcmdzIiwiYWRiIiwidmVyYm9zZSIsImxvZ1BhdGgiLCJkaXNhYmxlQnVpbGRDaGVjayIsImRldGFpbHMiLCJpc0F1dG9kb3dubG9hZEVuYWJsZWQiLCJfbG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiZ2VuZXJhdGVMb2dQcmVmaXgiLCJwcm94eUhvc3QiLCJwcm94eVBvcnQiLCJwcm9jIiwiY2hyb21lZHJpdmVyIiwiZXhlY3V0YWJsZVZlcmlmaWVkIiwic3RhdGUiLCJTVEFURV9TVE9QUEVEIiwiandwcm94eSIsIkpXUHJveHkiLCJzZXJ2ZXIiLCJsb2ciLCJzdG9yYWdlQ2xpZW50IiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNocm9tZWRyaXZlckRpciIsImNhcGFiaWxpdGllcyIsImRlc2lyZWRQcm90b2NvbCIsIlBST1RPQ09MUyIsIk1KU09OV1AiLCJnZXREcml2ZXJzTWFwcGluZyIsIm1hcHBpbmciLCJfIiwiY2xvbmVEZWVwIiwiQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HIiwiZGVidWciLCJmcyIsImV4aXN0cyIsIndhcm4iLCJpbmZvIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGUiLCJlcnIiLCJtZXNzYWdlIiwiY2RWZXJzaW9uIiwiY2hyb21lVmVyc2lvbiIsInRvUGFpcnMiLCJjb2VyY2VkVmVyc2lvbiIsInNlbXZlciIsImNvZXJjZSIsInZlcnNpb24iLCJnZXRDaHJvbWVkcml2ZXJzIiwiZXhlY3V0YWJsZXMiLCJnbG9iIiwiY3dkIiwic3RyaWN0Iiwibm9kaXIiLCJhYnNvbHV0ZSIsInV0aWwiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJjZHMiLCJhc3luY21hcCIsImxvZ0Vycm9yIiwic3Rkb3V0Iiwic3RkZXJyIiwiZXJyTXNnIiwicGF0aCIsImJhc2VuYW1lIiwiZXhlYyIsInRpbWVvdXQiLCJpbmNsdWRlcyIsIm1hdGNoIiwibWluQ2hyb21lVmVyc2lvbiIsIm1ham9yIiwibWlub3IiLCJmaWx0ZXIiLCJjZCIsInNvcnQiLCJhIiwiYiIsImNvbXBhcmVWZXJzaW9ucyIsImlzRW1wdHkiLCJnZXRDaHJvbWVWZXJzaW9uIiwiQnJvd3NlciIsInZlcnNpb25NYXRjaCIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJ1cGRhdGVEcml2ZXJzTWFwcGluZyIsIm5ld01hcHBpbmciLCJzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nIiwid3JpdGVGaWxlIiwic3RyaW5naWZ5IiwiZSIsIk9iamVjdCIsImFzc2lnbiIsImdldENvbXBhdGlibGVDaHJvbWVkcml2ZXIiLCJnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIiwidmFsdWVzIiwiZGlkU3RvcmFnZVN5bmMiLCJzeW5jQ2hyb21lZHJpdmVycyIsInJldHJpZXZlZE1hcHBpbmciLCJyZXRyaWV2ZU1hcHBpbmciLCJkcml2ZXJLZXlzIiwic3luY0RyaXZlcnMiLCJtaW5Ccm93c2VyVmVyc2lvbiIsInN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nIiwicmVkdWNlIiwiYWNjIiwieCIsIm1pc3NpbmdWZXJzaW9ucyIsImNvZXJjZWRWZXIiLCJzaXplIiwiZXJyb3JBbmRUaHJvdyIsIm1hdGNoaW5nRHJpdmVycyIsIm1pbkNocm9tZVZlcnNpb25TIiwiZ3RlIiwiQ0RfQ0ROIiwic3RhY2siLCJhdXRvZG93bmxvYWRTdWdnZXN0aW9uIiwiRXJyb3IiLCJiaW5QYXRoIiwiaW5pdENocm9tZWRyaXZlclBhdGgiLCJzeW5jUHJvdG9jb2wiLCJXM0MiLCJjaHJvbWVPcHRpb25zIiwiZ2V0Q2FwVmFsdWUiLCJ3M2MiLCJ0b1czY0NhcE5hbWVzIiwic3RhcnQiLCJjYXBzIiwiZW1pdFN0YXJ0aW5nU3RhdGUiLCJsb2dnaW5nUHJlZnMiLCJicm93c2VyIiwiY2hhbmdlU3RhdGUiLCJTVEFURV9TVEFSVElORyIsImFkYlBvcnQiLCJwdXNoIiwiaXNBcnJheSIsInN0YXJ0RGV0ZWN0b3IiLCJzdGFydHNXaXRoIiwicHJvY2Vzc0lzQWxpdmUiLCJ3ZWJ2aWV3VmVyc2lvbiIsImtpbGxBbGwiLCJTdWJQcm9jZXNzIiwib24iLCJvdXQiLCJsaW5lIiwidHJpbSIsInNwbGl0IiwiZXJyb3IiLCJjb2RlIiwic2lnbmFsIiwiU1RBVEVfU1RPUFBJTkciLCJTVEFURV9SRVNUQVJUSU5HIiwibXNnIiwiam9pbiIsIndhaXRGb3JPbmxpbmUiLCJzdGFydFNlc3Npb24iLCJlbWl0IiwiRVZFTlRfRVJST1IiLCJzdG9wIiwidmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlciIsInNlc3Npb25JZCIsIlNUQVRFX09OTElORSIsInJlc3RhcnQiLCJjaHJvbWVkcml2ZXJTdG9wcGVkIiwicmV0cnlJbnRlcnZhbCIsImdldFN0YXR1cyIsImNvbW1hbmQiLCJzZXNzaW9uQ2FwcyIsImFsd2F5c01hdGNoIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsInByZWZpeCIsImVtaXRTdGF0ZXMiLCJydW5TYWZlU3RlcCIsImYiLCJFVkVOVF9DSEFOR0VEIiwic2VuZENvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwicHJveHlSZXEiLCJyZXEiLCJyZXMiLCJwcm94eVJlcVJlcyIsImNtZCIsInN5c3RlbSIsImlzV2luZG93cyIsIkIiLCJwcm9taXNpZnkiLCJjcCIsInVkaWRJbmRleCIsImRlZmF1bHRBcmdzIiwiZmluZEluZGV4IiwiaXRlbSIsInVkaWQiLCJjb25uIiwiZ2V0Rm9yd2FyZExpc3QiLCJwYXJhbXMiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsInJlcGxhY2UiLCJoYXNXb3JraW5nV2VidmlldyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jaHJvbWVkcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IGV2ZW50cyBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgSldQcm94eSwgUFJPVE9DT0xTIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgY3AgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCBsb2dnZXIsIHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsLCBhc3luY21hcCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtcbiAgZ2V0Q2hyb21lVmVyc2lvbiwgZ2V0Q2hyb21lZHJpdmVyRGlyLCBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsXG4gIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgsIENEX0NETiwgZ2VuZXJhdGVMb2dQcmVmaXhcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IGZyb20gJy4vc3RvcmFnZS1jbGllbnQnO1xuaW1wb3J0IHsgdG9XM2NDYXBOYW1lcywgZ2V0Q2FwVmFsdWUgfSBmcm9tICcuL3Byb3RvY29sLWhlbHBlcnMnO1xuXG5jb25zdCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTiA9IDczO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUID0gNzU7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA5NTE1O1xuY29uc3QgQ0hST01FX0JVTkRMRV9JRCA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgV0VCVklFV19TSEVMTF9CVU5ETEVfSUQgPSAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnO1xuY29uc3QgV0VCVklFV19CVU5ETEVfSURTID0gW1xuICAnY29tLmdvb2dsZS5hbmRyb2lkLndlYnZpZXcnLFxuICAnY29tLmFuZHJvaWQud2VidmlldycsXG5dO1xuY29uc3QgVkVSU0lPTl9QQVRURVJOID0gLyhbXFxkLl0rKS87XG5cbmNvbnN0IENEX1ZFUlNJT05fVElNRU9VVCA9IDUwMDA7XG5cbmNsYXNzIENocm9tZWRyaXZlciBleHRlbmRzIGV2ZW50cy5FdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGhvc3QgPSBERUZBVUxUX0hPU1QsXG4gICAgICBwb3J0ID0gREVGQVVMVF9QT1JULFxuICAgICAgdXNlU3lzdGVtRXhlY3V0YWJsZSA9IGZhbHNlLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGV4ZWN1dGFibGVEaXIgPSBnZXRDaHJvbWVkcml2ZXJEaXIoKSxcbiAgICAgIGJ1bmRsZUlkLFxuICAgICAgbWFwcGluZ1BhdGgsXG4gICAgICBjbWRBcmdzLFxuICAgICAgYWRiLFxuICAgICAgdmVyYm9zZSxcbiAgICAgIGxvZ1BhdGgsXG4gICAgICBkaXNhYmxlQnVpbGRDaGVjayxcbiAgICAgIGRldGFpbHMsXG4gICAgICBpc0F1dG9kb3dubG9hZEVuYWJsZWQgPSBmYWxzZSxcbiAgICB9ID0gYXJncztcbiAgICB0aGlzLl9sb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKGdlbmVyYXRlTG9nUHJlZml4KHRoaXMpKTtcblxuICAgIHRoaXMucHJveHlIb3N0ID0gaG9zdDtcbiAgICB0aGlzLnByb3h5UG9ydCA9IHBvcnQ7XG4gICAgdGhpcy5hZGIgPSBhZGI7XG4gICAgdGhpcy5jbWRBcmdzID0gY21kQXJncztcbiAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgIHRoaXMudXNlU3lzdGVtRXhlY3V0YWJsZSA9IHVzZVN5c3RlbUV4ZWN1dGFibGU7XG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBleGVjdXRhYmxlO1xuICAgIHRoaXMuZXhlY3V0YWJsZURpciA9IGV4ZWN1dGFibGVEaXI7XG4gICAgdGhpcy5tYXBwaW5nUGF0aCA9IG1hcHBpbmdQYXRoO1xuICAgIHRoaXMuYnVuZGxlSWQgPSBidW5kbGVJZDtcbiAgICB0aGlzLmV4ZWN1dGFibGVWZXJpZmllZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUgPSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRDtcbiAgICB0aGlzLmp3cHJveHkgPSBuZXcgSldQcm94eSh7XG4gICAgICBzZXJ2ZXI6IHRoaXMucHJveHlIb3N0LFxuICAgICAgcG9ydDogdGhpcy5wcm94eVBvcnQsXG4gICAgICBsb2c6IHRoaXMuX2xvZyxcbiAgICB9KTtcbiAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlO1xuICAgIHRoaXMubG9nUGF0aCA9IGxvZ1BhdGg7XG4gICAgdGhpcy5kaXNhYmxlQnVpbGRDaGVjayA9ICEhZGlzYWJsZUJ1aWxkQ2hlY2s7XG4gICAgdGhpcy5zdG9yYWdlQ2xpZW50ID0gaXNBdXRvZG93bmxvYWRFbmFibGVkXG4gICAgICA/IG5ldyBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50KHsgY2hyb21lZHJpdmVyRGlyOiB0aGlzLmV4ZWN1dGFibGVEaXIgfSlcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICAgIHRoaXMuY2FwYWJpbGl0aWVzID0ge307XG4gICAgdGhpcy5kZXNpcmVkUHJvdG9jb2wgPSBQUk9UT0NPTFMuTUpTT05XUDtcbiAgfVxuXG4gIGdldCBsb2cgKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2c7XG4gIH1cblxuICBhc3luYyBnZXREcml2ZXJzTWFwcGluZyAoKSB7XG4gICAgbGV0IG1hcHBpbmcgPSBfLmNsb25lRGVlcChDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcpO1xuICAgIGlmICh0aGlzLm1hcHBpbmdQYXRoKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byB1c2UgQ2hyb21lZHJpdmVyLT5DaHJvbWUgbWFwcGluZyBmcm9tICcke3RoaXMubWFwcGluZ1BhdGh9J2ApO1xuICAgICAgaWYgKCFhd2FpdCBmcy5leGlzdHModGhpcy5tYXBwaW5nUGF0aCkpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgTm8gZmlsZSBmb3VuZCBhdCAnJHt0aGlzLm1hcHBpbmdQYXRofSdgKTtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRGVmYXVsdGluZyB0byB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWFwcGluZyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUodGhpcy5tYXBwaW5nUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oYEVycm9yIHBhcnNpbmcgbWFwcGluZyBmcm9tICcke3RoaXMubWFwcGluZ1BhdGh9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdEZWZhdWx0aW5nIHRvIHRoZSBzdGF0aWMgQ2hyb21lZHJpdmVyLT5DaHJvbWUgbWFwcGluZycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdVc2luZyB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGZvciBtaW5pbXVtIGNocm9tZSB2ZXJzaW9uIGFyZSBzZW12ZXIgY29tcGxpYW50XG4gICAgZm9yIChjb25zdCBbY2RWZXJzaW9uLCBjaHJvbWVWZXJzaW9uXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShjaHJvbWVWZXJzaW9uKTtcbiAgICAgIGlmIChjb2VyY2VkVmVyc2lvbikge1xuICAgICAgICBtYXBwaW5nW2NkVmVyc2lvbl0gPSBjb2VyY2VkVmVyc2lvbi52ZXJzaW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgJyR7Y2hyb21lVmVyc2lvbn0nIGlzIG5vdCBhIHZhbGlkIHZlcnNpb24gbnVtYmVyLiBTa2lwcGluZyBpdGApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwcGluZztcbiAgfVxuXG4gIGFzeW5jIGdldENocm9tZWRyaXZlcnMgKG1hcHBpbmcpIHtcbiAgICAvLyBnbyB0aHJvdWdoIHRoZSB2ZXJzaW9ucyBhdmFpbGFibGVcbiAgICBjb25zdCBleGVjdXRhYmxlcyA9IGF3YWl0IGZzLmdsb2IoJyonLCB7XG4gICAgICBjd2Q6IHRoaXMuZXhlY3V0YWJsZURpcixcbiAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICBub2RpcjogdHJ1ZSxcbiAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdleGVjdXRhYmxlJywgZXhlY3V0YWJsZXMubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICBgaW4gJyR7dGhpcy5leGVjdXRhYmxlRGlyfSdgKTtcbiAgICBjb25zdCBjZHMgPSAoYXdhaXQgYXN5bmNtYXAoZXhlY3V0YWJsZXMsIGFzeW5jIChleGVjdXRhYmxlKSA9PiB7XG4gICAgICBjb25zdCBsb2dFcnJvciA9ICh7bWVzc2FnZSwgc3Rkb3V0ID0gbnVsbCwgc3RkZXJyID0gbnVsbH0pID0+IHtcbiAgICAgICAgbGV0IGVyck1zZyA9IGBDYW5ub3QgcmV0cmlldmUgdmVyc2lvbiBudW1iZXIgZnJvbSAnJHtwYXRoLmJhc2VuYW1lKGV4ZWN1dGFibGUpfScgQ2hyb21lZHJpdmVyIGJpbmFyeS4gYCArXG4gICAgICAgICAgYE1ha2Ugc3VyZSBpdCByZXR1cm5zIGEgdmFsaWQgdmVyc2lvbiBzdHJpbmcgaW4gcmVzcG9uc2UgdG8gJy0tdmVyc2lvbicgY29tbWFuZCBsaW5lIGFyZ3VtZW50LiAke21lc3NhZ2V9YDtcbiAgICAgICAgaWYgKHN0ZG91dCkge1xuICAgICAgICAgIGVyck1zZyArPSBgXFxuU3Rkb3V0OiAke3N0ZG91dH1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICBlcnJNc2cgKz0gYFxcblN0ZGVycjogJHtzdGRlcnJ9YDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZy53YXJuKGVyck1zZyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcblxuICAgICAgbGV0IHN0ZG91dDtcbiAgICAgIGxldCBzdGRlcnI7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IGV4ZWMoZXhlY3V0YWJsZSwgWyctLXZlcnNpb24nXSwge1xuICAgICAgICAgIHRpbWVvdXQ6IENEX1ZFUlNJT05fVElNRU9VVCxcbiAgICAgICAgfSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghKGVyci5tZXNzYWdlIHx8ICcnKS5pbmNsdWRlcygndGltZWQgb3V0JykgJiYgIShlcnIuc3Rkb3V0IHx8ICcnKS5pbmNsdWRlcygnU3RhcnRpbmcgQ2hyb21lRHJpdmVyJykpIHtcbiAgICAgICAgICByZXR1cm4gbG9nRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoaXMgaGFzIHRpbWVkIG91dCwgaXQgaGFzIGFjdHVhbGx5IHN0YXJ0ZWQgQ2hyb21lZHJpdmVyLFxuICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHRoZXJlIHdpbGwgYWxzbyBiZSB0aGUgdmVyc2lvbiBzdHJpbmcgaW4gdGhlIG91dHB1dFxuICAgICAgICBzdGRvdXQgPSBlcnIuc3Rkb3V0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaCA9IC9DaHJvbWVEcml2ZXJcXHMrXFwoP3Y/KFtcXGQuXSspXFwpPy9pLmV4ZWMoc3Rkb3V0KTsgLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci96cGo1d0EvMVxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe21lc3NhZ2U6ICdDYW5ub3QgcGFyc2UgdGhlIHZlcnNpb24gc3RyaW5nJywgc3Rkb3V0LCBzdGRlcnJ9KTtcbiAgICAgIH1cbiAgICAgIGxldCB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICBsZXQgbWluQ2hyb21lVmVyc2lvbiA9IG1hcHBpbmdbdmVyc2lvbl07XG4gICAgICBjb25zdCBjb2VyY2VkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UodmVyc2lvbik7XG4gICAgICBpZiAoY29lcmNlZFZlcnNpb24pIHtcbiAgICAgICAgLy8gYmVmb3JlIDIwMTktMDMtMDYgdmVyc2lvbnMgd2VyZSBvZiB0aGUgZm9ybSBtYWpvci5taW5vclxuICAgICAgICBpZiAoY29lcmNlZFZlcnNpb24ubWFqb3IgPCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIHZlcnNpb24gPSBgJHtjb2VyY2VkVmVyc2lvbi5tYWpvcn0uJHtjb2VyY2VkVmVyc2lvbi5taW5vcn1gO1xuICAgICAgICAgIG1pbkNocm9tZVZlcnNpb24gPSBtYXBwaW5nW3ZlcnNpb25dO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWluQ2hyb21lVmVyc2lvbiAmJiBjb2VyY2VkVmVyc2lvbi5tYWpvciA+PSBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIC8vIEFzc3VtZSB0aGUgbWFqb3IgQ2hyb21lIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIG1ham9yIHZlcnNpb25cbiAgICAgICAgICBtaW5DaHJvbWVWZXJzaW9uID0gYCR7Y29lcmNlZFZlcnNpb24ubWFqb3J9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0YWJsZSxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgbWluQ2hyb21lVmVyc2lvbixcbiAgICAgIH07XG4gICAgfSkpXG4gICAgICAuZmlsdGVyKChjZCkgPT4gISFjZClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBjb21wYXJlVmVyc2lvbnMoYi52ZXJzaW9uLCBhLnZlcnNpb24pKTtcbiAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vIENocm9tZWRyaXZlcnMgd2VyZSBmb3VuZCBpbiAnJHt0aGlzLmV4ZWN1dGFibGVEaXJ9J2ApO1xuICAgICAgcmV0dXJuIGNkcztcbiAgICB9XG4gICAgdGhpcy5sb2cuZGVidWcoYFRoZSBmb2xsb3dpbmcgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGVzIHdlcmUgZm91bmQ6YCk7XG4gICAgZm9yIChjb25zdCBjZCBvZiBjZHMpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAgICAgJyR7Y2QuZXhlY3V0YWJsZX0nICh2ZXJzaW9uICcke2NkLnZlcnNpb259JywgbWluaW11bSBDaHJvbWUgdmVyc2lvbiAnJHtjZC5taW5DaHJvbWVWZXJzaW9uID8gY2QubWluQ2hyb21lVmVyc2lvbiA6ICdVbmtub3duJ30nKWApO1xuICAgIH1cbiAgICByZXR1cm4gY2RzO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2hyb21lVmVyc2lvbiAoKSB7XG4gICAgLy8gVHJ5IHRvIHJldHJpZXZlIHRoZSB2ZXJzaW9uIGZyb20gYGRldGFpbHNgIHByb3BlcnR5IGlmIGl0IGlzIHNldFxuICAgIC8vIFRoZSBgaW5mb2AgaXRlbSBtdXN0IGNvbnRhaW4gdGhlIG91dHB1dCBvZiAvanNvbi92ZXJzaW9uIENEUCBjb21tYW5kXG4gICAgLy8gd2hlcmUgYEJyb3dzZXJgIGZpZWxkIGxvb2tzIGxpa2UgYENocm9tZS83Mi4wLjM2MDEuMGBgXG4gICAgaWYgKHRoaXMuZGV0YWlscz8uaW5mbykge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEJyb3dzZXIgdmVyc2lvbiBpbiB0aGUgc3VwcGxpZWQgZGV0YWlsczogJHt0aGlzLmRldGFpbHM/LmluZm8/LkJyb3dzZXJ9YCk7XG4gICAgfVxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IFZFUlNJT05fUEFUVEVSTi5leGVjKHRoaXMuZGV0YWlscz8uaW5mbz8uQnJvd3Nlcik7XG4gICAgaWYgKHZlcnNpb25NYXRjaCkge1xuICAgICAgY29uc3QgY29lcmNlZFZlcnNpb24gPSBzZW12ZXIuY29lcmNlKHZlcnNpb25NYXRjaFsxXSk7XG4gICAgICBpZiAoY29lcmNlZFZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIGNvZXJjZWRWZXJzaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjaHJvbWVWZXJzaW9uO1xuXG4gICAgLy8gaW4gY2FzZSBvZiBXZWJWaWV3IEJyb3dzZXIgVGVzdGVyLCBzaW1wbHkgdHJ5IHRvIGZpbmQgdGhlIHVuZGVybHlpbmcgd2Vidmlld1xuICAgIGlmICh0aGlzLmJ1bmRsZUlkID09PSBXRUJWSUVXX1NIRUxMX0JVTkRMRV9JRCkge1xuICAgICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBXRUJWSUVXX0JVTkRMRV9JRFMpIHtcbiAgICAgICAgY2hyb21lVmVyc2lvbiA9IGF3YWl0IGdldENocm9tZVZlcnNpb24odGhpcy5hZGIsIGJ1bmRsZUlkKTtcbiAgICAgICAgaWYgKGNocm9tZVZlcnNpb24pIHtcbiAgICAgICAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgICAgICAgcmV0dXJuIHNlbXZlci5jb2VyY2UoY2hyb21lVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIG9uIEFuZHJvaWQgNy05IHdlYnZpZXdzIGFyZSBiYWNrZWQgYnkgdGhlIG1haW4gQ2hyb21lLCBub3QgdGhlIHN5c3RlbSB3ZWJ2aWV3XG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMjQgJiYgYXBpTGV2ZWwgPD0gMjggJiZcbiAgICAgICAgICBbV0VCVklFV19TSEVMTF9CVU5ETEVfSUQsIC4uLldFQlZJRVdfQlVORExFX0lEU10uaW5jbHVkZXModGhpcy5idW5kbGVJZCkpIHtcbiAgICAgICAgdGhpcy5idW5kbGVJZCA9IENIUk9NRV9CVU5ETEVfSUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdHJ5IG91dCB3ZWJ2aWV3cyB3aGVuIG5vIGJ1bmRsZSBpZCBpcyBzZW50IGluXG4gICAgaWYgKCF0aGlzLmJ1bmRsZUlkKSB7XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBnZW5lcmljIENocm9tZSBidW5kbGVcbiAgICAgIHRoaXMuYnVuZGxlSWQgPSBDSFJPTUVfQlVORExFX0lEO1xuXG4gICAgICAvLyB3ZSBoYXZlIGEgd2VidmlldyBvZiBzb21lIHNvcnQsIHNvIHRyeSB0byBmaW5kIHRoZSBidW5kbGUgdmVyc2lvblxuICAgICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBXRUJWSUVXX0JVTkRMRV9JRFMpIHtcbiAgICAgICAgY2hyb21lVmVyc2lvbiA9IGF3YWl0IGdldENocm9tZVZlcnNpb24odGhpcy5hZGIsIGJ1bmRsZUlkKTtcbiAgICAgICAgaWYgKGNocm9tZVZlcnNpb24pIHtcbiAgICAgICAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGNocm9tZSB2ZXJzaW9uLCBpdCBtdXN0IG5vdCBiZSBhIHdlYnZpZXdcbiAgICBpZiAoIWNocm9tZVZlcnNpb24pIHtcbiAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCB0aGlzLmJ1bmRsZUlkKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgaXQgaXMgc2VtdmVyLCBzbyBsYXRlciBjaGVja3Mgd29uJ3QgZmFpbFxuICAgIHJldHVybiBjaHJvbWVWZXJzaW9uID8gc2VtdmVyLmNvZXJjZShjaHJvbWVWZXJzaW9uKSA6IG51bGw7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEcml2ZXJzTWFwcGluZyAobmV3TWFwcGluZykge1xuICAgIGxldCBzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nID0gdHJ1ZTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHRoaXMubWFwcGluZ1BhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGhpcy5tYXBwaW5nUGF0aCwgSlNPTi5zdHJpbmdpZnkobmV3TWFwcGluZywgbnVsbCwgMiksICd1dGY4Jyk7XG4gICAgICAgIHNob3VsZFVwZGF0ZVN0YXRpY01hcHBpbmcgPSBmYWxzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHN0b3JlIHRoZSB1cGRhdGVkIGNocm9tZWRyaXZlcnMgbWFwcGluZyBpbnRvICcke3RoaXMubWFwcGluZ1BhdGh9Jy4gYCArXG4gICAgICAgICAgYFRoaXMgbWF5IHJlZHVjZSB0aGUgcGVyZm9ybWFuY2Ugb2YgZnVydGhlciBleGVjdXRpb25zLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nKSB7XG4gICAgICBPYmplY3QuYXNzaWduKENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORywgbmV3TWFwcGluZyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q29tcGF0aWJsZUNocm9tZWRyaXZlciAoKSB7XG4gICAgaWYgKCF0aGlzLmFkYikge1xuICAgICAgcmV0dXJuIGF3YWl0IGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgoKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXBwaW5nID0gYXdhaXQgdGhpcy5nZXREcml2ZXJzTWFwcGluZygpO1xuICAgIGlmICghXy5pc0VtcHR5KG1hcHBpbmcpKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVGhlIG1vc3QgcmVjZW50IGtub3duIENocm9tZSB2ZXJzaW9uOiAke18udmFsdWVzKG1hcHBpbmcpWzBdfWApO1xuICAgIH1cblxuICAgIGxldCBkaWRTdG9yYWdlU3luYyA9IGZhbHNlO1xuICAgIGNvbnN0IHN5bmNDaHJvbWVkcml2ZXJzID0gYXN5bmMgKGNocm9tZVZlcnNpb24pID0+IHtcbiAgICAgIGRpZFN0b3JhZ2VTeW5jID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJldHJpZXZlZE1hcHBpbmcgPSBhd2FpdCB0aGlzLnN0b3JhZ2VDbGllbnQucmV0cmlldmVNYXBwaW5nKCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnR290IGNocm9tZWRyaXZlcnMgbWFwcGluZyBmcm9tIHRoZSBzdG9yYWdlOiAnICtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocmV0cmlldmVkTWFwcGluZywgbnVsbCwgMikpO1xuICAgICAgY29uc3QgZHJpdmVyS2V5cyA9IGF3YWl0IHRoaXMuc3RvcmFnZUNsaWVudC5zeW5jRHJpdmVycyh7XG4gICAgICAgIG1pbkJyb3dzZXJWZXJzaW9uOiBjaHJvbWVWZXJzaW9uLm1ham9yLFxuICAgICAgfSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcktleXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nID0gZHJpdmVyS2V5cy5yZWR1Y2UoKGFjYywgeCkgPT4ge1xuICAgICAgICBjb25zdCB7dmVyc2lvbiwgbWluQnJvd3NlclZlcnNpb259ID0gcmV0cmlldmVkTWFwcGluZ1t4XTtcbiAgICAgICAgYWNjW3ZlcnNpb25dID0gbWluQnJvd3NlclZlcnNpb247XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gICAgICBPYmplY3QuYXNzaWduKG1hcHBpbmcsIHN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlRHJpdmVyc01hcHBpbmcobWFwcGluZyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgY2RzID0gYXdhaXQgdGhpcy5nZXRDaHJvbWVkcml2ZXJzKG1hcHBpbmcpO1xuXG4gICAgICBjb25zdCBtaXNzaW5nVmVyc2lvbnMgPSB7fTtcbiAgICAgIGZvciAoY29uc3Qge3ZlcnNpb24sIG1pbkNocm9tZVZlcnNpb259IG9mIGNkcykge1xuICAgICAgICBpZiAoIW1pbkNocm9tZVZlcnNpb24gfHwgbWFwcGluZ1t2ZXJzaW9uXSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZXJjZWRWZXIgPSBzZW12ZXIuY29lcmNlKHZlcnNpb24pO1xuICAgICAgICBpZiAoIWNvZXJjZWRWZXIgfHwgY29lcmNlZFZlci5tYWpvciA8IE5FV19DRF9WRVJTSU9OX0ZPUk1BVF9NQUpPUl9WRVJTSU9OKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBtaXNzaW5nVmVyc2lvbnNbdmVyc2lvbl0gPSBtaW5DaHJvbWVWZXJzaW9uO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkobWlzc2luZ1ZlcnNpb25zKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdDaHJvbWVkcml2ZXInLCBfLnNpemUobWlzc2luZ1ZlcnNpb25zKSwgdHJ1ZSl9LCBgICtcbiAgICAgICAgICBgd2hpY2ggJHtfLnNpemUobWlzc2luZ1ZlcnNpb25zKSA9PT0gMSA/ICdpcycgOiAnYXJlJ30gbWlzc2luZyBpbiB0aGUgbGlzdCBvZiBrbm93biB2ZXJzaW9uczogYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkobWlzc2luZ1ZlcnNpb25zKSk7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRHJpdmVyc01hcHBpbmcoT2JqZWN0LmFzc2lnbihtYXBwaW5nLCBtaXNzaW5nVmVyc2lvbnMpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZUJ1aWxkQ2hlY2spIHtcbiAgICAgICAgaWYgKF8uaXNFbXB0eShjZHMpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgJ2Nocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrJyBjYXBhYmlsaXR5IGlzIHNldCB0byAndHJ1ZSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIHRoaXMubG9nLndhcm4oYENocm9tZSBidWlsZCBjaGVjayBkaXNhYmxlZC4gVXNpbmcgbW9zdCByZWNlbnQgQ2hyb21lZHJpdmVyIHZlcnNpb24gKCR7dmVyc2lvbn0sIGF0ICcke2V4ZWN1dGFibGV9JylgKTtcbiAgICAgICAgdGhpcy5sb2cud2FybihgSWYgdGhpcyBpcyB3cm9uZywgc2V0ICdjaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjaycgY2FwYWJpbGl0eSB0byAnZmFsc2UnYCk7XG4gICAgICAgIHJldHVybiBleGVjdXRhYmxlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaHJvbWVWZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRDaHJvbWVWZXJzaW9uKCk7XG4gICAgICBpZiAoIWNocm9tZVZlcnNpb24pIHtcbiAgICAgICAgLy8gdW5hYmxlIHRvIGdldCB0aGUgY2hyb21lIHZlcnNpb25cbiAgICAgICAgaWYgKF8uaXNFbXB0eShjZHMpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgdGhlIGN1cnJlbnQgQ2hyb21lIHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byBkaXNjb3ZlciBDaHJvbWUgdmVyc2lvbi4gVXNpbmcgQ2hyb21lZHJpdmVyICR7dmVyc2lvbn0gYXQgJyR7ZXhlY3V0YWJsZX0nYCk7XG4gICAgICAgIHJldHVybiBleGVjdXRhYmxlO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoYEZvdW5kIENocm9tZSBidW5kbGUgJyR7dGhpcy5idW5kbGVJZH0nIHZlcnNpb24gJyR7Y2hyb21lVmVyc2lvbn0nYCk7XG5cbiAgICAgIGNvbnN0IG1hdGNoaW5nRHJpdmVycyA9IGNkcy5maWx0ZXIoKHttaW5DaHJvbWVWZXJzaW9ufSkgPT4ge1xuICAgICAgICBjb25zdCBtaW5DaHJvbWVWZXJzaW9uUyA9IG1pbkNocm9tZVZlcnNpb24gJiYgc2VtdmVyLmNvZXJjZShtaW5DaHJvbWVWZXJzaW9uKTtcbiAgICAgICAgaWYgKCFtaW5DaHJvbWVWZXJzaW9uUykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaHJvbWVWZXJzaW9uLm1ham9yID4gTkVXX0NEX1ZFUlNJT05fRk9STUFUX01BSk9SX1ZFUlNJT05cbiAgICAgICAgICA/IG1pbkNocm9tZVZlcnNpb25TLm1ham9yID09PSBjaHJvbWVWZXJzaW9uLm1ham9yXG4gICAgICAgICAgOiBzZW12ZXIuZ3RlKGNocm9tZVZlcnNpb24sIG1pbkNocm9tZVZlcnNpb25TKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKF8uaXNFbXB0eShtYXRjaGluZ0RyaXZlcnMpKSB7XG4gICAgICAgIGlmICh0aGlzLnN0b3JhZ2VDbGllbnQgJiYgIWRpZFN0b3JhZ2VTeW5jKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBzeW5jQ2hyb21lZHJpdmVycyhjaHJvbWVWZXJzaW9uKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3Qgc3luY2hyb25pemUgbG9jYWwgY2hyb21lZHJpdmVycyB3aXRoIHRoZSByZW1vdGUgc3RvcmFnZSBhdCAke0NEX0NETn06IGAgK1xuICAgICAgICAgICAgICBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF1dG9kb3dubG9hZFN1Z2dlc3Rpb24gPVxuICAgICAgICAgICdZb3UgY291bGQgYWxzbyB0cnkgdG8gZW5hYmxlIGF1dG9tYXRlZCBjaHJvbWVkcml2ZXJzIGRvd25sb2FkIGFzICcgK1xuICAgICAgICAgICdhIHBvc3NpYmxlIHdvcmthcm91bmQuJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBDaHJvbWVkcml2ZXIgZm91bmQgdGhhdCBjYW4gYXV0b21hdGUgQ2hyb21lICcke2Nocm9tZVZlcnNpb259Jy5gICtcbiAgICAgICAgICAodGhpcy5zdG9yYWdlQ2xpZW50ID8gJycgOiBgICR7YXV0b2Rvd25sb2FkU3VnZ2VzdGlvbn1gKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJpblBhdGggPSBtYXRjaGluZ0RyaXZlcnNbMF0uZXhlY3V0YWJsZTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdleGVjdXRhYmxlJywgbWF0Y2hpbmdEcml2ZXJzLmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgICAgICBgY2FwYWJsZSBvZiBhdXRvbWF0aW5nIENocm9tZSAnJHtjaHJvbWVWZXJzaW9ufScuXFxuQ2hvb3NpbmcgdGhlIG1vc3QgcmVjZW50LCAnJHtiaW5QYXRofScuYCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnSWYgYSBzcGVjaWZpYyB2ZXJzaW9uIGlzIHJlcXVpcmVkLCBzcGVjaWZ5IGl0IHdpdGggdGhlIGBjaHJvbWVkcml2ZXJFeGVjdXRhYmxlYCcgK1xuICAgICAgICAnZGVzaXJlZCBjYXBhYmlsaXR5LicpO1xuICAgICAgcmV0dXJuIGJpblBhdGg7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgIH0gd2hpbGUgKHRydWUpO1xuICB9XG5cbiAgYXN5bmMgaW5pdENocm9tZWRyaXZlclBhdGggKCkge1xuICAgIGlmICh0aGlzLmV4ZWN1dGFibGVWZXJpZmllZCkgcmV0dXJuOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgIC8vIHRoZSBleGVjdXRhYmxlIG1pZ2h0IGJlIHNldCAoaWYgcGFzc2VkIGluKVxuICAgIC8vIG9yIHdlIG1pZ2h0IHdhbnQgdG8gdXNlIHRoZSBiYXNpYyBvbmUgaW5zdGFsbGVkIHdpdGggdGhpcyBkcml2ZXJcbiAgICAvLyBvciB3ZSB3YW50IHRvIGZpZ3VyZSBvdXQgdGhlIGJlc3Qgb25lXG4gICAgaWYgKCF0aGlzLmNocm9tZWRyaXZlcikge1xuICAgICAgdGhpcy5jaHJvbWVkcml2ZXIgPSB0aGlzLnVzZVN5c3RlbUV4ZWN1dGFibGVcbiAgICAgICAgPyBhd2FpdCBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoKClcbiAgICAgICAgOiBhd2FpdCB0aGlzLmdldENvbXBhdGlibGVDaHJvbWVkcml2ZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyh0aGlzLmNocm9tZWRyaXZlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHVzZSBhIGNocm9tZWRyaXZlciBiaW5hcnkgYXQgdGhlIHBhdGggYCArXG4gICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jaHJvbWVkcml2ZXJ9LCBidXQgaXQgZG9lc24ndCBleGlzdCFgKTtcbiAgICB9XG4gICAgdGhpcy5leGVjdXRhYmxlVmVyaWZpZWQgPSB0cnVlO1xuICAgIHRoaXMubG9nLmluZm8oYFNldCBjaHJvbWVkcml2ZXIgYmluYXJ5IGFzOiAke3RoaXMuY2hyb21lZHJpdmVyfWApO1xuICB9XG5cbiAgc3luY1Byb3RvY29sIChjZFZlcnNpb24gPSBudWxsKSB7XG4gICAgY29uc3QgY29lcmNlZFZlcnNpb24gPSBzZW12ZXIuY29lcmNlKGNkVmVyc2lvbik7XG4gICAgaWYgKCFjb2VyY2VkVmVyc2lvbiB8fCBjb2VyY2VkVmVyc2lvbi5tYWpvciA8IE1JTl9DRF9WRVJTSU9OX1dJVEhfVzNDX1NVUFBPUlQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdi4gJHtjZFZlcnNpb259IGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgJHtQUk9UT0NPTFMuVzNDfSBwcm90b2NvbC4gYCArXG4gICAgICAgIGBEZWZhdWx0aW5nIHRvICR7UFJPVE9DT0xTLk1KU09OV1B9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBnZXRDYXBWYWx1ZSh0aGlzLmNhcGFiaWxpdGllcywgJ2Nocm9tZU9wdGlvbnMnLCB7fSk7XG4gICAgaWYgKGNocm9tZU9wdGlvbnMudzNjID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgQ2hyb21lZHJpdmVyIHYuICR7Y2RWZXJzaW9ufSBzdXBwb3J0cyAke1BST1RPQ09MUy5XM0N9IHByb3RvY29sLCBgICtcbiAgICAgICAgYGJ1dCAke1BST1RPQ09MUy5NSlNPTldQfSBvbmUgaGFzIGJlZW4gZXhwbGljaXRseSByZXF1ZXN0ZWRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kZXNpcmVkUHJvdG9jb2wgPSBQUk9UT0NPTFMuVzNDO1xuICAgIC8vIGdpdmVuIGNhcHMgbWlnaHQgbm90IGJlIHByb3Blcmx5IHByZWZpeGVkXG4gICAgLy8gc28gd2UgdHJ5IHRvIGZpeCB0aGVtIGluIG9yZGVyIHRvIHByb3Blcmx5IGluaXRcbiAgICAvLyB0aGUgbmV3IFczQyBzZXNzaW9uXG4gICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB0b1czY0NhcE5hbWVzKHRoaXMuY2FwYWJpbGl0aWVzKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChjYXBzLCBlbWl0U3RhcnRpbmdTdGF0ZSA9IHRydWUpIHtcbiAgICB0aGlzLmNhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKGNhcHMpO1xuXG4gICAgLy8gc2V0IHRoZSBsb2dnaW5nIHByZWZlcmVuY2VzIHRvIEFMTCB0aGUgY29uc29sZSBsb2dzXG4gICAgdGhpcy5jYXBhYmlsaXRpZXMubG9nZ2luZ1ByZWZzID0gXy5jbG9uZURlZXAoZ2V0Q2FwVmFsdWUoY2FwcywgJ2xvZ2dpbmdQcmVmcycsIHt9KSk7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLmNhcGFiaWxpdGllcy5sb2dnaW5nUHJlZnMuYnJvd3NlcikpIHtcbiAgICAgIHRoaXMuY2FwYWJpbGl0aWVzLmxvZ2dpbmdQcmVmcy5icm93c2VyID0gJ0FMTCc7XG4gICAgfVxuXG4gICAgaWYgKGVtaXRTdGFydGluZ1N0YXRlKSB7XG4gICAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9TVEFSVElORyk7XG4gICAgfVxuXG4gICAgY29uc3QgYXJncyA9IFtgLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9YF07XG4gICAgaWYgKHRoaXMuYWRiICYmIHRoaXMuYWRiLmFkYlBvcnQpIHtcbiAgICAgIGFyZ3MucHVzaChgLS1hZGItcG9ydD0ke3RoaXMuYWRiLmFkYlBvcnR9YCk7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkodGhpcy5jbWRBcmdzKSkge1xuICAgICAgYXJncy5wdXNoKC4uLnRoaXMuY21kQXJncyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvZ1BhdGgpIHtcbiAgICAgIGFyZ3MucHVzaChgLS1sb2ctcGF0aD0ke3RoaXMubG9nUGF0aH1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZUJ1aWxkQ2hlY2spIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1kaXNhYmxlLWJ1aWxkLWNoZWNrJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLS12ZXJib3NlJyk7XG4gICAgLy8gd2hhdCBhcmUgdGhlIHByb2Nlc3Mgc3Rkb3V0L3N0ZGVyciBjb25kaXRpb25zIHdoZXJlaW4gd2Uga25vdyB0aGF0XG4gICAgLy8gdGhlIHByb2Nlc3MgaGFzIHN0YXJ0ZWQgdG8gb3VyIHNhdGlzZmFjdGlvbj9cbiAgICBjb25zdCBzdGFydERldGVjdG9yID0gKHN0ZG91dCkgPT4gc3Rkb3V0LnN0YXJ0c1dpdGgoJ1N0YXJ0aW5nICcpO1xuXG4gICAgbGV0IHByb2Nlc3NJc0FsaXZlID0gZmFsc2U7XG4gICAgbGV0IHdlYnZpZXdWZXJzaW9uO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRDaHJvbWVkcml2ZXJQYXRoKCk7XG4gICAgICBhd2FpdCB0aGlzLmtpbGxBbGwoKTtcblxuICAgICAgLy8gc2V0IHVwIG91ciBzdWJwcm9jZXNzIG9iamVjdFxuICAgICAgdGhpcy5wcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5jaHJvbWVkcml2ZXIsIGFyZ3MpO1xuICAgICAgcHJvY2Vzc0lzQWxpdmUgPSB0cnVlO1xuXG4gICAgICAvLyBoYW5kbGUgbG9nIG91dHB1dFxuICAgICAgdGhpcy5wcm9jLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgLy8gaWYgdGhlIGNkIG91dHB1dCBpcyBub3QgcHJpbnRlZCwgZmluZCB0aGUgY2hyb21lIHZlcnNpb24gYW5kIHByaW50XG4gICAgICAgIC8vIHdpbGwgZ2V0IGEgcmVzcG9uc2UgbGlrZVxuICAgICAgICAvLyAgIERldlRvb2xzIHJlc3BvbnNlOiB7XG4gICAgICAgIC8vICAgICAgXCJBbmRyb2lkLVBhY2thZ2VcIjogXCJpby5hcHBpdW0uc2FtcGxlYXBwXCIsXG4gICAgICAgIC8vICAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzU1LjAuMjg4My45MVwiLFxuICAgICAgICAvLyAgICAgIFwiUHJvdG9jb2wtVmVyc2lvblwiOiBcIjEuMlwiLFxuICAgICAgICAvLyAgICAgIFwiVXNlci1BZ2VudFwiOiBcIi4uLlwiLFxuICAgICAgICAvLyAgICAgIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzZcIlxuICAgICAgICAvLyAgIH1cbiAgICAgICAgY29uc3Qgb3V0ID0gc3Rkb3V0ICsgc3RkZXJyO1xuICAgICAgICBsZXQgbWF0Y2ggPSAvXCJCcm93c2VyXCI6IFwiKC4qKVwiLy5leGVjKG91dCk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHdlYnZpZXdWZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFdlYnZpZXcgdmVyc2lvbjogJyR7d2Vidmlld1ZlcnNpb259J2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWxzbyBwcmludCBjaHJvbWVkcml2ZXIgdmVyc2lvbiB0byBsb2dzXG4gICAgICAgIC8vIHdpbGwgb3V0cHV0IHNvbWV0aGluZyBsaWtlXG4gICAgICAgIC8vICBTdGFydGluZyBDaHJvbWVEcml2ZXIgMi4zMy41MDYxMDYgKDhhMDZjMzljNDU4MmZiZmJhYjY5NjZkYmIxYzM4YTkxNzNiZmIxYTIpIG9uIHBvcnQgOTUxNVxuICAgICAgICBtYXRjaCA9IC9TdGFydGluZyBDaHJvbWVEcml2ZXIgKFsuXFxkXSspLy5leGVjKG91dCk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdmVyc2lvbjogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgICAgIHRoaXMuc3luY1Byb3RvY29sKG1hdGNoWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdpdmUgdGhlIG91dHB1dCBpZiBpdCBpcyByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgICAgIGZvciAobGV0IGxpbmUgb2YgKHN0ZG91dCB8fCAnJykudHJpbSgpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgICAgaWYgKCFsaW5lLnRyaW0oKS5sZW5ndGgpIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgW1NURE9VVF0gJHtsaW5lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIChzdGRlcnIgfHwgJycpLnRyaW0oKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgICAgIGlmICghbGluZS50cmltKCkubGVuZ3RoKSBjb250aW51ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYFtTVERFUlJdICR7bGluZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBoYW5kbGUgb3V0LW9mLWJvdW5kIGV4aXQgYnkgc2ltcGx5IGVtaXR0aW5nIGEgc3RvcHBlZCBzdGF0ZVxuICAgICAgdGhpcy5wcm9jLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBwcm9jZXNzSXNBbGl2ZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgIT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUElORyAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZSAhPT0gQ2hyb21lZHJpdmVyLlNUQVRFX1JFU1RBUlRJTkcpIHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBgQ2hyb21lZHJpdmVyIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2l0aCBjb2RlICR7Y29kZX0sIHNpZ25hbCAke3NpZ25hbH1gO1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKG1zZyk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU3Bhd25pbmcgY2hyb21lZHJpdmVyIHdpdGg6ICR7dGhpcy5jaHJvbWVkcml2ZXJ9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICAvLyBzdGFydCBzdWJwcm9jIGFuZCB3YWl0IGZvciBzdGFydERldGVjdG9yXG4gICAgICBhd2FpdCB0aGlzLnByb2Muc3RhcnQoc3RhcnREZXRlY3Rvcik7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JPbmxpbmUoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRTZXNzaW9uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoZSk7XG4gICAgICB0aGlzLmVtaXQoQ2hyb21lZHJpdmVyLkVWRU5UX0VSUk9SLCBlKTtcbiAgICAgIC8vIGp1c3QgYmVjYXVzZSB3ZSBoYWQgYW4gZXJyb3IgZG9lc24ndCBtZWFuIHRoZSBjaHJvbWVkcml2ZXIgcHJvY2Vzc1xuICAgICAgLy8gZmluaXNoZWQ7IHdlIHNob3VsZCBjbGVhbiB1cCBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChwcm9jZXNzSXNBbGl2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Muc3RvcCgpO1xuICAgICAgfVxuXG4gICAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgICAgLy8gb2Z0ZW4gdGhlIHVzZXIncyBDaHJvbWUgdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB2ZXJzaW9uIG9mIENocm9tZWRyaXZlclxuICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcygnQ2hyb21lIHZlcnNpb24gbXVzdCBiZScpKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gJ1VuYWJsZSB0byBhdXRvbWF0ZSBDaHJvbWUgdmVyc2lvbiBiZWNhdXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIENocm9tZWRyaXZlci5cXG4nO1xuICAgICAgICBpZiAod2Vidmlld1ZlcnNpb24pIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGBDaHJvbWUgdmVyc2lvbiBvbiB0aGUgZGV2aWNlOiAke3dlYnZpZXdWZXJzaW9ufVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlciA9IC9DaHJvbWUgdmVyc2lvbiBtdXN0IGJlICguKykvLmV4ZWMoZS5tZXNzYWdlKT8uWzFdIHx8ICcnO1xuICAgICAgICBpZiAodmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlcikge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYENocm9tZWRyaXZlciBzdXBwb3J0cyBDaHJvbWUgdmVyc2lvbihzKTogJHt2ZXJzaW9uc1N1cHBvcnRlZEJ5RHJpdmVyfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZSArPSAnQ2hlY2sgdGhlIGRyaXZlciB0dXRvcmlhbCBmb3IgdHJvdWJsZXNob290aW5nLlxcbic7XG4gICAgICB9XG5cbiAgICAgIG1lc3NhZ2UgKz0gZS5tZXNzYWdlO1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBzZXNzaW9uSWQgKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FID8gdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA6IG51bGw7XG4gIH1cblxuICBhc3luYyByZXN0YXJ0ICgpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdSZXN0YXJ0aW5nIGNocm9tZWRyaXZlcicpO1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCByZXN0YXJ0IHdoZW4gd2UncmUgbm90IG9ubGluZVwiKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfUkVTVEFSVElORyk7XG4gICAgYXdhaXQgdGhpcy5zdG9wKGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0KHRoaXMuY2FwYWJpbGl0aWVzLCBmYWxzZSk7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yT25saW5lICgpIHtcbiAgICAvLyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IENEIGhhc24ndCBjcmFzaGVkXG4gICAgbGV0IGNocm9tZWRyaXZlclN0b3BwZWQgPSBmYWxzZTtcbiAgICBhd2FpdCByZXRyeUludGVydmFsKDIwLCAyMDAsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICAvLyB3ZSBhcmUgZWl0aGVyIHN0b3BwZWQgb3Igc3RvcHBpbmcsIHNvIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICAgIGNocm9tZWRyaXZlclN0b3BwZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIH0pO1xuICAgIGlmIChjaHJvbWVkcml2ZXJTdG9wcGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nocm9tZURyaXZlciBjcmFzaGVkIGR1cmluZyBzdGFydHVwLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXNzaW9uICgpIHtcbiAgICBjb25zdCBzZXNzaW9uQ2FwcyA9IHRoaXMuZGVzaXJlZFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDXG4gICAgICA/IHtjYXBhYmlsaXRpZXM6IHthbHdheXNNYXRjaDogdGhpcy5jYXBhYmlsaXRpZXN9fVxuICAgICAgOiB7ZGVzaXJlZENhcGFiaWxpdGllczogdGhpcy5jYXBhYmlsaXRpZXN9O1xuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nICR7dGhpcy5kZXNpcmVkUHJvdG9jb2x9IENocm9tZWRyaXZlciBzZXNzaW9uIHdpdGggY2FwYWJpbGl0aWVzOiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHNlc3Npb25DYXBzLCBudWxsLCAyKSk7XG4gICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCBzZXNzaW9uQ2Fwcyk7XG4gICAgdGhpcy5sb2cucHJlZml4ID0gZ2VuZXJhdGVMb2dQcmVmaXgodGhpcywgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCk7XG4gICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKGVtaXRTdGF0ZXMgPSB0cnVlKSB7XG4gICAgaWYgKGVtaXRTdGF0ZXMpIHtcbiAgICAgIHRoaXMuY2hhbmdlU3RhdGUoQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HKTtcbiAgICB9XG4gICAgY29uc3QgcnVuU2FmZVN0ZXAgPSBhc3luYyAoZikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGYoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGF3YWl0IHJ1blNhZmVTdGVwKCgpID0+IHRoaXMuandwcm94eS5jb21tYW5kKCcnLCAnREVMRVRFJykpO1xuICAgIGF3YWl0IHJ1blNhZmVTdGVwKCgpID0+IHRoaXMucHJvYy5zdG9wKCdTSUdURVJNJywgMjAwMDApKTtcbiAgICB0aGlzLmxvZy5wcmVmaXggPSBnZW5lcmF0ZUxvZ1ByZWZpeCh0aGlzKTtcbiAgICBpZiAoZW1pdFN0YXRlcykge1xuICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlU3RhdGUgKHN0YXRlKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMubG9nLmRlYnVnKGBDaGFuZ2VkIHN0YXRlIHRvICcke3N0YXRlfSdgKTtcbiAgICB0aGlzLmVtaXQoQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIHtzdGF0ZX0pO1xuICB9XG5cbiAgYXN5bmMgc2VuZENvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxuXG4gIGFzeW5jIHByb3h5UmVxIChyZXEsIHJlcykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMocmVxLCByZXMpO1xuICB9XG5cbiAgYXN5bmMga2lsbEFsbCAoKSB7XG4gICAgbGV0IGNtZCA9IHN5c3RlbS5pc1dpbmRvd3MoKVxuICAgICAgPyBgd21pYyBwcm9jZXNzIHdoZXJlIFwiY29tbWFuZGxpbmUgbGlrZSAnJWNocm9tZWRyaXZlci5leGUlLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9JSdcIiBkZWxldGVgXG4gICAgICA6IGBwa2lsbCAtMTUgLWYgXCIke3RoaXMuY2hyb21lZHJpdmVyfS4qLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9XCJgO1xuICAgIHRoaXMubG9nLmRlYnVnKGBLaWxsaW5nIGFueSBvbGQgY2hyb21lZHJpdmVycywgcnVubmluZzogJHtjbWR9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IChCLnByb21pc2lmeShjcC5leGVjKSkoY21kKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdTdWNjZXNzZnVsbHkgY2xlYW5lZCB1cCBvbGQgY2hyb21lZHJpdmVycycpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybignTm8gb2xkIGNocm9tZWRyaXZlcnMgc2VlbSB0byBleGlzdCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgY29uc3QgdWRpZEluZGV4ID0gdGhpcy5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJncy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0gPT09ICctcycpO1xuICAgICAgY29uc3QgdWRpZCA9IHVkaWRJbmRleCA+IC0xID8gdGhpcy5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1t1ZGlkSW5kZXggKyAxXSA6IG51bGw7XG5cbiAgICAgIGlmICh1ZGlkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbGVhbmluZyB0aGlzIGRldmljZSdzIGFkYiBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbnM6ICR7dWRpZH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbGVhbmluZyBhbnkgb2xkIGFkYiBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbnNgKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChsZXQgY29ubiBvZiBhd2FpdCB0aGlzLmFkYi5nZXRGb3J3YXJkTGlzdCgpKSB7XG4gICAgICAgICAgLy8gY2hyb21lZHJpdmVyIHdpbGwgYXNrIEFEQiB0byBmb3J3YXJkIGEgcG9ydCBsaWtlIFwiZGV2aWNlSWQgdGNwOnBvcnQgbG9jYWxhYnN0cmFjdDp3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV9wb3J0XCJcbiAgICAgICAgICBpZiAoIShjb25uLmluY2x1ZGVzKCd3ZWJ2aWV3X2RldnRvb2xzJykgJiYgKCF1ZGlkIHx8IGNvbm4uaW5jbHVkZXModWRpZCkpKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHBhcmFtcyA9IGNvbm4uc3BsaXQoL1xccysvKTtcbiAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHBhcmFtc1sxXS5yZXBsYWNlKC9bXFxEXSovLCAnJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byBjbGVhbiBmb3J3YXJkZWQgcG9ydHMuIEVycm9yOiAnJHtlcnIubWVzc2FnZX0nLiBDb250aW51aW5nLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhc1dvcmtpbmdXZWJ2aWV3ICgpIHtcbiAgICAvLyBzb21ldGltZXMgY2hyb21lZHJpdmVyIHN0b3BzIGF1dG9tYXRpbmcgd2Vidmlld3MuIHRoaXMgbWV0aG9kIHJ1bnMgYVxuICAgIC8vIHNpbXBsZSBjb21tYW5kIHRvIGRldGVybWluZSBvdXIgc3RhdGUsIGFuZCByZXNwb25kcyBhY2NvcmRpbmdseVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3VybCcsICdHRVQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuQ2hyb21lZHJpdmVyLkVWRU5UX0VSUk9SID0gJ2Nocm9tZWRyaXZlcl9lcnJvcic7XG5DaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCA9ICdzdGF0ZUNoYW5nZWQnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQgPSAnc3RvcHBlZCc7XG5DaHJvbWVkcml2ZXIuU1RBVEVfU1RBUlRJTkcgPSAnc3RhcnRpbmcnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX09OTElORSA9ICdvbmxpbmUnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HID0gJ3N0b3BwaW5nJztcbkNocm9tZWRyaXZlci5TVEFURV9SRVNUQVJUSU5HID0gJ3Jlc3RhcnRpbmcnO1xuXG5leHBvcnQgeyBDaHJvbWVkcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IENocm9tZWRyaXZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxtQ0FBbUMsR0FBRyxFQUE1QztBQUNBLE1BQU1DLFlBQVksR0FBRyxXQUFyQjtBQUNBLE1BQU1DLCtCQUErQixHQUFHLEVBQXhDO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLElBQXJCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsb0JBQXpCO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsNEJBQWhDO0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsQ0FDekIsNEJBRHlCLEVBRXpCLHFCQUZ5QixDQUEzQjtBQUlBLE1BQU1DLGVBQWUsR0FBRyxVQUF4QjtBQUVBLE1BQU1DLGtCQUFrQixHQUFHLElBQTNCOztBQUVBLE1BQU1DLFlBQU4sU0FBMkJDLGVBQUEsQ0FBT0MsWUFBbEMsQ0FBK0M7RUFDN0NDLFdBQVcsQ0FBRUMsSUFBSSxHQUFHLEVBQVQsRUFBYTtJQUN0QjtJQUVBLE1BQU07TUFDSkMsSUFBSSxHQUFHYixZQURIO01BRUpjLElBQUksR0FBR1osWUFGSDtNQUdKYSxtQkFBbUIsR0FBRyxL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
|
|
603
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTiIsIkRFRkFVTFRfSE9TVCIsIk1JTl9DRF9WRVJTSU9OX1dJVEhfVzNDX1NVUFBPUlQiLCJERUZBVUxUX1BPUlQiLCJDSFJPTUVfQlVORExFX0lEIiwiV0VCVklFV19TSEVMTF9CVU5ETEVfSUQiLCJXRUJWSUVXX0JVTkRMRV9JRFMiLCJWRVJTSU9OX1BBVFRFUk4iLCJDRF9WRVJTSU9OX1RJTUVPVVQiLCJDaHJvbWVkcml2ZXIiLCJldmVudHMiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJob3N0IiwicG9ydCIsInVzZVN5c3RlbUV4ZWN1dGFibGUiLCJleGVjdXRhYmxlIiwiZXhlY3V0YWJsZURpciIsImdldENocm9tZWRyaXZlckRpciIsImJ1bmRsZUlkIiwibWFwcGluZ1BhdGgiLCJjbWRBcmdzIiwiYWRiIiwidmVyYm9zZSIsImxvZ1BhdGgiLCJkaXNhYmxlQnVpbGRDaGVjayIsImRldGFpbHMiLCJpc0F1dG9kb3dubG9hZEVuYWJsZWQiLCJfbG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiZ2VuZXJhdGVMb2dQcmVmaXgiLCJwcm94eUhvc3QiLCJwcm94eVBvcnQiLCJwcm9jIiwiY2hyb21lZHJpdmVyIiwiZXhlY3V0YWJsZVZlcmlmaWVkIiwic3RhdGUiLCJTVEFURV9TVE9QUEVEIiwiandwcm94eSIsIkpXUHJveHkiLCJzZXJ2ZXIiLCJsb2ciLCJzdG9yYWdlQ2xpZW50IiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNocm9tZWRyaXZlckRpciIsImNhcGFiaWxpdGllcyIsImRlc2lyZWRQcm90b2NvbCIsIlBST1RPQ09MUyIsIk1KU09OV1AiLCJnZXREcml2ZXJzTWFwcGluZyIsIm1hcHBpbmciLCJfIiwiY2xvbmVEZWVwIiwiQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HIiwiZGVidWciLCJmcyIsImV4aXN0cyIsIndhcm4iLCJpbmZvIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGUiLCJlcnIiLCJtZXNzYWdlIiwiY2RWZXJzaW9uIiwiY2hyb21lVmVyc2lvbiIsInRvUGFpcnMiLCJjb2VyY2VkVmVyc2lvbiIsInNlbXZlciIsImNvZXJjZSIsInZlcnNpb24iLCJnZXRDaHJvbWVkcml2ZXJzIiwiZXhlY3V0YWJsZXMiLCJnbG9iIiwiY3dkIiwic3RyaWN0Iiwibm9kaXIiLCJhYnNvbHV0ZSIsInV0aWwiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJjZHMiLCJhc3luY21hcCIsImxvZ0Vycm9yIiwic3Rkb3V0Iiwic3RkZXJyIiwiZXJyTXNnIiwicGF0aCIsImJhc2VuYW1lIiwiZXhlYyIsInRpbWVvdXQiLCJpbmNsdWRlcyIsIm1hdGNoIiwibWluQ2hyb21lVmVyc2lvbiIsIm1ham9yIiwibWlub3IiLCJmaWx0ZXIiLCJjZCIsInNvcnQiLCJhIiwiYiIsImNvbXBhcmVWZXJzaW9ucyIsImlzRW1wdHkiLCJnZXRDaHJvbWVWZXJzaW9uIiwiQnJvd3NlciIsInZlcnNpb25NYXRjaCIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJ1cGRhdGVEcml2ZXJzTWFwcGluZyIsIm5ld01hcHBpbmciLCJzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nIiwid3JpdGVGaWxlIiwic3RyaW5naWZ5IiwiZSIsIk9iamVjdCIsImFzc2lnbiIsImdldENvbXBhdGlibGVDaHJvbWVkcml2ZXIiLCJnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIiwidmFsdWVzIiwiZGlkU3RvcmFnZVN5bmMiLCJzeW5jQ2hyb21lZHJpdmVycyIsInJldHJpZXZlZE1hcHBpbmciLCJyZXRyaWV2ZU1hcHBpbmciLCJkcml2ZXJLZXlzIiwic3luY0RyaXZlcnMiLCJtaW5Ccm93c2VyVmVyc2lvbiIsInN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nIiwicmVkdWNlIiwiYWNjIiwieCIsIm1pc3NpbmdWZXJzaW9ucyIsImNvZXJjZWRWZXIiLCJzaXplIiwiZXJyb3JBbmRUaHJvdyIsIm1hdGNoaW5nRHJpdmVycyIsIm1pbkNocm9tZVZlcnNpb25TIiwiZ3RlIiwiQ0RfQ0ROIiwic3RhY2siLCJhdXRvZG93bmxvYWRTdWdnZXN0aW9uIiwiRXJyb3IiLCJiaW5QYXRoIiwiaW5pdENocm9tZWRyaXZlclBhdGgiLCJzeW5jUHJvdG9jb2wiLCJXM0MiLCJjaHJvbWVPcHRpb25zIiwiZ2V0Q2FwVmFsdWUiLCJ3M2MiLCJ0b1czY0NhcE5hbWVzIiwic3RhcnQiLCJjYXBzIiwiZW1pdFN0YXJ0aW5nU3RhdGUiLCJsb2dnaW5nUHJlZnMiLCJicm93c2VyIiwiY2hhbmdlU3RhdGUiLCJTVEFURV9TVEFSVElORyIsImFkYlBvcnQiLCJwdXNoIiwiaXNBcnJheSIsInN0YXJ0RGV0ZWN0b3IiLCJzdGFydHNXaXRoIiwicHJvY2Vzc0lzQWxpdmUiLCJ3ZWJ2aWV3VmVyc2lvbiIsImtpbGxBbGwiLCJTdWJQcm9jZXNzIiwib24iLCJvdXQiLCJsaW5lIiwidHJpbSIsInNwbGl0IiwiZXJyb3IiLCJjb2RlIiwic2lnbmFsIiwiU1RBVEVfU1RPUFBJTkciLCJTVEFURV9SRVNUQVJUSU5HIiwibXNnIiwiam9pbiIsIndhaXRGb3JPbmxpbmUiLCJzdGFydFNlc3Npb24iLCJlbWl0IiwiRVZFTlRfRVJST1IiLCJzdG9wIiwidmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlciIsInNlc3Npb25JZCIsIlNUQVRFX09OTElORSIsInJlc3RhcnQiLCJjaHJvbWVkcml2ZXJTdG9wcGVkIiwicmV0cnlJbnRlcnZhbCIsImdldFN0YXR1cyIsImNvbW1hbmQiLCJzZXNzaW9uQ2FwcyIsImFsd2F5c01hdGNoIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsInByZWZpeCIsImVtaXRTdGF0ZXMiLCJydW5TYWZlU3RlcCIsImYiLCJFVkVOVF9DSEFOR0VEIiwic2VuZENvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwicHJveHlSZXEiLCJyZXEiLCJyZXMiLCJwcm94eVJlcVJlcyIsImNtZCIsInN5c3RlbSIsImlzV2luZG93cyIsIkIiLCJwcm9taXNpZnkiLCJjcCIsInVkaWRJbmRleCIsImRlZmF1bHRBcmdzIiwiZmluZEluZGV4IiwiaXRlbSIsInVkaWQiLCJjb25uIiwiZ2V0Rm9yd2FyZExpc3QiLCJwYXJhbXMiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsInJlcGxhY2UiLCJoYXNXb3JraW5nV2VidmlldyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jaHJvbWVkcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IGV2ZW50cyBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgSldQcm94eSwgUFJPVE9DT0xTIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgY3AgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCBsb2dnZXIsIHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsLCBhc3luY21hcCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtcbiAgZ2V0Q2hyb21lVmVyc2lvbiwgZ2V0Q2hyb21lZHJpdmVyRGlyLCBDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcsXG4gIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgsIENEX0NETiwgZ2VuZXJhdGVMb2dQcmVmaXhcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IGZyb20gJy4vc3RvcmFnZS1jbGllbnQnO1xuaW1wb3J0IHsgdG9XM2NDYXBOYW1lcywgZ2V0Q2FwVmFsdWUgfSBmcm9tICcuL3Byb3RvY29sLWhlbHBlcnMnO1xuXG5jb25zdCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTiA9IDczO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBNSU5fQ0RfVkVSU0lPTl9XSVRIX1czQ19TVVBQT1JUID0gNzU7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA5NTE1O1xuY29uc3QgQ0hST01FX0JVTkRMRV9JRCA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgV0VCVklFV19TSEVMTF9CVU5ETEVfSUQgPSAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnO1xuY29uc3QgV0VCVklFV19CVU5ETEVfSURTID0gW1xuICAnY29tLmdvb2dsZS5hbmRyb2lkLndlYnZpZXcnLFxuICAnY29tLmFuZHJvaWQud2VidmlldycsXG5dO1xuY29uc3QgVkVSU0lPTl9QQVRURVJOID0gLyhbXFxkLl0rKS87XG5cbmNvbnN0IENEX1ZFUlNJT05fVElNRU9VVCA9IDUwMDA7XG5cbmNsYXNzIENocm9tZWRyaXZlciBleHRlbmRzIGV2ZW50cy5FdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGhvc3QgPSBERUZBVUxUX0hPU1QsXG4gICAgICBwb3J0ID0gREVGQVVMVF9QT1JULFxuICAgICAgdXNlU3lzdGVtRXhlY3V0YWJsZSA9IGZhbHNlLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGV4ZWN1dGFibGVEaXIgPSBnZXRDaHJvbWVkcml2ZXJEaXIoKSxcbiAgICAgIGJ1bmRsZUlkLFxuICAgICAgbWFwcGluZ1BhdGgsXG4gICAgICBjbWRBcmdzLFxuICAgICAgYWRiLFxuICAgICAgdmVyYm9zZSxcbiAgICAgIGxvZ1BhdGgsXG4gICAgICBkaXNhYmxlQnVpbGRDaGVjayxcbiAgICAgIGRldGFpbHMsXG4gICAgICBpc0F1dG9kb3dubG9hZEVuYWJsZWQgPSBmYWxzZSxcbiAgICB9ID0gYXJncztcbiAgICB0aGlzLl9sb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKGdlbmVyYXRlTG9nUHJlZml4KHRoaXMpKTtcblxuICAgIHRoaXMucHJveHlIb3N0ID0gaG9zdDtcbiAgICB0aGlzLnByb3h5UG9ydCA9IHBvcnQ7XG4gICAgdGhpcy5hZGIgPSBhZGI7XG4gICAgdGhpcy5jbWRBcmdzID0gY21kQXJncztcbiAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgIHRoaXMudXNlU3lzdGVtRXhlY3V0YWJsZSA9IHVzZVN5c3RlbUV4ZWN1dGFibGU7XG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBleGVjdXRhYmxlO1xuICAgIHRoaXMuZXhlY3V0YWJsZURpciA9IGV4ZWN1dGFibGVEaXI7XG4gICAgdGhpcy5tYXBwaW5nUGF0aCA9IG1hcHBpbmdQYXRoO1xuICAgIHRoaXMuYnVuZGxlSWQgPSBidW5kbGVJZDtcbiAgICB0aGlzLmV4ZWN1dGFibGVWZXJpZmllZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUgPSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRDtcbiAgICB0aGlzLmp3cHJveHkgPSBuZXcgSldQcm94eSh7XG4gICAgICBzZXJ2ZXI6IHRoaXMucHJveHlIb3N0LFxuICAgICAgcG9ydDogdGhpcy5wcm94eVBvcnQsXG4gICAgICBsb2c6IHRoaXMuX2xvZyxcbiAgICB9KTtcbiAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlO1xuICAgIHRoaXMubG9nUGF0aCA9IGxvZ1BhdGg7XG4gICAgdGhpcy5kaXNhYmxlQnVpbGRDaGVjayA9ICEhZGlzYWJsZUJ1aWxkQ2hlY2s7XG4gICAgdGhpcy5zdG9yYWdlQ2xpZW50ID0gaXNBdXRvZG93bmxvYWRFbmFibGVkXG4gICAgICA/IG5ldyBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50KHsgY2hyb21lZHJpdmVyRGlyOiB0aGlzLmV4ZWN1dGFibGVEaXIgfSlcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICAgIHRoaXMuY2FwYWJpbGl0aWVzID0ge307XG4gICAgdGhpcy5kZXNpcmVkUHJvdG9jb2wgPSBQUk9UT0NPTFMuTUpTT05XUDtcbiAgfVxuXG4gIGdldCBsb2cgKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2c7XG4gIH1cblxuICBhc3luYyBnZXREcml2ZXJzTWFwcGluZyAoKSB7XG4gICAgbGV0IG1hcHBpbmcgPSBfLmNsb25lRGVlcChDSFJPTUVEUklWRVJfQ0hST01FX01BUFBJTkcpO1xuICAgIGlmICh0aGlzLm1hcHBpbmdQYXRoKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byB1c2UgQ2hyb21lZHJpdmVyLT5DaHJvbWUgbWFwcGluZyBmcm9tICcke3RoaXMubWFwcGluZ1BhdGh9J2ApO1xuICAgICAgaWYgKCFhd2FpdCBmcy5leGlzdHModGhpcy5tYXBwaW5nUGF0aCkpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgTm8gZmlsZSBmb3VuZCBhdCAnJHt0aGlzLm1hcHBpbmdQYXRofSdgKTtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRGVmYXVsdGluZyB0byB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWFwcGluZyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUodGhpcy5tYXBwaW5nUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oYEVycm9yIHBhcnNpbmcgbWFwcGluZyBmcm9tICcke3RoaXMubWFwcGluZ1BhdGh9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdEZWZhdWx0aW5nIHRvIHRoZSBzdGF0aWMgQ2hyb21lZHJpdmVyLT5DaHJvbWUgbWFwcGluZycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdVc2luZyB0aGUgc3RhdGljIENocm9tZWRyaXZlci0+Q2hyb21lIG1hcHBpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGZvciBtaW5pbXVtIGNocm9tZSB2ZXJzaW9uIGFyZSBzZW12ZXIgY29tcGxpYW50XG4gICAgZm9yIChjb25zdCBbY2RWZXJzaW9uLCBjaHJvbWVWZXJzaW9uXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShjaHJvbWVWZXJzaW9uKTtcbiAgICAgIGlmIChjb2VyY2VkVmVyc2lvbikge1xuICAgICAgICBtYXBwaW5nW2NkVmVyc2lvbl0gPSBjb2VyY2VkVmVyc2lvbi52ZXJzaW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgJyR7Y2hyb21lVmVyc2lvbn0nIGlzIG5vdCBhIHZhbGlkIHZlcnNpb24gbnVtYmVyLiBTa2lwcGluZyBpdGApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwcGluZztcbiAgfVxuXG4gIGFzeW5jIGdldENocm9tZWRyaXZlcnMgKG1hcHBpbmcpIHtcbiAgICAvLyBnbyB0aHJvdWdoIHRoZSB2ZXJzaW9ucyBhdmFpbGFibGVcbiAgICBjb25zdCBleGVjdXRhYmxlcyA9IGF3YWl0IGZzLmdsb2IoJyonLCB7XG4gICAgICBjd2Q6IHRoaXMuZXhlY3V0YWJsZURpcixcbiAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICBub2RpcjogdHJ1ZSxcbiAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdleGVjdXRhYmxlJywgZXhlY3V0YWJsZXMubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICBgaW4gJyR7dGhpcy5leGVjdXRhYmxlRGlyfSdgKTtcbiAgICBjb25zdCBjZHMgPSAoYXdhaXQgYXN5bmNtYXAoZXhlY3V0YWJsZXMsIGFzeW5jIChleGVjdXRhYmxlKSA9PiB7XG4gICAgICBjb25zdCBsb2dFcnJvciA9ICh7bWVzc2FnZSwgc3Rkb3V0ID0gbnVsbCwgc3RkZXJyID0gbnVsbH0pID0+IHtcbiAgICAgICAgbGV0IGVyck1zZyA9IGBDYW5ub3QgcmV0cmlldmUgdmVyc2lvbiBudW1iZXIgZnJvbSAnJHtwYXRoLmJhc2VuYW1lKGV4ZWN1dGFibGUpfScgQ2hyb21lZHJpdmVyIGJpbmFyeS4gYCArXG4gICAgICAgICAgYE1ha2Ugc3VyZSBpdCByZXR1cm5zIGEgdmFsaWQgdmVyc2lvbiBzdHJpbmcgaW4gcmVzcG9uc2UgdG8gJy0tdmVyc2lvbicgY29tbWFuZCBsaW5lIGFyZ3VtZW50LiAke21lc3NhZ2V9YDtcbiAgICAgICAgaWYgKHN0ZG91dCkge1xuICAgICAgICAgIGVyck1zZyArPSBgXFxuU3Rkb3V0OiAke3N0ZG91dH1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICBlcnJNc2cgKz0gYFxcblN0ZGVycjogJHtzdGRlcnJ9YDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZy53YXJuKGVyck1zZyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcblxuICAgICAgbGV0IHN0ZG91dDtcbiAgICAgIGxldCBzdGRlcnI7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IGV4ZWMoZXhlY3V0YWJsZSwgWyctLXZlcnNpb24nXSwge1xuICAgICAgICAgIHRpbWVvdXQ6IENEX1ZFUlNJT05fVElNRU9VVCxcbiAgICAgICAgfSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghKGVyci5tZXNzYWdlIHx8ICcnKS5pbmNsdWRlcygndGltZWQgb3V0JykgJiYgIShlcnIuc3Rkb3V0IHx8ICcnKS5pbmNsdWRlcygnU3RhcnRpbmcgQ2hyb21lRHJpdmVyJykpIHtcbiAgICAgICAgICByZXR1cm4gbG9nRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoaXMgaGFzIHRpbWVkIG91dCwgaXQgaGFzIGFjdHVhbGx5IHN0YXJ0ZWQgQ2hyb21lZHJpdmVyLFxuICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHRoZXJlIHdpbGwgYWxzbyBiZSB0aGUgdmVyc2lvbiBzdHJpbmcgaW4gdGhlIG91dHB1dFxuICAgICAgICBzdGRvdXQgPSBlcnIuc3Rkb3V0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaCA9IC9DaHJvbWVEcml2ZXJcXHMrXFwoP3Y/KFtcXGQuXSspXFwpPy9pLmV4ZWMoc3Rkb3V0KTsgLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci96cGo1d0EvMVxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe21lc3NhZ2U6ICdDYW5ub3QgcGFyc2UgdGhlIHZlcnNpb24gc3RyaW5nJywgc3Rkb3V0LCBzdGRlcnJ9KTtcbiAgICAgIH1cbiAgICAgIGxldCB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICBsZXQgbWluQ2hyb21lVmVyc2lvbiA9IG1hcHBpbmdbdmVyc2lvbl07XG4gICAgICBjb25zdCBjb2VyY2VkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2UodmVyc2lvbik7XG4gICAgICBpZiAoY29lcmNlZFZlcnNpb24pIHtcbiAgICAgICAgLy8gYmVmb3JlIDIwMTktMDMtMDYgdmVyc2lvbnMgd2VyZSBvZiB0aGUgZm9ybSBtYWpvci5taW5vclxuICAgICAgICBpZiAoY29lcmNlZFZlcnNpb24ubWFqb3IgPCBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIHZlcnNpb24gPSBgJHtjb2VyY2VkVmVyc2lvbi5tYWpvcn0uJHtjb2VyY2VkVmVyc2lvbi5taW5vcn1gO1xuICAgICAgICAgIG1pbkNocm9tZVZlcnNpb24gPSBtYXBwaW5nW3ZlcnNpb25dO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWluQ2hyb21lVmVyc2lvbiAmJiBjb2VyY2VkVmVyc2lvbi5tYWpvciA+PSBORVdfQ0RfVkVSU0lPTl9GT1JNQVRfTUFKT1JfVkVSU0lPTikge1xuICAgICAgICAgIC8vIEFzc3VtZSB0aGUgbWFqb3IgQ2hyb21lIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIG1ham9yIHZlcnNpb25cbiAgICAgICAgICBtaW5DaHJvbWVWZXJzaW9uID0gYCR7Y29lcmNlZFZlcnNpb24ubWFqb3J9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0YWJsZSxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgbWluQ2hyb21lVmVyc2lvbixcbiAgICAgIH07XG4gICAgfSkpXG4gICAgICAuZmlsdGVyKChjZCkgPT4gISFjZClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBjb21wYXJlVmVyc2lvbnMoYi52ZXJzaW9uLCBhLnZlcnNpb24pKTtcbiAgICBpZiAoXy5pc0VtcHR5KGNkcykpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vIENocm9tZWRyaXZlcnMgd2VyZSBmb3VuZCBpbiAnJHt0aGlzLmV4ZWN1dGFibGVEaXJ9J2ApO1xuICAgICAgcmV0dXJuIGNkcztcbiAgICB9XG4gICAgdGhpcy5sb2cuZGVidWcoYFRoZSBmb2xsb3dpbmcgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGVzIHdlcmUgZm91bmQ6YCk7XG4gICAgZm9yIChjb25zdCBjZCBvZiBjZHMpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAgICAgJyR7Y2QuZXhlY3V0YWJsZX0nICh2ZXJzaW9uICcke2NkLnZlcnNpb259JywgbWluaW11bSBDaHJvbWUgdmVyc2lvbiAnJHtjZC5taW5DaHJvbWVWZXJzaW9uID8gY2QubWluQ2hyb21lVmVyc2lvbiA6ICdVbmtub3duJ30nKWApO1xuICAgIH1cbiAgICByZXR1cm4gY2RzO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2hyb21lVmVyc2lvbiAoKSB7XG4gICAgLy8gVHJ5IHRvIHJldHJpZXZlIHRoZSB2ZXJzaW9uIGZyb20gYGRldGFpbHNgIHByb3BlcnR5IGlmIGl0IGlzIHNldFxuICAgIC8vIFRoZSBgaW5mb2AgaXRlbSBtdXN0IGNvbnRhaW4gdGhlIG91dHB1dCBvZiAvanNvbi92ZXJzaW9uIENEUCBjb21tYW5kXG4gICAgLy8gd2hlcmUgYEJyb3dzZXJgIGZpZWxkIGxvb2tzIGxpa2UgYENocm9tZS83Mi4wLjM2MDEuMGBgXG4gICAgaWYgKHRoaXMuZGV0YWlscz8uaW5mbykge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEJyb3dzZXIgdmVyc2lvbiBpbiB0aGUgc3VwcGxpZWQgZGV0YWlsczogJHt0aGlzLmRldGFpbHM/LmluZm8/LkJyb3dzZXJ9YCk7XG4gICAgfVxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IFZFUlNJT05fUEFUVEVSTi5leGVjKHRoaXMuZGV0YWlscz8uaW5mbz8uQnJvd3Nlcik7XG4gICAgaWYgKHZlcnNpb25NYXRjaCkge1xuICAgICAgY29uc3QgY29lcmNlZFZlcnNpb24gPSBzZW12ZXIuY29lcmNlKHZlcnNpb25NYXRjaFsxXSk7XG4gICAgICBpZiAoY29lcmNlZFZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIGNvZXJjZWRWZXJzaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjaHJvbWVWZXJzaW9uO1xuXG4gICAgLy8gaW4gY2FzZSBvZiBXZWJWaWV3IEJyb3dzZXIgVGVzdGVyLCBzaW1wbHkgdHJ5IHRvIGZpbmQgdGhlIHVuZGVybHlpbmcgd2Vidmlld1xuICAgIGlmICh0aGlzLmJ1bmRsZUlkID09PSBXRUJWSUVXX1NIRUxMX0JVTkRMRV9JRCkge1xuICAgICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBXRUJWSUVXX0JVTkRMRV9JRFMpIHtcbiAgICAgICAgY2hyb21lVmVyc2lvbiA9IGF3YWl0IGdldENocm9tZVZlcnNpb24odGhpcy5hZGIsIGJ1bmRsZUlkKTtcbiAgICAgICAgaWYgKGNocm9tZVZlcnNpb24pIHtcbiAgICAgICAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgICAgICAgcmV0dXJuIHNlbXZlci5jb2VyY2UoY2hyb21lVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIG9uIEFuZHJvaWQgNy05IHdlYnZpZXdzIGFyZSBiYWNrZWQgYnkgdGhlIG1haW4gQ2hyb21lLCBub3QgdGhlIHN5c3RlbSB3ZWJ2aWV3XG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMjQgJiYgYXBpTGV2ZWwgPD0gMjggJiZcbiAgICAgICAgICBbV0VCVklFV19TSEVMTF9CVU5ETEVfSUQsIC4uLldFQlZJRVdfQlVORExFX0lEU10uaW5jbHVkZXModGhpcy5idW5kbGVJZCkpIHtcbiAgICAgICAgdGhpcy5idW5kbGVJZCA9IENIUk9NRV9CVU5ETEVfSUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdHJ5IG91dCB3ZWJ2aWV3cyB3aGVuIG5vIGJ1bmRsZSBpZCBpcyBzZW50IGluXG4gICAgaWYgKCF0aGlzLmJ1bmRsZUlkKSB7XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBnZW5lcmljIENocm9tZSBidW5kbGVcbiAgICAgIHRoaXMuYnVuZGxlSWQgPSBDSFJPTUVfQlVORExFX0lEO1xuXG4gICAgICAvLyB3ZSBoYXZlIGEgd2VidmlldyBvZiBzb21lIHNvcnQsIHNvIHRyeSB0byBmaW5kIHRoZSBidW5kbGUgdmVyc2lvblxuICAgICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBXRUJWSUVXX0JVTkRMRV9JRFMpIHtcbiAgICAgICAgY2hyb21lVmVyc2lvbiA9IGF3YWl0IGdldENocm9tZVZlcnNpb24odGhpcy5hZGIsIGJ1bmRsZUlkKTtcbiAgICAgICAgaWYgKGNocm9tZVZlcnNpb24pIHtcbiAgICAgICAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGNocm9tZSB2ZXJzaW9uLCBpdCBtdXN0IG5vdCBiZSBhIHdlYnZpZXdcbiAgICBpZiAoIWNocm9tZVZlcnNpb24pIHtcbiAgICAgIGNocm9tZVZlcnNpb24gPSBhd2FpdCBnZXRDaHJvbWVWZXJzaW9uKHRoaXMuYWRiLCB0aGlzLmJ1bmRsZUlkKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgaXQgaXMgc2VtdmVyLCBzbyBsYXRlciBjaGVja3Mgd29uJ3QgZmFpbFxuICAgIHJldHVybiBjaHJvbWVWZXJzaW9uID8gc2VtdmVyLmNvZXJjZShjaHJvbWVWZXJzaW9uKSA6IG51bGw7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEcml2ZXJzTWFwcGluZyAobmV3TWFwcGluZykge1xuICAgIGxldCBzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nID0gdHJ1ZTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHRoaXMubWFwcGluZ1BhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGhpcy5tYXBwaW5nUGF0aCwgSlNPTi5zdHJpbmdpZnkobmV3TWFwcGluZywgbnVsbCwgMiksICd1dGY4Jyk7XG4gICAgICAgIHNob3VsZFVwZGF0ZVN0YXRpY01hcHBpbmcgPSBmYWxzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHN0b3JlIHRoZSB1cGRhdGVkIGNocm9tZWRyaXZlcnMgbWFwcGluZyBpbnRvICcke3RoaXMubWFwcGluZ1BhdGh9Jy4gYCArXG4gICAgICAgICAgYFRoaXMgbWF5IHJlZHVjZSB0aGUgcGVyZm9ybWFuY2Ugb2YgZnVydGhlciBleGVjdXRpb25zLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRVcGRhdGVTdGF0aWNNYXBwaW5nKSB7XG4gICAgICBPYmplY3QuYXNzaWduKENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORywgbmV3TWFwcGluZyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q29tcGF0aWJsZUNocm9tZWRyaXZlciAoKSB7XG4gICAgaWYgKCF0aGlzLmFkYikge1xuICAgICAgcmV0dXJuIGF3YWl0IGdldENocm9tZWRyaXZlckJpbmFyeVBhdGgoKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXBwaW5nID0gYXdhaXQgdGhpcy5nZXREcml2ZXJzTWFwcGluZygpO1xuICAgIGlmICghXy5pc0VtcHR5KG1hcHBpbmcpKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVGhlIG1vc3QgcmVjZW50IGtub3duIENocm9tZSB2ZXJzaW9uOiAke18udmFsdWVzKG1hcHBpbmcpWzBdfWApO1xuICAgIH1cblxuICAgIGxldCBkaWRTdG9yYWdlU3luYyA9IGZhbHNlO1xuICAgIGNvbnN0IHN5bmNDaHJvbWVkcml2ZXJzID0gYXN5bmMgKGNocm9tZVZlcnNpb24pID0+IHtcbiAgICAgIGRpZFN0b3JhZ2VTeW5jID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJldHJpZXZlZE1hcHBpbmcgPSBhd2FpdCB0aGlzLnN0b3JhZ2VDbGllbnQucmV0cmlldmVNYXBwaW5nKCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnR290IGNocm9tZWRyaXZlcnMgbWFwcGluZyBmcm9tIHRoZSBzdG9yYWdlOiAnICtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocmV0cmlldmVkTWFwcGluZywgbnVsbCwgMikpO1xuICAgICAgY29uc3QgZHJpdmVyS2V5cyA9IGF3YWl0IHRoaXMuc3RvcmFnZUNsaWVudC5zeW5jRHJpdmVycyh7XG4gICAgICAgIG1pbkJyb3dzZXJWZXJzaW9uOiBjaHJvbWVWZXJzaW9uLm1ham9yLFxuICAgICAgfSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcktleXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nID0gZHJpdmVyS2V5cy5yZWR1Y2UoKGFjYywgeCkgPT4ge1xuICAgICAgICBjb25zdCB7dmVyc2lvbiwgbWluQnJvd3NlclZlcnNpb259ID0gcmV0cmlldmVkTWFwcGluZ1t4XTtcbiAgICAgICAgYWNjW3ZlcnNpb25dID0gbWluQnJvd3NlclZlcnNpb247XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gICAgICBPYmplY3QuYXNzaWduKG1hcHBpbmcsIHN5bmNocm9uaXplZERyaXZlcnNNYXBwaW5nKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlRHJpdmVyc01hcHBpbmcobWFwcGluZyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgY2RzID0gYXdhaXQgdGhpcy5nZXRDaHJvbWVkcml2ZXJzKG1hcHBpbmcpO1xuXG4gICAgICBjb25zdCBtaXNzaW5nVmVyc2lvbnMgPSB7fTtcbiAgICAgIGZvciAoY29uc3Qge3ZlcnNpb24sIG1pbkNocm9tZVZlcnNpb259IG9mIGNkcykge1xuICAgICAgICBpZiAoIW1pbkNocm9tZVZlcnNpb24gfHwgbWFwcGluZ1t2ZXJzaW9uXSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZXJjZWRWZXIgPSBzZW12ZXIuY29lcmNlKHZlcnNpb24pO1xuICAgICAgICBpZiAoIWNvZXJjZWRWZXIgfHwgY29lcmNlZFZlci5tYWpvciA8IE5FV19DRF9WRVJTSU9OX0ZPUk1BVF9NQUpPUl9WRVJTSU9OKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBtaXNzaW5nVmVyc2lvbnNbdmVyc2lvbl0gPSBtaW5DaHJvbWVWZXJzaW9uO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkobWlzc2luZ1ZlcnNpb25zKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdDaHJvbWVkcml2ZXInLCBfLnNpemUobWlzc2luZ1ZlcnNpb25zKSwgdHJ1ZSl9LCBgICtcbiAgICAgICAgICBgd2hpY2ggJHtfLnNpemUobWlzc2luZ1ZlcnNpb25zKSA9PT0gMSA/ICdpcycgOiAnYXJlJ30gbWlzc2luZyBpbiB0aGUgbGlzdCBvZiBrbm93biB2ZXJzaW9uczogYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkobWlzc2luZ1ZlcnNpb25zKSk7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRHJpdmVyc01hcHBpbmcoT2JqZWN0LmFzc2lnbihtYXBwaW5nLCBtaXNzaW5nVmVyc2lvbnMpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZUJ1aWxkQ2hlY2spIHtcbiAgICAgICAgaWYgKF8uaXNFbXB0eShjZHMpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgJ2Nocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrJyBjYXBhYmlsaXR5IGlzIHNldCB0byAndHJ1ZSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIHRoaXMubG9nLndhcm4oYENocm9tZSBidWlsZCBjaGVjayBkaXNhYmxlZC4gVXNpbmcgbW9zdCByZWNlbnQgQ2hyb21lZHJpdmVyIHZlcnNpb24gKCR7dmVyc2lvbn0sIGF0ICcke2V4ZWN1dGFibGV9JylgKTtcbiAgICAgICAgdGhpcy5sb2cud2FybihgSWYgdGhpcyBpcyB3cm9uZywgc2V0ICdjaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjaycgY2FwYWJpbGl0eSB0byAnZmFsc2UnYCk7XG4gICAgICAgIHJldHVybiBleGVjdXRhYmxlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaHJvbWVWZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRDaHJvbWVWZXJzaW9uKCk7XG4gICAgICBpZiAoIWNocm9tZVZlcnNpb24pIHtcbiAgICAgICAgLy8gdW5hYmxlIHRvIGdldCB0aGUgY2hyb21lIHZlcnNpb25cbiAgICAgICAgaWYgKF8uaXNFbXB0eShjZHMpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUgYXZhaWxhYmxlIGZvciB1c2UgaWYgYCArXG4gICAgICAgICAgICBgdGhlIGN1cnJlbnQgQ2hyb21lIHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7dmVyc2lvbiwgZXhlY3V0YWJsZX0gPSBjZHNbMF07XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byBkaXNjb3ZlciBDaHJvbWUgdmVyc2lvbi4gVXNpbmcgQ2hyb21lZHJpdmVyICR7dmVyc2lvbn0gYXQgJyR7ZXhlY3V0YWJsZX0nYCk7XG4gICAgICAgIHJldHVybiBleGVjdXRhYmxlO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoYEZvdW5kIENocm9tZSBidW5kbGUgJyR7dGhpcy5idW5kbGVJZH0nIHZlcnNpb24gJyR7Y2hyb21lVmVyc2lvbn0nYCk7XG5cbiAgICAgIGNvbnN0IG1hdGNoaW5nRHJpdmVycyA9IGNkcy5maWx0ZXIoKHttaW5DaHJvbWVWZXJzaW9ufSkgPT4ge1xuICAgICAgICBjb25zdCBtaW5DaHJvbWVWZXJzaW9uUyA9IG1pbkNocm9tZVZlcnNpb24gJiYgc2VtdmVyLmNvZXJjZShtaW5DaHJvbWVWZXJzaW9uKTtcbiAgICAgICAgaWYgKCFtaW5DaHJvbWVWZXJzaW9uUykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaHJvbWVWZXJzaW9uLm1ham9yID4gTkVXX0NEX1ZFUlNJT05fRk9STUFUX01BSk9SX1ZFUlNJT05cbiAgICAgICAgICA/IG1pbkNocm9tZVZlcnNpb25TLm1ham9yID09PSBjaHJvbWVWZXJzaW9uLm1ham9yXG4gICAgICAgICAgOiBzZW12ZXIuZ3RlKGNocm9tZVZlcnNpb24sIG1pbkNocm9tZVZlcnNpb25TKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKF8uaXNFbXB0eShtYXRjaGluZ0RyaXZlcnMpKSB7XG4gICAgICAgIGlmICh0aGlzLnN0b3JhZ2VDbGllbnQgJiYgIWRpZFN0b3JhZ2VTeW5jKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBzeW5jQ2hyb21lZHJpdmVycyhjaHJvbWVWZXJzaW9uKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3Qgc3luY2hyb25pemUgbG9jYWwgY2hyb21lZHJpdmVycyB3aXRoIHRoZSByZW1vdGUgc3RvcmFnZSBhdCAke0NEX0NETn06IGAgK1xuICAgICAgICAgICAgICBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF1dG9kb3dubG9hZFN1Z2dlc3Rpb24gPVxuICAgICAgICAgICdZb3UgY291bGQgYWxzbyB0cnkgdG8gZW5hYmxlIGF1dG9tYXRlZCBjaHJvbWVkcml2ZXJzIGRvd25sb2FkIGFzICcgK1xuICAgICAgICAgICdhIHBvc3NpYmxlIHdvcmthcm91bmQuJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBDaHJvbWVkcml2ZXIgZm91bmQgdGhhdCBjYW4gYXV0b21hdGUgQ2hyb21lICcke2Nocm9tZVZlcnNpb259Jy5gICtcbiAgICAgICAgICAodGhpcy5zdG9yYWdlQ2xpZW50ID8gJycgOiBgICR7YXV0b2Rvd25sb2FkU3VnZ2VzdGlvbn1gKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJpblBhdGggPSBtYXRjaGluZ0RyaXZlcnNbMF0uZXhlY3V0YWJsZTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCdleGVjdXRhYmxlJywgbWF0Y2hpbmdEcml2ZXJzLmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgICAgICBgY2FwYWJsZSBvZiBhdXRvbWF0aW5nIENocm9tZSAnJHtjaHJvbWVWZXJzaW9ufScuXFxuQ2hvb3NpbmcgdGhlIG1vc3QgcmVjZW50LCAnJHtiaW5QYXRofScuYCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnSWYgYSBzcGVjaWZpYyB2ZXJzaW9uIGlzIHJlcXVpcmVkLCBzcGVjaWZ5IGl0IHdpdGggdGhlIGBjaHJvbWVkcml2ZXJFeGVjdXRhYmxlYCcgK1xuICAgICAgICAnZGVzaXJlZCBjYXBhYmlsaXR5LicpO1xuICAgICAgcmV0dXJuIGJpblBhdGg7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgIH0gd2hpbGUgKHRydWUpO1xuICB9XG5cbiAgYXN5bmMgaW5pdENocm9tZWRyaXZlclBhdGggKCkge1xuICAgIGlmICh0aGlzLmV4ZWN1dGFibGVWZXJpZmllZCkgcmV0dXJuOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgIC8vIHRoZSBleGVjdXRhYmxlIG1pZ2h0IGJlIHNldCAoaWYgcGFzc2VkIGluKVxuICAgIC8vIG9yIHdlIG1pZ2h0IHdhbnQgdG8gdXNlIHRoZSBiYXNpYyBvbmUgaW5zdGFsbGVkIHdpdGggdGhpcyBkcml2ZXJcbiAgICAvLyBvciB3ZSB3YW50IHRvIGZpZ3VyZSBvdXQgdGhlIGJlc3Qgb25lXG4gICAgaWYgKCF0aGlzLmNocm9tZWRyaXZlcikge1xuICAgICAgdGhpcy5jaHJvbWVkcml2ZXIgPSB0aGlzLnVzZVN5c3RlbUV4ZWN1dGFibGVcbiAgICAgICAgPyBhd2FpdCBnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoKClcbiAgICAgICAgOiBhd2FpdCB0aGlzLmdldENvbXBhdGlibGVDaHJvbWVkcml2ZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyh0aGlzLmNocm9tZWRyaXZlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHVzZSBhIGNocm9tZWRyaXZlciBiaW5hcnkgYXQgdGhlIHBhdGggYCArXG4gICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jaHJvbWVkcml2ZXJ9LCBidXQgaXQgZG9lc24ndCBleGlzdCFgKTtcbiAgICB9XG4gICAgdGhpcy5leGVjdXRhYmxlVmVyaWZpZWQgPSB0cnVlO1xuICAgIHRoaXMubG9nLmluZm8oYFNldCBjaHJvbWVkcml2ZXIgYmluYXJ5IGFzOiAke3RoaXMuY2hyb21lZHJpdmVyfWApO1xuICB9XG5cbiAgc3luY1Byb3RvY29sIChjZFZlcnNpb24gPSBudWxsKSB7XG4gICAgY29uc3QgY29lcmNlZFZlcnNpb24gPSBzZW12ZXIuY29lcmNlKGNkVmVyc2lvbik7XG4gICAgaWYgKCFjb2VyY2VkVmVyc2lvbiB8fCBjb2VyY2VkVmVyc2lvbi5tYWpvciA8IE1JTl9DRF9WRVJTSU9OX1dJVEhfVzNDX1NVUFBPUlQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdi4gJHtjZFZlcnNpb259IGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgJHtQUk9UT0NPTFMuVzNDfSBwcm90b2NvbC4gYCArXG4gICAgICAgIGBEZWZhdWx0aW5nIHRvICR7UFJPVE9DT0xTLk1KU09OV1B9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBnZXRDYXBWYWx1ZSh0aGlzLmNhcGFiaWxpdGllcywgJ2Nocm9tZU9wdGlvbnMnLCB7fSk7XG4gICAgaWYgKGNocm9tZU9wdGlvbnMudzNjID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgQ2hyb21lZHJpdmVyIHYuICR7Y2RWZXJzaW9ufSBzdXBwb3J0cyAke1BST1RPQ09MUy5XM0N9IHByb3RvY29sLCBgICtcbiAgICAgICAgYGJ1dCAke1BST1RPQ09MUy5NSlNPTldQfSBvbmUgaGFzIGJlZW4gZXhwbGljaXRseSByZXF1ZXN0ZWRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kZXNpcmVkUHJvdG9jb2wgPSBQUk9UT0NPTFMuVzNDO1xuICAgIC8vIGdpdmVuIGNhcHMgbWlnaHQgbm90IGJlIHByb3Blcmx5IHByZWZpeGVkXG4gICAgLy8gc28gd2UgdHJ5IHRvIGZpeCB0aGVtIGluIG9yZGVyIHRvIHByb3Blcmx5IGluaXRcbiAgICAvLyB0aGUgbmV3IFczQyBzZXNzaW9uXG4gICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB0b1czY0NhcE5hbWVzKHRoaXMuY2FwYWJpbGl0aWVzKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChjYXBzLCBlbWl0U3RhcnRpbmdTdGF0ZSA9IHRydWUpIHtcbiAgICB0aGlzLmNhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKGNhcHMpO1xuXG4gICAgLy8gc2V0IHRoZSBsb2dnaW5nIHByZWZlcmVuY2VzIHRvIEFMTCB0aGUgY29uc29sZSBsb2dzXG4gICAgdGhpcy5jYXBhYmlsaXRpZXMubG9nZ2luZ1ByZWZzID0gXy5jbG9uZURlZXAoZ2V0Q2FwVmFsdWUoY2FwcywgJ2xvZ2dpbmdQcmVmcycsIHt9KSk7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLmNhcGFiaWxpdGllcy5sb2dnaW5nUHJlZnMuYnJvd3NlcikpIHtcbiAgICAgIHRoaXMuY2FwYWJpbGl0aWVzLmxvZ2dpbmdQcmVmcy5icm93c2VyID0gJ0FMTCc7XG4gICAgfVxuXG4gICAgaWYgKGVtaXRTdGFydGluZ1N0YXRlKSB7XG4gICAgICB0aGlzLmNoYW5nZVN0YXRlKENocm9tZWRyaXZlci5TVEFURV9TVEFSVElORyk7XG4gICAgfVxuXG4gICAgY29uc3QgYXJncyA9IFtgLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9YF07XG4gICAgaWYgKHRoaXMuYWRiICYmIHRoaXMuYWRiLmFkYlBvcnQpIHtcbiAgICAgIGFyZ3MucHVzaChgLS1hZGItcG9ydD0ke3RoaXMuYWRiLmFkYlBvcnR9YCk7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkodGhpcy5jbWRBcmdzKSkge1xuICAgICAgYXJncy5wdXNoKC4uLnRoaXMuY21kQXJncyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvZ1BhdGgpIHtcbiAgICAgIGFyZ3MucHVzaChgLS1sb2ctcGF0aD0ke3RoaXMubG9nUGF0aH1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZUJ1aWxkQ2hlY2spIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1kaXNhYmxlLWJ1aWxkLWNoZWNrJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLS12ZXJib3NlJyk7XG4gICAgLy8gd2hhdCBhcmUgdGhlIHByb2Nlc3Mgc3Rkb3V0L3N0ZGVyciBjb25kaXRpb25zIHdoZXJlaW4gd2Uga25vdyB0aGF0XG4gICAgLy8gdGhlIHByb2Nlc3MgaGFzIHN0YXJ0ZWQgdG8gb3VyIHNhdGlzZmFjdGlvbj9cbiAgICBjb25zdCBzdGFydERldGVjdG9yID0gKHN0ZG91dCkgPT4gc3Rkb3V0LnN0YXJ0c1dpdGgoJ1N0YXJ0aW5nICcpO1xuXG4gICAgbGV0IHByb2Nlc3NJc0FsaXZlID0gZmFsc2U7XG4gICAgbGV0IHdlYnZpZXdWZXJzaW9uO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRDaHJvbWVkcml2ZXJQYXRoKCk7XG4gICAgICBhd2FpdCB0aGlzLmtpbGxBbGwoKTtcblxuICAgICAgLy8gc2V0IHVwIG91ciBzdWJwcm9jZXNzIG9iamVjdFxuICAgICAgdGhpcy5wcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5jaHJvbWVkcml2ZXIsIGFyZ3MpO1xuICAgICAgcHJvY2Vzc0lzQWxpdmUgPSB0cnVlO1xuXG4gICAgICAvLyBoYW5kbGUgbG9nIG91dHB1dFxuICAgICAgdGhpcy5wcm9jLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgLy8gaWYgdGhlIGNkIG91dHB1dCBpcyBub3QgcHJpbnRlZCwgZmluZCB0aGUgY2hyb21lIHZlcnNpb24gYW5kIHByaW50XG4gICAgICAgIC8vIHdpbGwgZ2V0IGEgcmVzcG9uc2UgbGlrZVxuICAgICAgICAvLyAgIERldlRvb2xzIHJlc3BvbnNlOiB7XG4gICAgICAgIC8vICAgICAgXCJBbmRyb2lkLVBhY2thZ2VcIjogXCJpby5hcHBpdW0uc2FtcGxlYXBwXCIsXG4gICAgICAgIC8vICAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzU1LjAuMjg4My45MVwiLFxuICAgICAgICAvLyAgICAgIFwiUHJvdG9jb2wtVmVyc2lvblwiOiBcIjEuMlwiLFxuICAgICAgICAvLyAgICAgIFwiVXNlci1BZ2VudFwiOiBcIi4uLlwiLFxuICAgICAgICAvLyAgICAgIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzZcIlxuICAgICAgICAvLyAgIH1cbiAgICAgICAgY29uc3Qgb3V0ID0gc3Rkb3V0ICsgc3RkZXJyO1xuICAgICAgICBsZXQgbWF0Y2ggPSAvXCJCcm93c2VyXCI6IFwiKC4qKVwiLy5leGVjKG91dCk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHdlYnZpZXdWZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFdlYnZpZXcgdmVyc2lvbjogJyR7d2Vidmlld1ZlcnNpb259J2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWxzbyBwcmludCBjaHJvbWVkcml2ZXIgdmVyc2lvbiB0byBsb2dzXG4gICAgICAgIC8vIHdpbGwgb3V0cHV0IHNvbWV0aGluZyBsaWtlXG4gICAgICAgIC8vICBTdGFydGluZyBDaHJvbWVEcml2ZXIgMi4zMy41MDYxMDYgKDhhMDZjMzljNDU4MmZiZmJhYjY5NjZkYmIxYzM4YTkxNzNiZmIxYTIpIG9uIHBvcnQgOTUxNVxuICAgICAgICBtYXRjaCA9IC9TdGFydGluZyBDaHJvbWVEcml2ZXIgKFsuXFxkXSspLy5leGVjKG91dCk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBDaHJvbWVkcml2ZXIgdmVyc2lvbjogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgICAgIHRoaXMuc3luY1Byb3RvY29sKG1hdGNoWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdpdmUgdGhlIG91dHB1dCBpZiBpdCBpcyByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgICAgIGZvciAobGV0IGxpbmUgb2YgKHN0ZG91dCB8fCAnJykudHJpbSgpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgICAgaWYgKCFsaW5lLnRyaW0oKS5sZW5ndGgpIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgW1NURE9VVF0gJHtsaW5lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIChzdGRlcnIgfHwgJycpLnRyaW0oKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgICAgIGlmICghbGluZS50cmltKCkubGVuZ3RoKSBjb250aW51ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYFtTVERFUlJdICR7bGluZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBoYW5kbGUgb3V0LW9mLWJvdW5kIGV4aXQgYnkgc2ltcGx5IGVtaXR0aW5nIGEgc3RvcHBlZCBzdGF0ZVxuICAgICAgdGhpcy5wcm9jLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBwcm9jZXNzSXNBbGl2ZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgIT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUElORyAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZSAhPT0gQ2hyb21lZHJpdmVyLlNUQVRFX1JFU1RBUlRJTkcpIHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBgQ2hyb21lZHJpdmVyIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2l0aCBjb2RlICR7Y29kZX0sIHNpZ25hbCAke3NpZ25hbH1gO1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKG1zZyk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU3Bhd25pbmcgY2hyb21lZHJpdmVyIHdpdGg6ICR7dGhpcy5jaHJvbWVkcml2ZXJ9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICAvLyBzdGFydCBzdWJwcm9jIGFuZCB3YWl0IGZvciBzdGFydERldGVjdG9yXG4gICAgICBhd2FpdCB0aGlzLnByb2Muc3RhcnQoc3RhcnREZXRlY3Rvcik7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JPbmxpbmUoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRTZXNzaW9uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoZSk7XG4gICAgICB0aGlzLmVtaXQoQ2hyb21lZHJpdmVyLkVWRU5UX0VSUk9SLCBlKTtcbiAgICAgIC8vIGp1c3QgYmVjYXVzZSB3ZSBoYWQgYW4gZXJyb3IgZG9lc24ndCBtZWFuIHRoZSBjaHJvbWVkcml2ZXIgcHJvY2Vzc1xuICAgICAgLy8gZmluaXNoZWQ7IHdlIHNob3VsZCBjbGVhbiB1cCBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChwcm9jZXNzSXNBbGl2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Muc3RvcCgpO1xuICAgICAgfVxuXG4gICAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgICAgLy8gb2Z0ZW4gdGhlIHVzZXIncyBDaHJvbWUgdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB2ZXJzaW9uIG9mIENocm9tZWRyaXZlclxuICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcygnQ2hyb21lIHZlcnNpb24gbXVzdCBiZScpKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gJ1VuYWJsZSB0byBhdXRvbWF0ZSBDaHJvbWUgdmVyc2lvbiBiZWNhdXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIENocm9tZWRyaXZlci5cXG4nO1xuICAgICAgICBpZiAod2Vidmlld1ZlcnNpb24pIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGBDaHJvbWUgdmVyc2lvbiBvbiB0aGUgZGV2aWNlOiAke3dlYnZpZXdWZXJzaW9ufVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlciA9IC9DaHJvbWUgdmVyc2lvbiBtdXN0IGJlICguKykvLmV4ZWMoZS5tZXNzYWdlKT8uWzFdIHx8ICcnO1xuICAgICAgICBpZiAodmVyc2lvbnNTdXBwb3J0ZWRCeURyaXZlcikge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYENocm9tZWRyaXZlciBzdXBwb3J0cyBDaHJvbWUgdmVyc2lvbihzKTogJHt2ZXJzaW9uc1N1cHBvcnRlZEJ5RHJpdmVyfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZSArPSAnQ2hlY2sgdGhlIGRyaXZlciB0dXRvcmlhbCBmb3IgdHJvdWJsZXNob290aW5nLlxcbic7XG4gICAgICB9XG5cbiAgICAgIG1lc3NhZ2UgKz0gZS5tZXNzYWdlO1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBzZXNzaW9uSWQgKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FID8gdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA6IG51bGw7XG4gIH1cblxuICBhc3luYyByZXN0YXJ0ICgpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdSZXN0YXJ0aW5nIGNocm9tZWRyaXZlcicpO1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSBDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCByZXN0YXJ0IHdoZW4gd2UncmUgbm90IG9ubGluZVwiKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfUkVTVEFSVElORyk7XG4gICAgYXdhaXQgdGhpcy5zdG9wKGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0KHRoaXMuY2FwYWJpbGl0aWVzLCBmYWxzZSk7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yT25saW5lICgpIHtcbiAgICAvLyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IENEIGhhc24ndCBjcmFzaGVkXG4gICAgbGV0IGNocm9tZWRyaXZlclN0b3BwZWQgPSBmYWxzZTtcbiAgICBhd2FpdCByZXRyeUludGVydmFsKDIwLCAyMDAsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICAvLyB3ZSBhcmUgZWl0aGVyIHN0b3BwZWQgb3Igc3RvcHBpbmcsIHNvIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICAgIGNocm9tZWRyaXZlclN0b3BwZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIH0pO1xuICAgIGlmIChjaHJvbWVkcml2ZXJTdG9wcGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nocm9tZURyaXZlciBjcmFzaGVkIGR1cmluZyBzdGFydHVwLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXNzaW9uICgpIHtcbiAgICBjb25zdCBzZXNzaW9uQ2FwcyA9IHRoaXMuZGVzaXJlZFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDXG4gICAgICA/IHtjYXBhYmlsaXRpZXM6IHthbHdheXNNYXRjaDogdGhpcy5jYXBhYmlsaXRpZXN9fVxuICAgICAgOiB7ZGVzaXJlZENhcGFiaWxpdGllczogdGhpcy5jYXBhYmlsaXRpZXN9O1xuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nICR7dGhpcy5kZXNpcmVkUHJvdG9jb2x9IENocm9tZWRyaXZlciBzZXNzaW9uIHdpdGggY2FwYWJpbGl0aWVzOiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHNlc3Npb25DYXBzLCBudWxsLCAyKSk7XG4gICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCBzZXNzaW9uQ2Fwcyk7XG4gICAgdGhpcy5sb2cucHJlZml4ID0gZ2VuZXJhdGVMb2dQcmVmaXgodGhpcywgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCk7XG4gICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfT05MSU5FKTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKGVtaXRTdGF0ZXMgPSB0cnVlKSB7XG4gICAgaWYgKGVtaXRTdGF0ZXMpIHtcbiAgICAgIHRoaXMuY2hhbmdlU3RhdGUoQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HKTtcbiAgICB9XG4gICAgY29uc3QgcnVuU2FmZVN0ZXAgPSBhc3luYyAoZikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGYoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGF3YWl0IHJ1blNhZmVTdGVwKCgpID0+IHRoaXMuandwcm94eS5jb21tYW5kKCcnLCAnREVMRVRFJykpO1xuICAgIGF3YWl0IHJ1blNhZmVTdGVwKCgpID0+IHRoaXMucHJvYy5zdG9wKCdTSUdURVJNJywgMjAwMDApKTtcbiAgICB0aGlzLmxvZy5wcmVmaXggPSBnZW5lcmF0ZUxvZ1ByZWZpeCh0aGlzKTtcbiAgICBpZiAoZW1pdFN0YXRlcykge1xuICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlU3RhdGUgKHN0YXRlKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMubG9nLmRlYnVnKGBDaGFuZ2VkIHN0YXRlIHRvICcke3N0YXRlfSdgKTtcbiAgICB0aGlzLmVtaXQoQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIHtzdGF0ZX0pO1xuICB9XG5cbiAgYXN5bmMgc2VuZENvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxuXG4gIGFzeW5jIHByb3h5UmVxIChyZXEsIHJlcykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMocmVxLCByZXMpO1xuICB9XG5cbiAgYXN5bmMga2lsbEFsbCAoKSB7XG4gICAgbGV0IGNtZCA9IHN5c3RlbS5pc1dpbmRvd3MoKVxuICAgICAgPyBgd21pYyBwcm9jZXNzIHdoZXJlIFwiY29tbWFuZGxpbmUgbGlrZSAnJWNocm9tZWRyaXZlci5leGUlLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9JSdcIiBkZWxldGVgXG4gICAgICA6IGBwa2lsbCAtMTUgLWYgXCIke3RoaXMuY2hyb21lZHJpdmVyfS4qLS1wb3J0PSR7dGhpcy5wcm94eVBvcnR9XCJgO1xuICAgIHRoaXMubG9nLmRlYnVnKGBLaWxsaW5nIGFueSBvbGQgY2hyb21lZHJpdmVycywgcnVubmluZzogJHtjbWR9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IChCLnByb21pc2lmeShjcC5leGVjKSkoY21kKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdTdWNjZXNzZnVsbHkgY2xlYW5lZCB1cCBvbGQgY2hyb21lZHJpdmVycycpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybignTm8gb2xkIGNocm9tZWRyaXZlcnMgc2VlbSB0byBleGlzdCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgY29uc3QgdWRpZEluZGV4ID0gdGhpcy5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJncy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0gPT09ICctcycpO1xuICAgICAgY29uc3QgdWRpZCA9IHVkaWRJbmRleCA+IC0xID8gdGhpcy5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1t1ZGlkSW5kZXggKyAxXSA6IG51bGw7XG5cbiAgICAgIGlmICh1ZGlkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbGVhbmluZyB0aGlzIGRldmljZSdzIGFkYiBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbnM6ICR7dWRpZH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbGVhbmluZyBhbnkgb2xkIGFkYiBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbnNgKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChsZXQgY29ubiBvZiBhd2FpdCB0aGlzLmFkYi5nZXRGb3J3YXJkTGlzdCgpKSB7XG4gICAgICAgICAgLy8gY2hyb21lZHJpdmVyIHdpbGwgYXNrIEFEQiB0byBmb3J3YXJkIGEgcG9ydCBsaWtlIFwiZGV2aWNlSWQgdGNwOnBvcnQgbG9jYWxhYnN0cmFjdDp3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV9wb3J0XCJcbiAgICAgICAgICBpZiAoIShjb25uLmluY2x1ZGVzKCd3ZWJ2aWV3X2RldnRvb2xzJykgJiYgKCF1ZGlkIHx8IGNvbm4uaW5jbHVkZXModWRpZCkpKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHBhcmFtcyA9IGNvbm4uc3BsaXQoL1xccysvKTtcbiAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHBhcmFtc1sxXS5yZXBsYWNlKC9bXFxEXSovLCAnJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byBjbGVhbiBmb3J3YXJkZWQgcG9ydHMuIEVycm9yOiAnJHtlcnIubWVzc2FnZX0nLiBDb250aW51aW5nLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhc1dvcmtpbmdXZWJ2aWV3ICgpIHtcbiAgICAvLyBzb21ldGltZXMgY2hyb21lZHJpdmVyIHN0b3BzIGF1dG9tYXRpbmcgd2Vidmlld3MuIHRoaXMgbWV0aG9kIHJ1bnMgYVxuICAgIC8vIHNpbXBsZSBjb21tYW5kIHRvIGRldGVybWluZSBvdXIgc3RhdGUsIGFuZCByZXNwb25kcyBhY2NvcmRpbmdseVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3VybCcsICdHRVQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuQ2hyb21lZHJpdmVyLkVWRU5UX0VSUk9SID0gJ2Nocm9tZWRyaXZlcl9lcnJvcic7XG5DaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCA9ICdzdGF0ZUNoYW5nZWQnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQgPSAnc3RvcHBlZCc7XG5DaHJvbWVkcml2ZXIuU1RBVEVfU1RBUlRJTkcgPSAnc3RhcnRpbmcnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX09OTElORSA9ICdvbmxpbmUnO1xuQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQSU5HID0gJ3N0b3BwaW5nJztcbkNocm9tZWRyaXZlci5TVEFURV9SRVNUQVJUSU5HID0gJ3Jlc3RhcnRpbmcnO1xuXG5leHBvcnQgeyBDaHJvbWVkcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IENocm9tZWRyaXZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQU1BLG1DQUFtQyxHQUFHLEVBQUU7QUFDOUMsTUFBTUMsWUFBWSxHQUFHLFdBQVc7QUFDaEMsTUFBTUMsK0JBQStCLEdBQUcsRUFBRTtBQUMxQyxNQUFNQyxZQUFZLEdBQUcsSUFBSTtBQUN6QixNQUFNQyxnQkFBZ0IsR0FBRyxvQkFBb0I7QUFDN0MsTUFBTUMsdUJBQXVCLEdBQUcsNEJBQTRCO0FBQzVELE1BQU1DLGtCQUFrQixHQUFHLENBQ3pCLDRCQUE0QixFQUM1QixxQkFBcUIsQ0FDdEI7QUFDRCxNQUFNQyxlQUFlLEdBQUcsVUFBVTtBQUVsQyxNQUFNQyxrQkFBa0IsR0FBRyxJQUFJO0FBRS9CLE1BQU1DLFlBQVksU0FBU0MsZUFBTSxDQUFDQyxZQUFZLENBQUM7RUFDN0NDLFdBQVcsQ0FBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ3RCLEtBQUssRUFBRTtJQUVQLE1BQU07TUFDSkMsSUFBSSxHQUFHYixZQUFZO01BQ25CYyxJQUFJLEdBQUdaLFlBQVk7TUFDbkJhLG1CQUFtQixHQUFHLEtB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
|