appium-uiautomator2-driver 2.0.4 → 2.0.7
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/README.md +1 -0
- package/build/lib/commands/element.js +2 -6
- package/build/lib/commands/general.js +8 -12
- package/build/lib/commands/screenshot.js +3 -7
- package/build/lib/commands/touch.js +4 -11
- package/build/lib/driver.js +52 -73
- package/build/lib/uiautomator2.js +29 -39
- package/lib/commands/element.js +1 -3
- package/lib/commands/general.js +7 -8
- package/lib/commands/screenshot.js +3 -5
- package/lib/commands/touch.js +3 -5
- package/lib/driver.js +53 -52
- package/lib/uiautomator2.js +28 -27
- package/npm-shrinkwrap.json +647 -303
- package/package.json +4 -4
package/build/lib/driver.js
CHANGED
|
@@ -21,8 +21,6 @@ var _asyncbox = require("asyncbox");
|
|
|
21
21
|
|
|
22
22
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
23
23
|
|
|
24
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
25
|
-
|
|
26
24
|
var _index = _interopRequireDefault(require("./commands/index"));
|
|
27
25
|
|
|
28
26
|
var _appiumAdb = require("appium-adb");
|
|
@@ -109,16 +107,14 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
109
107
|
_lodash.default.defaults(this.opts, defaultOpts);
|
|
110
108
|
|
|
111
109
|
if (this.isChromeSession) {
|
|
112
|
-
|
|
113
|
-
|
|
110
|
+
this.log.info("We're going to run a Chrome-based session");
|
|
114
111
|
let {
|
|
115
112
|
pkg,
|
|
116
113
|
activity
|
|
117
114
|
} = helpers.getChromePkg(this.opts.browserName);
|
|
118
115
|
this.opts.appPackage = this.caps.appPackage = pkg;
|
|
119
116
|
this.opts.appActivity = this.caps.appActivity = activity;
|
|
120
|
-
|
|
121
|
-
_logger.default.info(`Chrome-type package and activity are ${pkg} and ${activity}`);
|
|
117
|
+
this.log.info(`Chrome-type package and activity are ${pkg} and ${activity}`);
|
|
122
118
|
}
|
|
123
119
|
|
|
124
120
|
if (this.opts.reboot) {
|
|
@@ -129,9 +125,9 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
129
125
|
this.opts.app = await this.helpers.configureApp(this.opts.app, [_extensions.APK_EXTENSION, _extensions.APKS_EXTENSION]);
|
|
130
126
|
await this.checkAppPresent();
|
|
131
127
|
} else if (this.opts.appPackage) {
|
|
132
|
-
|
|
128
|
+
this.log.info(`Starting '${this.opts.appPackage}' directly on the device`);
|
|
133
129
|
} else {
|
|
134
|
-
|
|
130
|
+
this.log.info(`Neither 'app' nor 'appPackage' was set. Starting UiAutomator2 ` + 'without the target application');
|
|
135
131
|
}
|
|
136
132
|
|
|
137
133
|
this.opts.adbPort = this.opts.adbPort || _appiumAdb.DEFAULT_ADB_PORT;
|
|
@@ -139,8 +135,7 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
139
135
|
await this.fillDeviceDetails();
|
|
140
136
|
|
|
141
137
|
if (this.opts.mjpegScreenshotUrl) {
|
|
142
|
-
|
|
143
|
-
|
|
138
|
+
this.log.info(`Starting MJPEG stream reading URL: '${this.opts.mjpegScreenshotUrl}'`);
|
|
144
139
|
this.mjpegStream = new _support.mjpeg.MJpegStream(this.opts.mjpegScreenshotUrl);
|
|
145
140
|
await this.mjpegStream.start();
|
|
146
141
|
}
|
|
@@ -164,9 +159,7 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
164
159
|
|
|
165
160
|
async getSession() {
|
|
166
161
|
let sessionData = await super.getSession();
|
|
167
|
-
|
|
168
|
-
_logger.default.debug('Getting session details from server to mix in');
|
|
169
|
-
|
|
162
|
+
this.log.debug('Getting session details from server to mix in');
|
|
170
163
|
let uia2Data = await this.uiautomator2.jwproxy.command('/', 'GET', {});
|
|
171
164
|
return Object.assign({}, sessionData, uia2Data);
|
|
172
165
|
}
|
|
@@ -177,14 +170,14 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
177
170
|
|
|
178
171
|
setAvdFromCapabilities(caps) {
|
|
179
172
|
if (this.opts.avd) {
|
|
180
|
-
|
|
173
|
+
this.log.info('avd name defined, ignoring device name and platform version');
|
|
181
174
|
} else {
|
|
182
175
|
if (!caps.deviceName) {
|
|
183
|
-
|
|
176
|
+
this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');
|
|
184
177
|
}
|
|
185
178
|
|
|
186
179
|
if (!caps.platformVersion) {
|
|
187
|
-
|
|
180
|
+
this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');
|
|
188
181
|
}
|
|
189
182
|
|
|
190
183
|
let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');
|
|
@@ -194,10 +187,10 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
194
187
|
|
|
195
188
|
async allocateSystemPort() {
|
|
196
189
|
const forwardPort = async localPort => {
|
|
197
|
-
|
|
190
|
+
this.log.debug(`Forwarding UiAutomator2 Server port ${DEVICE_PORT} to local port ${localPort}`);
|
|
198
191
|
|
|
199
192
|
if ((await (0, _portscanner.checkPortStatus)(localPort, LOCALHOST_IP4)) === 'open') {
|
|
200
|
-
|
|
193
|
+
this.log.errorAndThrow(`UiAutomator2 Server cannot start because the local port #${localPort} is busy. ` + `Make sure the port you provide via 'systemPort' capability is not occupied. ` + `This situation might often be a result of an inaccurate sessions management, e.g. ` + `old automation sessions on the same device must always be closed before starting new ones.`);
|
|
201
194
|
}
|
|
202
195
|
|
|
203
196
|
await this.adb.forwardPort(localPort, DEVICE_PORT);
|
|
@@ -214,7 +207,7 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
214
207
|
try {
|
|
215
208
|
this.opts.systemPort = await (0, _portscanner.findAPortNotInUse)(startPort, endPort);
|
|
216
209
|
} catch (e) {
|
|
217
|
-
|
|
210
|
+
this.log.errorAndThrow(`Cannot find any free port in range ${startPort}..${endPort}}. ` + `Please set the available port number by providing the systemPort capability or ` + `double check the processes that are locking ports within this range and terminate ` + `these which are not needed anymore`);
|
|
218
211
|
}
|
|
219
212
|
|
|
220
213
|
await forwardPort(this.opts.systemPort);
|
|
@@ -256,22 +249,20 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
256
249
|
const apiLevel = await this.adb.getApiLevel();
|
|
257
250
|
|
|
258
251
|
if (apiLevel < 21) {
|
|
259
|
-
|
|
252
|
+
this.log.errorAndThrow('UIAutomator2 is only supported since Android 5.0 (Lollipop). ' + 'You could still use other supported backends in order to automate older Android versions.');
|
|
260
253
|
}
|
|
261
254
|
|
|
262
255
|
if (apiLevel >= 28) {
|
|
263
|
-
|
|
264
|
-
|
|
256
|
+
this.log.info('Relaxing hidden api policy');
|
|
265
257
|
await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);
|
|
266
258
|
}
|
|
267
259
|
|
|
268
260
|
if (_support.util.hasValue(this.opts.gpsEnabled)) {
|
|
269
261
|
if (this.isEmulator()) {
|
|
270
|
-
|
|
271
|
-
|
|
262
|
+
this.log.info(`Trying to ${this.opts.gpsEnabled ? 'enable' : 'disable'} gps location provider`);
|
|
272
263
|
await this.adb.toggleGPSLocationProvider(this.opts.gpsEnabled);
|
|
273
264
|
} else {
|
|
274
|
-
|
|
265
|
+
this.log.warn(`Sorry! 'gpsEnabled' capability is only available for emulators`);
|
|
275
266
|
}
|
|
276
267
|
}
|
|
277
268
|
|
|
@@ -286,12 +277,11 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
286
277
|
|
|
287
278
|
if (this.opts.disableWindowAnimation && (await this.adb.getApiLevel()) < 26) {
|
|
288
279
|
if (await this.adb.isAnimationOn()) {
|
|
289
|
-
|
|
290
|
-
|
|
280
|
+
this.log.info('Disabling animation via io.appium.settings');
|
|
291
281
|
await this.adb.setAnimationState(false);
|
|
292
282
|
this._wasWindowAnimationDisabled = true;
|
|
293
283
|
} else {
|
|
294
|
-
|
|
284
|
+
this.log.info('Window animation is already disabled');
|
|
295
285
|
}
|
|
296
286
|
}
|
|
297
287
|
|
|
@@ -307,7 +297,7 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
307
297
|
if (!this.opts.skipUnlock) {
|
|
308
298
|
await helpers.unlock(this, this.adb, this.caps);
|
|
309
299
|
} else {
|
|
310
|
-
|
|
300
|
+
this.log.debug(`'skipUnlock' capability set, so skipping device unlock`);
|
|
311
301
|
}
|
|
312
302
|
|
|
313
303
|
if (this.isChromeSession) {
|
|
@@ -317,17 +307,14 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
317
307
|
}
|
|
318
308
|
|
|
319
309
|
if (_support.util.hasValue(this.opts.orientation)) {
|
|
320
|
-
|
|
321
|
-
|
|
310
|
+
this.log.debug(`Setting initial orientation to '${this.opts.orientation}'`);
|
|
322
311
|
await this.setOrientation(this.opts.orientation);
|
|
323
312
|
}
|
|
324
313
|
|
|
325
314
|
if (this.opts.autoWebview) {
|
|
326
315
|
const viewName = this.defaultWebviewName();
|
|
327
316
|
const timeout = this.opts.autoWebviewTimeout || 2000;
|
|
328
|
-
|
|
329
|
-
_logger.default.info(`Setting auto webview to context '${viewName}' with timeout ${timeout}ms`);
|
|
330
|
-
|
|
317
|
+
this.log.info(`Setting auto webview to context '${viewName}' with timeout ${timeout}ms`);
|
|
331
318
|
await (0, _asyncbox.retryInterval)(timeout / 500, 500, this.setContext.bind(this), viewName);
|
|
332
319
|
}
|
|
333
320
|
|
|
@@ -365,19 +352,19 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
365
352
|
disableSuppressAccessibilityService: this.opts.disableSuppressAccessibilityService,
|
|
366
353
|
readTimeout: this.opts.uiautomator2ServerReadTimeout
|
|
367
354
|
};
|
|
368
|
-
this.uiautomator2 = new _uiautomator.UiAutomator2Server(uiautomator2Opts);
|
|
355
|
+
this.uiautomator2 = new _uiautomator.UiAutomator2Server(this.log, uiautomator2Opts);
|
|
369
356
|
this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);
|
|
370
357
|
this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);
|
|
371
358
|
|
|
372
359
|
if (this.opts.skipServerInstallation) {
|
|
373
|
-
|
|
360
|
+
this.log.info(`'skipServerInstallation' is set. Skipping UIAutomator2 server installation.`);
|
|
374
361
|
} else {
|
|
375
362
|
await this.uiautomator2.installServerApk(this.opts.uiautomator2ServerInstallTimeout);
|
|
376
363
|
|
|
377
364
|
try {
|
|
378
365
|
await this.adb.addToDeviceIdleWhitelist(_appiumAndroidDriver.SETTINGS_HELPER_PKG_ID, _uiautomator.SERVER_PACKAGE_ID, _uiautomator.SERVER_TEST_PACKAGE_ID);
|
|
379
366
|
} catch (e) {
|
|
380
|
-
|
|
367
|
+
this.log.warn(`Cannot add server packages to the Doze whitelist. Original error: ` + (e.stderr || e.message));
|
|
381
368
|
}
|
|
382
369
|
}
|
|
383
370
|
}
|
|
@@ -393,7 +380,7 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
393
380
|
try {
|
|
394
381
|
otherApps = helpers.parseArray(this.opts.otherApps);
|
|
395
382
|
} catch (e) {
|
|
396
|
-
|
|
383
|
+
this.log.errorAndThrow(`Could not parse "otherApps" capability: ${e.message}`);
|
|
397
384
|
}
|
|
398
385
|
|
|
399
386
|
otherApps = await _bluebird.default.all(otherApps.map(app => this.helpers.configureApp(app, [_extensions.APK_EXTENSION, _extensions.APKS_EXTENSION])));
|
|
@@ -414,14 +401,14 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
414
401
|
|
|
415
402
|
await helpers.installApk(this.adb, this.opts);
|
|
416
403
|
} else {
|
|
417
|
-
|
|
404
|
+
this.log.debug('noReset has been requested and the app is already installed. Doing nothing');
|
|
418
405
|
}
|
|
419
406
|
} else {
|
|
420
407
|
if (this.opts.fullReset) {
|
|
421
|
-
|
|
408
|
+
this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');
|
|
422
409
|
}
|
|
423
410
|
|
|
424
|
-
|
|
411
|
+
this.log.debug('No app capability. Assuming it is already on the device');
|
|
425
412
|
|
|
426
413
|
if (this.opts.fastReset && this.opts.appPackage) {
|
|
427
414
|
await helpers.resetApp(this.adb, this.opts);
|
|
@@ -432,12 +419,10 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
432
419
|
async ensureAppStarts() {
|
|
433
420
|
const appWaitPackage = this.opts.appWaitPackage || this.opts.appPackage;
|
|
434
421
|
const appWaitActivity = this.opts.appWaitActivity || this.opts.appActivity;
|
|
435
|
-
|
|
436
|
-
_logger.default.info(`Starting '${this.opts.appPackage}/${this.opts.appActivity} ` + `and waiting for '${appWaitPackage}/${appWaitActivity}'`);
|
|
422
|
+
this.log.info(`Starting '${this.opts.appPackage}/${this.opts.appActivity} ` + `and waiting for '${appWaitPackage}/${appWaitActivity}'`);
|
|
437
423
|
|
|
438
424
|
if (this.caps.androidCoverage) {
|
|
439
|
-
|
|
440
|
-
|
|
425
|
+
this.log.info(`androidCoverage is configured. ` + ` Starting instrumentation of '${this.caps.androidCoverage}'...`);
|
|
441
426
|
await this.adb.androidCoverage(this.caps.androidCoverage, appWaitPackage, appWaitActivity);
|
|
442
427
|
} else {
|
|
443
428
|
await this.adb.startApp({
|
|
@@ -459,7 +444,7 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
459
444
|
}
|
|
460
445
|
|
|
461
446
|
async deleteSession() {
|
|
462
|
-
|
|
447
|
+
this.log.debug('Deleting UiAutomator2 session');
|
|
463
448
|
|
|
464
449
|
try {
|
|
465
450
|
if (!_lodash.default.isEmpty(this._screenRecordingProperties)) {
|
|
@@ -474,14 +459,14 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
474
459
|
try {
|
|
475
460
|
await this.stopChromedriverProxies();
|
|
476
461
|
} catch (err) {
|
|
477
|
-
|
|
462
|
+
this.log.warn(`Unable to stop ChromeDriver proxies: ${err.message}`);
|
|
478
463
|
}
|
|
479
464
|
|
|
480
465
|
if (this.jwpProxyActive) {
|
|
481
466
|
try {
|
|
482
467
|
await this.uiautomator2.deleteSession();
|
|
483
468
|
} catch (err) {
|
|
484
|
-
|
|
469
|
+
this.log.warn(`Unable to proxy deleteSession to UiAutomator2: ${err.message}`);
|
|
485
470
|
}
|
|
486
471
|
}
|
|
487
472
|
|
|
@@ -492,52 +477,49 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
492
477
|
|
|
493
478
|
if (this.adb) {
|
|
494
479
|
if (this.opts.unicodeKeyboard && this.opts.resetKeyboard && this.defaultIME) {
|
|
495
|
-
|
|
480
|
+
this.log.debug(`Resetting IME to '${this.defaultIME}'`);
|
|
496
481
|
|
|
497
482
|
try {
|
|
498
483
|
await this.adb.setIME(this.defaultIME);
|
|
499
484
|
} catch (err) {
|
|
500
|
-
|
|
485
|
+
this.log.warn(`Unable to reset IME: ${err.message}`);
|
|
501
486
|
}
|
|
502
487
|
}
|
|
503
488
|
|
|
504
489
|
if (this.caps.androidCoverage) {
|
|
505
|
-
|
|
506
|
-
|
|
490
|
+
this.log.info('Shutting down the adb process of instrumentation...');
|
|
507
491
|
await this.adb.endAndroidCoverage();
|
|
508
492
|
|
|
509
493
|
if (this.caps.androidCoverageEndIntent) {
|
|
510
|
-
|
|
511
|
-
|
|
494
|
+
this.log.info(`Sending intent broadcast '${this.caps.androidCoverageEndIntent}' at the end of instrumenting.`);
|
|
512
495
|
await this.adb.broadcast(this.caps.androidCoverageEndIntent);
|
|
513
496
|
} else {
|
|
514
|
-
|
|
497
|
+
this.log.warn('No androidCoverageEndIntent is configured in caps. Possibly you cannot get coverage file.');
|
|
515
498
|
}
|
|
516
499
|
}
|
|
517
500
|
|
|
518
501
|
if (this.opts.appPackage) {
|
|
519
|
-
if (!this.isChromeSession && !this.opts.dontStopAppOnReset) {
|
|
502
|
+
if (!this.isChromeSession && !this.opts.dontStopAppOnReset && !this.opts.noReset) {
|
|
520
503
|
try {
|
|
521
504
|
await this.adb.forceStop(this.opts.appPackage);
|
|
522
505
|
} catch (err) {
|
|
523
|
-
|
|
506
|
+
this.log.warn(`Unable to force stop app: ${err.message}`);
|
|
524
507
|
}
|
|
525
508
|
}
|
|
526
509
|
|
|
527
510
|
if (this.opts.fullReset && !this.opts.skipUninstall) {
|
|
528
|
-
|
|
511
|
+
this.log.debug(`Capability 'fullReset' set to 'true', Uninstalling '${this.opts.appPackage}'`);
|
|
529
512
|
|
|
530
513
|
try {
|
|
531
514
|
await this.adb.uninstallApk(this.opts.appPackage);
|
|
532
515
|
} catch (err) {
|
|
533
|
-
|
|
516
|
+
this.log.warn(`Unable to uninstall app: ${err.message}`);
|
|
534
517
|
}
|
|
535
518
|
}
|
|
536
519
|
}
|
|
537
520
|
|
|
538
521
|
if (this._wasWindowAnimationDisabled) {
|
|
539
|
-
|
|
540
|
-
|
|
522
|
+
this.log.info('Restoring window animation state');
|
|
541
523
|
await this.adb.setAnimationState(true);
|
|
542
524
|
}
|
|
543
525
|
|
|
@@ -546,37 +528,34 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
546
528
|
try {
|
|
547
529
|
await this.releaseSystemPort();
|
|
548
530
|
} catch (error) {
|
|
549
|
-
|
|
531
|
+
this.log.warn(`Unable to remove system port forward: ${error.message}`);
|
|
550
532
|
}
|
|
551
533
|
|
|
552
534
|
try {
|
|
553
535
|
await this.releaseMjpegServerPort();
|
|
554
536
|
} catch (error) {
|
|
555
|
-
|
|
537
|
+
this.log.warn(`Unable to remove MJPEG server port forward: ${error.message}`);
|
|
556
538
|
}
|
|
557
539
|
|
|
558
540
|
if ((await this.adb.getApiLevel()) >= 28) {
|
|
559
|
-
|
|
560
|
-
|
|
541
|
+
this.log.info('Restoring hidden api policy to the device default configuration');
|
|
561
542
|
await this.adb.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError);
|
|
562
543
|
}
|
|
563
544
|
|
|
564
545
|
if (this.opts.reboot) {
|
|
565
546
|
let avdName = this.opts.avd.replace('@', '');
|
|
566
|
-
|
|
567
|
-
_logger.default.debug(`Closing emulator '${avdName}'`);
|
|
547
|
+
this.log.debug(`Closing emulator '${avdName}'`);
|
|
568
548
|
|
|
569
549
|
try {
|
|
570
550
|
await this.adb.killEmulator(avdName);
|
|
571
551
|
} catch (err) {
|
|
572
|
-
|
|
552
|
+
this.log.warn(`Unable to close emulator: ${err.message}`);
|
|
573
553
|
}
|
|
574
554
|
}
|
|
575
555
|
}
|
|
576
556
|
|
|
577
557
|
if (this.mjpegStream) {
|
|
578
|
-
|
|
579
|
-
|
|
558
|
+
this.log.info('Closing MJPEG stream');
|
|
580
559
|
this.mjpegStream.stop();
|
|
581
560
|
}
|
|
582
561
|
|
|
@@ -584,10 +563,10 @@ class AndroidUiautomator2Driver extends _baseDriver.BaseDriver {
|
|
|
584
563
|
}
|
|
585
564
|
|
|
586
565
|
async checkAppPresent() {
|
|
587
|
-
|
|
566
|
+
this.log.debug('Checking whether app is actually present');
|
|
588
567
|
|
|
589
568
|
if (!(await _support.fs.exists(this.opts.app))) {
|
|
590
|
-
|
|
569
|
+
this.log.errorAndThrow(`Could not find app apk at '${this.opts.app}'`);
|
|
591
570
|
}
|
|
592
571
|
}
|
|
593
572
|
|
|
@@ -646,4 +625,4 @@ var _default = AndroidUiautomator2Driver;
|
|
|
646
625
|
exports.default = _default;require('source-map-support').install();
|
|
647
626
|
|
|
648
627
|
|
|
649
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsIk9iamVjdCIsImFzc2lnbiIsInVpYXV0b21hdG9yMkhlbHBlcnMiLCJhbmRyb2lkSGVscGVycyIsIkRFVklDRV9QT1JUX1JBTkdFIiwiREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwicGF0aCIsInJlc29sdmUiLCJvcyIsInRtcGRpciIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsIkRFVklDRV9QT1JUIiwiTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUIiwiTE9DQUxIT1NUX0lQNCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiTUVNT0laRURfRlVOQ1RJT05TIiwiQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJzaGVsbCIsImxvY2F0b3JTdHJhdGVnaWVzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwidWlhdXRvbWF0b3IyIiwiandwUHJveHlBY3RpdmUiLCJkZWZhdWx0SU1FIiwiandwUHJveHlBdm9pZCIsImFwa1N0cmluZ3MiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsImFsbG93SW52aXNpYmxlRWxlbWVudHMiLCJvblNldHRpbmdzVXBkYXRlIiwiYmluZCIsImNocm9tZWRyaXZlciIsInNlc3Npb25DaHJvbWVkcml2ZXJzIiwiZm4iLCJfIiwibWVtb2l6ZSIsInZhbGlkYXRlRGVzaXJlZENhcHMiLCJjYXBzIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJzZXJ2ZXJEZXRhaWxzIiwicGxhdGZvcm0iLCJ3ZWJTdG9yYWdlRW5hYmxlZCIsInRha2VzU2NyZWVuc2hvdCIsImphdmFzY3JpcHRFbmFibGVkIiwiZGF0YWJhc2VFbmFibGVkIiwibmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkIiwibG9jYXRpb25Db250ZXh0RW5hYmxlZCIsIndhcm5pbmdzIiwiZGVzaXJlZCIsImN1ckNvbnRleHQiLCJkZWZhdWx0Q29udGV4dE5hbWUiLCJkZWZhdWx0T3B0cyIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImFuZHJvaWRJbnN0YWxsVGltZW91dCIsImRlZmF1bHRzIiwiaXNDaHJvbWVTZXNzaW9uIiwibG9nZ2VyIiwiaW5mbyIsInBrZyIsImFjdGl2aXR5IiwiZ2V0Q2hyb21lUGtnIiwiYnJvd3Nlck5hbWUiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwiYXBwIiwiY29uZmlndXJlQXBwIiwiQVBLX0VYVEVOU0lPTiIsIkFQS1NfRVhURU5TSU9OIiwiY2hlY2tBcHBQcmVzZW50Iiwic3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uIiwiZmlsbERldmljZURldGFpbHMiLCJtanBlZ1NjcmVlbnNob3RVcmwiLCJtanBlZ1N0cmVhbSIsIm1qcGVnIiwiTUpwZWdTdHJlYW0iLCJzdGFydCIsImUiLCJkZWxldGVTZXNzaW9uIiwicGl4ZWxSYXRpbyIsImdldERldmljZVBpeGVsUmF0aW8iLCJzdGF0QmFySGVpZ2h0IiwiZ2V0U3RhdHVzQmFySGVpZ2h0Iiwidmlld3BvcnRSZWN0IiwiZ2V0Vmlld1BvcnRSZWN0IiwiZHJpdmVyRGF0YSIsImdldFNlc3Npb24iLCJzZXNzaW9uRGF0YSIsImRlYnVnIiwidWlhMkRhdGEiLCJqd3Byb3h5IiwiY29tbWFuZCIsImlzRW11bGF0b3IiLCJhZGIiLCJhdmQiLCJkZXZpY2VOYW1lIiwiZXJyb3JBbmRUaHJvdyIsInBsYXRmb3JtVmVyc2lvbiIsImF2ZERldmljZSIsInJlcGxhY2UiLCJhbGxvY2F0ZVN5c3RlbVBvcnQiLCJmb3J3YXJkUG9ydCIsImxvY2FsUG9ydCIsInN5c3RlbVBvcnQiLCJfaGFzU3lzdGVtUG9ydEluQ2FwcyIsInN0YXJ0UG9ydCIsImVuZFBvcnQiLCJyZWxlYXNlU3lzdGVtUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQiLCJtanBlZ1NlcnZlclBvcnQiLCJyZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0IiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImNyZWF0ZUFEQiIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsImhhc1ZhbHVlIiwiZ3BzRW5hYmxlZCIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJ3YXJuIiwiYXBwSW5mbyIsImdldExhdW5jaEluZm8iLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJpbml0RGV2aWNlIiwiaW5pdFVpQXV0b21hdG9yMlNlcnZlciIsImRpc2FibGVXaW5kb3dBbmltYXRpb24iLCJpc0FuaW1hdGlvbk9uIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJfd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQiLCJpbml0QVVUIiwic3RhcnRTZXNzaW9uIiwiYWRkRGV2aWNlSW5mb1RvQ2FwcyIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJzdGFydENocm9tZVNlc3Npb24iLCJlbnN1cmVBcHBTdGFydHMiLCJvcmllbnRhdGlvbiIsInNldE9yaWVudGF0aW9uIiwiYXV0b1dlYnZpZXciLCJ2aWV3TmFtZSIsImRlZmF1bHRXZWJ2aWV3TmFtZSIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsInVpYXV0b21hdG9yMk9wdHMiLCJob3N0IiwicmVtb3RlQWRiSG9zdCIsImRldmljZVBvcnQiLCJhcGsiLCJ0bXBEaXIiLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsInJlYWRUaW1lb3V0IiwidWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQiLCJVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJwcm94eVJlcVJlcyIsInByb3h5Q29tbWFuZCIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJpbnN0YWxsU2VydmVyQXBrIiwidWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiU0VSVkVSX1BBQ0tBR0VfSUQiLCJTRVJWRVJfVEVTVF9QQUNLQUdFX0lEIiwic3RkZXJyIiwibWVzc2FnZSIsInVuaW5zdGFsbE90aGVyUGFja2FnZXMiLCJwYXJzZUFycmF5Iiwib3RoZXJBcHBzIiwiQiIsImFsbCIsIm1hcCIsImluc3RhbGxPdGhlckFwa3MiLCJub1Jlc2V0IiwiaXNBcHBJbnN0YWxsZWQiLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJyZXF1aXJlRGVmYXVsdENlcnQiLCJzaWduQXBwIiwic2tpcFVuaW5zdGFsbCIsInVuaW5zdGFsbEFwayIsImluc3RhbGxBcGsiLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwic3RhcnRBcHAiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsImRvbnRTdG9wQXBwT25SZXNldCIsInJldHJ5IiwidXNlciIsInVzZXJQcm9maWxlIiwiaXNFbXB0eSIsIl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzIiwic3RvcFJlY29yZGluZ1NjcmVlbiIsImlnbiIsInJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyIsInNlcnZlciIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInVuaWNvZGVLZXlib2FyZCIsInJlc2V0S2V5Ym9hcmQiLCJzZXRJTUUiLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJicm9hZGNhc3QiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiZXJyb3IiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInN0b3AiLCJmcyIsImV4aXN0cyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInJlc3RhcnQiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiY21kIiwidG9QYWlycyIsImFuZHJvaWRDb21tYW5kcyIsInByb3RvdHlwZSIsImNvbW1hbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLE9BQU8sR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQkMsZ0JBQWxCLEVBQXVDQyxtQ0FBdkMsQ0FBaEI7QUFJQSxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLElBQUQsRUFBTyxJQUFQLENB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QVgsQ0FBVCxDQTdCZSxFQThCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsdUNBQVgsQ0FBVCxDQTlCZSxFQStCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsc0RBQVgsQ0FBVCxDQS9CZSxFQWdDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsb0RBQVgsQ0FBVCxDQWhDZSxFQWlDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNENBQVgsQ0FBVCxDQWpDZSxFQWtDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBVCxDQWxDZSxFQW1DZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQW5DZSxFQW9DZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsaUNBQVgsQ0FBVCxDQXBDZSxFQXFDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsdUNBQVgsQ0FBVCxDQXJDZSxFQXNDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsK0NBQVgsQ0FBVCxDQXRDZSxFQXVDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQXZDZSxFQXdDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsZ0NBQVgsQ0FBVCxDQXhDZSxFQXlDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBVCxDQXpDZSxFQTBDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBVCxDQTFDZSxFQTJDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkJBQVgsQ0FBVCxDQTNDZSxFQTRDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsc0JBQVgsQ0FBVCxDQTVDZSxFQTZDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMEJBQVgsQ0FBVCxDQTdDZSxFQThDZixDQUFDLE1BQUQsRUFBUyxJ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R0QsS0FBSyxJQUFJLENBQUNrTyxHQUFELEVBQU1sTyxFQUFOLENBQVQsSUFBc0JDLGdCQUFFa08sT0FBRixDQUFVRyxjQUFWLENBQXRCLEVBQTJDO0FBQ3pDM1AsRUFBQUEseUJBQXlCLENBQUMwUCxTQUExQixDQUFvQ0gsR0FBcEMsSUFBMkNsTyxFQUEzQztBQUNEOztlQUdjckIseUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmFzZURyaXZlciwgRGV2aWNlU2V0dGluZ3MgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7XG4gIFVpQXV0b21hdG9yMlNlcnZlciwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSURcbn0gZnJvbSAnLi91aWF1dG9tYXRvcjInO1xuaW1wb3J0IHsgZnMsIHV0aWwsIG1qcGVnIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzL2luZGV4JztcbmltcG9ydCB7IERFRkFVTFRfQURCX1BPUlQgfSBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB1aWF1dG9tYXRvcjJIZWxwZXJzIGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge1xuICBhbmRyb2lkSGVscGVycywgYW5kcm9pZENvbW1hbmRzLCBTRVRUSU5HU19IRUxQRVJfUEtHX0lEXG59IGZyb20gJ2FwcGl1bS1hbmRyb2lkLWRyaXZlcic7XG5pbXBvcnQgZGVzaXJlZENhcENvbnN0cmFpbnRzIGZyb20gJy4vZGVzaXJlZC1jYXBzJztcbmltcG9ydCB7IGZpbmRBUG9ydE5vdEluVXNlLCBjaGVja1BvcnRTdGF0dXMgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTiB9IGZyb20gJy4vZXh0ZW5zaW9ucyc7XG5cblxuY29uc3QgaGVscGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHVpYXV0b21hdG9yMkhlbHBlcnMsIGFuZHJvaWRIZWxwZXJzKTtcblxuLy8gVGhlIHJhbmdlIG9mIHBvcnRzIHdlIGNhbiB1c2Ugb24gdGhlIHN5c3RlbSBmb3IgY29tbXVuaWNhdGluZyB0byB0aGVcbi8vIFVpQXV0b21hdG9yMiBIVFRQIHNlcnZlciBvbiB0aGUgZGV2aWNlXG5jb25zdCBERVZJQ0VfUE9SVF9SQU5HRSA9IFs4MjAwLCA4Mjk5XTtcblxuLy8gVGhlIGd1YXJkIGlzIG5lZWRlZCB0byBhdm9pZCBkeW5hbWljIHN5c3RlbSBwb3J0IGFsbG9jYXRpb24gY29uZmxpY3RzIGZvclxuLy8gcGFyYWxsZWwgZHJpdmVyIHNlc3Npb25zXG5jb25zdCBERVZJQ0VfUE9SVF9BTExPQ0FUSU9OX0dVQVJEID0gdXRpbC5nZXRMb2NrRmlsZUd1YXJkKFxuICBwYXRoLnJlc29sdmUob3MudG1wZGlyKCksICd1aWEyX2RldmljZV9wb3J0X2d1YXJkJyksXG4gIHt0aW1lb3V0OiAyNSwgdHJ5UmVjb3Zlcnk6IHRydWV9XG4pO1xuXG4vLyBUaGlzIGlzIHRoZSBwb3J0IHRoYXQgVWlBdXRvbWF0b3IyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS4gV2Ugd2lsbCBmb3J3YXJkXG4vLyBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZSBkZXZpY2UuXG5jb25zdCBERVZJQ0VfUE9SVCA9IDY3OTA7XG4vLyBUaGlzIGlzIHRoZSBwb3J0IHRoYXQgdGhlIFVpQXV0b21hdG9yMiBNSlBFRyBzZXJ2ZXIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLlxuLy8gV2Ugd2lsbCBmb3J3YXJkIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlXG4vLyBkZXZpY2UuXG5jb25zdCBNSlBFR19TRVJWRVJfREVWSUNFX1BPUlQgPSA3ODEwO1xuXG5jb25zdCBMT0NBTEhPU1RfSVA0ID0gJzEyNy4wLjAuMSc7XG5cbi8vIE5PX1BST1hZIGNvbnRhaW5zIHRoZSBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gVWlBdXRvbWF0b3IyIHNlcnZlci5cbi8vIFRPRE86ICBBZGQgdGhlIGxpc3Qgb2YgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIFVpQXV0b21hdG9yMiBzZXJ2ZXIuXG4vLyBUT0RPOiBOZWVkIHRvIHNlZ3JlZ2F0ZSB0aGUgcGF0aHMgYmV0dGVyIHdheSB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zIHdoZXJldmVyIGFwcGxpY2FibGUuXG4vLyAoTm90IHNlZ3JlZ2F0aW5nIHJpZ2h0IGF3YXkgYmVjYXVzZSBtb3JlIHBhdGhzIHRvIGJlIGFkZGVkIGluIHRoZSBOT19QUk9YWSBsaXN0KVxuY29uc3QgTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uLyg/IS4qLyknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0X1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydC9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL2N1cnJlbnRfYWN0aXZpdHknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9bXi9dKy9jdXJyZW50X3BhY2thZ2UnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zZXR0aW5ncycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvYXR0cmlidXRlJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2Rpc3BsYXllZCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9lbmFibGVkJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2xvY2F0aW9uX2luX3ZpZXcnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvbmFtZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9zY3JlZW5zaG90JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3NlbGVjdGVkJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvY2F0aW9uJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9bXi9dK19hbGVydCQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hY3Rpb25zJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnQvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHAvW14vXScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9bXi9dKy9zdGFydF9hY3Rpdml0eScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vY29tcGFyZV9pbWFnZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlLyg/IXNldF9jbGlwYm9hcmQpW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZWxlbWVudC9bXi9dKy9yZXBsYWNlX3ZhbHVlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2VsZW1lbnQvW14vXSsvdmFsdWUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZ2V0UGVyZm9ybWFuY2VEYXRhJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3BlcmZvcm1hbmNlRGF0YS90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zZXR0aW5ncycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9leGVjdXRlX2RyaXZlcicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdGFydF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0b3BfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS8uKmV2ZW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9rZXlzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90aW1lb3V0cycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL211bHRpL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGVfYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cnKV0sXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvd2luZG93L3JlY3QnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL2FzeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cnKV0sXG5dO1xuXG4vLyBUaGlzIGlzIGEgc2V0IG9mIG1ldGhvZHMgYW5kIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBDaHJvbWVkcml2ZXIuXG5jb25zdCBDSFJPTUVfTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9yZWN0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL211bHRpL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIG1vYmlsZTogY29tbWFuZHMgd29ya2luZyBpbiB3ZWIgY29udGV4dFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZSQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJCcpXSxcbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJCcpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJCcpXSxcbl07XG5cbmNvbnN0IE1FTU9JWkVEX0ZVTkNUSU9OUyA9IFtcbiAgJ2dldFN0YXR1c0JhckhlaWdodCcsXG4gICdnZXREZXZpY2VQaXhlbFJhdGlvJyxcbl07XG5cbmNsYXNzIEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIgZXh0ZW5kcyBCYXNlRHJpdmVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIC8vIGBzaGVsbGAgb3ZlcndyaXRlcyBhZGIuc2hlbGwsIHNvIHJlbW92ZVxuICAgIGRlbGV0ZSBvcHRzLnNoZWxsO1xuXG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgICAnY3NzIHNlbGVjdG9yJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5kZWZhdWx0SU1FID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTsgLy8gbWFwIG9mIGxhbmd1YWdlIC0+IHN0cmluZ3Mgb2JqXG5cbiAgICB0aGlzLnNldHRpbmdzID0gbmV3IERldmljZVNldHRpbmdzKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiBmYWxzZSwgYWxsb3dJbnZpc2libGVFbGVtZW50czogZmFsc2V9LFxuICAgICAgICB0aGlzLm9uU2V0dGluZ3NVcGRhdGUuYmluZCh0aGlzKSk7XG4gICAgLy8gaGFuZGxlIHdlYnZpZXcgbWVjaGFuaWNzIGZyb20gQW5kcm9pZERyaXZlclxuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzID0ge307XG5cbiAgICAvLyBtZW1vaXplIGZ1bmN0aW9ucyBoZXJlLCBzbyB0aGF0IHRoZXkgYXJlIGRvbmUgb24gYSBwZXItaW5zdGFuY2UgYmFzaXNcbiAgICBmb3IgKGNvbnN0IGZuIG9mIE1FTU9JWkVEX0ZVTkNUSU9OUykge1xuICAgICAgdGhpc1tmbl0gPSBfLm1lbW9pemUodGhpc1tmbl0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlRGVzaXJlZENhcHMgKGNhcHMpIHtcbiAgICByZXR1cm4gc3VwZXIudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKSAmJiBhbmRyb2lkSGVscGVycy52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbiAoLi4uYXJncykge1xuICAgIHRyeSB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBvdGhlclNlc3Npb25EYXRhIGZvciBtdWx0aXBsZSBzZXNzaW9uc1xuICAgICAgbGV0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgc3VwZXIuY3JlYXRlU2Vzc2lvbiguLi5hcmdzKTtcblxuICAgICAgbGV0IHNlcnZlckRldGFpbHMgPSB7XG4gICAgICAgIHBsYXRmb3JtOiAnTElOVVgnLFxuICAgICAgICB3ZWJTdG9yYWdlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRha2VzU2NyZWVuc2hvdDogdHJ1ZSxcbiAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGRhdGFiYXNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbG9jYXRpb25Db250ZXh0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHdhcm5pbmdzOiB7fSxcbiAgICAgICAgZGVzaXJlZDogdGhpcy5jYXBzLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5jYXBzID0gT2JqZWN0LmFzc2lnbihzZXJ2ZXJEZXRhaWxzLCB0aGlzLmNhcHMpO1xuXG4gICAgICB0aGlzLmN1ckNvbnRleHQgPSB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xuXG4gICAgICBsZXQgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgIGZ1bGxSZXNldDogZmFsc2UsXG4gICAgICAgIGF1dG9MYXVuY2g6IHRydWUsXG4gICAgICAgIGFkYlBvcnQ6IERFRkFVTFRfQURCX1BPUlQsXG4gICAgICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dDogOTAwMDBcbiAgICAgIH07XG4gICAgICBfLmRlZmF1bHRzKHRoaXMub3B0cywgZGVmYXVsdE9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJXZSdyZSBnb2luZyB0byBydW4gYSBDaHJvbWUtYmFzZWQgc2Vzc2lvblwiKTtcbiAgICAgICAgbGV0IHtwa2csIGFjdGl2aXR5fSA9IGhlbHBlcnMuZ2V0Q2hyb21lUGtnKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gICAgICAgIHRoaXMub3B0cy5hcHBQYWNrYWdlID0gdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBwa2c7XG4gICAgICAgIHRoaXMub3B0cy5hcHBBY3Rpdml0eSA9IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICAgICAgICBsb2dnZXIuaW5mbyhgQ2hyb21lLXR5cGUgcGFja2FnZSBhbmQgYWN0aXZpdHkgYXJlICR7cGtnfSBhbmQgJHthY3Rpdml0eX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgdGhpcy5zZXRBdmRGcm9tQ2FwYWJpbGl0aWVzKGNhcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIFtBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTl0pO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwUHJlc2VudCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICAvLyB0aGUgYXBwIGlzbid0IGFuIGFjdHVhbCBhcHAgZmlsZSBidXQgcmF0aGVyIHNvbWV0aGluZyB3ZSB3YW50IHRvXG4gICAgICAgIC8vIGFzc3VtZSBpcyBvbiB0aGUgZGV2aWNlIGFuZCBqdXN0IGxhdW5jaCB2aWEgdGhlIGFwcFBhY2thZ2VcbiAgICAgICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgZGlyZWN0bHkgb24gdGhlIGRldmljZWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYE5laXRoZXIgJ2FwcCcgbm9yICdhcHBQYWNrYWdlJyB3YXMgc2V0LiBTdGFydGluZyBVaUF1dG9tYXRvcjIgYCArXG4gICAgICAgICAgJ3dpdGhvdXQgdGhlIHRhcmdldCBhcHBsaWNhdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbigpO1xuICAgICAgYXdhaXQgdGhpcy5maWxsRGV2aWNlRGV0YWlscygpO1xuICAgICAgaWYgKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nIE1KUEVHIHN0cmVhbSByZWFkaW5nIFVSTDogJyR7dGhpcy5vcHRzLm1qcGVnU2NyZWVuc2hvdFVybH0nYCk7XG4gICAgICAgIHRoaXMubWpwZWdTdHJlYW0gPSBuZXcgbWpwZWcuTUpwZWdTdHJlYW0odGhpcy5vcHRzLm1qcGVnU2NyZWVuc2hvdFVybCk7XG4gICAgICAgIGF3YWl0IHRoaXMubWpwZWdTdHJlYW0uc3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCB0aGlzLmNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmaWxsRGV2aWNlRGV0YWlscyAoKSB7XG4gICAgdGhpcy5jYXBzLnBpeGVsUmF0aW8gPSBhd2FpdCB0aGlzLmdldERldmljZVBpeGVsUmF0aW8oKTtcbiAgICB0aGlzLmNhcHMuc3RhdEJhckhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzQmFySGVpZ2h0KCk7XG4gICAgdGhpcy5jYXBzLnZpZXdwb3J0UmVjdCA9IGF3YWl0IHRoaXMuZ2V0Vmlld1BvcnRSZWN0KCk7XG4gIH1cblxuICBnZXQgZHJpdmVyRGF0YSAoKSB7XG4gICAgLy8gVE9ETyBmaWxsIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBhc3luYyBnZXRTZXNzaW9uICgpIHtcbiAgICBsZXQgc2Vzc2lvbkRhdGEgPSBhd2FpdCBzdXBlci5nZXRTZXNzaW9uKCk7XG4gICAgbG9nZ2VyLmRlYnVnKCdHZXR0aW5nIHNlc3Npb24gZGV0YWlscyBmcm9tIHNlcnZlciB0byBtaXggaW4nKTtcbiAgICBsZXQgdWlhMkRhdGEgPSBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy8nLCAnR0VUJywge30pO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzZXNzaW9uRGF0YSwgdWlhMkRhdGEpO1xuICB9XG5cbiAgaXNFbXVsYXRvciAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNFbXVsYXRvcih0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgfVxuXG4gIHNldEF2ZEZyb21DYXBhYmlsaXRpZXMgKGNhcHMpIHtcbiAgICBpZiAodGhpcy5vcHRzLmF2ZCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KCdhdmQgb3IgZGV2aWNlTmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNhcHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KCdhdmQgb3IgcGxhdGZvcm1WZXJzaW9uIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZWQnKTtcbiAgICAgIH1cbiAgICAgIGxldCBhdmREZXZpY2UgPSBjYXBzLmRldmljZU5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfLl0vZywgJy0nKTtcbiAgICAgIHRoaXMub3B0cy5hdmQgPSBgJHthdmREZXZpY2V9X18ke2NhcHMucGxhdGZvcm1WZXJzaW9ufWA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWxsb2NhdGVTeXN0ZW1Qb3J0ICgpIHtcbiAgICBjb25zdCBmb3J3YXJkUG9ydCA9IGFzeW5jIChsb2NhbFBvcnQpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRm9yd2FyZGluZyBVaUF1dG9tYXRvcjIgU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gbG9jYWwgcG9ydCAke2xvY2FsUG9ydH1gKTtcbiAgICAgIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKGxvY2FsUG9ydCwgTE9DQUxIT1NUX0lQNCkpID09PSAnb3BlbicpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYFVpQXV0b21hdG9yMiBTZXJ2ZXIgY2Fubm90IHN0YXJ0IGJlY2F1c2UgdGhlIGxvY2FsIHBvcnQgIyR7bG9jYWxQb3J0fSBpcyBidXN5LiBgICtcbiAgICAgICAgICBgTWFrZSBzdXJlIHRoZSBwb3J0IHlvdSBwcm92aWRlIHZpYSAnc3lzdGVtUG9ydCcgY2FwYWJpbGl0eSBpcyBub3Qgb2NjdXBpZWQuIGAgK1xuICAgICAgICAgIGBUaGlzIHNpdHVhdGlvbiBtaWdodCBvZnRlbiBiZSBhIHJlc3VsdCBvZiBhbiBpbmFjY3VyYXRlIHNlc3Npb25zIG1hbmFnZW1lbnQsIGUuZy4gYCArXG4gICAgICAgICAgYG9sZCBhdXRvbWF0aW9uIHNlc3Npb25zIG9uIHRoZSBzYW1lIGRldmljZSBtdXN0IGFsd2F5cyBiZSBjbG9zZWQgYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmVzLmApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQobG9jYWxQb3J0LCBERVZJQ0VfUE9SVCk7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdHMuc3lzdGVtUG9ydCkge1xuICAgICAgdGhpcy5faGFzU3lzdGVtUG9ydEluQ2FwcyA9IHRydWU7XG4gICAgICByZXR1cm4gYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH1cblxuICAgIGF3YWl0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgW3N0YXJ0UG9ydCwgZW5kUG9ydF0gPSBERVZJQ0VfUE9SVF9SQU5HRTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMub3B0cy5zeXN0ZW1Qb3J0ID0gYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2Uoc3RhcnRQb3J0LCBlbmRQb3J0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coXG4gICAgICAgICAgYENhbm5vdCBmaW5kIGFueSBmcmVlIHBvcnQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9fS4gYCArXG4gICAgICAgICAgYFBsZWFzZSBzZXQgdGhlIGF2YWlsYWJsZSBwb3J0IG51bWJlciBieSBwcm92aWRpbmcgdGhlIHN5c3RlbVBvcnQgY2FwYWJpbGl0eSBvciBgICtcbiAgICAgICAgICBgZG91YmxlIGNoZWNrIHRoZSBwcm9jZXNzZXMgdGhhdCBhcmUgbG9ja2luZyBwb3J0cyB3aXRoaW4gdGhpcyByYW5nZSBhbmQgdGVybWluYXRlIGAgK1xuICAgICAgICAgIGB0aGVzZSB3aGljaCBhcmUgbm90IG5lZWRlZCBhbnltb3JlYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBmb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWxlYXNlU3lzdGVtUG9ydCAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuc3lzdGVtUG9ydCB8fCAhdGhpcy5hZGIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faGFzU3lzdGVtUG9ydEluQ2Fwcykge1xuICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBERVZJQ0VfUE9SVF9BTExPQ0FUSU9OX0dVQVJEKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQgKCkge1xuICAgIGlmICh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydCh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0LCBNSlBFR19TRVJWRVJfREVWSUNFX1BPUlQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VNanBlZ1NlcnZlclBvcnQgKCkge1xuICAgIGlmICh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFVpQXV0b21hdG9yMlNlc3Npb24gKCkge1xuICAgIC8vIGdldCBkZXZpY2UgdWRpZCBmb3IgdGhpcyBzZXNzaW9uXG4gICAgbGV0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICB0aGlzLm9wdHMudWRpZCA9IHVkaWQ7XG4gICAgdGhpcy5vcHRzLmVtUG9ydCA9IGVtUG9ydDtcblxuICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgb3VyIGphdmEgdmVyc2lvbiBhbmQgZGV2aWNlIGluZm8sIHdlIGNhbiBjcmVhdGUgb3VyXG4gICAgLy8gQURCIGluc3RhbmNlXG4gICAgdGhpcy5hZGIgPSBhd2FpdCBhbmRyb2lkSGVscGVycy5jcmVhdGVBREIodGhpcy5vcHRzKTtcblxuICAgIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcblxuICAgIGlmIChhcGlMZXZlbCA8IDIxKSB7XG4gICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnVUlBdXRvbWF0b3IyIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFuZHJvaWQgNS4wIChMb2xsaXBvcCkuICcgK1xuICAgICAgICAnWW91IGNvdWxkIHN0aWxsIHVzZSBvdGhlciBzdXBwb3J0ZWQgYmFja2VuZHMgaW4gb3JkZXIgdG8gYXV0b21hdGUgb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAoYXBpTGV2ZWwgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICBsb2dnZXIuaW5mbygnUmVsYXhpbmcgaGlkZGVuIGFwaSBwb2xpY3knKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEhpZGRlbkFwaVBvbGljeSgnMScsICEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRvIGVuYWJsZS9kaXNhYmxlIGdwcyBiZWZvcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb25cbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMuZ3BzRW5hYmxlZCkpIHtcbiAgICAgIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvICR7dGhpcy5vcHRzLmdwc0VuYWJsZWQgPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ30gZ3BzIGxvY2F0aW9uIHByb3ZpZGVyYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIodGhpcy5vcHRzLmdwc0VuYWJsZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFNvcnJ5ISAnZ3BzRW5hYmxlZCcgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBjb25zdCBhcHBJbmZvID0gYXdhaXQgaGVscGVycy5nZXRMYXVuY2hJbmZvKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIC8vIGFuZCBnZXQgaXQgb250byBvdXIgJ29wdHMnIG9iamVjdCBzbyB3ZSB1c2UgaXQgZnJvbSBub3cgb25cbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0cywgYXBwSW5mbyB8fCB7fSk7XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkLCBwbGF0Zm9ybSB2ZXJzaW9uLCBzY3JlZW4gc2l6ZSwgc2NyZWVuIGRlbnNpdHksIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlsc1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICB0aGlzLmRlZmF1bHRJTUUgPSBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgVWlBdXRvbWF0b3IyIHBvcnRcbiAgICAvLyBUaGlzIGNhbGwgbXV0YXRlcyB0aGlzLm9wdHMuc3lzdGVtUG9ydCBpZiBpdCBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIFVpQXV0b21hdG9yMiBNSlBFRyBzZXJ2ZXIgcG9ydCAoaWZcbiAgICAvLyBhcHBsaWNhYmxlKVxuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgVWlBdXRvbWF0b3IyIHNlcnZlciBldGNcbiAgICBhd2FpdCB0aGlzLmluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIoKTtcblxuICAgIC8vIFNob3VsZCBiZSBhZnRlciBpbnN0YWxsaW5nIGlvLmFwcGl1bS5zZXR0aW5ncyBpbiBoZWxwZXJzLmluaXREZXZpY2VcbiAgICBpZiAodGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24gJiYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyNikpIHsgLy8gQVBJIGxldmVsIDI2IGlzIEFuZHJvaWQgOC4wLlxuICAgICAgLy8gR3JhbnRpbmcgYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9BTklNQVRJT05fU0NBTEUgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBhbmltYXRpb25zIHVuZGVyIEFQSSBsZXZlbCAyNlxuICAgICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9wdWxsLzExNjQwI2lzc3VlY29tbWVudC00MzgyNjA0NzdcbiAgICAgIC8vIGAtLW5vLXdpbmRvdy1hbmltYXRpb25gIHdvcmtzIG92ZXIgQW5kcm9pZCA4IHRvIGRpc2FibGUgYWxsIG9mIGFuaW1hdGlvbnNcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0Rpc2FibGluZyBhbmltYXRpb24gdmlhIGlvLmFwcGl1bS5zZXR0aW5ncycpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdXaW5kb3cgYW5pbWF0aW9uIGlzIGFscmVhZHkgZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvLyBBZGRpbmcgQVVUIHBhY2thZ2UgbmFtZSBpbiB0aGUgY2FwYWJpbGl0aWVzIGlmIHBhY2thZ2UgbmFtZSBub3QgZXhpc3QgaW4gY2Fwc1xuICAgIGlmICghdGhpcy5jYXBzLmFwcFBhY2thZ2UgJiYgYXBwSW5mbykge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuXG4gICAgLy8gbGF1bmNoIFVpQXV0b21hdG9yMiBhbmQgd2FpdCB0aWxsIGl0cyBvbmxpbmUgYW5kIHdlIGhhdmUgYSBzZXNzaW9uXG4gICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG5cbiAgICBhd2FpdCB0aGlzLmFkZERldmljZUluZm9Ub0NhcHMoKTtcblxuICAgIC8vIFVubG9jayB0aGUgZGV2aWNlIGFmdGVyIHRoZSBzZXNzaW9uIGlzIHN0YXJ0ZWQuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gdW5sb2NrIHRoZSBkZXZpY2UgdG8gcHJlcGFyZSBpdCBmb3IgdGVzdGluZ1xuICAgICAgYXdhaXQgaGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHRoaXMuY2Fwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgJ3NraXBVbmxvY2snIGNhcGFiaWxpdHkgc2V0LCBzbyBza2lwcGluZyBkZXZpY2UgdW5sb2NrYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7IC8vIHN0YXJ0IGEgY2hyb21lZHJpdmVyIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmF1dG9MYXVuY2ggJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwU3RhcnRzKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGluaXRpYWwgb3JpZW50YXRpb24gaXMgcmVxdWVzdGVkLCBzZXQgaXRcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMub3JpZW50YXRpb24pKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFNldHRpbmcgaW5pdGlhbCBvcmllbnRhdGlvbiB0byAnJHt0aGlzLm9wdHMub3JpZW50YXRpb259J2ApO1xuICAgICAgYXdhaXQgdGhpcy5zZXRPcmllbnRhdGlvbih0aGlzLm9wdHMub3JpZW50YXRpb24pO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gaW1tZWRpYXRlbHkgZ2V0IGludG8gYSB3ZWJ2aWV3LCBzZXQgb3VyIGNvbnRleHRcbiAgICAvLyBhcHByb3ByaWF0ZWx5XG4gICAgaWYgKHRoaXMub3B0cy5hdXRvV2Vidmlldykge1xuICAgICAgY29uc3Qgdmlld05hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICAgICAgY29uc3QgdGltZW91dCA9IHRoaXMub3B0cy5hdXRvV2Vidmlld1RpbWVvdXQgfHwgMjAwMDtcbiAgICAgIGxvZ2dlci5pbmZvKGBTZXR0aW5nIGF1dG8gd2VidmlldyB0byBjb250ZXh0ICcke3ZpZXdOYW1lfScgd2l0aCB0aW1lb3V0ICR7dGltZW91dH1tc2ApO1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIHRoaXMuc2V0Q29udGV4dC5iaW5kKHRoaXMpLCB2aWV3TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gbm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHR1cm4gb24gcHJveHlpbmcgc28gYWxsXG4gICAgLy8gc3Vic2VxdWVudCBzZXNzaW9uIHJlcXVlc3RzIGdvIHN0cmFpZ2h0IHRvL2Zyb20gdWlhdXRvbWF0b3IyXG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG4gIH1cblxuICBhc3luYyBhZGREZXZpY2VJbmZvVG9DYXBzICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgICAgbWFudWZhY3R1cmVyLFxuICAgICAgbW9kZWwsXG4gICAgICByZWFsRGlzcGxheVNpemUsXG4gICAgICBkaXNwbGF5RGVuc2l0eSxcbiAgICB9ID0gYXdhaXQgdGhpcy5tb2JpbGVHZXREZXZpY2VJbmZvKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZUFwaUxldmVsID0gcGFyc2VJbnQoYXBpVmVyc2lvbiwgMTApO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBwbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlblNpemUgPSByZWFsRGlzcGxheVNpemU7XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlbkRlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyO1xuICB9XG5cbiAgYXN5bmMgaW5pdFVpQXV0b21hdG9yMlNlcnZlciAoKSB7XG4gICAgLy8gYnJva2VuIG91dCBmb3IgcmVhZGFiaWxpdHlcbiAgICBjb25zdCB1aWF1dG9tYXRvcjJPcHRzID0ge1xuICAgICAgaG9zdDogdGhpcy5vcHRzLnJlbW90ZUFkYkhvc3QgfHwgdGhpcy5vcHRzLmhvc3QgfHwgTE9DQUxIT1NUX0lQNCxcbiAgICAgIHN5c3RlbVBvcnQ6IHRoaXMub3B0cy5zeXN0ZW1Qb3J0LFxuICAgICAgZGV2aWNlUG9ydDogREVWSUNFX1BPUlQsXG4gICAgICBhZGI6IHRoaXMuYWRiLFxuICAgICAgYXBrOiB0aGlzLm9wdHMuYXBwLFxuICAgICAgdG1wRGlyOiB0aGlzLm9wdHMudG1wRGlyLFxuICAgICAgYXBwUGFja2FnZTogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhcHBBY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbjogISF0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICAgIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB0aGlzLm9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UsXG4gICAgICByZWFkVGltZW91dDogdGhpcy5vcHRzLnVpYXV0b21hdG9yMlNlcnZlclJlYWRUaW1lb3V0LFxuICAgIH07XG4gICAgLy8gbm93IHRoYXQgd2UgaGF2ZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSwgd2UgY2FuIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZlxuICAgIC8vIHVpYXV0b21hdG9yMiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBvcHRpb25zXG4gICAgdGhpcy51aWF1dG9tYXRvcjIgPSBuZXcgVWlBdXRvbWF0b3IyU2VydmVyKHVpYXV0b21hdG9yMk9wdHMpO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eVJlcVJlcy5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMudWlhdXRvbWF0b3IyLnByb3h5Q29tbWFuZC5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcblxuICAgIGlmICh0aGlzLm9wdHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbikge1xuICAgICAgbG9nZ2VyLmluZm8oYCdza2lwU2VydmVySW5zdGFsbGF0aW9uJyBpcyBzZXQuIFNraXBwaW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgaW5zdGFsbGF0aW9uLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5pbnN0YWxsU2VydmVyQXBrKHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QoXG4gICAgICAgICAgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFVVCAoKSB7XG4gICAgLy8gVW5pbnN0YWxsIGFueSB1bmluc3RhbGxPdGhlclBhY2thZ2VzIHdoaWNoIHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCBhbnkgXCJvdGhlckFwcHNcIiB0aGF0IHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLm90aGVyQXBwcykge1xuICAgICAgbGV0IG90aGVyQXBwcztcbiAgICAgIHRyeSB7XG4gICAgICAgIG90aGVyQXBwcyA9IGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMub3RoZXJBcHBzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcIm90aGVyQXBwc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgb3RoZXJBcHBzID0gYXdhaXQgQi5hbGwob3RoZXJBcHBzXG4gICAgICAgIC5tYXAoKGFwcCkgPT4gdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHAsIFtBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTl0pKSk7XG4gICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxPdGhlckFwa3Mob3RoZXJBcHBzLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmICEoYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQodGhpcy5vcHRzLmFwcFBhY2thZ2UpKVxuICAgICAgICAgIHx8ICF0aGlzLm9wdHMubm9SZXNldCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5ub1NpZ24gJiYgIWF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydCh0aGlzLm9wdHMuYXBwLCB0aGlzLm9wdHMuYXBwUGFja2FnZSwge1xuICAgICAgICAgIHJlcXVpcmVEZWZhdWx0Q2VydDogZmFsc2UsXG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgYXdhaXQgaGVscGVycy5zaWduQXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMuYXBwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxBcGsodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ25vUmVzZXQgaGFzIGJlZW4gcmVxdWVzdGVkIGFuZCB0aGUgYXBwIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBEb2luZyBub3RoaW5nJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0KSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KCdGdWxsIHJlc2V0IHJlcXVpcmVzIGFuIGFwcCBjYXBhYmlsaXR5LCB1c2UgZmFzdFJlc2V0IGlmIGFwcCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gYXBwIGNhcGFiaWxpdHkuIEFzc3VtaW5nIGl0IGlzIGFscmVhZHkgb24gdGhlIGRldmljZScpO1xuICAgICAgaWYgKHRoaXMub3B0cy5mYXN0UmVzZXQgJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgICAgYXdhaXQgaGVscGVycy5yZXNldEFwcCh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBlbnN1cmVBcHBTdGFydHMgKCkge1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGFjdGl2aXR5IGFuZCBwYWNrYWdlIHRvIHdhaXQgZm9yXG4gICAgY29uc3QgYXBwV2FpdFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UgfHwgdGhpcy5vcHRzLmFwcFBhY2thZ2U7XG4gICAgY29uc3QgYXBwV2FpdEFjdGl2aXR5ID0gdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSB8fCB0aGlzLm9wdHMuYXBwQWN0aXZpdHk7XG5cbiAgICBsb2dnZXIuaW5mbyhgU3RhcnRpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9LyR7dGhpcy5vcHRzLmFwcEFjdGl2aXR5fSBgICtcbiAgICAgIGBhbmQgd2FpdGluZyBmb3IgJyR7YXBwV2FpdFBhY2thZ2V9LyR7YXBwV2FpdEFjdGl2aXR5fSdgKTtcblxuICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgYW5kcm9pZENvdmVyYWdlIGlzIGNvbmZpZ3VyZWQuIGAgK1xuICAgICAgICBgIFN0YXJ0aW5nIGluc3RydW1lbnRhdGlvbiBvZiAnJHt0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlfScuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmFuZHJvaWRDb3ZlcmFnZSh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlLCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoe1xuICAgICAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgICBhY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgICBhY3Rpb246IHRoaXMub3B0cy5pbnRlbnRBY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiB0aGlzLm9wdHMuaW50ZW50Q2F0ZWdvcnksXG4gICAgICAgIGZsYWdzOiB0aGlzLm9wdHMuaW50ZW50RmxhZ3MsXG4gICAgICAgIHdhaXRQa2c6IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSxcbiAgICAgICAgd2FpdEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5LFxuICAgICAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICAgICAgd2FpdER1cmF0aW9uOiB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uLFxuICAgICAgICBvcHRpb25hbEludGVudEFyZ3VtZW50czogdGhpcy5vcHRzLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgICAgICBzdG9wQXBwOiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCxcbiAgICAgICAgcmV0cnk6IHRydWUsXG4gICAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2Vzc2lvbicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJlY29yZGluZ1NjcmVlbigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGlnbikge31cblxuICAgIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyh0aGlzLnNlcnZlciwgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgYXdhaXQgdGhpcy5tb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nKCk7XG5cbiAgICBpZiAodGhpcy51aWF1dG9tYXRvcjIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcENocm9tZWRyaXZlclByb3hpZXMoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHN0b3AgQ2hyb21lRHJpdmVyIHByb3hpZXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5qd3BQcm94eUFjdGl2ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBwcm94eSBkZWxldGVTZXNzaW9uIHRvIFVpQXV0b21hdG9yMjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy51aWF1dG9tYXRvcjIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5hZGIpIHtcbiAgICAgIGlmICh0aGlzLm9wdHMudW5pY29kZUtleWJvYXJkICYmIHRoaXMub3B0cy5yZXNldEtleWJvYXJkICYmIHRoaXMuZGVmYXVsdElNRSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJyR7dGhpcy5kZWZhdWx0SU1FfSdgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byByZXNldCBJTUU6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdTaHV0dGluZyBkb3duIHRoZSBhZGIgcHJvY2VzcyBvZiBpbnN0cnVtZW50YXRpb24uLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuZW5kQW5kcm9pZENvdmVyYWdlKCk7XG4gICAgICAgIC8vIFVzZSB0aGlzIGJyb2FkY2FzdCBpbnRlbnQgdG8gbm90aWZ5IGl0J3MgdGltZSB0byBkdW1wIGNvdmVyYWdlIHRvIGZpbGVcbiAgICAgICAgaWYgKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgU2VuZGluZyBpbnRlbnQgYnJvYWRjYXN0ICcke3RoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnR9JyBhdCB0aGUgZW5kIG9mIGluc3RydW1lbnRpbmcuYCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0KHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdObyBhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQgaXMgY29uZmlndXJlZCBpbiBjYXBzLiBQb3NzaWJseSB5b3UgY2Fubm90IGdldCBjb3ZlcmFnZSBmaWxlLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ2hyb21lU2Vzc2lvbiAmJiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBmb3JjZSBzdG9wIGFwcDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBDYXBhYmlsaXR5ICdmdWxsUmVzZXQnIHNldCB0byAndHJ1ZScsIFVuaW5zdGFsbGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHVuaW5zdGFsbCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGlzIHZhbHVlIGNhbiBiZSB0cnVlIGlmIHRlc3QgdGFyZ2V0IGRldmljZSBpcyA8PSAyNlxuICAgICAgaWYgKHRoaXMuX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZXN0b3Jpbmcgd2luZG93IGFuaW1hdGlvbiBzdGF0ZScpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZSh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYWRiLnN0b3BMb2djYXQoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVsZWFzZVN5c3RlbVBvcnQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIHN5c3RlbSBwb3J0IGZvcndhcmQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgLy8gSWdub3JlLCB0aGlzIGJsb2NrIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2hlbiB3ZSBmYWxsIGluIGNhdGNoIGJsb2NrXG4gICAgICAgIC8vIGFuZCBiZWZvcmUgZXZlbiBwb3J0IGZvcndhcmQuXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VNanBlZ1NlcnZlclBvcnQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIE1KUEVHIHNlcnZlciBwb3J0IGZvcndhcmQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgLy8gSWdub3JlLCB0aGlzIGJsb2NrIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2hlbiB3ZSBmYWxsIGluIGNhdGNoIGJsb2NrXG4gICAgICAgIC8vIGFuZCBiZWZvcmUgZXZlbiBwb3J0IGZvcndhcmQuXG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7IC8vIEFuZHJvaWQgUFxuICAgICAgICBsb2dnZXIuaW5mbygnUmVzdG9yaW5nIGhpZGRlbiBhcGkgcG9saWN5IHRvIHRoZSBkZXZpY2UgZGVmYXVsdCBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3koISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICBsZXQgYXZkTmFtZSA9IHRoaXMub3B0cy5hdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBjbG9zZSBlbXVsYXRvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5tanBlZ1N0cmVhbSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ0Nsb3NpbmcgTUpQRUcgc3RyZWFtJyk7XG4gICAgICB0aGlzLm1qcGVnU3RyZWFtLnN0b3AoKTtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuICB9XG5cbiAgYXN5bmMgY2hlY2tBcHBQcmVzZW50ICgpIHtcbiAgICBsb2dnZXIuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGZpbmQgYXBwIGFwayBhdCAnJHt0aGlzLm9wdHMuYXBwfSdgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblNldHRpbmdzVXBkYXRlICgpIHtcbiAgICAvLyBpbnRlbnRpb25hbGx5IGRvIG5vdGhpbmcgaGVyZSwgc2luY2UgY29tbWFuZHMudXBkYXRlU2V0dGluZ3MgcHJveGllc1xuICAgIC8vIHNldHRpbmdzIHRvIHRoZSB1aWF1dG8yIHNlcnZlciBhbHJlYWR5XG4gIH1cblxuICAvLyBOZWVkIHRvIG92ZXJyaWRlIGFuZHJvaWQtZHJpdmVyJ3MgdmVyc2lvbiBvZiB0aGlzIHNpbmNlIHdlIGRvbid0IGFjdHVhbGx5XG4gIC8vIGhhdmUgYSBib290c3RyYXA7IGluc3RlYWQgd2UganVzdCByZXN0YXJ0IGFkYiBhbmQgcmUtZm9yd2FyZCB0aGUgVWlBdXRvbWF0b3IyXG4gIC8vIHBvcnRcbiAgYXN5bmMgd3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgKHdyYXBwZWQpIHtcbiAgICBhd2FpdCB3cmFwcGVkKCk7XG4gICAgYXdhaXQgdGhpcy5hZGIucmVzdGFydCgpO1xuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVTeXN0ZW1Qb3J0KCk7XG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZU1qcGVnU2VydmVyUG9ydCgpO1xuICB9XG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLnByb3h5QWN0aXZlKHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBhbHdheXMgaGF2ZSBhbiBhY3RpdmUgcHJveHkgdG8gdGhlIFVpQXV0b21hdG9yMiBzZXJ2ZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNhblByb3h5IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5jYW5Qcm94eShzZXNzaW9uSWQpO1xuXG4gICAgLy8gd2UgY2FuIGFsd2F5cyBwcm94eSB0byB0aGUgdWlhdXRvbWF0b3IyIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG4gICAgLy8gd2UgYXJlIG1haW50YWluaW5nIHR3byBzZXRzIG9mIE5PX1BST1hZIGxpc3RzLCBvbmUgZm9yIGNocm9tZWRyaXZlcihDSFJPTUVfTk9fUFJPWFkpXG4gICAgLy8gYW5kIG9uZSBmb3IgdWlhdXRvbWF0b3IyKE5PX1BST1hZKSwgYmFzZWQgb24gY3VycmVudCBjb250ZXh0IHdpbGwgcmV0dXJuIHJlbGF0ZWQgTk9fUFJPWFkgbGlzdFxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMuY2hyb21lZHJpdmVyKSkge1xuICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyB3ZWJ2aWV3KGNocm9tZWRyaXZlciksIHRoZW4gcmV0dXJuIENIUk9NRV9OT19QUk9YWSBsaXN0XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBDSFJPTUVfTk9fUFJPWFk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IE5PX1BST1hZO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IFsuLi50aGlzLmp3cFByb3h5QXZvaWQsIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV1dO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QXZvaWQ7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxufVxuXG4vLyBmaXJzdCBhZGQgdGhlIGFuZHJvaWQtZHJpdmVyIGNvbW1hbmRzIHdoaWNoIHdlIHdpbGwgZmFsbCBiYWNrIHRvXG5mb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGFuZHJvaWRDb21tYW5kcykpIHtcbiAgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xufVxuXG4vLyB0aGVuIG92ZXJ3cml0ZSB3aXRoIGFueSB1aWF1dG9tYXRvcjItc3BlY2lmaWMgY29tbWFuZHNcbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gIEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIucHJvdG90eXBlW2NtZF0gPSBmbjtcbn1cblxuZXhwb3J0IHsgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciB9O1xuZXhwb3J0IGRlZmF1bHQgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlcjtcbiJdLCJmaWxlIjoibGliL2RyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
628
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsIk9iamVjdCIsImFzc2lnbiIsInVpYXV0b21hdG9yMkhlbHBlcnMiLCJhbmRyb2lkSGVscGVycyIsIkRFVklDRV9QT1JUX1JBTkdFIiwiREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwicGF0aCIsInJlc29sdmUiLCJvcyIsInRtcGRpciIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsIkRFVklDRV9QT1JUIiwiTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUIiwiTE9DQUxIT1NUX0lQNCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiTUVNT0laRURfRlVOQ1RJT05TIiwiQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJzaGVsbCIsImxvY2F0b3JTdHJhdGVnaWVzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwidWlhdXRvbWF0b3IyIiwiandwUHJveHlBY3RpdmUiLCJkZWZhdWx0SU1FIiwiandwUHJveHlBdm9pZCIsImFwa1N0cmluZ3MiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsImFsbG93SW52aXNpYmxlRWxlbWVudHMiLCJvblNldHRpbmdzVXBkYXRlIiwiYmluZCIsImNocm9tZWRyaXZlciIsInNlc3Npb25DaHJvbWVkcml2ZXJzIiwiZm4iLCJfIiwibWVtb2l6ZSIsInZhbGlkYXRlRGVzaXJlZENhcHMiLCJjYXBzIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJzZXJ2ZXJEZXRhaWxzIiwicGxhdGZvcm0iLCJ3ZWJTdG9yYWdlRW5hYmxlZCIsInRha2VzU2NyZWVuc2hvdCIsImphdmFzY3JpcHRFbmFibGVkIiwiZGF0YWJhc2VFbmFibGVkIiwibmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkIiwibG9jYXRpb25Db250ZXh0RW5hYmxlZCIsIndhcm5pbmdzIiwiZGVzaXJlZCIsImN1ckNvbnRleHQiLCJkZWZhdWx0Q29udGV4dE5hbWUiLCJkZWZhdWx0T3B0cyIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImFuZHJvaWRJbnN0YWxsVGltZW91dCIsImRlZmF1bHRzIiwiaXNDaHJvbWVTZXNzaW9uIiwibG9nIiwiaW5mbyIsInBrZyIsImFjdGl2aXR5IiwiZ2V0Q2hyb21lUGtnIiwiYnJvd3Nlck5hbWUiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwiYXBwIiwiY29uZmlndXJlQXBwIiwiQVBLX0VYVEVOU0lPTiIsIkFQS1NfRVhURU5TSU9OIiwiY2hlY2tBcHBQcmVzZW50Iiwic3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uIiwiZmlsbERldmljZURldGFpbHMiLCJtanBlZ1NjcmVlbnNob3RVcmwiLCJtanBlZ1N0cmVhbSIsIm1qcGVnIiwiTUpwZWdTdHJlYW0iLCJzdGFydCIsImUiLCJkZWxldGVTZXNzaW9uIiwicGl4ZWxSYXRpbyIsImdldERldmljZVBpeGVsUmF0aW8iLCJzdGF0QmFySGVpZ2h0IiwiZ2V0U3RhdHVzQmFySGVpZ2h0Iiwidmlld3BvcnRSZWN0IiwiZ2V0Vmlld1BvcnRSZWN0IiwiZHJpdmVyRGF0YSIsImdldFNlc3Npb24iLCJzZXNzaW9uRGF0YSIsImRlYnVnIiwidWlhMkRhdGEiLCJqd3Byb3h5IiwiY29tbWFuZCIsImlzRW11bGF0b3IiLCJhZGIiLCJhdmQiLCJkZXZpY2VOYW1lIiwiZXJyb3JBbmRUaHJvdyIsInBsYXRmb3JtVmVyc2lvbiIsImF2ZERldmljZSIsInJlcGxhY2UiLCJhbGxvY2F0ZVN5c3RlbVBvcnQiLCJmb3J3YXJkUG9ydCIsImxvY2FsUG9ydCIsInN5c3RlbVBvcnQiLCJfaGFzU3lzdGVtUG9ydEluQ2FwcyIsInN0YXJ0UG9ydCIsImVuZFBvcnQiLCJyZWxlYXNlU3lzdGVtUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQiLCJtanBlZ1NlcnZlclBvcnQiLCJyZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0IiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImNyZWF0ZUFEQiIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsImhhc1ZhbHVlIiwiZ3BzRW5hYmxlZCIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJ3YXJuIiwiYXBwSW5mbyIsImdldExhdW5jaEluZm8iLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJpbml0RGV2aWNlIiwiaW5pdFVpQXV0b21hdG9yMlNlcnZlciIsImRpc2FibGVXaW5kb3dBbmltYXRpb24iLCJpc0FuaW1hdGlvbk9uIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJfd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQiLCJpbml0QVVUIiwic3RhcnRTZXNzaW9uIiwiYWRkRGV2aWNlSW5mb1RvQ2FwcyIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJzdGFydENocm9tZVNlc3Npb24iLCJlbnN1cmVBcHBTdGFydHMiLCJvcmllbnRhdGlvbiIsInNldE9yaWVudGF0aW9uIiwiYXV0b1dlYnZpZXciLCJ2aWV3TmFtZSIsImRlZmF1bHRXZWJ2aWV3TmFtZSIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsInVpYXV0b21hdG9yMk9wdHMiLCJob3N0IiwicmVtb3RlQWRiSG9zdCIsImRldmljZVBvcnQiLCJhcGsiLCJ0bXBEaXIiLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsInJlYWRUaW1lb3V0IiwidWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQiLCJVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJwcm94eVJlcVJlcyIsInByb3h5Q29tbWFuZCIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJpbnN0YWxsU2VydmVyQXBrIiwidWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiU0VSVkVSX1BBQ0tBR0VfSUQiLCJTRVJWRVJfVEVTVF9QQUNLQUdFX0lEIiwic3RkZXJyIiwibWVzc2FnZSIsInVuaW5zdGFsbE90aGVyUGFja2FnZXMiLCJwYXJzZUFycmF5Iiwib3RoZXJBcHBzIiwiQiIsImFsbCIsIm1hcCIsImluc3RhbGxPdGhlckFwa3MiLCJub1Jlc2V0IiwiaXNBcHBJbnN0YWxsZWQiLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJyZXF1aXJlRGVmYXVsdENlcnQiLCJzaWduQXBwIiwic2tpcFVuaW5zdGFsbCIsInVuaW5zdGFsbEFwayIsImluc3RhbGxBcGsiLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwic3RhcnRBcHAiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsImRvbnRTdG9wQXBwT25SZXNldCIsInJldHJ5IiwidXNlciIsInVzZXJQcm9maWxlIiwiaXNFbXB0eSIsIl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzIiwic3RvcFJlY29yZGluZ1NjcmVlbiIsImlnbiIsInJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyIsInNlcnZlciIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInVuaWNvZGVLZXlib2FyZCIsInJlc2V0S2V5Ym9hcmQiLCJzZXRJTUUiLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJicm9hZGNhc3QiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiZXJyb3IiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInN0b3AiLCJmcyIsImV4aXN0cyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInJlc3RhcnQiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiY21kIiwidG9QYWlycyIsImFuZHJvaWRDb21tYW5kcyIsInByb3RvdHlwZSIsImNvbW1hbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLE9BQU8sR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQkMsZ0JBQWxCLEVBQXVDQyxtQ0FBdkMsQ0FBaEI7QUFJQSxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLElBQUQsRUFBTyxJQUFQLENBQTFCOztBQUlB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QTdCZSxFQThCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsdUNBQVgsQ0FBVCxDQTlCZSxFQStCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsc0RBQVgsQ0FBVCxDQS9CZSxFQWdDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsb0RBQVgsQ0FBVCxDQWhDZSxFQWlDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNENBQVgsQ0FBVCxDQWpDZSxFQWtDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBVCxDQWxDZSxFQW1DZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQW5DZSxFQW9DZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsaUNBQVgsQ0FBVCxDQXBDZSxFQXFDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsdUNBQVgsQ0FBVCxDQXJDZSxFQXNDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsK0NBQVgsQ0FBVCxDQXRDZSxFQXVDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQXZDZSxFQXdDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsZ0NBQVgsQ0FBVCxDQXhDZSxFQXlDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBVCxDQXpDZSxFQTBDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBVCxDQTFDZSxFQTJDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkJBQVgsQ0FBVCxDQTNDZSxFQTRDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsc0JBQVgsQ0FBVCxDQTVDZSxFQTZDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMEJBQVgsQ0FBVCxDQTdDZSxFQThDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFK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LFdBQUthLGFBQUwsR0FBcUJmLFFBQXJCO0FBQ0Q7O0FBQ0QsUUFBSSxLQUFLTyxJQUFMLENBQVVrUCxtQkFBZCxFQUFtQztBQUNqQyxXQUFLMU8sYUFBTCxHQUFxQixDQUFDLEdBQUcsS0FBS0EsYUFBVCxFQUF3QixDQUFDLEtBQUQsRUFBUSxJQUFJZCxNQUFKLENBQVcsNEJBQVgsQ0FBUixDQUF4QixDQUFyQjtBQUNEOztBQUVELFdBQU8sS0FBS2MsYUFBWjtBQUNEOztBQUVrQixNQUFmcUMsZUFBZSxHQUFJO0FBQ3JCLFdBQU90RSxPQUFPLENBQUM0USxlQUFSLENBQXdCLEtBQUtuUCxJQUFMLENBQVVtRCxXQUFsQyxDQUFQO0FBQ0Q7O0FBMW1CZ0Q7Ozs7QUE4bUJuRCxLQUFLLElBQUksQ0FBQ2lNLEdBQUQsRUFBTWxPLEVBQU4sQ0FBVCxJQUFzQkMsZ0JBQUVrTyxPQUFGLENBQVVDLG9DQUFWLENBQXRCLEVBQWtEO0FBQ2hEelAsRUFBQUEseUJBQXlCLENBQUMwUCxTQUExQixDQUFvQ0gsR0FBcEMsSUFBMkNsTyxFQUEzQztBQUNEOztBQUdELEtBQUssSUFBSSxDQUFDa08sR0FBRCxFQUFNbE8sRUFBTixDQUFULElBQXNCQyxnQkFBRWtPLE9BQUYsQ0FBVUcsY0FBVixDQUF0QixFQUEyQztBQUN6QzNQLEVBQUFBLHlCQUF5QixDQUFDMFAsU0FBMUIsQ0FBb0NILEdBQXBDLElBQTJDbE8sRUFBM0M7QUFDRDs7ZUFHY3JCLHlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIERldmljZVNldHRpbmdzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQge1xuICBVaUF1dG9tYXRvcjJTZXJ2ZXIsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEXG59IGZyb20gJy4vdWlhdXRvbWF0b3IyJztcbmltcG9ydCB7IGZzLCB1dGlsLCBtanBlZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHVpYXV0b21hdG9yMkhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7XG4gIGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSURcbn0gZnJvbSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UsIGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFQS19FWFRFTlNJT04sIEFQS1NfRVhURU5TSU9OIH0gZnJvbSAnLi9leHRlbnNpb25zJztcblxuXG5jb25zdCBoZWxwZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdWlhdXRvbWF0b3IySGVscGVycywgYW5kcm9pZEhlbHBlcnMpO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gVWlBdXRvbWF0b3IyIEhUVFAgc2VydmVyIG9uIHRoZSBkZXZpY2VcbmNvbnN0IERFVklDRV9QT1JUX1JBTkdFID0gWzgyMDAsIDgyOTldO1xuXG4vLyBUaGUgZ3VhcmQgaXMgbmVlZGVkIHRvIGF2b2lkIGR5bmFtaWMgc3lzdGVtIHBvcnQgYWxsb2NhdGlvbiBjb25mbGljdHMgZm9yXG4vLyBwYXJhbGxlbCBkcml2ZXIgc2Vzc2lvbnNcbmNvbnN0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ3VpYTJfZGV2aWNlX3BvcnRfZ3VhcmQnKSxcbiAge3RpbWVvdXQ6IDI1LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCBVaUF1dG9tYXRvcjIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLiBXZSB3aWxsIGZvcndhcmRcbi8vIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlIGRldmljZS5cbmNvbnN0IERFVklDRV9QT1JUID0gNjc5MDtcbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgVWlBdXRvbWF0b3IyIE1KUEVHIHNlcnZlciBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuXG4vLyBXZSB3aWxsIGZvcndhcmQgb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGVcbi8vIGRldmljZS5cbmNvbnN0IE1KUEVHX1NFUlZFUl9ERVZJQ0VfUE9SVCA9IDc4MTA7XG5cbmNvbnN0IExPQ0FMSE9TVF9JUDQgPSAnMTI3LjAuMC4xJztcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gVWlBdXRvbWF0b3IyIHNlcnZlci5cbi8vIFRPRE86IE5lZWQgdG8gc2VncmVnYXRlIHRoZSBwYXRocyBiZXR0ZXIgd2F5IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hlcmV2ZXIgYXBwbGljYWJsZS5cbi8vIChOb3Qgc2VncmVnYXRpbmcgcmlnaHQgYXdheSBiZWNhdXNlIG1vcmUgcGF0aHMgdG8gYmUgYWRkZWQgaW4gdGhlIE5PX1BST1hZIGxpc3QpXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vKD8hLiovKScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnRfW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL2N1cnJlbnRfcGFja2FnZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9hdHRyaWJ1dGUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZGlzcGxheWVkJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2VuYWJsZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvbG9jYXRpb25faW5fdmlldycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9uYW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3NjcmVlbnNob3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2VsZWN0ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL1teL10rX2FsZXJ0JCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FjdGlvbnMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcC9bXi9dJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL1teL10rL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9jb21wYXJlX2ltYWdlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvKD8hc2V0X2NsaXBib2FyZClbXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9lbGVtZW50L1teL10rL3JlcGxhY2VfdmFsdWUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZWxlbWVudC9bXi9dKy92YWx1ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vcGVyZm9ybWFuY2VEYXRhL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RvcF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtLy4qZXZlbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2tleXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZycpXSxcbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy93aW5kb3cvcmVjdCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZycpXSxcbl07XG5cbi8vIFRoaXMgaXMgYSBzZXQgb2YgbWV0aG9kcyBhbmQgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIENocm9tZWRyaXZlci5cbmNvbnN0IENIUk9NRV9OT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL3JlY3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG5cbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgbW9iaWxlOiBjb21tYW5kcyB3b3JraW5nIGluIHdlYiBjb250ZXh0XG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcyQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2ckJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMkJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2ckJyldLFxuXTtcblxuY29uc3QgTUVNT0laRURfRlVOQ1RJT05TID0gW1xuICAnZ2V0U3RhdHVzQmFySGVpZ2h0JyxcbiAgJ2dldERldmljZVBpeGVsUmF0aW8nLFxuXTtcblxuY2xhc3MgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgLy8gYHNoZWxsYCBvdmVyd3JpdGVzIGFkYi5zaGVsbCwgc28gcmVtb3ZlXG4gICAgZGVsZXRlIG9wdHMuc2hlbGw7XG5cbiAgICBzdXBlcihvcHRzLCBzaG91bGRWYWxpZGF0ZUNhcHMpO1xuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAneHBhdGgnLFxuICAgICAgJ2lkJyxcbiAgICAgICdjbGFzcyBuYW1lJyxcbiAgICAgICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICAgICdjc3Mgc2VsZWN0b3InLFxuICAgICAgJy1hbmRyb2lkIHVpYXV0b21hdG9yJ1xuICAgIF07XG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4gICAgdGhpcy51aWF1dG9tYXRvcjIgPSBudWxsO1xuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmRlZmF1bHRJTUUgPSBudWxsO1xuICAgIHRoaXMuandwUHJveHlBdm9pZCA9IE5PX1BST1hZO1xuICAgIHRoaXMuYXBrU3RyaW5ncyA9IHt9OyAvLyBtYXAgb2YgbGFuZ3VhZ2UgLT4gc3RyaW5ncyBvYmpcblxuICAgIHRoaXMuc2V0dGluZ3MgPSBuZXcgRGV2aWNlU2V0dGluZ3Moe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IGZhbHNlLCBhbGxvd0ludmlzaWJsZUVsZW1lbnRzOiBmYWxzZX0sXG4gICAgICAgIHRoaXMub25TZXR0aW5nc1VwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICAvLyBoYW5kbGUgd2VidmlldyBtZWNoYW5pY3MgZnJvbSBBbmRyb2lkRHJpdmVyXG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcblxuICAgIC8vIG1lbW9pemUgZnVuY3Rpb25zIGhlcmUsIHNvIHRoYXQgdGhleSBhcmUgZG9uZSBvbiBhIHBlci1pbnN0YW5jZSBiYXNpc1xuICAgIGZvciAoY29uc3QgZm4gb2YgTUVNT0laRURfRlVOQ1RJT05TKSB7XG4gICAgICB0aGlzW2ZuXSA9IF8ubWVtb2l6ZSh0aGlzW2ZuXSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVEZXNpcmVkQ2FwcyAoY2Fwcykge1xuICAgIHJldHVybiBzdXBlci52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpICYmIGFuZHJvaWRIZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXNzaW9uICguLi5hcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRPRE8gaGFuZGxlIG90aGVyU2Vzc2lvbkRhdGEgZm9yIG11bHRpcGxlIHNlc3Npb25zXG4gICAgICBsZXQgW3Nlc3Npb25JZCwgY2Fwc10gPSBhd2FpdCBzdXBlci5jcmVhdGVTZXNzaW9uKC4uLmFyZ3MpO1xuXG4gICAgICBsZXQgc2VydmVyRGV0YWlscyA9IHtcbiAgICAgICAgcGxhdGZvcm06ICdMSU5VWCcsXG4gICAgICAgIHdlYlN0b3JhZ2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGFrZXNTY3JlZW5zaG90OiB0cnVlLFxuICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZGF0YWJhc2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkOiB0cnVlLFxuICAgICAgICBsb2NhdGlvbkNvbnRleHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgd2FybmluZ3M6IHt9LFxuICAgICAgICBkZXNpcmVkOiB0aGlzLmNhcHMsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhcHMgPSBPYmplY3QuYXNzaWduKHNlcnZlckRldGFpbHMsIHRoaXMuY2Fwcyk7XG5cbiAgICAgIHRoaXMuY3VyQ29udGV4dCA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG5cbiAgICAgIGxldCBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgZnVsbFJlc2V0OiBmYWxzZSxcbiAgICAgICAgYXV0b0xhdW5jaDogdHJ1ZSxcbiAgICAgICAgYWRiUG9ydDogREVGQVVMVF9BREJfUE9SVCxcbiAgICAgICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiA5MDAwMFxuICAgICAgfTtcbiAgICAgIF8uZGVmYXVsdHModGhpcy5vcHRzLCBkZWZhdWx0T3B0cyk7XG5cbiAgICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKFwiV2UncmUgZ29pbmcgdG8gcnVuIGEgQ2hyb21lLWJhc2VkIHNlc3Npb25cIik7XG4gICAgICAgIGxldCB7cGtnLCBhY3Rpdml0eX0gPSBoZWxwZXJzLmdldENocm9tZVBrZyh0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICAgICAgICB0aGlzLm9wdHMuYXBwUGFja2FnZSA9IHRoaXMuY2Fwcy5hcHBQYWNrYWdlID0gcGtnO1xuICAgICAgICB0aGlzLm9wdHMuYXBwQWN0aXZpdHkgPSB0aGlzLmNhcHMuYXBwQWN0aXZpdHkgPSBhY3Rpdml0eTtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQ2hyb21lLXR5cGUgcGFja2FnZSBhbmQgYWN0aXZpdHkgYXJlICR7cGtnfSBhbmQgJHthY3Rpdml0eX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgdGhpcy5zZXRBdmRGcm9tQ2FwYWJpbGl0aWVzKGNhcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIFtBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTl0pO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwUHJlc2VudCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICAvLyB0aGUgYXBwIGlzbid0IGFuIGFjdHVhbCBhcHAgZmlsZSBidXQgcmF0aGVyIHNvbWV0aGluZyB3ZSB3YW50IHRvXG4gICAgICAgIC8vIGFzc3VtZSBpcyBvbiB0aGUgZGV2aWNlIGFuZCBqdXN0IGxhdW5jaCB2aWEgdGhlIGFwcFBhY2thZ2VcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9JyBkaXJlY3RseSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBOZWl0aGVyICdhcHAnIG5vciAnYXBwUGFja2FnZScgd2FzIHNldC4gU3RhcnRpbmcgVWlBdXRvbWF0b3IyIGAgK1xuICAgICAgICAgICd3aXRob3V0IHRoZSB0YXJnZXQgYXBwbGljYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0cy5hZGJQb3J0ID0gdGhpcy5vcHRzLmFkYlBvcnQgfHwgREVGQVVMVF9BREJfUE9SVDtcblxuICAgICAgYXdhaXQgdGhpcy5zdGFydFVpQXV0b21hdG9yMlNlc3Npb24oKTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsbERldmljZURldGFpbHMoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nIE1KUEVHIHN0cmVhbSByZWFkaW5nIFVSTDogJyR7dGhpcy5vcHRzLm1qcGVnU2NyZWVuc2hvdFVybH0nYCk7XG4gICAgICAgIHRoaXMubWpwZWdTdHJlYW0gPSBuZXcgbWpwZWcuTUpwZWdTdHJlYW0odGhpcy5vcHRzLm1qcGVnU2NyZWVuc2hvdFVybCk7XG4gICAgICAgIGF3YWl0IHRoaXMubWpwZWdTdHJlYW0uc3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCB0aGlzLmNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmaWxsRGV2aWNlRGV0YWlscyAoKSB7XG4gICAgdGhpcy5jYXBzLnBpeGVsUmF0aW8gPSBhd2FpdCB0aGlzLmdldERldmljZVBpeGVsUmF0aW8oKTtcbiAgICB0aGlzLmNhcHMuc3RhdEJhckhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzQmFySGVpZ2h0KCk7XG4gICAgdGhpcy5jYXBzLnZpZXdwb3J0UmVjdCA9IGF3YWl0IHRoaXMuZ2V0Vmlld1BvcnRSZWN0KCk7XG4gIH1cblxuICBnZXQgZHJpdmVyRGF0YSAoKSB7XG4gICAgLy8gVE9ETyBmaWxsIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBhc3luYyBnZXRTZXNzaW9uICgpIHtcbiAgICBsZXQgc2Vzc2lvbkRhdGEgPSBhd2FpdCBzdXBlci5nZXRTZXNzaW9uKCk7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0dldHRpbmcgc2Vzc2lvbiBkZXRhaWxzIGZyb20gc2VydmVyIHRvIG1peCBpbicpO1xuICAgIGxldCB1aWEyRGF0YSA9IGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnLycsICdHRVQnLCB7fSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHNlc3Npb25EYXRhLCB1aWEyRGF0YSk7XG4gIH1cblxuICBpc0VtdWxhdG9yICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0VtdWxhdG9yKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICB9XG5cbiAgc2V0QXZkRnJvbUNhcGFiaWxpdGllcyAoY2Fwcykge1xuICAgIGlmICh0aGlzLm9wdHMuYXZkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdhdmQgbmFtZSBkZWZpbmVkLCBpZ25vcmluZyBkZXZpY2UgbmFtZSBhbmQgcGxhdGZvcm0gdmVyc2lvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNhcHMuZGV2aWNlTmFtZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdhdmQgb3IgZGV2aWNlTmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNhcHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBwbGF0Zm9ybVZlcnNpb24gc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGF2ZERldmljZSA9IGNhcHMuZGV2aWNlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8uXS9nLCAnLScpO1xuICAgICAgdGhpcy5vcHRzLmF2ZCA9IGAke2F2ZERldmljZX1fXyR7Y2Fwcy5wbGF0Zm9ybVZlcnNpb259YDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhbGxvY2F0ZVN5c3RlbVBvcnQgKCkge1xuICAgIGNvbnN0IGZvcndhcmRQb3J0ID0gYXN5bmMgKGxvY2FsUG9ydCkgPT4ge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEZvcndhcmRpbmcgVWlBdXRvbWF0b3IyIFNlcnZlciBwb3J0ICR7REVWSUNFX1BPUlR9IHRvIGxvY2FsIHBvcnQgJHtsb2NhbFBvcnR9YCk7XG4gICAgICBpZiAoKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyhsb2NhbFBvcnQsIExPQ0FMSE9TVF9JUDQpKSA9PT0gJ29wZW4nKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFVpQXV0b21hdG9yMiBTZXJ2ZXIgY2Fubm90IHN0YXJ0IGJlY2F1c2UgdGhlIGxvY2FsIHBvcnQgIyR7bG9jYWxQb3J0fSBpcyBidXN5LiBgICtcbiAgICAgICAgICBgTWFrZSBzdXJlIHRoZSBwb3J0IHlvdSBwcm92aWRlIHZpYSAnc3lzdGVtUG9ydCcgY2FwYWJpbGl0eSBpcyBub3Qgb2NjdXBpZWQuIGAgK1xuICAgICAgICAgIGBUaGlzIHNpdHVhdGlvbiBtaWdodCBvZnRlbiBiZSBhIHJlc3VsdCBvZiBhbiBpbmFjY3VyYXRlIHNlc3Npb25zIG1hbmFnZW1lbnQsIGUuZy4gYCArXG4gICAgICAgICAgYG9sZCBhdXRvbWF0aW9uIHNlc3Npb25zIG9uIHRoZSBzYW1lIGRldmljZSBtdXN0IGFsd2F5cyBiZSBjbG9zZWQgYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmVzLmApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQobG9jYWxQb3J0LCBERVZJQ0VfUE9SVCk7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdHMuc3lzdGVtUG9ydCkge1xuICAgICAgdGhpcy5faGFzU3lzdGVtUG9ydEluQ2FwcyA9IHRydWU7XG4gICAgICByZXR1cm4gYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH1cblxuICAgIGF3YWl0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgW3N0YXJ0UG9ydCwgZW5kUG9ydF0gPSBERVZJQ0VfUE9SVF9SQU5HRTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMub3B0cy5zeXN0ZW1Qb3J0ID0gYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2Uoc3RhcnRQb3J0LCBlbmRQb3J0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgYW55IGZyZWUgcG9ydCBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH19LiBgICtcbiAgICAgICAgICBgUGxlYXNlIHNldCB0aGUgYXZhaWxhYmxlIHBvcnQgbnVtYmVyIGJ5IHByb3ZpZGluZyB0aGUgc3lzdGVtUG9ydCBjYXBhYmlsaXR5IG9yIGAgK1xuICAgICAgICAgIGBkb3VibGUgY2hlY2sgdGhlIHByb2Nlc3NlcyB0aGF0IGFyZSBsb2NraW5nIHBvcnRzIHdpdGhpbiB0aGlzIHJhbmdlIGFuZCB0ZXJtaW5hdGUgYCArXG4gICAgICAgICAgYHRoZXNlIHdoaWNoIGFyZSBub3QgbmVlZGVkIGFueW1vcmVgKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGZvcndhcmRQb3J0KHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VTeXN0ZW1Qb3J0ICgpIHtcbiAgICBpZiAoIXRoaXMub3B0cy5zeXN0ZW1Qb3J0IHx8ICF0aGlzLmFkYikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9oYXNTeXN0ZW1Qb3J0SW5DYXBzKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQoYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhbGxvY2F0ZU1qcGVnU2VydmVyUG9ydCAoKSB7XG4gICAgaWYgKHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQsIE1KUEVHX1NFUlZFUl9ERVZJQ0VfUE9SVCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVsZWFzZU1qcGVnU2VydmVyUG9ydCAoKSB7XG4gICAgaWYgKHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5tanBlZ1NlcnZlclBvcnQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbiAoKSB7XG4gICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICBsZXQge3VkaWQsIGVtUG9ydH0gPSBhd2FpdCBoZWxwZXJzLmdldERldmljZUluZm9Gcm9tQ2Fwcyh0aGlzLm9wdHMpO1xuICAgIHRoaXMub3B0cy51ZGlkID0gdWRpZDtcbiAgICB0aGlzLm9wdHMuZW1Qb3J0ID0gZW1Qb3J0O1xuXG4gICAgLy8gbm93IHRoYXQgd2Uga25vdyBvdXIgamF2YSB2ZXJzaW9uIGFuZCBkZXZpY2UgaW5mbywgd2UgY2FuIGNyZWF0ZSBvdXJcbiAgICAvLyBBREIgaW5zdGFuY2VcbiAgICB0aGlzLmFkYiA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLmNyZWF0ZUFEQih0aGlzLm9wdHMpO1xuXG4gICAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuXG4gICAgaWYgKGFwaUxldmVsIDwgMjEpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ1VJQXV0b21hdG9yMiBpcyBvbmx5IHN1cHBvcnRlZCBzaW5jZSBBbmRyb2lkIDUuMCAoTG9sbGlwb3ApLiAnICtcbiAgICAgICAgJ1lvdSBjb3VsZCBzdGlsbCB1c2Ugb3RoZXIgc3VwcG9ydGVkIGJhY2tlbmRzIGluIG9yZGVyIHRvIGF1dG9tYXRlIG9sZGVyIEFuZHJvaWQgdmVyc2lvbnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKGFwaUxldmVsID49IDI4KSB7IC8vIEFuZHJvaWQgUFxuICAgICAgdGhpcy5sb2cuaW5mbygnUmVsYXhpbmcgaGlkZGVuIGFwaSBwb2xpY3knKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEhpZGRlbkFwaVBvbGljeSgnMScsICEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRvIGVuYWJsZS9kaXNhYmxlIGdwcyBiZWZvcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb25cbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMuZ3BzRW5hYmxlZCkpIHtcbiAgICAgIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBUcnlpbmcgdG8gJHt0aGlzLm9wdHMuZ3BzRW5hYmxlZCA/ICdlbmFibGUnIDogJ2Rpc2FibGUnfSBncHMgbG9jYXRpb24gcHJvdmlkZXJgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlcih0aGlzLm9wdHMuZ3BzRW5hYmxlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBTb3JyeSEgJ2dwc0VuYWJsZWQnIGNhcGFiaWxpdHkgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9yc2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdldCBhcHBQYWNrYWdlIGV0IGFsIGZyb20gbWFuaWZlc3QgaWYgbmVjZXNzYXJ5XG4gICAgY29uc3QgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAvLyBhbmQgZ2V0IGl0IG9udG8gb3VyICdvcHRzJyBvYmplY3Qgc28gd2UgdXNlIGl0IGZyb20gbm93IG9uXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8gfHwge30pO1xuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZCwgcGxhdGZvcm0gdmVyc2lvbiwgc2NyZWVuIHNpemUsIHNjcmVlbiBkZW5zaXR5LCBtb2RlbCBhbmQgbWFudWZhY3R1cmVyIGRldGFpbHNcbiAgICB0aGlzLmNhcHMuZGV2aWNlTmFtZSA9IHRoaXMuYWRiLmN1ckRldmljZUlkO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VVRElEID0gdGhpcy5vcHRzLnVkaWQ7XG5cbiAgICAvLyBzdGFydCBhbiBhdmQsIHNldCB0aGUgbGFuZ3VhZ2UvbG9jYWxlLCBwaWNrIGFuIGVtdWxhdG9yLCBldGMuLi5cbiAgICAvLyBUT0RPIHdpdGggbXVsdGlwbGUgZGV2aWNlcyB3ZSdsbCBuZWVkIHRvIHBhcmFtZXRlcml6ZSB0aGlzXG4gICAgdGhpcy5kZWZhdWx0SU1FID0gYXdhaXQgaGVscGVycy5pbml0RGV2aWNlKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIFVpQXV0b21hdG9yMiBwb3J0XG4gICAgLy8gVGhpcyBjYWxsIG11dGF0ZXMgdGhpcy5vcHRzLnN5c3RlbVBvcnQgaWYgaXQgaXMgbm90IHNldCBleHBsaWNpdGx5XG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZVN5c3RlbVBvcnQoKTtcblxuICAgIC8vIFByZXBhcmUgdGhlIGRldmljZSBieSBmb3J3YXJkaW5nIHRoZSBVaUF1dG9tYXRvcjIgTUpQRUcgc2VydmVyIHBvcnQgKGlmXG4gICAgLy8gYXBwbGljYWJsZSlcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0KCk7XG5cbiAgICAvLyBzZXQgdXAgdGhlIG1vZGlmaWVkIFVpQXV0b21hdG9yMiBzZXJ2ZXIgZXRjXG4gICAgYXdhaXQgdGhpcy5pbml0VWlBdXRvbWF0b3IyU2VydmVyKCk7XG5cbiAgICAvLyBTaG91bGQgYmUgYWZ0ZXIgaW5zdGFsbGluZyBpby5hcHBpdW0uc2V0dGluZ3MgaW4gaGVscGVycy5pbml0RGV2aWNlXG4gICAgaWYgKHRoaXMub3B0cy5kaXNhYmxlV2luZG93QW5pbWF0aW9uICYmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMjYpKSB7IC8vIEFQSSBsZXZlbCAyNiBpcyBBbmRyb2lkIDguMC5cbiAgICAgIC8vIEdyYW50aW5nIGFuZHJvaWQucGVybWlzc2lvbi5TRVRfQU5JTUFUSU9OX1NDQUxFIGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgYW5pbWF0aW9ucyB1bmRlciBBUEkgbGV2ZWwgMjZcbiAgICAgIC8vIFJlYWQgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcHVsbC8xMTY0MCNpc3N1ZWNvbW1lbnQtNDM4MjYwNDc3XG4gICAgICAvLyBgLS1uby13aW5kb3ctYW5pbWF0aW9uYCB3b3JrcyBvdmVyIEFuZHJvaWQgOCB0byBkaXNhYmxlIGFsbCBvZiBhbmltYXRpb25zXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuaXNBbmltYXRpb25PbigpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0Rpc2FibGluZyBhbmltYXRpb24gdmlhIGlvLmFwcGl1bS5zZXR0aW5ncycpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1dpbmRvdyBhbmltYXRpb24gaXMgYWxyZWFkeSBkaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB1cCBhcHAgdW5kZXIgdGVzdFxuICAgIC8vIHByZXBhcmUgb3VyIGFjdHVhbCBBVVQsIGdldCBpdCBvbiB0aGUgZGV2aWNlLCBldGMuLi5cbiAgICBhd2FpdCB0aGlzLmluaXRBVVQoKTtcblxuICAgIC8vIEFkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSAmJiBhcHBJbmZvKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwUGFja2FnZSA9IGFwcEluZm8uYXBwUGFja2FnZTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggVWlBdXRvbWF0b3IyIGFuZCB3YWl0IHRpbGwgaXRzIG9ubGluZSBhbmQgd2UgaGF2ZSBhIHNlc3Npb25cbiAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5zdGFydFNlc3Npb24odGhpcy5jYXBzKTtcblxuICAgIGF3YWl0IHRoaXMuYWRkRGV2aWNlSW5mb1RvQ2FwcygpO1xuXG4gICAgLy8gVW5sb2NrIHRoZSBkZXZpY2UgYWZ0ZXIgdGhlIHNlc3Npb24gaXMgc3RhcnRlZC5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyB1bmxvY2sgdGhlIGRldmljZSB0byBwcmVwYXJlIGl0IGZvciB0ZXN0aW5nXG4gICAgICBhd2FpdCBoZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYCdza2lwVW5sb2NrJyBjYXBhYmlsaXR5IHNldCwgc28gc2tpcHBpbmcgZGV2aWNlIHVubG9ja2ApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikgeyAvLyBzdGFydCBhIGNocm9tZWRyaXZlciBzZXNzaW9uXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbih0aGlzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy5hdXRvTGF1bmNoICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUFwcFN0YXJ0cygpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBpbml0aWFsIG9yaWVudGF0aW9uIGlzIHJlcXVlc3RlZCwgc2V0IGl0XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5vcHRzLm9yaWVudGF0aW9uKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgaW5pdGlhbCBvcmllbnRhdGlvbiB0byAnJHt0aGlzLm9wdHMub3JpZW50YXRpb259J2ApO1xuICAgICAgYXdhaXQgdGhpcy5zZXRPcmllbnRhdGlvbih0aGlzLm9wdHMub3JpZW50YXRpb24pO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gaW1tZWRpYXRlbHkgZ2V0IGludG8gYSB3ZWJ2aWV3LCBzZXQgb3VyIGNvbnRleHRcbiAgICAvLyBhcHByb3ByaWF0ZWx5XG4gICAgaWYgKHRoaXMub3B0cy5hdXRvV2Vidmlldykge1xuICAgICAgY29uc3Qgdmlld05hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICAgICAgY29uc3QgdGltZW91dCA9IHRoaXMub3B0cy5hdXRvV2Vidmlld1RpbWVvdXQgfHwgMjAwMDtcbiAgICAgIHRoaXMubG9nLmluZm8oYFNldHRpbmcgYXV0byB3ZWJ2aWV3IHRvIGNvbnRleHQgJyR7dmlld05hbWV9JyB3aXRoIHRpbWVvdXQgJHt0aW1lb3V0fW1zYCk7XG4gICAgICBhd2FpdCByZXRyeUludGVydmFsKHRpbWVvdXQgLyA1MDAsIDUwMCwgdGhpcy5zZXRDb250ZXh0LmJpbmQodGhpcyksIHZpZXdOYW1lKTtcbiAgICB9XG5cbiAgICAvLyBub3cgdGhhdCBldmVyeXRoaW5nIGhhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSwgdHVybiBvbiBwcm94eWluZyBzbyBhbGxcbiAgICAvLyBzdWJzZXF1ZW50IHNlc3Npb24gcmVxdWVzdHMgZ28gc3RyYWlnaHQgdG8vZnJvbSB1aWF1dG9tYXRvcjJcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGFkZERldmljZUluZm9Ub0NhcHMgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFwaVZlcnNpb24sXG4gICAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgICBtYW51ZmFjdHVyZXIsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlYWxEaXNwbGF5U2l6ZSxcbiAgICAgIGRpc3BsYXlEZW5zaXR5LFxuICAgIH0gPSBhd2FpdCB0aGlzLm1vYmlsZUdldERldmljZUluZm8oKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlQXBpTGV2ZWwgPSBwYXJzZUludChhcGlWZXJzaW9uLCAxMCk7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IHBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuU2l6ZSA9IHJlYWxEaXNwbGF5U2l6ZTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuRGVuc2l0eSA9IGRpc3BsYXlEZW5zaXR5O1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNYW51ZmFjdHVyZXIgPSBtYW51ZmFjdHVyZXI7XG4gIH1cblxuICBhc3luYyBpbml0VWlBdXRvbWF0b3IyU2VydmVyICgpIHtcbiAgICAvLyBicm9rZW4gb3V0IGZvciByZWFkYWJpbGl0eVxuICAgIGNvbnN0IHVpYXV0b21hdG9yMk9wdHMgPSB7XG4gICAgICBob3N0OiB0aGlzLm9wdHMucmVtb3RlQWRiSG9zdCB8fCB0aGlzLm9wdHMuaG9zdCB8fCBMT0NBTEhPU1RfSVA0LFxuICAgICAgc3lzdGVtUG9ydDogdGhpcy5vcHRzLnN5c3RlbVBvcnQsXG4gICAgICBkZXZpY2VQb3J0OiBERVZJQ0VfUE9SVCxcbiAgICAgIGFkYjogdGhpcy5hZGIsXG4gICAgICBhcGs6IHRoaXMub3B0cy5hcHAsXG4gICAgICB0bXBEaXI6IHRoaXMub3B0cy50bXBEaXIsXG4gICAgICBhcHBQYWNrYWdlOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgIGFwcEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgICBkaXNhYmxlV2luZG93QW5pbWF0aW9uOiAhIXRoaXMub3B0cy5kaXNhYmxlV2luZG93QW5pbWF0aW9uLFxuICAgICAgZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2U6IHRoaXMub3B0cy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSxcbiAgICAgIHJlYWRUaW1lb3V0OiB0aGlzLm9wdHMudWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQsXG4gICAgfTtcbiAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHBhY2thZ2UgYW5kIGFjdGl2aXR5LCB3ZSBjYW4gY3JlYXRlIGFuIGluc3RhbmNlIG9mXG4gICAgLy8gdWlhdXRvbWF0b3IyIHdpdGggdGhlIGFwcHJvcHJpYXRlIG9wdGlvbnNcbiAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG5ldyBVaUF1dG9tYXRvcjJTZXJ2ZXIodGhpcy5sb2csIHVpYXV0b21hdG9yMk9wdHMpO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eVJlcVJlcy5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMudWlhdXRvbWF0b3IyLnByb3h5Q29tbWFuZC5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcblxuICAgIGlmICh0aGlzLm9wdHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbikge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgJ3NraXBTZXJ2ZXJJbnN0YWxsYXRpb24nIGlzIHNldC4gU2tpcHBpbmcgVUlBdXRvbWF0b3IyIHNlcnZlciBpbnN0YWxsYXRpb24uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmluc3RhbGxTZXJ2ZXJBcGsodGhpcy5vcHRzLnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdChcbiAgICAgICAgICBTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IGFkZCBzZXJ2ZXIgcGFja2FnZXMgdG8gdGhlIERvemUgd2hpdGVsaXN0LiBPcmlnaW5hbCBlcnJvcjogYCArXG4gICAgICAgICAgKGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMoXG4gICAgICAgIHRoaXMuYWRiLFxuICAgICAgICBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpLFxuICAgICAgICBbU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSURdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEluc3RhbGwgYW55IFwib3RoZXJBcHBzXCIgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy5vdGhlckFwcHMpIHtcbiAgICAgIGxldCBvdGhlckFwcHM7XG4gICAgICB0cnkge1xuICAgICAgICBvdGhlckFwcHMgPSBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLm90aGVyQXBwcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcIm90aGVyQXBwc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgb3RoZXJBcHBzID0gYXdhaXQgQi5hbGwob3RoZXJBcHBzXG4gICAgICAgIC5tYXAoKGFwcCkgPT4gdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHAsIFtBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTl0pKSk7XG4gICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxPdGhlckFwa3Mob3RoZXJBcHBzLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmICEoYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQodGhpcy5vcHRzLmFwcFBhY2thZ2UpKVxuICAgICAgICAgIHx8ICF0aGlzLm9wdHMubm9SZXNldCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5ub1NpZ24gJiYgIWF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydCh0aGlzLm9wdHMuYXBwLCB0aGlzLm9wdHMuYXBwUGFja2FnZSwge1xuICAgICAgICAgIHJlcXVpcmVEZWZhdWx0Q2VydDogZmFsc2UsXG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgYXdhaXQgaGVscGVycy5zaWduQXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMuYXBwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxBcGsodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1Zygnbm9SZXNldCBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHRoZSBhcHAgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIERvaW5nIG5vdGhpbmcnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnTm8gYXBwIGNhcGFiaWxpdHkuIEFzc3VtaW5nIGl0IGlzIGFscmVhZHkgb24gdGhlIGRldmljZScpO1xuICAgICAgaWYgKHRoaXMub3B0cy5mYXN0UmVzZXQgJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgICAgYXdhaXQgaGVscGVycy5yZXNldEFwcCh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBlbnN1cmVBcHBTdGFydHMgKCkge1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGFjdGl2aXR5IGFuZCBwYWNrYWdlIHRvIHdhaXQgZm9yXG4gICAgY29uc3QgYXBwV2FpdFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UgfHwgdGhpcy5vcHRzLmFwcFBhY2thZ2U7XG4gICAgY29uc3QgYXBwV2FpdEFjdGl2aXR5ID0gdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSB8fCB0aGlzLm9wdHMuYXBwQWN0aXZpdHk7XG5cbiAgICB0aGlzLmxvZy5pbmZvKGBTdGFydGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0vJHt0aGlzLm9wdHMuYXBwQWN0aXZpdHl9IGAgK1xuICAgICAgYGFuZCB3YWl0aW5nIGZvciAnJHthcHBXYWl0UGFja2FnZX0vJHthcHBXYWl0QWN0aXZpdHl9J2ApO1xuXG4gICAgaWYgKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2UpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYGFuZHJvaWRDb3ZlcmFnZSBpcyBjb25maWd1cmVkLiBgICtcbiAgICAgICAgYCBTdGFydGluZyBpbnN0cnVtZW50YXRpb24gb2YgJyR7dGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZX0nLi4uYCk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5hbmRyb2lkQ292ZXJhZ2UodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgICAgIHJldHJ5OiB0cnVlLFxuICAgICAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2Vzc2lvbicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJlY29yZGluZ1NjcmVlbigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGlnbikge31cblxuICAgIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyh0aGlzLnNlcnZlciwgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgYXdhaXQgdGhpcy5tb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nKCk7XG5cbiAgICBpZiAodGhpcy51aWF1dG9tYXRvcjIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcENocm9tZWRyaXZlclByb3hpZXMoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gc3RvcCBDaHJvbWVEcml2ZXIgcHJveGllczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmp3cFByb3h5QWN0aXZlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcHJveHkgZGVsZXRlU2Vzc2lvbiB0byBVaUF1dG9tYXRvcjI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJyR7dGhpcy5kZWZhdWx0SU1FfSdgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIHJlc2V0IElNRTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2UpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnU2h1dHRpbmcgZG93biB0aGUgYWRiIHByb2Nlc3Mgb2YgaW5zdHJ1bWVudGF0aW9uLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmVuZEFuZHJvaWRDb3ZlcmFnZSgpO1xuICAgICAgICAvLyBVc2UgdGhpcyBicm9hZGNhc3QgaW50ZW50IHRvIG5vdGlmeSBpdCdzIHRpbWUgdG8gZHVtcCBjb3ZlcmFnZSB0byBmaWxlXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KSB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgU2VuZGluZyBpbnRlbnQgYnJvYWRjYXN0ICcke3RoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnR9JyBhdCB0aGUgZW5kIG9mIGluc3RydW1lbnRpbmcuYCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0KHRoaXMuY2Fwcy5hbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oJ05vIGFuZHJvaWRDb3ZlcmFnZUVuZEludGVudCBpcyBjb25maWd1cmVkIGluIGNhcHMuIFBvc3NpYmx5IHlvdSBjYW5ub3QgZ2V0IGNvdmVyYWdlIGZpbGUuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNDaHJvbWVTZXNzaW9uXG4gICAgICAgICAgICAmJiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldFxuICAgICAgICAgICAgJiYgIXRoaXMub3B0cy5ub1Jlc2V0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gZm9yY2Ugc3RvcCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBDYXBhYmlsaXR5ICdmdWxsUmVzZXQnIHNldCB0byAndHJ1ZScsIFVuaW5zdGFsbGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdW5pbnN0YWxsIGFwcDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgdmFsdWUgY2FuIGJlIHRydWUgaWYgdGVzdCB0YXJnZXQgZGV2aWNlIGlzIDw9IDI2XG4gICAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VTeXN0ZW1Qb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVtb3ZlIHN5c3RlbSBwb3J0IGZvcndhcmQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgLy8gSWdub3JlLCB0aGlzIGJsb2NrIHdpbGwgYWxzbyBiZSBjYWxsZWQgd2hlbiB3ZSBmYWxsIGluIGNhdGNoIGJsb2NrXG4gICAgICAgIC8vIGFuZCBiZWZvcmUgZXZlbiBwb3J0IGZvcndhcmQuXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VNanBlZ1NlcnZlclBvcnQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byByZW1vdmUgTUpQRUcgc2VydmVyIHBvcnQgZm9yd2FyZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAvLyBJZ25vcmUsIHRoaXMgYmxvY2sgd2lsbCBhbHNvIGJlIGNhbGxlZCB3aGVuIHdlIGZhbGwgaW4gY2F0Y2ggYmxvY2tcbiAgICAgICAgLy8gYW5kIGJlZm9yZSBldmVuIHBvcnQgZm9yd2FyZC5cbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIGNsb3NlIGVtdWxhdG9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm1qcGVnU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdDbG9zaW5nIE1KUEVHIHN0cmVhbScpO1xuICAgICAgdGhpcy5tanBlZ1N0cmVhbS5zdG9wKCk7XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICcke3RoaXMub3B0cy5hcHB9J2ApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIHVpYXV0bzIgc2VydmVyIGFscmVhZHlcbiAgfVxuXG4gIC8vIE5lZWQgdG8gb3ZlcnJpZGUgYW5kcm9pZC1kcml2ZXIncyB2ZXJzaW9uIG9mIHRoaXMgc2luY2Ugd2UgZG9uJ3QgYWN0dWFsbHlcbiAgLy8gaGF2ZSBhIGJvb3RzdHJhcDsgaW5zdGVhZCB3ZSBqdXN0IHJlc3RhcnQgYWRiIGFuZCByZS1mb3J3YXJkIHRoZSBVaUF1dG9tYXRvcjJcbiAgLy8gcG9ydFxuICBhc3luYyB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICAgIGF3YWl0IHdyYXBwZWQoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5yZXN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZVN5c3RlbVBvcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0KCk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB3ZSBjYW4gYWx3YXlzIHByb3h5IHRvIHRoZSB1aWF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuZ2V0UHJveHlBdm9pZExpc3Qoc2Vzc2lvbklkKTtcbiAgICAvLyB3ZSBhcmUgbWFpbnRhaW5pbmcgdHdvIHNldHMgb2YgTk9fUFJPWFkgbGlzdHMsIG9uZSBmb3IgY2hyb21lZHJpdmVyKENIUk9NRV9OT19QUk9YWSlcbiAgICAvLyBhbmQgb25lIGZvciB1aWF1dG9tYXRvcjIoTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5jaHJvbWVkcml2ZXIpKSB7XG4gICAgICAvLyBpZiB0aGUgY3VycmVudCBjb250ZXh0IGlzIHdlYnZpZXcoY2hyb21lZHJpdmVyKSwgdGhlbiByZXR1cm4gQ0hST01FX05PX1BST1hZIGxpc3RcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IENIUk9NRV9OT19QUk9YWTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMubmF0aXZlV2ViU2NyZWVuc2hvdCkge1xuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gWy4uLnRoaXMuandwUHJveHlBdm9pZCwgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuandwUHJveHlBdm9pZDtcbiAgfVxuXG4gIGdldCBpc0Nocm9tZVNlc3Npb24gKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzQ2hyb21lQnJvd3Nlcih0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICB9XG59XG5cbi8vIGZpcnN0IGFkZCB0aGUgYW5kcm9pZC1kcml2ZXIgY29tbWFuZHMgd2hpY2ggd2Ugd2lsbCBmYWxsIGJhY2sgdG9cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoYW5kcm9pZENvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbi8vIHRoZW4gb3ZlcndyaXRlIHdpdGggYW55IHVpYXV0b21hdG9yMi1zcGVjaWZpYyBjb21tYW5kc1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhjb21tYW5kcykpIHtcbiAgQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xufVxuXG5leHBvcnQgeyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyO1xuIl0sImZpbGUiOiJsaWIvZHJpdmVyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|