testcafe 3.5.0 → 3.6.0

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.
@@ -216,6 +216,9 @@ class TestRun extends async_event_emitter_1.default {
216
216
  ? this.restRunExecutionTimeout
217
217
  : this.testExecutionTimeout || null;
218
218
  }
219
+ async getCurrentCDPSession() {
220
+ return this.browserConnection.getCurrentCDPSession();
221
+ }
219
222
  _addClientScriptContentWarningsIfNecessary() {
220
223
  const { empty, duplicatedContent } = (0, utils_1.findProblematicScripts)(this.test.clientScripts);
221
224
  if (empty.length)
@@ -794,6 +797,8 @@ class TestRun extends async_event_emitter_1.default {
794
797
  return Promise.all(command.hooks.map(hook => this._addRequestHook(hook)));
795
798
  if (command.type === type_1.default.removeRequestHooks)
796
799
  return Promise.all(command.hooks.map(hook => this._removeRequestHook(hook)));
800
+ if (command.type === type_1.default.getCurrentCDPSession)
801
+ return this.getCurrentCDPSession();
797
802
  return this._enqueueCommand(command, callsite);
798
803
  }
799
804
  _rejectCommandWithPageError(callsite) {
@@ -1011,4 +1016,4 @@ class TestRun extends async_event_emitter_1.default {
1011
1016
  }
1012
1017
  exports.default = TestRun;
1013
1018
  module.exports = exports.default;
1014
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1ydW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUlnQjtBQUVoQixtQ0FBZ0M7QUFDaEMsMkRBQXNEO0FBQ3RELHNFQUE2QztBQUM3Qyx3REFBZ0M7QUFDaEMsdUZBQTZEO0FBQzdELDREQUEwQztBQUMxQyxpR0FBb0Y7QUFDcEYsc0VBQXFEO0FBQ3JELCtDQUFpRDtBQUVqRCxrREFVNkI7QUFFN0Isd0VBQWdEO0FBQ2hELDJEQUEyQztBQUMzQywyREFBbUM7QUFDbkMsbUZBQXlEO0FBQ3pELG9FQUE0QztBQUM1QywrRUFBcUQ7QUFDckQsMERBQXVDO0FBQ3ZDLDBFQUF5RDtBQUN6RCwwRkFBZ0U7QUFDaEUsK0VBQXNEO0FBQ3RELHVGQUErRDtBQUUvRCw2REFRNkI7QUFFN0IsbUVBQXFEO0FBQ3JELDBEQUF3RTtBQUN4RSw0Q0FBK0U7QUFFL0UsNENBUTBCO0FBRTFCLGdEQVk0QjtBQUc1QiwyQ0FBa0U7QUFDbEUsNEZBQWlFO0FBQ2pFLCtEQUF5RjtBQUl6Riw4RUFBcUQ7QUFFckQsOEZBQW9FO0FBQ3BFLDhGQUFvRTtBQU1wRSxnREFBb0U7QUFLcEUsdUdBQTZFO0FBTTdFLG9EQUFtQztBQUVuQyxnRkFHNEM7QUFFNUMsaUdBQXVFO0FBQ3ZFLHVFQUE4QztBQUM5QyxzRUFBdUQ7QUFDdkQseUVBQWdEO0FBR2hELCtGQUFvRTtBQUNwRSw2QkFBMEI7QUFFMUIsMERBQW1FO0FBQ25FLCtDQUEwRDtBQUcxRCxnREFBNkQ7QUFFN0QsbUZBQXlEO0FBRXpELG1EQUl5QjtBQUl6QixrRkFBd0Q7QUFFeEQsTUFBTSxXQUFXLEdBQXFCLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0RSxNQUFNLHFCQUFxQixHQUFXLFdBQVcsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFD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QUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pCOztnQkFFRyxJQUFJLENBQUMsb0NBQW9DLEdBQUcsT0FBTyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBaHlDRCwwQkFneUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBwdWxsLFxuICAgIHJlbW92ZSxcbiAgICBjaGFpbixcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJztcbmltcG9ydCB7IHJlYWRTeW5jIGFzIHJlYWQgfSBmcm9tICdyZWFkLWZpbGUtcmVsYXRpdmUnO1xuaW1wb3J0IHByb21pc2lmeUV2ZW50IGZyb20gJ3Byb21pc2lmeS1ldmVudCc7XG5pbXBvcnQgTXVzdGFjaGUgZnJvbSAnbXVzdGFjaGUnO1xuaW1wb3J0IEFzeW5jRXZlbnRFbWl0dGVyIGZyb20gJy4uL3V0aWxzL2FzeW5jLWV2ZW50LWVtaXR0ZXInO1xuaW1wb3J0IFRlc3RSdW5EZWJ1Z0xvZyBmcm9tICcuL2RlYnVnLWxvZyc7XG5pbXBvcnQgVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyIGZyb20gJy4uL2Vycm9ycy90ZXN0LXJ1bi9mb3JtYXR0YWJsZS1hZGFwdGVyJztcbmltcG9ydCBUZXN0Q2FmZUVycm9yTGlzdCBmcm9tICcuLi9lcnJvcnMvZXJyb3ItbGlzdCc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvcnVudGltZSc7XG5cbmltcG9ydCB7XG4gICAgUmVxdWVzdEhvb2tVbmhhbmRsZWRFcnJvcixcbiAgICBQYWdlTG9hZEVycm9yLFxuICAgIFJvbGVTd2l0Y2hJblJvbGVJbml0aWFsaXplckVycm9yLFxuICAgIFN3aXRjaFRvV2luZG93UHJlZGljYXRlRXJyb3IsXG4gICAgV2luZG93Tm90Rm91bmRFcnJvcixcbiAgICBSZXF1ZXN0SG9va0Jhc2VFcnJvcixcbiAgICBUZXN0VGltZW91dEVycm9yLFxuICAgIEV4dGVybmFsQXNzZXJ0aW9uTGlicmFyeUVycm9yLFxuICAgIFJ1blRpbWVvdXRFcnJvcixcbn0gZnJvbSAnLi4vZXJyb3JzL3Rlc3QtcnVuLyc7XG5cbmltcG9ydCBDTElFTlRfTUVTU0FHRVMgZnJvbSAnLi9jbGllbnQtbWVzc2FnZXMnO1xuaW1wb3J0IENPTU1BTkRfVFlQRSBmcm9tICcuL2NvbW1hbmRzL3R5cGUnO1xuaW1wb3J0IGRlbGF5IGZyb20gJy4uL3V0aWxzL2RlbGF5JztcbmltcG9ydCBpc1Bhc3N3b3JkSW5wdXQgZnJvbSAnLi4vdXRpbHMvaXMtcGFzc3dvcmQtaW5wdXQnO1xuaW1wb3J0IHRlc3RSdW5NYXJrZXIgZnJvbSAnLi9tYXJrZXItc3ltYm9sJztcbmltcG9ydCB0ZXN0UnVuVHJhY2tlciBmcm9tICcuLi9hcGkvdGVzdC1ydW4tdHJhY2tlcic7XG5pbXBvcnQgUk9MRV9QSEFTRSBmcm9tICcuLi9yb2xlL3BoYXNlJztcbmltcG9ydCBSZXBvcnRlclBsdWdpbkhvc3QgZnJvbSAnLi4vcmVwb3J0ZXIvcGx1Z2luLWhvc3QnO1xuaW1wb3J0IEJyb3dzZXJDb25zb2xlTWVzc2FnZXMgZnJvbSAnLi9icm93c2VyLWNvbnNvbGUtbWVzc2FnZXMnO1xuaW1wb3J0IFdhcm5pbmdMb2cgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLWxvZyc7XG5pbXBvcnQgV0FSTklOR19NRVNTQUdFIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1tZXNzYWdlJztcblxuaW1wb3J0IHtcbiAgICBTdGF0ZVNuYXBzaG90LFxuICAgIFNQRUNJQUxfRVJST1JfUEFHRSxcbiAgICBSZXF1ZXN0RmlsdGVyUnVsZSxcbiAgICBJbmplY3RhYmxlUmVzb3VyY2VzLFxuICAgIFJlcXVlc3RIb29rTWV0aG9kRXJyb3IsXG4gICAgU3RvcmFnZXNTbmFwc2hvdCxcbiAgICBSZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIsXG59IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuXG5pbXBvcnQgKiBhcyBJTkpFQ1RBQkxFUyBmcm9tICcuLi9hc3NldHMvaW5qZWN0YWJsZXMnO1xuaW1wb3J0IHsgZmluZFByb2JsZW1hdGljU2NyaXB0cyB9IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy91dGlscyc7XG5pbXBvcnQgeyBnZXRQbHVyYWxTdWZmaXgsIGdldENvbmNhdGVuYXRlZFZhbHVlc1N0cmluZyB9IGZyb20gJy4uL3V0aWxzL3N0cmluZyc7XG5cbmltcG9ydCB7XG4gICAgaXNDb21tYW5kUmVqZWN0YWJsZUJ5UGFnZUVycm9yLFxuICAgIGlzQnJvd3Nlck1hbmlwdWxhdGlvbkNvbW1hbmQsXG4gICAgaXNTY3JlZW5zaG90Q29tbWFuZCxcbiAgICBpc1NlcnZpY2VDb21tYW5kLFxuICAgIGNhblNldERlYnVnZ2VyQnJlYWtwb2ludEJlZm9yZUNvbW1hbmQsXG4gICAgaXNFeGVjdXRhYmxlT25DbGllbnRDb21tYW5kLFxuICAgIGlzUmVzaXplV2luZG93Q29tbWFuZCxcbn0gZnJvbSAnLi9jb21tYW5kcy91dGlscyc7XG5cbmltcG9ydCB7XG4gICAgRXhlY3V0ZUFzeW5jRXhwcmVzc2lvbkNvbW1hbmQsXG4gICAgRXhlY3V0ZUV4cHJlc3Npb25Db21tYW5kLFxuICAgIEdldEN1cnJlbnRXaW5kb3dzQ29tbWFuZCxcbiAgICBTd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZCxcbiAgICBTd2l0Y2hUb1dpbmRvd0NvbW1hbmQsXG4gICAgR2V0Q29va2llc0NvbW1hbmQsXG4gICAgU2V0Q29va2llc0NvbW1hbmQsXG4gICAgRGVsZXRlQ29va2llc0NvbW1hbmQsXG4gICAgQWRkUmVxdWVzdEhvb2tzQ29tbWFuZCxcbiAgICBSZW1vdmVSZXF1ZXN0SG9va3NDb21tYW5kLFxuICAgIFJ1bkN1c3RvbUFjdGlvbkNvbW1hbmQsXG59IGZyb20gJy4vY29tbWFuZHMvYWN0aW9ucyc7XG5pbXBvcnQgeyBEZWJ1Z0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29ic2VydmF0aW9uJztcblxuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMsIFRFU1RfUlVOX0VSUk9SUyB9IGZyb20gJy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgcHJvY2Vzc1Rlc3RGbkVycm9yIGZyb20gJy4uL2Vycm9ycy9wcm9jZXNzLXRlc3QtZm4tZXJyb3InO1xuaW1wb3J0IHsgY3JlYXRlUmVwbGljYXRvciwgU2VsZWN0b3JOb2RlVHJhbnNmb3JtIH0gZnJvbSAnLi4vY2xpZW50LWZ1bmN0aW9ucy9yZXBsaWNhdG9yJztcbmltcG9ydCBUZXN0IGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvdGVzdCc7XG5pbXBvcnQgQ2FwdHVyZXIgZnJvbSAnLi4vc2NyZWVuc2hvdHMvY2FwdHVyZXInO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uL2NvbmZpZ3VyYXRpb24vaW50ZXJmYWNlcyc7XG5pbXBvcnQgU2Vzc2lvbkNvbnRyb2xsZXIgZnJvbSAnLi9zZXNzaW9uLWNvbnRyb2xsZXInO1xuaW1wb3J0IFRlc3RDb250cm9sbGVyIGZyb20gJy4uL2FwaS90ZXN0LWNvbnRyb2xsZXInO1xuaW1wb3J0IEJyb3dzZXJNYW5pcHVsYXRpb25RdWV1ZSBmcm9tICcuL2Jyb3dzZXItbWFuaXB1bGF0aW9uLXF1ZXVlJztcbmltcG9ydCBPYnNlcnZlZENhbGxzaXRlc1N0b3JhZ2UgZnJvbSAnLi9vYnNlcnZlZC1jYWxsc2l0ZXMtc3RvcmFnZSc7XG5pbXBvcnQgQ2xpZW50U2NyaXB0IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9jbGllbnQtc2NyaXB0JztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbiBmcm9tICcuLi9icm93c2VyL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IHsgUXVhcmFudGluZSB9IGZyb20gJy4uL3V0aWxzL2dldC1vcHRpb25zL3F1YXJhbnRpbmUnO1xuaW1wb3J0IFJlcXVlc3RIb29rIGZyb20gJy4uL2FwaS9yZXF1ZXN0LWhvb2tzL2hvb2snO1xuaW1wb3J0IERyaXZlclN0YXR1cyBmcm9tICcuLi9jbGllbnQvZHJpdmVyL3N0YXR1cyc7XG5pbXBvcnQgeyBDb21tYW5kQmFzZSwgQWN0aW9uQ29tbWFuZEJhc2UgfSBmcm9tICcuL2NvbW1hbmRzL2Jhc2UuanMnO1xuaW1wb3J0IFJvbGUgZnJvbSAnLi4vcm9sZS9yb2xlJztcbmltcG9ydCB7IFRlc3RSdW5FcnJvckJhc2UgfSBmcm9tICcuLi9zaGFyZWQvZXJyb3JzJztcbmltcG9ydCB7IENhbGxzaXRlUmVjb3JkIH0gZnJvbSAnQGRldmV4cHJlc3MvY2FsbHNpdGUtcmVjb3JkJztcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcbmltcG9ydCBnZXRBc3NlcnRpb25UaW1lb3V0IGZyb20gJy4uL3V0aWxzL2dldC1vcHRpb25zL2dldC1hc3NlcnRpb24tdGltZW91dCc7XG5pbXBvcnQgeyBBc3NlcnRpb25Db21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9hc3NlcnRpb24nO1xuaW1wb3J0IHsgVGFrZVNjcmVlbnNob3RCYXNlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnJvd3Nlci1tYW5pcHVsYXRpb24nO1xuLy9AdHMtaWdub3JlXG5pbXBvcnQgeyBUZXN0UnVuIGFzIExlZ2FjeVRlc3RSdW4gfSBmcm9tICd0ZXN0Y2FmZS1sZWdhY3ktYXBpJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFscyB9IGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvaW50ZXJmYWNlcyc7XG5pbXBvcnQgVGVzdFJ1blBoYXNlIGZyb20gJy4vcGhhc2UnO1xuXG5pbXBvcnQge1xuICAgIEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQsXG4gICAgRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZCxcbn0gZnJvbSAnLi9jb21tYW5kcy9leGVjdXRlLWNsaWVudC1mdW5jdGlvbic7XG5cbmltcG9ydCBhZGRSZW5kZXJlZFdhcm5pbmcgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy9hZGQtcmVuZGVyZWQtd2FybmluZyc7XG5pbXBvcnQgZ2V0QnJvd3NlciBmcm9tICcuLi91dGlscy9nZXQtYnJvd3Nlcic7XG5pbXBvcnQgQXNzZXJ0aW9uRXhlY3V0b3IgZnJvbSAnLi4vYXNzZXJ0aW9ucy9leGVjdXRvcic7XG5pbXBvcnQgYXN5bmNGaWx0ZXIgZnJvbSAnLi4vdXRpbHMvYXN5bmMtZmlsdGVyJztcbmltcG9ydCBGaXh0dXJlIGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvZml4dHVyZSc7XG5pbXBvcnQgTWVzc2FnZUJ1cyBmcm9tICcuLi91dGlscy9tZXNzYWdlLWJ1cyc7XG5pbXBvcnQgZXhlY3V0ZUZuV2l0aFRpbWVvdXQgZnJvbSAnLi4vdXRpbHMvZXhlY3V0ZS1mbi13aXRoLXRpbWVvdXQnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IENvb2tpZU9wdGlvbnMgfSBmcm9tICcuL2NvbW1hbmRzL29wdGlvbnMnO1xuaW1wb3J0IHsgcHJlcGFyZVNraXBKc0Vycm9yc09wdGlvbnMgfSBmcm9tICcuLi9hcGkvc2tpcC1qcy1lcnJvcnMnO1xuaW1wb3J0IHsgQ29va2llUHJvdmlkZXJGYWN0b3J5IH0gZnJvbSAnLi9jb29raWVzL2ZhY3RvcnknO1xuaW1wb3J0IHsgQ29va2llUHJvdmlkZXIgfSBmcm9tICcuL2Nvb2tpZXMvYmFzZSc7XG5pbXBvcnQgeyBTdG9yYWdlc1Byb3ZpZGVyIH0gZnJvbSAnLi9zdG9yYWdlcy9iYXNlJztcbmltcG9ydCB7IFN0b3JhZ2VzUHJvdmlkZXJGYWN0b3J5IH0gZnJvbSAnLi9zdG9yYWdlcy9mYWN0b3J5JztcblxuaW1wb3J0IHdyYXBDdXN0b21BY3Rpb24gZnJvbSAnLi4vYXBpL3dyYXAtY3VzdG9tLWFjdGlvbic7XG5cbmltcG9ydCB7XG4gICAgTmF0aXZlQXV0b21hdGlvblJvbGVQcm92aWRlcixcbiAgICBQcm94eVJvbGVQcm92aWRlcixcbiAgICBSb2xlUHJvdmlkZXIsXG59IGZyb20gJy4vcm9sZS1wcm92aWRlcic7XG5cbmltcG9ydCBOYXRpdmVBdXRvbWF0aW9uUmVxdWVzdFBpcGVsaW5lIGZyb20gJy4uL25hdGl2ZS1hdXRvbWF0aW9uL3JlcXVlc3QtcGlwZWxpbmUnO1xuaW1wb3J0IHsgTmF0aXZlQXV0b21hdGlvbkJhc2UgfSBmcm9tICcuLi9uYXRpdmUtYXV0b21hdGlvbic7XG5pbXBvcnQgUmVwb3J0RGF0YUxvZyBmcm9tICcuLi9yZXBvcnRlci9yZXBvcnQtZGF0YS1sb2cnO1xuXG5jb25zdCBsYXp5UmVxdWlyZSAgICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJ2ltcG9ydC1sYXp5JykocmVxdWlyZSk7XG5jb25zdCBDbGllbnRGdW5jdGlvbkJ1aWxkZXIgICAgICAgICA9IGxhenlSZXF1aXJlKCcuLi9jbGllbnQtZnVuY3Rpb25zL2NsaWVudC1mdW5jdGlvbi1idWlsZGVyJyk7XG5jb25zdCBUZXN0UnVuQm9va21hcmsgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2Jvb2ttYXJrJyk7XG5jb25zdCBhY3Rpb25Db21tYW5kcyAgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2NvbW1hbmRzL2FjdGlvbnMnKTtcbmNvbnN0IGJyb3dzZXJNYW5pcHVsYXRpb25Db21tYW5kcyAgID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvYnJvd3Nlci1tYW5pcHVsYXRpb24nKTtcbmNvbnN0IHNlcnZpY2VDb21tYW5kcyAgICAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvc2VydmljZScpO1xuY29uc3QgZXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZHMgPSBsYXp5UmVxdWlyZSgnLi9jb21tYW5kcy9leGVjdXRlLWNsaWVudC1mdW5jdGlvbicpO1xuXG5jb25zdCB7IGV4ZWN1dGVKc0V4cHJlc3Npb24sIGV4ZWN1dGVBc3luY0pzRXhwcmVzc2lvbiB9ID0gbGF6eVJlcXVpcmUoJy4vZXhlY3V0ZS1qcy1leHByZXNzaW9uJyk7XG5cbmNvbnN0IFRFU1RfUlVOX1RFTVBMQVRFICAgICAgICAgICAgICAgPSByZWFkKCcuLi9jbGllbnQvdGVzdC1ydW4vaW5kZXguanMubXVzdGFjaGUnKSBhcyBzdHJpbmc7XG5jb25zdCBJRlJBTUVfVEVTVF9SVU5fVEVNUExBVEUgICAgICAgID0gcmVhZCgnLi4vY2xpZW50L3Rlc3QtcnVuL2lmcmFtZS5qcy5tdXN0YWNoZScpIGFzIHN0cmluZztcbmNvbnN0IFRFU1RfRE9ORV9DT05GSVJNQVRJT05fUkVTUE9OU0UgPSAndGVzdC1kb25lLWNvbmZpcm1hdGlvbic7XG5jb25zdCBNQVhfUkVTUE9OU0VfREVMQVkgICAgICAgICAgICAgID0gMzAwMDtcbmNvbnN0IENISUxEX1dJTkRPV19SRUFEWV9USU1FT1VUICAgICAgPSAzMCAqIDEwMDA7XG5cbmNvbnN0IEFMTF9EUklWRVJfVEFTS1NfQURERURfVE9fUVVFVUVfRVZFTlQgPSAnYWxsLWRyaXZlci10YXNrcy1hZGRlZC10by1xdWV1ZSc7XG5cblxuaW50ZXJmYWNlIFRlc3RSdW5Jbml0IHtcbiAgICB0ZXN0OiBUZXN0O1xuICAgIGJyb3dzZXJDb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbjtcbiAgICBzY3JlZW5zaG90Q2FwdHVyZXI6IENhcHR1cmVyO1xuICAgIGdsb2JhbFdhcm5pbmdMb2c6IFdhcm5pbmdMb2c7XG4gICAgb3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT47XG4gICAgbWVzc2FnZUJ1cz86IE1lc3NhZ2VCdXM7XG4gICAgc3RhcnRSdW5FeGVjdXRpb25UaW1lPzogRGF0ZTtcbiAgICBuYXRpdmVBdXRvbWF0aW9uOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRHJpdmVyVGFzayB7XG4gICAgY29tbWFuZDogQ29tbWFuZEJhc2U7XG4gICAgcmVzb2x2ZTogRnVuY3Rpb247XG4gICAgcmVqZWN0OiBGdW5jdGlvbjtcbiAgICBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQ7XG59XG5cbmludGVyZmFjZSBEcml2ZXJNZXNzYWdlIHtcbiAgICBzdGF0dXM6IERyaXZlclN0YXR1cztcbn1cblxuaW50ZXJmYWNlIERyaXZlcldhcm5pbmcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBXQVJOSU5HX01FU1NBR0U7XG4gICAgYXJnczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBSZXF1ZXN0VGltZW91dCB7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBhamF4PzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRXhlY3V0aW9uVGltZW91dCB7XG4gICAgdGltZW91dDogbnVtYmVyO1xuICAgIHJlamVjdFdpdGg6IFRlc3RUaW1lb3V0RXJyb3IgfCBSdW5UaW1lb3V0RXJyb3I7XG59XG5cbmludGVyZmFjZSBQZW5kaW5nUmVxdWVzdCB7XG4gICAgcmVzcG9uc2VUaW1lb3V0OiBOb2RlSlMuVGltZW91dDtcbiAgICByZXNvbHZlOiBGdW5jdGlvbjtcbiAgICByZWplY3Q6IEZ1bmN0aW9uO1xufVxuXG5pbnRlcmZhY2UgQnJvd3Nlck1hbmlwdWxhdGlvblJlc3VsdCB7XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGVycm9yOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgT3BlbmVkV2luZG93SW5mb3JtYXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVzdFJ1biBleHRlbmRzIEFzeW5jRXZlbnRFbWl0dGVyIHtcbiAgICBwcml2YXRlIFt0ZXN0UnVuTWFya2VyXTogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgd2FybmluZ0xvZzogV2FybmluZ0xvZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0RGF0YUxvZzogUmVwb3J0RGF0YUxvZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+O1xuICAgIHB1YmxpYyByZWFkb25seSB0ZXN0OiBUZXN0O1xuICAgIHB1YmxpYyByZWFkb25seSBicm93c2VyQ29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb247XG4gICAgcHVibGljIHVuc3RhYmxlOiBib29sZWFuO1xuICAgIHB1YmxpYyBwaGFzZTogVGVzdFJ1blBoYXNlO1xuICAgIHByaXZhdGUgZHJpdmVyVGFza1F1ZXVlOiBEcml2ZXJUYXNrW107XG4gICAgcHJpdmF0ZSB0ZXN0RG9uZUNvbW1hbmRRdWV1ZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIGFjdGl2ZURpYWxvZ0hhbmRsZXI6IEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQgfCBudWxsO1xuICAgIHB1YmxpYyBhY3RpdmVJZnJhbWVTZWxlY3RvcjogRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZCB8IG51bGw7XG4gICAgcHVibGljIHNwZWVkOiBudW1iZXI7XG4gICAgcHVibGljIHBhZ2VMb2FkVGltZW91dDogbnVtYmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVzdEV4ZWN1dGlvblRpbWVvdXQ6IEV4ZWN1dGlvblRpbWVvdXQgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcnVuRXhlY3V0aW9uVGltZW91dDogRXhlY3V0aW9uVGltZW91dCB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXNhYmxlUGFnZVJlbG9hZHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNhYmxlUGFnZUNhY2hpbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVxdWVzdFRpbWVvdXQ6IFJlcXVlc3RUaW1lb3V0O1xuICAgIHB1YmxpYyByZWFkb25seSBzZXNzaW9uOiBTZXNzaW9uQ29udHJvbGxlcjtcbiAgICBwdWJsaWMgY29uc29sZU1lc3NhZ2VzOiBCcm93c2VyQ29uc29sZU1lc3NhZ2VzO1xuICAgIHByaXZhdGUgcGVuZGluZ1JlcXVlc3Q6IFBlbmRpbmdSZXF1ZXN0IHwgbnVsbDtcbiAgICBwdWJsaWMgcGVuZGluZ1BhZ2VFcnJvcjogUGFnZUxvYWRFcnJvciB8IEVycm9yIHwgbnVsbDtcbiAgICBwdWJsaWMgY29udHJvbGxlcjogVGVzdENvbnRyb2xsZXIgfCBudWxsO1xuICAgIHB1YmxpYyBjdHg6IG9iamVjdDtcbiAgICBwdWJsaWMgZml4dHVyZUN0eDogb2JqZWN0IHwgbnVsbDtcbiAgICBwdWJsaWMgdGVzdFJ1bkN0eDogb2JqZWN0IHwgbnVsbDtcbiAgICBwcml2YXRlIGN1cnJlbnRSb2xlSWQ6IHN0cmluZyB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VkUm9sZVN0YXRlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBwdWJsaWMgZXJyczogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyW107XG4gICAgcHJpdmF0ZSBsYXN0RHJpdmVyU3RhdHVzSWQ6IHN0cmluZyB8IG51bGw7XG4gICAgcHJpdmF0ZSBsYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2U6IENvbW1hbmRCYXNlIHwgbnVsbCB8IHN0cmluZztcbiAgICBwcml2YXRlIGZpbGVEb3dubG9hZGluZ0hhbmRsZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBhdHRhY2htZW50RG93bmxvYWRpbmdIYW5kbGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlOiBGdW5jdGlvbiB8IG51bGw7XG4gICAgcHJpdmF0ZSBhZGRpbmdEcml2ZXJUYXNrc0NvdW50OiBudW1iZXI7XG4gICAgcHVibGljIGRlYnVnZ2luZzogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnT25GYWlsOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzYWJsZURlYnVnQnJlYWtwb2ludHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z1JlcG9ydGVyUGx1Z2luSG9zdDogUmVwb3J0ZXJQbHVnaW5Ib3N0O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlOiBCcm93c2VyTWFuaXB1bGF0aW9uUXVldWU7XG4gICAgcHJpdmF0ZSBkZWJ1Z0xvZzogVGVzdFJ1bkRlYnVnTG9nO1xuICAgIHB1YmxpYyBxdWFyYW50aW5lOiBRdWFyYW50aW5lIHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnTG9nZ2VyOiBhbnk7XG4gICAgcHVibGljIG9ic2VydmVkQ2FsbHNpdGVzOiBPYnNlcnZlZENhbGxzaXRlc1N0b3JhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXBsaWNhdG9yOiBhbnk7XG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBlcnJTY3JlZW5zaG90UGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICBwcml2YXRlIGFzeW5jSnNFeHByZXNzaW9uQ2FsbHNpdGVzOiBNYXA8c3RyaW5nLCBDYWxsc2l0ZVJlY29yZD47XG4gICAgcHVibGljIHJlYWRvbmx5IGJyb3dzZXI6IEJyb3dzZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWVzc2FnZUJ1cz86IE1lc3NhZ2VCdXM7XG4gICAgcHVibGljIHJlYWRvbmx5IGNvb2tpZVByb3ZpZGVyOiBDb29raWVQcm92aWRlcjtcbiAgICBwcml2YXRlIF9zdG9yYWdlc1Byb3ZpZGVyOiBTdG9yYWdlc1Byb3ZpZGVyO1xuICAgIHB1YmxpYyByZWFkb25seSBzdGFydFJ1bkV4ZWN1dGlvblRpbWU/OiBEYXRlO1xuICAgIHB1YmxpYyBmaW5pc2hUaW1lPzogRGF0ZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXI6IFJlcXVlc3RIb29rRXZlbnRQcm92aWRlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yb2xlUHJvdmlkZXI6IFJvbGVQcm92aWRlcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNOYXRpdmVBdXRvbWF0aW9uOiBib29sZWFuO1xuICAgIHB1YmxpYyByZWFkb25seSBpc0V4cGVyaW1lbnRhbE11bHRpcGxlV2luZG93czogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoeyB0ZXN0LCBicm93c2VyQ29ubmVjdGlvbiwgc2NyZWVuc2hvdENhcHR1cmVyLCBnbG9iYWxXYXJuaW5nTG9nLCBvcHRzLCBtZXNzYWdlQnVzLCBzdGFydFJ1bkV4ZWN1dGlvblRpbWUsIG5hdGl2ZUF1dG9tYXRpb24gfTogVGVzdFJ1bkluaXQpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzW3Rlc3RSdW5NYXJrZXJdICAgID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUJ1cyAgICAgICA9IG1lc3NhZ2VCdXM7XG4gICAgICAgIHRoaXMud2FybmluZ0xvZyAgICAgICAgPSBuZXcgV2FybmluZ0xvZyhnbG9iYWxXYXJuaW5nTG9nLCBXYXJuaW5nTG9nLmNyZWF0ZUFkZFdhcm5pbmdDYWxsYmFjayhtZXNzYWdlQnVzLCB0aGlzKSk7XG4gICAgICAgIHRoaXMucmVwb3J0RGF0YUxvZyAgICAgPSBuZXcgUmVwb3J0RGF0YUxvZyhSZXBvcnREYXRhTG9nLmNyZWF0ZUFkZERhdGFDYWxsYmFjayhtZXNzYWdlQnVzLCB0aGlzKSk7XG4gICAgICAgIHRoaXMub3B0cyAgICAgICAgICAgICAgPSBvcHRzO1xuICAgICAgICB0aGlzLnRlc3QgICAgICAgICAgICAgID0gdGVzdDtcbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbiA9IGJyb3dzZXJDb25uZWN0aW9uO1xuICAgICAgICB0aGlzLnVuc3RhYmxlICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnJvd3NlciAgICAgICAgICAgPSBnZXRCcm93c2VyKGJyb3dzZXJDb25uZWN0aW9uLCBuYXRpdmVBdXRvbWF0aW9uKTtcblxuICAgICAgICB0aGlzLnBoYXNlID0gVGVzdFJ1blBoYXNlLmluaXRpYWw7XG5cbiAgICAgICAgdGhpcy5kcml2ZXJUYXNrUXVldWUgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy50ZXN0RG9uZUNvbW1hbmRRdWV1ZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIgID0gbnVsbDtcbiAgICAgICAgdGhpcy5hY3RpdmVJZnJhbWVTZWxlY3RvciA9IG51bGw7XG4gICAgICAgIHRoaXMuc3BlZWQgICAgICAgICAgICAgICAgPSB0aGlzLm9wdHMuc3BlZWQgYXMgbnVtYmVyO1xuICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCAgICAgID0gdGhpcy5fZ2V0UGFnZUxvYWRUaW1lb3V0KHRlc3QsIG9wdHMpO1xuICAgICAgICB0aGlzLnRlc3RFeGVjdXRpb25UaW1lb3V0ID0gdGhpcy5fZ2V0VGVzdEV4ZWN1dGlvblRpbWVvdXQob3B0cyk7XG5cbiAgICAgICAgdGhpcy5kaXNhYmxlUGFnZVJlbG9hZHMgPSB0ZXN0LmRpc2FibGVQYWdlUmVsb2FkcyB8fCBvcHRzLmRpc2FibGVQYWdlUmVsb2FkcyBhcyBib29sZWFuICYmIHRlc3QuZGlzYWJsZVBhZ2VSZWxvYWRzICE9PSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaXNhYmxlUGFnZUNhY2hpbmcgPSB0ZXN0LmRpc2FibGVQYWdlQ2FjaGluZyB8fCBvcHRzLmRpc2FibGVQYWdlQ2FjaGluZyBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLmlzTmF0aXZlQXV0b21hdGlvbiA9IG5hdGl2ZUF1dG9tYXRpb247XG5cbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzICAgICAgICA9IG9wdHMuZGlzYWJsZU11bHRpcGxlV2luZG93cyBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLmlzRXhwZXJpbWVudGFsTXVsdGlwbGVXaW5kb3dzID0gb3B0cy5leHBlcmltZW50YWxNdWx0aXBsZVdpbmRvd3MgYXMgYm9vbGVhbjtcblxuICAgICAgICB0aGlzLnJlcXVlc3RUaW1lb3V0ID0gdGhpcy5fZ2V0UmVxdWVzdFRpbWVvdXQodGVzdCwgb3B0cyk7XG5cbiAgICAgICAgdGhpcy5zZXNzaW9uID0gU2Vzc2lvbkNvbnRyb2xsZXIuZ2V0U2Vzc2lvbih0aGlzKTtcblxuICAgICAgICB0aGlzLmNvbnNvbGVNZXNzYWdlcyA9IG5ldyBCcm93c2VyQ29uc29sZU1lc3NhZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gbnVsbDtcblxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmN0eCAgICAgICAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmZpeHR1cmVDdHggPSBudWxsO1xuICAgICAgICB0aGlzLnRlc3RSdW5DdHggPSBudWxsO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFJvbGVJZCAgPSBudWxsO1xuICAgICAgICB0aGlzLnVzZWRSb2xlU3RhdGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICB0aGlzLmVycnMgPSBbXTtcblxuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNJZCAgICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlID0gbnVsbDtcblxuICAgICAgICB0aGlzLmZpbGVEb3dubG9hZGluZ0hhbmRsZWQgICAgICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5hdHRhY2htZW50RG93bmxvYWRpbmdIYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5hZGRpbmdEcml2ZXJUYXNrc0NvdW50ID0gMDtcblxuICAgICAgICB0aGlzLmRlYnVnZ2luZyAgICAgICAgICAgICAgID0gdGhpcy5vcHRzLmRlYnVnTW9kZSBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLmRlYnVnT25GYWlsICAgICAgICAgICAgID0gdGhpcy5vcHRzLmRlYnVnT25GYWlsIGFzIGJvb2xlYW47XG4gICAgICAgIHRoaXMuZGlzYWJsZURlYnVnQnJlYWtwb2ludHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWJ1Z1JlcG9ydGVyUGx1Z2luSG9zdCA9IG5ldyBSZXBvcnRlclBsdWdpbkhvc3QoeyBub0NvbG9yczogZmFsc2UgfSk7XG5cbiAgICAgICAgdGhpcy5icm93c2VyTWFuaXB1bGF0aW9uUXVldWUgPSBuZXcgQnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlKGJyb3dzZXJDb25uZWN0aW9uLCBzY3JlZW5zaG90Q2FwdHVyZXIsIHRoaXMud2FybmluZ0xvZyk7XG5cbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyA9IG5ldyBUZXN0UnVuRGVidWdMb2codGhpcy5icm93c2VyQ29ubmVjdGlvbi51c2VyQWdlbnQpO1xuXG4gICAgICAgIHRoaXMucXVhcmFudGluZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5kZWJ1Z0xvZ2dlciA9IHRoaXMub3B0cy5kZWJ1Z0xvZ2dlcjtcblxuICAgICAgICB0aGlzLm9ic2VydmVkQ2FsbHNpdGVzICAgICAgICAgID0gbmV3IE9ic2VydmVkQ2FsbHNpdGVzU3RvcmFnZSgpO1xuICAgICAgICB0aGlzLmFzeW5jSnNFeHByZXNzaW9uQ2FsbHNpdGVzID0gbmV3IE1hcDxzdHJpbmcsIENhbGxzaXRlUmVjb3JkPigpO1xuXG4gICAgICAgIHRoaXMucmVwbGljYXRvciA9IGNyZWF0ZVJlcGxpY2F0b3IoWyBuZXcgU2VsZWN0b3JOb2RlVHJhbnNmb3JtKCkgXSk7XG5cbiAgICAgICAgdGhpcy5kaXNjb25uZWN0ZWQgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVyclNjcmVlbnNob3RQYXRoID0gbnVsbDtcblxuICAgICAgICB0aGlzLnN0YXJ0UnVuRXhlY3V0aW9uVGltZSAgICAgPSBzdGFydFJ1bkV4ZWN1dGlvblRpbWU7XG4gICAgICAgIHRoaXMucnVuRXhlY3V0aW9uVGltZW91dCAgICAgICA9IHRoaXMuX2dldFJ1bkV4ZWN1dGlvblRpbWVvdXQob3B0cyk7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RIb29rRXZlbnRQcm92aWRlciA9IHRoaXMuX2dldFJlcXVlc3RIb29rRXZlbnRQcm92aWRlcigpO1xuICAgICAgICB0aGlzLl9yb2xlUHJvdmlkZXIgICAgICAgICAgICAgPSB0aGlzLl9nZXRSb2xlUHJvdmlkZXIoKTtcblxuICAgICAgICB0aGlzLmNvb2tpZVByb3ZpZGVyICAgID0gQ29va2llUHJvdmlkZXJGYWN0b3J5LmNyZWF0ZSh0aGlzLCB0aGlzLmlzTmF0aXZlQXV0b21hdGlvbik7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2VzUHJvdmlkZXIgPSBTdG9yYWdlc1Byb3ZpZGVyRmFjdG9yeS5jcmVhdGUodGhpcywgdGhpcy5pc05hdGl2ZUF1dG9tYXRpb24pO1xuXG4gICAgICAgIHRoaXMuX2FkZEluamVjdGFibGVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyICgpOiBSZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIge1xuICAgICAgICBpZiAoIXRoaXMuaXNOYXRpdmVBdXRvbWF0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXI7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0UGlwZWxpbmUucmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlU3RvcmFnZXNTbmFwc2hvdCAoc3RvcmFnZVNuYXBzaG90OiBTdG9yYWdlc1NuYXBzaG90KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzTmF0aXZlQXV0b21hdGlvbilcbiAgICAgICAgICAgIHRoaXMuX25hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0UGlwZWxpbmUucmVzdG9yaW5nU3RvcmFnZXMgPSBzdG9yYWdlU25hcHNob3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgX25hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0UGlwZWxpbmUgKCk6IE5hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0UGlwZWxpbmUge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmF0aXZlQXV0b21hdGlvbi5yZXF1ZXN0UGlwZWxpbmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgX25hdGl2ZUF1dG9tYXRpb24gKCk6IE5hdGl2ZUF1dG9tYXRpb25CYXNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uZ2V0TmF0aXZlQXV0b21hdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFJvbGVQcm92aWRlciAoKTogUm9sZVByb3ZpZGVyIHtcbiAgICAgICAgaWYgKHRoaXMuaXNOYXRpdmVBdXRvbWF0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVBdXRvbWF0aW9uUm9sZVByb3ZpZGVyKHRoaXMpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJveHlSb2xlUHJvdmlkZXIodGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UGFnZUxvYWRUaW1lb3V0ICh0ZXN0OiBUZXN0LCBvcHRzOiBEaWN0aW9uYXJ5PE9wdGlvblZhbHVlPik6IG51bWJlciB7XG4gICAgICAgIGlmICh0ZXN0LnRpbWVvdXRzPy5wYWdlTG9hZFRpbWVvdXQgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybiB0ZXN0LnRpbWVvdXRzLnBhZ2VMb2FkVGltZW91dDtcblxuICAgICAgICByZXR1cm4gb3B0cy5wYWdlTG9hZFRpbWVvdXQgYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFJlcXVlc3RUaW1lb3V0ICh0ZXN0OiBUZXN0LCBvcHRzOiBEaWN0aW9uYXJ5PE9wdGlvblZhbHVlPik6IFJlcXVlc3RUaW1lb3V0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2U6IHRlc3QudGltZW91dHM/LnBhZ2VSZXF1ZXN0VGltZW91dCB8fCBvcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCBhcyBudW1iZXIsXG4gICAgICAgICAgICBhamF4OiB0ZXN0LnRpbWVvdXRzPy5hamF4UmVxdWVzdFRpbWVvdXQgfHwgb3B0cy5hamF4UmVxdWVzdFRpbWVvdXQgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEV4ZWN1dGlvblRpbWVvdXQgKHRpbWVvdXQ6IG51bWJlciwgZXJyb3I6IFRlc3RUaW1lb3V0RXJyb3IgfCBSdW5UaW1lb3V0RXJyb3IpOiBFeGVjdXRpb25UaW1lb3V0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICByZWplY3RXaXRoOiBlcnJvcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRUZXN0RXhlY3V0aW9uVGltZW91dCAob3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBFeGVjdXRpb25UaW1lb3V0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRlc3RFeGVjdXRpb25UaW1lb3V0ID0gb3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCBhcyBudW1iZXIgfHwgMDtcblxuICAgICAgICBpZiAoIXRlc3RFeGVjdXRpb25UaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEV4ZWN1dGlvblRpbWVvdXQodGVzdEV4ZWN1dGlvblRpbWVvdXQsIG5ldyBUZXN0VGltZW91dEVycm9yKHRlc3RFeGVjdXRpb25UaW1lb3V0KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UnVuRXhlY3V0aW9uVGltZW91dCAob3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBFeGVjdXRpb25UaW1lb3V0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJ1bkV4ZWN1dGlvblRpbWVvdXQgPSBvcHRzLnJ1bkV4ZWN1dGlvblRpbWVvdXQgYXMgbnVtYmVyIHx8IDA7XG5cbiAgICAgICAgaWYgKCFydW5FeGVjdXRpb25UaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEV4ZWN1dGlvblRpbWVvdXQocnVuRXhlY3V0aW9uVGltZW91dCwgbmV3IFJ1blRpbWVvdXRFcnJvcihydW5FeGVjdXRpb25UaW1lb3V0KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXN0UnVuRXhlY3V0aW9uVGltZW91dCAoKTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRSdW5FeGVjdXRpb25UaW1lIHx8ICF0aGlzLnJ1bkV4ZWN1dGlvblRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjdXJyZW50VGltZW91dCA9IE1hdGgubWF4KHRoaXMucnVuRXhlY3V0aW9uVGltZW91dC50aW1lb3V0IC0gKERhdGUubm93KCkgLSB0aGlzLnN0YXJ0UnVuRXhlY3V0aW9uVGltZS5nZXRUaW1lKCkpLCAwKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RXhlY3V0aW9uVGltZW91dChjdXJyZW50VGltZW91dCwgdGhpcy5ydW5FeGVjdXRpb25UaW1lb3V0LnJlamVjdFdpdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXhlY3V0aW9uVGltZW91dCAoKTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN0UnVuRXhlY3V0aW9uVGltZW91dCAmJiAoIXRoaXMudGVzdEV4ZWN1dGlvblRpbWVvdXQgfHwgdGhpcy5yZXN0UnVuRXhlY3V0aW9uVGltZW91dC50aW1lb3V0IDwgdGhpcy50ZXN0RXhlY3V0aW9uVGltZW91dC50aW1lb3V0KVxuICAgICAgICAgICAgPyB0aGlzLnJlc3RSdW5FeGVjdXRpb25UaW1lb3V0XG4gICAgICAgICAgICA6IHRoaXMudGVzdEV4ZWN1dGlvblRpbWVvdXQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRDbGllbnRTY3JpcHRDb250ZW50V2FybmluZ3NJZk5lY2Vzc2FyeSAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZW1wdHksIGR1cGxpY2F0ZWRDb250ZW50IH0gPSBmaW5kUHJvYmxlbWF0aWNTY3JpcHRzKHRoaXMudGVzdC5jbGllbnRTY3JpcHRzIGFzIENsaWVudFNjcmlwdFtdKTtcblxuICAgICAgICBpZiAoZW1wdHkubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcoV0FSTklOR19NRVNTQUdFLmNsaWVudFNjcmlwdHNXaXRoRW1wdHlDb250ZW50KTtcblxuICAgICAgICBpZiAoZHVwbGljYXRlZENvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBzdWZmaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRQbHVyYWxTdWZmaXgoZHVwbGljYXRlZENvbnRlbnQpO1xuICAgICAgICAgICAgY29uc3QgZHVwbGljYXRlZENvbnRlbnRDbGllbnRTY3JpcHRzU3RyID0gZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nKGR1cGxpY2F0ZWRDb250ZW50LCAnXFxuJyk7XG5cbiAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKFdBUk5JTkdfTUVTU0FHRS5jbGllbnRTY3JpcHRzV2l0aER1cGxpY2F0ZWRDb250ZW50LCBzdWZmaXgsIGR1cGxpY2F0ZWRDb250ZW50Q2xpZW50U2NyaXB0c1N0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRJbmplY3RhYmxlcyAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2FkZENsaWVudFNjcmlwdENvbnRlbnRXYXJuaW5nc0lmTmVjZXNzYXJ5KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzTmF0aXZlQXV0b21hdGlvbikge1xuICAgICAgICAgICAgdGhpcy5pbmplY3RhYmxlLnNjcmlwdHMucHVzaCguLi5JTkpFQ1RBQkxFUy5TQ1JJUFRTKTtcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0YWJsZS5zdHlsZXMucHVzaChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9VSV9TVFlMRVMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbmplY3RhYmxlLnVzZXJTY3JpcHRzLnB1c2goLi4udGhpcy50ZXN0LmNsaWVudFNjcmlwdHMubWFwKHNjcmlwdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogIChzY3JpcHQgYXMgQ2xpZW50U2NyaXB0KS5nZXRSZXN1bHRVcmwodGhpcy5pZCksXG4gICAgICAgICAgICAgICAgcGFnZTogc2NyaXB0LnBhZ2UgYXMgUmVxdWVzdEZpbHRlclJ1bGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpZCAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5pZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGluamVjdGFibGUgKCk6IEluamVjdGFibGVSZXNvdXJjZXMge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmluamVjdGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFF1YXJhbnRpbmVJbmZvIChxdWFyYW50aW5lOiBRdWFyYW50aW5lKTogdm9pZCB7XG4gICAgICAgIHRoaXMucXVhcmFudGluZSA9IHF1YXJhbnRpbmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfYWRkUmVxdWVzdEhvb2sgKGhvb2s6IFJlcXVlc3RIb29rKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnRlc3QucmVxdWVzdEhvb2tzLmluY2x1ZGVzKGhvb2spKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMudGVzdC5yZXF1ZXN0SG9va3MucHVzaChob29rKTtcbiAgICAgICAgYXdhaXQgdGhpcy5faW5pdFJlcXVlc3RIb29rKGhvb2spO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3JlbW92ZVJlcXVlc3RIb29rIChob29rOiBSZXF1ZXN0SG9vayk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMudGVzdC5yZXF1ZXN0SG9va3MuaW5jbHVkZXMoaG9vaykpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgcHVsbCh0aGlzLnRlc3QucmVxdWVzdEhvb2tzLCBob29rKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fZGlzcG9zZVJlcXVlc3RIb29rKGhvb2spO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2luaXRSZXF1ZXN0SG9vayAoaG9vazogUmVxdWVzdEhvb2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaG9vay5fd2FybmluZ0xvZyA9IHRoaXMud2FybmluZ0xvZztcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChob29rLl9yZXF1ZXN0RmlsdGVyUnVsZXMubWFwKHJ1bGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RIb29rRXZlbnRQcm92aWRlci5hZGRSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMocnVsZSwge1xuICAgICAgICAgICAgICAgIG9uUmVxdWVzdDogICAgICAgICAgIGhvb2sub25SZXF1ZXN0LmJpbmQoaG9vayksXG4gICAgICAgICAgICAgICAgb25Db25maWd1cmVSZXNwb25zZTogaG9vay5fb25Db25maWd1cmVSZXNwb25zZS5iaW5kKGhvb2spLFxuICAgICAgICAgICAgICAgIG9uUmVzcG9uc2U6ICAgICAgICAgIGhvb2sub25SZXNwb25zZS5iaW5kKGhvb2spLFxuICAgICAgICAgICAgfSwgKGVycjogUmVxdWVzdEhvb2tNZXRob2RFcnJvcikgPT4gdGhpcy5fb25SZXF1ZXN0SG9va01ldGhvZEVycm9yKGVyciwgaG9vay5fY2xhc3NOYW1lKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9vblJlcXVlc3RIb29rTWV0aG9kRXJyb3IgKGV2ZW50OiBSZXF1ZXN0SG9va01ldGhvZEVycm9yLCBob29rQ2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbGV0IGVycjogRXJyb3IgfCBUZXN0UnVuRXJyb3JCYXNlICAgICAgICAgICAgPSBldmVudC5lcnJvcjtcbiAgICAgICAgY29uc3QgaXNSZXF1ZXN0SG9va05vdEltcGxlbWVudGVkTWV0aG9kRXJyb3IgPSAoZXJyIGFzIHVua25vd24gYXMgVGVzdFJ1bkVycm9yQmFzZSk/LmNvZGUgPT09IFRFU1RfUlVOX0VSUk9SUy5yZXF1ZXN0SG9va05vdEltcGxlbWVudGVkRXJyb3I7XG5cbiAgICAgICAgaWYgKCFpc1JlcXVlc3RIb29rTm90SW1wbGVtZW50ZWRNZXRob2RFcnJvcilcbiAgICAgICAgICAgIGVyciA9IG5ldyBSZXF1ZXN0SG9va1VuaGFuZGxlZEVycm9yKGVyciwgaG9va0NsYXNzTmFtZSwgZXZlbnQubWV0aG9kTmFtZSk7XG5cbiAgICAgICAgdGhpcy5hZGRFcnJvcihlcnIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2Rpc3Bvc2VSZXF1ZXN0SG9vayAoaG9vazogUmVxdWVzdEhvb2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaG9vay5fd2FybmluZ0xvZyA9IG51bGw7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoaG9vay5fcmVxdWVzdEZpbHRlclJ1bGVzLm1hcChydWxlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIucmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzKHJ1bGUpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZGV0YWNoUmVxdWVzdEV2ZW50TGlzdGVuZXJzIChydWxlczogUmVxdWVzdEZpbHRlclJ1bGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChydWxlcy5tYXAocnVsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyLnJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycyhydWxlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2luaXRSZXF1ZXN0SG9va3MgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnRlc3QucmVxdWVzdEhvb2tzLm1hcChob29rID0+IHRoaXMuX2luaXRSZXF1ZXN0SG9vayhob29rKSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVTa2lwSnNFcnJvcnNPcHRpb24gKCk6IGJvb2xlYW4gfCBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMudGVzdC5za2lwSnNFcnJvcnNPcHRpb25zICE9PSB2b2lkIDBcbiAgICAgICAgICAgID8gdGhpcy50ZXN0LnNraXBKc0Vycm9yc09wdGlvbnNcbiAgICAgICAgICAgIDogdGhpcy5vcHRzLnNraXBKc0Vycm9ycyBhcyBTa2lwSnNFcnJvcnNPcHRpb25zT2JqZWN0IHwgYm9vbGVhbiB8fCBmYWxzZTtcblxuICAgICAgICByZXR1cm4gcHJlcGFyZVNraXBKc0Vycm9yc09wdGlvbnMob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gSGFtbWVyaGVhZCBwYXlsb2FkXG4gICAgcHVibGljIGFzeW5jIGdldFBheWxvYWRTY3JpcHQgKHdpbmRvd0lkPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgdGhpcy5maWxlRG93bmxvYWRpbmdIYW5kbGVkICAgICAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UgPSBudWxsO1xuXG4gICAgICAgIGNvbnN0IHNraXBKc0Vycm9ycyA9IHRoaXMuX3ByZXBhcmVTa2lwSnNFcnJvcnNPcHRpb24oKTtcblxuICAgICAgICByZXR1cm4gTXVzdGFjaGUucmVuZGVyKFRFU1RfUlVOX1RFTVBMQVRFLCB7XG4gICAgICAgICAgICB0ZXN0UnVuSWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNlc3Npb24uaWQpLFxuICAgICAgICAgICAgYnJvd3NlcklkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5pZCksXG4gICAgICAgICAgICBhY3RpdmVXaW5kb3dJZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFjdGl2ZVdpbmRvd0lkKSxcbiAgICAgICAgICAgIHdpbmRvd0lkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHdpbmRvd0lkIHx8ICcnKSxcbiAgICAgICAgICAgIGJyb3dzZXJIZWFydGJlYXRSZWxhdGl2ZVVybDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uaGVhcnRiZWF0UmVsYXRpdmVVcmwpLFxuICAgICAgICAgICAgYnJvd3NlclN0YXR1c1JlbGF0aXZlVXJsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5zdGF0dXNSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICBicm93c2VyU3RhdHVzRG9uZVJlbGF0aXZlVXJsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnN0YXR1c0RvbmVSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICBicm93c2VySWRsZVJlbGF0aXZlVXJsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlkbGVSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICBicm93c2VyQWN0aXZlV2luZG93SWRVcmw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJFbnN1cmVXaW5kb3dJbk5hdGl2ZUF1dG9tYXRpb25Vcmw6ICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uZW5zdXJlV2luZG93SW5OYXRpdmVBdXRvbWF0aW9uVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJDbG9zZVdpbmRvd1VybDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uY2xvc2VXaW5kb3dVcmwpLFxuICAgICAgICAgICAgYnJvd3Nlck9wZW5GaWxlUHJvdG9jb2xSZWxhdGl2ZVVybDogICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5vcGVuRmlsZVByb3RvY29sUmVsYXRpdmVVcmwpLFxuICAgICAgICAgICAgYnJvd3NlckRpc3BhdGNoTmF0aXZlQXV0b21hdGlvbkV2ZW50UmVsYXRpdmVVcmw6ICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5kaXNwYXRjaE5hdGl2ZUF1dG9tYXRpb25FdmVudFJlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJEaXNwYXRjaE5hdGl2ZUF1dG9tYXRpb25FdmVudFNlcXVlbmNlUmVsYXRpdmVVcmw6IEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uZGlzcGF0Y2hOYXRpdmVBdXRvbWF0aW9uRXZlbnRTZXF1ZW5jZVJlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJQYXJzZVNlbGVjdG9yVXJsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24ucGFyc2VTZWxlY3RvclJlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIHVzZXJBZ2VudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24udXNlckFnZW50KSxcbiAgICAgICAgICAgIHRlc3ROYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMudGVzdC5uYW1lKSxcbiAgICAgICAgICAgIGZpeHR1cmVOYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KCh0aGlzLnRlc3QuZml4dHVyZSBhcyBGaXh0dXJlKS5uYW1lKSxcbiAgICAgICAgICAgIHNlbGVjdG9yVGltZW91dDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQsXG4gICAgICAgICAgICBwYWdlTG9hZFRpbWVvdXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCxcbiAgICAgICAgICAgIGNoaWxkV2luZG93UmVhZHlUaW1lb3V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENISUxEX1dJTkRPV19SRUFEWV9USU1FT1VULFxuICAgICAgICAgICAgc2tpcEpzRXJyb3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoc2tpcEpzRXJyb3JzKSxcbiAgICAgICAgICAgIHJldHJ5VGVzdFBhZ2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5yZXRyeVRlc3RQYWdlcyxcbiAgICAgICAgICAgIHNwZWVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlZWQsXG4gICAgICAgICAgICBkaWFsb2dIYW5kbGVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIpLFxuICAgICAgICAgICAgY2FuVXNlRGVmYXVsdFdpbmRvd0FjdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGhpcy5icm93c2VyQ29ubmVjdGlvbi5jYW5Vc2VEZWZhdWx0V2luZG93QWN0aW9ucygpKSxcbiAgICAgICAgICAgIG5hdGl2ZUF1dG9tYXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNOYXRpdmVBdXRvbWF0aW9uLFxuICAgICAgICAgICAgZXhwZXJpbWVudGFsTXVsdGlwbGVXaW5kb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0V4cGVyaW1lbnRhbE11bHRpcGxlV2luZG93cyxcbiAgICAgICAgICAgIGRvbWFpbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LnByb3h5LnNlcnZlcjFJbmZvLmRvbWFpbiksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJZnJhbWVQYXlsb2FkU2NyaXB0ICgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBicm93c2VyRW5zdXJlV2luZG93SW5OYXRpdmVBdXRvbWF0aW9uVXJsID0gSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5lbnN1cmVXaW5kb3dJbk5hdGl2ZUF1dG9tYXRpb25VcmwpO1xuICAgICAgICBjb25zdCBleHBlcmltZW50YWxNdWx0aXBsZVdpbmRvd3MgPSB0aGlzLmlzRXhwZXJpbWVudGFsTXVsdGlwbGVXaW5kb3dzO1xuXG4gICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoSUZSQU1FX1RFU1RfUlVOX1RFTVBMQVRFLCB7XG4gICAgICAgICAgICB0ZXN0UnVuSWQ6ICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNlc3Npb24uaWQpLFxuICAgICAgICAgICAgc2VsZWN0b3JUaW1lb3V0OiAgdGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCxcbiAgICAgICAgICAgIHBhZ2VMb2FkVGltZW91dDogIHRoaXMucGFnZUxvYWRUaW1lb3V0LFxuICAgICAgICAgICAgcmV0cnlUZXN0UGFnZXM6ICAgISF0aGlzLm9wdHMucmV0cnlUZXN0UGFnZXMsXG4gICAgICAgICAgICBzcGVlZDogICAgICAgICAgICB0aGlzLnNwZWVkLFxuICAgICAgICAgICAgZGlhbG9nSGFuZGxlcjogICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hY3RpdmVEaWFsb2dIYW5kbGVyKSxcbiAgICAgICAgICAgIG5hdGl2ZUF1dG9tYXRpb246IEpTT04uc3RyaW5naWZ5KHRoaXMuaXNOYXRpdmVBdXRvbWF0aW9uKSxcbiAgICAgICAgICAgIGRvbWFpbjogICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LnByb3h5LnNlcnZlcjFJbmZvLmRvbWFpbiksXG4gICAgICAgICAgICBicm93c2VyRW5zdXJlV2luZG93SW5OYXRpdmVBdXRvbWF0aW9uVXJsLFxuICAgICAgICAgICAgZXhwZXJpbWVudGFsTXVsdGlwbGVXaW5kb3dzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBIYW1tZXJoZWFkIGhhbmRsZXJzXG4gICAgcHVibGljIGdldEF1dGhDcmVkZW50aWFscyAoKTogbnVsbCB8IEF1dGhDcmVkZW50aWFscyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3QuYXV0aENyZWRlbnRpYWxzO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVGaWxlRG93bmxvYWQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkaW5nSGFuZGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUF0dGFjaG1lbnQgKGRhdGE6IHsgaXNPcGVuZWRJbk5ld1dpbmRvdzogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgICAgIGlmIChkYXRhLmlzT3BlbmVkSW5OZXdXaW5kb3cpXG4gICAgICAgICAgICB0aGlzLmF0dGFjaG1lbnREb3dubG9hZGluZ0hhbmRsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVQYWdlRXJyb3IgKGN0eDogYW55LCBlcnI6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGVuZGluZ1BhZ2VFcnJvciA9IG5ldyBQYWdlTG9hZEVycm9yKGVyciwgY3R4LnJlcU9wdHMudXJsKTtcblxuICAgICAgICBjdHgucmVkaXJlY3QoY3R4LnRvUHJveHlVcmwoU1BFQ0lBTF9FUlJPUl9QQUdFKSk7XG4gICAgfVxuXG4gICAgLy8gVGVzdCBmdW5jdGlvbiBleGVjdXRpb25cbiAgICBwcml2YXRlIGFzeW5jIF9leGVjdXRlVGVzdEZuIChwaGFzZTogVGVzdFJ1blBoYXNlLCBmbjogRnVuY3Rpb24sIHRpbWVvdXQ6IEV4ZWN1dGlvblRpbWVvdXQgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMucGhhc2UgPSBwaGFzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZUZuV2l0aFRpbWVvdXQoZm4sIHRpbWVvdXQsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fbWFrZVNjcmVlbnNob3RPbkZhaWwoKTtcblxuICAgICAgICAgICAgdGhpcy5hZGRFcnJvcihlcnIpO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmVyclNjcmVlbnNob3RQYXRoID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdGhpcy5fYWRkUGVuZGluZ1BhZ2VFcnJvcklmQW55KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcnVuQmVmb3JlSG9vayAoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLnRlc3QuZ2xvYmFsQmVmb3JlRm4pXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pblRlc3RCZWZvcmVIb29rLCB0aGlzLnRlc3QuZ2xvYmFsQmVmb3JlRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGVzdC5iZWZvcmVGbilcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pblRlc3RCZWZvcmVIb29rLCB0aGlzLnRlc3QuYmVmb3JlRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGVzdC5maXh0dXJlPy5iZWZvcmVFYWNoRm4pXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5GaXh0dXJlQmVmb3JlRWFjaEhvb2ssIHRoaXMudGVzdC5maXh0dXJlPy5iZWZvcmVFYWNoRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcnVuQWZ0ZXJIb29rICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudGVzdC5hZnRlckZuKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5UZXN0QWZ0ZXJIb29rLCB0aGlzLnRlc3QuYWZ0ZXJGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy50ZXN0LmZpeHR1cmU/LmFmdGVyRWFjaEZuKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5GaXh0dXJlQWZ0ZXJFYWNoSG9vaywgdGhpcy50ZXN0LmZpeHR1cmU/LmFmdGVyRWFjaEZuLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuXG4gICAgICAgIGlmICh0aGlzLnRlc3QuZ2xvYmFsQWZ0ZXJGbilcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluVGVzdEFmdGVySG9vaywgdGhpcy50ZXN0Lmdsb2JhbEFmdGVyRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZmluYWxpemVUZXN0UnVuIChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRlc3RSdW5UcmFja2VyLnJlbW92ZUFjdGl2ZVRlc3RSdW4oaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdGFydCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRlc3RSdW5UcmFja2VyLmFkZEFjdGl2ZVRlc3RSdW4odGhpcyk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzdGFydCcpO1xuXG4gICAgICAgIGNvbnN0IG9uRGlzY29ubmVjdGVkID0gKGVycjogRXJyb3IpOiB2b2lkID0+IHRoaXMuX2Rpc2Nvbm5lY3QoZXJyKTtcblxuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLm9uY2UoJ2Rpc2Nvbm5lY3RlZCcsIG9uRGlzY29ubmVjdGVkKTtcblxuICAgICAgICBhd2FpdCB0aGlzLm9uY2UoJ2Nvbm5lY3RlZCcpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgncmVhZHknKTtcblxuICAgICAgICBpZiAoYXdhaXQgdGhpcy5fcnVuQmVmb3JlSG9vaygpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pblRlc3QsIHRoaXMudGVzdC5mbiBhcyBGdW5jdGlvbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3J1bkFmdGVySG9vaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzY29ubmVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMucGhhc2UgPSBUZXN0UnVuUGhhc2UucGVuZGluZ0ZpbmFsaXphdGlvbjtcblxuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnJlbW92ZUxpc3RlbmVyKCdkaXNjb25uZWN0ZWQnLCBvbkRpc2Nvbm5lY3RlZCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZXJycy5sZW5ndGggJiYgdGhpcy5kZWJ1Z09uRmFpbCkge1xuICAgICAgICAgICAgY29uc3QgZXJyU3RyID0gdGhpcy5kZWJ1Z1JlcG9ydGVyUGx1Z2luSG9zdC5mb3JtYXRFcnJvcih0aGlzLmVycnNbMF0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9lbnF1ZXVlU2V0QnJlYWtwb2ludENvbW1hbmQodm9pZCAwLCBudWxsLCBlcnJTdHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdiZWZvcmUtZG9uZScpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5UZXN0RG9uZUNvbW1hbmQoKSk7XG5cbiAgICAgICAgdGhpcy5fYWRkUGVuZGluZ1BhZ2VFcnJvcklmQW55KCk7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RIb29rRXZlbnRQcm92aWRlci5jbGVhclJlcXVlc3RFdmVudExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZVJlcXVlc3RIb29rRXJyb3JzKCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fZmluYWxpemVUZXN0UnVuKHRoaXMuc2Vzc2lvbi5pZCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdkb25lJyk7XG4gICAgfVxuXG4gICAgLy8gRXJyb3JzXG4gICAgcHJpdmF0ZSBfYWRkUGVuZGluZ1BhZ2VFcnJvcklmQW55ICgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLnBlbmRpbmdQYWdlRXJyb3I7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZW5zdXJlRXJyb3JJZCAoZXJyOiBFcnJvcik6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVyci5pZCA9IGVyci5pZCB8fCBuYW5vaWQoNyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlRXJyb3JBZGFwdGVyIChlcnI6IEVycm9yKTogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyIHtcbiAgICAgICAgdGhpcy5fZW5zdXJlRXJyb3JJZChlcnIpO1xuXG4gICAgICAgIHJldHVybiBuZXcgVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyKGVyciwge1xuICAgICAgICAgICAgdXNlckFnZW50OiAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24udXNlckFnZW50LFxuICAgICAgICAgICAgc2NyZWVuc2hvdFBhdGg6IHRoaXMuZXJyU2NyZWVuc2hvdFBhdGggfHwgJycsXG4gICAgICAgICAgICB0ZXN0UnVuSWQ6ICAgICAgdGhpcy5pZCxcbiAgICAgICAgICAgIHRlc3RSdW5QaGFzZTogICB0aGlzLnBoYXNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRXJyb3IgKGVycjogRXJyb3IgfCBUZXN0Q2FmZUVycm9yTGlzdCB8IFRlc3RSdW5FcnJvckJhc2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXJyTGlzdCA9IChlcnIgaW5zdGFuY2VvZiBUZXN0Q2FmZUVycm9yTGlzdCA/IGVyci5pdGVtcyA6IFtlcnJdKSBhcyBFcnJvcltdO1xuXG4gICAgICAgIGVyckxpc3QuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLl9jcmVhdGVFcnJvckFkYXB0ZXIoaXRlbSk7XG5cbiAgICAgICAgICAgIHRoaXMuZXJycy5wdXNoKGFkYXB0ZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbm9ybWFsaXplUmVxdWVzdEhvb2tFcnJvcnMgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXF1ZXN0SG9va0Vycm9ycyA9IHJlbW92ZSh0aGlzLmVycnMsIGUgPT5cbiAgICAgICAgICAgIChlIGFzIHVua25vd24gYXMgVGVzdFJ1bkVycm9yQmFzZSkuY29kZSA9PT0gVEVTVF9SVU5fRVJST1JTLnJlcXVlc3RIb29rTm90SW1wbGVtZW50ZWRFcnJvciB8fFxuICAgICAgICAgICAgKGUgYXMgdW5rbm93biBhcyBUZXN0UnVuRXJyb3JCYXNlKS5jb2RlID09PSBURVNUX1JVTl9FUlJPUlMucmVxdWVzdEhvb2tVbmhhbmRsZWRFcnJvcikgYXMgdW5rbm93biBhcyBSZXF1ZXN0SG9va0Jhc2VFcnJvcltdO1xuXG4gICAgICAgIGlmICghcmVxdWVzdEhvb2tFcnJvcnMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHVuaXFSZXF1ZXN0SG9va0Vycm9ycyA9IGNoYWluKHJlcXVlc3RIb29rRXJyb3JzKVxuICAgICAgICAgICAgLnVuaXFCeShlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBlIGFzIHVua25vd24gYXMgUmVxdWVzdEhvb2tCYXNlRXJyb3I7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyLmhvb2tDbGFzc05hbWUgKyBlcnIubWV0aG9kTmFtZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc29ydEJ5KFsnaG9va0NsYXNzTmFtZScsICdtZXRob2ROYW1lJ10pXG4gICAgICAgICAgICAudmFsdWUoKSBhcyB1bmtub3duIGFzIFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlcltdO1xuXG4gICAgICAgIHRoaXMuZXJycyA9IHRoaXMuZXJycy5jb25jYXQodW5pcVJlcXVlc3RIb29rRXJyb3JzKTtcbiAgICB9XG5cbiAgICAvLyBUYXNrIHF1ZXVlXG4gICAgcHJpdmF0ZSBfZW5xdWV1ZUNvbW1hbmQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlcXVlc3QpXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlUGVuZGluZ1JlcXVlc3QoY29tbWFuZCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLmFkZGluZ0RyaXZlclRhc2tzQ291bnQtLTtcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyVGFza1F1ZXVlLnB1c2goeyBjb21tYW5kLCByZXNvbHZlLCByZWplY3QsIGNhbGxzaXRlIH0pO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudClcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXQoQUxMX0RSSVZFUl9UQVNLU19BRERFRF9UT19RVUVVRV9FVkVOVCwgdGhpcy5kcml2ZXJUYXNrUXVldWUubGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkcml2ZXJUYXNrUXVldWVMZW5ndGggKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZGluZ0RyaXZlclRhc2tzQ291bnQgPyBwcm9taXNpZnlFdmVudCh0aGlzIGFzIHVua25vd24gYXMgRXZlbnRFbWl0dGVyLCBBTExfRFJJVkVSX1RBU0tTX0FEREVEX1RPX1FVRVVFX0VWRU5UKSA6IFByb21pc2UucmVzb2x2ZSh0aGlzLmRyaXZlclRhc2tRdWV1ZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfZW5xdWV1ZUJyb3dzZXJDb25zb2xlTWVzc2FnZXNDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2VucXVldWVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcblxuICAgICAgICBjb25zdCBjb25zb2xlTWVzc2FnZUNvcHkgPSB0aGlzLmNvbnNvbGVNZXNzYWdlcy5nZXRDb3B5KCk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gY29uc29sZU1lc3NhZ2VDb3B5W1N0cmluZyh0aGlzLmFjdGl2ZVdpbmRvd0lkKV07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9lbnF1ZXVlR2V0Q29va2llcyAoY29tbWFuZDogR2V0Q29va2llc0NvbW1hbmQpOiBQcm9taXNlPFBhcnRpYWw8Q29va2llT3B0aW9ucz5bXT4ge1xuICAgICAgICBjb25zdCB7IGNvb2tpZXMsIHVybHMgfSA9IGNvbW1hbmQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llUHJvdmlkZXIuZ2V0Q29va2llcyhjb29raWVzLCB1cmxzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2VucXVldWVTZXRDb29raWVzIChjb21tYW5kOiBTZXRDb29raWVzQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjb29raWVzID0gY29tbWFuZC5jb29raWVzO1xuICAgICAgICBjb25zdCB1cmwgICAgID0gY29tbWFuZC51cmwgfHwgYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llUHJvdmlkZXIuc2V0Q29va2llcyhjb29raWVzLCB1cmwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfZW5xdWV1ZURlbGV0ZUNvb2tpZXMgKGNvbW1hbmQ6IERlbGV0ZUNvb2tpZXNDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgY29va2llcywgdXJscyB9ID0gY29tbWFuZDtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb29raWVQcm92aWRlci5kZWxldGVDb29raWVzKGNvb2tpZXMsIHVybHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2VucXVldWVTZXRCcmVha3BvaW50Q29tbWFuZCAoY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkIHwgdW5kZWZpbmVkLCBzZWxlY3Rvcj86IG9iamVjdCB8IG51bGwsIGVycm9yPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnTG9nZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZ2dlci5zaG93QnJlYWtwb2ludCh0aGlzLnNlc3Npb24uaWQsIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24udXNlckFnZW50LCBjYWxsc2l0ZSwgZXJyb3IpO1xuXG4gICAgICAgIHRoaXMuZGVidWdnaW5nID0gYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLlNldEJyZWFrcG9pbnRDb21tYW5kKCEhZXJyb3IsIHNlbGVjdG9yKSwgY2FsbHNpdGUpIGFzIGJvb2xlYW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVtb3ZlQWxsTm9uU2VydmljZVRhc2tzICgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kcml2ZXJUYXNrUXVldWUgPSB0aGlzLmRyaXZlclRhc2tRdWV1ZS5maWx0ZXIoZHJpdmVyVGFzayA9PiBpc1NlcnZpY2VDb21tYW5kKGRyaXZlclRhc2suY29tbWFuZCkpO1xuXG4gICAgICAgIHRoaXMuYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlLnJlbW92ZUFsbE5vblNlcnZpY2VNYW5pcHVsYXRpb25zKCk7XG4gICAgfVxuXG4gICAgLy8gQ3VycmVudCBkcml2ZXIgdGFza1xuICAgIHB1YmxpYyBnZXQgY3VycmVudERyaXZlclRhc2sgKCk6IERyaXZlclRhc2sge1xuICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXJUYXNrUXVldWVbMF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiYXNlVXJsICgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRzLmJhc2VVcmwgYXMgc3RyaW5nIHx8ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc29sdmVDdXJyZW50RHJpdmVyVGFzayAocmVzdWx0PzogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnREcml2ZXJUYXNrLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgdGhpcy5kcml2ZXJUYXNrUXVldWUuc2hpZnQoKTtcblxuICAgICAgICBpZiAodGhpcy50ZXN0RG9uZUNvbW1hbmRRdWV1ZWQpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxOb25TZXJ2aWNlVGFza3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWplY3RDdXJyZW50RHJpdmVyVGFzayAoZXJyOiBFcnJvcik6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVyci5jYWxsc2l0ZSA9IGVyci5jYWxsc2l0ZSB8fCB0aGlzLmN1cnJlbnREcml2ZXJUYXNrLmNhbGxzaXRlO1xuXG4gICAgICAgIHRoaXMuY3VycmVudERyaXZlclRhc2sucmVqZWN0KGVycik7XG4gICAgICAgIHRoaXMuX3JlbW92ZUFsbE5vblNlcnZpY2VUYXNrcygpO1xuICAgIH1cblxuICAgIC8vIFBlbmRpbmcgcmVxdWVzdFxuICAgIHByaXZhdGUgX2NsZWFyUGVuZGluZ1JlcXVlc3QgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGVuZGluZ1JlcXVlc3QucmVzcG9uc2VUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzb2x2ZVBlbmRpbmdSZXF1ZXN0IChjb21tYW5kOiBDb21tYW5kQmFzZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2UgPSBjb21tYW5kO1xuXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdSZXF1ZXN0KVxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdC5yZXNvbHZlKGNvbW1hbmQpO1xuXG4gICAgICAgIHRoaXMuX2NsZWFyUGVuZGluZ1JlcXVlc3QoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZHJpdmVyIHJlcXVlc3RcbiAgICBwcml2YXRlIF9zaG91bGRSZXNvbHZlQ3VycmVudERyaXZlclRhc2sgKGRyaXZlclN0YXR1czogRHJpdmVyU3RhdHVzKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb21tYW5kID0gdGhpcy5jdXJyZW50RHJpdmVyVGFzay5jb21tYW5kO1xuXG4gICAgICAgIGNvbnN0IGlzRXhlY3V0aW5nT2JzZXJ2YXRpb25Db21tYW5kID0gY3VycmVudENvbW1hbmQgaW5zdGFuY2VvZiBleGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kcy5FeGVjdXRlU2VsZWN0b3JDb21tYW5kIHx8XG4gICAgICAgICAgICBjdXJyZW50Q29tbWFuZCBpbnN0YW5jZW9mIEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQ7XG5cbiAgICAgICAgY29uc3QgaXNEZWJ1Z0FjdGl2ZSA9IGN1cnJlbnRDb21tYW5kIGluc3RhbmNlb2Ygc2VydmljZUNvbW1hbmRzLlNldEJyZWFrcG9pbnRDb21tYW5kO1xuXG4gICAgICAgIGNvbnN0IHNob3VsZEV4ZWN1dGVDdXJyZW50Q29tbWFuZCA9XG4gICAgICAgICAgICBkcml2ZXJTdGF0dXMuaXNGaXJzdFJlcXVlc3RBZnRlcldpbmRvd1N3aXRjaGluZyAmJiAoaXNFeGVjdXRpbmdPYnNlcnZhdGlvbkNvbW1hbmQgfHwgaXNEZWJ1Z0FjdGl2ZSk7XG5cbiAgICAgICAgcmV0dXJuICFzaG91bGRFeGVjdXRlQ3VycmVudENvbW1hbmQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZnVsZmlsbEN1cnJlbnREcml2ZXJUYXNrIChkcml2ZXJTdGF0dXM6IERyaXZlclN0YXR1cyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudERyaXZlclRhc2spXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKGRyaXZlclN0YXR1cy53YXJuaW5ncz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBkcml2ZXJTdGF0dXMud2FybmluZ3MuZm9yRWFjaCgod2FybmluZzogRHJpdmVyV2FybmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGFkZFJlbmRlcmVkV2FybmluZyh0aGlzLndhcm5pbmdMb2csIFdBUk5JTkdfTUVTU0FHRVt3YXJuaW5nLnR5cGVdLCB0aGlzLmN1cnJlbnREcml2ZXJUYXNrLmNhbGxzaXRlLCAuLi53YXJuaW5nLmFyZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHJpdmVyU3RhdHVzLmV4ZWN1dGlvbkVycm9yKVxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0Q3VycmVudERyaXZlclRhc2soZHJpdmVyU3RhdHVzLmV4ZWN1dGlvbkVycm9yKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fc2hvdWxkUmVzb2x2ZUN1cnJlbnREcml2ZXJUYXNrKGRyaXZlclN0YXR1cykpXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlQ3VycmVudERyaXZlclRhc2soZHJpdmVyU3RhdHVzLnJlc3VsdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlUGFnZUVycm9yU3RhdHVzIChwYWdlRXJyb3I6IEVycm9yKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnREcml2ZXJUYXNrICYmIGlzQ29tbWFuZFJlamVjdGFibGVCeVBhZ2VFcnJvcih0aGlzLmN1cnJlbnREcml2ZXJUYXNrLmNvbW1hbmQpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWplY3RDdXJyZW50RHJpdmVyVGFzayhwYWdlRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgfHwgcGFnZUVycm9yO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9oYW5kbGVEcml2ZXJSZXF1ZXN0IChkcml2ZXJTdGF0dXM6IERyaXZlclN0YXR1cyk6IFByb21pc2U8Q29tbWFuZEJhc2UgfCBudWxsIHwgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGlzVGVzdERvbmUgICAgICAgICAgICAgICAgID0gdGhpcy5jdXJyZW50RHJpdmVyVGFzayAmJiB0aGlzLmN1cnJlbnREcml2ZXJUYXNrLmNvbW1hbmQudHlwZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EX1RZUEUudGVzdERvbmU7XG4gICAgICAgIGNvbnN0IHBhZ2VFcnJvciAgICAgICAgICAgICAgICAgID0gdGhpcy5wZW5kaW5nUGFnZUVycm9yIHx8IGRyaXZlclN0YXR1cy5wYWdlRXJyb3I7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUYXNrUmVqZWN0ZWRCeUVycm9yID0gcGFnZUVycm9yICYmIHRoaXMuX2hhbmRsZVBhZ2VFcnJvclN0YXR1cyhwYWdlRXJyb3IpO1xuXG4gICAgICAgIHRoaXMuY29uc29sZU1lc3NhZ2VzLmNvbmNhdChkcml2ZXJTdGF0dXMuY29uc29sZU1lc3NhZ2VzKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRUYXNrUmVqZWN0ZWRCeUVycm9yICYmIGRyaXZlclN0YXR1cy5pc0NvbW1hbmRSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChpc1Rlc3REb25lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUN1cnJlbnREcml2ZXJUYXNrKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gVEVTVF9ET05FX0NPTkZJUk1BVElPTl9SRVNQT05TRTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZnVsZmlsbEN1cnJlbnREcml2ZXJUYXNrKGRyaXZlclN0YXR1cyk7XG5cbiAgICAgICAgICAgIGlmIChkcml2ZXJTdGF0dXMuaXNQZW5kaW5nV2luZG93U3dpdGNoaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEN1cnJlbnREcml2ZXJUYXNrQ29tbWFuZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2dldEN1cnJlbnREcml2ZXJUYXNrQ29tbWFuZCAoKTogUHJvbWlzZTxDb21tYW5kQmFzZSB8IG51bGw+IHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnREcml2ZXJUYXNrKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZDtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUubmF2aWdhdGVUbyAmJiAoY29tbWFuZCBhcyBhbnkpLnN0YXRlU25hcHNob3QpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9yb2xlUHJvdmlkZXIudXNlU3RhdGVTbmFwc2hvdChKU09OLnBhcnNlKChjb21tYW5kIGFzIGFueSkuc3RhdGVTbmFwc2hvdCkpO1xuXG4gICAgICAgIHJldHVybiBjb21tYW5kO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgY29tbWFuZFxuICAgIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVKc0V4cHJlc3Npb24gKGNvbW1hbmQ6IEV4ZWN1dGVFeHByZXNzaW9uQ29tbWFuZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCByZXN1bHRWYXJpYWJsZU5hbWUgPSBjb21tYW5kLnJlc3VsdFZhcmlhYmxlTmFtZTtcbiAgICAgICAgbGV0IGV4cHJlc3Npb24gICAgICAgICAgID0gY29tbWFuZC5leHByZXNzaW9uO1xuXG4gICAgICAgIGlmIChyZXN1bHRWYXJpYWJsZU5hbWUpXG4gICAgICAgICAgICBleHByZXNzaW9uID0gYCR7cmVzdWx0VmFyaWFibGVOYW1lfSA9ICR7ZXhwcmVzc2lvbn0sICR7cmVzdWx0VmFyaWFibGVOYW1lfWA7XG5cbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVKc0V4cHJlc3Npb24oZXhwcmVzc2lvbiwgdGhpcywgeyBza2lwVmlzaWJpbGl0eUNoZWNrOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9leGVjdXRlQXN5bmNKc0V4cHJlc3Npb24gKGNvbW1hbmQ6IEV4ZWN1dGVBc3luY0V4cHJlc3Npb25Db21tYW5kLCBjYWxsc2l0ZT86IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uKGNvbW1hbmQuZXhwcmVzc2lvbiwgdGhpcywgY2FsbHNpdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVBc3NlcnRpb24gKGNvbW1hbmQ6IEFzc2VydGlvbkNvbW1hbmQsIGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBhc3NlcnRpb25UaW1lb3V0ID0gZ2V0QXNzZXJ0aW9uVGltZW91dChjb21tYW5kLCB0aGlzLm9wdHMpO1xuICAgICAgICBjb25zdCBleGVjdXRvciAgICAgICAgID0gbmV3IEFzc2VydGlvbkV4ZWN1dG9yKGNvbW1hbmQsIGFzc2VydGlvblRpbWVvdXQsIGNhbGxzaXRlKTtcblxuICAgICAgICBleGVjdXRvci5vbmNlKCdzdGFydC1hc3NlcnRpb24tcmV0cmllcycsICh0aW1lb3V0OiBudW1iZXIpID0+IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5TaG93QXNzZXJ0aW9uUmV0cmllc1N0YXR1c0NvbW1hbmQodGltZW91dCkpKTtcbiAgICAgICAgZXhlY3V0b3Iub25jZSgnZW5kLWFzc2VydGlvbi1yZXRyaWVzJywgKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5IaWRlQXNzZXJ0aW9uUmV0cmllc1N0YXR1c0NvbW1hbmQoc3VjY2VzcykpKTtcblxuICAgICAgICBjb25zdCBleGVjdXRlRm4gPSB0aGlzLmRlY29yYXRlUHJldmVudEVtaXRBY3Rpb25FdmVudHMoKCkgPT4gZXhlY3V0b3IucnVuKCksIHsgcHJldmVudDogdHJ1ZSB9KTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUZuKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRqdXN0Q29uZmlndXJhdGlvbldpdGhDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSk6IHZvaWQge1xuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUudGVzdERvbmUpIHtcbiAgICAgICAgICAgIHRoaXMudGVzdERvbmVDb21tYW5kUXVldWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnTG9nZ2VyKVxuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdMb2dnZXIuaGlkZUJyZWFrcG9pbnQodGhpcy5zZXNzaW9uLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnNldE5hdGl2ZURpYWxvZ0hhbmRsZXIpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIgPSAoY29tbWFuZCBhcyBhbnkpLmRpYWxvZ0hhbmRsZXI7XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc3dpdGNoVG9JZnJhbWUpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUlmcmFtZVNlbGVjdG9yID0gKGNvbW1hbmQgYXMgYW55KS5zZWxlY3RvcjtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zd2l0Y2hUb01haW5XaW5kb3cpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUlmcmFtZVNlbGVjdG9yID0gbnVsbDtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zZXRUZXN0U3BlZWQpXG4gICAgICAgICAgICB0aGlzLnNwZWVkID0gKGNvbW1hbmQgYXMgYW55KS5zcGVlZDtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zZXRQYWdlTG9hZFRpbWVvdXQpXG4gICAgICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCA9IChjb21tYW5kIGFzIGFueSkuZHVyYXRpb247XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGVidWcpXG4gICAgICAgICAgICB0aGlzLmRlYnVnZ2luZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfYWRqdXN0U2NyZWVuc2hvdENvbW1hbmQgKGNvbW1hbmQ6IFRha2VTY3JlZW5zaG90QmFzZUNvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYnJvd3NlcklkICAgICAgICAgICAgICAgICAgICA9IHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uaWQ7XG4gICAgICAgIGNvbnN0IHsgaGFzQ2hyb21lbGVzc1NjcmVlbnNob3RzIH0gPSBhd2FpdCB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnByb3ZpZGVyLmhhc0N1c3RvbUFjdGlvbkZvckJyb3dzZXIoYnJvd3NlcklkKTtcblxuICAgICAgICBpZiAoIWhhc0Nocm9tZWxlc3NTY3JlZW5zaG90cylcbiAgICAgICAgICAgIGNvbW1hbmQuZ2VuZXJhdGVTY3JlZW5zaG90TWFyaygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfYWRqdXN0Q29tbWFuZE9wdGlvbnNBbmRFbnZpcm9ubWVudCAoY29tbWFuZDogQ29tbWFuZEJhc2UsIGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoKGNvbW1hbmQgYXMgYW55KS5vcHRpb25zPy5jb25maWRlbnRpYWwgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUudHlwZVRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQoKGNvbW1hbmQgYXMgYW55KS5zZWxlY3RvciwgY2FsbHNpdGUpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnJlcGxpY2F0b3IuZGVjb2RlKHJlc3VsdCk7XG5cbiAgICAgICAgICAgIChjb21tYW5kIGFzIGFueSkub3B0aW9ucy5jb25maWRlbnRpYWwgPSBpc1Bhc3N3b3JkSW5wdXQobm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5wcmVzc0tleSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLkdldEFjdGl2ZUVsZW1lbnRDb21tYW5kKCkpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnJlcGxpY2F0b3IuZGVjb2RlKHJlc3VsdCk7XG5cbiAgICAgICAgICAgIChjb21tYW5kIGFzIGFueSkub3B0aW9ucy5jb25maWRlbnRpYWwgPSBpc1Bhc3N3b3JkSW5wdXQobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX3NldEJyZWFrcG9pbnRJZk5lY2Vzc2FyeSAoY29tbWFuZDogQ29tbWFuZEJhc2UsIGNhbGxzaXRlPzogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzICYmIHRoaXMuZGVidWdnaW5nICYmIGNhblNldERlYnVnZ2VyQnJlYWtwb2ludEJlZm9yZUNvbW1hbmQoY29tbWFuZCkpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9lbnF1ZXVlU2V0QnJlYWtwb2ludENvbW1hbmQoY2FsbHNpdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQ29tbWFuZCAoY29tbWFuZDogQ29tbWFuZEJhc2UgfCBBY3Rpb25Db21tYW5kQmFzZSwgY2FsbHNpdGU/OiBzdHJpbmcgfCBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZCBpbnN0YW5jZW9mIEFjdGlvbkNvbW1hbmRCYXNlXG4gICAgICAgICAgICA/IHRoaXMuX2V4ZWN1dGVBY3Rpb25Db21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKVxuICAgICAgICAgICAgOiB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2V4ZWN1dGVBY3Rpb25Db21tYW5kIChjb21tYW5kOiBBY3Rpb25Db21tYW5kQmFzZSwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkFyZ3MgPSB7IGFwaUFjdGlvbk5hbWU6IGNvbW1hbmQubWV0aG9kTmFtZSwgY29tbWFuZCB9O1xuXG4gICAgICAgIGxldCBlcnJvckFkYXB0ZXIgPSBudWxsO1xuICAgICAgICBsZXQgZXJyb3IgICAgICAgID0gbnVsbDtcbiAgICAgICAgbGV0IHJlc3VsdCAgICAgICA9IG51bGw7XG5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fYWRqdXN0Q29tbWFuZE9wdGlvbnNBbmRFbnZpcm9ubWVudChjb21tYW5kLCBjYWxsc2l0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRBY3Rpb25FdmVudCgnYWN0aW9uLXN0YXJ0JywgYWN0aW9uQXJncyk7XG5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFlcnJvcilcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5waGFzZSA9PT0gVGVzdFJ1blBoYXNlLnBlbmRpbmdGaW5hbGl6YXRpb24gJiYgZXJyIGluc3RhbmNlb2YgRXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3IpXG4gICAgICAgICAgICAgICAgYWRkUmVuZGVyZWRXYXJuaW5nKHRoaXMud2FybmluZ0xvZywgeyBtZXNzYWdlOiBXQVJOSU5HX01FU1NBR0UudW5hd2FpdGVkTWV0aG9kV2l0aEFzc2VydGlvbiwgYWN0aW9uSWQ6IGNvbW1hbmQuYWN0aW9uSWQgfSwgY2FsbHNpdGUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0O1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgLy8gTk9URTogY2hlY2sgaWYgZXJyb3IgaXMgVGVzdENhZmVFcnJvckxpc3QgaXMgc3BlY2lmaWMgZm9yIHRoZSBgdXNlUm9sZWAgYWN0aW9uXG4gICAgICAgICAgICAvLyBpZiBlcnJvciBpcyBUZXN0Q2FmZUVycm9yTGlzdCB3ZSBkbyBub3QgbmVlZCB0byBjcmVhdGUgYW4gYWRhcHRlcixcbiAgICAgICAgICAgIC8vIHNpbmNlIGVycm9yIGlzIGFscmVhZHkgd2FzIHByb2Nlc3NlZCBpbiByb2xlIGluaXRpYWxpemVyXG4gICAgICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFRlc3RDYWZlRXJyb3JMaXN0KSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX21ha2VTY3JlZW5zaG90T25GYWlsKGNvbW1hbmQuYWN0aW9uSWQpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3JBZGFwdGVyID0gdGhpcy5fY3JlYXRlRXJyb3JBZGFwdGVyKHByb2Nlc3NUZXN0Rm5FcnJvcihlcnJvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVycm9yQWRhcHRlciA9IGVycm9yLmFkYXB0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuYXNzaWduKGFjdGlvbkFyZ3MsIHtcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgICAgZXJyOiBlcnJvckFkYXB0ZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEFjdGlvbkV2ZW50KCdhY3Rpb24tZG9uZScsIGFjdGlvbkFyZ3MpO1xuXG4gICAgICAgIGlmIChlcnJvcilcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSwgY2FsbHNpdGU/OiBDYWxsc2l0ZVJlY29yZCB8IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICB0aGlzLmRlYnVnTG9nLmNvbW1hbmQoY29tbWFuZCk7XG5cbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1BhZ2VFcnJvciAmJiBpc0NvbW1hbmRSZWplY3RhYmxlQnlQYWdlRXJyb3IoY29tbWFuZCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVqZWN0Q29tbWFuZFdpdGhQYWdlRXJyb3IoY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuXG4gICAgICAgIGlmIChpc0V4ZWN1dGFibGVPbkNsaWVudENvbW1hbmQoY29tbWFuZCkpXG4gICAgICAgICAgICB0aGlzLmFkZGluZ0RyaXZlclRhc2tzQ291bnQrKztcblxuICAgICAgICB0aGlzLl9hZGp1c3RDb25maWd1cmF0aW9uV2l0aENvbW1hbmQoY29tbWFuZCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fc2V0QnJlYWtwb2ludElmTmVjZXNzYXJ5KGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcblxuICAgICAgICBpZiAoaXNTY3JlZW5zaG90Q29tbWFuZChjb21tYW5kKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5kaXNhYmxlU2NyZWVuc2hvdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyh7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS5zY3JlZW5zaG90c0Rpc2FibGVkLCBhY3Rpb25JZDogY29tbWFuZC5hY3Rpb25JZCB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9hZGp1c3RTY3JlZW5zaG90Q29tbWFuZChjb21tYW5kIGFzIFRha2VTY3JlZW5zaG90QmFzZUNvbW1hbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQnJvd3Nlck1hbmlwdWxhdGlvbkNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlLnB1c2goY29tbWFuZCk7XG5cbiAgICAgICAgICAgIGlmIChpc1Jlc2l6ZVdpbmRvd0NvbW1hbmQoY29tbWFuZCkgJiYgdGhpcy5vcHRzLnZpZGVvUGF0aClcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyh7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS52aWRlb0Jyb3dzZXJSZXNpemluZywgYWN0aW9uSWQ6IGNvbW1hbmQuYWN0aW9uSWQgfSwgdGhpcy50ZXN0Lm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLndhaXQpXG4gICAgICAgICAgICByZXR1cm4gZGVsYXkoKGNvbW1hbmQgYXMgYW55KS50aW1lb3V0KTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc2V0UGFnZUxvYWRUaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmRlYnVnKSB7XG4gICAgICAgICAgICBjb25zdCBjYW5EZWJ1ZyA9ICF0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlzSGVhZGxlc3NCcm93c2VyKCk7XG5cbiAgICAgICAgICAgIGlmIChjYW5EZWJ1ZylcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZW5xdWV1ZVNldEJyZWFrcG9pbnRDb21tYW5kKGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkLCAoY29tbWFuZCBhcyBEZWJ1Z0NvbW1hbmQpPy5zZWxlY3Rvciwgdm9pZCAwKTtcblxuICAgICAgICAgICAgdGhpcy5kZWJ1Z2dpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcoeyBtZXNzYWdlOiBXQVJOSU5HX01FU1NBR0UuZGVidWdJbkhlYWRsZXNzRXJyb3IsIGFjdGlvbklkOiBjb21tYW5kLmFjdGlvbklkIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS51c2VSb2xlKSB7XG4gICAgICAgICAgICBsZXQgZm4gPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLl91c2VSb2xlKChjb21tYW5kIGFzIGFueSkucm9sZSwgY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuXG4gICAgICAgICAgICBmbiA9IHRoaXMuZGVjb3JhdGVQcmV2ZW50RW1pdEFjdGlvbkV2ZW50cyhmbiwgeyBwcmV2ZW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgZm4gPSB0aGlzLmRlY29yYXRlRGlzYWJsZURlYnVnQnJlYWtwb2ludHMoZm4sIHsgZGlzYWJsZTogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUucnVuQ3VzdG9tQWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCB7IGZuLCBhcmdzIH0gPSBjb21tYW5kIGFzIFJ1bkN1c3RvbUFjdGlvbkNvbW1hbmQ7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkRm4gICAgPSB3cmFwQ3VzdG9tQWN0aW9uKGZuKTtcblxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHdyYXBwZWRGbih0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5yZXBvcnQpXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXBvcnREYXRhTG9nLmFkZERhdGEoY29tbWFuZC5hcmdzIGFzIGFueVtdKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuYXNzZXJ0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGVBc3NlcnRpb24oY29tbWFuZCBhcyBBc3NlcnRpb25Db21tYW5kLCBjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmV4ZWN1dGVFeHByZXNzaW9uKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2V4ZWN1dGVKc0V4cHJlc3Npb24oY29tbWFuZCBhcyBFeGVjdXRlRXhwcmVzc2lvbkNvbW1hbmQpO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5leGVjdXRlQXN5bmNFeHByZXNzaW9uKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGVBc3luY0pzRXhwcmVzc2lvbihjb21tYW5kIGFzIEV4ZWN1dGVBc3luY0V4cHJlc3Npb25Db21tYW5kLCBjYWxsc2l0ZSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5nZXRCcm93c2VyQ29uc29sZU1lc3NhZ2VzKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VucXVldWVCcm93c2VyQ29uc29sZU1lc3NhZ2VzQ29tbWFuZChjb21tYW5kLCBjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnN3aXRjaFRvUHJldmlvdXNXaW5kb3cpXG4gICAgICAgICAgICAoY29tbWFuZCBhcyBhbnkpLndpbmRvd0lkID0gdGhpcy5icm93c2VyQ29ubmVjdGlvbi5wcmV2aW91c0FjdGl2ZVdpbmRvd0lkO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N3aXRjaFRvV2luZG93QnlQcmVkaWNhdGUoY29tbWFuZCBhcyBTd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmdldENvb2tpZXMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZUdldENvb2tpZXMoY29tbWFuZCBhcyBHZXRDb29raWVzQ29tbWFuZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnNldENvb2tpZXMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZVNldENvb2tpZXMoY29tbWFuZCBhcyBTZXRDb29raWVzQ29tbWFuZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmRlbGV0ZUNvb2tpZXMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZURlbGV0ZUNvb2tpZXMoY29tbWFuZCBhcyBEZWxldGVDb29raWVzQ29tbWFuZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmFkZFJlcXVlc3RIb29rcylcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbCgoY29tbWFuZCBhcyBBZGRSZXF1ZXN0SG9va3NDb21tYW5kKS5ob29rcy5tYXAoaG9vayA9PiB0aGlzLl9hZGRSZXF1ZXN0SG9vayhob29rKSkpO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5yZW1vdmVSZXF1ZXN0SG9va3MpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoKGNvbW1hbmQgYXMgUmVtb3ZlUmVxdWVzdEhvb2tzQ29tbWFuZCkuaG9va3MubWFwKGhvb2sgPT4gdGhpcy5fcmVtb3ZlUmVxdWVzdEhvb2soaG9vaykpKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZUNvbW1hbmQoY29tbWFuZCwgY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlamVjdENvbW1hbmRXaXRoUGFnZUVycm9yIChjYWxsc2l0ZT86IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTxFcnJvcj4ge1xuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLnBlbmRpbmdQYWdlRXJyb3I7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlcnIuY2FsbHNpdGUgICAgICAgICAgPSBjYWxsc2l0ZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZW5kQ2xvc2VDaGlsZFdpbmRvd09uRmlsZURvd25sb2FkaW5nQ29tbWFuZCAoKTogQ29tbWFuZEJhc2Uge1xuICAgICAgICByZXR1cm4gbmV3IGFjdGlvbkNvbW1hbmRzLkNsb3NlQ2hpbGRXaW5kb3dPbkZpbGVEb3dubG9hZGluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfbWFrZVNjcmVlbnNob3RPbkZhaWwgKGZhaWxlZEFjdGlvbklkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgc2NyZWVuc2hvdHMgfSA9IHRoaXMub3B0cyBhcyB7IHNjcmVlbnNob3RzOiBTY3JlZW5zaG90T3B0aW9uVmFsdWUgfTtcblxuICAgICAgICBpZiAoIXRoaXMuZXJyU2NyZWVuc2hvdFBhdGggJiYgc2NyZWVuc2hvdHM/LnRha2VPbkZhaWxzKVxuICAgICAgICAgICAgdGhpcy5lcnJTY3JlZW5zaG90UGF0aCA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IGJyb3dzZXJNYW5pcHVsYXRpb25Db21tYW5kcy5UYWtlU2NyZWVuc2hvdE9uRmFpbENvbW1hbmQoeyBmYWlsZWRBY3Rpb25JZCwgZnVsbFBhZ2U6IHNjcmVlbnNob3RzLmZ1bGxQYWdlIH0pKSBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGVjb3JhdGVXaXRoRmxhZyAoZm46IEZ1bmN0aW9uLCBmbGFnTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpc1tmbGFnTmFtZV0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICB0aGlzW2ZsYWdOYW1lXSA9ICF2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjb3JhdGVQcmV2ZW50RW1pdEFjdGlvbkV2ZW50cyAoZm46IEZ1bmN0aW9uLCB7IHByZXZlbnQgfTogeyBwcmV2ZW50OiBib29sZWFuIH0pOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29yYXRlV2l0aEZsYWcoZm4sICdwcmV2ZW50RW1pdEFjdGlvbkV2ZW50cycsIHByZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWNvcmF0ZURpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzIChmbjogRnVuY3Rpb24sIHsgZGlzYWJsZSB9OiB7IGRpc2FibGU6IGJvb2xlYW4gfSk6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb3JhdGVXaXRoRmxhZyhmbiwgJ2Rpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzJywgZGlzYWJsZSk7XG4gICAgfVxuXG4gICAgLy8gUm9sZSBtYW5hZ2VtZW50XG4gICAgcHVibGljIGFzeW5jIGdldFN0YXRlU25hcHNob3QgKCk6IFByb21pc2U8U3RhdGVTbmFwc2hvdD4ge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHRoaXMuX3JvbGVQcm92aWRlci5nZXRTdGF0ZVNuYXBzaG90KCk7XG5cbiAgICAgICAgc3RhdGUuc3RvcmFnZXMgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuQmFja3VwU3RvcmFnZXNDb21tYW5kKCkpIGFzIFN0b3JhZ2VzU25hcHNob3Q7XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2NsZWFuVXBDdHhzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jdHggICAgICAgID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5maXh0dXJlQ3R4ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy50ZXN0UnVuQ3R4ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3dpdGNoVG9DbGVhblJ1biAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fY2xlYW5VcEN0eHMoKTtcblxuICAgICAgICB0aGlzLmNvbnNvbGVNZXNzYWdlcyA9IG5ldyBCcm93c2VyQ29uc29sZU1lc3NhZ2VzKCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fcm9sZVByb3ZpZGVyLnVzZVN0YXRlU25hcHNob3QoU3RhdGVTbmFwc2hvdC5lbXB0eSgpKTtcblxuICAgICAgICBpZiAodGhpcy5zcGVlZCAhPT0gdGhpcy5vcHRzLnNwZWVkKSB7XG4gICAgICAgICAgICBjb25zdCBzZXRTcGVlZENvbW1hbmQgPSBuZXcgYWN0aW9uQ29tbWFuZHMuU2V0VGVzdFNwZWVkQ29tbWFuZCh7IHNwZWVkOiB0aGlzLm9wdHMuc3BlZWQgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQoc2V0U3BlZWRDb21tYW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBhZ2VMb2FkVGltZW91dCAhPT0gdGhpcy5vcHRzLnBhZ2VMb2FkVGltZW91dCkge1xuICAgICAgICAgICAgY29uc3Qgc2V0UGFnZUxvYWRUaW1lb3V0Q29tbWFuZCA9IG5ldyBhY3Rpb25Db21tYW5kcy5TZXRQYWdlTG9hZFRpbWVvdXRDb21tYW5kKHsgZHVyYXRpb246IHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQoc2V0UGFnZUxvYWRUaW1lb3V0Q29tbWFuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLm5hdmlnYXRlVG9VcmwodXJsLCB0cnVlKTtcblxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEaWFsb2dIYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVEaWFsb2dIYW5kbGVyQ29tbWFuZCA9IG5ldyBhY3Rpb25Db21tYW5kcy5TZXROYXRpdmVEaWFsb2dIYW5kbGVyQ29tbWFuZCh7IGRpYWxvZ0hhbmRsZXI6IHsgZm46IG51bGwgfSB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChyZW1vdmVEaWFsb2dIYW5kbGVyQ29tbWFuZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbmF2aWdhdGVUb1VybCAodXJsOiBzdHJpbmcsIGZvcmNlUmVsb2FkOiBib29sZWFuLCBzdGF0ZVNuYXBzaG90Pzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRlQ29tbWFuZCA9IG5ldyBhY3Rpb25Db21tYW5kcy5OYXZpZ2F0ZVRvQ29tbWFuZCh7IHVybCwgZm9yY2VSZWxvYWQsIHN0YXRlU25hcHNob3QgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuYXZpZ2F0ZUNvbW1hbmQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2dldFN0YXRlU25hcHNob3RGcm9tUm9sZSAocm9sZTogUm9sZSk6IFByb21pc2U8U3RhdGVTbmFwc2hvdD4ge1xuICAgICAgICBjb25zdCBwcmV2UGhhc2UgPSB0aGlzLnBoYXNlO1xuXG4gICAgICAgIGlmIChyb2xlLnBoYXNlID09PSBST0xFX1BIQVNFLmluaXRpYWxpemVkICYmIHJvbGUuaW5pdEVyciBpbnN0YW5jZW9mIFRlc3RDYWZlRXJyb3JMaXN0ICYmIHJvbGUuaW5pdEVyci5oYXNFcnJvcnMpXG4gICAgICAgICAgICByb2xlLmluaXRFcnIuYWRhcHRlciA9IHRoaXMuX2NyZWF0ZUVycm9yQWRhcHRlcihyb2xlLmluaXRFcnIuaXRlbXNbMF0pO1xuXG4gICAgICAgIHRoaXMucGhhc2UgPSBUZXN0UnVuUGhhc2UuaW5Sb2xlSW5pdGlhbGl6ZXI7XG5cbiAgICAgICAgaWYgKHJvbGUucGhhc2UgPT09IFJPTEVfUEhBU0UudW5pbml0aWFsaXplZClcbiAgICAgICAgICAgIGF3YWl0IHJvbGUuaW5pdGlhbGl6ZSh0aGlzKTtcblxuICAgICAgICBlbHNlIGlmIChyb2xlLnBoYXNlID09PSBST0xFX1BIQVNFLnBlbmRpbmdJbml0aWFsaXphdGlvbilcbiAgICAgICAgICAgIGF3YWl0IHByb21pc2lmeUV2ZW50KHJvbGUsICdpbml0aWFsaXplZCcpO1xuXG4gICAgICAgIGlmIChyb2xlLmluaXRFcnIpXG4gICAgICAgICAgICB0aHJvdyByb2xlLmluaXRFcnI7XG5cbiAgICAgICAgdGhpcy5waGFzZSA9IHByZXZQaGFzZTtcblxuICAgICAgICByZXR1cm4gcm9sZS5zdGF0ZVNuYXBzaG90O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3VzZVJvbGUgKHJvbGU6IFJvbGUsIGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5waGFzZSA9PT0gVGVzdFJ1blBoYXNlLmluUm9sZUluaXRpYWxpemVyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJvbGVTd2l0Y2hJblJvbGVJbml0aWFsaXplckVycm9yKGNhbGxzaXRlKTtcblxuICAgICAgICBjb25zdCBib29rbWFyayA9IG5ldyBUZXN0UnVuQm9va21hcmsodGhpcywgcm9sZSk7XG5cbiAgICAgICAgYXdhaXQgYm9va21hcmsuaW5pdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRSb2xlSWQpXG4gICAgICAgICAgICB0aGlzLnVzZWRSb2xlU3RhdGVzW3RoaXMuY3VycmVudFJvbGVJZF0gPSBhd2FpdCB0aGlzLmdldFN0YXRlU25hcHNob3QoKTtcblxuICAgICAgICBjb25zdCBzdGF0ZVNuYXBzaG90ID0gdGhpcy51c2VkUm9sZVN0YXRlc1tyb2xlLmlkXSB8fCBhd2FpdCB0aGlzLl9nZXRTdGF0ZVNuYXBzaG90RnJvbVJvbGUocm9sZSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fcm9sZVByb3ZpZGVyLnVzZVN0YXRlU25hcHNob3Qoc3RhdGVTbmFwc2hvdCk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Um9sZUlkID0gcm9sZS5pZDtcblxuICAgICAgICBhd2FpdCBib29rbWFyay5yZXN0b3JlKGNhbGxzaXRlLCBzdGF0ZVNuYXBzaG90KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q3VycmVudFVybCAoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDbGllbnRGdW5jdGlvbkJ1aWxkZXIoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgICAgIH0sIHsgYm91bmRUZXN0UnVuOiB0aGlzIH0pO1xuXG4gICAgICAgIGNvbnN0IGdldExvY2F0aW9uID0gYnVpbGRlci5nZXRGdW5jdGlvbigpO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXRMb2NhdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3N3aXRjaFRvV2luZG93QnlQcmVkaWNhdGUgKGNvbW1hbmQ6IFN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGVDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRXaW5kb3dzID0gYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgR2V0Q3VycmVudFdpbmRvd3NDb21tYW5kKHt9LCB0aGlzKSBhcyBDb21tYW5kQmFzZSkgYXMgT3BlbmVkV2luZG93SW5mb3JtYXRpb25bXTtcblxuICAgICAgICBjb25zdCB3aW5kb3dzID0gYXdhaXQgYXN5bmNGaWx0ZXI8T3BlbmVkV2luZG93SW5mb3JtYXRpb24+KGN1cnJlbnRXaW5kb3dzLCBhc3luYyB3bmQgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVkaWNhdGVEYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICB1cmw6ICAgbmV3IFVSTCh3bmQudXJsKSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHduZC50aXRsZSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQuY2hlY2tXaW5kb3cocHJlZGljYXRlRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN3aXRjaFRvV2luZG93UHJlZGljYXRlRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF3aW5kb3dzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBXaW5kb3dOb3RGb3VuZEVycm9yKCk7XG5cbiAgICAgICAgaWYgKHdpbmRvd3MubGVuZ3RoID4gMSlcbiAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHsgbWVzc2FnZTogV0FSTklOR19NRVNTQUdFLm11bHRpcGxlV2luZG93c0ZvdW5kQnlQcmVkaWNhdGUsIGFjdGlvbklkOiBjb21tYW5kLmFjdGlvbklkIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IFN3aXRjaFRvV2luZG93Q29tbWFuZCh7IHdpbmRvd0lkOiB3aW5kb3dzWzBdLmlkIH0sIHRoaXMpIGFzIENvbW1hbmRCYXNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kaXNjb25uZWN0IChlcnI6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50RHJpdmVyVGFzaylcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdEN1cnJlbnREcml2ZXJUYXNrKGVycik7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdkaXNjb25uZWN0ZWQnLCBlcnIpO1xuXG4gICAgICAgIHRlc3RSdW5UcmFja2VyLnJlbW92ZUFjdGl2ZVRlc3RSdW4odGhpcy5zZXNzaW9uLmlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVGaWxlRG93bmxvYWRpbmdJbk5ld1dpbmRvd1JlcXVlc3QgKCk6IENvbW1hbmRCYXNlIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnREb3dubG9hZGluZ0hhbmRsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VuZENsb3NlQ2hpbGRXaW5kb3dPbkZpbGVEb3dubG9hZGluZ0NvbW1hbmQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0QWN0aW9uRXZlbnQgKGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCF0aGlzLnByZXZlbnRFbWl0QWN0aW9uRXZlbnRzKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KGV2ZW50TmFtZSwgYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc011bHRpcGxlV2luZG93c0FsbG93ZWQgKHRlc3RSdW46IFRlc3RSdW4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzLCB0ZXN0IH0gPSB0ZXN0UnVuO1xuXG4gICAgICAgIHJldHVybiAhZGlzYWJsZU11bHRpcGxlV2luZG93cyAmJiAhKHRlc3QgYXMgTGVnYWN5VGVzdFJ1bikuaXNMZWdhY3kgJiYgISF0ZXN0UnVuLmFjdGl2ZVdpbmRvd0lkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0aWFsaXplICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fY2xlYXJDb29raWVzQW5kU3RvcmFnZXMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5faW5pdFJlcXVlc3RIb29rcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2NsZWFyQ29va2llc0FuZFN0b3JhZ2VzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZVBhZ2VSZWxvYWRzKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29va2llUHJvdmlkZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLl9zdG9yYWdlc1Byb3ZpZGVyLmluaXRpYWxpemUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGl2ZVdpbmRvd0lkICgpOiBudWxsIHwgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uYWN0aXZlV2luZG93SWQ7XG4gICAgfVxuXG4gICAgLy8gTk9URTogdGhpcyBmdW5jdGlvbiBpcyB0aW1lLWNyaXRpY2FsIGFuZCBtdXN0IHJldHVybiBBU0FQIHRvIGF2b2lkIGNsaWVudCBkaXNjb25uZWN0aW9uXG4gICAgcHJpdmF0ZSBhc3luYyBbQ0xJRU5UX01FU1NBR0VTLnJlYWR5XSAobXNnOiBEcml2ZXJNZXNzYWdlKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGlmIChtc2cuc3RhdHVzLmlzT2JzZXJ2aW5nRmlsZURvd25sb2FkaW5nSW5OZXdXaW5kb3cpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZURvd25sb2FkaW5nSW5OZXdXaW5kb3dSZXF1ZXN0KCk7XG5cbiAgICAgICAgdGhpcy5kZWJ1Z0xvZy5kcml2ZXJNZXNzYWdlKG1zZyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzY29ubmVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMudGVzdFJ1blJlcXVlc3RJbkRpc2Nvbm5lY3RlZEJyb3dzZXIsIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uYnJvd3NlckluZm8uYWxpYXMpKTtcblxuICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3RlZCcpO1xuXG4gICAgICAgIHRoaXMuX2NsZWFyUGVuZGluZ1JlcXVlc3QoKTtcblxuICAgICAgICAvLyBOT1RFOiB0aGUgZHJpdmVyIHNlbmRzIHRoZSBzdGF0dXMgZm9yIHRoZSBzZWNvbmQgdGltZSBpZiBpdCBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UgYXQgdGhlXG4gICAgICAgIC8vIGZpcnN0IHRyeS4gVGhpcyBpcyBwb3NzaWJsZSB3aGVuIHRoZSBwYWdlIHdhcyB1bmxvYWRlZCBhZnRlciB0aGUgZHJpdmVyIHNlbnQgdGhlIHN0YXR1cy5cbiAgICAgICAgaWYgKG1zZy5zdGF0dXMuaWQgPT09IHRoaXMubGFzdERyaXZlclN0YXR1c0lkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlO1xuXG4gICAgICAgIHRoaXMubGFzdERyaXZlclN0YXR1c0lkICAgICAgID0gbXNnLnN0YXR1cy5pZDtcbiAgICAgICAgdGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9oYW5kbGVEcml2ZXJSZXF1ZXN0KG1zZy5zdGF0dXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmxhc3REcml2ZXJTdGF0dXNSZXNwb25zZSB8fCBtc2cuc3RhdHVzLmlzUGVuZGluZ1dpbmRvd1N3aXRjaGluZylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhc3REcml2ZXJTdGF0dXNSZXNwb25zZTtcblxuICAgICAgICAvLyBOT1RFOiB3ZSBzZW5kIGFuIGVtcHR5IHJlc3BvbnNlIGFmdGVyIHRoZSBNQVhfUkVTUE9OU0VfREVMQVkgdGltZW91dCBpcyBleGNlZWRlZCB0byBrZWVwIGNvbm5lY3Rpb25cbiAgICAgICAgLy8gd2l0aCB0aGUgY2xpZW50IGFuZCBwcmV2ZW50IHRoZSByZXNwb25zZSB0aW1lb3V0IGV4Y2VwdGlvbiBvbiB0aGUgY2xpZW50IHNpZGVcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9yZXNvbHZlUGVuZGluZ1JlcXVlc3QobnVsbCksIE1BWF9SRVNQT05TRV9ERUxBWSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3QgPSB7IHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2VUaW1lb3V0IH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgW0NMSUVOVF9NRVNTQUdFUy5yZWFkeUZvckJyb3dzZXJNYW5pcHVsYXRpb25dIChtc2c6IERyaXZlck1lc3NhZ2UpOiBQcm9taXNlPEJyb3dzZXJNYW5pcHVsYXRpb25SZXN1bHQ+IHtcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZy5kcml2ZXJNZXNzYWdlKG1zZyk7XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGxldCBlcnJvciAgPSBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmJyb3dzZXJNYW5pcHVsYXRpb25RdWV1ZS5leGVjdXRlUGVuZGluZ01hbmlwdWxhdGlvbihtc2csIHRoaXMuX21lc3NhZ2VCdXMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAgICAgICAgICAgIGVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAgICAgICAgIGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBzdGFjazogICAgICAgICAgIGVyci5zdGFjayxcbiAgICAgICAgICAgICAgICAgICAgaXNJbnRlcm5hbEVycm9yOiB0cnVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyByZXN1bHQsIGVycm9yIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBbQ0xJRU5UX01FU1NBR0VTLndhaXRGb3JGaWxlRG93bmxvYWRdIChtc2c6IERyaXZlck1lc3NhZ2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZy5kcml2ZXJNZXNzYWdlKG1zZyk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsZURvd25sb2FkaW5nSGFuZGxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkaW5nSGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
1019
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1ydW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUlnQjtBQUVoQixtQ0FBZ0M7QUFDaEMsMkRBQXNEO0FBQ3RELHNFQUE2QztBQUM3Qyx3REFBZ0M7QUFDaEMsdUZBQTZEO0FBQzdELDREQUEwQztBQUMxQyxpR0FBb0Y7QUFDcEYsc0VBQXFEO0FBQ3JELCtDQUFpRDtBQUVqRCxrREFVNkI7QUFFN0Isd0VBQWdEO0FBQ2hELDJEQUEyQztBQUMzQywyREFBbUM7QUFDbkMsbUZBQXlEO0FBQ3pELG9FQUE0QztBQUM1QywrRUFBcUQ7QUFDckQsMERBQXVDO0FBQ3ZDLDBFQUF5RDtBQUN6RCwwRkFBZ0U7QUFDaEUsK0VBQXNEO0FBQ3RELHVGQUErRDtBQUUvRCw2REFRNkI7QUFFN0IsbUVBQXFEO0FBQ3JELDBEQUF3RTtBQUN4RSw0Q0FBK0U7QUFFL0UsNENBUTBCO0FBRTFCLGdEQVk0QjtBQUc1QiwyQ0FBa0U7QUFDbEUsNEZBQWlFO0FBQ2pFLCtEQUF5RjtBQUl6Riw4RUFBcUQ7QUFFckQsOEZBQW9FO0FBQ3BFLDhGQUFvRTtBQU1wRSxnREFBb0U7QUFLcEUsdUdBQTZFO0FBTTdFLG9EQUFtQztBQUVuQyxnRkFHNEM7QUFFNUMsaUdBQXVFO0FBQ3ZFLHVFQUE4QztBQUM5QyxzRUFBdUQ7QUFDdkQseUVBQWdEO0FBR2hELCtGQUFvRTtBQUNwRSw2QkFBMEI7QUFFMUIsMERBQW1FO0FBQ25FLCtDQUEwRDtBQUcxRCxnREFBNkQ7QUFFN0QsbUZBQXlEO0FBRXpELG1EQUl5QjtBQUl6QixrRkFBd0Q7QUFHeEQsTUFBTSxXQUFXLEdBQXFCLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0RSxNQUFNLHFCQUFxQixHQUFXLFdBQVcsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFD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QUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWpDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7Z0JBQ3BDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNqQjs7Z0JBRUcsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLE9BQU8sQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQXZ5Q0QsMEJBdXlDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgcHVsbCxcbiAgICByZW1vdmUsXG4gICAgY2hhaW4sXG59IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZCc7XG5pbXBvcnQgeyByZWFkU3luYyBhcyByZWFkIH0gZnJvbSAncmVhZC1maWxlLXJlbGF0aXZlJztcbmltcG9ydCBwcm9taXNpZnlFdmVudCBmcm9tICdwcm9taXNpZnktZXZlbnQnO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcbmltcG9ydCBBc3luY0V2ZW50RW1pdHRlciBmcm9tICcuLi91dGlscy9hc3luYy1ldmVudC1lbWl0dGVyJztcbmltcG9ydCBUZXN0UnVuRGVidWdMb2cgZnJvbSAnLi9kZWJ1Zy1sb2cnO1xuaW1wb3J0IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlciBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4vZm9ybWF0dGFibGUtYWRhcHRlcic7XG5pbXBvcnQgVGVzdENhZmVFcnJvckxpc3QgZnJvbSAnLi4vZXJyb3JzL2Vycm9yLWxpc3QnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuXG5pbXBvcnQge1xuICAgIFJlcXVlc3RIb29rVW5oYW5kbGVkRXJyb3IsXG4gICAgUGFnZUxvYWRFcnJvcixcbiAgICBSb2xlU3dpdGNoSW5Sb2xlSW5pdGlhbGl6ZXJFcnJvcixcbiAgICBTd2l0Y2hUb1dpbmRvd1ByZWRpY2F0ZUVycm9yLFxuICAgIFdpbmRvd05vdEZvdW5kRXJyb3IsXG4gICAgUmVxdWVzdEhvb2tCYXNlRXJyb3IsXG4gICAgVGVzdFRpbWVvdXRFcnJvcixcbiAgICBFeHRlcm5hbEFzc2VydGlvbkxpYnJhcnlFcnJvcixcbiAgICBSdW5UaW1lb3V0RXJyb3IsXG59IGZyb20gJy4uL2Vycm9ycy90ZXN0LXJ1bi8nO1xuXG5pbXBvcnQgQ0xJRU5UX01FU1NBR0VTIGZyb20gJy4vY2xpZW50LW1lc3NhZ2VzJztcbmltcG9ydCBDT01NQU5EX1RZUEUgZnJvbSAnLi9jb21tYW5kcy90eXBlJztcbmltcG9ydCBkZWxheSBmcm9tICcuLi91dGlscy9kZWxheSc7XG5pbXBvcnQgaXNQYXNzd29yZElucHV0IGZyb20gJy4uL3V0aWxzL2lzLXBhc3N3b3JkLWlucHV0JztcbmltcG9ydCB0ZXN0UnVuTWFya2VyIGZyb20gJy4vbWFya2VyLXN5bWJvbCc7XG5pbXBvcnQgdGVzdFJ1blRyYWNrZXIgZnJvbSAnLi4vYXBpL3Rlc3QtcnVuLXRyYWNrZXInO1xuaW1wb3J0IFJPTEVfUEhBU0UgZnJvbSAnLi4vcm9sZS9waGFzZSc7XG5pbXBvcnQgUmVwb3J0ZXJQbHVnaW5Ib3N0IGZyb20gJy4uL3JlcG9ydGVyL3BsdWdpbi1ob3N0JztcbmltcG9ydCBCcm93c2VyQ29uc29sZU1lc3NhZ2VzIGZyb20gJy4vYnJvd3Nlci1jb25zb2xlLW1lc3NhZ2VzJztcbmltcG9ydCBXYXJuaW5nTG9nIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1sb2cnO1xuaW1wb3J0IFdBUk5JTkdfTUVTU0FHRSBmcm9tICcuLi9ub3RpZmljYXRpb25zL3dhcm5pbmctbWVzc2FnZSc7XG5cbmltcG9ydCB7XG4gICAgU3RhdGVTbmFwc2hvdCxcbiAgICBTUEVDSUFMX0VSUk9SX1BBR0UsXG4gICAgUmVxdWVzdEZpbHRlclJ1bGUsXG4gICAgSW5qZWN0YWJsZVJlc291cmNlcyxcbiAgICBSZXF1ZXN0SG9va01ldGhvZEVycm9yLFxuICAgIFN0b3JhZ2VzU25hcHNob3QsXG4gICAgUmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyLFxufSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcblxuaW1wb3J0ICogYXMgSU5KRUNUQUJMRVMgZnJvbSAnLi4vYXNzZXRzL2luamVjdGFibGVzJztcbmltcG9ydCB7IGZpbmRQcm9ibGVtYXRpY1NjcmlwdHMgfSBmcm9tICcuLi9jdXN0b20tY2xpZW50LXNjcmlwdHMvdXRpbHMnO1xuaW1wb3J0IHsgZ2V0UGx1cmFsU3VmZml4LCBnZXRDb25jYXRlbmF0ZWRWYWx1ZXNTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zdHJpbmcnO1xuXG5pbXBvcnQge1xuICAgIGlzQ29tbWFuZFJlamVjdGFibGVCeVBhZ2VFcnJvcixcbiAgICBpc0Jyb3dzZXJNYW5pcHVsYXRpb25Db21tYW5kLFxuICAgIGlzU2NyZWVuc2hvdENvbW1hbmQsXG4gICAgaXNTZXJ2aWNlQ29tbWFuZCxcbiAgICBjYW5TZXREZWJ1Z2dlckJyZWFrcG9pbnRCZWZvcmVDb21tYW5kLFxuICAgIGlzRXhlY3V0YWJsZU9uQ2xpZW50Q29tbWFuZCxcbiAgICBpc1Jlc2l6ZVdpbmRvd0NvbW1hbmQsXG59IGZyb20gJy4vY29tbWFuZHMvdXRpbHMnO1xuXG5pbXBvcnQge1xuICAgIEV4ZWN1dGVBc3luY0V4cHJlc3Npb25Db21tYW5kLFxuICAgIEV4ZWN1dGVFeHByZXNzaW9uQ29tbWFuZCxcbiAgICBHZXRDdXJyZW50V2luZG93c0NvbW1hbmQsXG4gICAgU3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZUNvbW1hbmQsXG4gICAgU3dpdGNoVG9XaW5kb3dDb21tYW5kLFxuICAgIEdldENvb2tpZXNDb21tYW5kLFxuICAgIFNldENvb2tpZXNDb21tYW5kLFxuICAgIERlbGV0ZUNvb2tpZXNDb21tYW5kLFxuICAgIEFkZFJlcXVlc3RIb29rc0NvbW1hbmQsXG4gICAgUmVtb3ZlUmVxdWVzdEhvb2tzQ29tbWFuZCxcbiAgICBSdW5DdXN0b21BY3Rpb25Db21tYW5kLFxufSBmcm9tICcuL2NvbW1hbmRzL2FjdGlvbnMnO1xuaW1wb3J0IHsgRGVidWdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vYnNlcnZhdGlvbic7XG5cbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTLCBURVNUX1JVTl9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IHByb2Nlc3NUZXN0Rm5FcnJvciBmcm9tICcuLi9lcnJvcnMvcHJvY2Vzcy10ZXN0LWZuLWVycm9yJztcbmltcG9ydCB7IGNyZWF0ZVJlcGxpY2F0b3IsIFNlbGVjdG9yTm9kZVRyYW5zZm9ybSB9IGZyb20gJy4uL2NsaWVudC1mdW5jdGlvbnMvcmVwbGljYXRvcic7XG5pbXBvcnQgVGVzdCBmcm9tICcuLi9hcGkvc3RydWN0dXJlL3Rlc3QnO1xuaW1wb3J0IENhcHR1cmVyIGZyb20gJy4uL3NjcmVlbnNob3RzL2NhcHR1cmVyJztcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi9jb25maWd1cmF0aW9uL2ludGVyZmFjZXMnO1xuaW1wb3J0IFNlc3Npb25Db250cm9sbGVyIGZyb20gJy4vc2Vzc2lvbi1jb250cm9sbGVyJztcbmltcG9ydCBUZXN0Q29udHJvbGxlciBmcm9tICcuLi9hcGkvdGVzdC1jb250cm9sbGVyJztcbmltcG9ydCBCcm93c2VyTWFuaXB1bGF0aW9uUXVldWUgZnJvbSAnLi9icm93c2VyLW1hbmlwdWxhdGlvbi1xdWV1ZSc7XG5pbXBvcnQgT2JzZXJ2ZWRDYWxsc2l0ZXNTdG9yYWdlIGZyb20gJy4vb2JzZXJ2ZWQtY2FsbHNpdGVzLXN0b3JhZ2UnO1xuaW1wb3J0IENsaWVudFNjcmlwdCBmcm9tICcuLi9jdXN0b20tY2xpZW50LXNjcmlwdHMvY2xpZW50LXNjcmlwdCc7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb24gZnJvbSAnLi4vYnJvd3Nlci9jb25uZWN0aW9uJztcbmltcG9ydCB7IFF1YXJhbnRpbmUgfSBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucy9xdWFyYW50aW5lJztcbmltcG9ydCBSZXF1ZXN0SG9vayBmcm9tICcuLi9hcGkvcmVxdWVzdC1ob29rcy9ob29rJztcbmltcG9ydCBEcml2ZXJTdGF0dXMgZnJvbSAnLi4vY2xpZW50L2RyaXZlci9zdGF0dXMnO1xuaW1wb3J0IHsgQ29tbWFuZEJhc2UsIEFjdGlvbkNvbW1hbmRCYXNlIH0gZnJvbSAnLi9jb21tYW5kcy9iYXNlLmpzJztcbmltcG9ydCBSb2xlIGZyb20gJy4uL3JvbGUvcm9sZSc7XG5pbXBvcnQgeyBUZXN0UnVuRXJyb3JCYXNlIH0gZnJvbSAnLi4vc2hhcmVkL2Vycm9ycyc7XG5pbXBvcnQgeyBDYWxsc2l0ZVJlY29yZCB9IGZyb20gJ0BkZXZleHByZXNzL2NhbGxzaXRlLXJlY29yZCc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgZ2V0QXNzZXJ0aW9uVGltZW91dCBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucy9nZXQtYXNzZXJ0aW9uLXRpbWVvdXQnO1xuaW1wb3J0IHsgQXNzZXJ0aW9uQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYXNzZXJ0aW9uJztcbmltcG9ydCB7IFRha2VTY3JlZW5zaG90QmFzZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2Jyb3dzZXItbWFuaXB1bGF0aW9uJztcbi8vQHRzLWlnbm9yZVxuaW1wb3J0IHsgVGVzdFJ1biBhcyBMZWdhY3lUZXN0UnVuIH0gZnJvbSAndGVzdGNhZmUtbGVnYWN5LWFwaSc7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbHMgfSBmcm9tICcuLi9hcGkvc3RydWN0dXJlL2ludGVyZmFjZXMnO1xuaW1wb3J0IFRlc3RSdW5QaGFzZSBmcm9tICcuL3BoYXNlJztcblxuaW1wb3J0IHtcbiAgICBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kLFxuICAgIEV4ZWN1dGVTZWxlY3RvckNvbW1hbmQsXG59IGZyb20gJy4vY29tbWFuZHMvZXhlY3V0ZS1jbGllbnQtZnVuY3Rpb24nO1xuXG5pbXBvcnQgYWRkUmVuZGVyZWRXYXJuaW5nIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvYWRkLXJlbmRlcmVkLXdhcm5pbmcnO1xuaW1wb3J0IGdldEJyb3dzZXIgZnJvbSAnLi4vdXRpbHMvZ2V0LWJyb3dzZXInO1xuaW1wb3J0IEFzc2VydGlvbkV4ZWN1dG9yIGZyb20gJy4uL2Fzc2VydGlvbnMvZXhlY3V0b3InO1xuaW1wb3J0IGFzeW5jRmlsdGVyIGZyb20gJy4uL3V0aWxzL2FzeW5jLWZpbHRlcic7XG5pbXBvcnQgRml4dHVyZSBmcm9tICcuLi9hcGkvc3RydWN0dXJlL2ZpeHR1cmUnO1xuaW1wb3J0IE1lc3NhZ2VCdXMgZnJvbSAnLi4vdXRpbHMvbWVzc2FnZS1idXMnO1xuaW1wb3J0IGV4ZWN1dGVGbldpdGhUaW1lb3V0IGZyb20gJy4uL3V0aWxzL2V4ZWN1dGUtZm4td2l0aC10aW1lb3V0JztcbmltcG9ydCB7IFVSTCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBDb29raWVPcHRpb25zIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpb25zJztcbmltcG9ydCB7IHByZXBhcmVTa2lwSnNFcnJvcnNPcHRpb25zIH0gZnJvbSAnLi4vYXBpL3NraXAtanMtZXJyb3JzJztcbmltcG9ydCB7IENvb2tpZVByb3ZpZGVyRmFjdG9yeSB9IGZyb20gJy4vY29va2llcy9mYWN0b3J5JztcbmltcG9ydCB7IENvb2tpZVByb3ZpZGVyIH0gZnJvbSAnLi9jb29raWVzL2Jhc2UnO1xuaW1wb3J0IHsgU3RvcmFnZXNQcm92aWRlciB9IGZyb20gJy4vc3RvcmFnZXMvYmFzZSc7XG5pbXBvcnQgeyBTdG9yYWdlc1Byb3ZpZGVyRmFjdG9yeSB9IGZyb20gJy4vc3RvcmFnZXMvZmFjdG9yeSc7XG5cbmltcG9ydCB3cmFwQ3VzdG9tQWN0aW9uIGZyb20gJy4uL2FwaS93cmFwLWN1c3RvbS1hY3Rpb24nO1xuXG5pbXBvcnQge1xuICAgIE5hdGl2ZUF1dG9tYXRpb25Sb2xlUHJvdmlkZXIsXG4gICAgUHJveHlSb2xlUHJvdmlkZXIsXG4gICAgUm9sZVByb3ZpZGVyLFxufSBmcm9tICcuL3JvbGUtcHJvdmlkZXInO1xuXG5pbXBvcnQgTmF0aXZlQXV0b21hdGlvblJlcXVlc3RQaXBlbGluZSBmcm9tICcuLi9uYXRpdmUtYXV0b21hdGlvbi9yZXF1ZXN0LXBpcGVsaW5lJztcbmltcG9ydCB7IE5hdGl2ZUF1dG9tYXRpb25CYXNlIH0gZnJvbSAnLi4vbmF0aXZlLWF1dG9tYXRpb24nO1xuaW1wb3J0IFJlcG9ydERhdGFMb2cgZnJvbSAnLi4vcmVwb3J0ZXIvcmVwb3J0LWRhdGEtbG9nJztcbmltcG9ydCByZW1vdGVDaHJvbWUgZnJvbSAnY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UnO1xuXG5jb25zdCBsYXp5UmVxdWlyZSAgICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJ2ltcG9ydC1sYXp5JykocmVxdWlyZSk7XG5jb25zdCBDbGllbnRGdW5jdGlvbkJ1aWxkZXIgICAgICAgICA9IGxhenlSZXF1aXJlKCcuLi9jbGllbnQtZnVuY3Rpb25zL2NsaWVudC1mdW5jdGlvbi1idWlsZGVyJyk7XG5jb25zdCBUZXN0UnVuQm9va21hcmsgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2Jvb2ttYXJrJyk7XG5jb25zdCBhY3Rpb25Db21tYW5kcyAgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2NvbW1hbmRzL2FjdGlvbnMnKTtcbmNvbnN0IGJyb3dzZXJNYW5pcHVsYXRpb25Db21tYW5kcyAgID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvYnJvd3Nlci1tYW5pcHVsYXRpb24nKTtcbmNvbnN0IHNlcnZpY2VDb21tYW5kcyAgICAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvc2VydmljZScpO1xuY29uc3QgZXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZHMgPSBsYXp5UmVxdWlyZSgnLi9jb21tYW5kcy9leGVjdXRlLWNsaWVudC1mdW5jdGlvbicpO1xuXG5jb25zdCB7IGV4ZWN1dGVKc0V4cHJlc3Npb24sIGV4ZWN1dGVBc3luY0pzRXhwcmVzc2lvbiB9ID0gbGF6eVJlcXVpcmUoJy4vZXhlY3V0ZS1qcy1leHByZXNzaW9uJyk7XG5cbmNvbnN0IFRFU1RfUlVOX1RFTVBMQVRFICAgICAgICAgICAgICAgPSByZWFkKCcuLi9jbGllbnQvdGVzdC1ydW4vaW5kZXguanMubXVzdGFjaGUnKSBhcyBzdHJpbmc7XG5jb25zdCBJRlJBTUVfVEVTVF9SVU5fVEVNUExBVEUgICAgICAgID0gcmVhZCgnLi4vY2xpZW50L3Rlc3QtcnVuL2lmcmFtZS5qcy5tdXN0YWNoZScpIGFzIHN0cmluZztcbmNvbnN0IFRFU1RfRE9ORV9DT05GSVJNQVRJT05fUkVTUE9OU0UgPSAndGVzdC1kb25lLWNvbmZpcm1hdGlvbic7XG5jb25zdCBNQVhfUkVTUE9OU0VfREVMQVkgICAgICAgICAgICAgID0gMzAwMDtcbmNvbnN0IENISUxEX1dJTkRPV19SRUFEWV9USU1FT1VUICAgICAgPSAzMCAqIDEwMDA7XG5cbmNvbnN0IEFMTF9EUklWRVJfVEFTS1NfQURERURfVE9fUVVFVUVfRVZFTlQgPSAnYWxsLWRyaXZlci10YXNrcy1hZGRlZC10by1xdWV1ZSc7XG5cblxuaW50ZXJmYWNlIFRlc3RSdW5Jbml0IHtcbiAgICB0ZXN0OiBUZXN0O1xuICAgIGJyb3dzZXJDb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbjtcbiAgICBzY3JlZW5zaG90Q2FwdHVyZXI6IENhcHR1cmVyO1xuICAgIGdsb2JhbFdhcm5pbmdMb2c6IFdhcm5pbmdMb2c7XG4gICAgb3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT47XG4gICAgbWVzc2FnZUJ1cz86IE1lc3NhZ2VCdXM7XG4gICAgc3RhcnRSdW5FeGVjdXRpb25UaW1lPzogRGF0ZTtcbiAgICBuYXRpdmVBdXRvbWF0aW9uOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRHJpdmVyVGFzayB7XG4gICAgY29tbWFuZDogQ29tbWFuZEJhc2U7XG4gICAgcmVzb2x2ZTogRnVuY3Rpb247XG4gICAgcmVqZWN0OiBGdW5jdGlvbjtcbiAgICBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQ7XG59XG5cbmludGVyZmFjZSBEcml2ZXJNZXNzYWdlIHtcbiAgICBzdGF0dXM6IERyaXZlclN0YXR1cztcbn1cblxuaW50ZXJmYWNlIERyaXZlcldhcm5pbmcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBXQVJOSU5HX01FU1NBR0U7XG4gICAgYXJnczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBSZXF1ZXN0VGltZW91dCB7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBhamF4PzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRXhlY3V0aW9uVGltZW91dCB7XG4gICAgdGltZW91dDogbnVtYmVyO1xuICAgIHJlamVjdFdpdGg6IFRlc3RUaW1lb3V0RXJyb3IgfCBSdW5UaW1lb3V0RXJyb3I7XG59XG5cbmludGVyZmFjZSBQZW5kaW5nUmVxdWVzdCB7XG4gICAgcmVzcG9uc2VUaW1lb3V0OiBOb2RlSlMuVGltZW91dDtcbiAgICByZXNvbHZlOiBGdW5jdGlvbjtcbiAgICByZWplY3Q6IEZ1bmN0aW9uO1xufVxuXG5pbnRlcmZhY2UgQnJvd3Nlck1hbmlwdWxhdGlvblJlc3VsdCB7XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGVycm9yOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgT3BlbmVkV2luZG93SW5mb3JtYXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVzdFJ1biBleHRlbmRzIEFzeW5jRXZlbnRFbWl0dGVyIHtcbiAgICBwcml2YXRlIFt0ZXN0UnVuTWFya2VyXTogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgd2FybmluZ0xvZzogV2FybmluZ0xvZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0RGF0YUxvZzogUmVwb3J0RGF0YUxvZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+O1xuICAgIHB1YmxpYyByZWFkb25seSB0ZXN0OiBUZXN0O1xuICAgIHB1YmxpYyByZWFkb25seSBicm93c2VyQ29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb247XG4gICAgcHVibGljIHVuc3RhYmxlOiBib29sZWFuO1xuICAgIHB1YmxpYyBwaGFzZTogVGVzdFJ1blBoYXNlO1xuICAgIHByaXZhdGUgZHJpdmVyVGFza1F1ZXVlOiBEcml2ZXJUYXNrW107XG4gICAgcHJpdmF0ZSB0ZXN0RG9uZUNvbW1hbmRRdWV1ZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIGFjdGl2ZURpYWxvZ0hhbmRsZXI6IEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQgfCBudWxsO1xuICAgIHB1YmxpYyBhY3RpdmVJZnJhbWVTZWxlY3RvcjogRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZCB8IG51bGw7XG4gICAgcHVibGljIHNwZWVkOiBudW1iZXI7XG4gICAgcHVibGljIHBhZ2VMb2FkVGltZW91dDogbnVtYmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVzdEV4ZWN1dGlvblRpbWVvdXQ6IEV4ZWN1dGlvblRpbWVvdXQgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcnVuRXhlY3V0aW9uVGltZW91dDogRXhlY3V0aW9uVGltZW91dCB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXNhYmxlUGFnZVJlbG9hZHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNhYmxlUGFnZUNhY2hpbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVxdWVzdFRpbWVvdXQ6IFJlcXVlc3RUaW1lb3V0O1xuICAgIHB1YmxpYyByZWFkb25seSBzZXNzaW9uOiBTZXNzaW9uQ29udHJvbGxlcjtcbiAgICBwdWJsaWMgY29uc29sZU1lc3NhZ2VzOiBCcm93c2VyQ29uc29sZU1lc3NhZ2VzO1xuICAgIHByaXZhdGUgcGVuZGluZ1JlcXVlc3Q6IFBlbmRpbmdSZXF1ZXN0IHwgbnVsbDtcbiAgICBwdWJsaWMgcGVuZGluZ1BhZ2VFcnJvcjogUGFnZUxvYWRFcnJvciB8IEVycm9yIHwgbnVsbDtcbiAgICBwdWJsaWMgY29udHJvbGxlcjogVGVzdENvbnRyb2xsZXIgfCBudWxsO1xuICAgIHB1YmxpYyBjdHg6IG9iamVjdDtcbiAgICBwdWJsaWMgZml4dHVyZUN0eDogb2JqZWN0IHwgbnVsbDtcbiAgICBwdWJsaWMgdGVzdFJ1bkN0eDogb2JqZWN0IHwgbnVsbDtcbiAgICBwcml2YXRlIGN1cnJlbnRSb2xlSWQ6IHN0cmluZyB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VkUm9sZVN0YXRlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBwdWJsaWMgZXJyczogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyW107XG4gICAgcHJpdmF0ZSBsYXN0RHJpdmVyU3RhdHVzSWQ6IHN0cmluZyB8IG51bGw7XG4gICAgcHJpdmF0ZSBsYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2U6IENvbW1hbmRCYXNlIHwgbnVsbCB8IHN0cmluZztcbiAgICBwcml2YXRlIGZpbGVEb3dubG9hZGluZ0hhbmRsZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBhdHRhY2htZW50RG93bmxvYWRpbmdIYW5kbGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlOiBGdW5jdGlvbiB8IG51bGw7XG4gICAgcHJpdmF0ZSBhZGRpbmdEcml2ZXJUYXNrc0NvdW50OiBudW1iZXI7XG4gICAgcHVibGljIGRlYnVnZ2luZzogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnT25GYWlsOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzYWJsZURlYnVnQnJlYWtwb2ludHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z1JlcG9ydGVyUGx1Z2luSG9zdDogUmVwb3J0ZXJQbHVnaW5Ib3N0O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlOiBCcm93c2VyTWFuaXB1bGF0aW9uUXVldWU7XG4gICAgcHJpdmF0ZSBkZWJ1Z0xvZzogVGVzdFJ1bkRlYnVnTG9nO1xuICAgIHB1YmxpYyBxdWFyYW50aW5lOiBRdWFyYW50aW5lIHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnTG9nZ2VyOiBhbnk7XG4gICAgcHVibGljIG9ic2VydmVkQ2FsbHNpdGVzOiBPYnNlcnZlZENhbGxzaXRlc1N0b3JhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXBsaWNhdG9yOiBhbnk7XG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBlcnJTY3JlZW5zaG90UGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICBwcml2YXRlIGFzeW5jSnNFeHByZXNzaW9uQ2FsbHNpdGVzOiBNYXA8c3RyaW5nLCBDYWxsc2l0ZVJlY29yZD47XG4gICAgcHVibGljIHJlYWRvbmx5IGJyb3dzZXI6IEJyb3dzZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWVzc2FnZUJ1cz86IE1lc3NhZ2VCdXM7XG4gICAgcHVibGljIHJlYWRvbmx5IGNvb2tpZVByb3ZpZGVyOiBDb29raWVQcm92aWRlcjtcbiAgICBwcml2YXRlIF9zdG9yYWdlc1Byb3ZpZGVyOiBTdG9yYWdlc1Byb3ZpZGVyO1xuICAgIHB1YmxpYyByZWFkb25seSBzdGFydFJ1bkV4ZWN1dGlvblRpbWU/OiBEYXRlO1xuICAgIHB1YmxpYyBmaW5pc2hUaW1lPzogRGF0ZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXI6IFJlcXVlc3RIb29rRXZlbnRQcm92aWRlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yb2xlUHJvdmlkZXI6IFJvbGVQcm92aWRlcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNOYXRpdmVBdXRvbWF0aW9uOiBib29sZWFuO1xuICAgIHB1YmxpYyByZWFkb25seSBpc0V4cGVyaW1lbnRhbE11bHRpcGxlV2luZG93czogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoeyB0ZXN0LCBicm93c2VyQ29ubmVjdGlvbiwgc2NyZWVuc2hvdENhcHR1cmVyLCBnbG9iYWxXYXJuaW5nTG9nLCBvcHRzLCBtZXNzYWdlQnVzLCBzdGFydFJ1bkV4ZWN1dGlvblRpbWUsIG5hdGl2ZUF1dG9tYXRpb24gfTogVGVzdFJ1bkluaXQpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzW3Rlc3RSdW5NYXJrZXJdICAgID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUJ1cyAgICAgICA9IG1lc3NhZ2VCdXM7XG4gICAgICAgIHRoaXMud2FybmluZ0xvZyAgICAgICAgPSBuZXcgV2FybmluZ0xvZyhnbG9iYWxXYXJuaW5nTG9nLCBXYXJuaW5nTG9nLmNyZWF0ZUFkZFdhcm5pbmdDYWxsYmFjayhtZXNzYWdlQnVzLCB0aGlzKSk7XG4gICAgICAgIHRoaXMucmVwb3J0RGF0YUxvZyAgICAgPSBuZXcgUmVwb3J0RGF0YUxvZyhSZXBvcnREYXRhTG9nLmNyZWF0ZUFkZERhdGFDYWxsYmFjayhtZXNzYWdlQnVzLCB0aGlzKSk7XG4gICAgICAgIHRoaXMub3B0cyAgICAgICAgICAgICAgPSBvcHRzO1xuICAgICAgICB0aGlzLnRlc3QgICAgICAgICAgICAgID0gdGVzdDtcbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbiA9IGJyb3dzZXJDb25uZWN0aW9uO1xuICAgICAgICB0aGlzLnVuc3RhYmxlICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnJvd3NlciAgICAgICAgICAgPSBnZXRCcm93c2VyKGJyb3dzZXJDb25uZWN0aW9uLCBuYXRpdmVBdXRvbWF0aW9uKTtcblxuICAgICAgICB0aGlzLnBoYXNlID0gVGVzdFJ1blBoYXNlLmluaXRpYWw7XG5cbiAgICAgICAgdGhpcy5kcml2ZXJUYXNrUXVldWUgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy50ZXN0RG9uZUNvbW1hbmRRdWV1ZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIgID0gbnVsbDtcbiAgICAgICAgdGhpcy5hY3RpdmVJZnJhbWVTZWxlY3RvciA9IG51bGw7XG4gICAgICAgIHRoaXMuc3BlZWQgICAgICAgICAgICAgICAgPSB0aGlzLm9wdHMuc3BlZWQgYXMgbnVtYmVyO1xuICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCAgICAgID0gdGhpcy5fZ2V0UGFnZUxvYWRUaW1lb3V0KHRlc3QsIG9wdHMpO1xuICAgICAgICB0aGlzLnRlc3RFeGVjdXRpb25UaW1lb3V0ID0gdGhpcy5fZ2V0VGVzdEV4ZWN1dGlvblRpbWVvdXQob3B0cyk7XG5cbiAgICAgICAgdGhpcy5kaXNhYmxlUGFnZVJlbG9hZHMgPSB0ZXN0LmRpc2FibGVQYWdlUmVsb2FkcyB8fCBvcHRzLmRpc2FibGVQYWdlUmVsb2FkcyBhcyBib29sZWFuICYmIHRlc3QuZGlzYWJsZVBhZ2VSZWxvYWRzICE9PSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaXNhYmxlUGFnZUNhY2hpbmcgPSB0ZXN0LmRpc2FibGVQYWdlQ2FjaGluZyB8fCBvcHRzLmRpc2FibGVQYWdlQ2FjaGluZyBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLmlzTmF0aXZlQXV0b21hdGlvbiA9IG5hdGl2ZUF1dG9tYXRpb247XG5cbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzICAgICAgICA9IG9wdHMuZGlzYWJsZU11bHRpcGxlV2luZG93cyBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLmlzRXhwZXJpbWVudGFsTXVsdGlwbGVXaW5kb3dzID0gb3B0cy5leHBlcmltZW50YWxNdWx0aXBsZVdpbmRvd3MgYXMgYm9vbGVhbjtcblxuICAgICAgICB0aGlzLnJlcXVlc3RUaW1lb3V0ID0gdGhpcy5fZ2V0UmVxdWVzdFRpbWVvdXQodGVzdCwgb3B0cyk7XG5cbiAgICAgICAgdGhpcy5zZXNzaW9uID0gU2Vzc2lvbkNvbnRyb2xsZXIuZ2V0U2Vzc2lvbih0aGlzKTtcblxuICAgICAgICB0aGlzLmNvbnNvbGVNZXNzYWdlcyA9IG5ldyBCcm93c2VyQ29uc29sZU1lc3NhZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gbnVsbDtcblxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmN0eCAgICAgICAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmZpeHR1cmVDdHggPSBudWxsO1xuICAgICAgICB0aGlzLnRlc3RSdW5DdHggPSBudWxsO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFJvbGVJZCAgPSBudWxsO1xuICAgICAgICB0aGlzLnVzZWRSb2xlU3RhdGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICB0aGlzLmVycnMgPSBbXTtcblxuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNJZCAgICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlID0gbnVsbDtcblxuICAgICAgICB0aGlzLmZpbGVEb3dubG9hZGluZ0hhbmRsZWQgICAgICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5hdHRhY2htZW50RG93bmxvYWRpbmdIYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5hZGRpbmdEcml2ZXJUYXNrc0NvdW50ID0gMDtcblxuICAgICAgICB0aGlzLmRlYnVnZ2luZyAgICAgICAgICAgICAgID0gdGhpcy5vcHRzLmRlYnVnTW9kZSBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLmRlYnVnT25GYWlsICAgICAgICAgICAgID0gdGhpcy5vcHRzLmRlYnVnT25GYWlsIGFzIGJvb2xlYW47XG4gICAgICAgIHRoaXMuZGlzYWJsZURlYnVnQnJlYWtwb2ludHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWJ1Z1JlcG9ydGVyUGx1Z2luSG9zdCA9IG5ldyBSZXBvcnRlclBsdWdpbkhvc3QoeyBub0NvbG9yczogZmFsc2UgfSk7XG5cbiAgICAgICAgdGhpcy5icm93c2VyTWFuaXB1bGF0aW9uUXVldWUgPSBuZXcgQnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlKGJyb3dzZXJDb25uZWN0aW9uLCBzY3JlZW5zaG90Q2FwdHVyZXIsIHRoaXMud2FybmluZ0xvZyk7XG5cbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyA9IG5ldyBUZXN0UnVuRGVidWdMb2codGhpcy5icm93c2VyQ29ubmVjdGlvbi51c2VyQWdlbnQpO1xuXG4gICAgICAgIHRoaXMucXVhcmFudGluZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5kZWJ1Z0xvZ2dlciA9IHRoaXMub3B0cy5kZWJ1Z0xvZ2dlcjtcblxuICAgICAgICB0aGlzLm9ic2VydmVkQ2FsbHNpdGVzICAgICAgICAgID0gbmV3IE9ic2VydmVkQ2FsbHNpdGVzU3RvcmFnZSgpO1xuICAgICAgICB0aGlzLmFzeW5jSnNFeHByZXNzaW9uQ2FsbHNpdGVzID0gbmV3IE1hcDxzdHJpbmcsIENhbGxzaXRlUmVjb3JkPigpO1xuXG4gICAgICAgIHRoaXMucmVwbGljYXRvciA9IGNyZWF0ZVJlcGxpY2F0b3IoWyBuZXcgU2VsZWN0b3JOb2RlVHJhbnNmb3JtKCkgXSk7XG5cbiAgICAgICAgdGhpcy5kaXNjb25uZWN0ZWQgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVyclNjcmVlbnNob3RQYXRoID0gbnVsbDtcblxuICAgICAgICB0aGlzLnN0YXJ0UnVuRXhlY3V0aW9uVGltZSAgICAgPSBzdGFydFJ1bkV4ZWN1dGlvblRpbWU7XG4gICAgICAgIHRoaXMucnVuRXhlY3V0aW9uVGltZW91dCAgICAgICA9IHRoaXMuX2dldFJ1bkV4ZWN1dGlvblRpbWVvdXQob3B0cyk7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RIb29rRXZlbnRQcm92aWRlciA9IHRoaXMuX2dldFJlcXVlc3RIb29rRXZlbnRQcm92aWRlcigpO1xuICAgICAgICB0aGlzLl9yb2xlUHJvdmlkZXIgICAgICAgICAgICAgPSB0aGlzLl9nZXRSb2xlUHJvdmlkZXIoKTtcblxuICAgICAgICB0aGlzLmNvb2tpZVByb3ZpZGVyICAgID0gQ29va2llUHJvdmlkZXJGYWN0b3J5LmNyZWF0ZSh0aGlzLCB0aGlzLmlzTmF0aXZlQXV0b21hdGlvbik7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2VzUHJvdmlkZXIgPSBTdG9yYWdlc1Byb3ZpZGVyRmFjdG9yeS5jcmVhdGUodGhpcywgdGhpcy5pc05hdGl2ZUF1dG9tYXRpb24pO1xuXG4gICAgICAgIHRoaXMuX2FkZEluamVjdGFibGVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyICgpOiBSZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIge1xuICAgICAgICBpZiAoIXRoaXMuaXNOYXRpdmVBdXRvbWF0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXI7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0UGlwZWxpbmUucmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlU3RvcmFnZXNTbmFwc2hvdCAoc3RvcmFnZVNuYXBzaG90OiBTdG9yYWdlc1NuYXBzaG90KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzTmF0aXZlQXV0b21hdGlvbilcbiAgICAgICAgICAgIHRoaXMuX25hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0UGlwZWxpbmUucmVzdG9yaW5nU3RvcmFnZXMgPSBzdG9yYWdlU25hcHNob3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgX25hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0UGlwZWxpbmUgKCk6IE5hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0UGlwZWxpbmUge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmF0aXZlQXV0b21hdGlvbi5yZXF1ZXN0UGlwZWxpbmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgX25hdGl2ZUF1dG9tYXRpb24gKCk6IE5hdGl2ZUF1dG9tYXRpb25CYXNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uZ2V0TmF0aXZlQXV0b21hdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFJvbGVQcm92aWRlciAoKTogUm9sZVByb3ZpZGVyIHtcbiAgICAgICAgaWYgKHRoaXMuaXNOYXRpdmVBdXRvbWF0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVBdXRvbWF0aW9uUm9sZVByb3ZpZGVyKHRoaXMpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJveHlSb2xlUHJvdmlkZXIodGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UGFnZUxvYWRUaW1lb3V0ICh0ZXN0OiBUZXN0LCBvcHRzOiBEaWN0aW9uYXJ5PE9wdGlvblZhbHVlPik6IG51bWJlciB7XG4gICAgICAgIGlmICh0ZXN0LnRpbWVvdXRzPy5wYWdlTG9hZFRpbWVvdXQgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybiB0ZXN0LnRpbWVvdXRzLnBhZ2VMb2FkVGltZW91dDtcblxuICAgICAgICByZXR1cm4gb3B0cy5wYWdlTG9hZFRpbWVvdXQgYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFJlcXVlc3RUaW1lb3V0ICh0ZXN0OiBUZXN0LCBvcHRzOiBEaWN0aW9uYXJ5PE9wdGlvblZhbHVlPik6IFJlcXVlc3RUaW1lb3V0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2U6IHRlc3QudGltZW91dHM/LnBhZ2VSZXF1ZXN0VGltZW91dCB8fCBvcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCBhcyBudW1iZXIsXG4gICAgICAgICAgICBhamF4OiB0ZXN0LnRpbWVvdXRzPy5hamF4UmVxdWVzdFRpbWVvdXQgfHwgb3B0cy5hamF4UmVxdWVzdFRpbWVvdXQgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEV4ZWN1dGlvblRpbWVvdXQgKHRpbWVvdXQ6IG51bWJlciwgZXJyb3I6IFRlc3RUaW1lb3V0RXJyb3IgfCBSdW5UaW1lb3V0RXJyb3IpOiBFeGVjdXRpb25UaW1lb3V0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICByZWplY3RXaXRoOiBlcnJvcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRUZXN0RXhlY3V0aW9uVGltZW91dCAob3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBFeGVjdXRpb25UaW1lb3V0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRlc3RFeGVjdXRpb25UaW1lb3V0ID0gb3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCBhcyBudW1iZXIgfHwgMDtcblxuICAgICAgICBpZiAoIXRlc3RFeGVjdXRpb25UaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEV4ZWN1dGlvblRpbWVvdXQodGVzdEV4ZWN1dGlvblRpbWVvdXQsIG5ldyBUZXN0VGltZW91dEVycm9yKHRlc3RFeGVjdXRpb25UaW1lb3V0KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UnVuRXhlY3V0aW9uVGltZW91dCAob3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBFeGVjdXRpb25UaW1lb3V0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJ1bkV4ZWN1dGlvblRpbWVvdXQgPSBvcHRzLnJ1bkV4ZWN1dGlvblRpbWVvdXQgYXMgbnVtYmVyIHx8IDA7XG5cbiAgICAgICAgaWYgKCFydW5FeGVjdXRpb25UaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEV4ZWN1dGlvblRpbWVvdXQocnVuRXhlY3V0aW9uVGltZW91dCwgbmV3IFJ1blRpbWVvdXRFcnJvcihydW5FeGVjdXRpb25UaW1lb3V0KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXN0UnVuRXhlY3V0aW9uVGltZW91dCAoKTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRSdW5FeGVjdXRpb25UaW1lIHx8ICF0aGlzLnJ1bkV4ZWN1dGlvblRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjdXJyZW50VGltZW91dCA9IE1hdGgubWF4KHRoaXMucnVuRXhlY3V0aW9uVGltZW91dC50aW1lb3V0IC0gKERhdGUubm93KCkgLSB0aGlzLnN0YXJ0UnVuRXhlY3V0aW9uVGltZS5nZXRUaW1lKCkpLCAwKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RXhlY3V0aW9uVGltZW91dChjdXJyZW50VGltZW91dCwgdGhpcy5ydW5FeGVjdXRpb25UaW1lb3V0LnJlamVjdFdpdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXhlY3V0aW9uVGltZW91dCAoKTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN0UnVuRXhlY3V0aW9uVGltZW91dCAmJiAoIXRoaXMudGVzdEV4ZWN1dGlvblRpbWVvdXQgfHwgdGhpcy5yZXN0UnVuRXhlY3V0aW9uVGltZW91dC50aW1lb3V0IDwgdGhpcy50ZXN0RXhlY3V0aW9uVGltZW91dC50aW1lb3V0KVxuICAgICAgICAgICAgPyB0aGlzLnJlc3RSdW5FeGVjdXRpb25UaW1lb3V0XG4gICAgICAgICAgICA6IHRoaXMudGVzdEV4ZWN1dGlvblRpbWVvdXQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q3VycmVudENEUFNlc3Npb24gKCk6IFByb21pc2U8cmVtb3RlQ2hyb21lLlByb3RvY29sQXBpIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5icm93c2VyQ29ubmVjdGlvbi5nZXRDdXJyZW50Q0RQU2Vzc2lvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZENsaWVudFNjcmlwdENvbnRlbnRXYXJuaW5nc0lmTmVjZXNzYXJ5ICgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBlbXB0eSwgZHVwbGljYXRlZENvbnRlbnQgfSA9IGZpbmRQcm9ibGVtYXRpY1NjcmlwdHModGhpcy50ZXN0LmNsaWVudFNjcmlwdHMgYXMgQ2xpZW50U2NyaXB0W10pO1xuXG4gICAgICAgIGlmIChlbXB0eS5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyhXQVJOSU5HX01FU1NBR0UuY2xpZW50U2NyaXB0c1dpdGhFbXB0eUNvbnRlbnQpO1xuXG4gICAgICAgIGlmIChkdXBsaWNhdGVkQ29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGdldFBsdXJhbFN1ZmZpeChkdXBsaWNhdGVkQ29udGVudCk7XG4gICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVkQ29udGVudENsaWVudFNjcmlwdHNTdHIgPSBnZXRDb25jYXRlbmF0ZWRWYWx1ZXNTdHJpbmcoZHVwbGljYXRlZENvbnRlbnQsICdcXG4nKTtcblxuICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcoV0FSTklOR19NRVNTQUdFLmNsaWVudFNjcmlwdHNXaXRoRHVwbGljYXRlZENvbnRlbnQsIHN1ZmZpeCwgZHVwbGljYXRlZENvbnRlbnRDbGllbnRTY3JpcHRzU3RyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZEluamVjdGFibGVzICgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYWRkQ2xpZW50U2NyaXB0Q29udGVudFdhcm5pbmdzSWZOZWNlc3NhcnkoKTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNOYXRpdmVBdXRvbWF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmluamVjdGFibGUuc2NyaXB0cy5wdXNoKC4uLklOSkVDVEFCTEVTLlNDUklQVFMpO1xuICAgICAgICAgICAgdGhpcy5pbmplY3RhYmxlLnN0eWxlcy5wdXNoKElOSkVDVEFCTEVTLlRFU1RDQUZFX1VJX1NUWUxFUyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluamVjdGFibGUudXNlclNjcmlwdHMucHVzaCguLi50aGlzLnRlc3QuY2xpZW50U2NyaXB0cy5tYXAoc2NyaXB0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiAgKHNjcmlwdCBhcyBDbGllbnRTY3JpcHQpLmdldFJlc3VsdFVybCh0aGlzLmlkKSxcbiAgICAgICAgICAgICAgICBwYWdlOiBzY3JpcHQucGFnZSBhcyBSZXF1ZXN0RmlsdGVyUnVsZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlkICgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaW5qZWN0YWJsZSAoKTogSW5qZWN0YWJsZVJlc291cmNlcyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uaW5qZWN0YWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUXVhcmFudGluZUluZm8gKHF1YXJhbnRpbmU6IFF1YXJhbnRpbmUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5xdWFyYW50aW5lID0gcXVhcmFudGluZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9hZGRSZXF1ZXN0SG9vayAoaG9vazogUmVxdWVzdEhvb2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudGVzdC5yZXF1ZXN0SG9va3MuaW5jbHVkZXMoaG9vaykpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy50ZXN0LnJlcXVlc3RIb29rcy5wdXNoKGhvb2spO1xuICAgICAgICBhd2FpdCB0aGlzLl9pbml0UmVxdWVzdEhvb2soaG9vayk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcmVtb3ZlUmVxdWVzdEhvb2sgKGhvb2s6IFJlcXVlc3RIb29rKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy50ZXN0LnJlcXVlc3RIb29rcy5pbmNsdWRlcyhob29rKSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBwdWxsKHRoaXMudGVzdC5yZXF1ZXN0SG9va3MsIGhvb2spO1xuICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlUmVxdWVzdEhvb2soaG9vayk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfaW5pdFJlcXVlc3RIb29rIChob29rOiBSZXF1ZXN0SG9vayk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBob29rLl93YXJuaW5nTG9nID0gdGhpcy53YXJuaW5nTG9nO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGhvb2suX3JlcXVlc3RGaWx0ZXJSdWxlcy5tYXAocnVsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyLmFkZFJlcXVlc3RFdmVudExpc3RlbmVycyhydWxlLCB7XG4gICAgICAgICAgICAgICAgb25SZXF1ZXN0OiAgICAgICAgICAgaG9vay5vblJlcXVlc3QuYmluZChob29rKSxcbiAgICAgICAgICAgICAgICBvbkNvbmZpZ3VyZVJlc3BvbnNlOiBob29rLl9vbkNvbmZpZ3VyZVJlc3BvbnNlLmJpbmQoaG9vayksXG4gICAgICAgICAgICAgICAgb25SZXNwb25zZTogICAgICAgICAgaG9vay5vblJlc3BvbnNlLmJpbmQoaG9vayksXG4gICAgICAgICAgICB9LCAoZXJyOiBSZXF1ZXN0SG9va01ldGhvZEVycm9yKSA9PiB0aGlzLl9vblJlcXVlc3RIb29rTWV0aG9kRXJyb3IoZXJyLCBob29rLl9jbGFzc05hbWUpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29uUmVxdWVzdEhvb2tNZXRob2RFcnJvciAoZXZlbnQ6IFJlcXVlc3RIb29rTWV0aG9kRXJyb3IsIGhvb2tDbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBsZXQgZXJyOiBFcnJvciB8IFRlc3RSdW5FcnJvckJhc2UgICAgICAgICAgICA9IGV2ZW50LmVycm9yO1xuICAgICAgICBjb25zdCBpc1JlcXVlc3RIb29rTm90SW1wbGVtZW50ZWRNZXRob2RFcnJvciA9IChlcnIgYXMgdW5rbm93biBhcyBUZXN0UnVuRXJyb3JCYXNlKT8uY29kZSA9PT0gVEVTVF9SVU5fRVJST1JTLnJlcXVlc3RIb29rTm90SW1wbGVtZW50ZWRFcnJvcjtcblxuICAgICAgICBpZiAoIWlzUmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZE1ldGhvZEVycm9yKVxuICAgICAgICAgICAgZXJyID0gbmV3IFJlcXVlc3RIb29rVW5oYW5kbGVkRXJyb3IoZXJyLCBob29rQ2xhc3NOYW1lLCBldmVudC5tZXRob2ROYW1lKTtcblxuICAgICAgICB0aGlzLmFkZEVycm9yKGVycik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZGlzcG9zZVJlcXVlc3RIb29rIChob29rOiBSZXF1ZXN0SG9vayk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBob29rLl93YXJuaW5nTG9nID0gbnVsbDtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChob29rLl9yZXF1ZXN0RmlsdGVyUnVsZXMubWFwKHJ1bGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RIb29rRXZlbnRQcm92aWRlci5yZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMocnVsZSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9kZXRhY2hSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMgKHJ1bGVzOiBSZXF1ZXN0RmlsdGVyUnVsZVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHJ1bGVzLm1hcChydWxlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIucmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzKHJ1bGUpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfaW5pdFJlcXVlc3RIb29rcyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMudGVzdC5yZXF1ZXN0SG9va3MubWFwKGhvb2sgPT4gdGhpcy5faW5pdFJlcXVlc3RIb29rKGhvb2spKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcHJlcGFyZVNraXBKc0Vycm9yc09wdGlvbiAoKTogYm9vbGVhbiB8IEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy50ZXN0LnNraXBKc0Vycm9yc09wdGlvbnMgIT09IHZvaWQgMFxuICAgICAgICAgICAgPyB0aGlzLnRlc3Quc2tpcEpzRXJyb3JzT3B0aW9uc1xuICAgICAgICAgICAgOiB0aGlzLm9wdHMuc2tpcEpzRXJyb3JzIGFzIFNraXBKc0Vycm9yc09wdGlvbnNPYmplY3QgfCBib29sZWFuIHx8IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBwcmVwYXJlU2tpcEpzRXJyb3JzT3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBIYW1tZXJoZWFkIHBheWxvYWRcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UGF5bG9hZFNjcmlwdCAod2luZG93SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICB0aGlzLmZpbGVEb3dubG9hZGluZ0hhbmRsZWQgICAgICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSA9IG51bGw7XG5cbiAgICAgICAgY29uc3Qgc2tpcEpzRXJyb3JzID0gdGhpcy5fcHJlcGFyZVNraXBKc0Vycm9yc09wdGlvbigpO1xuXG4gICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoVEVTVF9SVU5fVEVNUExBVEUsIHtcbiAgICAgICAgICAgIHRlc3RSdW5JZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2Vzc2lvbi5pZCksXG4gICAgICAgICAgICBicm93c2VySWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlkKSxcbiAgICAgICAgICAgIGFjdGl2ZVdpbmRvd0lkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYWN0aXZlV2luZG93SWQpLFxuICAgICAgICAgICAgd2luZG93SWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkod2luZG93SWQgfHwgJycpLFxuICAgICAgICAgICAgYnJvd3NlckhlYXJ0YmVhdFJlbGF0aXZlVXJsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5oZWFydGJlYXRSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICBicm93c2VyU3RhdHVzUmVsYXRpdmVVcmw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnN0YXR1c1JlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJTdGF0dXNEb25lUmVsYXRpdmVVcmw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uc3RhdHVzRG9uZVJlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJJZGxlUmVsYXRpdmVVcmw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uaWRsZVJlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJBY3RpdmVXaW5kb3dJZFVybDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uYWN0aXZlV2luZG93SWRVcmwpLFxuICAgICAgICAgICAgYnJvd3NlckVuc3VyZVdpbmRvd0luTmF0aXZlQXV0b21hdGlvblVybDogICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5lbnN1cmVXaW5kb3dJbk5hdGl2ZUF1dG9tYXRpb25VcmwpLFxuICAgICAgICAgICAgYnJvd3NlckNsb3NlV2luZG93VXJsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5jbG9zZVdpbmRvd1VybCksXG4gICAgICAgICAgICBicm93c2VyT3BlbkZpbGVQcm90b2NvbFJlbGF0aXZlVXJsOiAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLm9wZW5GaWxlUHJvdG9jb2xSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICBicm93c2VyRGlzcGF0Y2hOYXRpdmVBdXRvbWF0aW9uRXZlbnRSZWxhdGl2ZVVybDogICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmRpc3BhdGNoTmF0aXZlQXV0b21hdGlvbkV2ZW50UmVsYXRpdmVVcmwpLFxuICAgICAgICAgICAgYnJvd3NlckRpc3BhdGNoTmF0aXZlQXV0b21hdGlvbkV2ZW50U2VxdWVuY2VSZWxhdGl2ZVVybDogSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5kaXNwYXRjaE5hdGl2ZUF1dG9tYXRpb25FdmVudFNlcXVlbmNlUmVsYXRpdmVVcmwpLFxuICAgICAgICAgICAgYnJvd3NlclBhcnNlU2VsZWN0b3JVcmw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5wYXJzZVNlbGVjdG9yUmVsYXRpdmVVcmwpLFxuICAgICAgICAgICAgdXNlckFnZW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi51c2VyQWdlbnQpLFxuICAgICAgICAgICAgdGVzdE5hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy50ZXN0Lm5hbWUpLFxuICAgICAgICAgICAgZml4dHVyZU5hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoKHRoaXMudGVzdC5maXh0dXJlIGFzIEZpeHR1cmUpLm5hbWUpLFxuICAgICAgICAgICAgc2VsZWN0b3JUaW1lb3V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCxcbiAgICAgICAgICAgIHBhZ2VMb2FkVGltZW91dDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUxvYWRUaW1lb3V0LFxuICAgICAgICAgICAgY2hpbGRXaW5kb3dSZWFkeVRpbWVvdXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hJTERfV0lORE9XX1JFQURZX1RJTUVPVVQsXG4gICAgICAgICAgICBza2lwSnNFcnJvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShza2lwSnNFcnJvcnMpLFxuICAgICAgICAgICAgcmV0cnlUZXN0UGFnZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLnJldHJ5VGVzdFBhZ2VzLFxuICAgICAgICAgICAgc3BlZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVlZCxcbiAgICAgICAgICAgIGRpYWxvZ0hhbmRsZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYWN0aXZlRGlhbG9nSGFuZGxlciksXG4gICAgICAgICAgICBjYW5Vc2VEZWZhdWx0V2luZG93QWN0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShhd2FpdCB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmNhblVzZURlZmF1bHRXaW5kb3dBY3Rpb25zKCkpLFxuICAgICAgICAgICAgbmF0aXZlQXV0b21hdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc05hdGl2ZUF1dG9tYXRpb24sXG4gICAgICAgICAgICBleHBlcmltZW50YWxNdWx0aXBsZVdpbmRvd3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzRXhwZXJpbWVudGFsTXVsdGlwbGVXaW5kb3dzLFxuICAgICAgICAgICAgZG9tYWluOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkucHJveHkuc2VydmVyMUluZm8uZG9tYWluKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldElmcmFtZVBheWxvYWRTY3JpcHQgKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJFbnN1cmVXaW5kb3dJbk5hdGl2ZUF1dG9tYXRpb25VcmwgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmVuc3VyZVdpbmRvd0luTmF0aXZlQXV0b21hdGlvblVybCk7XG4gICAgICAgIGNvbnN0IGV4cGVyaW1lbnRhbE11bHRpcGxlV2luZG93cyA9IHRoaXMuaXNFeHBlcmltZW50YWxNdWx0aXBsZVdpbmRvd3M7XG5cbiAgICAgICAgcmV0dXJuIE11c3RhY2hlLnJlbmRlcihJRlJBTUVfVEVTVF9SVU5fVEVNUExBVEUsIHtcbiAgICAgICAgICAgIHRlc3RSdW5JZDogICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2Vzc2lvbi5pZCksXG4gICAgICAgICAgICBzZWxlY3RvclRpbWVvdXQ6ICB0aGlzLm9wdHMuc2VsZWN0b3JUaW1lb3V0LFxuICAgICAgICAgICAgcGFnZUxvYWRUaW1lb3V0OiAgdGhpcy5wYWdlTG9hZFRpbWVvdXQsXG4gICAgICAgICAgICByZXRyeVRlc3RQYWdlczogICAhIXRoaXMub3B0cy5yZXRyeVRlc3RQYWdlcyxcbiAgICAgICAgICAgIHNwZWVkOiAgICAgICAgICAgIHRoaXMuc3BlZWQsXG4gICAgICAgICAgICBkaWFsb2dIYW5kbGVyOiAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIpLFxuICAgICAgICAgICAgbmF0aXZlQXV0b21hdGlvbjogSlNPTi5zdHJpbmdpZnkodGhpcy5pc05hdGl2ZUF1dG9tYXRpb24pLFxuICAgICAgICAgICAgZG9tYWluOiAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkucHJveHkuc2VydmVyMUluZm8uZG9tYWluKSxcbiAgICAgICAgICAgIGJyb3dzZXJFbnN1cmVXaW5kb3dJbk5hdGl2ZUF1dG9tYXRpb25VcmwsXG4gICAgICAgICAgICBleHBlcmltZW50YWxNdWx0aXBsZVdpbmRvd3MsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEhhbW1lcmhlYWQgaGFuZGxlcnNcbiAgICBwdWJsaWMgZ2V0QXV0aENyZWRlbnRpYWxzICgpOiBudWxsIHwgQXV0aENyZWRlbnRpYWxzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdC5hdXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUZpbGVEb3dubG9hZCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRpbmdIYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlQXR0YWNobWVudCAoZGF0YTogeyBpc09wZW5lZEluTmV3V2luZG93OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICAgICAgaWYgKGRhdGEuaXNPcGVuZWRJbk5ld1dpbmRvdylcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZVBhZ2VFcnJvciAoY3R4OiBhbnksIGVycjogRXJyb3IpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gbmV3IFBhZ2VMb2FkRXJyb3IoZXJyLCBjdHgucmVxT3B0cy51cmwpO1xuXG4gICAgICAgIGN0eC5yZWRpcmVjdChjdHgudG9Qcm94eVVybChTUEVDSUFMX0VSUk9SX1BBR0UpKTtcbiAgICB9XG5cbiAgICAvLyBUZXN0IGZ1bmN0aW9uIGV4ZWN1dGlvblxuICAgIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVUZXN0Rm4gKHBoYXNlOiBUZXN0UnVuUGhhc2UsIGZuOiBGdW5jdGlvbiwgdGltZW91dDogRXhlY3V0aW9uVGltZW91dCB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5waGFzZSA9IHBoYXNlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBleGVjdXRlRm5XaXRoVGltZW91dChmbiwgdGltZW91dCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9tYWtlU2NyZWVuc2hvdE9uRmFpbCgpO1xuXG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yKGVycik7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXJyU2NyZWVuc2hvdFBhdGggPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICF0aGlzLl9hZGRQZW5kaW5nUGFnZUVycm9ySWZBbnkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9ydW5CZWZvcmVIb29rICgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMudGVzdC5nbG9iYWxCZWZvcmVGbilcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluVGVzdEJlZm9yZUhvb2ssIHRoaXMudGVzdC5nbG9iYWxCZWZvcmVGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcblxuICAgICAgICBpZiAodGhpcy50ZXN0LmJlZm9yZUZuKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluVGVzdEJlZm9yZUhvb2ssIHRoaXMudGVzdC5iZWZvcmVGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcblxuICAgICAgICBpZiAodGhpcy50ZXN0LmZpeHR1cmU/LmJlZm9yZUVhY2hGbilcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pbkZpeHR1cmVCZWZvcmVFYWNoSG9vaywgdGhpcy50ZXN0LmZpeHR1cmU/LmJlZm9yZUVhY2hGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9ydW5BZnRlckhvb2sgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy50ZXN0LmFmdGVyRm4pXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pblRlc3RBZnRlckhvb2ssIHRoaXMudGVzdC5hZnRlckZuLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnRlc3QuZml4dHVyZT8uYWZ0ZXJFYWNoRm4pXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pbkZpeHR1cmVBZnRlckVhY2hIb29rLCB0aGlzLnRlc3QuZml4dHVyZT8uYWZ0ZXJFYWNoRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGVzdC5nbG9iYWxBZnRlckZuKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5UZXN0QWZ0ZXJIb29rLCB0aGlzLnRlc3QuZ2xvYmFsQWZ0ZXJGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9maW5hbGl6ZVRlc3RSdW4gKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGVzdFJ1blRyYWNrZXIucmVtb3ZlQWN0aXZlVGVzdFJ1bihpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGVzdFJ1blRyYWNrZXIuYWRkQWN0aXZlVGVzdFJ1bih0aGlzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3N0YXJ0Jyk7XG5cbiAgICAgICAgY29uc3Qgb25EaXNjb25uZWN0ZWQgPSAoZXJyOiBFcnJvcik6IHZvaWQgPT4gdGhpcy5fZGlzY29ubmVjdChlcnIpO1xuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24ub25jZSgnZGlzY29ubmVjdGVkJywgb25EaXNjb25uZWN0ZWQpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMub25jZSgnY29ubmVjdGVkJyk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdyZWFkeScpO1xuXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLl9ydW5CZWZvcmVIb29rKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluVGVzdCwgdGhpcy50ZXN0LmZuIGFzIEZ1bmN0aW9uLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcnVuQWZ0ZXJIb29rKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kaXNjb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5waGFzZSA9IFRlc3RSdW5QaGFzZS5wZW5kaW5nRmluYWxpemF0aW9uO1xuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24ucmVtb3ZlTGlzdGVuZXIoJ2Rpc2Nvbm5lY3RlZCcsIG9uRGlzY29ubmVjdGVkKTtcblxuICAgICAgICBpZiAodGhpcy5lcnJzLmxlbmd0aCAmJiB0aGlzLmRlYnVnT25GYWlsKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJTdHIgPSB0aGlzLmRlYnVnUmVwb3J0ZXJQbHVnaW5Ib3N0LmZvcm1hdEVycm9yKHRoaXMuZXJyc1swXSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2VucXVldWVTZXRCcmVha3BvaW50Q29tbWFuZCh2b2lkIDAsIG51bGwsIGVyclN0cik7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ2JlZm9yZS1kb25lJyk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLlRlc3REb25lQ29tbWFuZCgpKTtcblxuICAgICAgICB0aGlzLl9hZGRQZW5kaW5nUGFnZUVycm9ySWZBbnkoKTtcbiAgICAgICAgdGhpcy5fcmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyLmNsZWFyUmVxdWVzdEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplUmVxdWVzdEhvb2tFcnJvcnMoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9maW5hbGl6ZVRlc3RSdW4odGhpcy5zZXNzaW9uLmlkKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ2RvbmUnKTtcbiAgICB9XG5cbiAgICAvLyBFcnJvcnNcbiAgICBwcml2YXRlIF9hZGRQZW5kaW5nUGFnZUVycm9ySWZBbnkgKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMucGVuZGluZ1BhZ2VFcnJvcjtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9lbnN1cmVFcnJvcklkIChlcnI6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXJyLmlkID0gZXJyLmlkIHx8IG5hbm9pZCg3KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jcmVhdGVFcnJvckFkYXB0ZXIgKGVycjogRXJyb3IpOiBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXIge1xuICAgICAgICB0aGlzLl9lbnN1cmVFcnJvcklkKGVycik7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXIoZXJyLCB7XG4gICAgICAgICAgICB1c2VyQWdlbnQ6ICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbi51c2VyQWdlbnQsXG4gICAgICAgICAgICBzY3JlZW5zaG90UGF0aDogdGhpcy5lcnJTY3JlZW5zaG90UGF0aCB8fCAnJyxcbiAgICAgICAgICAgIHRlc3RSdW5JZDogICAgICB0aGlzLmlkLFxuICAgICAgICAgICAgdGVzdFJ1blBoYXNlOiAgIHRoaXMucGhhc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRFcnJvciAoZXJyOiBFcnJvciB8IFRlc3RDYWZlRXJyb3JMaXN0IHwgVGVzdFJ1bkVycm9yQmFzZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBlcnJMaXN0ID0gKGVyciBpbnN0YW5jZW9mIFRlc3RDYWZlRXJyb3JMaXN0ID8gZXJyLml0ZW1zIDogW2Vycl0pIGFzIEVycm9yW107XG5cbiAgICAgICAgZXJyTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuX2NyZWF0ZUVycm9yQWRhcHRlcihpdGVtKTtcblxuICAgICAgICAgICAgdGhpcy5lcnJzLnB1c2goYWRhcHRlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBub3JtYWxpemVSZXF1ZXN0SG9va0Vycm9ycyAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RIb29rRXJyb3JzID0gcmVtb3ZlKHRoaXMuZXJycywgZSA9PlxuICAgICAgICAgICAgKGUgYXMgdW5rbm93biBhcyBUZXN0UnVuRXJyb3JCYXNlKS5jb2RlID09PSBURVNUX1JVTl9FUlJPUlMucmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZEVycm9yIHx8XG4gICAgICAgICAgICAoZSBhcyB1bmtub3duIGFzIFRlc3RSdW5FcnJvckJhc2UpLmNvZGUgPT09IFRFU1RfUlVOX0VSUk9SUy5yZXF1ZXN0SG9va1VuaGFuZGxlZEVycm9yKSBhcyB1bmtub3duIGFzIFJlcXVlc3RIb29rQmFzZUVycm9yW107XG5cbiAgICAgICAgaWYgKCFyZXF1ZXN0SG9va0Vycm9ycy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdW5pcVJlcXVlc3RIb29rRXJyb3JzID0gY2hhaW4ocmVxdWVzdEhvb2tFcnJvcnMpXG4gICAgICAgICAgICAudW5pcUJ5KGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGUgYXMgdW5rbm93biBhcyBSZXF1ZXN0SG9va0Jhc2VFcnJvcjtcblxuICAgICAgICAgICAgICAgIHJldHVybiBlcnIuaG9va0NsYXNzTmFtZSArIGVyci5tZXRob2ROYW1lO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zb3J0QnkoWydob29rQ2xhc3NOYW1lJywgJ21ldGhvZE5hbWUnXSlcbiAgICAgICAgICAgIC52YWx1ZSgpIGFzIHVua25vd24gYXMgVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyW107XG5cbiAgICAgICAgdGhpcy5lcnJzID0gdGhpcy5lcnJzLmNvbmNhdCh1bmlxUmVxdWVzdEhvb2tFcnJvcnMpO1xuICAgIH1cblxuICAgIC8vIFRhc2sgcXVldWVcbiAgICBwcml2YXRlIF9lbnF1ZXVlQ29tbWFuZCAoY29tbWFuZDogQ29tbWFuZEJhc2UsIGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdClcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVQZW5kaW5nUmVxdWVzdChjb21tYW5kKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudC0tO1xuICAgICAgICAgICAgdGhpcy5kcml2ZXJUYXNrUXVldWUucHVzaCh7IGNvbW1hbmQsIHJlc29sdmUsIHJlamVjdCwgY2FsbHNpdGUgfSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5hZGRpbmdEcml2ZXJUYXNrc0NvdW50KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdChBTExfRFJJVkVSX1RBU0tTX0FEREVEX1RPX1FVRVVFX0VWRU5ULCB0aGlzLmRyaXZlclRhc2tRdWV1ZS5sZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRyaXZlclRhc2tRdWV1ZUxlbmd0aCAoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudCA/IHByb21pc2lmeUV2ZW50KHRoaXMgYXMgdW5rbm93biBhcyBFdmVudEVtaXR0ZXIsIEFMTF9EUklWRVJfVEFTS1NfQURERURfVE9fUVVFVUVfRVZFTlQpIDogUHJvbWlzZS5yZXNvbHZlKHRoaXMuZHJpdmVyVGFza1F1ZXVlLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9lbnF1ZXVlQnJvd3NlckNvbnNvbGVNZXNzYWdlc0NvbW1hbmQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fZW5xdWV1ZUNvbW1hbmQoY29tbWFuZCwgY2FsbHNpdGUpO1xuXG4gICAgICAgIGNvbnN0IGNvbnNvbGVNZXNzYWdlQ29weSA9IHRoaXMuY29uc29sZU1lc3NhZ2VzLmdldENvcHkoKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBjb25zb2xlTWVzc2FnZUNvcHlbU3RyaW5nKHRoaXMuYWN0aXZlV2luZG93SWQpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2VucXVldWVHZXRDb29raWVzIChjb21tYW5kOiBHZXRDb29raWVzQ29tbWFuZCk6IFByb21pc2U8UGFydGlhbDxDb29raWVPcHRpb25zPltdPiB7XG4gICAgICAgIGNvbnN0IHsgY29va2llcywgdXJscyB9ID0gY29tbWFuZDtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb29raWVQcm92aWRlci5nZXRDb29raWVzKGNvb2tpZXMsIHVybHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfZW5xdWV1ZVNldENvb2tpZXMgKGNvbW1hbmQ6IFNldENvb2tpZXNDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNvb2tpZXMgPSBjb21tYW5kLmNvb2tpZXM7XG4gICAgICAgIGNvbnN0IHVybCAgICAgPSBjb21tYW5kLnVybCB8fCBhd2FpdCB0aGlzLmdldEN1cnJlbnRVcmwoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb29raWVQcm92aWRlci5zZXRDb29raWVzKGNvb2tpZXMsIHVybCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9lbnF1ZXVlRGVsZXRlQ29va2llcyAoY29tbWFuZDogRGVsZXRlQ29va2llc0NvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBjb29raWVzLCB1cmxzIH0gPSBjb21tYW5kO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvb2tpZVByb3ZpZGVyLmRlbGV0ZUNvb2tpZXMoY29va2llcywgdXJscyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZW5xdWV1ZVNldEJyZWFrcG9pbnRDb21tYW5kIChjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQgfCB1bmRlZmluZWQsIHNlbGVjdG9yPzogb2JqZWN0IHwgbnVsbCwgZXJyb3I/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWdMb2dnZXIpXG4gICAgICAgICAgICB0aGlzLmRlYnVnTG9nZ2VyLnNob3dCcmVha3BvaW50KHRoaXMuc2Vzc2lvbi5pZCwgdGhpcy5icm93c2VyQ29ubmVjdGlvbi51c2VyQWdlbnQsIGNhbGxzaXRlLCBlcnJvcik7XG5cbiAgICAgICAgdGhpcy5kZWJ1Z2dpbmcgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuU2V0QnJlYWtwb2ludENvbW1hbmQoISFlcnJvciwgc2VsZWN0b3IpLCBjYWxsc2l0ZSkgYXMgYm9vbGVhbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZW1vdmVBbGxOb25TZXJ2aWNlVGFza3MgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRyaXZlclRhc2tRdWV1ZSA9IHRoaXMuZHJpdmVyVGFza1F1ZXVlLmZpbHRlcihkcml2ZXJUYXNrID0+IGlzU2VydmljZUNvbW1hbmQoZHJpdmVyVGFzay5jb21tYW5kKSk7XG5cbiAgICAgICAgdGhpcy5icm93c2VyTWFuaXB1bGF0aW9uUXVldWUucmVtb3ZlQWxsTm9uU2VydmljZU1hbmlwdWxhdGlvbnMoKTtcbiAgICB9XG5cbiAgICAvLyBDdXJyZW50IGRyaXZlciB0YXNrXG4gICAgcHVibGljIGdldCBjdXJyZW50RHJpdmVyVGFzayAoKTogRHJpdmVyVGFzayB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyaXZlclRhc2tRdWV1ZVswXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJhc2VVcmwgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdHMuYmFzZVVybCBhcyBzdHJpbmcgfHwgJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzb2x2ZUN1cnJlbnREcml2ZXJUYXNrIChyZXN1bHQ/OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudERyaXZlclRhc2sucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB0aGlzLmRyaXZlclRhc2tRdWV1ZS5zaGlmdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnRlc3REb25lQ29tbWFuZFF1ZXVlZClcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFsbE5vblNlcnZpY2VUYXNrcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlamVjdEN1cnJlbnREcml2ZXJUYXNrIChlcnI6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXJyLmNhbGxzaXRlID0gZXJyLmNhbGxzaXRlIHx8IHRoaXMuY3VycmVudERyaXZlclRhc2suY2FsbHNpdGU7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50RHJpdmVyVGFzay5yZWplY3QoZXJyKTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlQWxsTm9uU2VydmljZVRhc2tzKCk7XG4gICAgfVxuXG4gICAgLy8gUGVuZGluZyByZXF1ZXN0XG4gICAgcHJpdmF0ZSBfY2xlYXJQZW5kaW5nUmVxdWVzdCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nUmVxdWVzdC5yZXNwb25zZVRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNvbHZlUGVuZGluZ1JlcXVlc3QgKGNvbW1hbmQ6IENvbW1hbmRCYXNlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNSZXNwb25zZSA9IGNvbW1hbmQ7XG5cbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlcXVlc3QpXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0LnJlc29sdmUoY29tbWFuZCk7XG5cbiAgICAgICAgdGhpcy5fY2xlYXJQZW5kaW5nUmVxdWVzdCgpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkcml2ZXIgcmVxdWVzdFxuICAgIHByaXZhdGUgX3Nob3VsZFJlc29sdmVDdXJyZW50RHJpdmVyVGFzayAoZHJpdmVyU3RhdHVzOiBEcml2ZXJTdGF0dXMpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvbW1hbmQgPSB0aGlzLmN1cnJlbnREcml2ZXJUYXNrLmNvbW1hbmQ7XG5cbiAgICAgICAgY29uc3QgaXNFeGVjdXRpbmdPYnNlcnZhdGlvbkNvbW1hbmQgPSBjdXJyZW50Q29tbWFuZCBpbnN0YW5jZW9mIGV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmRzLkV4ZWN1dGVTZWxlY3RvckNvbW1hbmQgfHxcbiAgICAgICAgICAgIGN1cnJlbnRDb21tYW5kIGluc3RhbmNlb2YgRXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZDtcblxuICAgICAgICBjb25zdCBpc0RlYnVnQWN0aXZlID0gY3VycmVudENvbW1hbmQgaW5zdGFuY2VvZiBzZXJ2aWNlQ29tbWFuZHMuU2V0QnJlYWtwb2ludENvbW1hbmQ7XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkRXhlY3V0ZUN1cnJlbnRDb21tYW5kID1cbiAgICAgICAgICAgIGRyaXZlclN0YXR1cy5pc0ZpcnN0UmVxdWVzdEFmdGVyV2luZG93U3dpdGNoaW5nICYmIChpc0V4ZWN1dGluZ09ic2VydmF0aW9uQ29tbWFuZCB8fCBpc0RlYnVnQWN0aXZlKTtcblxuICAgICAgICByZXR1cm4gIXNob3VsZEV4ZWN1dGVDdXJyZW50Q29tbWFuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9mdWxmaWxsQ3VycmVudERyaXZlclRhc2sgKGRyaXZlclN0YXR1czogRHJpdmVyU3RhdHVzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50RHJpdmVyVGFzaylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAoZHJpdmVyU3RhdHVzLndhcm5pbmdzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRyaXZlclN0YXR1cy53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nOiBEcml2ZXJXYXJuaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgYWRkUmVuZGVyZWRXYXJuaW5nKHRoaXMud2FybmluZ0xvZywgV0FSTklOR19NRVNTQUdFW3dhcm5pbmcudHlwZV0sIHRoaXMuY3VycmVudERyaXZlclRhc2suY2FsbHNpdGUsIC4uLndhcm5pbmcuYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkcml2ZXJTdGF0dXMuZXhlY3V0aW9uRXJyb3IpXG4gICAgICAgICAgICB0aGlzLl9yZWplY3RDdXJyZW50RHJpdmVyVGFzayhkcml2ZXJTdGF0dXMuZXhlY3V0aW9uRXJyb3IpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLl9zaG91bGRSZXNvbHZlQ3VycmVudERyaXZlclRhc2soZHJpdmVyU3RhdHVzKSlcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVDdXJyZW50RHJpdmVyVGFzayhkcml2ZXJTdGF0dXMucmVzdWx0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVQYWdlRXJyb3JTdGF0dXMgKHBhZ2VFcnJvcjogRXJyb3IpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERyaXZlclRhc2sgJiYgaXNDb21tYW5kUmVqZWN0YWJsZUJ5UGFnZUVycm9yKHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdEN1cnJlbnREcml2ZXJUYXNrKHBhZ2VFcnJvcik7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGVuZGluZ1BhZ2VFcnJvciA9IHRoaXMucGVuZGluZ1BhZ2VFcnJvciB8fCBwYWdlRXJyb3I7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2hhbmRsZURyaXZlclJlcXVlc3QgKGRyaXZlclN0YXR1czogRHJpdmVyU3RhdHVzKTogUHJvbWlzZTxDb21tYW5kQmFzZSB8IG51bGwgfCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaXNUZXN0RG9uZSAgICAgICAgICAgICAgICAgPSB0aGlzLmN1cnJlbnREcml2ZXJUYXNrICYmIHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZC50eXBlID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkRfVFlQRS50ZXN0RG9uZTtcbiAgICAgICAgY29uc3QgcGFnZUVycm9yICAgICAgICAgICAgICAgICAgPSB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgfHwgZHJpdmVyU3RhdHVzLnBhZ2VFcnJvcjtcbiAgICAgICAgY29uc3QgY3VycmVudFRhc2tSZWplY3RlZEJ5RXJyb3IgPSBwYWdlRXJyb3IgJiYgdGhpcy5faGFuZGxlUGFnZUVycm9yU3RhdHVzKHBhZ2VFcnJvcik7XG5cbiAgICAgICAgdGhpcy5jb25zb2xlTWVzc2FnZXMuY29uY2F0KGRyaXZlclN0YXR1cy5jb25zb2xlTWVzc2FnZXMpO1xuXG4gICAgICAgIGlmICghY3VycmVudFRhc2tSZWplY3RlZEJ5RXJyb3IgJiYgZHJpdmVyU3RhdHVzLmlzQ29tbWFuZFJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGlzVGVzdERvbmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNvbHZlQ3VycmVudERyaXZlclRhc2soKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBURVNUX0RPTkVfQ09ORklSTUFUSU9OX1JFU1BPTlNFO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9mdWxmaWxsQ3VycmVudERyaXZlclRhc2soZHJpdmVyU3RhdHVzKTtcblxuICAgICAgICAgICAgaWYgKGRyaXZlclN0YXR1cy5pc1BlbmRpbmdXaW5kb3dTd2l0Y2hpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q3VycmVudERyaXZlclRhc2tDb21tYW5kKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0Q3VycmVudERyaXZlclRhc2tDb21tYW5kICgpOiBQcm9taXNlPENvbW1hbmRCYXNlIHwgbnVsbD4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudERyaXZlclRhc2spXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb21tYW5kID0gdGhpcy5jdXJyZW50RHJpdmVyVGFzay5jb21tYW5kO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5uYXZpZ2F0ZVRvICYmIChjb21tYW5kIGFzIGFueSkuc3RhdGVTbmFwc2hvdClcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JvbGVQcm92aWRlci51c2VTdGF0ZVNuYXBzaG90KEpTT04ucGFyc2UoKGNvbW1hbmQgYXMgYW55KS5zdGF0ZVNuYXBzaG90KSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbW1hbmQ7XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSBjb21tYW5kXG4gICAgcHJpdmF0ZSBhc3luYyBfZXhlY3V0ZUpzRXhwcmVzc2lvbiAoY29tbWFuZDogRXhlY3V0ZUV4cHJlc3Npb25Db21tYW5kKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdFZhcmlhYmxlTmFtZSA9IGNvbW1hbmQucmVzdWx0VmFyaWFibGVOYW1lO1xuICAgICAgICBsZXQgZXhwcmVzc2lvbiAgICAgICAgICAgPSBjb21tYW5kLmV4cHJlc3Npb247XG5cbiAgICAgICAgaWYgKHJlc3VsdFZhcmlhYmxlTmFtZSlcbiAgICAgICAgICAgIGV4cHJlc3Npb24gPSBgJHtyZXN1bHRWYXJpYWJsZU5hbWV9ID0gJHtleHByZXNzaW9ufSwgJHtyZXN1bHRWYXJpYWJsZU5hbWV9YDtcblxuICAgICAgICByZXR1cm4gZXhlY3V0ZUpzRXhwcmVzc2lvbihleHByZXNzaW9uLCB0aGlzLCB7IHNraXBWaXNpYmlsaXR5Q2hlY2s6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVBc3luY0pzRXhwcmVzc2lvbiAoY29tbWFuZDogRXhlY3V0ZUFzeW5jRXhwcmVzc2lvbkNvbW1hbmQsIGNhbGxzaXRlPzogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBleGVjdXRlQXN5bmNKc0V4cHJlc3Npb24oY29tbWFuZC5leHByZXNzaW9uLCB0aGlzLCBjYWxsc2l0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZXhlY3V0ZUFzc2VydGlvbiAoY29tbWFuZDogQXNzZXJ0aW9uQ29tbWFuZCwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGFzc2VydGlvblRpbWVvdXQgPSBnZXRBc3NlcnRpb25UaW1lb3V0KGNvbW1hbmQsIHRoaXMub3B0cyk7XG4gICAgICAgIGNvbnN0IGV4ZWN1dG9yICAgICAgICAgPSBuZXcgQXNzZXJ0aW9uRXhlY3V0b3IoY29tbWFuZCwgYXNzZXJ0aW9uVGltZW91dCwgY2FsbHNpdGUpO1xuXG4gICAgICAgIGV4ZWN1dG9yLm9uY2UoJ3N0YXJ0LWFzc2VydGlvbi1yZXRyaWVzJywgKHRpbWVvdXQ6IG51bWJlcikgPT4gdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLlNob3dBc3NlcnRpb25SZXRyaWVzU3RhdHVzQ29tbWFuZCh0aW1lb3V0KSkpO1xuICAgICAgICBleGVjdXRvci5vbmNlKCdlbmQtYXNzZXJ0aW9uLXJldHJpZXMnLCAoc3VjY2VzczogYm9vbGVhbikgPT4gdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLkhpZGVBc3NlcnRpb25SZXRyaWVzU3RhdHVzQ29tbWFuZChzdWNjZXNzKSkpO1xuXG4gICAgICAgIGNvbnN0IGV4ZWN1dGVGbiA9IHRoaXMuZGVjb3JhdGVQcmV2ZW50RW1pdEFjdGlvbkV2ZW50cygoKSA9PiBleGVjdXRvci5ydW4oKSwgeyBwcmV2ZW50OiB0cnVlIH0pO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlRm4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGp1c3RDb25maWd1cmF0aW9uV2l0aENvbW1hbmQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlKTogdm9pZCB7XG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS50ZXN0RG9uZSkge1xuICAgICAgICAgICAgdGhpcy50ZXN0RG9uZUNvbW1hbmRRdWV1ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWdMb2dnZXIpXG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZ2dlci5oaWRlQnJlYWtwb2ludCh0aGlzLnNlc3Npb24uaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc2V0TmF0aXZlRGlhbG9nSGFuZGxlcilcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRGlhbG9nSGFuZGxlciA9IChjb21tYW5kIGFzIGFueSkuZGlhbG9nSGFuZGxlcjtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zd2l0Y2hUb0lmcmFtZSlcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSWZyYW1lU2VsZWN0b3IgPSAoY29tbWFuZCBhcyBhbnkpLnNlbGVjdG9yO1xuXG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnN3aXRjaFRvTWFpbldpbmRvdylcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSWZyYW1lU2VsZWN0b3IgPSBudWxsO1xuXG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnNldFRlc3RTcGVlZClcbiAgICAgICAgICAgIHRoaXMuc3BlZWQgPSAoY29tbWFuZCBhcyBhbnkpLnNwZWVkO1xuXG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnNldFBhZ2VMb2FkVGltZW91dClcbiAgICAgICAgICAgIHRoaXMucGFnZUxvYWRUaW1lb3V0ID0gKGNvbW1hbmQgYXMgYW55KS5kdXJhdGlvbjtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5kZWJ1ZylcbiAgICAgICAgICAgIHRoaXMuZGVidWdnaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9hZGp1c3RTY3JlZW5zaG90Q29tbWFuZCAoY29tbWFuZDogVGFrZVNjcmVlbnNob3RCYXNlQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBicm93c2VySWQgICAgICAgICAgICAgICAgICAgID0gdGhpcy5icm93c2VyQ29ubmVjdGlvbi5pZDtcbiAgICAgICAgY29uc3QgeyBoYXNDaHJvbWVsZXNzU2NyZWVuc2hvdHMgfSA9IGF3YWl0IHRoaXMuYnJvd3NlckNvbm5lY3Rpb24ucHJvdmlkZXIuaGFzQ3VzdG9tQWN0aW9uRm9yQnJvd3Nlcihicm93c2VySWQpO1xuXG4gICAgICAgIGlmICghaGFzQ2hyb21lbGVzc1NjcmVlbnNob3RzKVxuICAgICAgICAgICAgY29tbWFuZC5nZW5lcmF0ZVNjcmVlbnNob3RNYXJrKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9hZGp1c3RDb21tYW5kT3B0aW9uc0FuZEVudmlyb25tZW50IChjb21tYW5kOiBDb21tYW5kQmFzZSwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICgoY29tbWFuZCBhcyBhbnkpLm9wdGlvbnM/LmNvbmZpZGVudGlhbCAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS50eXBlVGV4dCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZCgoY29tbWFuZCBhcyBhbnkpLnNlbGVjdG9yLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMucmVwbGljYXRvci5kZWNvZGUocmVzdWx0KTtcblxuICAgICAgICAgICAgKGNvbW1hbmQgYXMgYW55KS5vcHRpb25zLmNvbmZpZGVudGlhbCA9IGlzUGFzc3dvcmRJbnB1dChub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnByZXNzS2V5KSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuR2V0QWN0aXZlRWxlbWVudENvbW1hbmQoKSk7XG5cbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMucmVwbGljYXRvci5kZWNvZGUocmVzdWx0KTtcblxuICAgICAgICAgICAgKGNvbW1hbmQgYXMgYW55KS5vcHRpb25zLmNvbmZpZGVudGlhbCA9IGlzUGFzc3dvcmRJbnB1dChub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfc2V0QnJlYWtwb2ludElmTmVjZXNzYXJ5IChjb21tYW5kOiBDb21tYW5kQmFzZSwgY2FsbHNpdGU/OiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZURlYnVnQnJlYWtwb2ludHMgJiYgdGhpcy5kZWJ1Z2dpbmcgJiYgY2FuU2V0RGVidWdnZXJCcmVha3BvaW50QmVmb3JlQ29tbWFuZChjb21tYW5kKSlcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2VucXVldWVTZXRCcmVha3BvaW50Q29tbWFuZChjYWxsc2l0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSB8IEFjdGlvbkNvbW1hbmRCYXNlLCBjYWxsc2l0ZT86IHN0cmluZyB8IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kIGluc3RhbmNlb2YgQWN0aW9uQ29tbWFuZEJhc2VcbiAgICAgICAgICAgID8gdGhpcy5fZXhlY3V0ZUFjdGlvbkNvbW1hbmQoY29tbWFuZCwgY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpXG4gICAgICAgICAgICA6IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgY2FsbHNpdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfZXhlY3V0ZUFjdGlvbkNvbW1hbmQgKGNvbW1hbmQ6IEFjdGlvbkNvbW1hbmRCYXNlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgY29uc3QgYWN0aW9uQXJncyA9IHsgYXBpQWN0aW9uTmFtZTogY29tbWFuZC5tZXRob2ROYW1lLCBjb21tYW5kIH07XG5cbiAgICAgICAgbGV0IGVycm9yQWRhcHRlciA9IG51bGw7XG4gICAgICAgIGxldCBlcnJvciAgICAgICAgPSBudWxsO1xuICAgICAgICBsZXQgcmVzdWx0ICAgICAgID0gbnVsbDtcblxuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9hZGp1c3RDb21tYW5kT3B0aW9uc0FuZEVudmlyb25tZW50KGNvbW1hbmQsIGNhbGxzaXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEFjdGlvbkV2ZW50KCdhY3Rpb24tc3RhcnQnLCBhY3Rpb25BcmdzKTtcblxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWVycm9yKVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgY2FsbHNpdGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBoYXNlID09PSBUZXN0UnVuUGhhc2UucGVuZGluZ0ZpbmFsaXphdGlvbiAmJiBlcnIgaW5zdGFuY2VvZiBFeHRlcm5hbEFzc2VydGlvbkxpYnJhcnlFcnJvcilcbiAgICAgICAgICAgICAgICBhZGRSZW5kZXJlZFdhcm5pbmcodGhpcy53YXJuaW5nTG9nLCB7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS51bmF3YWl0ZWRNZXRob2RXaXRoQXNzZXJ0aW9uLCBhY3Rpb25JZDogY29tbWFuZC5hY3Rpb25JZCB9LCBjYWxsc2l0ZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBOT1RFOiBjaGVjayBpZiBlcnJvciBpcyBUZXN0Q2FmZUVycm9yTGlzdCBpcyBzcGVjaWZpYyBmb3IgdGhlIGB1c2VSb2xlYCBhY3Rpb25cbiAgICAgICAgICAgIC8vIGlmIGVycm9yIGlzIFRlc3RDYWZlRXJyb3JMaXN0IHdlIGRvIG5vdCBuZWVkIHRvIGNyZWF0ZSBhbiBhZGFwdGVyLFxuICAgICAgICAgICAgLy8gc2luY2UgZXJyb3IgaXMgYWxyZWFkeSB3YXMgcHJvY2Vzc2VkIGluIHJvbGUgaW5pdGlhbGl6ZXJcbiAgICAgICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgVGVzdENhZmVFcnJvckxpc3QpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbWFrZVNjcmVlbnNob3RPbkZhaWwoY29tbWFuZC5hY3Rpb25JZCk7XG5cbiAgICAgICAgICAgICAgICBlcnJvckFkYXB0ZXIgPSB0aGlzLl9jcmVhdGVFcnJvckFkYXB0ZXIocHJvY2Vzc1Rlc3RGbkVycm9yKGVycm9yKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZXJyb3JBZGFwdGVyID0gZXJyb3IuYWRhcHRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oYWN0aW9uQXJncywge1xuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBlcnI6IGVycm9yQWRhcHRlcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0QWN0aW9uRXZlbnQoJ2FjdGlvbi1kb25lJywgYWN0aW9uQXJncyk7XG5cbiAgICAgICAgaWYgKGVycm9yKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlLCBjYWxsc2l0ZT86IENhbGxzaXRlUmVjb3JkIHwgc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHRoaXMuZGVidWdMb2cuY29tbWFuZChjb21tYW5kKTtcblxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUGFnZUVycm9yICYmIGlzQ29tbWFuZFJlamVjdGFibGVCeVBhZ2VFcnJvcihjb21tYW5kKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWplY3RDb21tYW5kV2l0aFBhZ2VFcnJvcihjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG5cbiAgICAgICAgaWYgKGlzRXhlY3V0YWJsZU9uQ2xpZW50Q29tbWFuZChjb21tYW5kKSlcbiAgICAgICAgICAgIHRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudCsrO1xuXG4gICAgICAgIHRoaXMuX2FkanVzdENvbmZpZ3VyYXRpb25XaXRoQ29tbWFuZChjb21tYW5kKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9zZXRCcmVha3BvaW50SWZOZWNlc3NhcnkoY29tbWFuZCwgY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuXG4gICAgICAgIGlmIChpc1NjcmVlbnNob3RDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmRpc2FibGVTY3JlZW5zaG90cykge1xuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHsgbWVzc2FnZTogV0FSTklOR19NRVNTQUdFLnNjcmVlbnNob3RzRGlzYWJsZWQsIGFjdGlvbklkOiBjb21tYW5kLmFjdGlvbklkIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2FkanVzdFNjcmVlbnNob3RDb21tYW5kKGNvbW1hbmQgYXMgVGFrZVNjcmVlbnNob3RCYXNlQ29tbWFuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNCcm93c2VyTWFuaXB1bGF0aW9uQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgICAgICAgdGhpcy5icm93c2VyTWFuaXB1bGF0aW9uUXVldWUucHVzaChjb21tYW5kKTtcblxuICAgICAgICAgICAgaWYgKGlzUmVzaXplV2luZG93Q29tbWFuZChjb21tYW5kKSAmJiB0aGlzLm9wdHMudmlkZW9QYXRoKVxuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHsgbWVzc2FnZTogV0FSTklOR19NRVNTQUdFLnZpZGVvQnJvd3NlclJlc2l6aW5nLCBhY3Rpb25JZDogY29tbWFuZC5hY3Rpb25JZCB9LCB0aGlzLnRlc3QubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUud2FpdClcbiAgICAgICAgICAgIHJldHVybiBkZWxheSgoY29tbWFuZCBhcyBhbnkpLnRpbWVvdXQpO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zZXRQYWdlTG9hZFRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGVidWcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbkRlYnVnID0gIXRoaXMuYnJvd3NlckNvbm5lY3Rpb24uaXNIZWFkbGVzc0Jyb3dzZXIoKTtcblxuICAgICAgICAgICAgaWYgKGNhbkRlYnVnKVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9lbnF1ZXVlU2V0QnJlYWtwb2ludENvbW1hbmQoY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQsIChjb21tYW5kIGFzIERlYnVnQ29tbWFuZCk/LnNlbGVjdG9yLCB2b2lkIDApO1xuXG4gICAgICAgICAgICB0aGlzLmRlYnVnZ2luZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyh7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS5kZWJ1Z0luSGVhZGxlc3NFcnJvciwgYWN0aW9uSWQ6IGNvbW1hbmQuYWN0aW9uSWQgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnVzZVJvbGUpIHtcbiAgICAgICAgICAgIGxldCBmbiA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMuX3VzZVJvbGUoKGNvbW1hbmQgYXMgYW55KS5yb2xlLCBjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG5cbiAgICAgICAgICAgIGZuID0gdGhpcy5kZWNvcmF0ZVByZXZlbnRFbWl0QWN0aW9uRXZlbnRzKGZuLCB7IHByZXZlbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICBmbiA9IHRoaXMuZGVjb3JhdGVEaXNhYmxlRGVidWdCcmVha3BvaW50cyhmbiwgeyBkaXNhYmxlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5ydW5DdXN0b21BY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm4sIGFyZ3MgfSA9IGNvbW1hbmQgYXMgUnVuQ3VzdG9tQWN0aW9uQ29tbWFuZDtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRGbiAgICA9IHdyYXBDdXN0b21BY3Rpb24oZm4pO1xuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgd3JhcHBlZEZuKHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnJlcG9ydClcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcG9ydERhdGFMb2cuYWRkRGF0YShjb21tYW5kLmFyZ3MgYXMgYW55W10pO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5hc3NlcnRpb24pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhlY3V0ZUFzc2VydGlvbihjb21tYW5kIGFzIEFzc2VydGlvbkNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZXhlY3V0ZUV4cHJlc3Npb24pXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZXhlY3V0ZUpzRXhwcmVzc2lvbihjb21tYW5kIGFzIEV4ZWN1dGVFeHByZXNzaW9uQ29tbWFuZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmV4ZWN1dGVBc3luY0V4cHJlc3Npb24pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uKGNvbW1hbmQgYXMgRXhlY3V0ZUFzeW5jRXhwcmVzc2lvbkNvbW1hbmQsIGNhbGxzaXRlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmdldEJyb3dzZXJDb25zb2xlTWVzc2FnZXMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZUJyb3dzZXJDb25zb2xlTWVzc2FnZXNDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc3dpdGNoVG9QcmV2aW91c1dpbmRvdylcbiAgICAgICAgICAgIChjb21tYW5kIGFzIGFueSkud2luZG93SWQgPSB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnByZXZpb3VzQWN0aXZlV2luZG93SWQ7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZShjb21tYW5kIGFzIFN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGVDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZ2V0Q29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlR2V0Q29va2llcyhjb21tYW5kIGFzIEdldENvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc2V0Q29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlU2V0Q29va2llcyhjb21tYW5kIGFzIFNldENvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGVsZXRlQ29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlRGVsZXRlQ29va2llcyhjb21tYW5kIGFzIERlbGV0ZUNvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuYWRkUmVxdWVzdEhvb2tzKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKChjb21tYW5kIGFzIEFkZFJlcXVlc3RIb29rc0NvbW1hbmQpLmhvb2tzLm1hcChob29rID0+IHRoaXMuX2FkZFJlcXVlc3RIb29rKGhvb2spKSk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnJlbW92ZVJlcXVlc3RIb29rcylcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbCgoY29tbWFuZCBhcyBSZW1vdmVSZXF1ZXN0SG9va3NDb21tYW5kKS5ob29rcy5tYXAoaG9vayA9PiB0aGlzLl9yZW1vdmVSZXF1ZXN0SG9vayhob29rKSkpO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5nZXRDdXJyZW50Q0RQU2Vzc2lvbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRDRFBTZXNzaW9uKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VucXVldWVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWplY3RDb21tYW5kV2l0aFBhZ2VFcnJvciAoY2FsbHNpdGU/OiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8RXJyb3I+IHtcbiAgICAgICAgY29uc3QgZXJyID0gdGhpcy5wZW5kaW5nUGFnZUVycm9yO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXJyLmNhbGxzaXRlICAgICAgICAgID0gY2FsbHNpdGU7XG4gICAgICAgIHRoaXMucGVuZGluZ1BhZ2VFcnJvciA9IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2VuZENsb3NlQ2hpbGRXaW5kb3dPbkZpbGVEb3dubG9hZGluZ0NvbW1hbmQgKCk6IENvbW1hbmRCYXNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhY3Rpb25Db21tYW5kcy5DbG9zZUNoaWxkV2luZG93T25GaWxlRG93bmxvYWRpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX21ha2VTY3JlZW5zaG90T25GYWlsIChmYWlsZWRBY3Rpb25JZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHNjcmVlbnNob3RzIH0gPSB0aGlzLm9wdHMgYXMgeyBzY3JlZW5zaG90czogU2NyZWVuc2hvdE9wdGlvblZhbHVlIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLmVyclNjcmVlbnNob3RQYXRoICYmIHNjcmVlbnNob3RzPy50YWtlT25GYWlscylcbiAgICAgICAgICAgIHRoaXMuZXJyU2NyZWVuc2hvdFBhdGggPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBicm93c2VyTWFuaXB1bGF0aW9uQ29tbWFuZHMuVGFrZVNjcmVlbnNob3RPbkZhaWxDb21tYW5kKHsgZmFpbGVkQWN0aW9uSWQsIGZ1bGxQYWdlOiBzY3JlZW5zaG90cy5mdWxsUGFnZSB9KSkgYXMgc3RyaW5nO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RlY29yYXRlV2l0aEZsYWcgKGZuOiBGdW5jdGlvbiwgZmxhZ05hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXNbZmxhZ05hbWVdID0gdmFsdWU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpc1tmbGFnTmFtZV0gPSAhdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29yYXRlUHJldmVudEVtaXRBY3Rpb25FdmVudHMgKGZuOiBGdW5jdGlvbiwgeyBwcmV2ZW50IH06IHsgcHJldmVudDogYm9vbGVhbiB9KTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNvcmF0ZVdpdGhGbGFnKGZuLCAncHJldmVudEVtaXRBY3Rpb25FdmVudHMnLCBwcmV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjb3JhdGVEaXNhYmxlRGVidWdCcmVha3BvaW50cyAoZm46IEZ1bmN0aW9uLCB7IGRpc2FibGUgfTogeyBkaXNhYmxlOiBib29sZWFuIH0pOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29yYXRlV2l0aEZsYWcoZm4sICdkaXNhYmxlRGVidWdCcmVha3BvaW50cycsIGRpc2FibGUpO1xuICAgIH1cblxuICAgIC8vIFJvbGUgbWFuYWdlbWVudFxuICAgIHB1YmxpYyBhc3luYyBnZXRTdGF0ZVNuYXBzaG90ICgpOiBQcm9taXNlPFN0YXRlU25hcHNob3Q+IHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLl9yb2xlUHJvdmlkZXIuZ2V0U3RhdGVTbmFwc2hvdCgpO1xuXG4gICAgICAgIHN0YXRlLnN0b3JhZ2VzID0gYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLkJhY2t1cFN0b3JhZ2VzQ29tbWFuZCgpKSBhcyBTdG9yYWdlc1NuYXBzaG90O1xuXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9jbGVhblVwQ3R4cyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY3R4ICAgICAgICA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuZml4dHVyZUN0eCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMudGVzdFJ1bkN0eCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN3aXRjaFRvQ2xlYW5SdW4gKHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2NsZWFuVXBDdHhzKCk7XG5cbiAgICAgICAgdGhpcy5jb25zb2xlTWVzc2FnZXMgPSBuZXcgQnJvd3NlckNvbnNvbGVNZXNzYWdlcygpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX3JvbGVQcm92aWRlci51c2VTdGF0ZVNuYXBzaG90KFN0YXRlU25hcHNob3QuZW1wdHkoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc3BlZWQgIT09IHRoaXMub3B0cy5zcGVlZCkge1xuICAgICAgICAgICAgY29uc3Qgc2V0U3BlZWRDb21tYW5kID0gbmV3IGFjdGlvbkNvbW1hbmRzLlNldFRlc3RTcGVlZENvbW1hbmQoeyBzcGVlZDogdGhpcy5vcHRzLnNwZWVkIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKHNldFNwZWVkQ29tbWFuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYWdlTG9hZFRpbWVvdXQgIT09IHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNldFBhZ2VMb2FkVGltZW91dENvbW1hbmQgPSBuZXcgYWN0aW9uQ29tbWFuZHMuU2V0UGFnZUxvYWRUaW1lb3V0Q29tbWFuZCh7IGR1cmF0aW9uOiB0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0IH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKHNldFBhZ2VMb2FkVGltZW91dENvbW1hbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvVXJsKHVybCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRGlhbG9nSGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlRGlhbG9nSGFuZGxlckNvbW1hbmQgPSBuZXcgYWN0aW9uQ29tbWFuZHMuU2V0TmF0aXZlRGlhbG9nSGFuZGxlckNvbW1hbmQoeyBkaWFsb2dIYW5kbGVyOiB7IGZuOiBudWxsIH0gfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQocmVtb3ZlRGlhbG9nSGFuZGxlckNvbW1hbmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG5hdmlnYXRlVG9VcmwgKHVybDogc3RyaW5nLCBmb3JjZVJlbG9hZDogYm9vbGVhbiwgc3RhdGVTbmFwc2hvdD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBuYXZpZ2F0ZUNvbW1hbmQgPSBuZXcgYWN0aW9uQ29tbWFuZHMuTmF2aWdhdGVUb0NvbW1hbmQoeyB1cmwsIGZvcmNlUmVsb2FkLCBzdGF0ZVNuYXBzaG90IH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmF2aWdhdGVDb21tYW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRTdGF0ZVNuYXBzaG90RnJvbVJvbGUgKHJvbGU6IFJvbGUpOiBQcm9taXNlPFN0YXRlU25hcHNob3Q+IHtcbiAgICAgICAgY29uc3QgcHJldlBoYXNlID0gdGhpcy5waGFzZTtcblxuICAgICAgICBpZiAocm9sZS5waGFzZSA9PT0gUk9MRV9QSEFTRS5pbml0aWFsaXplZCAmJiByb2xlLmluaXRFcnIgaW5zdGFuY2VvZiBUZXN0Q2FmZUVycm9yTGlzdCAmJiByb2xlLmluaXRFcnIuaGFzRXJyb3JzKVxuICAgICAgICAgICAgcm9sZS5pbml0RXJyLmFkYXB0ZXIgPSB0aGlzLl9jcmVhdGVFcnJvckFkYXB0ZXIocm9sZS5pbml0RXJyLml0ZW1zWzBdKTtcblxuICAgICAgICB0aGlzLnBoYXNlID0gVGVzdFJ1blBoYXNlLmluUm9sZUluaXRpYWxpemVyO1xuXG4gICAgICAgIGlmIChyb2xlLnBoYXNlID09PSBST0xFX1BIQVNFLnVuaW5pdGlhbGl6ZWQpXG4gICAgICAgICAgICBhd2FpdCByb2xlLmluaXRpYWxpemUodGhpcyk7XG5cbiAgICAgICAgZWxzZSBpZiAocm9sZS5waGFzZSA9PT0gUk9MRV9QSEFTRS5wZW5kaW5nSW5pdGlhbGl6YXRpb24pXG4gICAgICAgICAgICBhd2FpdCBwcm9taXNpZnlFdmVudChyb2xlLCAnaW5pdGlhbGl6ZWQnKTtcblxuICAgICAgICBpZiAocm9sZS5pbml0RXJyKVxuICAgICAgICAgICAgdGhyb3cgcm9sZS5pbml0RXJyO1xuXG4gICAgICAgIHRoaXMucGhhc2UgPSBwcmV2UGhhc2U7XG5cbiAgICAgICAgcmV0dXJuIHJvbGUuc3RhdGVTbmFwc2hvdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF91c2VSb2xlIChyb2xlOiBSb2xlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucGhhc2UgPT09IFRlc3RSdW5QaGFzZS5pblJvbGVJbml0aWFsaXplcilcbiAgICAgICAgICAgIHRocm93IG5ldyBSb2xlU3dpdGNoSW5Sb2xlSW5pdGlhbGl6ZXJFcnJvcihjYWxsc2l0ZSk7XG5cbiAgICAgICAgY29uc3QgYm9va21hcmsgPSBuZXcgVGVzdFJ1bkJvb2ttYXJrKHRoaXMsIHJvbGUpO1xuXG4gICAgICAgIGF3YWl0IGJvb2ttYXJrLmluaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Um9sZUlkKVxuICAgICAgICAgICAgdGhpcy51c2VkUm9sZVN0YXRlc1t0aGlzLmN1cnJlbnRSb2xlSWRdID0gYXdhaXQgdGhpcy5nZXRTdGF0ZVNuYXBzaG90KCk7XG5cbiAgICAgICAgY29uc3Qgc3RhdGVTbmFwc2hvdCA9IHRoaXMudXNlZFJvbGVTdGF0ZXNbcm9sZS5pZF0gfHwgYXdhaXQgdGhpcy5fZ2V0U3RhdGVTbmFwc2hvdEZyb21Sb2xlKHJvbGUpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX3JvbGVQcm92aWRlci51c2VTdGF0ZVNuYXBzaG90KHN0YXRlU25hcHNob3QpO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFJvbGVJZCA9IHJvbGUuaWQ7XG5cbiAgICAgICAgYXdhaXQgYm9va21hcmsucmVzdG9yZShjYWxsc2l0ZSwgc3RhdGVTbmFwc2hvdCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEN1cnJlbnRVcmwgKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2xpZW50RnVuY3Rpb25CdWlsZGVyKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgICAgICB9LCB7IGJvdW5kVGVzdFJ1bjogdGhpcyB9KTtcblxuICAgICAgICBjb25zdCBnZXRMb2NhdGlvbiA9IGJ1aWxkZXIuZ2V0RnVuY3Rpb24oKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0TG9jYXRpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9zd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlIChjb21tYW5kOiBTd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjdXJyZW50V2luZG93cyA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IEdldEN1cnJlbnRXaW5kb3dzQ29tbWFuZCh7fSwgdGhpcykgYXMgQ29tbWFuZEJhc2UpIGFzIE9wZW5lZFdpbmRvd0luZm9ybWF0aW9uW107XG5cbiAgICAgICAgY29uc3Qgd2luZG93cyA9IGF3YWl0IGFzeW5jRmlsdGVyPE9wZW5lZFdpbmRvd0luZm9ybWF0aW9uPihjdXJyZW50V2luZG93cywgYXN5bmMgd25kID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZGljYXRlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAgIG5ldyBVUkwod25kLnVybCksXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB3bmQudGl0bGUsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kLmNoZWNrV2luZG93KHByZWRpY2F0ZURhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTd2l0Y2hUb1dpbmRvd1ByZWRpY2F0ZUVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghd2luZG93cy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgV2luZG93Tm90Rm91bmRFcnJvcigpO1xuXG4gICAgICAgIGlmICh3aW5kb3dzLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyh7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS5tdWx0aXBsZVdpbmRvd3NGb3VuZEJ5UHJlZGljYXRlLCBhY3Rpb25JZDogY29tbWFuZC5hY3Rpb25JZCB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBTd2l0Y2hUb1dpbmRvd0NvbW1hbmQoeyB3aW5kb3dJZDogd2luZG93c1swXS5pZCB9LCB0aGlzKSBhcyBDb21tYW5kQmFzZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGlzY29ubmVjdCAoZXJyOiBFcnJvcik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERyaXZlclRhc2spXG4gICAgICAgICAgICB0aGlzLl9yZWplY3RDdXJyZW50RHJpdmVyVGFzayhlcnIpO1xuXG4gICAgICAgIHRoaXMuZW1pdCgnZGlzY29ubmVjdGVkJywgZXJyKTtcblxuICAgICAgICB0ZXN0UnVuVHJhY2tlci5yZW1vdmVBY3RpdmVUZXN0UnVuKHRoaXMuc2Vzc2lvbi5pZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlRmlsZURvd25sb2FkaW5nSW5OZXdXaW5kb3dSZXF1ZXN0ICgpOiBDb21tYW5kQmFzZSB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5hdHRhY2htZW50RG93bmxvYWRpbmdIYW5kbGVkKSB7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaG1lbnREb3dubG9hZGluZ0hhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbmRDbG9zZUNoaWxkV2luZG93T25GaWxlRG93bmxvYWRpbmdDb21tYW5kKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFjdGlvbkV2ZW50IChldmVudE5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICghdGhpcy5wcmV2ZW50RW1pdEFjdGlvbkV2ZW50cylcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdChldmVudE5hbWUsIGFyZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNNdWx0aXBsZVdpbmRvd3NBbGxvd2VkICh0ZXN0UnVuOiBUZXN0UnVuKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgZGlzYWJsZU11bHRpcGxlV2luZG93cywgdGVzdCB9ID0gdGVzdFJ1bjtcblxuICAgICAgICByZXR1cm4gIWRpc2FibGVNdWx0aXBsZVdpbmRvd3MgJiYgISh0ZXN0IGFzIExlZ2FjeVRlc3RSdW4pLmlzTGVnYWN5ICYmICEhdGVzdFJ1bi5hY3RpdmVXaW5kb3dJZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2NsZWFyQ29va2llc0FuZFN0b3JhZ2VzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX2luaXRSZXF1ZXN0SG9va3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9jbGVhckNvb2tpZXNBbmRTdG9yYWdlcyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVQYWdlUmVsb2FkcylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvb2tpZVByb3ZpZGVyLmluaXRpYWxpemUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RvcmFnZXNQcm92aWRlci5pbml0aWFsaXplKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3RpdmVXaW5kb3dJZCAoKTogbnVsbCB8IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkO1xuICAgIH1cblxuICAgIC8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgdGltZS1jcml0aWNhbCBhbmQgbXVzdCByZXR1cm4gQVNBUCB0byBhdm9pZCBjbGllbnQgZGlzY29ubmVjdGlvblxuICAgIHByaXZhdGUgYXN5bmMgW0NMSUVOVF9NRVNTQUdFUy5yZWFkeV0gKG1zZzogRHJpdmVyTWVzc2FnZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBpZiAobXNnLnN0YXR1cy5pc09ic2VydmluZ0ZpbGVEb3dubG9hZGluZ0luTmV3V2luZG93KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUZpbGVEb3dubG9hZGluZ0luTmV3V2luZG93UmVxdWVzdCgpO1xuXG4gICAgICAgIHRoaXMuZGVidWdMb2cuZHJpdmVyTWVzc2FnZShtc2cpO1xuXG4gICAgICAgIGlmICh0aGlzLmRpc2Nvbm5lY3RlZClcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLnRlc3RSdW5SZXF1ZXN0SW5EaXNjb25uZWN0ZWRCcm93c2VyLCB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmJyb3dzZXJJbmZvLmFsaWFzKSk7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0ZWQnKTtcblxuICAgICAgICB0aGlzLl9jbGVhclBlbmRpbmdSZXF1ZXN0KCk7XG5cbiAgICAgICAgLy8gTk9URTogdGhlIGRyaXZlciBzZW5kcyB0aGUgc3RhdHVzIGZvciB0aGUgc2Vjb25kIHRpbWUgaWYgaXQgZGlkbid0IGdldCBhIHJlc3BvbnNlIGF0IHRoZVxuICAgICAgICAvLyBmaXJzdCB0cnkuIFRoaXMgaXMgcG9zc2libGUgd2hlbiB0aGUgcGFnZSB3YXMgdW5sb2FkZWQgYWZ0ZXIgdGhlIGRyaXZlciBzZW50IHRoZSBzdGF0dXMuXG4gICAgICAgIGlmIChtc2cuc3RhdHVzLmlkID09PSB0aGlzLmxhc3REcml2ZXJTdGF0dXNJZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhc3REcml2ZXJTdGF0dXNSZXNwb25zZTtcblxuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNJZCAgICAgICA9IG1zZy5zdGF0dXMuaWQ7XG4gICAgICAgIHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5faGFuZGxlRHJpdmVyUmVxdWVzdChtc2cuc3RhdHVzKTtcblxuICAgICAgICBpZiAodGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2UgfHwgbXNnLnN0YXR1cy5pc1BlbmRpbmdXaW5kb3dTd2l0Y2hpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2U7XG5cbiAgICAgICAgLy8gTk9URTogd2Ugc2VuZCBhbiBlbXB0eSByZXNwb25zZSBhZnRlciB0aGUgTUFYX1JFU1BPTlNFX0RFTEFZIHRpbWVvdXQgaXMgZXhjZWVkZWQgdG8ga2VlcCBjb25uZWN0aW9uXG4gICAgICAgIC8vIHdpdGggdGhlIGNsaWVudCBhbmQgcHJldmVudCB0aGUgcmVzcG9uc2UgdGltZW91dCBleGNlcHRpb24gb24gdGhlIGNsaWVudCBzaWRlXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fcmVzb2x2ZVBlbmRpbmdSZXF1ZXN0KG51bGwpLCBNQVhfUkVTUE9OU0VfREVMQVkpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0ID0geyByZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlVGltZW91dCB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIFtDTElFTlRfTUVTU0FHRVMucmVhZHlGb3JCcm93c2VyTWFuaXB1bGF0aW9uXSAobXNnOiBEcml2ZXJNZXNzYWdlKTogUHJvbWlzZTxCcm93c2VyTWFuaXB1bGF0aW9uUmVzdWx0PiB7XG4gICAgICAgIHRoaXMuZGVidWdMb2cuZHJpdmVyTWVzc2FnZShtc2cpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBsZXQgZXJyb3IgID0gbnVsbDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5icm93c2VyTWFuaXB1bGF0aW9uUXVldWUuZXhlY3V0ZVBlbmRpbmdNYW5pcHVsYXRpb24obXNnLCB0aGlzLl9tZXNzYWdlQnVzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogICAgICAgICAgICBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogICAgICAgICBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhY2s6ICAgICAgICAgICBlcnIuc3RhY2ssXG4gICAgICAgICAgICAgICAgICAgIGlzSW50ZXJuYWxFcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0LCBlcnJvciB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgW0NMSUVOVF9NRVNTQUdFUy53YWl0Rm9yRmlsZURvd25sb2FkXSAobXNnOiBEcml2ZXJNZXNzYWdlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMuZGVidWdMb2cuZHJpdmVyTWVzc2FnZShtc2cpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbGVEb3dubG9hZGluZ0hhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVEb3dubG9hZGluZ0hhbmRsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19