@bitgo/sdk-api 1.43.4 → 1.43.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -69,7 +69,7 @@ exports.createTransaction = function (params) {
69
69
  }
70
70
  const bitgo = params.wallet.bitgo;
71
71
  const constants = bitgo.getConstants();
72
- const network = sdk_core_1.getNetwork(sdk_core_1.common.Environments[bitgo.getEnv()].network);
72
+ const network = (0, sdk_core_1.getNetwork)(sdk_core_1.common.Environments[bitgo.getEnv()].network);
73
73
  // The user can specify a seperate, single-key wallet for the purposes of paying miner's fees
74
74
  // When creating a transaction this can be specified as an input address or the private key in WIF
75
75
  let feeSingleKeySourceAddress;
@@ -85,7 +85,7 @@ exports.createTransaction = function (params) {
85
85
  }
86
86
  if (params.feeSingleKeyWIF) {
87
87
  const feeSingleKey = utxolib.ECPair.fromWIF(params.feeSingleKeyWIF, network);
88
- feeSingleKeySourceAddress = sdk_core_1.getAddressP2PKH(feeSingleKey);
88
+ feeSingleKeySourceAddress = (0, sdk_core_1.getAddressP2PKH)(feeSingleKey);
89
89
  // If the user specifies both, check to make sure the feeSingleKeySourceAddress corresponds to the address of feeSingleKeyWIF
90
90
  if (params.feeSingleKeySourceAddress && params.feeSingleKeySourceAddress !== feeSingleKeySourceAddress) {
91
91
  throw new Error('feeSingleKeySourceAddress: ' +
@@ -780,7 +780,7 @@ exports.signTransaction = function (params) {
780
780
  if (!_.isBoolean(validate)) {
781
781
  throw new Error('expecting validate to be a boolean');
782
782
  }
783
- let network = sdk_core_1.getNetwork();
783
+ let network = (0, sdk_core_1.getNetwork)();
784
784
  const enableBCH = _.isBoolean(params.forceBCH) && params.forceBCH === true;
785
785
  if (!_.isObject(keychain) || !_.isString(keychain.xprv)) {
786
786
  if (_.isString(params.signingKey)) {
@@ -837,7 +837,7 @@ exports.signTransaction = function (params) {
837
837
  const chainPath = currentUnspent.chainPath;
838
838
  if (rootExtKey) {
839
839
  const { walletSubPath = '/0/0' } = keychain;
840
- const path = sdk_core_1.sanitizeLegacyPath(keychain.path + walletSubPath + chainPath);
840
+ const path = (0, sdk_core_1.sanitizeLegacyPath)(keychain.path + walletSubPath + chainPath);
841
841
  debug('derived user key path "%s" using keychain path "%s", walletSubPath "%s", keychain walletSubPath "%s" and chainPath "%s"', path, keychain.path, walletSubPath, keychain.walletSubPath, chainPath);
842
842
  privKey = rootExtKey.derivePath(path);
843
843
  }
@@ -859,7 +859,7 @@ exports.signTransaction = function (params) {
859
859
  // try fallback derivation path (see BG-46497)
860
860
  let fallbackSigningSuccessful = false;
861
861
  try {
862
- const fallbackPath = sdk_core_1.sanitizeLegacyPath(keychain.path + chainPath);
862
+ const fallbackPath = (0, sdk_core_1.sanitizeLegacyPath)(keychain.path + chainPath);
863
863
  debug('derived fallback user key path "%s" using keychain path "%s" and chainPath "%s"', fallbackPath, keychain.path, chainPath);
864
864
  privKey = rootExtKey.derivePath(fallbackPath);
865
865
  const witnessScript = currentUnspent.witnessScript
@@ -901,4 +901,4 @@ exports.signTransaction = function (params) {
901
901
  transactionHex: partialTransaction.toHex(),
902
902
  });
903
903
  };
904
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7O0FBRUg7R0FDRztBQUNILEVBQUU7QUFDRixxQkFBcUI7QUFDckIsa0RBQWtEO0FBQ2xELEVBQUU7QUFDRixvREFBb0Q7QUFDcEQsRUFBRTtBQUVGLDhDQUF3QztBQUN4QyxxQ0FBcUM7QUFDckMsMkNBQTJDO0FBQzNDLDRCQUE0QjtBQUM1Qiw4Q0FBK0M7QUFDL0Msa0NBQW1DO0FBQ25DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN2Qyw4Q0FBMEY7QUF1QjFGLEVBQUU7QUFDRixxQkFBcUI7QUFDckIsV0FBVztBQUNYLDBDQUEwQztBQUMxQyw4TUFBOE07QUFDOU0sc0dBQXNHO0FBQ3RHLGtJQUFrSTtBQUNsSSw2SEFBNkg7QUFDN0gsdUdBQXVHO0FBQ3ZHLCtFQUErRTtBQUMvRSxxRUFBcUU7QUFDckUsNkVBQTZFO0FBQzdFLHdHQUF3RztBQUN4RyxpSUFBaUk7QUFDakksd0lBQXdJO0FBQ3hJLDRJQUE0STtBQUM1SSx1RUFBdUU7QUFDdkUsMkVBQTJFO0FBQzNFLDRGQUE0RjtBQUM1RixPQUFPLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxNQUFNO0lBQzFDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDeEUsSUFBSSxVQUFVLEdBQTZFLEVBQUUsQ0FBQztJQUM5RixJQUFJLFNBQVMsR0FBMEMsRUFBRSxDQUFDO0lBQzFELElBQUksa0JBQWtCLEdBQWEsRUFBRSxDQUFDO0lBQ3RDLElB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QUFDLENBQUM7YUFDMUQ7WUFDRCxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxjQUFjLEdBQUcsQ0FBQyxFQUFFO2dCQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7YUFDakY7UUFDSCxDQUFDLENBQUMsQ0FBQztLQUNKO0lBRUQsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3RCLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7S0FDM0MsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAaGlkZGVuXG4gKi9cblxuLyoqXG4gKi9cbi8vXG4vLyBUcmFuc2FjdGlvbkJ1aWxkZXJcbi8vIEEgdXRpbGl0eSBmb3IgYnVpbGRpbmcgYW5kIHNpZ25pbmcgdHJhbnNhY3Rpb25zXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQsIEJpdEdvLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cblxuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgQmx1ZWJpcmQgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgVmlydHVhbFNpemVzIH0gZnJvbSAnQGJpdGdvL3Vuc3BlbnRzJztcbmltcG9ydCBkZWJ1Z0xpYiA9IHJlcXVpcmUoJ2RlYnVnJyk7XG5jb25zdCBkZWJ1ZyA9IGRlYnVnTGliKCdiaXRnbzp2MTp0eGInKTtcbmltcG9ydCB7IGNvbW1vbiwgZ2V0QWRkcmVzc1AyUEtILCBnZXROZXR3b3JrLCBzYW5pdGl6ZUxlZ2FjeVBhdGggfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbnRlcmZhY2UgQmFzZU91dHB1dCB7XG4gIGFtb3VudDogbnVtYmVyO1xuICB0cmF2ZWxJbmZvPzogYW55O1xufVxuXG5pbnRlcmZhY2UgQWRkcmVzc091dHB1dCBleHRlbmRzIEJhc2VPdXRwdXQge1xuICBhZGRyZXNzOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTY3JpcHRPdXRwdXQgZXh0ZW5kcyBCYXNlT3V0cHV0IHtcbiAgc2NyaXB0OiBCdWZmZXI7XG59XG5cbnR5cGUgT3V0cHV0ID0gQWRkcmVzc091dHB1dCB8IFNjcmlwdE91dHB1dDtcblxuaW50ZXJmYWNlIEJpdEdvVW5zcGVudCB7XG4gIHZhbHVlOiBudW1iZXI7XG4gIHR4X2hhc2g6IEJ1ZmZlcjtcbiAgdHhfb3V0cHV0X246IG51bWJlcjtcbn1cblxuLy9cbi8vIFRyYW5zYWN0aW9uQnVpbGRlclxuLy8gQHBhcmFtczpcbi8vICAgd2FsbGV0OiAgYSB3YWxsZXQgb2JqZWN0IHRvIHNlbmQgZnJvbVxuLy8gICByZWNpcGllbnRzOiBhcnJheSBvZiByZWNpcGllbnQgb2JqZWN0cyBhbmQgdGhlIGFtb3VudCB0byBzZW5kIHRvIGVhY2ggZS5nLiBbe2FkZHJlc3M6ICczOEJLRE5aYlBjTG9ndlZiY3gyZWtKOUU2VnY5NERxRHF3JywgYW1vdW50OiAxNTAwfSwge2FkZHJlc3M6ICczNmVMOHlRcUNuMUhNUm1WRkZvNDl0MlBKM3BhaTh3UWFtJywgYW1vdW50OiAyMDAwfV1cbi8vICAgZmVlOiB0aGUgZmVlIHRvIHVzZSB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uICBpZiBub3QgcHJvdmlkZWQsIGEgZGVmYXVsdCwgbWluaW11bSBmZWUgd2lsbCBiZSB1c2VkLlxuLy8gICBmZWVSYXRlOiB0aGUgYW1vdW50IG9mIGZlZSBwZXIga2lsb2J5dGUgLSBvcHRpb25hbCAtIHNwZWNpZnkgZWl0aGVyIGZlZSwgZmVlUmF0ZSwgb3IgZmVlVHhDb25maXJtVGFyZ2V0IGJ1dCBub3QgbW9yZSB0aGFuIG9uZVxuLy8gICBmZWVUeENvbmZpcm1UYXJnZXQ6IGNhbGN1bGF0ZSB0aGUgZmVlcyBwZXIga2lsb2J5dGUgc3VjaCB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIGNvbmZpcm1lZCBpbiB0aGlzIG51bWJlciBvZiBibG9ja3Ncbi8vICAgbWF4RmVlUmF0ZTogVGhlIG1heGltdW0gZmVlIHBlciBrYiB0byB1c2UgaW4gc2F0b3NoaXMsIGZvciBzYWZldHkgcHVycG9zZXMgd2hlbiB1c2luZyBkeW5hbWljIGZlZXNcbi8vICAgbWluQ29uZmlybXM6IHRoZSBtaW5pbXVtIGNvbmZpcm1hdGlvbnMgYW4gb3V0cHV0IG11c3QgaGF2ZSBiZWZvcmUgc3BlbmRpbmdcbi8vICAgZm9yY2VDaGFuZ2VBdEVuZDogZm9yY2UgdGhlIGNoYW5nZSBhZGRyZXNzIHRvIGJlIHRoZSBsYXN0IG91dHB1dFxuLy8gICBjaGFuZ2VBZGRyZXNzOiBzcGVjaWZ5IHRoZSBjaGFuZ2UgYWRkcmVzcyByYXRoZXIgdGhhbiBnZW5lcmF0ZSBhIG5ldyBvbmVcbi8vICAgbm9TcGxpdENoYW5nZTogc2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4vLyAgIHRhcmdldFdhbGxldFVuc3BlbnRzOiBzcGVjaWZ5IGEgbnVtYmVyIG9mIHRhcmdldCB1bnNwZW50cyB0byBtYWludGFpbiBpbiB0aGUgd2FsbGV0IChjdXJyZW50bHkgZGVmYXVsdGVkIHRvIDggYnkgdGhlIHNlcnZlcilcbi8vICAgdmFsaWRhdGU6IGV4dHJhIHZlcmlmaWNhdGlvbiBvZiB0aGUgY2hhbmdlIGFkZHJlc3Nlcywgd2hpY2ggaXMgYWx3YXlzIGRvbmUgc2VydmVyLXNpZGUgYW5kIGlzIHJlZHVuZGFudCBjbGllbnQtc2lkZSAoZGVmYXVsdHMgdHJ1ZSlcbi8vICAgbWluVW5zcGVudFNpemU6IFRoZSBtaW5pbXVtIHNpemUgaW4gc2F0b3NoaXMgb2YgdW5zcGVudCB0byB1c2UgKHRvIHByZXZlbnQgc3BlbmRpbmcgdW5zcGVudHMgd29ydGggbGVzcyB0aGFuIGZlZSBhZGRlZCkuIERlZmF1bHRzIHRvIDAuXG4vLyAgIGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3M6IFVzZSB0aGlzIHNpbmdsZSBrZXkgYWRkcmVzcyB0byBwYXkgZmVlc1xuLy8gICBmZWVTaW5nbGVLZXlXSUY6IFVzZSB0aGUgYWRkcmVzcyBiYXNlZCBvbiB0aGlzIHByaXZhdGUga2V5IHRvIHBheSBmZWVzXG4vLyAgIHVuc3BlbnRzRmV0Y2hQYXJhbXM6IEV4dHJhIHBhcmFtZXRlcnMgdG8gdXNlIGZvciBmZXRjaGluZyB1bnNwZW50cyBmb3IgdGhpcyB0cmFuc2FjdGlvblxuZXhwb3J0cy5jcmVhdGVUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgY29uc3QgbWluQ29uZmlybXMgPSBwYXJhbXMubWluQ29uZmlybXMgfHwgMDtcbiAgY29uc3QgdmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMudmFsaWRhdGU7XG4gIGxldCByZWNpcGllbnRzOiB7IGFkZHJlc3M6IHN0cmluZzsgYW1vdW50OiBudW1iZXI7IHNjcmlwdD86IHN0cmluZzsgdHJhdmVsSW5mbz86IGFueSB9W10gPSBbXTtcbiAgbGV0IG9wUmV0dXJuczogeyBtZXNzYWdlOiBzdHJpbmc7IGFtb3VudDogbnVtYmVyIH1bXSA9IFtdO1xuICBsZXQgZXh0cmFDaGFuZ2VBbW91bnRzOiBudW1iZXJbXSA9IFtdO1xuICBsZXQgZXN0VHhTaXplOiBudW1iZXI7XG4gIGxldCB0cmF2ZWxJbmZvcztcblxuICAvLyBTYW5pdHkgY2hlY2sgdGhlIGFyZ3VtZW50cyBwYXNzZWQgaW5cbiAgaWYgKFxuICAgICFfLmlzT2JqZWN0KHBhcmFtcy53YWxsZXQpIHx8XG4gICAgKHBhcmFtcy5mZWUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZSkpIHx8XG4gICAgKHBhcmFtcy5mZWVSYXRlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWVSYXRlKSkgfHxcbiAgICAhXy5pc0ludGVnZXIobWluQ29uZmlybXMpIHx8XG4gICAgKHBhcmFtcy5mb3JjZUNoYW5nZUF0RW5kICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCkpIHx8XG4gICAgKHBhcmFtcy5jaGFuZ2VBZGRyZXNzICYmICFfLmlzU3RyaW5nKHBhcmFtcy5jaGFuZ2VBZGRyZXNzKSkgfHxcbiAgICAocGFyYW1zLm5vU3BsaXRDaGFuZ2UgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5ub1NwbGl0Q2hhbmdlKSkgfHxcbiAgICAocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzICYmICFfLmlzSW50ZWdlcihwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMpKSB8fFxuICAgICh2YWxpZGF0ZSAmJiAhXy5pc0Jvb2xlYW4odmFsaWRhdGUpKSB8fFxuICAgIChwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlKSkgfHxcbiAgICAocGFyYW1zLm1pblVuc3BlbnRTaXplICYmICFfLmlzTnVtYmVyKHBhcmFtcy5taW5VbnNwZW50U2l6ZSkpIHx8XG4gICAgKHBhcmFtcy5tYXhGZWVSYXRlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5tYXhGZWVSYXRlKSkgfHxcbiAgICAvLyB0aGlzIHNob3VsZCBiZSBhbiBhcnJheSBhbmQgaXRzIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0IDFcbiAgICAocGFyYW1zLnVuc3BlbnRzICYmICghQXJyYXkuaXNBcnJheShwYXJhbXMudW5zcGVudHMpIHx8IHBhcmFtcy51bnNwZW50cy5sZW5ndGggPCAxKSkgfHxcbiAgICAocGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAmJiAhXy5pc0ludGVnZXIocGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCkpIHx8XG4gICAgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHx8XG4gICAgKHBhcmFtcy5iaXRnb0ZlZSAmJiAhXy5pc09iamVjdChwYXJhbXMuYml0Z29GZWUpKSB8fFxuICAgIChwYXJhbXMudW5zcGVudHNGZXRjaFBhcmFtcyAmJiAhXy5pc09iamVjdChwYXJhbXMudW5zcGVudHNGZXRjaFBhcmFtcykpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICB9XG5cbiAgY29uc3QgYml0Z28gPSBwYXJhbXMud2FsbGV0LmJpdGdvO1xuICBjb25zdCBjb25zdGFudHMgPSBiaXRnby5nZXRDb25zdGFudHMoKTtcbiAgY29uc3QgbmV0d29yayA9IGdldE5ldHdvcmsoY29tbW9uLkVudmlyb25tZW50c1tiaXRnby5nZXRFbnYoKV0ubmV0d29yayk7XG5cbiAgLy8gVGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBzZXBlcmF0ZSwgc2luZ2xlLWtleSB3YWxsZXQgZm9yIHRoZSBwdXJwb3NlcyBvZiBwYXlpbmcgbWluZXIncyBmZWVzXG4gIC8vIFdoZW4gY3JlYXRpbmcgYSB0cmFuc2FjdGlvbiB0aGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4gaW5wdXQgYWRkcmVzcyBvciB0aGUgcHJpdmF0ZSBrZXkgaW4gV0lGXG4gIGxldCBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzO1xuICBsZXQgZmVlU2luZ2xlS2V5SW5wdXRBbW91bnQgPSAwO1xuICBpZiAocGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MpIHtcbiAgICB0cnkge1xuICAgICAgdXR4b2xpYi5hZGRyZXNzLmZyb21CYXNlNThDaGVjayhwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcywgbmV0d29yayk7XG4gICAgICBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID0gcGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3M7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJpdGNvaW4gYWRkcmVzczogJyArIHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKTtcbiAgICB9XG4gIH1cblxuICBpZiAocGFyYW1zLmZlZVNpbmdsZUtleVdJRikge1xuICAgIGNvbnN0IGZlZVNpbmdsZUtleSA9IHV0eG9saWIuRUNQYWlyLmZyb21XSUYocGFyYW1zLmZlZVNpbmdsZUtleVdJRiwgbmV0d29yayBhcyB1dHhvbGliLkJpdGNvaW5KU05ldHdvcmspO1xuICAgIGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPSBnZXRBZGRyZXNzUDJQS0goZmVlU2luZ2xlS2V5KTtcbiAgICAvLyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgYm90aCwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzIGNvcnJlc3BvbmRzIHRvIHRoZSBhZGRyZXNzIG9mIGZlZVNpbmdsZUtleVdJRlxuICAgIGlmIChwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyAmJiBwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyAhPT0gZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzczogJyArXG4gICAgICAgICAgcGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgK1xuICAgICAgICAgICcgZGlkIG5vdCBjb3JyZXNwb25kIHRvIGFkZHJlc3Mgb2YgZmVlU2luZ2xlS2V5V0lGOiAnICtcbiAgICAgICAgICBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY2lwaWVudHMgbXVzdCBiZSBhcnJheSBvZiB7IGFkZHJlc3M6IGFiYywgYW1vdW50OiAxMDAwMDAgfSBvYmplY3RzJyk7XG4gIH1cblxuICBsZXQgZmVlUGFyYW1zRGVmaW5lZCA9IDA7XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlKSkge1xuICAgIGZlZVBhcmFtc0RlZmluZWQrKztcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICBmZWVQYXJhbXNEZWZpbmVkKys7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCkpIHtcbiAgICBmZWVQYXJhbXNEZWZpbmVkKys7XG4gIH1cblxuICBpZiAoZmVlUGFyYW1zRGVmaW5lZCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgb2YgZmVlLCBmZWVSYXRlIGFuZCBmZWVUeENvbmZpcm1UYXJnZXQnKTtcbiAgfVxuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5tYXhGZWVSYXRlKSkge1xuICAgIHBhcmFtcy5tYXhGZWVSYXRlID0gY29uc3RhbnRzLm1heEZlZVJhdGU7XG4gIH1cblxuICAvLyBDb252ZXJ0IHRoZSBvbGQgZm9ybWF0IG9mIHBhcmFtcy5yZWNpcGllbnRzIChkaWN0aW9uYXJ5IG9mIGFkZHJlc3M6YW1vdW50KSB0byBuZXcgZm9ybWF0OiB7IGRlc3RpbmF0aW9uQWRkcmVzcywgYW1vdW50IH1cbiAgaWYgKCEocGFyYW1zLnJlY2lwaWVudHMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICByZWNpcGllbnRzID0gW107XG4gICAgT2JqZWN0LmtleXMocGFyYW1zLnJlY2lwaWVudHMpLmZvckVhY2goZnVuY3Rpb24gKGRlc3RpbmF0aW9uQWRkcmVzcykge1xuICAgICAgY29uc3QgYW1vdW50ID0gcGFyYW1zLnJlY2lwaWVudHNbZGVzdGluYXRpb25BZGRyZXNzXTtcbiAgICAgIHJlY2lwaWVudHMucHVzaCh7IGFkZHJlc3M6IGRlc3RpbmF0aW9uQWRkcmVzcywgYW1vdW50OiBhbW91bnQgfSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmVjaXBpZW50cyA9IHBhcmFtcy5yZWNpcGllbnRzO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5vcFJldHVybnMpIHtcbiAgICBpZiAoIShwYXJhbXMub3BSZXR1cm5zIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICBvcFJldHVybnMgPSBbXTtcbiAgICAgIE9iamVjdC5rZXlzKHBhcmFtcy5vcFJldHVybnMpLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgYW1vdW50ID0gcGFyYW1zLm9wUmV0dXJuc1ttZXNzYWdlXTtcbiAgICAgICAgb3BSZXR1cm5zLnB1c2goeyBtZXNzYWdlLCBhbW91bnQgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3BSZXR1cm5zID0gcGFyYW1zLm9wUmV0dXJucztcbiAgICB9XG4gIH1cblxuICBpZiAocmVjaXBpZW50cy5sZW5ndGggPT09IDAgJiYgb3BSZXR1cm5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSByZWNpcGllbnQnKTtcbiAgfVxuXG4gIGxldCBmZWUgPSBwYXJhbXMuZmVlO1xuICBsZXQgZmVlUmF0ZSA9IHBhcmFtcy5mZWVSYXRlO1xuXG4gIC8vIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgY2xhc3Mgd2lsbCBjb21wdXRlIHRoZSBmZWVcbiAgY29uc3Qgc2hvdWxkQ29tcHV0ZUJlc3RGZWUgPSBfLmlzVW5kZWZpbmVkKGZlZSk7XG5cbiAgbGV0IHRvdGFsT3V0cHV0QW1vdW50ID0gMDtcblxuICByZWNpcGllbnRzLmZvckVhY2goZnVuY3Rpb24gKHJlY2lwaWVudCkge1xuICAgIGlmIChfLmlzU3RyaW5nKHJlY2lwaWVudC5hZGRyZXNzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdXR4b2xpYi5hZGRyZXNzLmZyb21CYXNlNThDaGVjayhyZWNpcGllbnQuYWRkcmVzcywgbmV0d29yayk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiaXRjb2luIGFkZHJlc3M6ICcgKyByZWNpcGllbnQuYWRkcmVzcyk7XG4gICAgICB9XG4gICAgICBpZiAoISFyZWNpcGllbnQuc2NyaXB0KSB7XG4gICAgICAgIC8vIEEgc2NyaXB0IHdhcyBwcm92aWRlZCBhcyB3ZWxsIC0gdmFsaWRhdGUgdGhhdCB0aGUgYWRkcmVzcyBjb3JyZXNwb25kcyB0byB0aGF0XG4gICAgICAgIGlmICh1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQocmVjaXBpZW50LmFkZHJlc3MsIG5ldHdvcmspLnRvU3RyaW5nKCdoZXgnKSAhPT0gcmVjaXBpZW50LnNjcmlwdCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdib3RoIHNjcmlwdCBhbmQgYWRkcmVzcyBwcm92aWRlZCBidXQgdGhleSBkaWQgbm90IG1hdGNoOiAnICsgcmVjaXBpZW50LmFkZHJlc3MgKyAnICcgKyByZWNpcGllbnQuc2NyaXB0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHJlY2lwaWVudC5hbW91bnQpIHx8IHJlY2lwaWVudC5hbW91bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYW1vdW50IGZvciAnICsgcmVjaXBpZW50LmFkZHJlc3MgKyAnOiAnICsgcmVjaXBpZW50LmFtb3VudCk7XG4gICAgfVxuICAgIHRvdGFsT3V0cHV0QW1vdW50ICs9IHJlY2lwaWVudC5hbW91bnQ7XG4gIH0pO1xuXG4gIG9wUmV0dXJucy5mb3JFYWNoKGZ1bmN0aW9uIChvcFJldHVybikge1xuICAgIHRvdGFsT3V0cHV0QW1vdW50ICs9IG9wUmV0dXJuLmFtb3VudDtcbiAgfSk7XG5cbiAgbGV0IGJpdGdvRmVlSW5mbyA9IHBhcmFtcy5iaXRnb0ZlZTtcbiAgaWYgKGJpdGdvRmVlSW5mbyAmJiAoIV8uaXNJbnRlZ2VyKGJpdGdvRmVlSW5mby5hbW91bnQpIHx8ICFfLmlzU3RyaW5nKGJpdGdvRmVlSW5mby5hZGRyZXNzKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYml0Z29GZWVJbmZvJyk7XG4gIH1cblxuICAvLyBUaGUgdG90YWwgYW1vdW50IG5lZWRlZCBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cbiAgbGV0IHRvdGFsQW1vdW50ID0gdG90YWxPdXRwdXRBbW91bnQgKyAoZmVlIHx8IDApO1xuXG4gIC8vIFRoZSBsaXN0IG9mIHVuc3BlbnQgdHJhbnNhY3Rpb25zIGJlaW5nIHVzZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi5cbiAgbGV0IHVuc3BlbnRzO1xuXG4gIC8vIHRoZSB0b3RhbCBudW1iZXIgb2YgdW5zcGVudHMgb24gdGhpcyB3YWxsZXRcbiAgbGV0IHRvdGFsVW5zcGVudHNDb3VudDtcblxuICAvLyB0aGUgbnVtYmVyIG9mIHVuc3BlbnRzIHdlIGZldGNoZWQgZnJvbSB0aGUgc2VydmVyLCBiZWZvcmUgZmlsdGVyaW5nXG4gIGxldCBmZXRjaGVkVW5zcGVudHNDb3VudDtcblxuICAvLyBUaGUgbGlzdCBvZiB1bnNwZW50IHRyYW5zYWN0aW9ucyBiZWluZyB1c2VkIHdpdGggemVyby1jb25maXJtYXRpb25zXG4gIGxldCB6ZXJvQ29uZlVuc3BlbnRUeElkcztcblxuICAvLyBUaGUgc3VtIG9mIHRoZSBpbnB1dCB2YWx1ZXMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gIGxldCBpbnB1dEFtb3VudDtcblxuICBsZXQgY2hhbmdlT3V0cHV0czogT3V0cHV0W10gPSBbXTtcblxuICBsZXQgY29udGFpbnNVbmNvbXByZXNzZWRQdWJsaWNLZXlzID0gZmFsc2U7XG5cbiAgLy8gVGhlIHRyYW5zYWN0aW9uLlxuICBsZXQgdHJhbnNhY3Rpb24gPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZvck5ldHdvcmsobmV0d29yayk7XG5cbiAgY29uc3QgZ2V0Qml0R29GZWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIEJsdWViaXJkLnRyeShmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoYml0Z29GZWVJbmZvKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJhbXMud2FsbGV0LmdldEJpdEdvRmVlKHsgYW1vdW50OiB0b3RhbE91dHB1dEFtb3VudCwgaW5zdGFudDogcGFyYW1zLmluc3RhbnQgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmZlZSA+IDApIHtcbiAgICAgICAgICBiaXRnb0ZlZUluZm8gPSB7XG4gICAgICAgICAgICBhbW91bnQ6IHJlc3VsdC5mZWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoYml0Z29GZWVJbmZvICYmIGJpdGdvRmVlSW5mby5hbW91bnQgPiAwKSB7XG4gICAgICAgIHRvdGFsQW1vdW50ICs9IGJpdGdvRmVlSW5mby5hbW91bnQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgZ2V0Qml0R29GZWVBZGRyZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBiaXRnb0ZlZUluZm8sIG9yIGFkZHJlc3MgaXMgYWxyZWFkeSBzZXQsIGRvbid0IGdldCBhIG5ldyBvbmVcbiAgICAgIGlmICghYml0Z29GZWVJbmZvIHx8IGJpdGdvRmVlSW5mby5hZGRyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiaXRnby5nZXRCaXRHb0ZlZUFkZHJlc3MoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgYml0Z29GZWVJbmZvLmFkZHJlc3MgPSByZXN1bHQuYWRkcmVzcztcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEdldCBhIGR5bmFtaWMgZmVlIGVzdGltYXRlIGZyb20gdGhlIEJpdEdvIHNlcnZlciBpZiBmZWVUeENvbmZpcm1UYXJnZXRcbiAgLy8gaXMgc3BlY2lmaWVkIG9yIGlmIG5vIGZlZS1yZWxhdGVkIHBhcmFtcyBhcmUgc3BlY2lmaWVkXG4gIGNvbnN0IGdldER5bmFtaWNGZWVSYXRlRXN0aW1hdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgfHwgIWZlZVBhcmFtc0RlZmluZWQpIHtcbiAgICAgIHJldHVybiBiaXRnb1xuICAgICAgICAuZXN0aW1hdGVGZWUoe1xuICAgICAgICAgIG51bUJsb2NrczogcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCxcbiAgICAgICAgICBtYXhGZWU6IHBhcmFtcy5tYXhGZWVSYXRlLFxuICAgICAgICAgIGlucHV0czogemVyb0NvbmZVbnNwZW50VHhJZHMsXG4gICAgICAgICAgdHhTaXplOiBlc3RUeFNpemUsXG4gICAgICAgICAgY3BmcEF3YXJlOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgY29uc3QgZXN0aW1hdGVkRmVlUmF0ZSA9IHJlc3VsdC5jcGZwRmVlUGVyS2I7XG4gICAgICAgICAgY29uc3QgbWluaW11bSA9IHBhcmFtcy5pbnN0YW50XG4gICAgICAgICAgICA/IE1hdGgubWF4KGNvbnN0YW50cy5taW5GZWVSYXRlLCBjb25zdGFudHMubWluSW5zdGFudEZlZVJhdGUpXG4gICAgICAgICAgICA6IGNvbnN0YW50cy5taW5GZWVSYXRlO1xuICAgICAgICAgIC8vIDUgc2F0b3NoaXMgcGVyIGJ5dGVcbiAgICAgICAgICAvLyBpdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgcGFkZGluZyBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgdGhyZXNob2xkIGlzIGNyb3NzZWQsIGJ1dCBub3Qgd2hlbiB0aGUgZGVsdGEgaXMgbGVzcyB0aGFuIHRoZSBwYWRkaW5nXG4gICAgICAgICAgY29uc3QgcGFkZGluZyA9IDUwMDA7XG4gICAgICAgICAgaWYgKGVzdGltYXRlZEZlZVJhdGUgPCBtaW5pbXVtKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgbmV3IERhdGUoKSArXG4gICAgICAgICAgICAgICAgJzogRXJyb3Igd2hlbiBlc3RpbWF0aW5nIGZlZSBmb3Igc2VuZCBmcm9tICcgK1xuICAgICAgICAgICAgICAgIHBhcmFtcy53YWxsZXQuaWQoKSArXG4gICAgICAgICAgICAgICAgJywgaXQgd2FzIHRvbyBsb3cgLSAnICtcbiAgICAgICAgICAgICAgICBlc3RpbWF0ZWRGZWVSYXRlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmVlUmF0ZSA9IG1pbmltdW0gKyBwYWRkaW5nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRmVlUmF0ZSA+IHBhcmFtcy5tYXhGZWVSYXRlKSB7XG4gICAgICAgICAgICBmZWVSYXRlID0gcGFyYW1zLm1heEZlZVJhdGUgLSBwYWRkaW5nO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZWVSYXRlID0gZXN0aW1hdGVkRmVlUmF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZlZVJhdGU7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIC8vIHNhbml0eSBjaGVjayBmYWlsZWQgb24gdHggc2l6ZVxuICAgICAgICAgIGlmIChfLmluY2x1ZGVzKGUubWVzc2FnZSwgJ2ludmFsaWQgdHhTaXplJykpIHtcbiAgICAgICAgICAgIHJldHVybiBCbHVlYmlyZC5yZWplY3QoZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNvdWxkbid0IGVzdGltYXRlIHRoZSBmZWUsIHByb2NlZWQgdXNpbmcgdGhlIGRlZmF1bHRcbiAgICAgICAgICAgIGZlZVJhdGUgPSBjb25zdGFudHMuZmFsbGJhY2tGZWVSYXRlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGVzdGltYXRpbmcgZmVlIGZvciBzZW5kIGZyb20gJyArIHBhcmFtcy53YWxsZXQuaWQoKSArICc6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyBHZXQgdGhlIHVuc3BlbnRzIGZvciB0aGUgc2VuZGluZyB3YWxsZXQuXG4gIGNvbnN0IGdldFVuc3BlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChwYXJhbXMudW5zcGVudHMpIHtcbiAgICAgIC8vIHdlIGp1c3Qgd2FubmEgdXNlIGN1c3RvbSB1bnNwZW50c1xuICAgICAgdW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IGVub3VnaCB1bnNwZW50cyBmb3IgdGhlIHJlcXVlc3RlZCBhbW91bnRcbiAgICBjb25zdCBvcHRpb25zID0gXy5tZXJnZSh7fSwgcGFyYW1zLnVuc3BlbnRzRmV0Y2hQYXJhbXMgfHwge30sIHtcbiAgICAgIHRhcmdldDogdG90YWxBbW91bnQsXG4gICAgICBtaW5TaXplOiBwYXJhbXMubWluVW5zcGVudFNpemUgfHwgMCxcbiAgICAgIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50LCAvLyBpbnNpc3Qgb24gaW5zdGFudCB1bnNwZW50cyBvbmx5XG4gICAgICB0YXJnZXRXYWxsZXRVbnNwZW50czogcGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzLFxuICAgIH0pO1xuICAgIGlmIChwYXJhbXMuaW5zdGFudCkge1xuICAgICAgb3B0aW9ucy5pbnN0YW50ID0gcGFyYW1zLmluc3RhbnQ7IC8vIGluc2lzdCBvbiBpbnN0YW50IHVuc3BlbnRzIG9ubHlcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zLndhbGxldC51bnNwZW50c1BhZ2VkKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBVbnNwZW50cyBmZXRjaGVkXFxuOiAgJHtKU09OLnN0cmluZ2lmeShyZXN1bHRzLCBudWxsLCAyKX1gKTtcbiAgICAgIHRvdGFsVW5zcGVudHNDb3VudCA9IHJlc3VsdHMudG90YWw7XG4gICAgICBmZXRjaGVkVW5zcGVudHNDb3VudCA9IHJlc3VsdHMuY291bnQ7XG4gICAgICB1bnNwZW50cyA9IHJlc3VsdHMudW5zcGVudHMuZmlsdGVyKGZ1bmN0aW9uICh1KSB7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1zID0gdS5jb25maXJtYXRpb25zIHx8IDA7XG4gICAgICAgIGlmICghcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAmJiB1LmlzQ2hhbmdlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmZpcm1zID49IG1pbkNvbmZpcm1zO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGFib3J0IGVhcmx5IGlmIHRoZXJlJ3Mgbm8gdmlhYmxlIHVuc3BlbnRzLCBiZWNhdXNlIGl0IHdvbid0IGJlIHBvc3NpYmxlIHRvIGNyZWF0ZSB0aGUgdHhuIGxhdGVyXG4gICAgICBpZiAodW5zcGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IEVycm9yKCcwIHVuc3BlbnRzIGF2YWlsYWJsZSBmb3IgdHJhbnNhY3Rpb24gY3JlYXRpb24nKTtcbiAgICAgIH1cblxuICAgICAgLy8gY3JlYXRlIGFycmF5IG9mIHVuY29uZmlybWVkIHVuc3BlbnQgSUQgc3RyaW5ncyBvZiB0aGUgZm9ybSBcInR4SGFzaDpvdXRwdXRJbmRleFwiXG4gICAgICB6ZXJvQ29uZlVuc3BlbnRUeElkcyA9IF8ocmVzdWx0cy51bnNwZW50cylcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAodSkge1xuICAgICAgICAgIHJldHVybiAhdS5jb25maXJtYXRpb25zO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKGZ1bmN0aW9uICh1KSB7XG4gICAgICAgICAgcmV0dXJuIHUudHhfaGFzaCArICc6JyArIHUudHhfb3V0cHV0X247XG4gICAgICAgIH0pXG4gICAgICAgIC52YWx1ZSgpO1xuICAgICAgaWYgKF8uaXNFbXB0eSh6ZXJvQ29uZlVuc3BlbnRUeElkcykpIHtcbiAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBwYXNzIGFuIGVtcHR5IGFycmF5IG9mIGlucHV0cyB0byB0aGUgc2VydmVyLCBiZWNhdXNlIGl0IGFzc3VtZXMgaWYgdGhlXG4gICAgICAgIC8vIGlucHV0cyBhcmd1bWVudHMgZXhpc3RzLCBpdCBjb250YWlucyB2YWx1ZXNcbiAgICAgICAgemVyb0NvbmZVbnNwZW50VHhJZHMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgcmVzcGVjdCB0aGUgb2xkIHNwbGl0Q2hhbmdlU2l6ZT0wIHBhcmFtZXRlclxuICAgICAgaWYgKCFwYXJhbXMubm9TcGxpdENoYW5nZSAmJiBwYXJhbXMuc3BsaXRDaGFuZ2VTaXplICE9PSAwKSB7XG4gICAgICAgIGV4dHJhQ2hhbmdlQW1vdW50cyA9IHJlc3VsdHMuZXh0cmFDaGFuZ2VBbW91bnRzIHx8IFtdO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIEdldCB0aGUgdW5zcGVudHMgZm9yIHRoZSBzaW5nbGUga2V5IGZlZSBhZGRyZXNzXG4gIGxldCBmZWVTaW5nbGVLZXlVbnNwZW50czogQml0R29VbnNwZW50W10gPSBbXTtcbiAgY29uc3QgZ2V0VW5zcGVudHNGb3JTaW5nbGVLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MpIHtcbiAgICAgIGxldCBmZWVUYXJnZXQgPSAwLjAxZTg7XG4gICAgICBpZiAocGFyYW1zLmluc3RhbnQpIHtcbiAgICAgICAgZmVlVGFyZ2V0ICs9IHRvdGFsQW1vdW50ICogMC4wMDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gYml0Z29cbiAgICAgICAgLmdldChiaXRnby51cmwoJy9hZGRyZXNzLycgKyBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzICsgJy91bnNwZW50cz90YXJnZXQ9JyArIGZlZVRhcmdldCkpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5ib2R5LnRvdGFsIDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdW5zcGVudHMgYXZhaWxhYmxlIGluIHNpbmdsZSBrZXkgZmVlIHNvdXJjZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmZWVTaW5nbGVLZXlVbnNwZW50cyA9IHJlc3BvbnNlLmJvZHkudW5zcGVudHM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBsZXQgbWluZXJGZWVJbmZvOiBhbnkgPSB7fTtcbiAgbGV0IHR4SW5mbzogYW55ID0ge307XG5cbiAgLy8gSXRlcmF0ZSB1bnNwZW50cywgc3VtIHRoZSBpbnB1dHMsIGFuZCBzYXZlIF9pbnB1dHMgd2l0aCB0aGUgdG90YWxcbiAgLy8gaW5wdXQgYW1vdW50IGFuZCBmaW5hbCBsaXN0IG9mIGlucHV0cyB0byB1c2Ugd2l0aCB0aGUgdHJhbnNhY3Rpb24uXG4gIGxldCBmZWVTaW5nbGVLZXlVbnNwZW50c1VzZWQ6IEJpdEdvVW5zcGVudFtdID0gW107XG5cbiAgY29uc3QgY29sbGVjdElucHV0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXVuc3BlbnRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyB1bnNwZW50cyBhdmFpbGFibGUgb24gd2FsbGV0Jyk7XG4gICAgfVxuICAgIGlucHV0QW1vdW50ID0gMDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgY29zdCBvZiBzcGVuZGluZyBhIHNpbmdsZSBpbnB1dCwgaS5lLiB0aGUgc21hbGxlc3QgZWNvbm9taWNhbCB1bnNwZW50IHZhbHVlXG4gICAgcmV0dXJuIEJsdWViaXJkLnRyeShmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkgfHwgXy5pc051bWJlcihwYXJhbXMub3JpZ2luYWxGZWVSYXRlKSkge1xuICAgICAgICByZXR1cm4gIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVJhdGUpID8gcGFyYW1zLmZlZVJhdGUgOiBwYXJhbXMub3JpZ2luYWxGZWVSYXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGJpdGdvXG4gICAgICAgICAgLmVzdGltYXRlRmVlKHtcbiAgICAgICAgICAgIG51bUJsb2NrczogcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCxcbiAgICAgICAgICAgIG1heEZlZTogcGFyYW1zLm1heEZlZVJhdGUsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZmVlUmF0ZUVzdGltYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmVlUmF0ZUVzdGltYXRlLmZlZVBlcktiO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG4gICAgICAudGhlbihmdW5jdGlvbiAoZmVlUmF0ZSkge1xuICAgICAgICAvLyBEb24ndCBzcGVuZCBpbnB1dHMgdGhhdCBjYW5ub3QgcGF5IGZvciB0aGVpciBvd24gY29zdC5cbiAgICAgICAgbGV0IG1pbklucHV0VmFsdWUgPSAwO1xuICAgICAgICBpZiAoXy5pc0ludGVnZXIocGFyYW1zLm1pblVuc3BlbnRTaXplKSkge1xuICAgICAgICAgIG1pbklucHV0VmFsdWUgPSBwYXJhbXMubWluVW5zcGVudFNpemU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJ1bmVkVW5zcGVudENvdW50ID0gMDtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxVbnNwZW50Q291bnQgPSB1bnNwZW50cy5sZW5ndGg7XG4gICAgICAgIHVuc3BlbnRzID0gXy5maWx0ZXIodW5zcGVudHMsIGZ1bmN0aW9uICh1bnNwZW50KSB7XG4gICAgICAgICAgY29uc3QgaXNTZWd3aXRJbnB1dCA9ICEhdW5zcGVudC53aXRuZXNzU2NyaXB0O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbnB1dFNpemUgPSBpc1NlZ3dpdElucHV0ID8gVmlydHVhbFNpemVzLnR4UDJzaFAyd3NoSW5wdXRTaXplIDogVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZTtcbiAgICAgICAgICBjb25zdCBmZWVCYXNlZE1pbklucHV0VmFsdWUgPSAoZmVlUmF0ZSAqIGN1cnJlbnRJbnB1dFNpemUpIC8gMTAwMDtcbiAgICAgICAgICBjb25zdCBjdXJyZW50TWluSW5wdXRWYWx1ZSA9IE1hdGgubWF4KG1pbklucHV0VmFsdWUsIGZlZUJhc2VkTWluSW5wdXRWYWx1ZSk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRNaW5JbnB1dFZhbHVlID4gdW5zcGVudC52YWx1ZSkge1xuICAgICAgICAgICAgLy8gcHJ1bmluZyB1bnNwZW50XG4gICAgICAgICAgICBjb25zdCBwcnVuZURldGFpbHMgPSB7XG4gICAgICAgICAgICAgIGdlbmVyYWxNaW5JbnB1dFZhbHVlOiBtaW5JbnB1dFZhbHVlLFxuICAgICAgICAgICAgICBmZWVCYXNlZE1pbklucHV0VmFsdWUsXG4gICAgICAgICAgICAgIGN1cnJlbnRNaW5JbnB1dFZhbHVlLFxuICAgICAgICAgICAgICBmZWVSYXRlLFxuICAgICAgICAgICAgICBpbnB1dFNpemU6IGN1cnJlbnRJbnB1dFNpemUsXG4gICAgICAgICAgICAgIHVuc3BlbnQ6IHVuc3BlbnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc29sZS5sb2coYHBydW5pbmcgdW5zcGVudDogJHtKU09OLnN0cmluZ2lmeShwcnVuZURldGFpbHMsIG51bGwsIDQpfWApO1xuICAgICAgICAgICAgcHJ1bmVkVW5zcGVudENvdW50Kys7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocHJ1bmVkVW5zcGVudENvdW50ID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBwcnVuZWQgJHtwcnVuZWRVbnNwZW50Q291bnR9IG91dCBvZiAke29yaWdpbmFsVW5zcGVudENvdW50fSB1bnNwZW50c2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW5zdWZmaWNpZW50IGZ1bmRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNlZ3dpdElucHV0Q291bnQgPSAwO1xuICAgICAgICB1bnNwZW50cy5ldmVyeShmdW5jdGlvbiAodW5zcGVudCkge1xuICAgICAgICAgIGlmICh1bnNwZW50LndpdG5lc3NTY3JpcHQpIHtcbiAgICAgICAgICAgIHNlZ3dpdElucHV0Q291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5wdXRBbW91bnQgKz0gdW5zcGVudC52YWx1ZTtcbiAgICAgICAgICB0cmFuc2FjdGlvbi5hZGRJbnB1dCh1bnNwZW50LnR4X2hhc2gsIHVuc3BlbnQudHhfb3V0cHV0X24sIDB4ZmZmZmZmZmYpO1xuXG4gICAgICAgICAgcmV0dXJuIGlucHV0QW1vdW50IDwgKGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPyB0b3RhbE91dHB1dEFtb3VudCA6IHRvdGFsQW1vdW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaWYgcGF5aW5nIGZlZXMgZnJvbSBhbiBleHRlcm5hbCBzaW5nbGUga2V5IHdhbGxldCwgYWRkIHRoZSBpbnB1dHNcbiAgICAgICAgaWYgKGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MpIHtcbiAgICAgICAgICAvLyBjb2xsZWN0IHRoZSBhbW91bnQgdXNlZCBpbiB0aGUgZmVlIGlucHV0cyBzbyB3ZSBjYW4gZ2V0IGNoYW5nZSBsYXRlclxuICAgICAgICAgIGZlZVNpbmdsZUtleUlucHV0QW1vdW50ID0gMDtcbiAgICAgICAgICBmZWVTaW5nbGVLZXlVbnNwZW50c1VzZWQgPSBbXTtcbiAgICAgICAgICBmZWVTaW5nbGVLZXlVbnNwZW50cy5ldmVyeShmdW5jdGlvbiAodW5zcGVudCkge1xuICAgICAgICAgICAgZmVlU2luZ2xlS2V5SW5wdXRBbW91bnQgKz0gdW5zcGVudC52YWx1ZTtcbiAgICAgICAgICAgIGlucHV0QW1vdW50ICs9IHVuc3BlbnQudmFsdWU7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbi5hZGRJbnB1dCh1bnNwZW50LnR4X2hhc2gsIHVuc3BlbnQudHhfb3V0cHV0X24pO1xuICAgICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkLnB1c2godW5zcGVudCk7XG4gICAgICAgICAgICAvLyB1c2UgdGhlIGZlZSB3YWxsZXQgdG8gcGF5IG1pbmVyIGZlZXMgYW5kIHBvdGVudGlhbGx5IGluc3RhbnQgZmVlc1xuICAgICAgICAgICAgcmV0dXJuIGZlZVNpbmdsZUtleUlucHV0QW1vdW50IDwgZmVlICsgKGJpdGdvRmVlSW5mbyA/IGJpdGdvRmVlSW5mby5hbW91bnQgOiAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHR4SW5mbyA9IHtcbiAgICAgICAgICBuUDJzaElucHV0czogdHJhbnNhY3Rpb24udHguaW5zLmxlbmd0aCAtIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID8gMSA6IDApIC0gc2Vnd2l0SW5wdXRDb3VudCxcbiAgICAgICAgICBuUDJzaFAyd3NoSW5wdXRzOiBzZWd3aXRJbnB1dENvdW50LFxuICAgICAgICAgIG5QMnBraElucHV0czogZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IDEgOiAwLFxuICAgICAgICAgIC8vIGFkZCBzaW5nbGUga2V5IHNvdXJjZSBhZGRyZXNzIGNoYW5nZVxuICAgICAgICAgIG5PdXRwdXRzOlxuICAgICAgICAgICAgcmVjaXBpZW50cy5sZW5ndGggK1xuICAgICAgICAgICAgMSArIC8vIHJlY2lwaWVudHMgYW5kIGNoYW5nZVxuICAgICAgICAgICAgZXh0cmFDaGFuZ2VBbW91bnRzLmxlbmd0aCArIC8vIGV4dHJhIGNoYW5nZSBzcGxpdHRpbmdcbiAgICAgICAgICAgIChiaXRnb0ZlZUluZm8gJiYgYml0Z29GZWVJbmZvLmFtb3VudCA+IDAgPyAxIDogMCkgKyAvLyBhZGQgb3V0cHV0IGZvciBiaXRnbyBmZWVcbiAgICAgICAgICAgIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID8gMSA6IDApLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEFzIHBlciB0aGUgcmVzcG9uc2Ugb2YgZ2V0IHVuc3BlbnRzIEFQSSwgZm9yIHYxIHNhZmUgd2FsbGV0cyByZWRlZW1TY3JpcHQgaXMgcmV0dXJuZWRcbiAgICAgICAgLy8gaW4gdGhlIHJlc3BvbnNlIGluIGhleCBmb3JtYXRcbiAgICAgICAgY29udGFpbnNVbmNvbXByZXNzZWRQdWJsaWNLZXlzID0gdW5zcGVudHMuc29tZShcbiAgICAgICAgICAodSkgPT4gdS5yZWRlZW1TY3JpcHQubGVuZ3RoID09PSAyMDEgKiAyIC8qIGhleCBsZW5ndGggaXMgdHdpY2UgdGhlIGxlbmd0aCBpbiBieXRlcyAqL1xuICAgICAgICApO1xuXG4gICAgICAgIGVzdFR4U2l6ZSA9IGVzdGltYXRlVHJhbnNhY3Rpb25TaXplKHtcbiAgICAgICAgICBjb250YWluc1VuY29tcHJlc3NlZFB1YmxpY0tleXMsXG4gICAgICAgICAgblAyc2hJbnB1dHM6IHR4SW5mby5uUDJzaElucHV0cyxcbiAgICAgICAgICBuUDJzaFAyd3NoSW5wdXRzOiB0eEluZm8ublAyc2hQMndzaElucHV0cyxcbiAgICAgICAgICBuUDJwa2hJbnB1dHM6IHR4SW5mby5uUDJwa2hJbnB1dHMsXG4gICAgICAgICAgbk91dHB1dHM6IHR4SW5mby5uT3V0cHV0cyxcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oZ2V0RHluYW1pY0ZlZVJhdGVFc3RpbWF0ZSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWluZXJGZWVJbmZvID0gZXhwb3J0cy5jYWxjdWxhdGVNaW5lckZlZUluZm8oe1xuICAgICAgICAgIGJpdGdvOiBwYXJhbXMud2FsbGV0LmJpdGdvLFxuICAgICAgICAgIGNvbnRhaW5zVW5jb21wcmVzc2VkUHVibGljS2V5cyxcbiAgICAgICAgICBmZWVSYXRlOiBmZWVSYXRlLFxuICAgICAgICAgIG5QMnNoSW5wdXRzOiB0eEluZm8ublAyc2hJbnB1dHMsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0czogdHhJbmZvLm5QMnNoUDJ3c2hJbnB1dHMsXG4gICAgICAgICAgblAycGtoSW5wdXRzOiB0eEluZm8ublAycGtoSW5wdXRzLFxuICAgICAgICAgIG5PdXRwdXRzOiB0eEluZm8ubk91dHB1dHMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzaG91bGRDb21wdXRlQmVzdEZlZSkge1xuICAgICAgICAgIGNvbnN0IGFwcHJveGltYXRlRmVlID0gbWluZXJGZWVJbmZvLmZlZTtcbiAgICAgICAgICBjb25zdCBzaG91bGRSZWN1cnNlID0gXy5pc1VuZGVmaW5lZChmZWUpIHx8IGFwcHJveGltYXRlRmVlID4gZmVlO1xuICAgICAgICAgIGZlZSA9IGFwcHJveGltYXRlRmVlO1xuICAgICAgICAgIC8vIFJlY29tcHV0ZSB0b3RhbEFtb3VudCBmcm9tIHNjcmF0Y2hcbiAgICAgICAgICB0b3RhbEFtb3VudCA9IGZlZSArIHRvdGFsT3V0cHV0QW1vdW50O1xuICAgICAgICAgIGlmIChiaXRnb0ZlZUluZm8pIHtcbiAgICAgICAgICAgIHRvdGFsQW1vdW50ICs9IGJpdGdvRmVlSW5mby5hbW91bnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaG91bGRSZWN1cnNlKSB7XG4gICAgICAgICAgICAvLyBpZiBmZWUgY2hhbmdlZCwgcmUtY29sbGVjdCBpbnB1dHNcbiAgICAgICAgICAgIGlucHV0QW1vdW50ID0gMDtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGb3JOZXR3b3JrKG5ldHdvcmspO1xuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3RJbnB1dHMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbEZlZSA9IGZlZSArIChiaXRnb0ZlZUluZm8gPyBiaXRnb0ZlZUluZm8uYW1vdW50IDogMCk7XG5cbiAgICAgICAgaWYgKGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MpIHtcbiAgICAgICAgICBjb25zdCBzdW1tZWRTaW5nbGVLZXlVbnNwZW50cyA9IF8uc3VtQnkoZmVlU2luZ2xlS2V5VW5zcGVudHMsICd2YWx1ZScpO1xuICAgICAgICAgIGlmICh0b3RhbEZlZSA+IHN1bW1lZFNpbmdsZUtleVVuc3BlbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBlcnI6IGFueSA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0luc3VmZmljaWVudCBmZWUgYW1vdW50IGF2YWlsYWJsZSBpbiBzaW5nbGUga2V5IGZlZSBzb3VyY2U6ICcgKyBzdW1tZWRTaW5nbGVLZXlVbnNwZW50c1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5yZXN1bHQgPSB7XG4gICAgICAgICAgICAgIGZlZTogZmVlLFxuICAgICAgICAgICAgICBmZWVSYXRlOiBmZWVSYXRlLFxuICAgICAgICAgICAgICBlc3RpbWF0ZWRTaXplOiBtaW5lckZlZUluZm8uc2l6ZSxcbiAgICAgICAgICAgICAgYXZhaWxhYmxlOiBpbnB1dEFtb3VudCxcbiAgICAgICAgICAgICAgYml0Z29GZWU6IGJpdGdvRmVlSW5mbyxcbiAgICAgICAgICAgICAgdHhJbmZvOiB0eEluZm8sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIEJsdWViaXJkLnJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnB1dEFtb3VudCA8IChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID8gdG90YWxPdXRwdXRBbW91bnQgOiB0b3RhbEFtb3VudCkpIHtcbiAgICAgICAgICAvLyBUaGUgdW5zcGVudHMgd2UncmUgdXNpbmcgZm9yIGlucHV0cyBkbyBub3QgaGF2ZSBzdWZmaWNpZW50IHZhbHVlIG9uIHRoZW0gdG9cbiAgICAgICAgICAvLyBzYXRpc2Z5IHRoZSB1c2VyJ3MgcmVxdWVzdGVkIHNwZW5kIGFtb3VudC4gVGhhdCBtYXkgYmUgYmVjYXVzZSB0aGUgd2FsbGV0J3MgYmFsYW5jZVxuICAgICAgICAgIC8vIGlzIHNpbXBseSB0b28gbG93LCBvciBpdCBtaWdodCBiZSB0aGF0IHRoZSB3YWxsZXQncyBiYWxhbmNlIGlzIHN1ZmZpY2llbnQgYnV0XG4gICAgICAgICAgLy8gd2UgZGlkbid0IGZldGNoIGVub3VnaCB1bnNwZW50cy4gVG9vIGZldyB1bnNwZW50cyBjb3VsZCByZXN1bHQgZnJvbSB0aGUgd2FsbGV0XG4gICAgICAgICAgLy8gaGF2aW5nIG1hbnkgc21hbGwgdW5zcGVudHMgYW5kIHdlIGhpdCBvdXIgbGltaXQgb24gdGhlIG51bWJlciBvZiBpbnB1dHMgd2UgY2FuIHVzZVxuICAgICAgICAgIC8vIGluIGEgdHhuLCBvciBpdCBtaWdodCBoYXZlIGJlZW4gdGhhdCB0aGUgZmlsdGVycyB0aGUgdXNlciBwYXNzZWQgaW4gKGxpa2UgbWluQ29uZmlybXMpXG4gICAgICAgICAgLy8gZGlzcXVhbGlmaWVkIHRvbyBtYW55IG9mIHRoZSB1bnNwZW50c1xuICAgICAgICAgIGxldCBlcnI7XG4gICAgICAgICAgaWYgKHRvdGFsVW5zcGVudHNDb3VudCA9PT0gZmV0Y2hlZFVuc3BlbnRzQ291bnQpIHtcbiAgICAgICAgICAgIC8vIHdlIGZldGNoZWQgZXZlcnkgdW5zcGVudCB0aGUgd2FsbGV0IGhhZCwgYnV0IGl0IHN0aWxsIHdhc24ndCBlbm91Z2hcbiAgICAgICAgICAgIGVyciA9IG5ldyBFcnJvcignSW5zdWZmaWNpZW50IGZ1bmRzJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdlIHdlcmVuJ3QgYWJsZSB0byBmZXRjaCBhbGwgdGhlIHVuc3BlbnRzIG9uIHRoZSB3YWxsZXRcbiAgICAgICAgICAgIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFRyYW5zYWN0aW9uIHNpemUgdG9vIGxhcmdlIGR1ZSB0byB0b28gbWFueSB1bnNwZW50cy4gQ2FuIHNlbmQgb25seSAke2lucHV0QW1vdW50fSBzYXRvc2hpcyBpbiB0aGlzIHRyYW5zYWN0aW9uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyLnJlc3VsdCA9IHtcbiAgICAgICAgICAgIGZlZTogZmVlLFxuICAgICAgICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgICAgICAgIGVzdGltYXRlZFNpemU6IG1pbmVyRmVlSW5mby5zaXplLFxuICAgICAgICAgICAgYXZhaWxhYmxlOiBpbnB1dEFtb3VudCxcbiAgICAgICAgICAgIGJpdGdvRmVlOiBiaXRnb0ZlZUluZm8sXG4gICAgICAgICAgICB0eEluZm86IHR4SW5mbyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBCbHVlYmlyZC5yZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH07XG5cbiAgLy8gQWRkIHRoZSBvdXRwdXRzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICBjb25zdCBjb2xsZWN0T3V0cHV0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobWluZXJGZWVJbmZvLnNpemUgPj0gOTAwMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHJhbnNhY3Rpb24gdG9vIGxhcmdlOiBlc3RpbWF0ZWQgc2l6ZSAnICsgbWluZXJGZWVJbmZvLnNpemUgKyAnIGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0czogT3V0cHV0W10gPSBbXTtcblxuICAgIHJlY2lwaWVudHMuZm9yRWFjaChmdW5jdGlvbiAocmVjaXBpZW50KSB7XG4gICAgICBsZXQgc2NyaXB0O1xuICAgICAgaWYgKF8uaXNTdHJpbmcocmVjaXBpZW50LmFkZHJlc3MpKSB7XG4gICAgICAgIHNjcmlwdCA9IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChyZWNpcGllbnQuYWRkcmVzcywgbmV0d29yayk7XG4gICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QocmVjaXBpZW50LnNjcmlwdCkpIHtcbiAgICAgICAgc2NyaXB0ID0gcmVjaXBpZW50LnNjcmlwdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbmVpdGhlciByZWNpcGllbnQgYWRkcmVzcyBub3Igc2NyaXB0IHdhcyBwcm92aWRlZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZGF0ZSB0cmF2ZWxJbmZvIGlmIGl0IGV4aXN0c1xuICAgICAgbGV0IHRyYXZlbEluZm87XG4gICAgICBpZiAoIV8uaXNFbXB0eShyZWNpcGllbnQudHJhdmVsSW5mbykpIHtcbiAgICAgICAgdHJhdmVsSW5mbyA9IHJlY2lwaWVudC50cmF2ZWxJbmZvO1xuICAgICAgICAvLyBCZXR0ZXIgdG8gYXZvaWQgdHJvdWJsZSBub3csIGJlZm9yZSB0eCBpcyBjcmVhdGVkXG4gICAgICAgIGJpdGdvLnRyYXZlbFJ1bGUoKS52YWxpZGF0ZVRyYXZlbEluZm8odHJhdmVsSW5mbyk7XG4gICAgICB9XG5cbiAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgIHNjcmlwdDogc2NyaXB0LFxuICAgICAgICBhbW91bnQ6IHJlY2lwaWVudC5hbW91bnQsXG4gICAgICAgIHRyYXZlbEluZm86IHRyYXZlbEluZm8sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIG9wUmV0dXJucy5mb3JFYWNoKGZ1bmN0aW9uICh7IG1lc3NhZ2UsIGFtb3VudCB9KSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSB1dHhvbGliLnNjcmlwdC5mcm9tQVNNKCdPUF9SRVRVUk4gJyArIEJ1ZmZlci5mcm9tKG1lc3NhZ2UpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICBvdXRwdXRzLnB1c2goeyBzY3JpcHQsIGFtb3VudCB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGdldENoYW5nZU91dHB1dHMgPSBmdW5jdGlvbiAoY2hhbmdlQW1vdW50OiBudW1iZXIpOiBPdXRwdXRbXSB8IEJsdWViaXJkPE91dHB1dFtdPiB7XG4gICAgICBpZiAoY2hhbmdlQW1vdW50IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25lZ2F0aXZlIGNoYW5nZSBhbW91bnQ6ICcgKyBjaGFuZ2VBbW91bnQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQ6IE91dHB1dFtdID0gW107XG4gICAgICAvLyBpZiB3ZSBwYWlkIGZlZXMgZnJvbSBhIHNpbmdsZSBrZXkgd2FsbGV0LCByZXR1cm4gdGhlIGZlZSBjaGFuZ2UgZmlyc3RcbiAgICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICAgIGNvbnN0IGZlZVNpbmdsZUtleVdhbGxldENoYW5nZUFtb3VudCA9XG4gICAgICAgICAgZmVlU2luZ2xlS2V5SW5wdXRBbW91bnQgLSAoZmVlICsgKGJpdGdvRmVlSW5mbyA/IGJpdGdvRmVlSW5mby5hbW91bnQgOiAwKSk7XG4gICAgICAgIGlmIChmZWVTaW5nbGVLZXlXYWxsZXRDaGFuZ2VBbW91bnQgPj0gY29uc3RhbnRzLm1pbk91dHB1dFNpemUpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh7IGFkZHJlc3M6IGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MsIGFtb3VudDogZmVlU2luZ2xlS2V5V2FsbGV0Q2hhbmdlQW1vdW50IH0pO1xuICAgICAgICAgIGNoYW5nZUFtb3VudCA9IGNoYW5nZUFtb3VudCAtIGZlZVNpbmdsZUtleVdhbGxldENoYW5nZUFtb3VudDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlQW1vdW50IDwgY29uc3RhbnRzLm1pbk91dHB1dFNpemUpIHtcbiAgICAgICAgLy8gR2l2ZSBpdCB0byB0aGUgbWluZXJzXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMud2FsbGV0LnR5cGUoKSA9PT0gJ3NhZmUnKSB7XG4gICAgICAgIHJldHVybiBwYXJhbXMud2FsbGV0LmFkZHJlc3NlcygpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goeyBhZGRyZXNzOiByZXNwb25zZS5hZGRyZXNzZXNbMF0uYWRkcmVzcywgYW1vdW50OiBjaGFuZ2VBbW91bnQgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBleHRyYUNoYW5nZVRvdGFsID0gXy5zdW0oZXh0cmFDaGFuZ2VBbW91bnRzKTtcbiAgICAgIC8vIFNhbml0eSBjaGVja1xuICAgICAgaWYgKGV4dHJhQ2hhbmdlVG90YWwgPiBjaGFuZ2VBbW91bnQpIHtcbiAgICAgICAgZXh0cmFDaGFuZ2VBbW91bnRzID0gW107XG4gICAgICAgIGV4dHJhQ2hhbmdlVG90YWwgPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBjb3B5IGFuZCBhZGQgcmVtYWluaW5nIGNoYW5nZSBhbW91bnRcbiAgICAgIGNvbnN0IGFsbENoYW5nZUFtb3VudHMgPSBleHRyYUNoYW5nZUFtb3VudHMuc2xpY2UoMCk7XG4gICAgICBhbGxDaGFuZ2VBbW91bnRzLnB1c2goY2hhbmdlQW1vdW50IC0gZXh0cmFDaGFuZ2VUb3RhbCk7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZSBhc3luYyBmdW5jIHRvIGFkZCBhbGwgY2hhbmdlIG91dHB1dHNcbiAgICAgIGNvbnN0IGFkZENoYW5nZU91dHB1dHMgPSBmdW5jdGlvbiAoKTogT3V0cHV0W10gfCBCbHVlYmlyZDxPdXRwdXRbXT4ge1xuICAgICAgICBjb25zdCB0aGlzQW1vdW50ID0gYWxsQ2hhbmdlQW1vdW50cy5zaGlmdCgpO1xuICAgICAgICBpZiAoIXRoaXNBbW91bnQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChwYXJhbXMuY2hhbmdlQWRkcmVzcykge1xuICAgICAgICAgICAgLy8gSWYgdXNlciBwYXNzZWQgYSBjaGFuZ2UgYWRkcmVzcywgdXNlIGl0IGZvciBhbGwgb3V0cHV0c1xuICAgICAgICAgICAgcmV0dXJuIHBhcmFtcy5jaGFuZ2VBZGRyZXNzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGFkZHJlc3MgcGVyIG91dHB1dCwgZm9yIHByaXZhY3lcbiAgICAgICAgICAgIC8vIGRldGVybWluZSBpZiBzZWd3aXQgb3Igbm90XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VDaGFpbiA9IHBhcmFtcy53YWxsZXQuZ2V0Q2hhbmdlQ2hhaW4ocGFyYW1zKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXMud2FsbGV0LmNyZWF0ZUFkZHJlc3MoeyBjaGFpbjogY2hhbmdlQ2hhaW4sIHZhbGlkYXRlOiB2YWxpZGF0ZSB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5hZGRyZXNzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChhZGRyZXNzKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goeyBhZGRyZXNzOiBhZGRyZXNzLCBhbW91bnQ6IHRoaXNBbW91bnQgfSk7XG4gICAgICAgICAgcmV0dXJuIGFkZENoYW5nZU91dHB1dHMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYWRkQ2hhbmdlT3V0cHV0cygpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgY2hhbmdlIG91dHB1dChzKSBhbmQgaW5zdGFudCBmZWUgb3V0cHV0IGlmIGFwcGxpY2FibGVcbiAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRDaGFuZ2VPdXRwdXRzKGlucHV0QW1vdW50IC0gdG90YWxBbW91bnQpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgY2hhbmdlT3V0cHV0cyA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IGV4dHJhT3V0cHV0cyA9IGNoYW5nZU91dHB1dHMuY29uY2F0KFtdKTsgLy8gY29weSB0aGUgYXJyYXlcbiAgICAgIGlmIChiaXRnb0ZlZUluZm8gJiYgYml0Z29GZWVJbmZvLmFtb3VudCA+IDApIHtcbiAgICAgICAgZXh0cmFPdXRwdXRzLnB1c2goYml0Z29GZWVJbmZvKTtcbiAgICAgIH1cbiAgICAgIGV4dHJhT3V0cHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChvdXRwdXQpIHtcbiAgICAgICAgaWYgKChvdXRwdXQgYXMgQWRkcmVzc091dHB1dCkuYWRkcmVzcykge1xuICAgICAgICAgIChvdXRwdXQgYXMgU2NyaXB0T3V0cHV0KS5zY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoKG91dHB1dCBhcyBBZGRyZXNzT3V0cHV0KS5hZGRyZXNzLCBuZXR3b3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRlY2lkZSB3aGVyZSB0byBwdXQgdGhlIG91dHB1dHMgLSBkZWZhdWx0IGlzIHRvIHJhbmRvbWl6ZSB1bmxlc3MgZm9yY2VkIHRvIGVuZFxuICAgICAgICBjb25zdCBvdXRwdXRJbmRleCA9IHBhcmFtcy5mb3JjZUNoYW5nZUF0RW5kID8gb3V0cHV0cy5sZW5ndGggOiBfLnJhbmRvbSgwLCBvdXRwdXRzLmxlbmd0aCk7XG4gICAgICAgIG91dHB1dHMuc3BsaWNlKG91dHB1dEluZGV4LCAwLCBvdXRwdXQpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFkZCBhbGwgb3V0cHV0cyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICAgIG91dHB1dHMuZm9yRWFjaChmdW5jdGlvbiAob3V0cHV0KSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmFkZE91dHB1dCgob3V0cHV0IGFzIFNjcmlwdE91dHB1dCkuc2NyaXB0LCBvdXRwdXQuYW1vdW50KTtcbiAgICAgIH0pO1xuXG4gICAgICB0cmF2ZWxJbmZvcyA9IF8ob3V0cHV0cylcbiAgICAgICAgLm1hcChmdW5jdGlvbiAob3V0cHV0LCBpbmRleCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG91dHB1dC50cmF2ZWxJbmZvO1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQub3V0cHV0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKClcbiAgICAgICAgLnZhbHVlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gU2VyaWFsaXplIHRoZSB0cmFuc2FjdGlvbiwgcmV0dXJuaW5nIHdoYXQgaXMgbmVlZGVkIHRvIHNpZ24gaXRcbiAgY29uc3Qgc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIG9ubHkgbmVlZCB0byByZXR1cm4gdGhlIHVuc3BlbnRzIHRoYXQgd2VyZSB1c2VkIGFuZCBqdXN0IHRoZSBjaGFpblBhdGgsIHJlZGVlbVNjcmlwdCwgYW5kIGluc3RhbnQgZmxhZ1xuICAgIGNvbnN0IHBpY2tlZFVuc3BlbnRzOiBhbnkgPSBfLm1hcCh1bnNwZW50cywgZnVuY3Rpb24gKHVuc3BlbnQpIHtcbiAgICAgIHJldHVybiBfLnBpY2sodW5zcGVudCwgWydjaGFpblBhdGgnLCAncmVkZWVtU2NyaXB0JywgJ2luc3RhbnQnLCAnd2l0bmVzc1NjcmlwdCcsICdzY3JpcHQnLCAndmFsdWUnXSk7XG4gICAgfSk7XG4gICAgY29uc3QgcHJ1bmVkVW5zcGVudHMgPSBfLnNsaWNlKHBpY2tlZFVuc3BlbnRzLCAwLCB0cmFuc2FjdGlvbi50eC5pbnMubGVuZ3RoIC0gZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkLmxlbmd0aCk7XG4gICAgXy5lYWNoKGZlZVNpbmdsZUtleVVuc3BlbnRzVXNlZCwgZnVuY3Rpb24gKGZlZVVuc3BlbnQpIHtcbiAgICAgIHBydW5lZFVuc3BlbnRzLnB1c2goeyByZWRlZW1TY3JpcHQ6IGZhbHNlLCBjaGFpblBhdGg6IGZhbHNlIH0pOyAvLyBtYXJrIGFzIGZhbHNlIHRvIHNpZ25pZnkgYSBub24tbXVsdGlzaWcgYWRkcmVzc1xuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge1xuICAgICAgdHJhbnNhY3Rpb25IZXg6IHRyYW5zYWN0aW9uLmJ1aWxkSW5jb21wbGV0ZSgpLnRvSGV4KCksXG4gICAgICB1bnNwZW50czogcHJ1bmVkVW5zcGVudHMsXG4gICAgICBmZWU6IGZlZSxcbiAgICAgIGNoYW5nZUFkZHJlc3NlczogY2hhbmdlT3V0cHV0cy5tYXAoZnVuY3Rpb24gKGNvKSB7XG4gICAgICAgIHJldHVybiBfLnBpY2soY28sIFsnYWRkcmVzcycsICdwYXRoJywgJ2Ftb3VudCddKTtcbiAgICAgIH0pLFxuICAgICAgd2FsbGV0SWQ6IHBhcmFtcy53YWxsZXQuaWQoKSxcbiAgICAgIHdhbGxldEtleWNoYWluczogcGFyYW1zLndhbGxldC5rZXljaGFpbnMsXG4gICAgICBmZWVSYXRlOiBmZWVSYXRlLFxuICAgICAgaW5zdGFudDogcGFyYW1zLmluc3RhbnQsXG4gICAgICBiaXRnb0ZlZTogYml0Z29GZWVJbmZvLFxuICAgICAgZXN0aW1hdGVkU2l6ZTogbWluZXJGZWVJbmZvLnNpemUsXG4gICAgICB0eEluZm86IHR4SW5mbyxcbiAgICAgIHRyYXZlbEluZm9zOiB0cmF2ZWxJbmZvcyxcbiAgICB9O1xuXG4gICAgLy8gQWRkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIGlmIChyZXN1bHQuaW5zdGFudCAmJiBiaXRnb0ZlZUluZm8pIHtcbiAgICAgIHJlc3VsdC5pbnN0YW50RmVlID0gXy5waWNrKGJpdGdvRmVlSW5mbywgWydhbW91bnQnLCAnYWRkcmVzcyddKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRCaXRHb0ZlZSgpO1xuICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBCbHVlYmlyZC5hbGwoW2dldEJpdEdvRmVlQWRkcmVzcygpLCBnZXRVbnNwZW50cygpLCBnZXRVbnNwZW50c0ZvclNpbmdsZUtleSgpXSk7XG4gICAgfSlcbiAgICAudGhlbihjb2xsZWN0SW5wdXRzKVxuICAgIC50aGVuKGNvbGxlY3RPdXRwdXRzKVxuICAgIC50aGVuKHNlcmlhbGl6ZSk7XG59O1xuXG4vKipcbiAqIEVzdGltYXRlIHRoZSBzaXplIG9mIGEgdHJhbnNhY3Rpb24gaW4gYnl0ZXMgYmFzZWQgb24gdGhlIG51bWJlciBvZlxuICogaW5wdXRzIGFuZCBvdXRwdXRzIHByZXNlbnQuXG4gKiBAcGFyYW1zIHBhcmFtcyB7XG4gKiAgIG5QMnNoSW5wdXRzOiBudW1iZXIgb2YgUDJTSCAobXVsdGlzaWcpIGlucHV0c1xuICogICBuUDJwa2hJbnB1dHM6IG51bWJlciBvZiBQMlBLSCAoc2luZ2xlIHNpZykgaW5wdXRzXG4gKiAgIG5PdXRwdXRzOiBudW1iZXIgb2Ygb3V0cHV0c1xuICogfVxuICpcbiAqIEByZXR1cm5zIHNpemU6IGVzdGltYXRlZCBzaXplIG9mIHRoZSB0cmFuc2FjdGlvbiBpbiBieXRlc1xuICovXG5jb25zdCBlc3RpbWF0ZVRyYW5zYWN0aW9uU2l6ZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMublAyc2hJbnB1dHMpIHx8IHBhcmFtcy5uUDJzaElucHV0cyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBwb3NpdGl2ZSBuUDJzaElucHV0cycpO1xuICB9XG4gIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm5QMnBraElucHV0cykgfHwgcGFyYW1zLm5QMnBraElucHV0cyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBwb3NpdGl2ZSBuUDJwa2hJbnB1dHMgdG8gYmUgbnVtZXJpYycpO1xuICB9XG4gIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm5QMnNoUDJ3c2hJbnB1dHMpIHx8IHBhcmFtcy5uUDJzaFAyd3NoSW5wdXRzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHBvc2l0aXZlIG5QMnNoUDJ3c2hJbnB1dHMgdG8gYmUgbnVtZXJpYycpO1xuICB9XG4gIGlmIChwYXJhbXMublAyc2hJbnB1dHMgKyBwYXJhbXMublAyc2hQMndzaElucHV0cyA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBhdCBsZWFzdCBvbmUgblAyc2hJbnB1dHMgb3IgblAyc2hQMndzaElucHV0cycpO1xuICB9XG4gIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm5PdXRwdXRzKSB8fCBwYXJhbXMubk91dHB1dHMgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcG9zaXRpdmUgbk91dHB1dHMnKTtcbiAgfVxuXG4gIC8vIFRoZSBzaXplIG9mIGFuIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5IGlzIDMyIGJ5dGVzIG1vcmUgdGhhbiB0aGUgY29tcHJlc3NlZCBrZXksXG4gIC8vIGFuZCBoZW5jZSwgbmVlZHMgdG8gYmUgYWNjb3VudGVkIGZvciBpbiB0aGUgdHJhbnNhY3Rpb24gc2l6ZSBlc3RpbWF0aW9uLlxuICBjb25zdCB1bmNvbXByZXNzZWRQdWJsaWNLZXlzVHJpcGxlQ29ycmVjdGlvbkZhY3RvciA9IDMyICogMztcblxuICByZXR1cm4gKFxuICAgIC8vIFRoaXMgaXMgbm90IHF1aXRlIGFjY3VyYXRlIC0gaWYgdGhlcmUgaXMgYSBtaXggb2YgaW5wdXRzIHNjcmlwdHMgd2hlcmUgc29tZSB1c2VkXG4gICAgLy8gY29tcHJlc3NlZCBrZXlzIGFuZCBzb21lIHVzZWQgdW5jb21wcmVzc2VkIGtleXMsIHdlIHdvdWxkIG92ZXJlc3RpbWF0ZSB0aGUgc2l6ZS5cbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIG1peGVkIGlucHV0IHNldHMsIHRoaXMgc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZSBpbiBwcmFjdGljZS5cbiAgICAoVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSArXG4gICAgICAocGFyYW1zLmNvbnRhaW5zVW5jb21wcmVzc2VkUHVibGljS2V5cyA/IHVuY29tcHJlc3NlZFB1YmxpY0tleXNUcmlwbGVDb3JyZWN0aW9uRmFjdG9yIDogMCkpICpcbiAgICAgIHBhcmFtcy5uUDJzaElucHV0cyArXG4gICAgVmlydHVhbFNpemVzLnR4UDJzaFAyd3NoSW5wdXRTaXplICogKHBhcmFtcy5uUDJzaFAyd3NoSW5wdXRzIHx8IDApICtcbiAgICBWaXJ0dWFsU2l6ZXMudHhQMnBraElucHV0U2l6ZVVuY29tcHJlc3NlZEtleSAqIChwYXJhbXMublAycGtoSW5wdXRzIHx8IDApICtcbiAgICBWaXJ0dWFsU2l6ZXMudHhQMnBraE91dHB1dFNpemUgKiBwYXJhbXMubk91dHB1dHMgK1xuICAgIC8vIGlmIHRoZSB0eCBjb250YWlucyBhdCBsZWFzdCBvbmUgc2Vnd2l0IGlucHV0LCB0aGUgdHggb3ZlcmhlYWQgaXMgaW5jcmVhc2VkIGJ5IDFcbiAgICBWaXJ0dWFsU2l6ZXMudHhPdmVyaGVhZFNpemUgK1xuICAgIChwYXJhbXMublAyc2hQMndzaElucHV0cyA+IDAgPyAxIDogMClcbiAgKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBmZWUgYW5kIGVzdGltYXRlZCBzaXplIGluIGJ5dGVzIGZvciBhIHRyYW5zYWN0aW9uLlxuICogQHBhcmFtcyBwYXJhbXMge1xuICogICBiaXRnbzogYml0Z28gb2JqZWN0XG4gKiAgIGZlZVJhdGU6IHNhdG9zaGlzIHBlciBraWxvYnl0ZVxuICogICBuUDJzaElucHV0czogbnVtYmVyIG9mIFAyU0ggKG11bHRpc2lnKSBpbnB1dHNcbiAqICAgblAycGtoSW5wdXRzOiBudW1iZXIgb2YgUDJQS0ggKHNpbmdsZSBzaWcpIGlucHV0c1xuICogICBuT3V0cHV0czogbnVtYmVyIG9mIG91dHB1dHNcbiAqIH1cbiAqXG4gKiBAcmV0dXJucyB7XG4gKiAgIHNpemU6IGVzdGltYXRlZCBzaXplIG9mIHRoZSB0cmFuc2FjdGlvbiBpbiBieXRlc1xuICogICBmZWU6IGVzdGltYXRlZCBmZWUgaW4gc2F0b3NoaXMgZm9yIHRoZSB0cmFuc2FjdGlvblxuICogICBmZWVSYXRlOiBmZWUgcmF0ZSB0aGF0IHdhcyB1c2VkIHRvIGVzdGltYXRlIHRoZSBmZWUgZm9yIHRoZSB0cmFuc2FjdGlvblxuICogfVxuICovXG5leHBvcnRzLmNhbGN1bGF0ZU1pbmVyRmVlSW5mbyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgY29uc3QgZmVlUmF0ZVRvVXNlID0gcGFyYW1zLmZlZVJhdGUgfHwgcGFyYW1zLmJpdGdvLmdldENvbnN0YW50cygpLmZhbGxiYWNrRmVlUmF0ZTtcbiAgY29uc3QgZXN0aW1hdGVkU2l6ZSA9IGVzdGltYXRlVHJhbnNhY3Rpb25TaXplKHBhcmFtcyk7XG5cbiAgcmV0dXJuIHtcbiAgICBzaXplOiBlc3RpbWF0ZWRTaXplLFxuICAgIGZlZTogTWF0aC5jZWlsKChlc3RpbWF0ZWRTaXplICogZmVlUmF0ZVRvVXNlKSAvIDEwMDApLFxuICAgIGZlZVJhdGU6IGZlZVJhdGVUb1VzZSxcbiAgfTtcbn07XG5cbi8qXG4gKiBHaXZlbiBhIHRyYW5zYWN0aW9uIGhleCwgdW5zcGVudCBpbmZvcm1hdGlvbiAoY2hhaW4gcGF0aCBhbmQgcmVkZWVtIHNjcmlwdHMpLCBhbmQgdGhlIGtleWNoYWluIHhwcnYsXG4gKiBwZXJmb3JtIGtleSBkZXJpdmF0aW9uIGFuZCBzaWduIHRoZSBpbnB1dHMgaW4gdGhlIHRyYW5zYWN0aW9uIGJhc2VkIG9uIHRoZSB1bnNwZW50IGluZm9ybWF0aW9uIHByb3ZpZGVkXG4gKlxuICogQHBhcmFtczpcbiAqICB0cmFuc2FjdGlvbkhleCBzZXJpYWxpemVkIGZvcm0gb2YgdGhlIHRyYW5zYWN0aW9uIGluIGhleFxuICogIHVuc3BlbnRzIGFycmF5IG9mIHVuc3BlbnQgaW5mb3JtYXRpb24sIHdoZXJlIGVhY2ggdW5zcGVudCBpcyBhIGNoYWluUGF0aCBhbmQgcmVkZWVtU2NyaXB0IHdpdGggdGhlIHNhbWVcbiAqICBpbmRleCBhcyB0aGUgaW5wdXRzIGluIHRoZSB0cmFuc2FjdGlvbkhleFxuICogIGtleWNoYWluIEtleWNoYWluIGNvbnRhaW5pbmcgdGhlIHhwcnYgdG8gc2lnbiB3aXRoLiBGb3IgbGVnYWN5IHN1cHBvcnQgb2Ygc2FmZSB3YWxsZXRzLCBrZXljaGFpbiBjYW5cbiBhbHNvIGJlIGEgV0lGIHByaXZhdGUga2V5LlxuICogIHNpZ25pbmdLZXkgcHJpdmF0ZSBrZXkgaW4gV0lGIGZvciBzYWZlIHdhbGxldHMsIHdoZW4ga2V5Y2hhaW4gaXMgdW5hdmFpbGFibGVcbiAqICB2YWxpZGF0ZSBjbGllbnQtc2lkZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIC0gY2FuIGJlIGRpc2FibGVkIGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSAoc2lnbmF0dXJlc1xuICogICAgICAgICAgIGFyZSBzdGlsbCB2YWxpZGF0ZWQgc2VydmVyLXNpZGUpLlxuICogIGZlZVNpbmdsZUtleVdJRiBVc2UgdGhlIGFkZHJlc3MgYmFzZWQgb24gdGhpcyBwcml2YXRlIGtleSB0byBwYXkgZmVlc1xuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydHMuc2lnblRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBsZXQga2V5Y2hhaW4gPSBwYXJhbXMua2V5Y2hhaW47IC8vIGR1cGxpY2F0ZSBzbyBhcyB0byBub3QgbXV0YXRlIGJlbG93XG5cbiAgY29uc3QgdmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMudmFsaWRhdGU7XG4gIGxldCBwcml2S2V5O1xuICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnRyYW5zYWN0aW9uSGV4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHRoZSB0cmFuc2FjdGlvbiBoZXggYXMgYSBzdHJpbmcnKTtcbiAgfVxuICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnVuc3BlbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHRoZSB1bnNwZW50cyBhcnJheScpO1xuICB9XG4gIGlmICghXy5pc0Jvb2xlYW4odmFsaWRhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgdmFsaWRhdGUgdG8gYmUgYSBib29sZWFuJyk7XG4gIH1cbiAgbGV0IG5ldHdvcmsgPSBnZXROZXR3b3JrKCk7XG4gIGNvbnN0IGVuYWJsZUJDSCA9IF8uaXNCb29sZWFuKHBhcmFtcy5mb3JjZUJDSCkgJiYgcGFyYW1zLmZvcmNlQkNIID09PSB0cnVlO1xuXG4gIGlmICghXy5pc09iamVjdChrZXljaGFpbikgfHwgIV8uaXNTdHJpbmcoKGtleWNoYWluIGFzIGFueSkueHBydikpIHtcbiAgICBpZiAoXy5pc1N0cmluZyhwYXJhbXMuc2lnbmluZ0tleSkpIHtcbiAgICAgIHByaXZLZXkgPSB1dHhvbGliLkVDUGFpci5mcm9tV0lGKHBhcmFtcy5zaWduaW5nS2V5LCBuZXR3b3JrIGFzIHV0eG9saWIuQml0Y29pbkpTTmV0d29yayk7XG4gICAgICBrZXljaGFpbiA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgdGhlIGtleWNoYWluIG9iamVjdCB3aXRoIHhwcnYnKTtcbiAgICB9XG4gIH1cblxuICBsZXQgZmVlU2luZ2xlS2V5O1xuICBpZiAocGFyYW1zLmZlZVNpbmdsZUtleVdJRikge1xuICAgIGZlZVNpbmdsZUtleSA9IHV0eG9saWIuRUNQYWlyLmZyb21XSUYocGFyYW1zLmZlZVNpbmdsZUtleVdJRiwgbmV0d29yayBhcyB1dHhvbGliLkJpdGNvaW5KU05ldHdvcmspO1xuICB9XG5cbiAgZGVidWcoJ05ldHdvcms6ICVPJywgbmV0d29yayk7XG5cbiAgaWYgKGVuYWJsZUJDSCkge1xuICAgIGRlYnVnKCdFbmFibGluZyBCQ0jigKYnKTtcbiAgICBuZXR3b3JrID0gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luY2FzaDtcbiAgICBkZWJ1ZygnTmV3IG5ldHdvcms6ICVPJywgbmV0d29yayk7XG4gIH1cblxuICBjb25zdCB0cmFuc2FjdGlvbiA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHBhcmFtcy50cmFuc2FjdGlvbkhleCwgbmV0d29yayk7XG4gIGlmICh0cmFuc2FjdGlvbi5pbnMubGVuZ3RoICE9PSBwYXJhbXMudW5zcGVudHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggb2YgdW5zcGVudHMgYXJyYXkgc2hvdWxkIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb24gaW5wdXRzJyk7XG4gIH1cblxuICAvLyBkZWNvcmF0ZSB0cmFuc2FjdGlvbiB3aXRoIGlucHV0IHZhbHVlcyBmb3IgVHJhbnNhY3Rpb25CdWlsZGVyIGluc3RhbnRpYXRpb25cbiAgY29uc3QgaXNVdHhvVHggPSBfLmlzT2JqZWN0KHRyYW5zYWN0aW9uKSAmJiBBcnJheS5pc0FycmF5KCh0cmFuc2FjdGlvbiBhcyBhbnkpLmlucyk7XG4gIGNvbnN0IGFyZVZhbGlkVW5zcGVudHMgPSBfLmlzT2JqZWN0KHBhcmFtcykgJiYgQXJyYXkuaXNBcnJheSgocGFyYW1zIGFzIGFueSkudW5zcGVudHMpO1xuICBpZiAoaXNVdHhvVHggJiYgYXJlVmFsaWRVbnNwZW50cykge1xuICAgIC8vIGV4dGVuZCB0aGUgdHJhbnNhY3Rpb24gaW5wdXRzIHdpdGggdGhlIHZhbHVlc1xuICAgIGNvbnN0IGlucHV0VmFsdWVzID0gXy5tYXAoKHBhcmFtcyBhcyBhbnkpLnVuc3BlbnRzLCAodSkgPT4gXy5waWNrKHUsICd2YWx1ZScpKTtcbiAgICB0cmFuc2FjdGlvbi5pbnMubWFwKChjdXJyZW50SXRlbSwgaW5kZXgpID0+IF8uZXh0ZW5kKGN1cnJlbnRJdGVtLCBpbnB1dFZhbHVlc1tpbmRleF0pKTtcbiAgfVxuXG4gIGxldCByb290RXh0S2V5O1xuICBpZiAoa2V5Y2hhaW4pIHtcbiAgICByb290RXh0S2V5ID0gYmlwMzIuZnJvbUJhc2U1OChrZXljaGFpbi54cHJ2KTtcbiAgfVxuXG4gIGNvbnN0IHR4YiA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25CdWlsZGVyRnJvbVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdHhiLnR4Lmlucy5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICBjb25zdCBjdXJyZW50VW5zcGVudCA9IHBhcmFtcy51bnNwZW50c1tpbmRleF07XG4gICAgaWYgKGN1cnJlbnRVbnNwZW50LnJlZGVlbVNjcmlwdCA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIHRoaXMgaXMgdGhlIGlucHV0IGZyb20gYSBzaW5nbGUga2V5IGZlZSBhZGRyZXNzXG4gICAgICBpZiAoIWZlZVNpbmdsZUtleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpbmdsZSBrZXkgYWRkcmVzcyB1c2VkIGluIGlucHV0IGJ1dCBmZWVTaW5nbGVLZXlXSUYgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVCQ0gpIHtcbiAgICAgICAgZmVlU2luZ2xlS2V5Lm5ldHdvcmsgPSBuZXR3b3JrO1xuICAgICAgfVxuXG4gICAgICB0eGIuc2lnbihpbmRleCwgZmVlU2luZ2xlS2V5KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50VW5zcGVudC53aXRuZXNzU2NyaXB0ICYmIGVuYWJsZUJDSCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCQ0ggZG9lcyBub3Qgc3VwcG9ydCBzZWd3aXQgaW5wdXRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhaW5QYXRoID0gY3VycmVudFVuc3BlbnQuY2hhaW5QYXRoO1xuICAgIGlmIChyb290RXh0S2V5KSB7XG4gICAgICBjb25zdCB7IHdhbGxldFN1YlBhdGggPSAnLzAvMCcgfSA9IGtleWNoYWluO1xuICAgICAgY29uc3QgcGF0aCA9IHNhbml0aXplTGVnYWN5UGF0aChrZXljaGFpbi5wYXRoICsgd2FsbGV0U3ViUGF0aCArIGNoYWluUGF0aCk7XG4gICAgICBkZWJ1ZyhcbiAgICAgICAgJ2Rlcml2ZWQgdXNlciBrZXkgcGF0aCBcIiVzXCIgdXNpbmcga2V5Y2hhaW4gcGF0aCBcIiVzXCIsIHdhbGxldFN1YlBhdGggXCIlc1wiLCBrZXljaGFpbiB3YWxsZXRTdWJQYXRoIFwiJXNcIiBhbmQgY2hhaW5QYXRoIFwiJXNcIicsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGtleWNoYWluLnBhdGgsXG4gICAgICAgIHdhbGxldFN1YlBhdGgsXG4gICAgICAgIGtleWNoYWluLndhbGxldFN1YlBhdGgsXG4gICAgICAgIGNoYWluUGF0aFxuICAgICAgKTtcbiAgICAgIHByaXZLZXkgPSByb290RXh0S2V5LmRlcml2ZVBhdGgocGF0aCk7XG4gICAgfVxuXG4gICAgcHJpdktleS5uZXR3b3JrID0gbmV0d29yaztcblxuICAgIC8vIHN1YnNjcmlwdCBpcyB0aGUgcGFydCBvZiB0aGUgb3V0cHV0IHNjcmlwdCBhZnRlciB0aGUgT1BfQ09ERVNFUEFSQVRPUi5cbiAgICAvLyBTaW5jZSB3ZSBhcmUgb25seSBldmVyIHNpZ25pbmcgcDJzaCBvdXRwdXRzLCB3aGljaCBkbyBub3QgaGF2ZVxuICAgIC8vIE9QX0NPREVTRVBBUkFUT1JTLCBpdCBpcyBhbHdheXMgdGhlIG91dHB1dCBzY3JpcHQuXG4gICAgY29uc3Qgc3Vic2NyaXB0ID0gQnVmZmVyLmZyb20oY3VycmVudFVuc3BlbnQucmVkZWVtU2NyaXB0LCAnaGV4Jyk7XG4gICAgY3VycmVudFVuc3BlbnQudmFsaWRhdGlvblNjcmlwdCA9IHN1YnNjcmlwdDtcblxuICAgIC8vIEluIG9yZGVyIHRvIHNpZ24gd2l0aCBiaXRjb2luanMtbGliLCB3ZSBtdXN0IHVzZSBpdHMgdHJhbnNhY3Rpb25cbiAgICAvLyBidWlsZGVyLCBjb25mdXNpbmdseSBuYW1lZCB0aGUgc2FtZSBleGFjdCB0aGluZyBhcyBvdXIgdHJhbnNhY3Rpb25cbiAgICAvLyBidWlsZGVyLCBidXQgd2l0aCBpbmVxdWl2YWxlbnQgYmVoYXZpb3IuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdpdG5lc3NTY3JpcHQgPSBjdXJyZW50VW5zcGVudC53aXRuZXNzU2NyaXB0ID8gQnVmZmVyLmZyb20oY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdCwgJ2hleCcpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc2lnSGFzaCA9IHV0eG9saWIuYml0Z28uZ2V0RGVmYXVsdFNpZ0hhc2gobmV0d29yayk7XG4gICAgICB0eGIuc2lnbihpbmRleCwgcHJpdktleSwgc3Vic2NyaXB0LCBzaWdIYXNoLCBjdXJyZW50VW5zcGVudC52YWx1ZSwgd2l0bmVzc1NjcmlwdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gdHJ5IGZhbGxiYWNrIGRlcml2YXRpb24gcGF0aCAoc2VlIEJHLTQ2NDk3KVxuICAgICAgbGV0IGZhbGxiYWNrU2lnbmluZ1N1Y2Nlc3NmdWwgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrUGF0aCA9IHNhbml0aXplTGVnYWN5UGF0aChrZXljaGFpbi5wYXRoICsgY2hhaW5QYXRoKTtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgJ2Rlcml2ZWQgZmFsbGJhY2sgdXNlciBrZXkgcGF0aCBcIiVzXCIgdXNpbmcga2V5Y2hhaW4gcGF0aCBcIiVzXCIgYW5kIGNoYWluUGF0aCBcIiVzXCInLFxuICAgICAgICAgIGZhbGxiYWNrUGF0aCxcbiAgICAgICAgICBrZXljaGFpbi5wYXRoLFxuICAgICAgICAgIGNoYWluUGF0aFxuICAgICAgICApO1xuICAgICAgICBwcml2S2V5ID0gcm9vdEV4dEtleS5kZXJpdmVQYXRoKGZhbGxiYWNrUGF0aCk7XG4gICAgICAgIGNvbnN0IHdpdG5lc3NTY3JpcHQgPSBjdXJyZW50VW5zcGVudC53aXRuZXNzU2NyaXB0XG4gICAgICAgICAgPyBCdWZmZXIuZnJvbShjdXJyZW50VW5zcGVudC53aXRuZXNzU2NyaXB0LCAnaGV4JylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2lnSGFzaCA9IHV0eG9saWIuYml0Z28uZ2V0RGVmYXVsdFNpZ0hhc2gobmV0d29yayk7XG4gICAgICAgIHR4Yi5zaWduKGluZGV4LCBwcml2S2V5LCBzdWJzY3JpcHQsIHNpZ0hhc2gsIGN1cnJlbnRVbnNwZW50LnZhbHVlLCB3aXRuZXNzU2NyaXB0KTtcbiAgICAgICAgZmFsbGJhY2tTaWduaW5nU3VjY2Vzc2Z1bCA9IHRydWU7XG4gICAgICB9IGNhdGNoIChmYWxsYmFja0Vycm9yKSB7XG4gICAgICAgIGRlYnVnKCdpbnB1dCBzaWduIGZhaWxlZCBmb3IgZmFsbGJhY2sgcGF0aDogJXMnLCBmYWxsYmFja0Vycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgLy8gd2UgbmVlZCB0byBrbm93IHdoYXQncyBjYXVzaW5nIHRoaXNcbiAgICAgIGlmICghZmFsbGJhY2tTaWduaW5nU3VjY2Vzc2Z1bCkge1xuICAgICAgICBlLnJlc3VsdCA9IHtcbiAgICAgICAgICB1bnNwZW50OiBjdXJyZW50VW5zcGVudCxcbiAgICAgICAgfTtcbiAgICAgICAgZS5tZXNzYWdlID0gYEZhaWxlZCB0byBzaWduIGlucHV0ICMke2luZGV4fSAtICR7ZS5tZXNzYWdlfSAtICR7SlNPTi5zdHJpbmdpZnkoZS5yZXN1bHQsIG51bGwsIDQpfSAtIFxcbiR7XG4gICAgICAgICAgZS5zdGFja1xuICAgICAgICB9YDtcbiAgICAgICAgZGVidWcoJ2lucHV0IHNpZ24gZmFpbGVkOiAlcycsIGUubWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBCbHVlYmlyZC5yZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFydGlhbFRyYW5zYWN0aW9uID0gdHhiLmJ1aWxkSW5jb21wbGV0ZSgpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIHBhcnRpYWxUcmFuc2FjdGlvbi5pbnMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzaWduYXR1cmVDb3VudCA9IHV0eG9saWIuYml0Z29cbiAgICAgICAgLmdldFNpZ25hdHVyZVZlcmlmaWNhdGlvbnMocGFydGlhbFRyYW5zYWN0aW9uLCBpbmRleCwgcGFyYW1zLnVuc3BlbnRzW2luZGV4XS52YWx1ZSlcbiAgICAgICAgLmZpbHRlcigodikgPT4gdi5zaWduZWRCeSAhPT0gdW5kZWZpbmVkKS5sZW5ndGg7XG4gICAgICBpZiAoc2lnbmF0dXJlQ291bnQgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgYXQgbGVhc3Qgb25lIHZhbGlkIHNpZ25hdHVyZScpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5mdWxsTG9jYWxTaWduaW5nICYmIHNpZ25hdHVyZUNvdW50IDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Z1bGxMb2NhbFNpZ25pbmcgc2V0OiBleHBlY3RlZCBhdCBsZWFzdCB0d28gdmFsaWQgc2lnbmF0dXJlcycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUoe1xuICAgIHRyYW5zYWN0aW9uSGV4OiBwYXJ0aWFsVHJhbnNhY3Rpb24udG9IZXgoKSxcbiAgfSk7XG59O1xuIl19
904
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7O0FBRUg7R0FDRztBQUNILEVBQUU7QUFDRixxQkFBcUI7QUFDckIsa0RBQWtEO0FBQ2xELEVBQUU7QUFDRixvREFBb0Q7QUFDcEQsRUFBRTtBQUVGLDhDQUF3QztBQUN4QyxxQ0FBcUM7QUFDckMsMkNBQTJDO0FBQzNDLDRCQUE0QjtBQUM1Qiw4Q0FBK0M7QUFDL0Msa0NBQW1DO0FBQ25DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN2Qyw4Q0FBMEY7QUF1QjFGLEVBQUU7QUFDRixxQkFBcUI7QUFDckIsV0FBVztBQUNYLDBDQUEwQztBQUMxQyw4TUFBOE07QUFDOU0sc0dBQXNHO0FBQ3RHLGtJQUFrSTtBQUNsSSw2SEFBNkg7QUFDN0gsdUdBQXVHO0FBQ3ZHLCtFQUErRTtBQUMvRSxxRUFBcUU7QUFDckUsNkVBQTZFO0FBQzdFLHdHQUF3RztBQUN4RyxpSUFBaUk7QUFDakksd0lBQXdJO0FBQ3hJLDRJQUE0STtBQUM1SSx1RUFBdUU7QUFDdkUsMkVBQTJFO0FBQzNFLDRGQUE0RjtBQUM1RixPQUFPLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxNQUFNO0lBQzFDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDeEUsSUFBSSxVQUFVLEdBQTZFLEVBQUUsQ0FBQztJQUM5RixJQUFJLFNBQVMsR0FBMEMsRUFBRSxDQUFDO0lBQzFELElBQUksa0JBQWtCLEdBQWEsRUFBRSxDQUFDO0lBQ3RDLElB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TSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtnQkFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO2FBQ2pGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUVELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUN0QixjQUFjLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFO0tBQzNDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5cbi8qKlxuICovXG4vL1xuLy8gVHJhbnNhY3Rpb25CdWlsZGVyXG4vLyBBIHV0aWxpdHkgZm9yIGJ1aWxkaW5nIGFuZCBzaWduaW5nIHRyYW5zYWN0aW9uc1xuLy9cbi8vIENvcHlyaWdodCAyMDE0LCBCaXRHbywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG5cbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIEJsdWViaXJkIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFZpcnR1YWxTaXplcyB9IGZyb20gJ0BiaXRnby91bnNwZW50cyc7XG5pbXBvcnQgZGVidWdMaWIgPSByZXF1aXJlKCdkZWJ1ZycpO1xuY29uc3QgZGVidWcgPSBkZWJ1Z0xpYignYml0Z286djE6dHhiJyk7XG5pbXBvcnQgeyBjb21tb24sIGdldEFkZHJlc3NQMlBLSCwgZ2V0TmV0d29yaywgc2FuaXRpemVMZWdhY3lQYXRoIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW50ZXJmYWNlIEJhc2VPdXRwdXQge1xuICBhbW91bnQ6IG51bWJlcjtcbiAgdHJhdmVsSW5mbz86IGFueTtcbn1cblxuaW50ZXJmYWNlIEFkZHJlc3NPdXRwdXQgZXh0ZW5kcyBCYXNlT3V0cHV0IHtcbiAgYWRkcmVzczogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2NyaXB0T3V0cHV0IGV4dGVuZHMgQmFzZU91dHB1dCB7XG4gIHNjcmlwdDogQnVmZmVyO1xufVxuXG50eXBlIE91dHB1dCA9IEFkZHJlc3NPdXRwdXQgfCBTY3JpcHRPdXRwdXQ7XG5cbmludGVyZmFjZSBCaXRHb1Vuc3BlbnQge1xuICB2YWx1ZTogbnVtYmVyO1xuICB0eF9oYXNoOiBCdWZmZXI7XG4gIHR4X291dHB1dF9uOiBudW1iZXI7XG59XG5cbi8vXG4vLyBUcmFuc2FjdGlvbkJ1aWxkZXJcbi8vIEBwYXJhbXM6XG4vLyAgIHdhbGxldDogIGEgd2FsbGV0IG9iamVjdCB0byBzZW5kIGZyb21cbi8vICAgcmVjaXBpZW50czogYXJyYXkgb2YgcmVjaXBpZW50IG9iamVjdHMgYW5kIHRoZSBhbW91bnQgdG8gc2VuZCB0byBlYWNoIGUuZy4gW3thZGRyZXNzOiAnMzhCS0ROWmJQY0xvZ3ZWYmN4MmVrSjlFNlZ2OTREcURxdycsIGFtb3VudDogMTUwMH0sIHthZGRyZXNzOiAnMzZlTDh5UXFDbjFITVJtVkZGbzQ5dDJQSjNwYWk4d1FhbScsIGFtb3VudDogMjAwMH1dXG4vLyAgIGZlZTogdGhlIGZlZSB0byB1c2Ugd2l0aCB0aGlzIHRyYW5zYWN0aW9uLiAgaWYgbm90IHByb3ZpZGVkLCBhIGRlZmF1bHQsIG1pbmltdW0gZmVlIHdpbGwgYmUgdXNlZC5cbi8vICAgZmVlUmF0ZTogdGhlIGFtb3VudCBvZiBmZWUgcGVyIGtpbG9ieXRlIC0gb3B0aW9uYWwgLSBzcGVjaWZ5IGVpdGhlciBmZWUsIGZlZVJhdGUsIG9yIGZlZVR4Q29uZmlybVRhcmdldCBidXQgbm90IG1vcmUgdGhhbiBvbmVcbi8vICAgZmVlVHhDb25maXJtVGFyZ2V0OiBjYWxjdWxhdGUgdGhlIGZlZXMgcGVyIGtpbG9ieXRlIHN1Y2ggdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb25maXJtZWQgaW4gdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4vLyAgIG1heEZlZVJhdGU6IFRoZSBtYXhpbXVtIGZlZSBwZXIga2IgdG8gdXNlIGluIHNhdG9zaGlzLCBmb3Igc2FmZXR5IHB1cnBvc2VzIHdoZW4gdXNpbmcgZHluYW1pYyBmZWVzXG4vLyAgIG1pbkNvbmZpcm1zOiB0aGUgbWluaW11bSBjb25maXJtYXRpb25zIGFuIG91dHB1dCBtdXN0IGhhdmUgYmVmb3JlIHNwZW5kaW5nXG4vLyAgIGZvcmNlQ2hhbmdlQXRFbmQ6IGZvcmNlIHRoZSBjaGFuZ2UgYWRkcmVzcyB0byBiZSB0aGUgbGFzdCBvdXRwdXRcbi8vICAgY2hhbmdlQWRkcmVzczogc3BlY2lmeSB0aGUgY2hhbmdlIGFkZHJlc3MgcmF0aGVyIHRoYW4gZ2VuZXJhdGUgYSBuZXcgb25lXG4vLyAgIG5vU3BsaXRDaGFuZ2U6IHNldCB0byB0cnVlIHRvIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuLy8gICB0YXJnZXRXYWxsZXRVbnNwZW50czogc3BlY2lmeSBhIG51bWJlciBvZiB0YXJnZXQgdW5zcGVudHMgdG8gbWFpbnRhaW4gaW4gdGhlIHdhbGxldCAoY3VycmVudGx5IGRlZmF1bHRlZCB0byA4IGJ5IHRoZSBzZXJ2ZXIpXG4vLyAgIHZhbGlkYXRlOiBleHRyYSB2ZXJpZmljYXRpb24gb2YgdGhlIGNoYW5nZSBhZGRyZXNzZXMsIHdoaWNoIGlzIGFsd2F5cyBkb25lIHNlcnZlci1zaWRlIGFuZCBpcyByZWR1bmRhbnQgY2xpZW50LXNpZGUgKGRlZmF1bHRzIHRydWUpXG4vLyAgIG1pblVuc3BlbnRTaXplOiBUaGUgbWluaW11bSBzaXplIGluIHNhdG9zaGlzIG9mIHVuc3BlbnQgdG8gdXNlICh0byBwcmV2ZW50IHNwZW5kaW5nIHVuc3BlbnRzIHdvcnRoIGxlc3MgdGhhbiBmZWUgYWRkZWQpLiBEZWZhdWx0cyB0byAwLlxuLy8gICBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzOiBVc2UgdGhpcyBzaW5nbGUga2V5IGFkZHJlc3MgdG8gcGF5IGZlZXNcbi8vICAgZmVlU2luZ2xlS2V5V0lGOiBVc2UgdGhlIGFkZHJlc3MgYmFzZWQgb24gdGhpcyBwcml2YXRlIGtleSB0byBwYXkgZmVlc1xuLy8gICB1bnNwZW50c0ZldGNoUGFyYW1zOiBFeHRyYSBwYXJhbWV0ZXJzIHRvIHVzZSBmb3IgZmV0Y2hpbmcgdW5zcGVudHMgZm9yIHRoaXMgdHJhbnNhY3Rpb25cbmV4cG9ydHMuY3JlYXRlVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGNvbnN0IG1pbkNvbmZpcm1zID0gcGFyYW1zLm1pbkNvbmZpcm1zIHx8IDA7XG4gIGNvbnN0IHZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnZhbGlkYXRlO1xuICBsZXQgcmVjaXBpZW50czogeyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogbnVtYmVyOyBzY3JpcHQ/OiBzdHJpbmc7IHRyYXZlbEluZm8/OiBhbnkgfVtdID0gW107XG4gIGxldCBvcFJldHVybnM6IHsgbWVzc2FnZTogc3RyaW5nOyBhbW91bnQ6IG51bWJlciB9W10gPSBbXTtcbiAgbGV0IGV4dHJhQ2hhbmdlQW1vdW50czogbnVtYmVyW10gPSBbXTtcbiAgbGV0IGVzdFR4U2l6ZTogbnVtYmVyO1xuICBsZXQgdHJhdmVsSW5mb3M7XG5cbiAgLy8gU2FuaXR5IGNoZWNrIHRoZSBhcmd1bWVudHMgcGFzc2VkIGluXG4gIGlmIChcbiAgICAhXy5pc09iamVjdChwYXJhbXMud2FsbGV0KSB8fFxuICAgIChwYXJhbXMuZmVlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWUpKSB8fFxuICAgIChwYXJhbXMuZmVlUmF0ZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkpIHx8XG4gICAgIV8uaXNJbnRlZ2VyKG1pbkNvbmZpcm1zKSB8fFxuICAgIChwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmZvcmNlQ2hhbmdlQXRFbmQpKSB8fFxuICAgIChwYXJhbXMuY2hhbmdlQWRkcmVzcyAmJiAhXy5pc1N0cmluZyhwYXJhbXMuY2hhbmdlQWRkcmVzcykpIHx8XG4gICAgKHBhcmFtcy5ub1NwbGl0Q2hhbmdlICYmICFfLmlzQm9vbGVhbihwYXJhbXMubm9TcGxpdENoYW5nZSkpIHx8XG4gICAgKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAmJiAhXy5pc0ludGVnZXIocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzKSkgfHxcbiAgICAodmFsaWRhdGUgJiYgIV8uaXNCb29sZWFuKHZhbGlkYXRlKSkgfHxcbiAgICAocGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSkpIHx8XG4gICAgKHBhcmFtcy5taW5VbnNwZW50U2l6ZSAmJiAhXy5pc051bWJlcihwYXJhbXMubWluVW5zcGVudFNpemUpKSB8fFxuICAgIChwYXJhbXMubWF4RmVlUmF0ZSAmJiAhXy5pc051bWJlcihwYXJhbXMubWF4RmVlUmF0ZSkpIHx8XG4gICAgLy8gdGhpcyBzaG91bGQgYmUgYW4gYXJyYXkgYW5kIGl0cyBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAxXG4gICAgKHBhcmFtcy51bnNwZW50cyAmJiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnVuc3BlbnRzKSB8fCBwYXJhbXMudW5zcGVudHMubGVuZ3RoIDwgMSkpIHx8XG4gICAgKHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQpKSB8fFxuICAgIChwYXJhbXMuaW5zdGFudCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB8fFxuICAgIChwYXJhbXMuYml0Z29GZWUgJiYgIV8uaXNPYmplY3QocGFyYW1zLmJpdGdvRmVlKSkgfHxcbiAgICAocGFyYW1zLnVuc3BlbnRzRmV0Y2hQYXJhbXMgJiYgIV8uaXNPYmplY3QocGFyYW1zLnVuc3BlbnRzRmV0Y2hQYXJhbXMpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgfVxuXG4gIGNvbnN0IGJpdGdvID0gcGFyYW1zLndhbGxldC5iaXRnbztcbiAgY29uc3QgY29uc3RhbnRzID0gYml0Z28uZ2V0Q29uc3RhbnRzKCk7XG4gIGNvbnN0IG5ldHdvcmsgPSBnZXROZXR3b3JrKGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldLm5ldHdvcmspO1xuXG4gIC8vIFRoZSB1c2VyIGNhbiBzcGVjaWZ5IGEgc2VwZXJhdGUsIHNpbmdsZS1rZXkgd2FsbGV0IGZvciB0aGUgcHVycG9zZXMgb2YgcGF5aW5nIG1pbmVyJ3MgZmVlc1xuICAvLyBXaGVuIGNyZWF0aW5nIGEgdHJhbnNhY3Rpb24gdGhpcyBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIGlucHV0IGFkZHJlc3Mgb3IgdGhlIHByaXZhdGUga2V5IGluIFdJRlxuICBsZXQgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcztcbiAgbGV0IGZlZVNpbmdsZUtleUlucHV0QW1vdW50ID0gMDtcbiAgaWYgKHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHV0eG9saWIuYWRkcmVzcy5mcm9tQmFzZTU4Q2hlY2socGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MsIG5ldHdvcmspO1xuICAgICAgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA9IHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiaXRjb2luIGFkZHJlc3M6ICcgKyBwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBhcmFtcy5mZWVTaW5nbGVLZXlXSUYpIHtcbiAgICBjb25zdCBmZWVTaW5nbGVLZXkgPSB1dHhvbGliLkVDUGFpci5mcm9tV0lGKHBhcmFtcy5mZWVTaW5nbGVLZXlXSUYsIG5ldHdvcmsgYXMgdXR4b2xpYi5CaXRjb2luSlNOZXR3b3JrKTtcbiAgICBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID0gZ2V0QWRkcmVzc1AyUEtIKGZlZVNpbmdsZUtleSk7XG4gICAgLy8gSWYgdGhlIHVzZXIgc3BlY2lmaWVzIGJvdGgsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyBjb3JyZXNwb25kcyB0byB0aGUgYWRkcmVzcyBvZiBmZWVTaW5nbGVLZXlXSUZcbiAgICBpZiAocGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgJiYgcGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgIT09IGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2ZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3M6ICcgK1xuICAgICAgICAgIHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzICtcbiAgICAgICAgICAnIGRpZCBub3QgY29ycmVzcG9uZCB0byBhZGRyZXNzIG9mIGZlZVNpbmdsZUtleVdJRjogJyArXG4gICAgICAgICAgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZWNpcGllbnRzIG11c3QgYmUgYXJyYXkgb2YgeyBhZGRyZXNzOiBhYmMsIGFtb3VudDogMTAwMDAwIH0gb2JqZWN0cycpO1xuICB9XG5cbiAgbGV0IGZlZVBhcmFtc0RlZmluZWQgPSAwO1xuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZSkpIHtcbiAgICBmZWVQYXJhbXNEZWZpbmVkKys7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVJhdGUpKSB7XG4gICAgZmVlUGFyYW1zRGVmaW5lZCsrO1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQpKSB7XG4gICAgZmVlUGFyYW1zRGVmaW5lZCsrO1xuICB9XG5cbiAgaWYgKGZlZVBhcmFtc0RlZmluZWQgPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIG9mIGZlZSwgZmVlUmF0ZSBhbmQgZmVlVHhDb25maXJtVGFyZ2V0Jyk7XG4gIH1cblxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMubWF4RmVlUmF0ZSkpIHtcbiAgICBwYXJhbXMubWF4RmVlUmF0ZSA9IGNvbnN0YW50cy5tYXhGZWVSYXRlO1xuICB9XG5cbiAgLy8gQ29udmVydCB0aGUgb2xkIGZvcm1hdCBvZiBwYXJhbXMucmVjaXBpZW50cyAoZGljdGlvbmFyeSBvZiBhZGRyZXNzOmFtb3VudCkgdG8gbmV3IGZvcm1hdDogeyBkZXN0aW5hdGlvbkFkZHJlc3MsIGFtb3VudCB9XG4gIGlmICghKHBhcmFtcy5yZWNpcGllbnRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgcmVjaXBpZW50cyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKHBhcmFtcy5yZWNpcGllbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChkZXN0aW5hdGlvbkFkZHJlc3MpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9IHBhcmFtcy5yZWNpcGllbnRzW2Rlc3RpbmF0aW9uQWRkcmVzc107XG4gICAgICByZWNpcGllbnRzLnB1c2goeyBhZGRyZXNzOiBkZXN0aW5hdGlvbkFkZHJlc3MsIGFtb3VudDogYW1vdW50IH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJlY2lwaWVudHMgPSBwYXJhbXMucmVjaXBpZW50cztcbiAgfVxuXG4gIGlmIChwYXJhbXMub3BSZXR1cm5zKSB7XG4gICAgaWYgKCEocGFyYW1zLm9wUmV0dXJucyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgb3BSZXR1cm5zID0gW107XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMub3BSZXR1cm5zKS5mb3JFYWNoKGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9IHBhcmFtcy5vcFJldHVybnNbbWVzc2FnZV07XG4gICAgICAgIG9wUmV0dXJucy5wdXNoKHsgbWVzc2FnZSwgYW1vdW50IH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wUmV0dXJucyA9IHBhcmFtcy5vcFJldHVybnM7XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlY2lwaWVudHMubGVuZ3RoID09PSAwICYmIG9wUmV0dXJucy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcmVjaXBpZW50Jyk7XG4gIH1cblxuICBsZXQgZmVlID0gcGFyYW1zLmZlZTtcbiAgbGV0IGZlZVJhdGUgPSBwYXJhbXMuZmVlUmF0ZTtcblxuICAvLyBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGNsYXNzIHdpbGwgY29tcHV0ZSB0aGUgZmVlXG4gIGNvbnN0IHNob3VsZENvbXB1dGVCZXN0RmVlID0gXy5pc1VuZGVmaW5lZChmZWUpO1xuXG4gIGxldCB0b3RhbE91dHB1dEFtb3VudCA9IDA7XG5cbiAgcmVjaXBpZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICBpZiAoXy5pc1N0cmluZyhyZWNpcGllbnQuYWRkcmVzcykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHV0eG9saWIuYWRkcmVzcy5mcm9tQmFzZTU4Q2hlY2socmVjaXBpZW50LmFkZHJlc3MsIG5ldHdvcmspO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYml0Y29pbiBhZGRyZXNzOiAnICsgcmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcmVjaXBpZW50LnNjcmlwdCkge1xuICAgICAgICAvLyBBIHNjcmlwdCB3YXMgcHJvdmlkZWQgYXMgd2VsbCAtIHZhbGlkYXRlIHRoYXQgdGhlIGFkZHJlc3MgY29ycmVzcG9uZHMgdG8gdGhhdFxuICAgICAgICBpZiAodXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY2lwaWVudC5hZGRyZXNzLCBuZXR3b3JrKS50b1N0cmluZygnaGV4JykgIT09IHJlY2lwaWVudC5zY3JpcHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnYm90aCBzY3JpcHQgYW5kIGFkZHJlc3MgcHJvdmlkZWQgYnV0IHRoZXkgZGlkIG5vdCBtYXRjaDogJyArIHJlY2lwaWVudC5hZGRyZXNzICsgJyAnICsgcmVjaXBpZW50LnNjcmlwdFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFfLmlzSW50ZWdlcihyZWNpcGllbnQuYW1vdW50KSB8fCByZWNpcGllbnQuYW1vdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFtb3VudCBmb3IgJyArIHJlY2lwaWVudC5hZGRyZXNzICsgJzogJyArIHJlY2lwaWVudC5hbW91bnQpO1xuICAgIH1cbiAgICB0b3RhbE91dHB1dEFtb3VudCArPSByZWNpcGllbnQuYW1vdW50O1xuICB9KTtcblxuICBvcFJldHVybnMuZm9yRWFjaChmdW5jdGlvbiAob3BSZXR1cm4pIHtcbiAgICB0b3RhbE91dHB1dEFtb3VudCArPSBvcFJldHVybi5hbW91bnQ7XG4gIH0pO1xuXG4gIGxldCBiaXRnb0ZlZUluZm8gPSBwYXJhbXMuYml0Z29GZWU7XG4gIGlmIChiaXRnb0ZlZUluZm8gJiYgKCFfLmlzSW50ZWdlcihiaXRnb0ZlZUluZm8uYW1vdW50KSB8fCAhXy5pc1N0cmluZyhiaXRnb0ZlZUluZm8uYWRkcmVzcykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJpdGdvRmVlSW5mbycpO1xuICB9XG5cbiAgLy8gVGhlIHRvdGFsIGFtb3VudCBuZWVkZWQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gIGxldCB0b3RhbEFtb3VudCA9IHRvdGFsT3V0cHV0QW1vdW50ICsgKGZlZSB8fCAwKTtcblxuICAvLyBUaGUgbGlzdCBvZiB1bnNwZW50IHRyYW5zYWN0aW9ucyBiZWluZyB1c2VkIGluIHRoaXMgdHJhbnNhY3Rpb24uXG4gIGxldCB1bnNwZW50cztcblxuICAvLyB0aGUgdG90YWwgbnVtYmVyIG9mIHVuc3BlbnRzIG9uIHRoaXMgd2FsbGV0XG4gIGxldCB0b3RhbFVuc3BlbnRzQ291bnQ7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB1bnNwZW50cyB3ZSBmZXRjaGVkIGZyb20gdGhlIHNlcnZlciwgYmVmb3JlIGZpbHRlcmluZ1xuICBsZXQgZmV0Y2hlZFVuc3BlbnRzQ291bnQ7XG5cbiAgLy8gVGhlIGxpc3Qgb2YgdW5zcGVudCB0cmFuc2FjdGlvbnMgYmVpbmcgdXNlZCB3aXRoIHplcm8tY29uZmlybWF0aW9uc1xuICBsZXQgemVyb0NvbmZVbnNwZW50VHhJZHM7XG5cbiAgLy8gVGhlIHN1bSBvZiB0aGUgaW5wdXQgdmFsdWVzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICBsZXQgaW5wdXRBbW91bnQ7XG5cbiAgbGV0IGNoYW5nZU91dHB1dHM6IE91dHB1dFtdID0gW107XG5cbiAgbGV0IGNvbnRhaW5zVW5jb21wcmVzc2VkUHVibGljS2V5cyA9IGZhbHNlO1xuXG4gIC8vIFRoZSB0cmFuc2FjdGlvbi5cbiAgbGV0IHRyYW5zYWN0aW9uID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGb3JOZXR3b3JrKG5ldHdvcmspO1xuXG4gIGNvbnN0IGdldEJpdEdvRmVlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGJpdGdvRmVlSW5mbykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5nZXRCaXRHb0ZlZSh7IGFtb3VudDogdG90YWxPdXRwdXRBbW91bnQsIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50IH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5mZWUgPiAwKSB7XG4gICAgICAgICAgYml0Z29GZWVJbmZvID0ge1xuICAgICAgICAgICAgYW1vdW50OiByZXN1bHQuZmVlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGJpdGdvRmVlSW5mbyAmJiBiaXRnb0ZlZUluZm8uYW1vdW50ID4gMCkge1xuICAgICAgICB0b3RhbEFtb3VudCArPSBiaXRnb0ZlZUluZm8uYW1vdW50O1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGdldEJpdEdvRmVlQWRkcmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYml0Z29GZWVJbmZvLCBvciBhZGRyZXNzIGlzIGFscmVhZHkgc2V0LCBkb24ndCBnZXQgYSBuZXcgb25lXG4gICAgICBpZiAoIWJpdGdvRmVlSW5mbyB8fCBiaXRnb0ZlZUluZm8uYWRkcmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gYml0Z28uZ2V0Qml0R29GZWVBZGRyZXNzKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGJpdGdvRmVlSW5mby5hZGRyZXNzID0gcmVzdWx0LmFkZHJlc3M7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBHZXQgYSBkeW5hbWljIGZlZSBlc3RpbWF0ZSBmcm9tIHRoZSBCaXRHbyBzZXJ2ZXIgaWYgZmVlVHhDb25maXJtVGFyZ2V0XG4gIC8vIGlzIHNwZWNpZmllZCBvciBpZiBubyBmZWUtcmVsYXRlZCBwYXJhbXMgYXJlIHNwZWNpZmllZFxuICBjb25zdCBnZXREeW5hbWljRmVlUmF0ZUVzdGltYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IHx8ICFmZWVQYXJhbXNEZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYml0Z29cbiAgICAgICAgLmVzdGltYXRlRmVlKHtcbiAgICAgICAgICBudW1CbG9ja3M6IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQsXG4gICAgICAgICAgbWF4RmVlOiBwYXJhbXMubWF4RmVlUmF0ZSxcbiAgICAgICAgICBpbnB1dHM6IHplcm9Db25mVW5zcGVudFR4SWRzLFxuICAgICAgICAgIHR4U2l6ZTogZXN0VHhTaXplLFxuICAgICAgICAgIGNwZnBBd2FyZTogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZEZlZVJhdGUgPSByZXN1bHQuY3BmcEZlZVBlcktiO1xuICAgICAgICAgIGNvbnN0IG1pbmltdW0gPSBwYXJhbXMuaW5zdGFudFxuICAgICAgICAgICAgPyBNYXRoLm1heChjb25zdGFudHMubWluRmVlUmF0ZSwgY29uc3RhbnRzLm1pbkluc3RhbnRGZWVSYXRlKVxuICAgICAgICAgICAgOiBjb25zdGFudHMubWluRmVlUmF0ZTtcbiAgICAgICAgICAvLyA1IHNhdG9zaGlzIHBlciBieXRlXG4gICAgICAgICAgLy8gaXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIHBhZGRpbmcgb25seSBhcHBsaWVzIHdoZW4gdGhlIHRocmVzaG9sZCBpcyBjcm9zc2VkLCBidXQgbm90IHdoZW4gdGhlIGRlbHRhIGlzIGxlc3MgdGhhbiB0aGUgcGFkZGluZ1xuICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSA1MDAwO1xuICAgICAgICAgIGlmIChlc3RpbWF0ZWRGZWVSYXRlIDwgbWluaW11bSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIG5ldyBEYXRlKCkgK1xuICAgICAgICAgICAgICAgICc6IEVycm9yIHdoZW4gZXN0aW1hdGluZyBmZWUgZm9yIHNlbmQgZnJvbSAnICtcbiAgICAgICAgICAgICAgICBwYXJhbXMud2FsbGV0LmlkKCkgK1xuICAgICAgICAgICAgICAgICcsIGl0IHdhcyB0b28gbG93IC0gJyArXG4gICAgICAgICAgICAgICAgZXN0aW1hdGVkRmVlUmF0ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZlZVJhdGUgPSBtaW5pbXVtICsgcGFkZGluZztcbiAgICAgICAgICB9IGVsc2UgaWYgKGVzdGltYXRlZEZlZVJhdGUgPiBwYXJhbXMubWF4RmVlUmF0ZSkge1xuICAgICAgICAgICAgZmVlUmF0ZSA9IHBhcmFtcy5tYXhGZWVSYXRlIC0gcGFkZGluZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmVlUmF0ZSA9IGVzdGltYXRlZEZlZVJhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmZWVSYXRlO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAvLyBzYW5pdHkgY2hlY2sgZmFpbGVkIG9uIHR4IHNpemVcbiAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhlLm1lc3NhZ2UsICdpbnZhbGlkIHR4U2l6ZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gQmx1ZWJpcmQucmVqZWN0KGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjb3VsZG4ndCBlc3RpbWF0ZSB0aGUgZmVlLCBwcm9jZWVkIHVzaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICBmZWVSYXRlID0gY29uc3RhbnRzLmZhbGxiYWNrRmVlUmF0ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBlc3RpbWF0aW5nIGZlZSBmb3Igc2VuZCBmcm9tICcgKyBwYXJhbXMud2FsbGV0LmlkKCkgKyAnOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gR2V0IHRoZSB1bnNwZW50cyBmb3IgdGhlIHNlbmRpbmcgd2FsbGV0LlxuICBjb25zdCBnZXRVbnNwZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocGFyYW1zLnVuc3BlbnRzKSB7XG4gICAgICAvLyB3ZSBqdXN0IHdhbm5hIHVzZSBjdXN0b20gdW5zcGVudHNcbiAgICAgIHVuc3BlbnRzID0gcGFyYW1zLnVuc3BlbnRzO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCBlbm91Z2ggdW5zcGVudHMgZm9yIHRoZSByZXF1ZXN0ZWQgYW1vdW50XG4gICAgY29uc3Qgb3B0aW9ucyA9IF8ubWVyZ2Uoe30sIHBhcmFtcy51bnNwZW50c0ZldGNoUGFyYW1zIHx8IHt9LCB7XG4gICAgICB0YXJnZXQ6IHRvdGFsQW1vdW50LFxuICAgICAgbWluU2l6ZTogcGFyYW1zLm1pblVuc3BlbnRTaXplIHx8IDAsXG4gICAgICBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCwgLy8gaW5zaXN0IG9uIGluc3RhbnQgdW5zcGVudHMgb25seVxuICAgICAgdGFyZ2V0V2FsbGV0VW5zcGVudHM6IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyxcbiAgICB9KTtcbiAgICBpZiAocGFyYW1zLmluc3RhbnQpIHtcbiAgICAgIG9wdGlvbnMuaW5zdGFudCA9IHBhcmFtcy5pbnN0YW50OyAvLyBpbnNpc3Qgb24gaW5zdGFudCB1bnNwZW50cyBvbmx5XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcy53YWxsZXQudW5zcGVudHNQYWdlZChvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgVW5zcGVudHMgZmV0Y2hlZFxcbjogICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0cywgbnVsbCwgMil9YCk7XG4gICAgICB0b3RhbFVuc3BlbnRzQ291bnQgPSByZXN1bHRzLnRvdGFsO1xuICAgICAgZmV0Y2hlZFVuc3BlbnRzQ291bnQgPSByZXN1bHRzLmNvdW50O1xuICAgICAgdW5zcGVudHMgPSByZXN1bHRzLnVuc3BlbnRzLmZpbHRlcihmdW5jdGlvbiAodSkge1xuICAgICAgICBjb25zdCBjb25maXJtcyA9IHUuY29uZmlybWF0aW9ucyB8fCAwO1xuICAgICAgICBpZiAoIXBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgJiYgdS5pc0NoYW5nZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25maXJtcyA+PSBtaW5Db25maXJtcztcbiAgICAgIH0pO1xuXG4gICAgICAvLyBhYm9ydCBlYXJseSBpZiB0aGVyZSdzIG5vIHZpYWJsZSB1bnNwZW50cywgYmVjYXVzZSBpdCB3b24ndCBiZSBwb3NzaWJsZSB0byBjcmVhdGUgdGhlIHR4biBsYXRlclxuICAgICAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBFcnJvcignMCB1bnNwZW50cyBhdmFpbGFibGUgZm9yIHRyYW5zYWN0aW9uIGNyZWF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNyZWF0ZSBhcnJheSBvZiB1bmNvbmZpcm1lZCB1bnNwZW50IElEIHN0cmluZ3Mgb2YgdGhlIGZvcm0gXCJ0eEhhc2g6b3V0cHV0SW5kZXhcIlxuICAgICAgemVyb0NvbmZVbnNwZW50VHhJZHMgPSBfKHJlc3VsdHMudW5zcGVudHMpXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICByZXR1cm4gIXUuY29uZmlybWF0aW9ucztcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcChmdW5jdGlvbiAodSkge1xuICAgICAgICAgIHJldHVybiB1LnR4X2hhc2ggKyAnOicgKyB1LnR4X291dHB1dF9uO1xuICAgICAgICB9KVxuICAgICAgICAudmFsdWUoKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoemVyb0NvbmZVbnNwZW50VHhJZHMpKSB7XG4gICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gcGFzcyBhbiBlbXB0eSBhcnJheSBvZiBpbnB1dHMgdG8gdGhlIHNlcnZlciwgYmVjYXVzZSBpdCBhc3N1bWVzIGlmIHRoZVxuICAgICAgICAvLyBpbnB1dHMgYXJndW1lbnRzIGV4aXN0cywgaXQgY29udGFpbnMgdmFsdWVzXG4gICAgICAgIHplcm9Db25mVW5zcGVudFR4SWRzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHJlc3BlY3QgdGhlIG9sZCBzcGxpdENoYW5nZVNpemU9MCBwYXJhbWV0ZXJcbiAgICAgIGlmICghcGFyYW1zLm5vU3BsaXRDaGFuZ2UgJiYgcGFyYW1zLnNwbGl0Q2hhbmdlU2l6ZSAhPT0gMCkge1xuICAgICAgICBleHRyYUNoYW5nZUFtb3VudHMgPSByZXN1bHRzLmV4dHJhQ2hhbmdlQW1vdW50cyB8fCBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyBHZXQgdGhlIHVuc3BlbnRzIGZvciB0aGUgc2luZ2xlIGtleSBmZWUgYWRkcmVzc1xuICBsZXQgZmVlU2luZ2xlS2V5VW5zcGVudHM6IEJpdEdvVW5zcGVudFtdID0gW107XG4gIGNvbnN0IGdldFVuc3BlbnRzRm9yU2luZ2xlS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICBsZXQgZmVlVGFyZ2V0ID0gMC4wMWU4O1xuICAgICAgaWYgKHBhcmFtcy5pbnN0YW50KSB7XG4gICAgICAgIGZlZVRhcmdldCArPSB0b3RhbEFtb3VudCAqIDAuMDAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJpdGdvXG4gICAgICAgIC5nZXQoYml0Z28udXJsKCcvYWRkcmVzcy8nICsgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyArICcvdW5zcGVudHM/dGFyZ2V0PScgKyBmZWVUYXJnZXQpKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keS50b3RhbCA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHVuc3BlbnRzIGF2YWlsYWJsZSBpbiBzaW5nbGUga2V5IGZlZSBzb3VyY2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHMgPSByZXNwb25zZS5ib2R5LnVuc3BlbnRzO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgbGV0IG1pbmVyRmVlSW5mbzogYW55ID0ge307XG4gIGxldCB0eEluZm86IGFueSA9IHt9O1xuXG4gIC8vIEl0ZXJhdGUgdW5zcGVudHMsIHN1bSB0aGUgaW5wdXRzLCBhbmQgc2F2ZSBfaW5wdXRzIHdpdGggdGhlIHRvdGFsXG4gIC8vIGlucHV0IGFtb3VudCBhbmQgZmluYWwgbGlzdCBvZiBpbnB1dHMgdG8gdXNlIHdpdGggdGhlIHRyYW5zYWN0aW9uLlxuICBsZXQgZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkOiBCaXRHb1Vuc3BlbnRbXSA9IFtdO1xuXG4gIGNvbnN0IGNvbGxlY3RJbnB1dHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF1bnNwZW50cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gdW5zcGVudHMgYXZhaWxhYmxlIG9uIHdhbGxldCcpO1xuICAgIH1cbiAgICBpbnB1dEFtb3VudCA9IDA7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGNvc3Qgb2Ygc3BlbmRpbmcgYSBzaW5nbGUgaW5wdXQsIGkuZS4gdGhlIHNtYWxsZXN0IGVjb25vbWljYWwgdW5zcGVudCB2YWx1ZVxuICAgIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpIHx8IF8uaXNOdW1iZXIocGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSkpIHtcbiAgICAgICAgcmV0dXJuICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVSYXRlKSA/IHBhcmFtcy5mZWVSYXRlIDogcGFyYW1zLm9yaWdpbmFsRmVlUmF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBiaXRnb1xuICAgICAgICAgIC5lc3RpbWF0ZUZlZSh7XG4gICAgICAgICAgICBudW1CbG9ja3M6IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQsXG4gICAgICAgICAgICBtYXhGZWU6IHBhcmFtcy5tYXhGZWVSYXRlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGZlZVJhdGVFc3RpbWF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZlZVJhdGVFc3RpbWF0ZS5mZWVQZXJLYjtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGZlZVJhdGUpIHtcbiAgICAgICAgLy8gRG9uJ3Qgc3BlbmQgaW5wdXRzIHRoYXQgY2Fubm90IHBheSBmb3IgdGhlaXIgb3duIGNvc3QuXG4gICAgICAgIGxldCBtaW5JbnB1dFZhbHVlID0gMDtcbiAgICAgICAgaWYgKF8uaXNJbnRlZ2VyKHBhcmFtcy5taW5VbnNwZW50U2l6ZSkpIHtcbiAgICAgICAgICBtaW5JbnB1dFZhbHVlID0gcGFyYW1zLm1pblVuc3BlbnRTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBydW5lZFVuc3BlbnRDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVW5zcGVudENvdW50ID0gdW5zcGVudHMubGVuZ3RoO1xuICAgICAgICB1bnNwZW50cyA9IF8uZmlsdGVyKHVuc3BlbnRzLCBmdW5jdGlvbiAodW5zcGVudCkge1xuICAgICAgICAgIGNvbnN0IGlzU2Vnd2l0SW5wdXQgPSAhIXVuc3BlbnQud2l0bmVzc1NjcmlwdDtcbiAgICAgICAgICBjb25zdCBjdXJyZW50SW5wdXRTaXplID0gaXNTZWd3aXRJbnB1dCA/IFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSA6IFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemU7XG4gICAgICAgICAgY29uc3QgZmVlQmFzZWRNaW5JbnB1dFZhbHVlID0gKGZlZVJhdGUgKiBjdXJyZW50SW5wdXRTaXplKSAvIDEwMDA7XG4gICAgICAgICAgY29uc3QgY3VycmVudE1pbklucHV0VmFsdWUgPSBNYXRoLm1heChtaW5JbnB1dFZhbHVlLCBmZWVCYXNlZE1pbklucHV0VmFsdWUpO1xuICAgICAgICAgIGlmIChjdXJyZW50TWluSW5wdXRWYWx1ZSA+IHVuc3BlbnQudmFsdWUpIHtcbiAgICAgICAgICAgIC8vIHBydW5pbmcgdW5zcGVudFxuICAgICAgICAgICAgY29uc3QgcHJ1bmVEZXRhaWxzID0ge1xuICAgICAgICAgICAgICBnZW5lcmFsTWluSW5wdXRWYWx1ZTogbWluSW5wdXRWYWx1ZSxcbiAgICAgICAgICAgICAgZmVlQmFzZWRNaW5JbnB1dFZhbHVlLFxuICAgICAgICAgICAgICBjdXJyZW50TWluSW5wdXRWYWx1ZSxcbiAgICAgICAgICAgICAgZmVlUmF0ZSxcbiAgICAgICAgICAgICAgaW5wdXRTaXplOiBjdXJyZW50SW5wdXRTaXplLFxuICAgICAgICAgICAgICB1bnNwZW50OiB1bnNwZW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBwcnVuaW5nIHVuc3BlbnQ6ICR7SlNPTi5zdHJpbmdpZnkocHJ1bmVEZXRhaWxzLCBudWxsLCA0KX1gKTtcbiAgICAgICAgICAgIHBydW5lZFVuc3BlbnRDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBydW5lZFVuc3BlbnRDb3VudCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgcHJ1bmVkICR7cHJ1bmVkVW5zcGVudENvdW50fSBvdXQgb2YgJHtvcmlnaW5hbFVuc3BlbnRDb3VudH0gdW5zcGVudHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luc3VmZmljaWVudCBmdW5kcycpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZWd3aXRJbnB1dENvdW50ID0gMDtcbiAgICAgICAgdW5zcGVudHMuZXZlcnkoZnVuY3Rpb24gKHVuc3BlbnQpIHtcbiAgICAgICAgICBpZiAodW5zcGVudC53aXRuZXNzU2NyaXB0KSB7XG4gICAgICAgICAgICBzZWd3aXRJbnB1dENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlucHV0QW1vdW50ICs9IHVuc3BlbnQudmFsdWU7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uYWRkSW5wdXQodW5zcGVudC50eF9oYXNoLCB1bnNwZW50LnR4X291dHB1dF9uLCAweGZmZmZmZmZmKTtcblxuICAgICAgICAgIHJldHVybiBpbnB1dEFtb3VudCA8IChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID8gdG90YWxPdXRwdXRBbW91bnQgOiB0b3RhbEFtb3VudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmIHBheWluZyBmZWVzIGZyb20gYW4gZXh0ZXJuYWwgc2luZ2xlIGtleSB3YWxsZXQsIGFkZCB0aGUgaW5wdXRzXG4gICAgICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICAgICAgLy8gY29sbGVjdCB0aGUgYW1vdW50IHVzZWQgaW4gdGhlIGZlZSBpbnB1dHMgc28gd2UgY2FuIGdldCBjaGFuZ2UgbGF0ZXJcbiAgICAgICAgICBmZWVTaW5nbGVLZXlJbnB1dEFtb3VudCA9IDA7XG4gICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkID0gW107XG4gICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHMuZXZlcnkoZnVuY3Rpb24gKHVuc3BlbnQpIHtcbiAgICAgICAgICAgIGZlZVNpbmdsZUtleUlucHV0QW1vdW50ICs9IHVuc3BlbnQudmFsdWU7XG4gICAgICAgICAgICBpbnB1dEFtb3VudCArPSB1bnNwZW50LnZhbHVlO1xuICAgICAgICAgICAgdHJhbnNhY3Rpb24uYWRkSW5wdXQodW5zcGVudC50eF9oYXNoLCB1bnNwZW50LnR4X291dHB1dF9uKTtcbiAgICAgICAgICAgIGZlZVNpbmdsZUtleVVuc3BlbnRzVXNlZC5wdXNoKHVuc3BlbnQpO1xuICAgICAgICAgICAgLy8gdXNlIHRoZSBmZWUgd2FsbGV0IHRvIHBheSBtaW5lciBmZWVzIGFuZCBwb3RlbnRpYWxseSBpbnN0YW50IGZlZXNcbiAgICAgICAgICAgIHJldHVybiBmZWVTaW5nbGVLZXlJbnB1dEFtb3VudCA8IGZlZSArIChiaXRnb0ZlZUluZm8gPyBiaXRnb0ZlZUluZm8uYW1vdW50IDogMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0eEluZm8gPSB7XG4gICAgICAgICAgblAyc2hJbnB1dHM6IHRyYW5zYWN0aW9uLnR4Lmlucy5sZW5ndGggLSAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IDEgOiAwKSAtIHNlZ3dpdElucHV0Q291bnQsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0czogc2Vnd2l0SW5wdXRDb3VudCxcbiAgICAgICAgICBuUDJwa2hJbnB1dHM6IGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPyAxIDogMCxcbiAgICAgICAgICAvLyBhZGQgc2luZ2xlIGtleSBzb3VyY2UgYWRkcmVzcyBjaGFuZ2VcbiAgICAgICAgICBuT3V0cHV0czpcbiAgICAgICAgICAgIHJlY2lwaWVudHMubGVuZ3RoICtcbiAgICAgICAgICAgIDEgKyAvLyByZWNpcGllbnRzIGFuZCBjaGFuZ2VcbiAgICAgICAgICAgIGV4dHJhQ2hhbmdlQW1vdW50cy5sZW5ndGggKyAvLyBleHRyYSBjaGFuZ2Ugc3BsaXR0aW5nXG4gICAgICAgICAgICAoYml0Z29GZWVJbmZvICYmIGJpdGdvRmVlSW5mby5hbW91bnQgPiAwID8gMSA6IDApICsgLy8gYWRkIG91dHB1dCBmb3IgYml0Z28gZmVlXG4gICAgICAgICAgICAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IDEgOiAwKSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBBcyBwZXIgdGhlIHJlc3BvbnNlIG9mIGdldCB1bnNwZW50cyBBUEksIGZvciB2MSBzYWZlIHdhbGxldHMgcmVkZWVtU2NyaXB0IGlzIHJldHVybmVkXG4gICAgICAgIC8vIGluIHRoZSByZXNwb25zZSBpbiBoZXggZm9ybWF0XG4gICAgICAgIGNvbnRhaW5zVW5jb21wcmVzc2VkUHVibGljS2V5cyA9IHVuc3BlbnRzLnNvbWUoXG4gICAgICAgICAgKHUpID0+IHUucmVkZWVtU2NyaXB0Lmxlbmd0aCA9PT0gMjAxICogMiAvKiBoZXggbGVuZ3RoIGlzIHR3aWNlIHRoZSBsZW5ndGggaW4gYnl0ZXMgKi9cbiAgICAgICAgKTtcblxuICAgICAgICBlc3RUeFNpemUgPSBlc3RpbWF0ZVRyYW5zYWN0aW9uU2l6ZSh7XG4gICAgICAgICAgY29udGFpbnNVbmNvbXByZXNzZWRQdWJsaWNLZXlzLFxuICAgICAgICAgIG5QMnNoSW5wdXRzOiB0eEluZm8ublAyc2hJbnB1dHMsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0czogdHhJbmZvLm5QMnNoUDJ3c2hJbnB1dHMsXG4gICAgICAgICAgblAycGtoSW5wdXRzOiB0eEluZm8ublAycGtoSW5wdXRzLFxuICAgICAgICAgIG5PdXRwdXRzOiB0eEluZm8ubk91dHB1dHMsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKGdldER5bmFtaWNGZWVSYXRlRXN0aW1hdGUpXG4gICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1pbmVyRmVlSW5mbyA9IGV4cG9ydHMuY2FsY3VsYXRlTWluZXJGZWVJbmZvKHtcbiAgICAgICAgICBiaXRnbzogcGFyYW1zLndhbGxldC5iaXRnbyxcbiAgICAgICAgICBjb250YWluc1VuY29tcHJlc3NlZFB1YmxpY0tleXMsXG4gICAgICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgICAgICBuUDJzaElucHV0czogdHhJbmZvLm5QMnNoSW5wdXRzLFxuICAgICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IHR4SW5mby5uUDJzaFAyd3NoSW5wdXRzLFxuICAgICAgICAgIG5QMnBraElucHV0czogdHhJbmZvLm5QMnBraElucHV0cyxcbiAgICAgICAgICBuT3V0cHV0czogdHhJbmZvLm5PdXRwdXRzLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc2hvdWxkQ29tcHV0ZUJlc3RGZWUpIHtcbiAgICAgICAgICBjb25zdCBhcHByb3hpbWF0ZUZlZSA9IG1pbmVyRmVlSW5mby5mZWU7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkUmVjdXJzZSA9IF8uaXNVbmRlZmluZWQoZmVlKSB8fCBhcHByb3hpbWF0ZUZlZSA+IGZlZTtcbiAgICAgICAgICBmZWUgPSBhcHByb3hpbWF0ZUZlZTtcbiAgICAgICAgICAvLyBSZWNvbXB1dGUgdG90YWxBbW91bnQgZnJvbSBzY3JhdGNoXG4gICAgICAgICAgdG90YWxBbW91bnQgPSBmZWUgKyB0b3RhbE91dHB1dEFtb3VudDtcbiAgICAgICAgICBpZiAoYml0Z29GZWVJbmZvKSB7XG4gICAgICAgICAgICB0b3RhbEFtb3VudCArPSBiaXRnb0ZlZUluZm8uYW1vdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdWxkUmVjdXJzZSkge1xuICAgICAgICAgICAgLy8gaWYgZmVlIGNoYW5nZWQsIHJlLWNvbGxlY3QgaW5wdXRzXG4gICAgICAgICAgICBpbnB1dEFtb3VudCA9IDA7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbiA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25CdWlsZGVyRm9yTmV0d29yayhuZXR3b3JrKTtcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0SW5wdXRzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxGZWUgPSBmZWUgKyAoYml0Z29GZWVJbmZvID8gYml0Z29GZWVJbmZvLmFtb3VudCA6IDApO1xuXG4gICAgICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICAgICAgY29uc3Qgc3VtbWVkU2luZ2xlS2V5VW5zcGVudHMgPSBfLnN1bUJ5KGZlZVNpbmdsZUtleVVuc3BlbnRzLCAndmFsdWUnKTtcbiAgICAgICAgICBpZiAodG90YWxGZWUgPiBzdW1tZWRTaW5nbGVLZXlVbnNwZW50cykge1xuICAgICAgICAgICAgY29uc3QgZXJyOiBhbnkgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdJbnN1ZmZpY2llbnQgZmVlIGFtb3VudCBhdmFpbGFibGUgaW4gc2luZ2xlIGtleSBmZWUgc291cmNlOiAnICsgc3VtbWVkU2luZ2xlS2V5VW5zcGVudHNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIucmVzdWx0ID0ge1xuICAgICAgICAgICAgICBmZWU6IGZlZSxcbiAgICAgICAgICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgICAgICAgICAgZXN0aW1hdGVkU2l6ZTogbWluZXJGZWVJbmZvLnNpemUsXG4gICAgICAgICAgICAgIGF2YWlsYWJsZTogaW5wdXRBbW91bnQsXG4gICAgICAgICAgICAgIGJpdGdvRmVlOiBiaXRnb0ZlZUluZm8sXG4gICAgICAgICAgICAgIHR4SW5mbzogdHhJbmZvLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBCbHVlYmlyZC5yZWplY3QoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5wdXRBbW91bnQgPCAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IHRvdGFsT3V0cHV0QW1vdW50IDogdG90YWxBbW91bnQpKSB7XG4gICAgICAgICAgLy8gVGhlIHVuc3BlbnRzIHdlJ3JlIHVzaW5nIGZvciBpbnB1dHMgZG8gbm90IGhhdmUgc3VmZmljaWVudCB2YWx1ZSBvbiB0aGVtIHRvXG4gICAgICAgICAgLy8gc2F0aXNmeSB0aGUgdXNlcidzIHJlcXVlc3RlZCBzcGVuZCBhbW91bnQuIFRoYXQgbWF5IGJlIGJlY2F1c2UgdGhlIHdhbGxldCdzIGJhbGFuY2VcbiAgICAgICAgICAvLyBpcyBzaW1wbHkgdG9vIGxvdywgb3IgaXQgbWlnaHQgYmUgdGhhdCB0aGUgd2FsbGV0J3MgYmFsYW5jZSBpcyBzdWZmaWNpZW50IGJ1dFxuICAgICAgICAgIC8vIHdlIGRpZG4ndCBmZXRjaCBlbm91Z2ggdW5zcGVudHMuIFRvbyBmZXcgdW5zcGVudHMgY291bGQgcmVzdWx0IGZyb20gdGhlIHdhbGxldFxuICAgICAgICAgIC8vIGhhdmluZyBtYW55IHNtYWxsIHVuc3BlbnRzIGFuZCB3ZSBoaXQgb3VyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgaW5wdXRzIHdlIGNhbiB1c2VcbiAgICAgICAgICAvLyBpbiBhIHR4biwgb3IgaXQgbWlnaHQgaGF2ZSBiZWVuIHRoYXQgdGhlIGZpbHRlcnMgdGhlIHVzZXIgcGFzc2VkIGluIChsaWtlIG1pbkNvbmZpcm1zKVxuICAgICAgICAgIC8vIGRpc3F1YWxpZmllZCB0b28gbWFueSBvZiB0aGUgdW5zcGVudHNcbiAgICAgICAgICBsZXQgZXJyO1xuICAgICAgICAgIGlmICh0b3RhbFVuc3BlbnRzQ291bnQgPT09IGZldGNoZWRVbnNwZW50c0NvdW50KSB7XG4gICAgICAgICAgICAvLyB3ZSBmZXRjaGVkIGV2ZXJ5IHVuc3BlbnQgdGhlIHdhbGxldCBoYWQsIGJ1dCBpdCBzdGlsbCB3YXNuJ3QgZW5vdWdoXG4gICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoJ0luc3VmZmljaWVudCBmdW5kcycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB3ZSB3ZXJlbid0IGFibGUgdG8gZmV0Y2ggYWxsIHRoZSB1bnNwZW50cyBvbiB0aGUgd2FsbGV0XG4gICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBUcmFuc2FjdGlvbiBzaXplIHRvbyBsYXJnZSBkdWUgdG8gdG9vIG1hbnkgdW5zcGVudHMuIENhbiBzZW5kIG9ubHkgJHtpbnB1dEFtb3VudH0gc2F0b3NoaXMgaW4gdGhpcyB0cmFuc2FjdGlvbmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVyci5yZXN1bHQgPSB7XG4gICAgICAgICAgICBmZWU6IGZlZSxcbiAgICAgICAgICAgIGZlZVJhdGU6IGZlZVJhdGUsXG4gICAgICAgICAgICBlc3RpbWF0ZWRTaXplOiBtaW5lckZlZUluZm8uc2l6ZSxcbiAgICAgICAgICAgIGF2YWlsYWJsZTogaW5wdXRBbW91bnQsXG4gICAgICAgICAgICBiaXRnb0ZlZTogYml0Z29GZWVJbmZvLFxuICAgICAgICAgICAgdHhJbmZvOiB0eEluZm8sXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gQmx1ZWJpcmQucmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9O1xuXG4gIC8vIEFkZCB0aGUgb3V0cHV0cyBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cbiAgY29uc3QgY29sbGVjdE91dHB1dHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1pbmVyRmVlSW5mby5zaXplID49IDkwMDAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyYW5zYWN0aW9uIHRvbyBsYXJnZTogZXN0aW1hdGVkIHNpemUgJyArIG1pbmVyRmVlSW5mby5zaXplICsgJyBieXRlcycpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dHM6IE91dHB1dFtdID0gW107XG5cbiAgICByZWNpcGllbnRzLmZvckVhY2goZnVuY3Rpb24gKHJlY2lwaWVudCkge1xuICAgICAgbGV0IHNjcmlwdDtcbiAgICAgIGlmIChfLmlzU3RyaW5nKHJlY2lwaWVudC5hZGRyZXNzKSkge1xuICAgICAgICBzY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQocmVjaXBpZW50LmFkZHJlc3MsIG5ldHdvcmspO1xuICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHJlY2lwaWVudC5zY3JpcHQpKSB7XG4gICAgICAgIHNjcmlwdCA9IHJlY2lwaWVudC5zY3JpcHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25laXRoZXIgcmVjaXBpZW50IGFkZHJlc3Mgbm9yIHNjcmlwdCB3YXMgcHJvdmlkZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWRhdGUgdHJhdmVsSW5mbyBpZiBpdCBleGlzdHNcbiAgICAgIGxldCB0cmF2ZWxJbmZvO1xuICAgICAgaWYgKCFfLmlzRW1wdHkocmVjaXBpZW50LnRyYXZlbEluZm8pKSB7XG4gICAgICAgIHRyYXZlbEluZm8gPSByZWNpcGllbnQudHJhdmVsSW5mbztcbiAgICAgICAgLy8gQmV0dGVyIHRvIGF2b2lkIHRyb3VibGUgbm93LCBiZWZvcmUgdHggaXMgY3JlYXRlZFxuICAgICAgICBiaXRnby50cmF2ZWxSdWxlKCkudmFsaWRhdGVUcmF2ZWxJbmZvKHRyYXZlbEluZm8pO1xuICAgICAgfVxuXG4gICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICBzY3JpcHQ6IHNjcmlwdCxcbiAgICAgICAgYW1vdW50OiByZWNpcGllbnQuYW1vdW50LFxuICAgICAgICB0cmF2ZWxJbmZvOiB0cmF2ZWxJbmZvLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBvcFJldHVybnMuZm9yRWFjaChmdW5jdGlvbiAoeyBtZXNzYWdlLCBhbW91bnQgfSkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gdXR4b2xpYi5zY3JpcHQuZnJvbUFTTSgnT1BfUkVUVVJOICcgKyBCdWZmZXIuZnJvbShtZXNzYWdlKS50b1N0cmluZygnaGV4JykpO1xuICAgICAgb3V0cHV0cy5wdXNoKHsgc2NyaXB0LCBhbW91bnQgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBnZXRDaGFuZ2VPdXRwdXRzID0gZnVuY3Rpb24gKGNoYW5nZUFtb3VudDogbnVtYmVyKTogT3V0cHV0W10gfCBCbHVlYmlyZDxPdXRwdXRbXT4ge1xuICAgICAgaWYgKGNoYW5nZUFtb3VudCA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduZWdhdGl2ZSBjaGFuZ2UgYW1vdW50OiAnICsgY2hhbmdlQW1vdW50KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0OiBPdXRwdXRbXSA9IFtdO1xuICAgICAgLy8gaWYgd2UgcGFpZCBmZWVzIGZyb20gYSBzaW5nbGUga2V5IHdhbGxldCwgcmV0dXJuIHRoZSBmZWUgY2hhbmdlIGZpcnN0XG4gICAgICBpZiAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcykge1xuICAgICAgICBjb25zdCBmZWVTaW5nbGVLZXlXYWxsZXRDaGFuZ2VBbW91bnQgPVxuICAgICAgICAgIGZlZVNpbmdsZUtleUlucHV0QW1vdW50IC0gKGZlZSArIChiaXRnb0ZlZUluZm8gPyBiaXRnb0ZlZUluZm8uYW1vdW50IDogMCkpO1xuICAgICAgICBpZiAoZmVlU2luZ2xlS2V5V2FsbGV0Q2hhbmdlQW1vdW50ID49IGNvbnN0YW50cy5taW5PdXRwdXRTaXplKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goeyBhZGRyZXNzOiBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzLCBhbW91bnQ6IGZlZVNpbmdsZUtleVdhbGxldENoYW5nZUFtb3VudCB9KTtcbiAgICAgICAgICBjaGFuZ2VBbW91bnQgPSBjaGFuZ2VBbW91bnQgLSBmZWVTaW5nbGVLZXlXYWxsZXRDaGFuZ2VBbW91bnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZUFtb3VudCA8IGNvbnN0YW50cy5taW5PdXRwdXRTaXplKSB7XG4gICAgICAgIC8vIEdpdmUgaXQgdG8gdGhlIG1pbmVyc1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLndhbGxldC50eXBlKCkgPT09ICdzYWZlJykge1xuICAgICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5hZGRyZXNzZXMoKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHsgYWRkcmVzczogcmVzcG9uc2UuYWRkcmVzc2VzWzBdLmFkZHJlc3MsIGFtb3VudDogY2hhbmdlQW1vdW50IH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgZXh0cmFDaGFuZ2VUb3RhbCA9IF8uc3VtKGV4dHJhQ2hhbmdlQW1vdW50cyk7XG4gICAgICAvLyBTYW5pdHkgY2hlY2tcbiAgICAgIGlmIChleHRyYUNoYW5nZVRvdGFsID4gY2hhbmdlQW1vdW50KSB7XG4gICAgICAgIGV4dHJhQ2hhbmdlQW1vdW50cyA9IFtdO1xuICAgICAgICBleHRyYUNoYW5nZVRvdGFsID0gMDtcbiAgICAgIH1cblxuICAgICAgLy8gY29weSBhbmQgYWRkIHJlbWFpbmluZyBjaGFuZ2UgYW1vdW50XG4gICAgICBjb25zdCBhbGxDaGFuZ2VBbW91bnRzID0gZXh0cmFDaGFuZ2VBbW91bnRzLnNsaWNlKDApO1xuICAgICAgYWxsQ2hhbmdlQW1vdW50cy5wdXNoKGNoYW5nZUFtb3VudCAtIGV4dHJhQ2hhbmdlVG90YWwpO1xuXG4gICAgICAvLyBSZWN1cnNpdmUgYXN5bmMgZnVuYyB0byBhZGQgYWxsIGNoYW5nZSBvdXRwdXRzXG4gICAgICBjb25zdCBhZGRDaGFuZ2VPdXRwdXRzID0gZnVuY3Rpb24gKCk6IE91dHB1dFtdIHwgQmx1ZWJpcmQ8T3V0cHV0W10+IHtcbiAgICAgICAgY29uc3QgdGhpc0Ftb3VudCA9IGFsbENoYW5nZUFtb3VudHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCF0aGlzQW1vdW50KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocGFyYW1zLmNoYW5nZUFkZHJlc3MpIHtcbiAgICAgICAgICAgIC8vIElmIHVzZXIgcGFzc2VkIGEgY2hhbmdlIGFkZHJlc3MsIHVzZSBpdCBmb3IgYWxsIG91dHB1dHNcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXMuY2hhbmdlQWRkcmVzcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBhZGRyZXNzIHBlciBvdXRwdXQsIGZvciBwcml2YWN5XG4gICAgICAgICAgICAvLyBkZXRlcm1pbmUgaWYgc2Vnd2l0IG9yIG5vdFxuICAgICAgICAgICAgY29uc3QgY2hhbmdlQ2hhaW4gPSBwYXJhbXMud2FsbGV0LmdldENoYW5nZUNoYWluKHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IGNoYW5nZUNoYWluLCB2YWxpZGF0ZTogdmFsaWRhdGUgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuYWRkcmVzcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoYWRkcmVzcykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHsgYWRkcmVzczogYWRkcmVzcywgYW1vdW50OiB0aGlzQW1vdW50IH0pO1xuICAgICAgICAgIHJldHVybiBhZGRDaGFuZ2VPdXRwdXRzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFkZENoYW5nZU91dHB1dHMoKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGNoYW5nZSBvdXRwdXQocykgYW5kIGluc3RhbnQgZmVlIG91dHB1dCBpZiBhcHBsaWNhYmxlXG4gICAgcmV0dXJuIEJsdWViaXJkLnRyeShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0Q2hhbmdlT3V0cHV0cyhpbnB1dEFtb3VudCAtIHRvdGFsQW1vdW50KTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGNoYW5nZU91dHB1dHMgPSByZXN1bHQ7XG4gICAgICBjb25zdCBleHRyYU91dHB1dHMgPSBjaGFuZ2VPdXRwdXRzLmNvbmNhdChbXSk7IC8vIGNvcHkgdGhlIGFycmF5XG4gICAgICBpZiAoYml0Z29GZWVJbmZvICYmIGJpdGdvRmVlSW5mby5hbW91bnQgPiAwKSB7XG4gICAgICAgIGV4dHJhT3V0cHV0cy5wdXNoKGJpdGdvRmVlSW5mbyk7XG4gICAgICB9XG4gICAgICBleHRyYU91dHB1dHMuZm9yRWFjaChmdW5jdGlvbiAob3V0cHV0KSB7XG4gICAgICAgIGlmICgob3V0cHV0IGFzIEFkZHJlc3NPdXRwdXQpLmFkZHJlc3MpIHtcbiAgICAgICAgICAob3V0cHV0IGFzIFNjcmlwdE91dHB1dCkuc2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KChvdXRwdXQgYXMgQWRkcmVzc091dHB1dCkuYWRkcmVzcywgbmV0d29yayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZWNpZGUgd2hlcmUgdG8gcHV0IHRoZSBvdXRwdXRzIC0gZGVmYXVsdCBpcyB0byByYW5kb21pemUgdW5sZXNzIGZvcmNlZCB0byBlbmRcbiAgICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSBwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCA/IG91dHB1dHMubGVuZ3RoIDogXy5yYW5kb20oMCwgb3V0cHV0cy5sZW5ndGgpO1xuICAgICAgICBvdXRwdXRzLnNwbGljZShvdXRwdXRJbmRleCwgMCwgb3V0cHV0KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgYWxsIG91dHB1dHMgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAgICBvdXRwdXRzLmZvckVhY2goZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICB0cmFuc2FjdGlvbi5hZGRPdXRwdXQoKG91dHB1dCBhcyBTY3JpcHRPdXRwdXQpLnNjcmlwdCwgb3V0cHV0LmFtb3VudCk7XG4gICAgICB9KTtcblxuICAgICAgdHJhdmVsSW5mb3MgPSBfKG91dHB1dHMpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKG91dHB1dCwgaW5kZXgpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBvdXRwdXQudHJhdmVsSW5mbztcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0Lm91dHB1dEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigpXG4gICAgICAgIC52YWx1ZSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIFNlcmlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24sIHJldHVybmluZyB3aGF0IGlzIG5lZWRlZCB0byBzaWduIGl0XG4gIGNvbnN0IHNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBvbmx5IG5lZWQgdG8gcmV0dXJuIHRoZSB1bnNwZW50cyB0aGF0IHdlcmUgdXNlZCBhbmQganVzdCB0aGUgY2hhaW5QYXRoLCByZWRlZW1TY3JpcHQsIGFuZCBpbnN0YW50IGZsYWdcbiAgICBjb25zdCBwaWNrZWRVbnNwZW50czogYW55ID0gXy5tYXAodW5zcGVudHMsIGZ1bmN0aW9uICh1bnNwZW50KSB7XG4gICAgICByZXR1cm4gXy5waWNrKHVuc3BlbnQsIFsnY2hhaW5QYXRoJywgJ3JlZGVlbVNjcmlwdCcsICdpbnN0YW50JywgJ3dpdG5lc3NTY3JpcHQnLCAnc2NyaXB0JywgJ3ZhbHVlJ10pO1xuICAgIH0pO1xuICAgIGNvbnN0IHBydW5lZFVuc3BlbnRzID0gXy5zbGljZShwaWNrZWRVbnNwZW50cywgMCwgdHJhbnNhY3Rpb24udHguaW5zLmxlbmd0aCAtIGZlZVNpbmdsZUtleVVuc3BlbnRzVXNlZC5sZW5ndGgpO1xuICAgIF8uZWFjaChmZWVTaW5nbGVLZXlVbnNwZW50c1VzZWQsIGZ1bmN0aW9uIChmZWVVbnNwZW50KSB7XG4gICAgICBwcnVuZWRVbnNwZW50cy5wdXNoKHsgcmVkZWVtU2NyaXB0OiBmYWxzZSwgY2hhaW5QYXRoOiBmYWxzZSB9KTsgLy8gbWFyayBhcyBmYWxzZSB0byBzaWduaWZ5IGEgbm9uLW11bHRpc2lnIGFkZHJlc3NcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHtcbiAgICAgIHRyYW5zYWN0aW9uSGV4OiB0cmFuc2FjdGlvbi5idWlsZEluY29tcGxldGUoKS50b0hleCgpLFxuICAgICAgdW5zcGVudHM6IHBydW5lZFVuc3BlbnRzLFxuICAgICAgZmVlOiBmZWUsXG4gICAgICBjaGFuZ2VBZGRyZXNzZXM6IGNoYW5nZU91dHB1dHMubWFwKGZ1bmN0aW9uIChjbykge1xuICAgICAgICByZXR1cm4gXy5waWNrKGNvLCBbJ2FkZHJlc3MnLCAncGF0aCcsICdhbW91bnQnXSk7XG4gICAgICB9KSxcbiAgICAgIHdhbGxldElkOiBwYXJhbXMud2FsbGV0LmlkKCksXG4gICAgICB3YWxsZXRLZXljaGFpbnM6IHBhcmFtcy53YWxsZXQua2V5Y2hhaW5zLFxuICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50LFxuICAgICAgYml0Z29GZWU6IGJpdGdvRmVlSW5mbyxcbiAgICAgIGVzdGltYXRlZFNpemU6IG1pbmVyRmVlSW5mby5zaXplLFxuICAgICAgdHhJbmZvOiB0eEluZm8sXG4gICAgICB0cmF2ZWxJbmZvczogdHJhdmVsSW5mb3MsXG4gICAgfTtcblxuICAgIC8vIEFkZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBpZiAocmVzdWx0Lmluc3RhbnQgJiYgYml0Z29GZWVJbmZvKSB7XG4gICAgICByZXN1bHQuaW5zdGFudEZlZSA9IF8ucGljayhiaXRnb0ZlZUluZm8sIFsnYW1vdW50JywgJ2FkZHJlc3MnXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0Qml0R29GZWUoKTtcbiAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gQmx1ZWJpcmQuYWxsKFtnZXRCaXRHb0ZlZUFkZHJlc3MoKSwgZ2V0VW5zcGVudHMoKSwgZ2V0VW5zcGVudHNGb3JTaW5nbGVLZXkoKV0pO1xuICAgIH0pXG4gICAgLnRoZW4oY29sbGVjdElucHV0cylcbiAgICAudGhlbihjb2xsZWN0T3V0cHV0cylcbiAgICAudGhlbihzZXJpYWxpemUpO1xufTtcblxuLyoqXG4gKiBFc3RpbWF0ZSB0aGUgc2l6ZSBvZiBhIHRyYW5zYWN0aW9uIGluIGJ5dGVzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2ZcbiAqIGlucHV0cyBhbmQgb3V0cHV0cyBwcmVzZW50LlxuICogQHBhcmFtcyBwYXJhbXMge1xuICogICBuUDJzaElucHV0czogbnVtYmVyIG9mIFAyU0ggKG11bHRpc2lnKSBpbnB1dHNcbiAqICAgblAycGtoSW5wdXRzOiBudW1iZXIgb2YgUDJQS0ggKHNpbmdsZSBzaWcpIGlucHV0c1xuICogICBuT3V0cHV0czogbnVtYmVyIG9mIG91dHB1dHNcbiAqIH1cbiAqXG4gKiBAcmV0dXJucyBzaXplOiBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgdHJhbnNhY3Rpb24gaW4gYnl0ZXNcbiAqL1xuY29uc3QgZXN0aW1hdGVUcmFuc2FjdGlvblNpemUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm5QMnNoSW5wdXRzKSB8fCBwYXJhbXMublAyc2hJbnB1dHMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcG9zaXRpdmUgblAyc2hJbnB1dHMnKTtcbiAgfVxuICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5uUDJwa2hJbnB1dHMpIHx8IHBhcmFtcy5uUDJwa2hJbnB1dHMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcG9zaXRpdmUgblAycGtoSW5wdXRzIHRvIGJlIG51bWVyaWMnKTtcbiAgfVxuICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5uUDJzaFAyd3NoSW5wdXRzKSB8fCBwYXJhbXMublAyc2hQMndzaElucHV0cyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBwb3NpdGl2ZSBuUDJzaFAyd3NoSW5wdXRzIHRvIGJlIG51bWVyaWMnKTtcbiAgfVxuICBpZiAocGFyYW1zLm5QMnNoSW5wdXRzICsgcGFyYW1zLm5QMnNoUDJ3c2hJbnB1dHMgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgYXQgbGVhc3Qgb25lIG5QMnNoSW5wdXRzIG9yIG5QMnNoUDJ3c2hJbnB1dHMnKTtcbiAgfVxuICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5uT3V0cHV0cykgfHwgcGFyYW1zLm5PdXRwdXRzIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHBvc2l0aXZlIG5PdXRwdXRzJyk7XG4gIH1cblxuICAvLyBUaGUgc2l6ZSBvZiBhbiB1bmNvbXByZXNzZWQgcHVibGljIGtleSBpcyAzMiBieXRlcyBtb3JlIHRoYW4gdGhlIGNvbXByZXNzZWQga2V5LFxuICAvLyBhbmQgaGVuY2UsIG5lZWRzIHRvIGJlIGFjY291bnRlZCBmb3IgaW4gdGhlIHRyYW5zYWN0aW9uIHNpemUgZXN0aW1hdGlvbi5cbiAgY29uc3QgdW5jb21wcmVzc2VkUHVibGljS2V5c1RyaXBsZUNvcnJlY3Rpb25GYWN0b3IgPSAzMiAqIDM7XG5cbiAgcmV0dXJuIChcbiAgICAvLyBUaGlzIGlzIG5vdCBxdWl0ZSBhY2N1cmF0ZSAtIGlmIHRoZXJlIGlzIGEgbWl4IG9mIGlucHV0cyBzY3JpcHRzIHdoZXJlIHNvbWUgdXNlZFxuICAgIC8vIGNvbXByZXNzZWQga2V5cyBhbmQgc29tZSB1c2VkIHVuY29tcHJlc3NlZCBrZXlzLCB3ZSB3b3VsZCBvdmVyZXN0aW1hdGUgdGhlIHNpemUuXG4gICAgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBtaXhlZCBpbnB1dCBzZXRzLCB0aGlzIHNob3VsZCBub3QgYmUgYW4gaXNzdWUgaW4gcHJhY3RpY2UuXG4gICAgKFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgK1xuICAgICAgKHBhcmFtcy5jb250YWluc1VuY29tcHJlc3NlZFB1YmxpY0tleXMgPyB1bmNvbXByZXNzZWRQdWJsaWNLZXlzVHJpcGxlQ29ycmVjdGlvbkZhY3RvciA6IDApKSAqXG4gICAgICBwYXJhbXMublAyc2hJbnB1dHMgK1xuICAgIFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSAqIChwYXJhbXMublAyc2hQMndzaElucHV0cyB8fCAwKSArXG4gICAgVmlydHVhbFNpemVzLnR4UDJwa2hJbnB1dFNpemVVbmNvbXByZXNzZWRLZXkgKiAocGFyYW1zLm5QMnBraElucHV0cyB8fCAwKSArXG4gICAgVmlydHVhbFNpemVzLnR4UDJwa2hPdXRwdXRTaXplICogcGFyYW1zLm5PdXRwdXRzICtcbiAgICAvLyBpZiB0aGUgdHggY29udGFpbnMgYXQgbGVhc3Qgb25lIHNlZ3dpdCBpbnB1dCwgdGhlIHR4IG92ZXJoZWFkIGlzIGluY3JlYXNlZCBieSAxXG4gICAgVmlydHVhbFNpemVzLnR4T3ZlcmhlYWRTaXplICtcbiAgICAocGFyYW1zLm5QMnNoUDJ3c2hJbnB1dHMgPiAwID8gMSA6IDApXG4gICk7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgZmVlIGFuZCBlc3RpbWF0ZWQgc2l6ZSBpbiBieXRlcyBmb3IgYSB0cmFuc2FjdGlvbi5cbiAqIEBwYXJhbXMgcGFyYW1zIHtcbiAqICAgYml0Z286IGJpdGdvIG9iamVjdFxuICogICBmZWVSYXRlOiBzYXRvc2hpcyBwZXIga2lsb2J5dGVcbiAqICAgblAyc2hJbnB1dHM6IG51bWJlciBvZiBQMlNIIChtdWx0aXNpZykgaW5wdXRzXG4gKiAgIG5QMnBraElucHV0czogbnVtYmVyIG9mIFAyUEtIIChzaW5nbGUgc2lnKSBpbnB1dHNcbiAqICAgbk91dHB1dHM6IG51bWJlciBvZiBvdXRwdXRzXG4gKiB9XG4gKlxuICogQHJldHVybnMge1xuICogICBzaXplOiBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgdHJhbnNhY3Rpb24gaW4gYnl0ZXNcbiAqICAgZmVlOiBlc3RpbWF0ZWQgZmVlIGluIHNhdG9zaGlzIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAqICAgZmVlUmF0ZTogZmVlIHJhdGUgdGhhdCB3YXMgdXNlZCB0byBlc3RpbWF0ZSB0aGUgZmVlIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAqIH1cbiAqL1xuZXhwb3J0cy5jYWxjdWxhdGVNaW5lckZlZUluZm8gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGNvbnN0IGZlZVJhdGVUb1VzZSA9IHBhcmFtcy5mZWVSYXRlIHx8IHBhcmFtcy5iaXRnby5nZXRDb25zdGFudHMoKS5mYWxsYmFja0ZlZVJhdGU7XG4gIGNvbnN0IGVzdGltYXRlZFNpemUgPSBlc3RpbWF0ZVRyYW5zYWN0aW9uU2l6ZShwYXJhbXMpO1xuXG4gIHJldHVybiB7XG4gICAgc2l6ZTogZXN0aW1hdGVkU2l6ZSxcbiAgICBmZWU6IE1hdGguY2VpbCgoZXN0aW1hdGVkU2l6ZSAqIGZlZVJhdGVUb1VzZSkgLyAxMDAwKSxcbiAgICBmZWVSYXRlOiBmZWVSYXRlVG9Vc2UsXG4gIH07XG59O1xuXG4vKlxuICogR2l2ZW4gYSB0cmFuc2FjdGlvbiBoZXgsIHVuc3BlbnQgaW5mb3JtYXRpb24gKGNoYWluIHBhdGggYW5kIHJlZGVlbSBzY3JpcHRzKSwgYW5kIHRoZSBrZXljaGFpbiB4cHJ2LFxuICogcGVyZm9ybSBrZXkgZGVyaXZhdGlvbiBhbmQgc2lnbiB0aGUgaW5wdXRzIGluIHRoZSB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgdW5zcGVudCBpbmZvcm1hdGlvbiBwcm92aWRlZFxuICpcbiAqIEBwYXJhbXM6XG4gKiAgdHJhbnNhY3Rpb25IZXggc2VyaWFsaXplZCBmb3JtIG9mIHRoZSB0cmFuc2FjdGlvbiBpbiBoZXhcbiAqICB1bnNwZW50cyBhcnJheSBvZiB1bnNwZW50IGluZm9ybWF0aW9uLCB3aGVyZSBlYWNoIHVuc3BlbnQgaXMgYSBjaGFpblBhdGggYW5kIHJlZGVlbVNjcmlwdCB3aXRoIHRoZSBzYW1lXG4gKiAgaW5kZXggYXMgdGhlIGlucHV0cyBpbiB0aGUgdHJhbnNhY3Rpb25IZXhcbiAqICBrZXljaGFpbiBLZXljaGFpbiBjb250YWluaW5nIHRoZSB4cHJ2IHRvIHNpZ24gd2l0aC4gRm9yIGxlZ2FjeSBzdXBwb3J0IG9mIHNhZmUgd2FsbGV0cywga2V5Y2hhaW4gY2FuXG4gYWxzbyBiZSBhIFdJRiBwcml2YXRlIGtleS5cbiAqICBzaWduaW5nS2V5IHByaXZhdGUga2V5IGluIFdJRiBmb3Igc2FmZSB3YWxsZXRzLCB3aGVuIGtleWNoYWluIGlzIHVuYXZhaWxhYmxlXG4gKiAgdmFsaWRhdGUgY2xpZW50LXNpZGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiAtIGNhbiBiZSBkaXNhYmxlZCBmb3IgaW1wcm92ZWQgcGVyZm9ybWFuY2UgKHNpZ25hdHVyZXNcbiAqICAgICAgICAgICBhcmUgc3RpbGwgdmFsaWRhdGVkIHNlcnZlci1zaWRlKS5cbiAqICBmZWVTaW5nbGVLZXlXSUYgVXNlIHRoZSBhZGRyZXNzIGJhc2VkIG9uIHRoaXMgcHJpdmF0ZSBrZXkgdG8gcGF5IGZlZXNcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnRzLnNpZ25UcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgbGV0IGtleWNoYWluID0gcGFyYW1zLmtleWNoYWluOyAvLyBkdXBsaWNhdGUgc28gYXMgdG8gbm90IG11dGF0ZSBiZWxvd1xuXG4gIGNvbnN0IHZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnZhbGlkYXRlO1xuICBsZXQgcHJpdktleTtcbiAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy50cmFuc2FjdGlvbkhleCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB0aGUgdHJhbnNhY3Rpb24gaGV4IGFzIGEgc3RyaW5nJyk7XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy51bnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB0aGUgdW5zcGVudHMgYXJyYXknKTtcbiAgfVxuICBpZiAoIV8uaXNCb29sZWFuKHZhbGlkYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHZhbGlkYXRlIHRvIGJlIGEgYm9vbGVhbicpO1xuICB9XG4gIGxldCBuZXR3b3JrID0gZ2V0TmV0d29yaygpO1xuICBjb25zdCBlbmFibGVCQ0ggPSBfLmlzQm9vbGVhbihwYXJhbXMuZm9yY2VCQ0gpICYmIHBhcmFtcy5mb3JjZUJDSCA9PT0gdHJ1ZTtcblxuICBpZiAoIV8uaXNPYmplY3Qoa2V5Y2hhaW4pIHx8ICFfLmlzU3RyaW5nKChrZXljaGFpbiBhcyBhbnkpLnhwcnYpKSB7XG4gICAgaWYgKF8uaXNTdHJpbmcocGFyYW1zLnNpZ25pbmdLZXkpKSB7XG4gICAgICBwcml2S2V5ID0gdXR4b2xpYi5FQ1BhaXIuZnJvbVdJRihwYXJhbXMuc2lnbmluZ0tleSwgbmV0d29yayBhcyB1dHhvbGliLkJpdGNvaW5KU05ldHdvcmspO1xuICAgICAga2V5Y2hhaW4gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHRoZSBrZXljaGFpbiBvYmplY3Qgd2l0aCB4cHJ2Jyk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGZlZVNpbmdsZUtleTtcbiAgaWYgKHBhcmFtcy5mZWVTaW5nbGVLZXlXSUYpIHtcbiAgICBmZWVTaW5nbGVLZXkgPSB1dHhvbGliLkVDUGFpci5mcm9tV0lGKHBhcmFtcy5mZWVTaW5nbGVLZXlXSUYsIG5ldHdvcmsgYXMgdXR4b2xpYi5CaXRjb2luSlNOZXR3b3JrKTtcbiAgfVxuXG4gIGRlYnVnKCdOZXR3b3JrOiAlTycsIG5ldHdvcmspO1xuXG4gIGlmIChlbmFibGVCQ0gpIHtcbiAgICBkZWJ1ZygnRW5hYmxpbmcgQkNI4oCmJyk7XG4gICAgbmV0d29yayA9IHV0eG9saWIubmV0d29ya3MuYml0Y29pbmNhc2g7XG4gICAgZGVidWcoJ05ldyBuZXR3b3JrOiAlTycsIG5ldHdvcmspO1xuICB9XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleChwYXJhbXMudHJhbnNhY3Rpb25IZXgsIG5ldHdvcmspO1xuICBpZiAodHJhbnNhY3Rpb24uaW5zLmxlbmd0aCAhPT0gcGFyYW1zLnVuc3BlbnRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbGVuZ3RoIG9mIHVuc3BlbnRzIGFycmF5IHNob3VsZCBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIGlucHV0cycpO1xuICB9XG5cbiAgLy8gZGVjb3JhdGUgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dCB2YWx1ZXMgZm9yIFRyYW5zYWN0aW9uQnVpbGRlciBpbnN0YW50aWF0aW9uXG4gIGNvbnN0IGlzVXR4b1R4ID0gXy5pc09iamVjdCh0cmFuc2FjdGlvbikgJiYgQXJyYXkuaXNBcnJheSgodHJhbnNhY3Rpb24gYXMgYW55KS5pbnMpO1xuICBjb25zdCBhcmVWYWxpZFVuc3BlbnRzID0gXy5pc09iamVjdChwYXJhbXMpICYmIEFycmF5LmlzQXJyYXkoKHBhcmFtcyBhcyBhbnkpLnVuc3BlbnRzKTtcbiAgaWYgKGlzVXR4b1R4ICYmIGFyZVZhbGlkVW5zcGVudHMpIHtcbiAgICAvLyBleHRlbmQgdGhlIHRyYW5zYWN0aW9uIGlucHV0cyB3aXRoIHRoZSB2YWx1ZXNcbiAgICBjb25zdCBpbnB1dFZhbHVlcyA9IF8ubWFwKChwYXJhbXMgYXMgYW55KS51bnNwZW50cywgKHUpID0+IF8ucGljayh1LCAndmFsdWUnKSk7XG4gICAgdHJhbnNhY3Rpb24uaW5zLm1hcCgoY3VycmVudEl0ZW0sIGluZGV4KSA9PiBfLmV4dGVuZChjdXJyZW50SXRlbSwgaW5wdXRWYWx1ZXNbaW5kZXhdKSk7XG4gIH1cblxuICBsZXQgcm9vdEV4dEtleTtcbiAgaWYgKGtleWNoYWluKSB7XG4gICAgcm9vdEV4dEtleSA9IGJpcDMyLmZyb21CYXNlNTgoa2V5Y2hhaW4ueHBydik7XG4gIH1cblxuICBjb25zdCB0eGIgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZyb21UcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHR4Yi50eC5pbnMubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgY29uc3QgY3VycmVudFVuc3BlbnQgPSBwYXJhbXMudW5zcGVudHNbaW5kZXhdO1xuICAgIGlmIChjdXJyZW50VW5zcGVudC5yZWRlZW1TY3JpcHQgPT09IGZhbHNlKSB7XG4gICAgICAvLyB0aGlzIGlzIHRoZSBpbnB1dCBmcm9tIGEgc2luZ2xlIGtleSBmZWUgYWRkcmVzc1xuICAgICAgaWYgKCFmZWVTaW5nbGVLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaW5nbGUga2V5IGFkZHJlc3MgdXNlZCBpbiBpbnB1dCBidXQgZmVlU2luZ2xlS2V5V0lGIG5vdCBwcm92aWRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlQkNIKSB7XG4gICAgICAgIGZlZVNpbmdsZUtleS5uZXR3b3JrID0gbmV0d29yaztcbiAgICAgIH1cblxuICAgICAgdHhiLnNpZ24oaW5kZXgsIGZlZVNpbmdsZUtleSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdCAmJiBlbmFibGVCQ0gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQkNIIGRvZXMgbm90IHN1cHBvcnQgc2Vnd2l0IGlucHV0cycpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYWluUGF0aCA9IGN1cnJlbnRVbnNwZW50LmNoYWluUGF0aDtcbiAgICBpZiAocm9vdEV4dEtleSkge1xuICAgICAgY29uc3QgeyB3YWxsZXRTdWJQYXRoID0gJy8wLzAnIH0gPSBrZXljaGFpbjtcbiAgICAgIGNvbnN0IHBhdGggPSBzYW5pdGl6ZUxlZ2FjeVBhdGgoa2V5Y2hhaW4ucGF0aCArIHdhbGxldFN1YlBhdGggKyBjaGFpblBhdGgpO1xuICAgICAgZGVidWcoXG4gICAgICAgICdkZXJpdmVkIHVzZXIga2V5IHBhdGggXCIlc1wiIHVzaW5nIGtleWNoYWluIHBhdGggXCIlc1wiLCB3YWxsZXRTdWJQYXRoIFwiJXNcIiwga2V5Y2hhaW4gd2FsbGV0U3ViUGF0aCBcIiVzXCIgYW5kIGNoYWluUGF0aCBcIiVzXCInLFxuICAgICAgICBwYXRoLFxuICAgICAgICBrZXljaGFpbi5wYXRoLFxuICAgICAgICB3YWxsZXRTdWJQYXRoLFxuICAgICAgICBrZXljaGFpbi53YWxsZXRTdWJQYXRoLFxuICAgICAgICBjaGFpblBhdGhcbiAgICAgICk7XG4gICAgICBwcml2S2V5ID0gcm9vdEV4dEtleS5kZXJpdmVQYXRoKHBhdGgpO1xuICAgIH1cblxuICAgIHByaXZLZXkubmV0d29yayA9IG5ldHdvcms7XG5cbiAgICAvLyBzdWJzY3JpcHQgaXMgdGhlIHBhcnQgb2YgdGhlIG91dHB1dCBzY3JpcHQgYWZ0ZXIgdGhlIE9QX0NPREVTRVBBUkFUT1IuXG4gICAgLy8gU2luY2Ugd2UgYXJlIG9ubHkgZXZlciBzaWduaW5nIHAyc2ggb3V0cHV0cywgd2hpY2ggZG8gbm90IGhhdmVcbiAgICAvLyBPUF9DT0RFU0VQQVJBVE9SUywgaXQgaXMgYWx3YXlzIHRoZSBvdXRwdXQgc2NyaXB0LlxuICAgIGNvbnN0IHN1YnNjcmlwdCA9IEJ1ZmZlci5mcm9tKGN1cnJlbnRVbnNwZW50LnJlZGVlbVNjcmlwdCwgJ2hleCcpO1xuICAgIGN1cnJlbnRVbnNwZW50LnZhbGlkYXRpb25TY3JpcHQgPSBzdWJzY3JpcHQ7XG5cbiAgICAvLyBJbiBvcmRlciB0byBzaWduIHdpdGggYml0Y29pbmpzLWxpYiwgd2UgbXVzdCB1c2UgaXRzIHRyYW5zYWN0aW9uXG4gICAgLy8gYnVpbGRlciwgY29uZnVzaW5nbHkgbmFtZWQgdGhlIHNhbWUgZXhhY3QgdGhpbmcgYXMgb3VyIHRyYW5zYWN0aW9uXG4gICAgLy8gYnVpbGRlciwgYnV0IHdpdGggaW5lcXVpdmFsZW50IGJlaGF2aW9yLlxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3aXRuZXNzU2NyaXB0ID0gY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdCA/IEJ1ZmZlci5mcm9tKGN1cnJlbnRVbnNwZW50LndpdG5lc3NTY3JpcHQsICdoZXgnKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHNpZ0hhc2ggPSB1dHhvbGliLmJpdGdvLmdldERlZmF1bHRTaWdIYXNoKG5ldHdvcmspO1xuICAgICAgdHhiLnNpZ24oaW5kZXgsIHByaXZLZXksIHN1YnNjcmlwdCwgc2lnSGFzaCwgY3VycmVudFVuc3BlbnQudmFsdWUsIHdpdG5lc3NTY3JpcHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHRyeSBmYWxsYmFjayBkZXJpdmF0aW9uIHBhdGggKHNlZSBCRy00NjQ5NylcbiAgICAgIGxldCBmYWxsYmFja1NpZ25pbmdTdWNjZXNzZnVsID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmYWxsYmFja1BhdGggPSBzYW5pdGl6ZUxlZ2FjeVBhdGgoa2V5Y2hhaW4ucGF0aCArIGNoYWluUGF0aCk7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgICdkZXJpdmVkIGZhbGxiYWNrIHVzZXIga2V5IHBhdGggXCIlc1wiIHVzaW5nIGtleWNoYWluIHBhdGggXCIlc1wiIGFuZCBjaGFpblBhdGggXCIlc1wiJyxcbiAgICAgICAgICBmYWxsYmFja1BhdGgsXG4gICAgICAgICAga2V5Y2hhaW4ucGF0aCxcbiAgICAgICAgICBjaGFpblBhdGhcbiAgICAgICAgKTtcbiAgICAgICAgcHJpdktleSA9IHJvb3RFeHRLZXkuZGVyaXZlUGF0aChmYWxsYmFja1BhdGgpO1xuICAgICAgICBjb25zdCB3aXRuZXNzU2NyaXB0ID0gY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdFxuICAgICAgICAgID8gQnVmZmVyLmZyb20oY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdCwgJ2hleCcpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHNpZ0hhc2ggPSB1dHhvbGliLmJpdGdvLmdldERlZmF1bHRTaWdIYXNoKG5ldHdvcmspO1xuICAgICAgICB0eGIuc2lnbihpbmRleCwgcHJpdktleSwgc3Vic2NyaXB0LCBzaWdIYXNoLCBjdXJyZW50VW5zcGVudC52YWx1ZSwgd2l0bmVzc1NjcmlwdCk7XG4gICAgICAgIGZhbGxiYWNrU2lnbmluZ1N1Y2Nlc3NmdWwgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZmFsbGJhY2tFcnJvcikge1xuICAgICAgICBkZWJ1ZygnaW5wdXQgc2lnbiBmYWlsZWQgZm9yIGZhbGxiYWNrIHBhdGg6ICVzJywgZmFsbGJhY2tFcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIC8vIHdlIG5lZWQgdG8ga25vdyB3aGF0J3MgY2F1c2luZyB0aGlzXG4gICAgICBpZiAoIWZhbGxiYWNrU2lnbmluZ1N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgZS5yZXN1bHQgPSB7XG4gICAgICAgICAgdW5zcGVudDogY3VycmVudFVuc3BlbnQsXG4gICAgICAgIH07XG4gICAgICAgIGUubWVzc2FnZSA9IGBGYWlsZWQgdG8gc2lnbiBpbnB1dCAjJHtpbmRleH0gLSAke2UubWVzc2FnZX0gLSAke0pTT04uc3RyaW5naWZ5KGUucmVzdWx0LCBudWxsLCA0KX0gLSBcXG4ke1xuICAgICAgICAgIGUuc3RhY2tcbiAgICAgICAgfWA7XG4gICAgICAgIGRlYnVnKCdpbnB1dCBzaWduIGZhaWxlZDogJXMnLCBlLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gQmx1ZWJpcmQucmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhcnRpYWxUcmFuc2FjdGlvbiA9IHR4Yi5idWlsZEluY29tcGxldGUoKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBwYXJ0aWFsVHJhbnNhY3Rpb24uaW5zLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlQ291bnQgPSB1dHhvbGliLmJpdGdvXG4gICAgICAgIC5nZXRTaWduYXR1cmVWZXJpZmljYXRpb25zKHBhcnRpYWxUcmFuc2FjdGlvbiwgaW5kZXgsIHBhcmFtcy51bnNwZW50c1tpbmRleF0udmFsdWUpXG4gICAgICAgIC5maWx0ZXIoKHYpID0+IHYuc2lnbmVkQnkgIT09IHVuZGVmaW5lZCkubGVuZ3RoO1xuICAgICAgaWYgKHNpZ25hdHVyZUNvdW50IDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGF0IGxlYXN0IG9uZSB2YWxpZCBzaWduYXR1cmUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuZnVsbExvY2FsU2lnbmluZyAmJiBzaWduYXR1cmVDb3VudCA8IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmdWxsTG9jYWxTaWduaW5nIHNldDogZXhwZWN0ZWQgYXQgbGVhc3QgdHdvIHZhbGlkIHNpZ25hdHVyZXMnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHtcbiAgICB0cmFuc2FjdGlvbkhleDogcGFydGlhbFRyYW5zYWN0aW9uLnRvSGV4KCksXG4gIH0pO1xufTtcbiJdfQ==