oxygen-cli 1.20.2 → 1.21.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/build/core/OxygenCore.js +4 -3
- package/build/errors/OxygenError.js +9 -5
- package/build/errors/helper.js +10 -5
- package/build/lib/util.js +5 -2
- package/build/ox_modules/module-db.js +2 -2
- package/build/ox_modules/module-email.js +97 -49
- package/build/ox_modules/module-eyes.js +4 -21
- package/build/ox_modules/module-http.js +148 -62
- package/build/ox_modules/module-mailinator.js +25 -32
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +4 -11
- package/build/ox_modules/module-mob/commands/selectWindow.js +4 -7
- package/build/ox_modules/module-mob/commands/sendKeys.js +2 -2
- package/build/ox_modules/module-mob.js +65 -52
- package/build/ox_modules/module-pdf.js +12 -32
- package/build/ox_modules/module-proxy.js +9 -9
- package/build/ox_modules/module-serial.js +14 -12
- package/build/ox_modules/module-soap.js +113 -77
- package/build/ox_modules/module-twilio.js +27 -27
- package/build/ox_modules/module-utils.js +43 -5
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +24 -0
- package/build/ox_modules/module-web/commands/index.js +25 -1
- package/build/ox_modules/module-web/commands/isSelected.js +2 -2
- package/build/ox_modules/module-web/commands/maximizeWindow.js +24 -0
- package/build/ox_modules/module-web/commands/minimizeWindow.js +24 -0
- package/build/ox_modules/module-web/commands/selectWindow.js +4 -7
- package/build/ox_modules/module-web/commands/waitForNotExist.js +2 -3
- package/build/ox_modules/module-web.js +87 -64
- package/build/ox_modules/utils.js +40 -4
- package/build/ox_services/service-devtools/submodule-network.js +8 -8
- package/build/ox_services/service-devtools.js +3 -3
- package/build/runners/WorkerProcess.js +22 -20
- package/package.json +8 -5
|
@@ -51,8 +51,6 @@ require("source-map-support/register");
|
|
|
51
51
|
|
|
52
52
|
var _chromeHar = require("chrome-har");
|
|
53
53
|
|
|
54
|
-
var _deasync = _interopRequireDefault(require("deasync"));
|
|
55
|
-
|
|
56
54
|
var _url = _interopRequireDefault(require("url"));
|
|
57
55
|
|
|
58
56
|
var wdio = _interopRequireWildcard(require("webdriverio"));
|
|
@@ -300,9 +298,7 @@ class WebModule extends _WebDriverModule.default {
|
|
|
300
298
|
}
|
|
301
299
|
});
|
|
302
300
|
this.reportingClient = new _perfectoReporting.default.Perfecto.PerfectoReportingClient(perfectoExecutionContext);
|
|
303
|
-
this.reportingClient.testStart(name);
|
|
304
|
-
|
|
305
|
-
_deasync.default.sleep(10 * 1000);
|
|
301
|
+
await this.reportingClient.testStart(name);
|
|
306
302
|
}
|
|
307
303
|
} catch (e) {
|
|
308
304
|
throw _helper.default.getSeleniumInitError(e);
|
|
@@ -325,7 +321,8 @@ class WebModule extends _WebDriverModule.default {
|
|
|
325
321
|
await this.driver.maximizeWindow(); // set initial Timeout
|
|
326
322
|
|
|
327
323
|
await this.driver.setTimeout({
|
|
328
|
-
'implicit': this.waitForTimeout
|
|
324
|
+
'implicit': this.waitForTimeout,
|
|
325
|
+
'pageLoad': this.waitForTimeout
|
|
329
326
|
});
|
|
330
327
|
}
|
|
331
328
|
} catch (err) {
|
|
@@ -374,67 +371,17 @@ class WebModule extends _WebDriverModule.default {
|
|
|
374
371
|
await myAccount.updateJob(username, id, body);
|
|
375
372
|
await myAccount.stopJob(username, id);
|
|
376
373
|
} else if (this.driver.provider === _utils.default.provider.LAMBDATEST) {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
accessKey: this.wdioOpts.key
|
|
380
|
-
};
|
|
381
|
-
const sessionId = this.driver.sessionId;
|
|
382
|
-
|
|
383
|
-
const lambdaAutomationClient = _nodeRestClient.default.AutomationClient(lambdaCredentials);
|
|
384
|
-
|
|
385
|
-
const requestBody = {
|
|
386
|
-
status_ind: status === 'PASSED' ? 'passed' : 'failed'
|
|
387
|
-
};
|
|
388
|
-
let done = false;
|
|
389
|
-
lambdaAutomationClient.updateSessionById(sessionId, requestBody, () => {
|
|
390
|
-
done = true;
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
_deasync.default.loopWhile(() => !done);
|
|
374
|
+
await this._sendResultStatusToLambdaTest(status);
|
|
375
|
+
await this.deleteSession();
|
|
394
376
|
} else if (this.driver.provider === _utils.default.provider.TESTINGBOT) {
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
api_key: this.wdioOpts.user,
|
|
398
|
-
api_secret: this.wdioOpts.key
|
|
399
|
-
});
|
|
400
|
-
let done = false;
|
|
401
|
-
const testData = {
|
|
402
|
-
"test[success]": status === 'PASSED' ? "1" : "0"
|
|
403
|
-
};
|
|
404
|
-
tb.updateTest(testData, sessionId, function (error, testDetails) {
|
|
405
|
-
done = true;
|
|
406
|
-
});
|
|
407
|
-
|
|
408
|
-
_deasync.default.loopWhile(() => !done);
|
|
377
|
+
await this._sendResultStatusToTestingBot(status);
|
|
378
|
+
await this.deleteSession();
|
|
409
379
|
} else if (this.driver.provider === _utils.default.provider.PERFECTO) {
|
|
410
|
-
|
|
380
|
+
await this.reportingClient.testStop({
|
|
411
381
|
status: status === 'PASSED' ? _perfectoReporting.default.Constants.results.passed : _perfectoReporting.default.Constants.results.failed
|
|
412
|
-
}); // avoid request abort
|
|
413
|
-
|
|
414
|
-
_deasync.default.sleep(10 * 1000);
|
|
415
|
-
} else if (this.driver.provider === _utils.default.provider.BROWSERSTACK) {
|
|
416
|
-
const requestBody = {
|
|
417
|
-
status: status === 'PASSED' ? 'passed' : 'failed'
|
|
418
|
-
};
|
|
419
|
-
var result = null;
|
|
420
|
-
var options = {
|
|
421
|
-
url: `https://api.browserstack.com/automate/sessions/${this.driver.sessionId}.json`,
|
|
422
|
-
method: 'PUT',
|
|
423
|
-
json: true,
|
|
424
|
-
rejectUnauthorized: false,
|
|
425
|
-
body: requestBody,
|
|
426
|
-
'auth': {
|
|
427
|
-
'user': this.wdioOpts.user,
|
|
428
|
-
'pass': this.wdioOpts.key,
|
|
429
|
-
'sendImmediately': false
|
|
430
|
-
}
|
|
431
|
-
};
|
|
432
|
-
(0, _request.default)(options, (err, res, body) => {
|
|
433
|
-
result = err || res;
|
|
434
382
|
});
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
383
|
+
} else if (this.driver.provider === _utils.default.provider.BROWSERSTACK) {
|
|
384
|
+
await this._sendResultStatusToBrowserstack(status);
|
|
438
385
|
await this.deleteSession();
|
|
439
386
|
}
|
|
440
387
|
|
|
@@ -869,7 +816,83 @@ class WebModule extends _WebDriverModule.default {
|
|
|
869
816
|
}
|
|
870
817
|
}
|
|
871
818
|
|
|
819
|
+
async _sendResultStatusToLambdaTest(status) {
|
|
820
|
+
return new Promise((resolve, reject) => {
|
|
821
|
+
const lambdaCredentials = {
|
|
822
|
+
username: this.wdioOpts.user,
|
|
823
|
+
accessKey: this.wdioOpts.key
|
|
824
|
+
};
|
|
825
|
+
const sessionId = this.driver.sessionId;
|
|
826
|
+
|
|
827
|
+
const lambdaAutomationClient = _nodeRestClient.default.AutomationClient(lambdaCredentials);
|
|
828
|
+
|
|
829
|
+
const requestBody = {
|
|
830
|
+
status_ind: status === 'PASSED' ? 'passed' : 'failed'
|
|
831
|
+
};
|
|
832
|
+
|
|
833
|
+
try {
|
|
834
|
+
lambdaAutomationClient.updateSessionById(sessionId, requestBody, error => {
|
|
835
|
+
resolve();
|
|
836
|
+
});
|
|
837
|
+
} catch (e) {
|
|
838
|
+
this.logger.error('Unable to send result status to LambdaTest: ' + e.toString());
|
|
839
|
+
resolve();
|
|
840
|
+
}
|
|
841
|
+
});
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
async _sendResultStatusToTestingBot(status) {
|
|
845
|
+
return new Promise((resolve, reject) => {
|
|
846
|
+
const sessionId = this.driver.sessionId;
|
|
847
|
+
const tb = new _testingbotApi.default({
|
|
848
|
+
api_key: this.wdioOpts.user,
|
|
849
|
+
api_secret: this.wdioOpts.key
|
|
850
|
+
});
|
|
851
|
+
const testData = {
|
|
852
|
+
"test[success]": status === 'PASSED' ? "1" : "0"
|
|
853
|
+
};
|
|
854
|
+
|
|
855
|
+
try {
|
|
856
|
+
tb.updateTest(testData, sessionId, function (error, testDetails) {
|
|
857
|
+
resolve();
|
|
858
|
+
});
|
|
859
|
+
} catch (e) {
|
|
860
|
+
this.logger.error('Unable to send result status to TestingBot: ' + e.toString());
|
|
861
|
+
resolve();
|
|
862
|
+
}
|
|
863
|
+
});
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
async _sendResultStatusToBrowserstack(status) {
|
|
867
|
+
return new Promise((resolve, reject) => {
|
|
868
|
+
const requestBody = {
|
|
869
|
+
status: status === 'PASSED' ? 'passed' : 'failed'
|
|
870
|
+
};
|
|
871
|
+
const options = {
|
|
872
|
+
url: `https://api.browserstack.com/automate/sessions/${this.driver.sessionId}.json`,
|
|
873
|
+
method: 'PUT',
|
|
874
|
+
json: true,
|
|
875
|
+
rejectUnauthorized: false,
|
|
876
|
+
body: requestBody,
|
|
877
|
+
'auth': {
|
|
878
|
+
'user': this.wdioOpts.user,
|
|
879
|
+
'pass': this.wdioOpts.key,
|
|
880
|
+
'sendImmediately': false
|
|
881
|
+
}
|
|
882
|
+
};
|
|
883
|
+
|
|
884
|
+
try {
|
|
885
|
+
(0, _request.default)(options, (err, res, body) => {
|
|
886
|
+
resolve();
|
|
887
|
+
});
|
|
888
|
+
} catch (e) {
|
|
889
|
+
this.logger.error('Unable to send result status to Browserstack: ' + e.toString());
|
|
890
|
+
resolve();
|
|
891
|
+
}
|
|
892
|
+
});
|
|
893
|
+
}
|
|
894
|
+
|
|
872
895
|
}
|
|
873
896
|
|
|
874
897
|
exports.default = WebModule;
|
|
875
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS13ZWIuanMiXSwibmFtZXMiOlsiTU9EVUxFX05BTUUiLCJERUZBVUxUX1NFTEVOSVVNX1VSTCIsIkRFRkFVTFRfQlJPV1NFUl9OQU1FIiwiTk9fU0NSRUVOU0hPVF9DT01NQU5EUyIsIkFDVElPTl9DT01NQU5EUyIsIkRFRkFVTFRfV0FJVF9USU1FT1VUIiwiV2ViTW9kdWxlIiwiV2ViRHJpdmVyTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwidHJhbnNhY3Rpb25zIiwibGFzdE5hdmlnYXRpb25TdGFydFRpbWUiLCJoZWxwZXJzIiwiX2xvYWRIZWxwZXJGdW5jdGlvbnMiLCJPeEVycm9yIiwiZXJySGVscGVyIiwid2FpdEZvclRpbWVvdXQiLCJuYW1lIiwiZ2V0RHJpdmVyIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiY2FwcyIsImluaXQiLCJzZWxlbml1bVVybCIsImlzSW5pdGlhbGl6ZWQiLCJjdHgiLCJicm93c2VyTmFtZSIsImVycm9yQ29kZSIsIklOVkFMSURfQ0FQQUJJTElUSUVTIiwidG9Mb3dlckNhc2UiLCJyZWNvcmRIQVIiLCJicm93c2VyIiwicGVyZm9ybWFuY2UiLCJ1cmwiLCJVUkwiLCJwYXJzZSIsInByb3RvY29sIiwicmVwbGFjZSIsImhvc3QiLCJob3N0bmFtZSIsInBvcnQiLCJwYXJzZUludCIsInBhdGgiLCJwYXRobmFtZSIsImF1dGgiLCJzcGxpdCIsIndkaW9PcHRzIiwidXNlciIsImtleSIsImNhcGFiaWxpdGllcyIsImxvZ0xldmVsIiwicnVubmVyIiwid2FpdGZvclRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlUaW1lb3V0IiwiY29ubmVjdGlvblJldHJ5Q291bnQiLCJpbml0RXJyb3IiLCJfdGhpcyIsInByb3ZpZGVyIiwibW9kVXRpbHMiLCJkZXRlcm1pbmVQcm92aWRlciIsIlBFUkZFQ1RPIiwib3BlbkRldmljZVRpbWVvdXQiLCJkcml2ZXIiLCJ3ZGlvIiwicmVtb3RlIiwic2VsZW5pdW1Ccm93c2VyVGltZW91dCIsInNlbGVuaXVtVGltZW91dCIsInBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCIsInBlcmZlY3RvUmVwb3J0aW5nIiwiUGVyZmVjdG8iLCJQZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQiLCJ3ZWJkcml2ZXIiLCJleGVjdXRlU2NyaXB0IiwiY29tbWFuZCIsInBhcmFtcyIsImV4ZWN1dGUiLCJyZXBvcnRpbmdDbGllbnQiLCJQZXJmZWN0b1JlcG9ydGluZ0NsaWVudCIsInRlc3RTdGFydCIsImRlYXN5bmMiLCJzbGVlcCIsImUiLCJnZXRTZWxlbml1bUluaXRFcnJvciIsImNvbGxlY3RCcm93c2VyTG9ncyIsImdldEJyb3dzZXJMb2dzIiwiZXJyb3IiLCJMQU1CREFURVNUIiwiQlJPV1NFUlNUQUNLIiwiaW5jbHVkZXMiLCJtYXhpbWl6ZVdpbmRvdyIsInNldFRpbWVvdXQiLCJlcnIiLCJVTktOT1dOX0VSUk9SIiwibWVzc2FnZSIsInV0aWwiLCJpbnNwZWN0IiwiZGlzcG9zZSIsInN0YXR1cyIsIl93aGVuV2ViTW9kdWxlRGlzcG9zZSIsInN0ZXBzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiZmFpbGVkRmluZGVkIiwiZmluZCIsIml0ZW0iLCJ0b1VwcGVyQ2FzZSIsIlNBVUNFTEFCUyIsInVzZXJuYW1lIiwiYWNjZXNzS2V5IiwicGFzc2VkIiwiaWQiLCJzZXNzaW9uSWQiLCJib2R5IiwibXlBY2NvdW50IiwiU2F1Y2VMYWJzIiwidXBkYXRlSm9iIiwic3RvcEpvYiIsImxhbWJkYUNyZWRlbnRpYWxzIiwibGFtYmRhQXV0b21hdGlvbkNsaWVudCIsImxhbWJkYVJlc3RDbGllbnQiLCJBdXRvbWF0aW9uQ2xpZW50IiwicmVxdWVzdEJvZHkiLCJzdGF0dXNfaW5kIiwiZG9uZSIsInVwZGF0ZVNlc3Npb25CeUlkIiwibG9vcFdoaWxlIiwiVEVTVElOR0JPVCIsInRiIiwiVGVzdGluZ0JvdCIsImFwaV9rZXkiLCJhcGlfc2VjcmV0IiwidGVzdERhdGEiLCJ1cGRhdGVUZXN0IiwidGVzdERldGFpbHMiLCJyZXBvcnRpbmdDbGllbnRUZXN0U3RvcFJWIiwidGVzdFN0b3AiLCJDb25zdGFudHMiLCJyZXN1bHRzIiwiZmFpbGVkIiwicmVzdWx0IiwibWV0aG9kIiwianNvbiIsInJlamVjdFVuYXV0aG9yaXplZCIsInJlcyIsImRlbGV0ZVNlc3Npb24iLCJjbG9zZUJyb3dzZXJXaW5kb3dzIiwiZGlzcG9zZUNvbnRpbnVlIiwid2FybiIsInByb21pc2UiLCJzZWxlbml1bVNlc3Npb25UaW1lb3V0Iiwic2VsZW5pdW1QaWQiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJzdGRpbyIsInBncmVwUmVzdWx0IiwidG9TdHJpbmciLCJyZXNvbHZlIiwiX2l0ZXJhdGlvblN0YXJ0IiwiZ2xvYmFsIiwiX2xhc3RUcmFuc2FjdGlvbk5hbWUiLCJfaXRlcmF0aW9uRW5kIiwidHlwZSIsImVycm9ySGVscGVyIiwiU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUIiwibG9ncyIsImxvZyIsInB1c2giLCJfYWRqdXN0QnJvd3NlckxvZyIsIl9nZXRIQVIiLCJoYXIiLCJfaXNBY3Rpb24iLCJfdGFrZVNjcmVlbnNob3RTaWxlbnQiLCJ0YWtlU2NyZWVuc2hvdCIsInJldHZhbCIsImNhbGwiLCJQcm9taXNlIiwicmVqZWN0Iiwid2FpdFVudGlsUmV0VmFsIiwid2FpdFVudGlsIiwiaW1hZ2VzIiwiaGFuZGxlcyIsImdldFdpbmRvd0hhbmRsZXMiLCJoYW5kbGUiLCJzd2l0Y2hUb1dpbmRvdyIsImltYWdlIiwidGl0bGUiLCJnZXRUaXRsZSIsInRleHRUb0ltYWdlIiwicmVxdWlyZSIsInRpdGxlSW1hZ2UiLCJnZW5lcmF0ZSIsImRlYnVnIiwiZm9udEZhbWlseSIsIm1lcmdlZEltYWdlIiwiZGlyZWN0aW9uIiwidGltZW91dCIsInRoZW4iLCJjYXRjaCIsInRpbWUiLCJ0aW1lc3RhbXAiLCJtc2ciLCJsZXZlbCIsInNyYyIsIl9nZXRTdGF0cyIsImNvbW1hbmROYW1lIiwiZmV0Y2hTdGF0cyIsIm5hdmlnYXRpb25TdGFydCIsImRvbUNvbnRlbnRMb2FkZWQiLCJsb2FkIiwic2FtZVBhZ2UiLCJsYXN0RXJyb3IiLCJ0aW1pbmdzIiwid2luZG93IiwidGltaW5nIiwiZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQiLCJsb2FkRXZlbnRTdGFydCIsImV4ZWN1dGVFcnJvciIsImNvbnNvbGUiLCJEb21Db250ZW50TG9hZGVkRXZlbnQiLCJMb2FkRXZlbnQiLCJ0cmFuc2FjdGlvbiIsImNvdW50ZXIiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwic3RhcnRzV2l0aCIsImdldFdkaW9Mb2NhdG9yIiwibWF0Y2hQYXR0ZXJuIiwiZ2V0RWxlbWVudCIsImdldEVsZW1lbnRzIiwiZ2V0Q2hpbGRFbGVtZW50IiwiZ2V0Q2hpbGRFbGVtZW50cyIsInNldFRpbWVvdXRJbXBsaWNpdCIsInJlc3RvcmVUaW1lb3V0SW1wbGljaXQiLCJhc3NlcnRBcmd1bWVudCIsImFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmciLCJhc3NlcnRBcmd1bWVudE51bWJlciIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJhc3NlcnRBcmd1bWVudEJvb2wiLCJhc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCIsImFzc2VydEFyZ3VtZW50VGltZW91dCIsImFzc2VydEFyZ3VtZW50U3RyaW5nIiwidHlwZXMiLCJnZXRMb2dUeXBlcyIsImdldExvZ3MiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJldmVudHMiLCJtc2dPYmoiLCJjaGVja1dhaXRGb3JBbmd1bGFyIiwiYXV0b1dhaXRGb3JBbmd1bGFyIiwid2FpdEZvckFuZ3VsYXIiLCJhdXRvV2FpdEZvckFuZ3VsYXJSb290U2VsZWN0b3IiLCJhdXRvV2FpdEZvckFuZ3VsYXJUaW1lb3V0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQTtBQUNBO0FBQ0E7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dXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXHJcbi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG4vKipcclxuICogQG5hbWUgd2ViXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciBicm93c2VyIGF1dG9tYXRpb24uXHJcbiAqIEBzYW1wbGUgKipOb3RlczoqKiAgXHJcbiAqICAgXHJcbiAqIENvbW1hbmRzIHdoaWNoIG9wZXJhdGUgb24gZWxlbWVudHMgc3VjaCBhcyBjbGljaywgYXNzZXJ0LCB3YWl0Rm9yLCB0eXBlLCBzZWxlY3QsIGFuZCBvdGhlcnMgd2lsbCBhdXRvbWF0aWNhbGx5IHdhaXQgZm9yIGEgcGVyaW9kIG9mIHRpbWUgZm9yIHRoZSBlbGVtZW50IHRvIGFwcGVhciBpbiBET00gYW5kIGJlY29tZSB2aXNpYmxlLiBCeSBkZWZhdWx0IHRoaXMgcGVyaW9kIGVxdWFscyB0byA2MCBzZWNvbmRzLCBidXQgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlIGBzZXRUaW1lb3V0YGNvbW1hbmQuXHJcbiAqICAgXHJcbiAqICoqU3RyaW5nIG1hdGNoaW5nIHBhdHRlcm5zOioqIFxyXG4gKiBcclxuICogIENvbW1hbmRzIHdoaWNoIGV4cGVjdCBhIHN0cmluZyBtYXRjaGluZyBwYXR0ZXJuIGluIHRoZWlyIGFyZ3VtZW50cywgc3VwcG9ydCBmb2xsb3dpbmcgcGF0dGVybnMgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2U6XHJcbiAqIFxyXG4gKiAgKiBgcmVnZXg6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAqICAqIGByZWdleGk6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyBjYXNlLWluc2Vuc2l0aXZlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuICogICogYGV4YWN0OlNUUklOR2AgLSBNYXRjaCB0aGUgc3RyaW5nIHZlcmJhdGltLlxyXG4gKiAgKiBgZ2xvYjpQQVRURVJOYCAtIE1hdGNoIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgZ2xvYiBwYXR0ZXJuLiBgP2Agd2lsbCBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgbmV3IGxpbmUgXFwoXFxuXFwpLiBgKmAgd2lsbCBtYXRjaCBhbnkgc2VxdWVuY2UgXFwoMCBvciBtb3JlXFwpIG9mIGNoYXJhY3RlcnMgZXhjZXB0IG5ldyBsaW5lLiBFbXB0eSAgICAgUEFUVEVSTiB3aWxsIG1hdGNoIG9ubHkgb3RoZXIgZW1wdHkgc3RyaW5ncy5cclxuICogICogYFBBVFRFUk5gIC0gU2FtZSBhcyBnbG9iIG1hdGNoaW5nLiAgXHJcbiAqXHJcbiAqICoqTG9jYXRvcnM6KiogXHJcbiAqIFxyXG4gKiAgQ29tbWFuZHMgd2hpY2ggZXhwZWN0IGFuIGVsZW1lbnQgbG9jYXRvciBpbiB0aGVpciBhcmd1bWVudHMsIHN1cHBvcnQgZm9sbG93aW5nIGxvY2F0b3IgdHlwZXMgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2U6XHJcbiAqIFxyXG4gKiAgKiBgaWQ9SURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBJRCBhdHRyaWJ1dGUuXHJcbiAqICAqIGBjc3M9Q1NTX1NFTEVDVE9SYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhIENTUyBzZWxlY3Rvci5cclxuICogICogYGxpbms9VEVYVGAgLSBMb2NhdGVzIGxpbmsgZWxlbWVudCB3aG9zZSB2aXNpYmxlIHRleHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKiAgKiBgbGluay1jb250YWlucz1URVhUYCAtIExvY2F0ZXMgbGluayBlbGVtZW50IHdob3NlIHZpc2libGUgdGV4dCBjb250YWlucyB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKiAgKiBgbmFtZT1OQU1FYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgTkFNRSBhdHRyaWJ1dGUuXHJcbiAqICAqIGB0YWc9TkFNRWAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIHRhZyBuYW1lLlxyXG4gKiAgKiBgL1hQQVRIYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhbiBYUGF0aCAxLjAgZXhwcmVzc2lvbi5cclxuICogICogYChYUEFUSClbXWAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqL1xyXG5cclxuLyogZXNsaW50LWRpc2FibGUgcXVvdGVzICovXHJcbmltcG9ydCB7IGhhckZyb21NZXNzYWdlcyB9IGZyb20gJ2Nocm9tZS1oYXInO1xyXG5pbXBvcnQgZGVhc3luYyBmcm9tICdkZWFzeW5jJztcclxuaW1wb3J0IFVSTCBmcm9tICd1cmwnO1xyXG5pbXBvcnQgKiBhcyB3ZGlvIGZyb20gJ3dlYmRyaXZlcmlvJztcclxuaW1wb3J0IFdlYkRyaXZlck1vZHVsZSBmcm9tICcuLi9jb3JlL1dlYkRyaXZlck1vZHVsZSc7XHJcbmltcG9ydCB7IGRlZmVyIH0gZnJvbSAnd2hlbic7XHJcbmltcG9ydCBtb2RVdGlscyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCc7XHJcbmltcG9ydCBTYXVjZUxhYnMgZnJvbSAnc2F1Y2VsYWJzJztcclxuaW1wb3J0IGxhbWJkYVJlc3RDbGllbnQgZnJvbSAnQGxhbWJkYXRlc3Qvbm9kZS1yZXN0LWNsaWVudCc7XHJcbmltcG9ydCBUZXN0aW5nQm90IGZyb20gJ3Rlc3Rpbmdib3QtYXBpJztcclxuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcclxuaW1wb3J0IHBlcmZlY3RvUmVwb3J0aW5nIGZyb20gJ3BlcmZlY3RvLXJlcG9ydGluZyc7XHJcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3JlcXVlc3QnO1xyXG5pbXBvcnQgbWVyZ2VJbWFnZXMgZnJvbSAnLi4vbGliL2ltZy1tZXJnZSc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuXHJcbmNvbnN0IE1PRFVMRV9OQU1FID0gJ3dlYic7XHJcbmNvbnN0IERFRkFVTFRfU0VMRU5JVU1fVVJMID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6NDQ0NC93ZC9odWInO1xyXG5jb25zdCBERUZBVUxUX0JST1dTRVJfTkFNRSA9ICdjaHJvbWUnO1xyXG5jb25zdCBOT19TQ1JFRU5TSE9UX0NPTU1BTkRTID0gWydpbml0JywgJ2Fzc2VydEFsZXJ0J107XHJcbmNvbnN0IEFDVElPTl9DT01NQU5EUyA9IFsnb3BlbicsICdjbGljayddO1xyXG5jb25zdCBERUZBVUxUX1dBSVRfVElNRU9VVCA9IDYwICogMTAwMDsgICAgICAgICAgICAvLyBkZWZhdWx0IDYwcyB3YWl0IHRpbWVvdXRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYk1vZHVsZSBleHRlbmRzIFdlYkRyaXZlck1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHt9OyAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbi0+aGFyIGRpY3Rpb25hcnlcclxuICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMgPSB7fTtcclxuICAgICAgICB0aGlzLl9sb2FkSGVscGVyRnVuY3Rpb25zKCk7XHJcbiAgICAgICAgLy8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IChzb21lIG1vZHVsZSBjb21tYW5kcyBtaWdodCByZWZlciB0byB0aGlzLk94RXJyb3IgYW5kIHRoaXMuZXJySGVscGVyKVxyXG4gICAgICAgIHRoaXMuT3hFcnJvciA9IE94RXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJIZWxwZXIgPSBlcnJIZWxwZXI7XHJcbiAgICAgICAgLy8gaG9sZHMgZWxlbWVudCBvcGVyYXRpb24gdGltZW91dCB2YWx1ZVxyXG4gICAgICAgIHRoaXMud2FpdEZvclRpbWVvdXQgPSBERUZBVUxUX1dBSVRfVElNRU9VVDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gTU9EVUxFX05BTUU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0RHJpdmVyXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIFdESU8gZHJpdmVyLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBXRElPIGRyaXZlci5cclxuICAgICAqL1xyXG4gICAgZ2V0RHJpdmVyKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXREcml2ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXRDYXBhYmlsaXRpZXNcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgY3VycmVudGx5IGRlZmluZWQgY2FwYWJpbGl0aWVzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldENhcGFiaWxpdGllcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYXBzIHx8IHN1cGVyLmdldENhcGFiaWxpdGllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIG5ldyBTZWxlbml1bSBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjYXBzIC0gRGVzaXJlZCBjYXBhYmlsaXRpZXMuIElmIG5vdCBzcGVjaWZpZWQgY2FwYWJpbGl0aWVzIHdpbGwgYmUgdGFrZW4gZnJvbSBzdWl0ZSBkZWZpbml0aW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBzZWxlbml1bVVybCAtIFJlbW90ZSBzZXJ2ZXIgVVJMIChkZWZhdWx0OiBodHRwOi8vbG9jYWxob3N0OjQ0NDQvd2QvaHViKS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgaW5pdChjYXBzLCBzZWxlbml1bVVybCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlbml1bVVybCkge1xyXG4gICAgICAgICAgICBzZWxlbml1bVVybCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bVVybCB8fCBERUZBVUxUX1NFTEVOSVVNX1VSTDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRha2UgY2FwYWJpbGl0aWVzIGVpdGhlciBmcm9tIGluaXQgbWV0aG9kIGFyZ3VtZW50IG9yIGZyb20gY29udGV4dCBwYXJhbWV0ZXJzIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3JcclxuICAgICAgICAvLyBtZXJnZSBjYXBhYmlsaXRpZXMgZnJvbSBjb250ZXh0IGFuZCBmcm9tIGluaXQgZnVuY3Rpb24gYXJndW1lbnQsIGdpdmUgcHJlZmVyZW5jZSB0byBjb250ZXh0LXBhc3NlZCBjYXBhYmlsaXRpZXNcclxuICAgICAgICB0aGlzLmNhcHMgPSB7fTtcclxuICAgICAgICBpZiAodGhpcy5jdHguY2Fwcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMgPSB7IC4uLnRoaXMuY3R4LmNhcHMgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNhcHMpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzID0geyAuLi50aGlzLmNhcHMsIC4uLmNhcHMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHBvcHVsYXRlIGJyb3dzZXJOYW1lIGNhcHMgZnJvbSBvcHRpb25zLiBGSVhNRTogd2h5IGlzIHRoaXMgZXZlbiBuZWVkZWQ/XHJcbiAgICAgICAgaWYgKCF0aGlzLmNhcHMuYnJvd3Nlck5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lIHx8IERFRkFVTFRfQlJPV1NFUl9OQU1FO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBGSVhNRTogc2hhbGwgd2UgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGJyb3dzZXJOYW1lIGlzIG5vdCBzcGVjaWZpZWQsIG5laXRoZXIgaW4gY2FwcyBub3IgaW4gb3B0aW9ucz8hXHJcbiAgICAgICAgaWYgKCF0aGlzLmNhcHMuYnJvd3Nlck5hbWUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5JTlZBTElEX0NBUEFCSUxJVElFUyxcclxuICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBgd2ViYCBtb2R1bGUgLSBicm93c2VyTmFtZSBtdXN0IGJlIHNwZWNpZmllZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGFkanVzdCBicm93c2VyTmFtZS1zXHJcbiAgICAgICAgaWYgKHRoaXMuY2Fwcy5icm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaWUnKSB7XHJcbiAgICAgICAgICAgIC8vIElFIGlzIHNwZWNpZmllZCBhcyAnaWUnIHRocm91Z2ggdGhlIGNvbW1hbmQgbGluZSBhbmQgcG9zc2libHkgc3VpdGVzXHJcbiAgICAgICAgICAgIC8vIGJ1dCBzZWxlbml1bSBzdGFuZGFsb25lIHNlcnZlciBleHBlY3RzICdpbnRlcm5ldCBleHBsb3JlcidcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gJ2ludGVybmV0IGV4cGxvcmVyJztcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2Fwc1snbGFtYmRhOm9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICAvLyBsYW1iZGF0ZXN0IGV4cGVjdHMgb3JpZ2luYWwgY2FzZSBuYW1lc1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXBzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgLy8gcGVyZmVjdG9Nb2JpbGUgZXhwZWN0cyBvcmlnaW5hbCBjYXNlIG5hbWVzXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUgIT09ICdNaWNyb3NvZnRFZGdlJykge1xyXG4gICAgICAgICAgICAvLyBzZWxlbml1bSBzdGFuZGFsb25lIHNlcnZlciBleHBlY3RzIGFsbCBicm93c2VyTmFtZXMgdG8gYmUgbG93ZXJjYXNlXHJcbiAgICAgICAgICAgIC8vIGV4Y2VwdCBcIk1pY3Jvc29mdEVkZ2VcIlxyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPSB0aGlzLmNhcHMuYnJvd3Nlck5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGFkanVzdCBjYXBhYmlsaXRpZXMgdG8gZW5hYmxlIGNvbGxlY3RpbmcgYnJvd3NlciBhbmQgcGVyZm9ybWFuY2Ugc3RhdHMgaW4gQ2hyb21lIFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVjb3JkSEFSICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzWydnb29nOmxvZ2dpbmdQcmVmcyddID0geyAgICAgLy8gZm9yIENocm9tZURyaXZlciA+PSA3NVxyXG4gICAgICAgICAgICAgICAgYnJvd3NlcjogJ0FMTCcsXHJcbiAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZTogJ0FMTCdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgLy8gc3BlY2lmeWluZyB0aGlzIGxlYWRzIENocm9tZSA3NysgdG8gcmVmdXNlIGxvYWRpbmdcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmxvZ2dpbmdQcmVmcyA9IHsgICAgICAgICAgICAgLy8gZm9yIENocm9tZURyaXZlciA8IDc1XHJcbiAgICAgICAgICAgICAgICBicm93c2VyOiAnQUxMJyxcclxuICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlOiAnQUxMJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuY2hyb21lT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIHBlcmZMb2dnaW5nUHJlZnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVOZXR3b3JrOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZVBhZ2U6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb3B1bGF0ZSBXRElPIG9wdGlvbnNcclxuICAgICAgICBjb25zdCB1cmwgPSBVUkwucGFyc2Uoc2VsZW5pdW1VcmwgfHwgREVGQVVMVF9TRUxFTklVTV9VUkwpO1xyXG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpO1xyXG4gICAgICAgIGNvbnN0IGhvc3QgPSB1cmwuaG9zdG5hbWU7XHJcbiAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHVybC5wb3J0IHx8IChwcm90b2NvbCA9PT0gJ2h0dHBzJyA/IDQ0MyA6IDgwKSk7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHVybC5wYXRobmFtZTtcclxuXHJcbiAgICAgICAgLy8gYXV0aCBpcyBuZWVkZWQgbW9zdGx5IGZvciBjbG91ZCBwcm92aWRlcnMgc3VjaCBhcyBMYW1iZGFUZXN0XHJcbiAgICAgICAgaWYgKHVybC5hdXRoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF1dGggPSB1cmwuYXV0aC5zcGxpdCgnOicpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMud2Rpb09wdHMgPSB7XHJcbiAgICAgICAgICAgICAgICB1c2VyOiBhdXRoWzBdLFxyXG4gICAgICAgICAgICAgICAga2V5OiBhdXRoWzFdXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB3ZGlvT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5vcHRpb25zLndkaW9PcHRzIHx8IHt9LFxyXG4gICAgICAgICAgICBwcm90b2NvbDogcHJvdG9jb2wsXHJcbiAgICAgICAgICAgIGhvc3RuYW1lOiBob3N0LFxyXG4gICAgICAgICAgICBwb3J0OiBwb3J0LFxyXG4gICAgICAgICAgICBwYXRoOiBwYXRoLFxyXG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IHRoaXMuY2FwcyxcclxuICAgICAgICAgICAgbG9nTGV2ZWw6ICdzaWxlbnQnLFxyXG4gICAgICAgICAgICBydW5uZXI6ICdyZXBsJyxcclxuICAgICAgICAgICAgd2FpdGZvclRpbWVvdXQ6IDUwMDAsIC8vIGluY3JlYXNlIHRoZSBkZWZhdWx0IDMwMDBcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogMzEwKjEwMDAsXHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiAxXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IGluaXRFcnJvciA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBsZXQgcHJvdmlkZXIgPSBtb2RVdGlscy5kZXRlcm1pbmVQcm92aWRlcih3ZGlvT3B0cyk7XHJcblxyXG4gICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgd2Rpb09wdHMucGF0aCA9ICcvbmV4cGVyaWVuY2UvcGVyZmVjdG9tb2JpbGUvd2QvaHViJztcclxuICAgICAgICAgICAgd2Rpb09wdHMucG9ydCA9IDgwO1xyXG4gICAgICAgICAgICB3ZGlvT3B0cy5wcm90b2NvbCA9ICdodHRwJztcclxuICAgICAgICAgICAgd2Rpb09wdHMub3BlbkRldmljZVRpbWVvdXQgPSAxNTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuYW1lID0gJ25hbWUnO1xyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXVsnbmFtZSddKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2xhbWJkYTpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snbGFtYmRhOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ11bJ25hbWUnXTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2Jyb3dzZXJzdGFjazpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydicm93c2Vyc3RhY2s6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnJvd3NlcnN0YWNrOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydicm93c2Vyc3RhY2s6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy53ZGlvT3B0cyA9IHdkaW9PcHRzO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmRyaXZlciA9IGF3YWl0IHdkaW8ucmVtb3RlKHdkaW9PcHRzKTtcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIucHJvdmlkZXIgPSBwcm92aWRlcjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1Ccm93c2VyVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuc2VsZW5pdW1Ccm93c2VyVGltZW91dCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVuaXVtVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuc2VsZW5pdW1UaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtVGltZW91dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUTykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGVyZmVjdG9FeGVjdXRpb25Db250ZXh0ID0gYXdhaXQgbmV3IHBlcmZlY3RvUmVwb3J0aW5nLlBlcmZlY3RvLlBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgd2ViZHJpdmVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTY3JpcHQ6IGFzeW5jIChjb21tYW5kLCBwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRyaXZlci5leGVjdXRlKGNvbW1hbmQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0aW5nQ2xpZW50ID0gbmV3IHBlcmZlY3RvUmVwb3J0aW5nLlBlcmZlY3RvLlBlcmZlY3RvUmVwb3J0aW5nQ2xpZW50KHBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydGluZ0NsaWVudC50ZXN0U3RhcnQobmFtZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gYXZvaWQgcmVxdWVzdCBhYm9ydFxyXG4gICAgICAgICAgICAgICAgZGVhc3luYy5zbGVlcCgxMCoxMDAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJIZWxwZXIuZ2V0U2VsZW5pdW1Jbml0RXJyb3IoZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZXNldCBicm93c2VyIGxvZ3MgaWYgYXV0byBjb2xsZWN0IGxvZ3Mgb3B0aW9uIGlzIGVuYWJsZWRcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3RCcm93c2VyTG9ncyAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzaW1wbHkgY2FsbCB0aGlzIHRvIGNsZWFyIHRoZSBwcmV2aW91cyBsb2dzIGFuZCBzdGFydCB0aGUgdGVzdCB3aXRoIHRoZSBjbGVhbiBsb2dzXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldEJyb3dzZXJMb2dzKCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgcmV0cmlldmUgYnJvd3NlciBsb2dzLicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBbbW9kVXRpbHMucHJvdmlkZXIuTEFNQkRBVEVTVCwgbW9kVXRpbHMucHJvdmlkZXIuQlJPV1NFUlNUQUNLLCBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUT10uaW5jbHVkZXModGhpcy5kcml2ZXIucHJvdmlkZXIpICYmXHJcbiAgICAgICAgICAgICAgICBbJ01pY3Jvc29mdEVkZ2UnLCAnbXNlZGdlJywgJ0VkZ2UnLCAnSW50ZXJuZXQgRXhwbG9yZXInXS5pbmNsdWRlcyh0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBtYXhpbWl6ZSBicm93c2VyIHdpbmRvd1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIubWF4aW1pemVXaW5kb3coKTtcclxuICAgICAgICAgICAgICAgIC8vIHNldCBpbml0aWFsIFRpbWVvdXRcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAnaW1wbGljaXQnOiB0aGlzLndhaXRGb3JUaW1lb3V0IH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlVOS05PV05fRVJST1IsIGVyci5tZXNzYWdlLCB1dGlsLmluc3BlY3QoZXJyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN1cGVyLmluaXQodGhpcy5kcml2ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGRpc3Bvc2VcclxuICAgICAqIEBzdW1tYXJ5IEVuZHMgdGhlIGN1cnJlbnQgc2Vzc2lvbi5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gc3RhdHVzIC0gVGVzdCBzdGF0dXMsIGVpdGhlciBgcGFzc2VkYCBvciBgZmFpbGVkYC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMpIHtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3doZW5XZWJNb2R1bGVEaXNwb3NlID0gZGVmZXIoKTtcclxuXHJcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcclxuICAgICAgICAgICAgc3RhdHVzID0gJ3Bhc3NlZCc7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5ycy5zdGVwcyAmJiBBcnJheS5pc0FycmF5KHRoaXMucnMuc3RlcHMpICYmIHRoaXMucnMuc3RlcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmFpbGVkRmluZGVkID0gdGhpcy5ycy5zdGVwcy5maW5kKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZhaWxlZEZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kcml2ZXIgJiYgdGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXMudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlNBVUNFTEFCUykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3NhdWNlOm9wdGlvbnMnXVsndXNlcm5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NLZXkgPSB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snc2F1Y2U6b3B0aW9ucyddWydhY2Nlc3NLZXknXTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXNzZWQgPSBzdGF0dXMgPT09ICdQQVNTRUQnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5kcml2ZXIuc2Vzc2lvbklkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBcIntcXFwicGFzc2VkXFxcIjpcIitwYXNzZWQrXCJ9XCI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG15QWNjb3VudCA9IG5ldyBTYXVjZUxhYnMoeyB1c2VyOiB1c2VybmFtZSwga2V5OiBhY2Nlc3NLZXl9KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBteUFjY291bnQudXBkYXRlSm9iKHVzZXJuYW1lLCBpZCwgYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbXlBY2NvdW50LnN0b3BKb2IodXNlcm5hbWUsIGlkKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLkxBTUJEQVRFU1QpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYW1iZGFDcmVkZW50aWFscyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzS2V5OiB0aGlzLndkaW9PcHRzLmtleVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFtYmRhQXV0b21hdGlvbkNsaWVudCA9IGxhbWJkYVJlc3RDbGllbnQuQXV0b21hdGlvbkNsaWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhQ3JlZGVudGlhbHNcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2luZDogc3RhdHVzID09PSAnUEFTU0VEJyA/ICdwYXNzZWQnIDogJ2ZhaWxlZCdcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsYW1iZGFBdXRvbWF0aW9uQ2xpZW50LnVwZGF0ZVNlc3Npb25CeUlkKHNlc3Npb25JZCwgcmVxdWVzdEJvZHksICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFkb25lKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlRFU1RJTkdCT1QpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSB0aGlzLmRyaXZlci5zZXNzaW9uSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGIgPSBuZXcgVGVzdGluZ0JvdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwaV9rZXk6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBpX3NlY3JldDogdGhpcy53ZGlvT3B0cy5rZXlcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3REYXRhID0geyBcInRlc3Rbc3VjY2Vzc11cIiA6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgPyBcIjFcIiA6IFwiMFwiIH07XHJcbiAgICAgICAgICAgICAgICAgICAgdGIudXBkYXRlVGVzdCh0ZXN0RGF0YSwgc2Vzc2lvbklkLCBmdW5jdGlvbihlcnJvciwgdGVzdERldGFpbHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIWRvbmUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBvcnRpbmdDbGllbnRUZXN0U3RvcFJWID0gYXdhaXQgdGhpcy5yZXBvcnRpbmdDbGllbnQudGVzdFN0b3Aoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5wYXNzZWQgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5mYWlsZWRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCByZXF1ZXN0IGFib3J0XHJcbiAgICAgICAgICAgICAgICAgICAgZGVhc3luYy5zbGVlcCgxMCoxMDAwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLkJST1dTRVJTVEFDSykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgPyAncGFzc2VkJyA6ICdmYWlsZWQnXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogYGh0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0Qm9keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dGgnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcic6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXNzJzogdGhpcy53ZGlvT3B0cy5rZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZEltbWVkaWF0ZWx5JzogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0KG9wdGlvbnMsIChlcnIsIHJlcywgYm9keSkgPT4geyByZXN1bHQgPSBlcnIgfHwgcmVzOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICBkZWFzeW5jLmxvb3BXaGlsZSgoKSA9PiAhcmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG51bGwgJiYgWydQQVNTRUQnLCdGQUlMRUQnXS5pbmNsdWRlcyhzdGF0dXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbG9zZUJyb3dzZXJXaW5kb3dzKHN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbmNlbGVkIG9yIG90aGVyIHN0YXR1c1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcG9zZUNvbnRpbnVlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0Vycm9yIGRpc3Bvc2luZyBkcml2ZXI6ICcsIGUpOyAgICAvLyBpZ25vcmUgYW55IGVycm9ycyBhdCBkaXNwb3NhbCBzdGFnZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl93aGVuV2ViTW9kdWxlRGlzcG9zZS5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZVNlc3Npb24oKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyICYmIHRoaXMuZHJpdmVyLmRlbGV0ZVNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGVTZXNzaW9uIHdpbGwgdGFrZSA1IG1pbiB0byBjYWxsXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2RlbGV0ZVNlc3Npb24gZXJyb3InLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyV2luZG93cyhzdGF0dXMpIHtcclxuICAgICAgICBpZiAoc3RhdHVzICYmICdGQUlMRUQnID09PSBzdGF0dXMudG9VcHBlckNhc2UoKSAmJiB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnNlbGVuaXVtUGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZUNvbnRpbnVlKHN0YXR1cyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdGYWlsZWQgdG8gY2xvc2UgYnJvd3NlciB3aW5kb3dzOicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZUNvbnRpbnVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRpc3Bvc2VDb250aW51ZShzdGF0dXMpIHtcclxuICAgICAgICB0aGlzLmRyaXZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG5cclxuICAgICAgICAvLyBjbGVhbnVwIGNocm9tZWRyaXZlcidzIG9ubHkgd2hlbiBydW5uaW5nIGZyb20gd2l0aGluIHRoZSBJREUgYW5kIHRlc3QgZGlkIG5vdCBmYWlsXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc2VsZW5pdW1QaWQgJiYgKCFzdGF0dXMgfHwgJ0ZBSUxFRCcgIT09IHN0YXR1cy50b1VwcGVyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcclxuICAgICAgICAgICAgICAgICAgICBleGVjU3luYygndGFza2tpbGwgL0lNIGNocm9tZWRyaXZlci5leGUgL0YnLCB7IHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ10gfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwZ3JlcFJlc3VsdCA9IGV4ZWNTeW5jKFwicGdyZXAgLWQnICcgY2hyb21lZHJpdmVyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwZ3JlcFJlc3VsdCAmJiBwZ3JlcFJlc3VsdC50b1N0cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZ3JlcFJlc3VsdCA9IHBncmVwUmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZ3JlcFJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ2tpbGwgLTkgJyArIHBncmVwUmVzdWx0LCB7IHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ10gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2xlYW51cCBlZGdlZHJpdmVyJ3Mgb25seSB3aGVuIHJ1bm5pbmcgZnJvbSB3aXRoaW4gdGhlIElERSBhbmQgdGVzdCBkaWQgbm90IGZhaWxcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zZWxlbml1bVBpZCAmJiAoIXN0YXR1cyB8fCAnRkFJTEVEJyAhPT0gc3RhdHVzLnRvVXBwZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBmb3Igbm93XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwZ3JlcFJlc3VsdCA9IGV4ZWNTeW5jKFwicGdyZXAgLWQnICcgbXNlZGdlZHJpdmVyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwZ3JlcFJlc3VsdCAmJiBwZ3JlcFJlc3VsdC50b1N0cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZ3JlcFJlc3VsdCA9IHBncmVwUmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZ3JlcFJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ2tpbGwgLTkgJyArIHBncmVwUmVzdWx0LCB7IHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ10gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd2hlbldlYk1vZHVsZURpc3Bvc2UucmVzb2x2ZShudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBfaXRlcmF0aW9uU3RhcnQoKSB7XHJcbiAgICAgICAgLy8gY2xlYXIgdHJhbnNhY3Rpb24gbmFtZSBzYXZlZCBpbiBwcmV2aW91cyBpdGVyYXRpb24gaWYgYW55XHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaXRlcmF0aW9uRW5kKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnR5cGUgPT09IGVycm9ySGVscGVyLmVycm9yQ29kZS5TRUxFTklVTV9TRVNTSU9OX1RJTUVPVVQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb2xsZWN0IGJyb3dzZXIgbG9ncyBmb3IgdGhpcyBzZXNzaW9uXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0QnJvd3NlckxvZ3MgPT09IHRydWUgJiYgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID09PSAnY2hyb21lJykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9ncyA9IGF3YWl0IHRoaXMuZ2V0QnJvd3NlckxvZ3MoKTtcclxuICAgICAgICAgICAgICAgIGlmIChsb2dzICYmIEFycmF5LmlzQXJyYXkobG9ncykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsb2cgb2YgbG9ncykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJzLmxvZ3MucHVzaCh0aGlzLl9hZGp1c3RCcm93c2VyTG9nKGxvZykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBicm93c2VyIGxvZ3MuJywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETzogc2hvdWxkIGNsZWFyIHRyYW5zYWN0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGUgbmFtZXMgYWNyb3NzIGl0ZXJhdGlvbnNcclxuICAgICAgICAvLyBhbHNvIHNob3VsZCB0aHJvdyBvbiBkdXBsaWNhdGUgbmFtZXMuXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWNvcmRIQVIgJiYgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID09PSAnY2hyb21lJykge1xyXG4gICAgICAgICAgICAvLyB0aGVyZSBtaWdodCBiZSBubyB0cmFuc2FjdGlvbnMgc2V0IGlmIHRlc3QgZmFpbHMgYmVmb3JlIHdlYi50cmFuc2FjdGlvbiBjb21tYW5kXHJcbiAgICAgICAgICAgIGlmIChnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zW2dsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZV0gPSBhd2FpdCB0aGlzLl9nZXRIQVIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ycy5oYXIgPSB0aGlzLnRyYW5zYWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBfaXNBY3Rpb24obmFtZSkge1xyXG4gICAgICAgIHJldHVybiBBQ1RJT05fQ09NTUFORFMuaW5jbHVkZXMobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Rha2VTY3JlZW5zaG90U2lsZW50KG5hbWUpIHtcclxuICAgICAgICBpZiAoIU5PX1NDUkVFTlNIT1RfQ09NTUFORFMuaW5jbHVkZXMobmFtZSkpIHtcclxuICAgICAgICAgICAgbGV0IGVycm9yO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIudGFrZVNjcmVlbnNob3RcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXR2YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FsbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0VW50aWxSZXRWYWwgPSB0aGlzLmRyaXZlci53YWl0VW50aWwoYXN5bmMoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltYWdlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgKHNjcmVlbnNob3QgYW5kIHRpdGxlKSBpbWFnZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlcyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldFdpbmRvd0hhbmRsZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShoYW5kbGVzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGUgb2YgaGFuZGxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnN3aXRjaFRvV2luZG93KGhhbmRsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLmRyaXZlci50YWtlU2NyZWVuc2hvdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0VGl0bGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRUb0ltYWdlID0gcmVxdWlyZSgndGV4dC10by1pbWFnZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGVJbWFnZSA9IGF3YWl0IHRleHRUb0ltYWdlLmdlbmVyYXRlKHRpdGxlLCB7IGRlYnVnOiBmYWxzZSwgZm9udEZhbWlseTogJ0FyaWFsJyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlSW1hZ2UgJiYgdHlwZW9mIHRpdGxlSW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUltYWdlID0gdGl0bGVJbWFnZS5yZXBsYWNlKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2godGl0bGVJbWFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKGltYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGltYWdlcyBpbnRvIG9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRJbWFnZSA9IGF3YWl0IG1lcmdlSW1hZ2VzKGltYWdlcywgeyBkaXJlY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZWRJbWFnZSAmJiB0eXBlb2YgbWVyZ2VkSW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBtZXJnZWRJbWFnZS5yZXBsYWNlKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0aW1lb3V0OiAzMCoxMDAwIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0VW50aWxSZXRWYWwgJiYgd2FpdFVudGlsUmV0VmFsLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0VW50aWxSZXRWYWwudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCcsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QnLCBlKTtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QgaW5uZXIgZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfYWRqdXN0QnJvd3NlckxvZyhsb2cpIHtcclxuICAgICAgICBpZiAoIWxvZyB8fCB0eXBlb2YgbG9nICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETzogY29udmVydCBsb2cudGltZXN0YW1wIGZyb20gdGhlIGJyb3dzZXIgdGltZSB6b25lIHRvIHRoZSBsb2NhbCBvbmUgKHNvIHdlIGNhbiBsYXRlciBjb3JyZWxhdGUgYmV0d2VlbiBzdGVwcyBhbmQgbG9ncylcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aW1lOiBsb2cudGltZXN0YW1wLFxyXG4gICAgICAgICAgICBtc2c6IGxvZy5tZXNzYWdlLFxyXG4gICAgICAgICAgICAvLyBjb252ZXJ0IFNFVkVSRSBsb2cgbGV2ZWwgdG8gRVJST1JcclxuICAgICAgICAgICAgbGV2ZWw6IGxvZy5sZXZlbCA9PT0gJ1NFVkVSRScgPyAnRVJST1InIDogbG9nLmxldmVsLFxyXG4gICAgICAgICAgICBzcmM6ICdicm93c2VyJ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIEZJWE1FOiBUaGVyZSBpcyBhIGJ1ZyB3aXRoIElFLiBTZWUgdGhlIGNvbW1lbnQgd2l0aGluIGZ1bmN0aW9uIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogIGRvbUNvbnRlbnRMb2FkZWQgKGFrYSBGaXJzdCBWaXN1YWwgVGltZSktIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCBhbmQgbmF2aWdhdGlvblN0YXJ0LlxyXG4gICAgICogIGxvYWQgKGFrYSBGdWxsIExvYWQgVGltZSkgICAgICAgICAgICAgICAtIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBsb2FkRXZlbnRTdGFydCBhbmQgbmF2aWdhdGlvblN0YXJ0LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBwcm9jZXNzaW5nIG1vZGVsOlxyXG4gICAgICpcclxuICAgICAqICAxLiBuYXZpZ2F0aW9uU3RhcnQgICAgICAgICAgICAgIC0gVGhlIGJyb3dzZXIgaGFzIHJlcXVlc3RlZCB0aGUgZG9jdW1lbnQuXHJcbiAgICAgKiAgMi4gLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAtIE5vdCByZWxldmFudCB0byB1cy4gU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL25hdmlnYXRpb24tdGltaW5nLyNwcm9jZXNzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gICAgICogIDMuIGRvbUxvYWRpbmcgICAgICAgICAgICAgICAgICAgLSBUaGUgYnJvd3NlciBzdGFydHMgcGFyc2luZyB0aGUgZG9jdW1lbnQuXHJcbiAgICAgKiAgNC4gZG9tSW50ZXJhY3RpdmUgICAgICAgICAgICAgICAtIFRoZSBicm93c2VyIGhhcyBmaW5pc2hlZCBwYXJzaW5nIHRoZSBkb2N1bWVudCBhbmQgdGhlIHVzZXIgY2FuIGludGVyYWN0IHdpdGggdGhlIHBhZ2UuXHJcbiAgICAgKiAgNS4gZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgICAtIFRoZSBkb2N1bWVudCBoYXMgYmVlbiBjb21wbGV0ZWx5IGxvYWRlZCBhbmQgcGFyc2VkIGFuZCBkZWZlcnJlZCBzY3JpcHRzLCBpZiBhbnksIGhhdmUgZXhlY3V0ZWQuIFxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luYyBzY3JpcHRzLCBpZiBhbnksIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIGV4ZWN1dGVkLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHlsZXNoZWV0c1sxXSwgaW1hZ2VzLCBhbmQgc3ViZnJhbWVzIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIGZpbmlzaGVkIGxvYWRpbmcuXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzFdIC0gU3R5bGVzaGVldHMgL3VzdWFsbHkvIGRlZmVyIHRoaXMgZXZlbnQhIC0gaHR0cDovL21vbGlseS5kZS93ZWJsb2cvZG9tY29udGVudGxvYWRlZFxyXG4gICAgICogIDYuIGRvbUNvbnRlbnRMb2FkZWRFdmVudEVuZCAgICAgLSBUaGUgRE9NQ29udGVudExvYWRlZCBldmVudCBjYWxsYmFjaywgaWYgYW55LCBmaW5pc2hlZCBleGVjdXRpbmcuIEUuZy5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRPTSBmdWxseSBsb2FkZWQgYW5kIHBhcnNlZFwiKTtcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAqICA3LiBkb21Db21wbGV0ZSAgICAgICAgICAgICAgICAgIC0gVGhlIERPTSB0cmVlIGlzIGNvbXBsZXRlbHkgYnVpbHQuIEFzeW5jIHNjcmlwdHMsIGlmIGFueSwgaGF2ZSBleGVjdXRlZC5cclxuICAgICAqICA4LiBsb2FkRXZlbnRTdGFydCAgICAgICAgICAgICAgIC0gVGhlIGJyb3dzZXIgaGF2ZSBmaW5pc2hlZCBsb2FkaW5nIGFsbCB0aGUgcmVzb3VyY2VzIGxpa2UgaW1hZ2VzLCBzd2YsIGV0Yy5cclxuICAgICAqICA5LiBsb2FkRXZlbnRFbmQgICAgICAgICAgICAgICAgIC0gVGhlIGxvYWQgZXZlbnQgY2FsbGJhY2ssIGlmIGFueSwgZmluaXNoZWQgZXhlY3V0aW5nLlxyXG4gICAgICovXHJcbiAgICBfZ2V0U3RhdHMoY29tbWFuZE5hbWUpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZldGNoU3RhdHMgJiYgdGhpcy5pc0luaXRpYWxpemVkICYmIHRoaXMuX2lzQWN0aW9uKGNvbW1hbmROYW1lKSkge1xyXG4gICAgICAgICAgICB2YXIgbmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICB2YXIgZG9tQ29udGVudExvYWRlZCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBsb2FkID0gMDtcclxuICAgICAgICAgICAgdmFyIHNhbWVQYWdlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZm9sbG93aW5nIHNpdHVhdGlvbjpcclxuICAgICAgICAgICAgLy8gaWYgbmF2aWdhdGVTdGFydCBlcXVhbHMgdG8gdGhlIG9uZSB3ZSBnb3QgZnJvbSBwcmV2aW91cyBhdHRlbXB0ICh3ZSBuZWVkIHRvIHNhdmUgaXQpXHJcbiAgICAgICAgICAgIC8vIGl0IG1lYW5zIHdlIGFyZSBzdGlsbCBvbiB0aGUgc2FtZSBwYWdlIGFuZCBkb24ndCBuZWVkIHRvIHJlY29yZCBsb2FkL2RvbUNvbnRlbnRMb2FkZWQgdGltZXNcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhbGwoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0RXJyb3IgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FpdFVudGlsUmV0VmFsID0gdGhpcy5kcml2ZXIud2FpdFVudGlsKGFzeW5jKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmdsb2JhbCB3aW5kb3cqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aW1pbmdzID0gYXdhaXQgdGhpcy5kcml2ZXIuZXhlY3V0ZShmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25TdGFydDogd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydDogd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZy5kb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRFdmVudFN0YXJ0OiB3aW5kb3cucGVyZm9ybWFuY2UudGltaW5nLmxvYWRFdmVudFN0YXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1pbmdzLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ID4gMCAmJiB0aW1pbmdzLmxvYWRFdmVudFN0YXJ0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lUGFnZSA9IHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgJiYgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9PSB0aW1pbmdzLm5hdmlnYXRpb25TdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvblN0YXJ0ID0gdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IHRpbWluZ3MubmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgPSB0aW1pbmdzLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9hZEV2ZW50U3RhcnQgPSB0aW1pbmdzLmxvYWRFdmVudFN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tQ29udGVudExvYWRlZCA9IGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0IC0gbmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkID0gbG9hZEV2ZW50U3RhcnQgLSBuYXZpZ2F0aW9uU3RhcnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgPiAwICYmIGxvYWRFdmVudFN0YXJ0ID4gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXhlY3V0ZUVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBlcnJvciBpbnNpZGUgZHJpdmVyLmV4ZWN1dGUgb3IgZHJpdmVyLndhaXRVbnRpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IGV4ZWN1dGVFcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0aW1lb3V0OiAzMCoxMDAwIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhaXRVbnRpbFJldFZhbCAmJiB3YWl0VW50aWxSZXRWYWwudGhlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFVudGlsUmV0VmFsLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbnQgZXJyb3IgZnJvbSBkcml2ZXIuZXhlY3V0ZSBvciBkcml2ZXIud2FpdFVudGlsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxhc3RFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW50IGVycm9yIGZyb20gZHJpdmVyLmV4ZWN1dGUgb3IgZHJpdmVyLndhaXRVbnRpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsYXN0RXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgICAgICAgICAgLy8gY291bGRuJ3QgZ2V0IHRpbWluZ3MuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSBuYXZpZ2F0aW9uU3RhcnQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc2FtZVBhZ2UgPyB7fSA6IHsgRG9tQ29udGVudExvYWRlZEV2ZW50OiBkb21Db250ZW50TG9hZGVkLCBMb2FkRXZlbnQ6IGxvYWQgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IE9wZW5zIG5ldyB0cmFuc2FjdGlvbi5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgdHJhbnNhY3Rpb24gd2lsbCBwZXJzaXN0IHRpbGwgYSBuZXcgb25lIGlzIG9wZW5lZC4gVHJhbnNhY3Rpb24gbmFtZXMgbXVzdCBiZVxyXG4gICAgICogICAgICAgICAgICAgIHVuaXF1ZS5cclxuICAgICAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgdHJhbnNhY3Rpb24gbmFtZS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgdHJhbnNhY3Rpb24obmFtZSkge1xyXG4gICAgICAgIGlmIChnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnNbZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lXSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID09PSAnY2hyb21lJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnNbZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lXSA9IGF3YWl0IHRoaXMuX2dldEhBUigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNhY3Rpb25zW25hbWVdICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICBjb25zdCBjb3VudGVyID0gT2JqZWN0LmtleXModGhpcy50cmFuc2FjdGlvbnMpLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zdGFydHNXaXRoKG5hbWUpKS5sZW5ndGggKyAxO1xyXG4gICAgICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBuYW1lKycgKCMnK2NvdW50ZXIrJyknO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkSGVscGVyRnVuY3Rpb25zKCkge1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvciA9IG1vZFV0aWxzLmdldFdkaW9Mb2NhdG9yO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5tYXRjaFBhdHRlcm4gPSBtb2RVdGlscy5tYXRjaFBhdHRlcm47XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldEVsZW1lbnQgPSBtb2RVdGlscy5nZXRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRFbGVtZW50cyA9IG1vZFV0aWxzLmdldEVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRDaGlsZEVsZW1lbnQgPSBtb2RVdGlscy5nZXRDaGlsZEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldENoaWxkRWxlbWVudHMgPSBtb2RVdGlscy5nZXRDaGlsZEVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5zZXRUaW1lb3V0SW1wbGljaXQgPSBtb2RVdGlscy5zZXRUaW1lb3V0SW1wbGljaXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQgPSBtb2RVdGlscy5yZXN0b3JlVGltZW91dEltcGxpY2l0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXIgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE51bWJlcjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmU7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWwgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0ID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudFN0cmluZyA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50U3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9nZXRIQVIoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZXMgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRMb2dUeXBlcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVzLmluY2x1ZGVzKCdwZXJmb3JtYW5jZScpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0TG9ncygncGVyZm9ybWFuY2UnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpbiBvbmUgaW5zdGFuY2UsIGxvZ3Mgd2FzIG5vdCBpdGVyYWJsZSBmb3Igc29tZSByZWFzb24gLSBoZW5jZSB0aGUgZm9sbG93aW5nIGNoZWNrOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFsb2dzIHx8IHR5cGVvZiBsb2dzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZ2V0SEFSOiBsb2dzIG5vdCBpdGVyYWJsZTogJyArIEpTT04uc3RyaW5naWZ5KGxvZ3MpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGxvZyBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnT2JqID0gSlNPTi5wYXJzZShsb2cubWVzc2FnZSk7ICAgLy8gcmV0dXJuZWQgYXMgc3RyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzLnB1c2gobXNnT2JqLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGhhciA9IGhhckZyb21NZXNzYWdlcyhldmVudHMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGhhcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBmZXRjaCBIQVI6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2hlY2tXYWl0Rm9yQW5ndWxhcigpIHtcclxuICAgICAgICBpZiAodGhpcy5hdXRvV2FpdEZvckFuZ3VsYXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQW5ndWxhcih0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhclJvb3RTZWxlY3RvciwgdGhpcy5hdXRvV2FpdEZvckFuZ3VsYXJUaW1lb3V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdfQ==
|
|
898
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS13ZWIuanMiXSwibmFtZXMiOlsiTU9EVUxFX05BTUUiLCJERUZBVUxUX1NFTEVOSVVNX1VSTCIsIkRFRkFVTFRfQlJPV1NFUl9OQU1FIiwiTk9fU0NSRUVOU0hPVF9DT01NQU5EUyIsIkFDVElPTl9DT01NQU5EUyIsIkRFRkFVTFRfV0FJVF9USU1FT1VUIiwiV2ViTW9kdWxlIiwiV2ViRHJpdmVyTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwidHJhbnNhY3Rpb25zIiwibGFzdE5hdmlnYXRpb25TdGFydFRpbWUiLCJoZWxwZXJzIiwiX2xvYWRIZWxwZXJGdW5jdGlvbnMiLCJPeEVycm9yIiwiZXJySGVscGVyIiwid2FpdEZvclRpbWVvdXQiLCJuYW1lIiwiZ2V0RHJpdmVyIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiY2FwcyIsImluaXQiLCJzZWxlbml1bVVybCIsImlzSW5pdGlhbGl6ZWQiLCJjdHgiLCJicm93c2VyTmFtZSIsImVycm9yQ29kZSIsIklOVkFMSURfQ0FQQUJJTElUSUVTIiwidG9Mb3dlckNhc2UiLCJyZWNvcmRIQVIiLCJicm93c2VyIiwicGVyZm9ybWFuY2UiLCJ1cmwiLCJVUkwiLCJwYXJzZSIsInByb3RvY29sIiwicmVwbGFjZSIsImhvc3QiLCJob3N0bmFtZSIsInBvcnQiLCJwYXJzZUludCIsInBhdGgiLCJwYXRobmFtZSIsImF1dGgiLCJzcGxpdCIsIndkaW9PcHRzIiwidXNlciIsImtleSIsImNhcGFiaWxpdGllcyIsImxvZ0xldmVsIiwicnVubmVyIiwid2FpdGZvclRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlUaW1lb3V0IiwiY29ubmVjdGlvblJldHJ5Q291bnQiLCJpbml0RXJyb3IiLCJfdGhpcyIsInByb3ZpZGVyIiwibW9kVXRpbHMiLCJkZXRlcm1pbmVQcm92aWRlciIsIlBFUkZFQ1RPIiwib3BlbkRldmljZVRpbWVvdXQiLCJkcml2ZXIiLCJ3ZGlvIiwicmVtb3RlIiwic2VsZW5pdW1Ccm93c2VyVGltZW91dCIsInNlbGVuaXVtVGltZW91dCIsInBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCIsInBlcmZlY3RvUmVwb3J0aW5nIiwiUGVyZmVjdG8iLCJQZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQiLCJ3ZWJkcml2ZXIiLCJleGVjdXRlU2NyaXB0IiwiY29tbWFuZCIsInBhcmFtcyIsImV4ZWN1dGUiLCJyZXBvcnRpbmdDbGllbnQiLCJQZXJmZWN0b1JlcG9ydGluZ0NsaWVudCIsInRlc3RTdGFydCIsImUiLCJnZXRTZWxlbml1bUluaXRFcnJvciIsImNvbGxlY3RCcm93c2VyTG9ncyIsImdldEJyb3dzZXJMb2dzIiwiZXJyb3IiLCJMQU1CREFURVNUIiwiQlJPV1NFUlNUQUNLIiwiaW5jbHVkZXMiLCJtYXhpbWl6ZVdpbmRvdyIsInNldFRpbWVvdXQiLCJlcnIiLCJVTktOT1dOX0VSUk9SIiwibWVzc2FnZSIsInV0aWwiLCJpbnNwZWN0IiwiZGlzcG9zZSIsInN0YXR1cyIsIl93aGVuV2ViTW9kdWxlRGlzcG9zZSIsInN0ZXBzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiZmFpbGVkRmluZGVkIiwiZmluZCIsIml0ZW0iLCJ0b1VwcGVyQ2FzZSIsIlNBVUNFTEFCUyIsInVzZXJuYW1lIiwiYWNjZXNzS2V5IiwicGFzc2VkIiwiaWQiLCJzZXNzaW9uSWQiLCJib2R5IiwibXlBY2NvdW50IiwiU2F1Y2VMYWJzIiwidXBkYXRlSm9iIiwic3RvcEpvYiIsIl9zZW5kUmVzdWx0U3RhdHVzVG9MYW1iZGFUZXN0IiwiZGVsZXRlU2Vzc2lvbiIsIlRFU1RJTkdCT1QiLCJfc2VuZFJlc3VsdFN0YXR1c1RvVGVzdGluZ0JvdCIsInRlc3RTdG9wIiwiQ29uc3RhbnRzIiwicmVzdWx0cyIsImZhaWxlZCIsIl9zZW5kUmVzdWx0U3RhdHVzVG9Ccm93c2Vyc3RhY2siLCJjbG9zZUJyb3dzZXJXaW5kb3dzIiwiZGlzcG9zZUNvbnRpbnVlIiwid2FybiIsInByb21pc2UiLCJzZWxlbml1bVNlc3Npb25UaW1lb3V0Iiwic2VsZW5pdW1QaWQiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJzdGRpbyIsInBncmVwUmVzdWx0IiwidG9TdHJpbmciLCJyZXNvbHZlIiwiX2l0ZXJhdGlvblN0YXJ0IiwiZ2xvYmFsIiwiX2xhc3RUcmFuc2FjdGlvbk5hbWUiLCJfaXRlcmF0aW9uRW5kIiwidHlwZSIsImVycm9ySGVscGVyIiwiU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUIiwibG9ncyIsImxvZyIsInB1c2giLCJfYWRqdXN0QnJvd3NlckxvZyIsIl9nZXRIQVIiLCJoYXIiLCJfaXNBY3Rpb24iLCJfdGFrZVNjcmVlbnNob3RTaWxlbnQiLCJ0YWtlU2NyZWVuc2hvdCIsInJldHZhbCIsImNhbGwiLCJQcm9taXNlIiwicmVqZWN0Iiwid2FpdFVudGlsUmV0VmFsIiwid2FpdFVudGlsIiwiaW1hZ2VzIiwiaGFuZGxlcyIsImdldFdpbmRvd0hhbmRsZXMiLCJoYW5kbGUiLCJzd2l0Y2hUb1dpbmRvdyIsImltYWdlIiwidGl0bGUiLCJnZXRUaXRsZSIsInRleHRUb0ltYWdlIiwicmVxdWlyZSIsInRpdGxlSW1hZ2UiLCJnZW5lcmF0ZSIsImRlYnVnIiwiZm9udEZhbWlseSIsIm1lcmdlZEltYWdlIiwiZGlyZWN0aW9uIiwidGltZW91dCIsInRoZW4iLCJjYXRjaCIsInRpbWUiLCJ0aW1lc3RhbXAiLCJtc2ciLCJsZXZlbCIsInNyYyIsIl9nZXRTdGF0cyIsImNvbW1hbmROYW1lIiwiZmV0Y2hTdGF0cyIsIm5hdmlnYXRpb25TdGFydCIsImRvbUNvbnRlbnRMb2FkZWQiLCJsb2FkIiwic2FtZVBhZ2UiLCJsYXN0RXJyb3IiLCJ0aW1pbmdzIiwid2luZG93IiwidGltaW5nIiwiZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQiLCJsb2FkRXZlbnRTdGFydCIsImV4ZWN1dGVFcnJvciIsImNvbnNvbGUiLCJEb21Db250ZW50TG9hZGVkRXZlbnQiLCJMb2FkRXZlbnQiLCJ0cmFuc2FjdGlvbiIsImNvdW50ZXIiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwic3RhcnRzV2l0aCIsImdldFdkaW9Mb2NhdG9yIiwibWF0Y2hQYXR0ZXJuIiwiZ2V0RWxlbWVudCIsImdldEVsZW1lbnRzIiwiZ2V0Q2hpbGRFbGVtZW50IiwiZ2V0Q2hpbGRFbGVtZW50cyIsInNldFRpbWVvdXRJbXBsaWNpdCIsInJlc3RvcmVUaW1lb3V0SW1wbGljaXQiLCJhc3NlcnRBcmd1bWVudCIsImFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmciLCJhc3NlcnRBcmd1bWVudE51bWJlciIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJhc3NlcnRBcmd1bWVudEJvb2wiLCJhc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCIsImFzc2VydEFyZ3VtZW50VGltZW91dCIsImFzc2VydEFyZ3VtZW50U3RyaW5nIiwidHlwZXMiLCJnZXRMb2dUeXBlcyIsImdldExvZ3MiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJldmVudHMiLCJtc2dPYmoiLCJjaGVja1dhaXRGb3JBbmd1bGFyIiwiYXV0b1dhaXRGb3JBbmd1bGFyIiwid2FpdEZvckFuZ3VsYXIiLCJhdXRvV2FpdEZvckFuZ3VsYXJSb290U2VsZWN0b3IiLCJhdXRvV2FpdEZvckFuZ3VsYXJUaW1lb3V0IiwibGFtYmRhQ3JlZGVudGlhbHMiLCJsYW1iZGFBdXRvbWF0aW9uQ2xpZW50IiwibGFtYmRhUmVzdENsaWVudCIsIkF1dG9tYXRpb25DbGllbnQiLCJyZXF1ZXN0Qm9keSIsInN0YXR1c19pbmQiLCJ1cGRhdGVTZXNzaW9uQnlJZCIsInRiIiwiVGVzdGluZ0JvdCIsImFwaV9rZXkiLCJhcGlfc2VjcmV0IiwidGVzdERhdGEiLCJ1cGRhdGVUZXN0IiwidGVzdERldGFpbHMiLCJtZXRob2QiLCJqc29uIiwicmVqZWN0VW5hdXRob3JpemVkIiwicmVzIl0sIm1hcHBpbmdz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TUFBTSxFQUFFQSxNQUFNLEtBQUssUUFBWCxHQUFzQixRQUF0QixHQUFpQztBQUR6QixPQUFwQjtBQUlBLFlBQU0xRixPQUFPLEdBQUc7QUFDWjRCLFFBQUFBLEdBQUcsRUFBRyxrREFBaUQsS0FBSzZCLE1BQUwsQ0FBWWdELFNBQVUsT0FEakU7QUFFWjRJLFFBQUFBLE1BQU0sRUFBRSxLQUZJO0FBR1pDLFFBQUFBLElBQUksRUFBRSxJQUhNO0FBSVpDLFFBQUFBLGtCQUFrQixFQUFFLEtBSlI7QUFLWjdJLFFBQUFBLElBQUksRUFBRWlJLFdBTE07QUFNWixnQkFBUTtBQUNKLGtCQUFRLEtBQUtsTSxRQUFMLENBQWNDLElBRGxCO0FBRUosa0JBQVEsS0FBS0QsUUFBTCxDQUFjRSxHQUZsQjtBQUdKLDZCQUFtQjtBQUhmO0FBTkksT0FBaEI7O0FBYUEsVUFBSTtBQUNBLDhCQUFRM0MsT0FBUixFQUFpQixDQUFDb0YsR0FBRCxFQUFNb0ssR0FBTixFQUFXOUksSUFBWCxLQUFvQjtBQUNqQ3lCLFVBQUFBLE9BQU87QUFDVixTQUZEO0FBR0gsT0FKRCxDQUlFLE9BQU96RCxDQUFQLEVBQVU7QUFDUixhQUFLdkUsTUFBTCxDQUFZMkUsS0FBWixDQUFrQixtREFBbURKLENBQUMsQ0FBQ3dELFFBQUYsRUFBckU7QUFDQUMsUUFBQUEsT0FBTztBQUNWO0FBQ0osS0ExQk0sQ0FBUDtBQTJCSDs7QUEzdkJrRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXHJcbi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG4vKipcclxuICogQG5hbWUgd2ViXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciBicm93c2VyIGF1dG9tYXRpb24uXHJcbiAqIEBzYW1wbGUgKipOb3RlczoqKiAgXHJcbiAqICAgXHJcbiAqIENvbW1hbmRzIHdoaWNoIG9wZXJhdGUgb24gZWxlbWVudHMgc3VjaCBhcyBjbGljaywgYXNzZXJ0LCB3YWl0Rm9yLCB0eXBlLCBzZWxlY3QsIGFuZCBvdGhlcnMgd2lsbCBhdXRvbWF0aWNhbGx5IHdhaXQgZm9yIGEgcGVyaW9kIG9mIHRpbWUgZm9yIHRoZSBlbGVtZW50IHRvIGFwcGVhciBpbiBET00gYW5kIGJlY29tZSB2aXNpYmxlLiBCeSBkZWZhdWx0IHRoaXMgcGVyaW9kIGVxdWFscyB0byA2MCBzZWNvbmRzLCBidXQgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlIGBzZXRUaW1lb3V0YGNvbW1hbmQuXHJcbiAqICAgXHJcbiAqICoqU3RyaW5nIG1hdGNoaW5nIHBhdHRlcm5zOioqIFxyXG4gKiBcclxuICogIENvbW1hbmRzIHdoaWNoIGV4cGVjdCBhIHN0cmluZyBtYXRjaGluZyBwYXR0ZXJuIGluIHRoZWlyIGFyZ3VtZW50cywgc3VwcG9ydCBmb2xsb3dpbmcgcGF0dGVybnMgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2U6XHJcbiAqIFxyXG4gKiAgKiBgcmVnZXg6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAqICAqIGByZWdleGk6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyBjYXNlLWluc2Vuc2l0aXZlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuICogICogYGV4YWN0OlNUUklOR2AgLSBNYXRjaCB0aGUgc3RyaW5nIHZlcmJhdGltLlxyXG4gKiAgKiBgZ2xvYjpQQVRURVJOYCAtIE1hdGNoIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgZ2xvYiBwYXR0ZXJuLiBgP2Agd2lsbCBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgbmV3IGxpbmUgXFwoXFxuXFwpLiBgKmAgd2lsbCBtYXRjaCBhbnkgc2VxdWVuY2UgXFwoMCBvciBtb3JlXFwpIG9mIGNoYXJhY3RlcnMgZXhjZXB0IG5ldyBsaW5lLiBFbXB0eSAgICAgUEFUVEVSTiB3aWxsIG1hdGNoIG9ubHkgb3RoZXIgZW1wdHkgc3RyaW5ncy5cclxuICogICogYFBBVFRFUk5gIC0gU2FtZSBhcyBnbG9iIG1hdGNoaW5nLiAgXHJcbiAqXHJcbiAqICoqTG9jYXRvcnM6KiogXHJcbiAqIFxyXG4gKiAgQ29tbWFuZHMgd2hpY2ggZXhwZWN0IGFuIGVsZW1lbnQgbG9jYXRvciBpbiB0aGVpciBhcmd1bWVudHMsIHN1cHBvcnQgZm9sbG93aW5nIGxvY2F0b3IgdHlwZXMgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2U6XHJcbiAqIFxyXG4gKiAgKiBgaWQ9SURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBJRCBhdHRyaWJ1dGUuXHJcbiAqICAqIGBjc3M9Q1NTX1NFTEVDVE9SYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhIENTUyBzZWxlY3Rvci5cclxuICogICogYGxpbms9VEVYVGAgLSBMb2NhdGVzIGxpbmsgZWxlbWVudCB3aG9zZSB2aXNpYmxlIHRleHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKiAgKiBgbGluay1jb250YWlucz1URVhUYCAtIExvY2F0ZXMgbGluayBlbGVtZW50IHdob3NlIHZpc2libGUgdGV4dCBjb250YWlucyB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKiAgKiBgbmFtZT1OQU1FYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgTkFNRSBhdHRyaWJ1dGUuXHJcbiAqICAqIGB0YWc9TkFNRWAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIHRhZyBuYW1lLlxyXG4gKiAgKiBgL1hQQVRIYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhbiBYUGF0aCAxLjAgZXhwcmVzc2lvbi5cclxuICogICogYChYUEFUSClbXWAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqL1xyXG5cclxuLyogZXNsaW50LWRpc2FibGUgcXVvdGVzICovXHJcbmltcG9ydCB7IGhhckZyb21NZXNzYWdlcyB9IGZyb20gJ2Nocm9tZS1oYXInO1xyXG5pbXBvcnQgVVJMIGZyb20gJ3VybCc7XHJcbmltcG9ydCAqIGFzIHdkaW8gZnJvbSAnd2ViZHJpdmVyaW8nO1xyXG5pbXBvcnQgV2ViRHJpdmVyTW9kdWxlIGZyb20gJy4uL2NvcmUvV2ViRHJpdmVyTW9kdWxlJztcclxuaW1wb3J0IHsgZGVmZXIgfSBmcm9tICd3aGVuJztcclxuaW1wb3J0IG1vZFV0aWxzIGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgdXRpbCBmcm9tICd1dGlsJztcclxuaW1wb3J0IFNhdWNlTGFicyBmcm9tICdzYXVjZWxhYnMnO1xyXG5pbXBvcnQgbGFtYmRhUmVzdENsaWVudCBmcm9tICdAbGFtYmRhdGVzdC9ub2RlLXJlc3QtY2xpZW50JztcclxuaW1wb3J0IFRlc3RpbmdCb3QgZnJvbSAndGVzdGluZ2JvdC1hcGknO1xyXG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xyXG5pbXBvcnQgcGVyZmVjdG9SZXBvcnRpbmcgZnJvbSAncGVyZmVjdG8tcmVwb3J0aW5nJztcclxuaW1wb3J0IHJlcXVlc3QgZnJvbSAncmVxdWVzdCc7XHJcbmltcG9ydCBtZXJnZUltYWdlcyBmcm9tICcuLi9saWIvaW1nLW1lcmdlJztcclxuaW1wb3J0IGVycm9ySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAnd2ViJztcclxuY29uc3QgREVGQVVMVF9TRUxFTklVTV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdDo0NDQ0L3dkL2h1Yic7XHJcbmNvbnN0IERFRkFVTFRfQlJPV1NFUl9OQU1FID0gJ2Nocm9tZSc7XHJcbmNvbnN0IE5PX1NDUkVFTlNIT1RfQ09NTUFORFMgPSBbJ2luaXQnLCAnYXNzZXJ0QWxlcnQnXTtcclxuY29uc3QgQUNUSU9OX0NPTU1BTkRTID0gWydvcGVuJywgJ2NsaWNrJ107XHJcbmNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUID0gNjAgKiAxMDAwOyAgICAgICAgICAgIC8vIGRlZmF1bHQgNjBzIHdhaXQgdGltZW91dFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViTW9kdWxlIGV4dGVuZHMgV2ViRHJpdmVyTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0ge307ICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uLT5oYXIgZGljdGlvbmFyeVxyXG4gICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2xvYWRIZWxwZXJGdW5jdGlvbnMoKTtcclxuICAgICAgICAvLyBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKHNvbWUgbW9kdWxlIGNvbW1hbmRzIG1pZ2h0IHJlZmVyIHRvIHRoaXMuT3hFcnJvciBhbmQgdGhpcy5lcnJIZWxwZXIpXHJcbiAgICAgICAgdGhpcy5PeEVycm9yID0gT3hFcnJvcjtcclxuICAgICAgICB0aGlzLmVyckhlbHBlciA9IGVyckhlbHBlcjtcclxuICAgICAgICAvLyBob2xkcyBlbGVtZW50IG9wZXJhdGlvbiB0aW1lb3V0IHZhbHVlXHJcbiAgICAgICAgdGhpcy53YWl0Rm9yVGltZW91dCA9IERFRkFVTFRfV0FJVF9USU1FT1VUO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXREcml2ZXJcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHVuZGVybHlpbmcgV0RJTyBkcml2ZXIuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFdESU8gZHJpdmVyLlxyXG4gICAgICovXHJcbiAgICBnZXREcml2ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldERyaXZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGdldENhcGFiaWxpdGllc1xyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBjdXJyZW50bHkgZGVmaW5lZCBjYXBhYmlsaXRpZXMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEN1cnJlbnQgY2FwYWJpbGl0aWVzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhcHMgfHwgc3VwZXIuZ2V0Q2FwYWJpbGl0aWVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gaW5pdFxyXG4gICAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgbmV3IFNlbGVuaXVtIHNlc3Npb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGNhcHMgLSBEZXNpcmVkIGNhcGFiaWxpdGllcy4gSWYgbm90IHNwZWNpZmllZCBjYXBhYmlsaXRpZXMgd2lsbCBiZSB0YWtlbiBmcm9tIHN1aXRlIGRlZmluaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IHNlbGVuaXVtVXJsIC0gUmVtb3RlIHNlcnZlciBVUkwgKGRlZmF1bHQ6IGh0dHA6Ly9sb2NhbGhvc3Q6NDQ0NC93ZC9odWIpLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0KGNhcHMsIHNlbGVuaXVtVXJsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVuaXVtVXJsKSB7XHJcbiAgICAgICAgICAgIHNlbGVuaXVtVXJsID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtVXJsIHx8IERFRkFVTFRfU0VMRU5JVU1fVVJMO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGFrZSBjYXBhYmlsaXRpZXMgZWl0aGVyIGZyb20gaW5pdCBtZXRob2QgYXJndW1lbnQgb3IgZnJvbSBjb250ZXh0IHBhcmFtZXRlcnMgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvclxyXG4gICAgICAgIC8vIG1lcmdlIGNhcGFiaWxpdGllcyBmcm9tIGNvbnRleHQgYW5kIGZyb20gaW5pdCBmdW5jdGlvbiBhcmd1bWVudCwgZ2l2ZSBwcmVmZXJlbmNlIHRvIGNvbnRleHQtcGFzc2VkIGNhcGFiaWxpdGllc1xyXG4gICAgICAgIHRoaXMuY2FwcyA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLmN0eC5jYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwcyA9IHsgLi4udGhpcy5jdHguY2FwcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2Fwcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMgPSB7IC4uLnRoaXMuY2FwcywgLi4uY2FwcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcG9wdWxhdGUgYnJvd3Nlck5hbWUgY2FwcyBmcm9tIG9wdGlvbnMuIEZJWE1FOiB3aHkgaXMgdGhpcyBldmVuIG5lZWRlZD9cclxuICAgICAgICBpZiAoIXRoaXMuY2Fwcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWUgfHwgREVGQVVMVF9CUk9XU0VSX05BTUU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEZJWE1FOiBzaGFsbCB3ZSB0aHJvdyBhbiBleGNlcHRpb24gaWYgYnJvd3Nlck5hbWUgaXMgbm90IHNwZWNpZmllZCwgbmVpdGhlciBpbiBjYXBzIG5vciBpbiBvcHRpb25zPyFcclxuICAgICAgICBpZiAoIXRoaXMuY2Fwcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLklOVkFMSURfQ0FQQUJJTElUSUVTLFxyXG4gICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBpbml0aWFsaXplIGB3ZWJgIG1vZHVsZSAtIGJyb3dzZXJOYW1lIG11c3QgYmUgc3BlY2lmaWVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYWRqdXN0IGJyb3dzZXJOYW1lLXNcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpZScpIHtcclxuICAgICAgICAgICAgLy8gSUUgaXMgc3BlY2lmaWVkIGFzICdpZScgdGhyb3VnaCB0aGUgY29tbWFuZCBsaW5lIGFuZCBwb3NzaWJseSBzdWl0ZXNcclxuICAgICAgICAgICAgLy8gYnV0IHNlbGVuaXVtIHN0YW5kYWxvbmUgc2VydmVyIGV4cGVjdHMgJ2ludGVybmV0IGV4cGxvcmVyJ1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPSAnaW50ZXJuZXQgZXhwbG9yZXInO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXBzWydsYW1iZGE6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIC8vIGxhbWJkYXRlc3QgZXhwZWN0cyBvcmlnaW5hbCBjYXNlIG5hbWVzXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcHNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICAvLyBwZXJmZWN0b01vYmlsZSBleHBlY3RzIG9yaWdpbmFsIGNhc2UgbmFtZXNcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2Fwcy5icm93c2VyTmFtZSAhPT0gJ01pY3Jvc29mdEVkZ2UnKSB7XHJcbiAgICAgICAgICAgIC8vIHNlbGVuaXVtIHN0YW5kYWxvbmUgc2VydmVyIGV4cGVjdHMgYWxsIGJyb3dzZXJOYW1lcyB0byBiZSBsb3dlcmNhc2VcclxuICAgICAgICAgICAgLy8gZXhjZXB0IFwiTWljcm9zb2Z0RWRnZVwiXHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9IHRoaXMuY2Fwcy5icm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYWRqdXN0IGNhcGFiaWxpdGllcyB0byBlbmFibGUgY29sbGVjdGluZyBicm93c2VyIGFuZCBwZXJmb3JtYW5jZSBzdGF0cyBpbiBDaHJvbWUgXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWNvcmRIQVIgJiYgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID09PSAnY2hyb21lJykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHNbJ2dvb2c6bG9nZ2luZ1ByZWZzJ10gPSB7ICAgICAvLyBmb3IgQ2hyb21lRHJpdmVyID49IDc1XHJcbiAgICAgICAgICAgICAgICBicm93c2VyOiAnQUxMJyxcclxuICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlOiAnQUxMJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAvLyBzcGVjaWZ5aW5nIHRoaXMgbGVhZHMgQ2hyb21lIDc3KyB0byByZWZ1c2UgbG9hZGluZ1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMubG9nZ2luZ1ByZWZzID0geyAgICAgICAgICAgICAvLyBmb3IgQ2hyb21lRHJpdmVyIDwgNzVcclxuICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdBTEwnLFxyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2U6ICdBTEwnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5jaHJvbWVPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgcGVyZkxvZ2dpbmdQcmVmczoge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZU5ldHdvcms6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlUGFnZTogZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgKi9cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHBvcHVsYXRlIFdESU8gb3B0aW9uc1xyXG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5wYXJzZShzZWxlbml1bVVybCB8fCBERUZBVUxUX1NFTEVOSVVNX1VSTCk7XHJcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSB1cmwucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJyk7XHJcbiAgICAgICAgY29uc3QgaG9zdCA9IHVybC5ob3N0bmFtZTtcclxuICAgICAgICBjb25zdCBwb3J0ID0gcGFyc2VJbnQodXJsLnBvcnQgfHwgKHByb3RvY29sID09PSAnaHR0cHMnID8gNDQzIDogODApKTtcclxuICAgICAgICBjb25zdCBwYXRoID0gdXJsLnBhdGhuYW1lO1xyXG5cclxuICAgICAgICAvLyBhdXRoIGlzIG5lZWRlZCBtb3N0bHkgZm9yIGNsb3VkIHByb3ZpZGVycyBzdWNoIGFzIExhbWJkYVRlc3RcclxuICAgICAgICBpZiAodXJsLmF1dGgpIHtcclxuICAgICAgICAgICAgY29uc3QgYXV0aCA9IHVybC5hdXRoLnNwbGl0KCc6Jyk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy53ZGlvT3B0cyA9IHtcclxuICAgICAgICAgICAgICAgIHVzZXI6IGF1dGhbMF0sXHJcbiAgICAgICAgICAgICAgICBrZXk6IGF1dGhbMV1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHdkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMud2Rpb09wdHMgfHwge30sXHJcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCxcclxuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3QsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQsXHJcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogdGhpcy5jYXBzLFxyXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXHJcbiAgICAgICAgICAgIHJ1bm5lcjogJ3JlcGwnLFxyXG4gICAgICAgICAgICB3YWl0Zm9yVGltZW91dDogNTAwMCwgLy8gaW5jcmVhc2UgdGhlIGRlZmF1bHQgMzAwMFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiAzMTAqMTAwMCxcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IDFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgaW5pdEVycm9yID0gbnVsbDtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGxldCBwcm92aWRlciA9IG1vZFV0aWxzLmRldGVybWluZVByb3ZpZGVyKHdkaW9PcHRzKTtcclxuXHJcbiAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUTykge1xyXG4gICAgICAgICAgICB3ZGlvT3B0cy5wYXRoID0gJy9uZXhwZXJpZW5jZS9wZXJmZWN0b21vYmlsZS93ZC9odWInO1xyXG4gICAgICAgICAgICB3ZGlvT3B0cy5wb3J0ID0gODA7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnByb3RvY29sID0gJ2h0dHAnO1xyXG4gICAgICAgICAgICB3ZGlvT3B0cy5vcGVuRGV2aWNlVGltZW91dCA9IDE1O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG5hbWUgPSAnbmFtZSc7XHJcbiAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddICYmIHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snbGFtYmRhOm9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2xhbWJkYTpvcHRpb25zJ11bJ25hbWUnXSkge1xyXG4gICAgICAgICAgICBuYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2xhbWJkYTpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddICYmIHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ11bJ25hbWUnXSkge1xyXG4gICAgICAgICAgICBuYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnJvd3NlcnN0YWNrOm9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2Jyb3dzZXJzdGFjazpvcHRpb25zJ11bJ25hbWUnXSkge1xyXG4gICAgICAgICAgICBuYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydicm93c2Vyc3RhY2s6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2Jyb3dzZXJzdGFjazpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMud2Rpb09wdHMgPSB3ZGlvT3B0cztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIgPSBhd2FpdCB3ZGlvLnJlbW90ZSh3ZGlvT3B0cyk7XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyLnByb3ZpZGVyID0gcHJvdmlkZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgPSB0aGlzLm9wdGlvbnMuc2VsZW5pdW1Ccm93c2VyVGltZW91dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlbml1bVRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLnNlbGVuaXVtVGltZW91dCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bVRpbWVvdXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCA9IGF3YWl0IG5ldyBwZXJmZWN0b1JlcG9ydGluZy5QZXJmZWN0by5QZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQoe1xyXG4gICAgICAgICAgICAgICAgICAgIHdlYmRyaXZlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlU2NyaXB0OiBhc3luYyAoY29tbWFuZCwgcGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5kcml2ZXIuZXhlY3V0ZShjb21tYW5kLCBwYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydGluZ0NsaWVudCA9IG5ldyBwZXJmZWN0b1JlcG9ydGluZy5QZXJmZWN0by5QZXJmZWN0b1JlcG9ydGluZ0NsaWVudChwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRpbmdDbGllbnQudGVzdFN0YXJ0KG5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVyckhlbHBlci5nZXRTZWxlbml1bUluaXRFcnJvcihlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJlc2V0IGJyb3dzZXIgbG9ncyBpZiBhdXRvIGNvbGxlY3QgbG9ncyBvcHRpb24gaXMgZW5hYmxlZFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdEJyb3dzZXJMb2dzICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIHNpbXBseSBjYWxsIHRoaXMgdG8gY2xlYXIgdGhlIHByZXZpb3VzIGxvZ3MgYW5kIHN0YXJ0IHRoZSB0ZXN0IHdpdGggdGhlIGNsZWFuIGxvZ3NcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0QnJvd3NlckxvZ3MoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBicm93c2VyIGxvZ3MuJywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIFttb2RVdGlscy5wcm92aWRlci5MQU1CREFURVNULCBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0ssIG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPXS5pbmNsdWRlcyh0aGlzLmRyaXZlci5wcm92aWRlcikgJiZcclxuICAgICAgICAgICAgICAgIFsnTWljcm9zb2Z0RWRnZScsICdtc2VkZ2UnLCAnRWRnZScsICdJbnRlcm5ldCBFeHBsb3JlciddLmluY2x1ZGVzKHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSlcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIG1heGltaXplIGJyb3dzZXIgd2luZG93XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5tYXhpbWl6ZVdpbmRvdygpO1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IGluaXRpYWwgVGltZW91dFxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2ltcGxpY2l0JzogdGhpcy53YWl0Rm9yVGltZW91dCxcclxuICAgICAgICAgICAgICAgICAgICAncGFnZUxvYWQnOiB0aGlzLndhaXRGb3JUaW1lb3V0XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5VTktOT1dOX0VSUk9SLCBlcnIubWVzc2FnZSwgdXRpbC5pbnNwZWN0KGVycikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5pbml0KHRoaXMuZHJpdmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBkaXNwb3NlXHJcbiAgICAgKiBAc3VtbWFyeSBFbmRzIHRoZSBjdXJyZW50IHNlc3Npb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IHN0YXR1cyAtIFRlc3Qgc3RhdHVzLCBlaXRoZXIgYHBhc3NlZGAgb3IgYGZhaWxlZGAuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB7fTtcclxuICAgICAgICB0aGlzLl93aGVuV2ViTW9kdWxlRGlzcG9zZSA9IGRlZmVyKCk7XHJcblxyXG4gICAgICAgIGlmICghc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHN0YXR1cyA9ICdwYXNzZWQnO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucnMuc3RlcHMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnJzLnN0ZXBzKSAmJiB0aGlzLnJzLnN0ZXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWxlZEZpbmRlZCA9IHRoaXMucnMuc3RlcHMuZmluZCgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsZWRGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyICYmIHRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdHVzLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5TQVVDRUxBQlMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydzYXVjZTpvcHRpb25zJ11bJ3VzZXJuYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzS2V5ID0gdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3NhdWNlOm9wdGlvbnMnXVsnYWNjZXNzS2V5J107XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzc2VkID0gc3RhdHVzID09PSAnUEFTU0VEJztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gXCJ7XFxcInBhc3NlZFxcXCI6XCIrcGFzc2VkK1wifVwiO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBteUFjY291bnQgPSBuZXcgU2F1Y2VMYWJzKHsgdXNlcjogdXNlcm5hbWUsIGtleTogYWNjZXNzS2V5fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbXlBY2NvdW50LnVwZGF0ZUpvYih1c2VybmFtZSwgaWQsIGJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG15QWNjb3VudC5zdG9wSm9iKHVzZXJuYW1lLCBpZCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5MQU1CREFURVNUKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2VuZFJlc3VsdFN0YXR1c1RvTGFtYmRhVGVzdChzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuVEVTVElOR0JPVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb1Rlc3RpbmdCb3Qoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRpbmdDbGllbnQudGVzdFN0b3Aoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5wYXNzZWQgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5mYWlsZWRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLkJST1dTRVJTVEFDSykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb0Jyb3dzZXJzdGFjayhzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbnVsbCAmJiBbJ1BBU1NFRCcsJ0ZBSUxFRCddLmluY2x1ZGVzKHN0YXR1cykpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlQnJvd3NlcldpbmRvd3Moc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsZWQgb3Igb3RoZXIgc3RhdHVzXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignRXJyb3IgZGlzcG9zaW5nIGRyaXZlcjogJywgZSk7ICAgIC8vIGlnbm9yZSBhbnkgZXJyb3JzIGF0IGRpc3Bvc2FsIHN0YWdlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VDb250aW51ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3doZW5XZWJNb2R1bGVEaXNwb3NlLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlU2Vzc2lvbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIgJiYgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZVNlc3Npb24gd2lsbCB0YWtlIDUgbWluIHRvIGNhbGxcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZGVsZXRlU2Vzc2lvbiBlcnJvcicsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjbG9zZUJyb3dzZXJXaW5kb3dzKHN0YXR1cykge1xyXG4gICAgICAgIGlmIChzdGF0dXMgJiYgJ0ZBSUxFRCcgPT09IHN0YXR1cy50b1VwcGVyQ2FzZSgpICYmIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc2VsZW5pdW1QaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoc3RhdHVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBjbG9zZSBicm93c2VyIHdpbmRvd3M6JywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcG9zZUNvbnRpbnVlKHN0YXR1cykge1xyXG4gICAgICAgIHRoaXMuZHJpdmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcblxyXG4gICAgICAgIC8vIGNsZWFudXAgY2hyb21lZHJpdmVyJ3Mgb25seSB3aGVuIHJ1bm5pbmcgZnJvbSB3aXRoaW4gdGhlIElERSBhbmQgdGVzdCBkaWQgbm90IGZhaWxcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zZWxlbml1bVBpZCAmJiAoIXN0YXR1cyB8fCAnRkFJTEVEJyAhPT0gc3RhdHVzLnRvVXBwZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCd0YXNra2lsbCAvSU0gY2hyb21lZHJpdmVyLmV4ZSAvRicsIHsgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXSB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBncmVwUmVzdWx0ID0gZXhlY1N5bmMoXCJwZ3JlcCAtZCcgJyBjaHJvbWVkcml2ZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0ICYmIHBncmVwUmVzdWx0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBncmVwUmVzdWx0ID0gcGdyZXBSZXN1bHQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU3luYygna2lsbCAtOSAnICsgcGdyZXBSZXN1bHQsIHsgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjbGVhbnVwIGVkZ2Vkcml2ZXIncyBvbmx5IHdoZW4gcnVubmluZyBmcm9tIHdpdGhpbiB0aGUgSURFIGFuZCB0ZXN0IGRpZCBub3QgZmFpbFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnNlbGVuaXVtUGlkICYmICghc3RhdHVzIHx8ICdGQUlMRUQnICE9PSBzdGF0dXMudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGZvciBub3dcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBncmVwUmVzdWx0ID0gZXhlY1N5bmMoXCJwZ3JlcCAtZCcgJyBtc2VkZ2Vkcml2ZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0ICYmIHBncmVwUmVzdWx0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBncmVwUmVzdWx0ID0gcGdyZXBSZXN1bHQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBncmVwUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU3luYygna2lsbCAtOSAnICsgcGdyZXBSZXN1bHQsIHsgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl93aGVuV2ViTW9kdWxlRGlzcG9zZS5yZXNvbHZlKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIF9pdGVyYXRpb25TdGFydCgpIHtcclxuICAgICAgICAvLyBjbGVhciB0cmFuc2FjdGlvbiBuYW1lIHNhdmVkIGluIHByZXZpb3VzIGl0ZXJhdGlvbiBpZiBhbnlcclxuICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9pdGVyYXRpb25FbmQoZXJyb3IpIHtcclxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLlNFTEVOSVVNX1NFU1NJT05fVElNRU9VVCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbGxlY3QgYnJvd3NlciBsb2dzIGZvciB0aGlzIHNlc3Npb25cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3RCcm93c2VyTG9ncyA9PT0gdHJ1ZSAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGxvZyBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnMubG9ncy5wdXNoKHRoaXMuX2FkanVzdEJyb3dzZXJMb2cobG9nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGJyb3dzZXIgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPOiBzaG91bGQgY2xlYXIgdHJhbnNhY3Rpb25zIHRvIGF2b2lkIGR1cGxpY2F0ZSBuYW1lcyBhY3Jvc3MgaXRlcmF0aW9uc1xyXG4gICAgICAgIC8vIGFsc28gc2hvdWxkIHRocm93IG9uIGR1cGxpY2F0ZSBuYW1lcy5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIG5vIHRyYW5zYWN0aW9ucyBzZXQgaWYgdGVzdCBmYWlscyBiZWZvcmUgd2ViLnRyYW5zYWN0aW9uIGNvbW1hbmRcclxuICAgICAgICAgICAgaWYgKGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnNbZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lXSA9IGF3YWl0IHRoaXMuX2dldEhBUigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJzLmhhciA9IHRoaXMudHJhbnNhY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIF9pc0FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIEFDVElPTl9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGFrZVNjcmVlbnNob3RTaWxlbnQobmFtZSkge1xyXG4gICAgICAgIGlmICghTk9fU0NSRUVOU0hPVF9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci50YWtlU2NyZWVuc2hvdFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYWxsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRVbnRpbFJldFZhbCA9IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCAoc2NyZWVuc2hvdCBhbmQgdGl0bGUpIGltYWdlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0V2luZG93SGFuZGxlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGhhbmRsZXMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZSBvZiBoYW5kbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc3dpdGNoVG9XaW5kb3coaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuZHJpdmVyLnRha2VTY3JlZW5zaG90KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRUaXRsZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFRvSW1hZ2UgPSByZXF1aXJlKCd0ZXh0LXRvLWltYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZUltYWdlID0gYXdhaXQgdGV4dFRvSW1hZ2UuZ2VuZXJhdGUodGl0bGUsIHsgZGVidWc6IGZhbHNlLCBmb250RmFtaWx5OiAnQXJpYWwnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGVJbWFnZSAmJiB0eXBlb2YgdGl0bGVJbWFnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSW1hZ2UgPSB0aXRsZUltYWdlLnJlcGxhY2UoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCh0aXRsZUltYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goaW1hZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbGwgaW1hZ2VzIGludG8gb25lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZEltYWdlID0gYXdhaXQgbWVyZ2VJbWFnZXMoaW1hZ2VzLCB7IGRpcmVjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlZEltYWdlICYmIHR5cGVvZiBtZXJnZWRJbWFnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IG1lcmdlZEltYWdlLnJlcGxhY2UoJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHRpbWVvdXQ6IDMwKjEwMDAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhaXRVbnRpbFJldFZhbCAmJiB3YWl0VW50aWxSZXRWYWwudGhlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRVbnRpbFJldFZhbC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90JywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCcsIGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCBpbm5lciBlcnJvcicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9hZGp1c3RCcm93c2VyTG9nKGxvZykge1xyXG4gICAgICAgIGlmICghbG9nIHx8IHR5cGVvZiBsb2cgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGxvZy50aW1lc3RhbXAgZnJvbSB0aGUgYnJvd3NlciB0aW1lIHpvbmUgdG8gdGhlIGxvY2FsIG9uZSAoc28gd2UgY2FuIGxhdGVyIGNvcnJlbGF0ZSBiZXR3ZWVuIHN0ZXBzIGFuZCBsb2dzKVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRpbWU6IGxvZy50aW1lc3RhbXAsXHJcbiAgICAgICAgICAgIG1zZzogbG9nLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgIC8vIGNvbnZlcnQgU0VWRVJFIGxvZyBsZXZlbCB0byBFUlJPUlxyXG4gICAgICAgICAgICBsZXZlbDogbG9nLmxldmVsID09PSAnU0VWRVJFJyA/ICdFUlJPUicgOiBsb2cubGV2ZWwsXHJcbiAgICAgICAgICAgIHNyYzogJ2Jyb3dzZXInXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogRklYTUU6IFRoZXJlIGlzIGEgYnVnIHdpdGggSUUuIFNlZSB0aGUgY29tbWVudCB3aXRoaW4gZnVuY3Rpb24gYm9keS5cclxuICAgICAqXHJcbiAgICAgKiAgZG9tQ29udGVudExvYWRlZCAoYWthIEZpcnN0IFZpc3VhbCBUaW1lKS0gUmVwcmVzZW50cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0IGFuZCBuYXZpZ2F0aW9uU3RhcnQuXHJcbiAgICAgKiAgbG9hZCAoYWthIEZ1bGwgTG9hZCBUaW1lKSAgICAgICAgICAgICAgIC0gUmVwcmVzZW50cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGxvYWRFdmVudFN0YXJ0IGFuZCBuYXZpZ2F0aW9uU3RhcnQuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHByb2Nlc3NpbmcgbW9kZWw6XHJcbiAgICAgKlxyXG4gICAgICogIDEuIG5hdmlnYXRpb25TdGFydCAgICAgICAgICAgICAgLSBUaGUgYnJvd3NlciBoYXMgcmVxdWVzdGVkIHRoZSBkb2N1bWVudC5cclxuICAgICAqICAyLiAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgIC0gTm90IHJlbGV2YW50IHRvIHVzLiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvbmF2aWdhdGlvbi10aW1pbmcvI3Byb2Nlc3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uXHJcbiAgICAgKiAgMy4gZG9tTG9hZGluZyAgICAgICAgICAgICAgICAgICAtIFRoZSBicm93c2VyIHN0YXJ0cyBwYXJzaW5nIHRoZSBkb2N1bWVudC5cclxuICAgICAqICA0LiBkb21JbnRlcmFjdGl2ZSAgICAgICAgICAgICAgIC0gVGhlIGJyb3dzZXIgaGFzIGZpbmlzaGVkIHBhcnNpbmcgdGhlIGRvY3VtZW50IGFuZCB0aGUgdXNlciBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgcGFnZS5cclxuICAgICAqICA1LiBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCAgIC0gVGhlIGRvY3VtZW50IGhhcyBiZWVuIGNvbXBsZXRlbHkgbG9hZGVkIGFuZCBwYXJzZWQgYW5kIGRlZmVycmVkIHNjcmlwdHMsIGlmIGFueSwgaGF2ZSBleGVjdXRlZC4gXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jIHNjcmlwdHMsIGlmIGFueSwgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgZXhlY3V0ZWQuXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlc2hlZXRzWzFdLCBpbWFnZXMsIGFuZCBzdWJmcmFtZXMgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgZmluaXNoZWQgbG9hZGluZy5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV0gLSBTdHlsZXNoZWV0cyAvdXN1YWxseS8gZGVmZXIgdGhpcyBldmVudCEgLSBodHRwOi8vbW9saWx5LmRlL3dlYmxvZy9kb21jb250ZW50bG9hZGVkXHJcbiAgICAgKiAgNi4gZG9tQ29udGVudExvYWRlZEV2ZW50RW5kICAgICAtIFRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGNhbGxiYWNrLCBpZiBhbnksIGZpbmlzaGVkIGV4ZWN1dGluZy4gRS5nLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRE9NIGZ1bGx5IGxvYWRlZCBhbmQgcGFyc2VkXCIpO1xyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICogIDcuIGRvbUNvbXBsZXRlICAgICAgICAgICAgICAgICAgLSBUaGUgRE9NIHRyZWUgaXMgY29tcGxldGVseSBidWlsdC4gQXN5bmMgc2NyaXB0cywgaWYgYW55LCBoYXZlIGV4ZWN1dGVkLlxyXG4gICAgICogIDguIGxvYWRFdmVudFN0YXJ0ICAgICAgICAgICAgICAgLSBUaGUgYnJvd3NlciBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgYWxsIHRoZSByZXNvdXJjZXMgbGlrZSBpbWFnZXMsIHN3ZiwgZXRjLlxyXG4gICAgICogIDkuIGxvYWRFdmVudEVuZCAgICAgICAgICAgICAgICAgLSBUaGUgbG9hZCBldmVudCBjYWxsYmFjaywgaWYgYW55LCBmaW5pc2hlZCBleGVjdXRpbmcuXHJcbiAgICAgKi9cclxuICAgIF9nZXRTdGF0cyhjb21tYW5kTmFtZSkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmV0Y2hTdGF0cyAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5faXNBY3Rpb24oY29tbWFuZE5hbWUpKSB7XHJcbiAgICAgICAgICAgIHZhciBuYXZpZ2F0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIHZhciBkb21Db250ZW50TG9hZGVkID0gMDtcclxuICAgICAgICAgICAgdmFyIGxvYWQgPSAwO1xyXG4gICAgICAgICAgICB2YXIgc2FtZVBhZ2UgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmb2xsb3dpbmcgc2l0dWF0aW9uOlxyXG4gICAgICAgICAgICAvLyBpZiBuYXZpZ2F0ZVN0YXJ0IGVxdWFscyB0byB0aGUgb25lIHdlIGdvdCBmcm9tIHByZXZpb3VzIGF0dGVtcHQgKHdlIG5lZWQgdG8gc2F2ZSBpdClcclxuICAgICAgICAgICAgLy8gaXQgbWVhbnMgd2UgYXJlIHN0aWxsIG9uIHRoZSBzYW1lIHBhZ2UgYW5kIGRvbid0IG5lZWQgdG8gcmVjb3JkIGxvYWQvZG9tQ29udGVudExvYWRlZCB0aW1lc1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FsbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0VW50aWxSZXRWYWwgPSB0aGlzLmRyaXZlci53YWl0VW50aWwoYXN5bmMoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZ2xvYmFsIHdpbmRvdyovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWluZ3MgPSBhd2FpdCB0aGlzLmRyaXZlci5leGVjdXRlKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvblN0YXJ0OiB3aW5kb3cucGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0OiB3aW5kb3cucGVyZm9ybWFuY2UudGltaW5nLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEV2ZW50U3RhcnQ6IHdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmcubG9hZEV2ZW50U3RhcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWluZ3MuZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgPiAwICYmIHRpbWluZ3MubG9hZEV2ZW50U3RhcnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWVQYWdlID0gdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSAmJiB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID09IHRpbWluZ3MubmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uU3RhcnQgPSB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gdGltaW5ncy5uYXZpZ2F0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCA9IHRpbWluZ3MuZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2FkRXZlbnRTdGFydCA9IHRpbWluZ3MubG9hZEV2ZW50U3RhcnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Db250ZW50TG9hZGVkID0gZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgLSBuYXZpZ2F0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQgPSBsb2FkRXZlbnRTdGFydCAtIG5hdmlnYXRpb25TdGFydDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCA+IDAgJiYgbG9hZEV2ZW50U3RhcnQgPiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChleGVjdXRlRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGVycm9yIGluc2lkZSBkcml2ZXIuZXhlY3V0ZSBvciBkcml2ZXIud2FpdFVudGlsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZXhlY3V0ZUVycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHRpbWVvdXQ6IDMwKjEwMDAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFVudGlsUmV0VmFsICYmIHdhaXRVbnRpbFJldFZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0VW50aWxSZXRWYWwudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmludCBlcnJvciBmcm9tIGRyaXZlci5leGVjdXRlIG9yIGRyaXZlci53YWl0VW50aWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobGFzdEVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbnQgZXJyb3IgZnJvbSBkcml2ZXIuZXhlY3V0ZSBvciBkcml2ZXIud2FpdFVudGlsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxhc3RFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgICAgICAgICAvLyBjb3VsZG4ndCBnZXQgdGltaW5ncy5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG5hdmlnYXRpb25TdGFydDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzYW1lUGFnZSA/IHt9IDogeyBEb21Db250ZW50TG9hZGVkRXZlbnQ6IGRvbUNvbnRlbnRMb2FkZWQsIExvYWRFdmVudDogbG9hZCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlXHJcbiAgICAgKiAgICAgICAgICAgICAgdW5pcXVlLlxyXG4gICAgICogQGZ1bmN0aW9uIHRyYW5zYWN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSB0cmFuc2FjdGlvbiBuYW1lLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgaWYgKGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uc1tnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWVdID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVjb3JkSEFSICYmIHRoaXMuaXNJbml0aWFsaXplZCAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uc1tnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWVdID0gYXdhaXQgdGhpcy5fZ2V0SEFSKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2FjdGlvbnNbbmFtZV0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ZXIgPSBPYmplY3Qua2V5cyh0aGlzLnRyYW5zYWN0aW9ucykuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnN0YXJ0c1dpdGgobmFtZSkpLmxlbmd0aCArIDE7XHJcbiAgICAgICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWUrJyAoIycrY291bnRlcisnKSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRIZWxwZXJGdW5jdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yID0gbW9kVXRpbHMuZ2V0V2Rpb0xvY2F0b3I7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLm1hdGNoUGF0dGVybiA9IG1vZFV0aWxzLm1hdGNoUGF0dGVybjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0RWxlbWVudCA9IG1vZFV0aWxzLmdldEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldEVsZW1lbnRzID0gbW9kVXRpbHMuZ2V0RWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldENoaWxkRWxlbWVudCA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0Q2hpbGRFbGVtZW50cyA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLnNldFRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnNldFRpbWVvdXRJbXBsaWNpdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50ID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmcgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlciA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZTtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRCb29sO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudFRpbWVvdXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50U3RyaW5nID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRTdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2dldEhBUigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldExvZ1R5cGVzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZXMuaW5jbHVkZXMoJ3BlcmZvcm1hbmNlJykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRMb2dzKCdwZXJmb3JtYW5jZScpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGluIG9uZSBpbnN0YW5jZSwgbG9ncyB3YXMgbm90IGl0ZXJhYmxlIGZvciBzb21lIHJlYXNvbiAtIGhlbmNlIHRoZSBmb2xsb3dpbmcgY2hlY2s6XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvZ3MgfHwgdHlwZW9mIGxvZ3NbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdnZXRIQVI6IGxvZ3Mgbm90IGl0ZXJhYmxlOiAnICsgSlNPTi5zdHJpbmdpZnkobG9ncykpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbG9nIG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dPYmogPSBKU09OLnBhcnNlKGxvZy5tZXNzYWdlKTsgICAvLyByZXR1cm5lZCBhcyBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICBldmVudHMucHVzaChtc2dPYmoubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFyID0gaGFyRnJvbU1lc3NhZ2VzKGV2ZW50cyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaGFyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIGZldGNoIEhBUjogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjaGVja1dhaXRGb3JBbmd1bGFyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JBbmd1bGFyKHRoaXMuYXV0b1dhaXRGb3JBbmd1bGFyUm9vdFNlbGVjdG9yLCB0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhclRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2VuZFJlc3VsdFN0YXR1c1RvTGFtYmRhVGVzdChzdGF0dXMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsYW1iZGFDcmVkZW50aWFscyA9IHtcclxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLndkaW9PcHRzLnVzZXIsXHJcbiAgICAgICAgICAgICAgICBhY2Nlc3NLZXk6IHRoaXMud2Rpb09wdHMua2V5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuICAgICAgICAgICAgY29uc3QgbGFtYmRhQXV0b21hdGlvbkNsaWVudCA9IGxhbWJkYVJlc3RDbGllbnQuQXV0b21hdGlvbkNsaWVudChcclxuICAgICAgICAgICAgICAgIGxhbWJkYUNyZWRlbnRpYWxzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzX2luZDogc3RhdHVzID09PSAnUEFTU0VEJyA/ICdwYXNzZWQnIDogJ2ZhaWxlZCdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxhbWJkYUF1dG9tYXRpb25DbGllbnQudXBkYXRlU2Vzc2lvbkJ5SWQoc2Vzc2lvbklkLCByZXF1ZXN0Qm9keSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gc2VuZCByZXN1bHQgc3RhdHVzIHRvIExhbWJkYVRlc3Q6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3NlbmRSZXN1bHRTdGF0dXNUb1Rlc3RpbmdCb3Qoc3RhdHVzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5kcml2ZXIuc2Vzc2lvbklkO1xyXG4gICAgICAgICAgICBjb25zdCB0YiA9IG5ldyBUZXN0aW5nQm90KHtcclxuICAgICAgICAgICAgICAgIGFwaV9rZXk6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgIGFwaV9zZWNyZXQ6IHRoaXMud2Rpb09wdHMua2V5XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0RGF0YSA9IHsgXCJ0ZXN0W3N1Y2Nlc3NdXCIgOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gXCIxXCIgOiBcIjBcIiB9O1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGIudXBkYXRlVGVzdCh0ZXN0RGF0YSwgc2Vzc2lvbklkLCBmdW5jdGlvbihlcnJvciwgdGVzdERldGFpbHMpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBzZW5kIHJlc3VsdCBzdGF0dXMgdG8gVGVzdGluZ0JvdDogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2VuZFJlc3VsdFN0YXR1c1RvQnJvd3NlcnN0YWNrKHN0YXR1cykge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gJ3Bhc3NlZCcgOiAnZmFpbGVkJ1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIHVybDogYGh0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcclxuICAgICAgICAgICAgICAgIGpzb246IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXHJcbiAgICAgICAgICAgICAgICAnYXV0aCc6IHtcclxuICAgICAgICAgICAgICAgICAgICAndXNlcic6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgICAgICAncGFzcyc6IHRoaXMud2Rpb09wdHMua2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICdzZW5kSW1tZWRpYXRlbHknOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0KG9wdGlvbnMsIChlcnIsIHJlcywgYm9keSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHNlbmQgcmVzdWx0IHN0YXR1cyB0byBCcm93c2Vyc3RhY2s6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdfQ==
|