@bitgo-beta/abstract-utxo 1.1.1-beta.2347 → 1.1.1-beta.2349

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.
@@ -3,7 +3,9 @@ import { descriptorWallet, Psbt } from '@bitgo/wasm-utxo';
3
3
  * Apply the PoX-5 staking spend policy to a PSBT before it is signed.
4
4
  *
5
5
  * PSBTs without PoX-5 lockup inputs are not affected. Otherwise, the PSBT must spend exactly one lockup
6
- * input through the post-CLTV (late exit) branch, with nLockTime at or above the unlock height and a non-final sequence.
6
+ * input through one of two branches:
7
+ * - post-CLTV (late exit): nLockTime at or above the unlock height and a non-final sequence.
8
+ * - principal-preimage (early exit): nLockTime 0 and the principal preimage committed by the descriptor.
7
9
  */
8
10
  export declare function assertPox5SpendPolicy(psbt: Psbt, descriptorMap: descriptorWallet.DescriptorMap): void;
9
11
  //# sourceMappingURL=pox5.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pox5.d.ts","sourceRoot":"","sources":["../../../../../src/offlineVault/descriptor/pox5.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAQ1D;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAcrG"}
1
+ {"version":3,"file":"pox5.d.ts","sourceRoot":"","sources":["../../../../../src/offlineVault/descriptor/pox5.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAqB1D;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAoBrG"}
@@ -5,11 +5,24 @@ const utxo_descriptors_1 = require("@bitgo-beta/utxo-descriptors");
5
5
  function getPox5InputMatches(psbt, descriptorMap) {
6
6
  return Array.from({ length: psbt.inputCount() }, (_, i) => utxo_descriptors_1.pox5.matchPox5Input(psbt, i, descriptorMap)).filter((match) => match !== undefined);
7
7
  }
8
+ /** WP builds early exits with a zero nLockTime; the early-exit branch does not evaluate the CLTV. */
9
+ const POX5_EARLY_EXIT_LOCKTIME = 0;
10
+ function assertPox5EarlyExitPolicy(psbt, match) {
11
+ utxo_descriptors_1.pox5.assertPox5EarlyExitSpend(psbt, match);
12
+ const lockTime = psbt.lockTime();
13
+ if (lockTime !== POX5_EARLY_EXIT_LOCKTIME) {
14
+ throw new Error(`PoX-5 early exit nLockTime must be ${POX5_EARLY_EXIT_LOCKTIME}, got ${lockTime}`);
15
+ }
16
+ // throws unless exactly one PSBT_IN_SHA256 record carries the descriptor's commitment and its preimage
17
+ utxo_descriptors_1.pox5.getPox5PrincipalPreimage(psbt, match.inputIndex, match.info);
18
+ }
8
19
  /**
9
20
  * Apply the PoX-5 staking spend policy to a PSBT before it is signed.
10
21
  *
11
22
  * PSBTs without PoX-5 lockup inputs are not affected. Otherwise, the PSBT must spend exactly one lockup
12
- * input through the post-CLTV (late exit) branch, with nLockTime at or above the unlock height and a non-final sequence.
23
+ * input through one of two branches:
24
+ * - post-CLTV (late exit): nLockTime at or above the unlock height and a non-final sequence.
25
+ * - principal-preimage (early exit): nLockTime 0 and the principal preimage committed by the descriptor.
13
26
  */
14
27
  function assertPox5SpendPolicy(psbt, descriptorMap) {
15
28
  const matches = getPox5InputMatches(psbt, descriptorMap);
@@ -21,9 +34,15 @@ function assertPox5SpendPolicy(psbt, descriptorMap) {
21
34
  }
22
35
  const [match] = matches;
23
36
  const branch = utxo_descriptors_1.pox5.classifyPox5Spend(psbt, match);
24
- if (branch !== 'locktime') {
25
- throw new Error(`unsupported PoX-5 spend branch: ${branch}`);
37
+ switch (branch) {
38
+ case 'locktime':
39
+ utxo_descriptors_1.pox5.assertPox5LocktimeSpend(psbt, matches);
40
+ return;
41
+ case 'early-exit':
42
+ assertPox5EarlyExitPolicy(psbt, match);
43
+ return;
44
+ default:
45
+ throw new Error(`unsupported PoX-5 spend branch: ${branch}`);
26
46
  }
27
- utxo_descriptors_1.pox5.assertPox5LocktimeSpend(psbt, matches);
28
47
  }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG94NS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9vZmZsaW5lVmF1bHQvZGVzY3JpcHRvci9wb3g1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZUEsc0RBY0M7QUE3QkQsbUVBQW9EO0FBR3BELFNBQVMsbUJBQW1CLENBQUMsSUFBVSxFQUFFLGFBQTZDO0lBQ3BGLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLHVCQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQzVHLENBQUMsS0FBSyxFQUFnQyxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FDN0QsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLElBQVUsRUFBRSxhQUE2QztJQUM3RixNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDekQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQ3hCLE1BQU0sTUFBTSxHQUFHLHVCQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25ELElBQUksTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELHVCQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1kZXNjcmlwdG9ycyc7XG5pbXBvcnQgeyBkZXNjcmlwdG9yV2FsbGV0LCBQc2J0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmZ1bmN0aW9uIGdldFBveDVJbnB1dE1hdGNoZXMocHNidDogUHNidCwgZGVzY3JpcHRvck1hcDogZGVzY3JpcHRvcldhbGxldC5EZXNjcmlwdG9yTWFwKTogcG94NS5Qb3g1SW5wdXRNYXRjaFtdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHBzYnQuaW5wdXRDb3VudCgpIH0sIChfLCBpKSA9PiBwb3g1Lm1hdGNoUG94NUlucHV0KHBzYnQsIGksIGRlc2NyaXB0b3JNYXApKS5maWx0ZXIoXG4gICAgKG1hdGNoKTogbWF0Y2ggaXMgcG94NS5Qb3g1SW5wdXRNYXRjaCA9PiBtYXRjaCAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogQXBwbHkgdGhlIFBvWC01IHN0YWtpbmcgc3BlbmQgcG9saWN5IHRvIGEgUFNCVCBiZWZvcmUgaXQgaXMgc2lnbmVkLlxuICpcbiAqIFBTQlRzIHdpdGhvdXQgUG9YLTUgbG9ja3VwIGlucHV0cyBhcmUgbm90IGFmZmVjdGVkLiBPdGhlcndpc2UsIHRoZSBQU0JUIG11c3Qgc3BlbmQgZXhhY3RseSBvbmUgbG9ja3VwXG4gKiBpbnB1dCB0aHJvdWdoIHRoZSBwb3N0LUNMVFYgKGxhdGUgZXhpdCkgYnJhbmNoLCB3aXRoIG5Mb2NrVGltZSBhdCBvciBhYm92ZSB0aGUgdW5sb2NrIGhlaWdodCBhbmQgYSBub24tZmluYWwgc2VxdWVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQb3g1U3BlbmRQb2xpY3kocHNidDogUHNidCwgZGVzY3JpcHRvck1hcDogZGVzY3JpcHRvcldhbGxldC5EZXNjcmlwdG9yTWFwKTogdm9pZCB7XG4gIGNvbnN0IG1hdGNoZXMgPSBnZXRQb3g1SW5wdXRNYXRjaGVzKHBzYnQsIGRlc2NyaXB0b3JNYXApO1xuICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1hdGNoZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCBleGFjdGx5IG9uZSBQb1gtNSBsb2NrdXAgaW5wdXQsIGZvdW5kICR7bWF0Y2hlcy5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3QgW21hdGNoXSA9IG1hdGNoZXM7XG4gIGNvbnN0IGJyYW5jaCA9IHBveDUuY2xhc3NpZnlQb3g1U3BlbmQocHNidCwgbWF0Y2gpO1xuICBpZiAoYnJhbmNoICE9PSAnbG9ja3RpbWUnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBQb1gtNSBzcGVuZCBicmFuY2g6ICR7YnJhbmNofWApO1xuICB9XG4gIHBveDUuYXNzZXJ0UG94NUxvY2t0aW1lU3BlbmQocHNidCwgbWF0Y2hlcyk7XG59XG4iXX0=
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG94NS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9vZmZsaW5lVmF1bHQvZGVzY3JpcHRvci9wb3g1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOEJBLHNEQW9CQztBQWxERCxtRUFBb0Q7QUFHcEQsU0FBUyxtQkFBbUIsQ0FBQyxJQUFVLEVBQUUsYUFBNkM7SUFDcEYsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsdUJBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDNUcsQ0FBQyxLQUFLLEVBQWdDLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUM3RCxDQUFDO0FBQ0osQ0FBQztBQUVELHFHQUFxRztBQUNyRyxNQUFNLHdCQUF3QixHQUFHLENBQUMsQ0FBQztBQUVuQyxTQUFTLHlCQUF5QixDQUFDLElBQVUsRUFBRSxLQUEwQjtJQUN2RSx1QkFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakMsSUFBSSxRQUFRLEtBQUssd0JBQXdCLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyx3QkFBd0IsU0FBUyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCx1R0FBdUc7SUFDdkcsdUJBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxJQUFVLEVBQUUsYUFBNkM7SUFDN0YsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3pELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUN4QixNQUFNLE1BQU0sR0FBRyx1QkFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQ2YsS0FBSyxVQUFVO1lBQ2IsdUJBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDNUMsT0FBTztRQUNULEtBQUssWUFBWTtZQUNmLHlCQUF5QixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QyxPQUFPO1FBQ1Q7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcG94NSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tZGVzY3JpcHRvcnMnO1xuaW1wb3J0IHsgZGVzY3JpcHRvcldhbGxldCwgUHNidCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5mdW5jdGlvbiBnZXRQb3g1SW5wdXRNYXRjaGVzKHBzYnQ6IFBzYnQsIGRlc2NyaXB0b3JNYXA6IGRlc2NyaXB0b3JXYWxsZXQuRGVzY3JpcHRvck1hcCk6IHBveDUuUG94NUlucHV0TWF0Y2hbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBwc2J0LmlucHV0Q291bnQoKSB9LCAoXywgaSkgPT4gcG94NS5tYXRjaFBveDVJbnB1dChwc2J0LCBpLCBkZXNjcmlwdG9yTWFwKSkuZmlsdGVyKFxuICAgIChtYXRjaCk6IG1hdGNoIGlzIHBveDUuUG94NUlucHV0TWF0Y2ggPT4gbWF0Y2ggIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG4vKiogV1AgYnVpbGRzIGVhcmx5IGV4aXRzIHdpdGggYSB6ZXJvIG5Mb2NrVGltZTsgdGhlIGVhcmx5LWV4aXQgYnJhbmNoIGRvZXMgbm90IGV2YWx1YXRlIHRoZSBDTFRWLiAqL1xuY29uc3QgUE9YNV9FQVJMWV9FWElUX0xPQ0tUSU1FID0gMDtcblxuZnVuY3Rpb24gYXNzZXJ0UG94NUVhcmx5RXhpdFBvbGljeShwc2J0OiBQc2J0LCBtYXRjaDogcG94NS5Qb3g1SW5wdXRNYXRjaCk6IHZvaWQge1xuICBwb3g1LmFzc2VydFBveDVFYXJseUV4aXRTcGVuZChwc2J0LCBtYXRjaCk7XG4gIGNvbnN0IGxvY2tUaW1lID0gcHNidC5sb2NrVGltZSgpO1xuICBpZiAobG9ja1RpbWUgIT09IFBPWDVfRUFSTFlfRVhJVF9MT0NLVElNRSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgZWFybHkgZXhpdCBuTG9ja1RpbWUgbXVzdCBiZSAke1BPWDVfRUFSTFlfRVhJVF9MT0NLVElNRX0sIGdvdCAke2xvY2tUaW1lfWApO1xuICB9XG4gIC8vIHRocm93cyB1bmxlc3MgZXhhY3RseSBvbmUgUFNCVF9JTl9TSEEyNTYgcmVjb3JkIGNhcnJpZXMgdGhlIGRlc2NyaXB0b3IncyBjb21taXRtZW50IGFuZCBpdHMgcHJlaW1hZ2VcbiAgcG94NS5nZXRQb3g1UHJpbmNpcGFsUHJlaW1hZ2UocHNidCwgbWF0Y2guaW5wdXRJbmRleCwgbWF0Y2guaW5mbyk7XG59XG5cbi8qKlxuICogQXBwbHkgdGhlIFBvWC01IHN0YWtpbmcgc3BlbmQgcG9saWN5IHRvIGEgUFNCVCBiZWZvcmUgaXQgaXMgc2lnbmVkLlxuICpcbiAqIFBTQlRzIHdpdGhvdXQgUG9YLTUgbG9ja3VwIGlucHV0cyBhcmUgbm90IGFmZmVjdGVkLiBPdGhlcndpc2UsIHRoZSBQU0JUIG11c3Qgc3BlbmQgZXhhY3RseSBvbmUgbG9ja3VwXG4gKiBpbnB1dCB0aHJvdWdoIG9uZSBvZiB0d28gYnJhbmNoZXM6XG4gKiAtIHBvc3QtQ0xUViAobGF0ZSBleGl0KTogbkxvY2tUaW1lIGF0IG9yIGFib3ZlIHRoZSB1bmxvY2sgaGVpZ2h0IGFuZCBhIG5vbi1maW5hbCBzZXF1ZW5jZS5cbiAqIC0gcHJpbmNpcGFsLXByZWltYWdlIChlYXJseSBleGl0KTogbkxvY2tUaW1lIDAgYW5kIHRoZSBwcmluY2lwYWwgcHJlaW1hZ2UgY29tbWl0dGVkIGJ5IHRoZSBkZXNjcmlwdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UG94NVNwZW5kUG9saWN5KHBzYnQ6IFBzYnQsIGRlc2NyaXB0b3JNYXA6IGRlc2NyaXB0b3JXYWxsZXQuRGVzY3JpcHRvck1hcCk6IHZvaWQge1xuICBjb25zdCBtYXRjaGVzID0gZ2V0UG94NUlucHV0TWF0Y2hlcyhwc2J0LCBkZXNjcmlwdG9yTWFwKTtcbiAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChtYXRjaGVzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgZXhhY3RseSBvbmUgUG9YLTUgbG9ja3VwIGlucHV0LCBmb3VuZCAke21hdGNoZXMubGVuZ3RofWApO1xuICB9XG4gIGNvbnN0IFttYXRjaF0gPSBtYXRjaGVzO1xuICBjb25zdCBicmFuY2ggPSBwb3g1LmNsYXNzaWZ5UG94NVNwZW5kKHBzYnQsIG1hdGNoKTtcbiAgc3dpdGNoIChicmFuY2gpIHtcbiAgICBjYXNlICdsb2NrdGltZSc6XG4gICAgICBwb3g1LmFzc2VydFBveDVMb2NrdGltZVNwZW5kKHBzYnQsIG1hdGNoZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgJ2Vhcmx5LWV4aXQnOlxuICAgICAgYXNzZXJ0UG94NUVhcmx5RXhpdFBvbGljeShwc2J0LCBtYXRjaCk7XG4gICAgICByZXR1cm47XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgUG9YLTUgc3BlbmQgYnJhbmNoOiAke2JyYW5jaH1gKTtcbiAgfVxufVxuIl19
@@ -14,6 +14,7 @@ const validatePolicy_1 = require("../../../src/descriptor/validatePolicy");
14
14
  const descriptor_1 = require("../../../src/descriptor");
15
15
  const deriveKeyWithSeed_1 = require("../../../src/deriveKeyWithSeed");
16
16
  const UNLOCK_HEIGHT = 840000;
17
+ const PRINCIPAL_PREIMAGE = Buffer.alloc(32, 0x42);
17
18
  const DERIVATION_ID = 'pox5-test-seed';
18
19
  const INPUT_VALUE = 100000n;
19
20
  const CHANGE_VALUE = 60000n;
@@ -35,7 +36,7 @@ function getForeignKeys() {
35
36
  function createLockupDescriptor(keys, unlockHeight = UNLOCK_HEIGHT) {
36
37
  return utxo_descriptors_1.pox5.createPox5LockupDescriptor({
37
38
  unlockHeight,
38
- stakerCommitment: sha256(Buffer.alloc(32, 0x42)),
39
+ stakerCommitment: sha256(PRINCIPAL_PREIMAGE),
39
40
  earlyExitKey: Buffer.from((0, testutils_1.getKey)('pox5-offline-vault-early-exit').publicKey),
40
41
  stakerKeys: keys,
41
42
  });
@@ -61,6 +62,9 @@ function createPox5Tx(params = {}) {
61
62
  descriptor: internal.atDerivationIndex(3),
62
63
  },
63
64
  ]);
65
+ if (params.earlyExitPreimage) {
66
+ psbt.addSha256Preimage(0, params.earlyExitPreimage);
67
+ }
64
68
  const tx = {
65
69
  xpubsWithDerivationPath: {
66
70
  user: { xpub: keys[0].toBase58(), derivedFromParentWithSeed: DERIVATION_ID },
@@ -103,6 +107,58 @@ describe('OfflineVault PoX-5 lockup descriptor', function () {
103
107
  it('half-signs a late exit with nLockTime above the unlock height', function () {
104
108
  halfSign(coinName, createPox5Tx({ locktime: UNLOCK_HEIGHT + 100 }));
105
109
  });
110
+ describe('early exit', function () {
111
+ const earlyExit = (params = {}) => createPox5Tx({ locktime: 0, earlyExitPreimage: PRINCIPAL_PREIMAGE, ...params });
112
+ it('explains an early exit with a zero nLockTime', function () {
113
+ const explanation = (0, offlineVault_1.getTransactionExplanation)(coinName, earlyExit().tx);
114
+ assert_1.default.strictEqual(explanation.locktime, 0);
115
+ assert_1.default.strictEqual(explanation.outputs.length, 1);
116
+ assert_1.default.strictEqual(explanation.outputs[0].amount, EXTERNAL_VALUE.toString());
117
+ });
118
+ it('half-signs an early exit with the user key', function () {
119
+ const signed = halfSign(coinName, earlyExit());
120
+ const sigs = signed.getPartialSignatures(0);
121
+ assert_1.default.strictEqual(sigs.length, 1);
122
+ assert_1.default.ok(signed.validateSignatureAtInput(0, sigs[0].pubkey));
123
+ // the principal preimage survives signing
124
+ assert_1.default.ok(signed.getInputKeyValues(0).some((r) => r.type === 'known' && r.key === 'PSBT_IN_SHA256'));
125
+ });
126
+ it('half-signs an early exit with a final sequence', function () {
127
+ halfSign(coinName, earlyExit({ sequence: 0xffffffff }));
128
+ });
129
+ it('finalizes once the BitGo key and the early-exit key have signed', function () {
130
+ const early = (0, testutils_1.getKey)('pox5-offline-vault-early-exit');
131
+ const signed = halfSign(coinName, earlyExit());
132
+ signed.signWithXprv((0, testutils_1.getKeyTriple)('pox5-offline-vault')[2].toBase58());
133
+ signed.signWithPrv(early.privateKey);
134
+ assert_1.default.strictEqual(signed.getPartialSignatures(0).length, 3);
135
+ signed.finalizeInput(0);
136
+ const witness = signed.extractTransaction().getInputs()[0].witness;
137
+ assert_1.default.ok(witness.some((item) => Buffer.from(item).equals(PRINCIPAL_PREIMAGE)));
138
+ });
139
+ it('half-signs an early exit that already carries the early-exit key partial', function () {
140
+ const early = (0, testutils_1.getKey)('pox5-offline-vault-early-exit');
141
+ const { tx, rootPrv } = earlyExit();
142
+ const psbt = wasm_utxo_1.Psbt.deserialize(Buffer.from(tx.coinSpecific.txHex, 'hex'));
143
+ psbt.signWithPrv(early.privateKey);
144
+ tx.coinSpecific.txHex = Buffer.from(psbt.serialize()).toString('hex');
145
+ const signed = halfSign(coinName, { tx, rootPrv });
146
+ assert_1.default.strictEqual(signed.getPartialSignatures(0).length, 2);
147
+ });
148
+ it('rejects a non-zero nLockTime', function () {
149
+ assert_1.default.throws(() => halfSign(coinName, earlyExit({ locktime: UNLOCK_HEIGHT })), /nLockTime must be 0/);
150
+ assert_1.default.throws(() => halfSign(coinName, earlyExit({ locktime: 1 })), /nLockTime must be 0/);
151
+ });
152
+ it('rejects a principal preimage that does not match the descriptor commitment', function () {
153
+ assert_1.default.throws(() => halfSign(coinName, earlyExit({ earlyExitPreimage: Buffer.alloc(32, 0x43) })), /expected exactly one PSBT_IN_SHA256 record/);
154
+ });
155
+ it('rejects lockup descriptors with foreign staker keys', function () {
156
+ assert_1.default.throws(() => halfSign(coinName, earlyExit({ lockupKeys: getForeignKeys() })), /does not match policy/);
157
+ });
158
+ it('rejects more than one lockup input', function () {
159
+ assert_1.default.throws(() => halfSign(coinName, earlyExit({ lockupInputs: 2 })), /exactly one PoX-5 lockup input/);
160
+ });
161
+ });
106
162
  describe('rejects', function () {
107
163
  function assertRejected(params, message) {
108
164
  const tx = createPox5Tx(params);
@@ -204,4 +260,4 @@ describe('OfflineVault PoX-5 lockup descriptor', function () {
204
260
  });
205
261
  });
206
262
  });
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG94NS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9vZmZsaW5lVmF1bHQvcG94NS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixtQ0FBb0M7QUFFcEMsbUVBQW9EO0FBQ3BELGdEQUF5RjtBQUN6RiwwREFBa0U7QUFFbEUsNERBQXdGO0FBRXhGLDZEQUEyRTtBQUMzRSwyRUFJZ0Q7QUFDaEQsd0RBQWtFO0FBQ2xFLHNFQUFtRTtBQUduRSxNQUFNLGFBQWEsR0FBRyxNQUFPLENBQUM7QUFDOUIsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7QUFDdkMsTUFBTSxXQUFXLEdBQUcsT0FBUSxDQUFDO0FBQzdCLE1BQU0sWUFBWSxHQUFHLE1BQU8sQ0FBQztBQUM3QixNQUFNLGNBQWMsR0FBRyxNQUFPLENBQUM7QUFFL0IsTUFBTSxTQUFTLEdBQW1CLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBSTNELFNBQVMsTUFBTSxDQUFDLEtBQWlCO0lBQy9CLE9BQU8sSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBUyxhQUFhO0lBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUEsa0JBQU0sRUFBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUM5RCxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBQSx3QkFBWSxFQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDdEYsQ0FBQztBQUVELFNBQVMsY0FBYztJQUNyQixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFBLHdCQUFZLEVBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUM3RCxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxJQUFlLEVBQUUsWUFBWSxHQUFHLGFBQWE7SUFDM0UsT0FBTyx1QkFBSSxDQUFDLDBCQUEwQixDQUFDO1FBQ3JDLFlBQVk7UUFDWixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBQSxrQkFBTSxFQUFDLCtCQUErQixDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzVFLFVBQVUsRUFBRSxJQUFJO0tBQ2pCLENBQUMsQ0FBQztBQUNMLENBQUM7QUFXRCxTQUFTLFlBQVksQ0FBQyxTQUF1QixFQUFFO0lBQzdDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUM7SUFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBQSxrQ0FBd0IsRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sUUFBUSxHQUFHLElBQUEsa0NBQXdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsZ0JBQWdCLElBQUksc0JBQXNCLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUM1RixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbEQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6RSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDN0MsS0FBSyxFQUFFLENBQUM7UUFDUixXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7UUFDekUsVUFBVSxFQUFFLGFBQWE7UUFDekIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksVUFBVTtLQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNKLE1BQU0sSUFBSSxHQUFHLDRCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFO1FBQzNHLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO1FBQy9FO1lBQ0UsTUFBTSxFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUU7WUFDcEQsS0FBSyxFQUFFLFlBQVk7WUFDbkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7U0FDMUM7S0FDRixDQUFDLENBQUM7SUFFSCxNQUFNLEVBQUUsR0FBMEI7UUFDaEMsdUJBQXVCLEVBQUU7WUFDdkIsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSx5QkFBeUIsRUFBRSxhQUFhLEVBQUU7WUFDNUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNwQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1NBQ3BDO1FBQ0QsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3RFLFdBQVcsRUFBRTtZQUNYLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2hELEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2hELEVBQUUsSUFBSSxFQUFFLGdCQUFnQixhQUFhLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO1NBQ3pFO0tBQ0YsQ0FBQztJQUNGLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDekIsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLFFBQXNCLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFpRDtJQUN0RyxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBQSwrQkFBZ0IsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RSxPQUFPLGdCQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxRQUFRLENBQUMsc0NBQXNDLEVBQUU7SUFDL0MsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNqQyxRQUFRLENBQUMsUUFBUSxFQUFFO1lBQ2pCLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtnQkFDN0MsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDO2dCQUM5QixNQUFNLFdBQVcsR0FBRyxJQUFBLHdDQUF5QixFQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDeEQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELGdCQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ2pGLGdCQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxHQUFHLGNBQWMsR0FBRyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3BHLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHdCQUF3QixFQUFFO2dCQUMzQixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7Z0JBQ2xELGdCQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLGdCQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLGdCQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDaEUsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsK0RBQStELEVBQUU7Z0JBQ2xFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEUsQ0FBQyxDQUFDLENBQUM7WUFFSCxRQUFRLENBQUMsU0FBUyxFQUFFO2dCQUNsQixTQUFTLGNBQWMsQ0FBQyxNQUFvQixFQUFFLE9BQWU7b0JBQzNELE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDaEMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDdkQsQ0FBQztnQkFFRCxFQUFFLENBQUMsNkNBQTZDLEVBQUU7b0JBQ2hELE1BQU0sTUFBTSxHQUFHLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQUM7b0JBQ2hELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsd0NBQXlCLEVBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO29CQUMzRyxjQUFjLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxDQUFDO2dCQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRTtvQkFDeEQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO29CQUNqQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUM7b0JBQ25DLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO2dCQUN2RixDQUFDLENBQUMsQ0FBQztnQkFFSCxFQUFFLENBQUMsOENBQThDLEVBQUU7b0JBQ2pELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQztvQkFDakMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLHVCQUF1QixDQUFDLENBQUM7Z0JBQ3ZGLENBQUMsQ0FBQyxDQUFDO2dCQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRTtvQkFDakMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO29CQUNqQyxxREFBcUQ7b0JBQ3JELE1BQU0sSUFBSSxHQUFHLGVBQUcsQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBRTNELENBQUM7b0JBQ0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBVyxFQUFFLENBQUM7b0JBQ3hELE1BQU0sU0FBUyxHQUFHLHNCQUFVLENBQUMsVUFBVSxDQUFDLGVBQUcsQ0FBQyxVQUFVLENBQUMsSUFBMEIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUNqRyxjQUFjLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDLENBQUMsQ0FBQztnQkFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUU7b0JBQ3JDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQztvQkFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO29CQUNuRCxrREFBa0Q7b0JBQ2xELE1BQU0sS0FBSyxHQUFHLHNCQUFVLENBQUMsVUFBVSxDQUFDLGtCQUFrQixLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUM5RyxjQUFjLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO2dCQUN2RSxDQUFDLENBQUMsQ0FBQztnQkFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUU7b0JBQ3RDLGNBQWMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLEdBQUcsQ0FBQyxFQUFFLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztnQkFDaEYsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsRUFBRSxDQUFDLCtCQUErQixFQUFFO29CQUNsQyxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBVyxFQUFFLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztnQkFDaEYsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO29CQUN2QyxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztnQkFDakUsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsRUFBRSxDQUFDLDRCQUE0QixFQUFFO29CQUMvQixjQUFjLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztnQkFDeEUsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyx3REFBd0QsRUFBRTtnQkFDM0QsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBQSxrQ0FBd0IsRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLE1BQU0sSUFBSSxHQUFHLDRCQUFnQixDQUFDLFVBQVUsQ0FDdEMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFDM0I7b0JBQ0U7d0JBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUNyQixLQUFLLEVBQUUsQ0FBQzt3QkFDUixXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7d0JBQ2pFLFVBQVUsRUFBRSxLQUFLO3FCQUNsQjtpQkFDRixFQUNELENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFPLEVBQUUsQ0FBQyxDQUMzRSxDQUFDO2dCQUNGLE1BQU0sRUFBRSxHQUEwQjtvQkFDaEMsdUJBQXVCLEVBQUU7d0JBQ3ZCLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUseUJBQXlCLEVBQUUsYUFBYSxFQUFFO3dCQUM1RSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO3dCQUNwQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO3FCQUNwQztvQkFDRCxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3RFLFdBQVcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7aUJBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSx3Q0FBeUIsRUFBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtRQUNoQyxTQUFTLFFBQVEsQ0FBQyxXQUF5QixFQUFFLElBQTRCO1lBQ3ZFLElBQUEsdUNBQXNCLEVBQ3BCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDM0IsSUFBQSxvQ0FBdUIsRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUNuRixFQUNELElBQUEsZ0NBQWUsRUFBQyxNQUFNLENBQUMsRUFDdkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUM1QixDQUFDO1FBQ0osQ0FBQztRQUVELEVBQUUsQ0FBQyxzRUFBc0UsRUFBRTtZQUN6RSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBQSxrQ0FBd0IsRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pELFFBQVEsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxNQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFO1lBQ2xELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQztZQUNqQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUMzRyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRTtZQUN4QyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBQSxrQ0FBd0IsRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSyxFQUFFLENBQUMsQ0FBQztZQUMzRyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyRUFBMkUsRUFBRTtZQUM5RSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBQSxvQ0FBdUIsRUFDcEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUNsRSxXQUFXLENBQ1osQ0FBQztZQUNGLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDdEYsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwrQ0FBOEIsRUFBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCB7IHBveDUgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWRlc2NyaXB0b3JzJztcbmltcG9ydCB7IGFzdCwgQklQMzIsIGJpcDMyLCBEZXNjcmlwdG9yLCBkZXNjcmlwdG9yV2FsbGV0LCBQc2J0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBnZXRLZXksIGdldEtleVRyaXBsZSB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8vdGVzdHV0aWxzJztcblxuaW1wb3J0IHsgY3JlYXRlSGFsZlNpZ25lZCwgZ2V0VHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9vZmZsaW5lVmF1bHQnO1xuaW1wb3J0IHsgRGVzY3JpcHRvclRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL29mZmxpbmVWYXVsdC9kZXNjcmlwdG9yJztcbmltcG9ydCB7IGdldERlc2NyaXB0b3JGcm9tQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYy9kZXNjcmlwdG9yL2J1aWxkZXInO1xuaW1wb3J0IHtcbiAgYXNzZXJ0RGVzY3JpcHRvclBvbGljeSxcbiAgZ2V0UG9saWN5Rm9yRW52LFxuICBnZXRWYWxpZGF0b3JEZXNjcmlwdG9yVGVtcGxhdGUsXG59IGZyb20gJy4uLy4uLy4uL3NyYy9kZXNjcmlwdG9yL3ZhbGlkYXRlUG9saWN5JztcbmltcG9ydCB7IHRvTmFtZWREZXNjcmlwdG9yTmF0aXZlIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2Rlc2NyaXB0b3InO1xuaW1wb3J0IHsgZGVyaXZlS2V5V2l0aFNlZWQgfSBmcm9tICcuLi8uLi8uLi9zcmMvZGVyaXZlS2V5V2l0aFNlZWQnO1xuaW1wb3J0IHsgVXR4b0NvaW5OYW1lIH0gZnJvbSAnLi4vLi4vLi4vc3JjL25hbWVzJztcblxuY29uc3QgVU5MT0NLX0hFSUdIVCA9IDg0MF8wMDA7XG5jb25zdCBERVJJVkFUSU9OX0lEID0gJ3BveDUtdGVzdC1zZWVkJztcbmNvbnN0IElOUFVUX1ZBTFVFID0gMTAwXzAwMG47XG5jb25zdCBDSEFOR0VfVkFMVUUgPSA2MF8wMDBuO1xuY29uc3QgRVhURVJOQUxfVkFMVUUgPSAzMF8wMDBuO1xuXG5jb25zdCBjb2luTmFtZXM6IFV0eG9Db2luTmFtZVtdID0gWydidGMnLCAndGJ0Y3N0eHNpZ25ldCddO1xuXG50eXBlIEtleVRyaXBsZSA9IFtCSVAzMiwgQklQMzIsIEJJUDMyXTtcblxuZnVuY3Rpb24gc2hhMjU2KHZhbHVlOiBVaW50OEFycmF5KTogQnVmZmVyIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KCk7XG59XG5cbmZ1bmN0aW9uIGdldFdhbGxldEtleXMoKTogeyByb290UHJ2OiBCSVAzMjsga2V5czogS2V5VHJpcGxlIH0ge1xuICBjb25zdCByb290UHJ2ID0gZ2V0S2V5KCdwb3g1LW9mZmxpbmUtdmF1bHQtcm9vdCcpO1xuICBjb25zdCB1c2VyUHJ2ID0gZGVyaXZlS2V5V2l0aFNlZWQocm9vdFBydiwgREVSSVZBVElPTl9JRCkua2V5O1xuICBjb25zdCBbLCBiYWNrdXAsIGJpdGdvXSA9IGdldEtleVRyaXBsZSgncG94NS1vZmZsaW5lLXZhdWx0Jyk7XG4gIHJldHVybiB7IHJvb3RQcnYsIGtleXM6IFt1c2VyUHJ2Lm5ldXRlcmVkKCksIGJhY2t1cC5uZXV0ZXJlZCgpLCBiaXRnby5uZXV0ZXJlZCgpXSB9O1xufVxuXG5mdW5jdGlvbiBnZXRGb3JlaWduS2V5cygpOiBLZXlUcmlwbGUge1xuICBjb25zdCBbYSwgYiwgY10gPSBnZXRLZXlUcmlwbGUoJ3BveDUtb2ZmbGluZS12YXVsdC1mb3JlaWduJyk7XG4gIHJldHVybiBbYS5uZXV0ZXJlZCgpLCBiLm5ldXRlcmVkKCksIGMubmV1dGVyZWQoKV07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvY2t1cERlc2NyaXB0b3Ioa2V5czogS2V5VHJpcGxlLCB1bmxvY2tIZWlnaHQgPSBVTkxPQ0tfSEVJR0hUKTogRGVzY3JpcHRvciB7XG4gIHJldHVybiBwb3g1LmNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yKHtcbiAgICB1bmxvY2tIZWlnaHQsXG4gICAgc3Rha2VyQ29tbWl0bWVudDogc2hhMjU2KEJ1ZmZlci5hbGxvYygzMiwgMHg0MikpLFxuICAgIGVhcmx5RXhpdEtleTogQnVmZmVyLmZyb20oZ2V0S2V5KCdwb3g1LW9mZmxpbmUtdmF1bHQtZWFybHktZXhpdCcpLnB1YmxpY0tleSksXG4gICAgc3Rha2VyS2V5czoga2V5cyxcbiAgfSk7XG59XG5cbnR5cGUgUG94NVR4UGFyYW1zID0ge1xuICAvKioga2V5cyB1c2VkIGluIHRoZSBsb2NrdXAgZGVzY3JpcHRvciwgZGVmYXVsdHMgdG8gdGhlIHdhbGxldCBrZXlzICovXG4gIGxvY2t1cEtleXM/OiBLZXlUcmlwbGU7XG4gIGxvY2t1cERlc2NyaXB0b3I/OiBEZXNjcmlwdG9yO1xuICBsb2NrdGltZT86IG51bWJlcjtcbiAgc2VxdWVuY2U/OiBudW1iZXI7XG4gIGxvY2t1cElucHV0cz86IG51bWJlcjtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVBveDVUeChwYXJhbXM6IFBveDVUeFBhcmFtcyA9IHt9KTogeyB0eDogRGVzY3JpcHRvclRyYW5zYWN0aW9uOyByb290UHJ2OiBCSVAzMiB9IHtcbiAgY29uc3QgeyByb290UHJ2LCBrZXlzIH0gPSBnZXRXYWxsZXRLZXlzKCk7XG4gIGNvbnN0IGV4dGVybmFsID0gZ2V0RGVzY3JpcHRvckZyb21CdWlsZGVyKHsgbmFtZTogJ1dzaDJPZjMnLCBrZXlzLCBwYXRoOiAnMC8qJyB9KTtcbiAgY29uc3QgaW50ZXJuYWwgPSBnZXREZXNjcmlwdG9yRnJvbUJ1aWxkZXIoeyBuYW1lOiAnV3NoMk9mMycsIGtleXMsIHBhdGg6ICcxLyonIH0pO1xuICBjb25zdCBsb2NrdXAgPSBwYXJhbXMubG9ja3VwRGVzY3JpcHRvciA/PyBjcmVhdGVMb2NrdXBEZXNjcmlwdG9yKHBhcmFtcy5sb2NrdXBLZXlzID8/IGtleXMpO1xuICBjb25zdCBsb2NrdXBBdEluZGV4ID0gbG9ja3VwLmF0RGVyaXZhdGlvbkluZGV4KDApO1xuXG4gIGNvbnN0IGlucHV0cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHBhcmFtcy5sb2NrdXBJbnB1dHMgPz8gMSB9LCAoXywgaSkgPT4gKHtcbiAgICBoYXNoOiBCdWZmZXIuYWxsb2MoMzIsIGkgKyAxKS50b1N0cmluZygnaGV4JyksXG4gICAgaW5kZXg6IDAsXG4gICAgd2l0bmVzc1V0eG86IHsgc2NyaXB0OiBsb2NrdXBBdEluZGV4LnNjcmlwdFB1YmtleSgpLCB2YWx1ZTogSU5QVVRfVkFMVUUgfSxcbiAgICBkZXNjcmlwdG9yOiBsb2NrdXBBdEluZGV4LFxuICAgIHNlcXVlbmNlOiBwYXJhbXMuc2VxdWVuY2UgPz8gMHhmZmZmZmZmZSxcbiAgfSkpO1xuICBjb25zdCBwc2J0ID0gZGVzY3JpcHRvcldhbGxldC5jcmVhdGVQc2J0KHsgdmVyc2lvbjogMiwgbG9ja3RpbWU6IHBhcmFtcy5sb2NrdGltZSA/PyBVTkxPQ0tfSEVJR0hUIH0sIGlucHV0cywgW1xuICAgIHsgc2NyaXB0OiBleHRlcm5hbC5hdERlcml2YXRpb25JbmRleCg3KS5zY3JpcHRQdWJrZXkoKSwgdmFsdWU6IEVYVEVSTkFMX1ZBTFVFIH0sXG4gICAge1xuICAgICAgc2NyaXB0OiBpbnRlcm5hbC5hdERlcml2YXRpb25JbmRleCgzKS5zY3JpcHRQdWJrZXkoKSxcbiAgICAgIHZhbHVlOiBDSEFOR0VfVkFMVUUsXG4gICAgICBkZXNjcmlwdG9yOiBpbnRlcm5hbC5hdERlcml2YXRpb25JbmRleCgzKSxcbiAgICB9LFxuICBdKTtcblxuICBjb25zdCB0eDogRGVzY3JpcHRvclRyYW5zYWN0aW9uID0ge1xuICAgIHhwdWJzV2l0aERlcml2YXRpb25QYXRoOiB7XG4gICAgICB1c2VyOiB7IHhwdWI6IGtleXNbMF0udG9CYXNlNTgoKSwgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogREVSSVZBVElPTl9JRCB9LFxuICAgICAgYmFja3VwOiB7IHhwdWI6IGtleXNbMV0udG9CYXNlNTgoKSB9LFxuICAgICAgYml0Z286IHsgeHB1Yjoga2V5c1syXS50b0Jhc2U1OCgpIH0sXG4gICAgfSxcbiAgICBjb2luU3BlY2lmaWM6IHsgdHhIZXg6IEJ1ZmZlci5mcm9tKHBzYnQuc2VyaWFsaXplKCkpLnRvU3RyaW5nKCdoZXgnKSB9LFxuICAgIGRlc2NyaXB0b3JzOiBbXG4gICAgICB7IG5hbWU6ICdleHRlcm5hbCcsIHZhbHVlOiBleHRlcm5hbC50b1N0cmluZygpIH0sXG4gICAgICB7IG5hbWU6ICdpbnRlcm5hbCcsIHZhbHVlOiBpbnRlcm5hbC50b1N0cmluZygpIH0sXG4gICAgICB7IG5hbWU6IGBwb3g1LWxvY2t1cC11JHtVTkxPQ0tfSEVJR0hUfS10ZXN0YCwgdmFsdWU6IGxvY2t1cC50b1N0cmluZygpIH0sXG4gICAgXSxcbiAgfTtcbiAgcmV0dXJuIHsgdHgsIHJvb3RQcnYgfTtcbn1cblxuZnVuY3Rpb24gaGFsZlNpZ24oY29pbk5hbWU6IFV0eG9Db2luTmFtZSwgeyB0eCwgcm9vdFBydiB9OiB7IHR4OiBEZXNjcmlwdG9yVHJhbnNhY3Rpb247IHJvb3RQcnY6IEJJUDMyIH0pOiBQc2J0IHtcbiAgY29uc3QgeyBoYWxmU2lnbmVkIH0gPSBjcmVhdGVIYWxmU2lnbmVkKGNvaW5OYW1lLCByb290UHJ2LCBERVJJVkFUSU9OX0lELCB0eCk7XG4gIHJldHVybiBQc2J0LmRlc2VyaWFsaXplKEJ1ZmZlci5mcm9tKGhhbGZTaWduZWQudHhIZXgsICdoZXgnKSk7XG59XG5cbmRlc2NyaWJlKCdPZmZsaW5lVmF1bHQgUG9YLTUgbG9ja3VwIGRlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIGZvciAoY29uc3QgY29pbk5hbWUgb2YgY29pbk5hbWVzKSB7XG4gICAgZGVzY3JpYmUoY29pbk5hbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdleHBsYWlucyBhIGxhdGUgZXhpdCBpbmNsdWRpbmcgbkxvY2tUaW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB7IHR4IH0gPSBjcmVhdGVQb3g1VHgoKTtcbiAgICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBnZXRUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKGNvaW5OYW1lLCB0eCk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5sb2NrdGltZSwgVU5MT0NLX0hFSUdIVCk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFtb3VudCwgRVhURVJOQUxfVkFMVUUudG9TdHJpbmcoKSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzWzBdLmFtb3VudCwgQ0hBTkdFX1ZBTFVFLnRvU3RyaW5nKCkpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24uZmVlLmZlZSwgKElOUFVUX1ZBTFVFIC0gRVhURVJOQUxfVkFMVUUgLSBDSEFOR0VfVkFMVUUpLnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdoYWxmLXNpZ25zIGEgbGF0ZSBleGl0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzaWduZWQgPSBoYWxmU2lnbihjb2luTmFtZSwgY3JlYXRlUG94NVR4KCkpO1xuICAgICAgICBhc3NlcnQub2soc2lnbmVkLmhhc1BhcnRpYWxTaWduYXR1cmVzKDApKTtcbiAgICAgICAgY29uc3Qgc2lncyA9IHNpZ25lZC5nZXRQYXJ0aWFsU2lnbmF0dXJlcygwKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNpZ3MubGVuZ3RoLCAxKTtcbiAgICAgICAgYXNzZXJ0Lm9rKHNpZ25lZC52YWxpZGF0ZVNpZ25hdHVyZUF0SW5wdXQoMCwgc2lnc1swXS5wdWJrZXkpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaGFsZi1zaWducyBhIGxhdGUgZXhpdCB3aXRoIG5Mb2NrVGltZSBhYm92ZSB0aGUgdW5sb2NrIGhlaWdodCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaGFsZlNpZ24oY29pbk5hbWUsIGNyZWF0ZVBveDVUeCh7IGxvY2t0aW1lOiBVTkxPQ0tfSEVJR0hUICsgMTAwIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgncmVqZWN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gYXNzZXJ0UmVqZWN0ZWQocGFyYW1zOiBQb3g1VHhQYXJhbXMsIG1lc3NhZ2U6IFJlZ0V4cCkge1xuICAgICAgICAgIGNvbnN0IHR4ID0gY3JlYXRlUG94NVR4KHBhcmFtcyk7XG4gICAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBoYWxmU2lnbihjb2luTmFtZSwgdHgpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0KCdsb2NrdXAgZGVzY3JpcHRvcnMgd2l0aCBmb3JlaWduIHN0YWtlciBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHsgbG9ja3VwS2V5czogZ2V0Rm9yZWlnbktleXMoKSB9O1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZ2V0VHJhbnNhY3Rpb25FeHBsYW5hdGlvbihjb2luTmFtZSwgY3JlYXRlUG94NVR4KHBhcmFtcykudHgpLCAvZG9lcyBub3QgbWF0Y2ggcG9saWN5Lyk7XG4gICAgICAgICAgYXNzZXJ0UmVqZWN0ZWQocGFyYW1zLCAvZG9lcyBub3QgbWF0Y2ggcG9saWN5Lyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdsb2NrdXAgZGVzY3JpcHRvcnMgd2l0aCBvbmx5IG9uZSBmb3JlaWduIHN0YWtlciBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgeyBrZXlzIH0gPSBnZXRXYWxsZXRLZXlzKCk7XG4gICAgICAgICAgY29uc3QgW2ZvcmVpZ25dID0gZ2V0Rm9yZWlnbktleXMoKTtcbiAgICAgICAgICBhc3NlcnRSZWplY3RlZCh7IGxvY2t1cEtleXM6IFtrZXlzWzBdLCBrZXlzWzFdLCBmb3JlaWduXSB9LCAvZG9lcyBub3QgbWF0Y2ggcG9saWN5Lyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdsb2NrdXAgZGVzY3JpcHRvcnMgd2l0aCBwZXJtdXRlZCBzdGFrZXIga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB7IGtleXMgfSA9IGdldFdhbGxldEtleXMoKTtcbiAgICAgICAgICBhc3NlcnRSZWplY3RlZCh7IGxvY2t1cEtleXM6IFtrZXlzWzFdLCBrZXlzWzBdLCBrZXlzWzJdXSB9LCAvZG9lcyBub3QgbWF0Y2ggcG9saWN5Lyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdtYWxmb3JtZWQgbG9ja3VwIGRlc2NyaXB0b3JzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHsga2V5cyB9ID0gZ2V0V2FsbGV0S2V5cygpO1xuICAgICAgICAgIC8vIHVubG9jayBoZWlnaHQgaXMgb3V0c2lkZSBvZiB0aGUgYmxvY2sgaGVpZ2h0IHJhbmdlXG4gICAgICAgICAgY29uc3Qgbm9kZSA9IGFzdC5mcm9tRGVzY3JpcHRvcihjcmVhdGVMb2NrdXBEZXNjcmlwdG9yKGtleXMpKSBhcyB7XG4gICAgICAgICAgICB3c2g6IHsgYW5kX3Y6IFt7ICd2Om9yX2knOiBbeyBhZnRlcjogbnVtYmVyIH0sIHVua25vd25dIH0sIHVua25vd25dIH07XG4gICAgICAgICAgfTtcbiAgICAgICAgICBub2RlLndzaC5hbmRfdlswXVsndjpvcl9pJ11bMF0gPSB7IGFmdGVyOiA2MDBfMDAwXzAwMCB9O1xuICAgICAgICAgIGNvbnN0IG1hbGZvcm1lZCA9IERlc2NyaXB0b3IuZnJvbVN0cmluZyhhc3QuZm9ybWF0Tm9kZShub2RlIGFzIGFzdC5EZXNjcmlwdG9yTm9kZSksICdkZXJpdmFibGUnKTtcbiAgICAgICAgICBhc3NlcnRSZWplY3RlZCh7IGxvY2t1cERlc2NyaXB0b3I6IG1hbGZvcm1lZCB9LCAvZG9lcyBub3QgbWF0Y2ggcG9saWN5Lyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdub24tY2Fub25pY2FsIGxvY2t1cCBkZXNjcmlwdG9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB7IGtleXMgfSA9IGdldFdhbGxldEtleXMoKTtcbiAgICAgICAgICBjb25zdCB4cHVicyA9IGtleXMubWFwKChrKSA9PiBrLnRvQmFzZTU4KCkgKyAnLyonKTtcbiAgICAgICAgICAvLyBwbGFpbiAyLW9mLTMgd2l0aCB0aGUgZWFybHkgZXhpdCBicmFuY2ggcmVtb3ZlZFxuICAgICAgICAgIGNvbnN0IG90aGVyID0gRGVzY3JpcHRvci5mcm9tU3RyaW5nKGB3c2goYW5kX3Yodjpwaygke3hwdWJzWzBdfSksbXVsdGkoMiwke3hwdWJzLmpvaW4oJywnKX0pKSlgLCAnZGVyaXZhYmxlJyk7XG4gICAgICAgICAgYXNzZXJ0UmVqZWN0ZWQoeyBsb2NrdXBEZXNjcmlwdG9yOiBvdGhlciB9LCAvZG9lcyBub3QgbWF0Y2ggcG9saWN5Lyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCduTG9ja1RpbWUgYmVsb3cgdGhlIHVubG9jayBoZWlnaHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXNzZXJ0UmVqZWN0ZWQoeyBsb2NrdGltZTogVU5MT0NLX0hFSUdIVCAtIDEgfSwgL25Mb2NrVGltZSBtdXN0IGJlIGF0IGxlYXN0Lyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCduTG9ja1RpbWUgdGhhdCBpcyBhIHRpbWVzdGFtcCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBhc3NlcnRSZWplY3RlZCh7IGxvY2t0aW1lOiA1MDBfMDAwXzAwMCB9LCAvbkxvY2tUaW1lIG11c3QgYmUgYSBibG9jayBoZWlnaHQvKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2ZpbmFsIHNlcXVlbmNlIG9uIHRoZSBsb2NrdXAgaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXNzZXJ0UmVqZWN0ZWQoeyBzZXF1ZW5jZTogMHhmZmZmZmZmZiB9LCAvbm9uLWZpbmFsIHNlcXVlbmNlLyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdtb3JlIHRoYW4gb25lIGxvY2t1cCBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBhc3NlcnRSZWplY3RlZCh7IGxvY2t1cElucHV0czogMiB9LCAvZXhhY3RseSBvbmUgUG9YLTUgbG9ja3VwIGlucHV0Lyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzdGlsbCBleHBsYWlucyBhbmQgc2lnbnMgYSByZWd1bGFyIFdzaDJPZjMgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHsgcm9vdFBydiwga2V5cyB9ID0gZ2V0V2FsbGV0S2V5cygpO1xuICAgICAgICBjb25zdCBleHRlcm5hbCA9IGdldERlc2NyaXB0b3JGcm9tQnVpbGRlcih7IG5hbWU6ICdXc2gyT2YzJywga2V5cywgcGF0aDogJzAvKicgfSk7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXh0ZXJuYWwuYXREZXJpdmF0aW9uSW5kZXgoMSk7XG4gICAgICAgIGNvbnN0IHBzYnQgPSBkZXNjcmlwdG9yV2FsbGV0LmNyZWF0ZVBzYnQoXG4gICAgICAgICAgeyB2ZXJzaW9uOiAyLCBsb2NrdGltZTogMCB9LFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGFzaDogJzAxJy5yZXBlYXQoMzIpLFxuICAgICAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICAgICAgd2l0bmVzc1V0eG86IHsgc2NyaXB0OiBpbnB1dC5zY3JpcHRQdWJrZXkoKSwgdmFsdWU6IElOUFVUX1ZBTFVFIH0sXG4gICAgICAgICAgICAgIGRlc2NyaXB0b3I6IGlucHV0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIFt7IHNjcmlwdDogZXh0ZXJuYWwuYXREZXJpdmF0aW9uSW5kZXgoMikuc2NyaXB0UHVia2V5KCksIHZhbHVlOiA5MF8wMDBuIH1dXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHR4OiBEZXNjcmlwdG9yVHJhbnNhY3Rpb24gPSB7XG4gICAgICAgICAgeHB1YnNXaXRoRGVyaXZhdGlvblBhdGg6IHtcbiAgICAgICAgICAgIHVzZXI6IHsgeHB1Yjoga2V5c1swXS50b0Jhc2U1OCgpLCBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkOiBERVJJVkFUSU9OX0lEIH0sXG4gICAgICAgICAgICBiYWNrdXA6IHsgeHB1Yjoga2V5c1sxXS50b0Jhc2U1OCgpIH0sXG4gICAgICAgICAgICBiaXRnbzogeyB4cHViOiBrZXlzWzJdLnRvQmFzZTU4KCkgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzogeyB0eEhleDogQnVmZmVyLmZyb20ocHNidC5zZXJpYWxpemUoKSkudG9TdHJpbmcoJ2hleCcpIH0sXG4gICAgICAgICAgZGVzY3JpcHRvcnM6IFt7IG5hbWU6ICdleHRlcm5hbCcsIHZhbHVlOiBleHRlcm5hbC50b1N0cmluZygpIH1dLFxuICAgICAgICB9O1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0VHJhbnNhY3Rpb25FeHBsYW5hdGlvbihjb2luTmFtZSwgdHgpLmxvY2t0aW1lLCAwKTtcbiAgICAgICAgYXNzZXJ0Lm9rKGhhbGZTaWduKGNvaW5OYW1lLCB7IHR4LCByb290UHJ2IH0pLmhhc1BhcnRpYWxTaWduYXR1cmVzKDApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZGVzY3JpYmUoJ2dldFBvbGljeUZvckVudihwcm9kKScsIGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShkZXNjcmlwdG9yczogRGVzY3JpcHRvcltdLCBrZXlzOiBiaXAzMi5CSVAzMkludGVyZmFjZVtdKSB7XG4gICAgICBhc3NlcnREZXNjcmlwdG9yUG9saWN5KFxuICAgICAgICBkZXNjcmlwdG9ycy5tYXAoKHZhbHVlLCBpKSA9PlxuICAgICAgICAgIHRvTmFtZWREZXNjcmlwdG9yTmF0aXZlKHsgbmFtZTogU3RyaW5nKGkpLCB2YWx1ZTogdmFsdWUudG9TdHJpbmcoKSB9LCAnZGVyaXZhYmxlJylcbiAgICAgICAgKSxcbiAgICAgICAgZ2V0UG9saWN5Rm9yRW52KCdwcm9kJyksXG4gICAgICAgIFtrZXlzWzBdLCBrZXlzWzFdLCBrZXlzWzJdXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpdCgnYWNjZXB0cyB3YWxsZXQgZGVzY3JpcHRvcnMgdG9nZXRoZXIgd2l0aCB0aGUgUG9YLTUgbG9ja3VwIGRlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IGtleXMgfSA9IGdldFdhbGxldEtleXMoKTtcbiAgICAgIGNvbnN0IGV4dGVybmFsID0gZ2V0RGVzY3JpcHRvckZyb21CdWlsZGVyKHsgbmFtZTogJ1dzaDJPZjMnLCBrZXlzLCBwYXRoOiAnMC8qJyB9KTtcbiAgICAgIHZhbGlkYXRlKFtleHRlcm5hbCwgY3JlYXRlTG9ja3VwRGVzY3JpcHRvcihrZXlzKV0sIGtleXMpO1xuICAgICAgdmFsaWRhdGUoW2NyZWF0ZUxvY2t1cERlc2NyaXB0b3Ioa2V5cywgOTAwXzAwMCldLCBrZXlzKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgbG9ja3VwIGRlc2NyaXB0b3Igd2l0aCBmb3JlaWduIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IGtleXMgfSA9IGdldFdhbGxldEtleXMoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdGUoW2NyZWF0ZUxvY2t1cERlc2NyaXB0b3IoZ2V0Rm9yZWlnbktleXMoKSldLCBrZXlzKSwgL2RvZXMgbm90IG1hdGNoIHBvbGljeS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FjY2VwdHMgV3NoMk9mM0NsdHZEcm9wIGRlc2NyaXB0b3JzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyBrZXlzIH0gPSBnZXRXYWxsZXRLZXlzKCk7XG4gICAgICBjb25zdCBjbHR2RHJvcCA9IGdldERlc2NyaXB0b3JGcm9tQnVpbGRlcih7IG5hbWU6ICdXc2gyT2YzQ2x0dkRyb3AnLCBrZXlzLCBwYXRoOiAnMC8qJywgbG9ja3RpbWU6IDFfMDAwIH0pO1xuICAgICAgdmFsaWRhdGUoW2NsdHZEcm9wXSwga2V5cyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBmYWxzZSBpbnN0ZWFkIG9mIHRocm93aW5nIGZvciBkZXNjcmlwdG9ycyBhIHRlbXBsYXRlIGNhbm5vdCBwYXJzZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsga2V5cyB9ID0gZ2V0V2FsbGV0S2V5cygpO1xuICAgICAgY29uc3QgbG9ja3VwID0gdG9OYW1lZERlc2NyaXB0b3JOYXRpdmUoXG4gICAgICAgIHsgbmFtZTogJ2xvY2t1cCcsIHZhbHVlOiBjcmVhdGVMb2NrdXBEZXNjcmlwdG9yKGtleXMpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgJ2Rlcml2YWJsZSdcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgWydXc2gyT2YzJywgJ1dzaDJPZjNDbHR2RHJvcCcsICdTaFdzaDJPZjNDbHR2RHJvcCcsICdTYnRjRGVwb3NpdCddKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRWYWxpZGF0b3JEZXNjcmlwdG9yVGVtcGxhdGUobmFtZSkudmFsaWRhdGUoW2xvY2t1cF0sIFtrZXlzWzBdLCBrZXlzWzFdLCBrZXlzWzJdXSksIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG94NS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9vZmZsaW5lVmF1bHQvcG94NS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixtQ0FBb0M7QUFFcEMsbUVBQW9EO0FBQ3BELGdEQUF5RjtBQUN6RiwwREFBa0U7QUFFbEUsNERBQXdGO0FBRXhGLDZEQUEyRTtBQUMzRSwyRUFJZ0Q7QUFDaEQsd0RBQWtFO0FBQ2xFLHNFQUFtRTtBQUduRSxNQUFNLGFBQWEsR0FBRyxNQUFPLENBQUM7QUFDOUIsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsRCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztBQUN2QyxNQUFNLFdBQVcsR0FBRyxPQUFRLENBQUM7QUFDN0IsTUFBTSxZQUFZLEdBQUcsTUFBTyxDQUFDO0FBQzdCLE1BQU0sY0FBYyxHQUFHLE1BQU8sQ0FBQztBQUUvQixNQUFNLFNBQVMsR0FBbUIsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFJM0QsU0FBUyxNQUFNLENBQUMsS0FBaUI7SUFDL0IsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGFBQWE7SUFDcEIsTUFBTSxPQUFPLEdBQUcsSUFBQSxrQkFBTSxFQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzlELE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFBLHdCQUFZLEVBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM3RCxPQUFPLEVBQUUsT0FB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QUFFLENBQUM7WUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBQSxvQ0FBdUIsRUFDcEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUNsRSxXQUFXLENBQ1osQ0FBQztZQUNGLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDdEYsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwrQ0FBOEIsRUFBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCB7IHBveDUgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWRlc2NyaXB0b3JzJztcbmltcG9ydCB7IGFzdCwgQklQMzIsIGJpcDMyLCBEZXNjcmlwdG9yLCBkZXNjcmlwdG9yV2FsbGV0LCBQc2J0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBnZXRLZXksIGdldEtleVRyaXBsZSB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8vdGVzdHV0aWxzJztcblxuaW1wb3J0IHsgY3JlYXRlSGFsZlNpZ25lZCwgZ2V0VHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9vZmZsaW5lVmF1bHQnO1xuaW1wb3J0IHsgRGVzY3JpcHRvclRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL29mZmxpbmVWYXVsdC9kZXNjcmlwdG9yJztcbmltcG9ydCB7IGdldERlc2NyaXB0b3JGcm9tQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYy9kZXNjcmlwdG9yL2J1aWxkZXInO1xuaW1wb3J0IHtcbiAgYXNzZXJ0RGVzY3JpcHRvclBvbGljeSxcbiAgZ2V0UG9saWN5Rm9yRW52LFxuICBnZXRWYWxpZGF0b3JEZXNjcmlwdG9yVGVtcGxhdGUsXG59IGZyb20gJy4uLy4uLy4uL3NyYy9kZXNjcmlwdG9yL3ZhbGlkYXRlUG9saWN5JztcbmltcG9ydCB7IHRvTmFtZWREZXNjcmlwdG9yTmF0aXZlIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2Rlc2NyaXB0b3InO1xuaW1wb3J0IHsgZGVyaXZlS2V5V2l0aFNlZWQgfSBmcm9tICcuLi8uLi8uLi9zcmMvZGVyaXZlS2V5V2l0aFNlZWQnO1xuaW1wb3J0IHsgVXR4b0NvaW5OYW1lIH0gZnJvbSAnLi4vLi4vLi4vc3JjL25hbWVzJztcblxuY29uc3QgVU5MT0NLX0hFSUdIVCA9IDg0MF8wMDA7XG5jb25zdCBQUklOQ0lQQUxfUFJFSU1BR0UgPSBCdWZmZXIuYWxsb2MoMzIsIDB4NDIpO1xuY29uc3QgREVSSVZBVElPTl9JRCA9ICdwb3g1LXRlc3Qtc2VlZCc7XG5jb25zdCBJTlBVVF9WQUxVRSA9IDEwMF8wMDBuO1xuY29uc3QgQ0hBTkdFX1ZBTFVFID0gNjBfMDAwbjtcbmNvbnN0IEVYVEVSTkFMX1ZBTFVFID0gMzBfMDAwbjtcblxuY29uc3QgY29pbk5hbWVzOiBVdHhvQ29pbk5hbWVbXSA9IFsnYnRjJywgJ3RidGNzdHhzaWduZXQnXTtcblxudHlwZSBLZXlUcmlwbGUgPSBbQklQMzIsIEJJUDMyLCBCSVAzMl07XG5cbmZ1bmN0aW9uIHNoYTI1Nih2YWx1ZTogVWludDhBcnJheSk6IEJ1ZmZlciB7XG4gIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUodmFsdWUpLmRpZ2VzdCgpO1xufVxuXG5mdW5jdGlvbiBnZXRXYWxsZXRLZXlzKCk6IHsgcm9vdFBydjogQklQMzI7IGtleXM6IEtleVRyaXBsZSB9IHtcbiAgY29uc3Qgcm9vdFBydiA9IGdldEtleSgncG94NS1vZmZsaW5lLXZhdWx0LXJvb3QnKTtcbiAgY29uc3QgdXNlclBydiA9IGRlcml2ZUtleVdpdGhTZWVkKHJvb3RQcnYsIERFUklWQVRJT05fSUQpLmtleTtcbiAgY29uc3QgWywgYmFja3VwLCBiaXRnb10gPSBnZXRLZXlUcmlwbGUoJ3BveDUtb2ZmbGluZS12YXVsdCcpO1xuICByZXR1cm4geyByb290UHJ2LCBrZXlzOiBbdXNlclBydi5uZXV0ZXJlZCgpLCBiYWNrdXAubmV1dGVyZWQoKSwgYml0Z28ubmV1dGVyZWQoKV0gfTtcbn1cblxuZnVuY3Rpb24gZ2V0Rm9yZWlnbktleXMoKTogS2V5VHJpcGxlIHtcbiAgY29uc3QgW2EsIGIsIGNdID0gZ2V0S2V5VHJpcGxlKCdwb3g1LW9mZmxpbmUtdmF1bHQtZm9yZWlnbicpO1xuICByZXR1cm4gW2EubmV1dGVyZWQoKSwgYi5uZXV0ZXJlZCgpLCBjLm5ldXRlcmVkKCldO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2NrdXBEZXNjcmlwdG9yKGtleXM6IEtleVRyaXBsZSwgdW5sb2NrSGVpZ2h0ID0gVU5MT0NLX0hFSUdIVCk6IERlc2NyaXB0b3Ige1xuICByZXR1cm4gcG94NS5jcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcih7XG4gICAgdW5sb2NrSGVpZ2h0LFxuICAgIHN0YWtlckNvbW1pdG1lbnQ6IHNoYTI1NihQUklOQ0lQQUxfUFJFSU1BR0UpLFxuICAgIGVhcmx5RXhpdEtleTogQnVmZmVyLmZyb20oZ2V0S2V5KCdwb3g1LW9mZmxpbmUtdmF1bHQtZWFybHktZXhpdCcpLnB1YmxpY0tleSksXG4gICAgc3Rha2VyS2V5czoga2V5cyxcbiAgfSk7XG59XG5cbnR5cGUgUG94NVR4UGFyYW1zID0ge1xuICAvKioga2V5cyB1c2VkIGluIHRoZSBsb2NrdXAgZGVzY3JpcHRvciwgZGVmYXVsdHMgdG8gdGhlIHdhbGxldCBrZXlzICovXG4gIGxvY2t1cEtleXM/OiBLZXlUcmlwbGU7XG4gIGxvY2t1cERlc2NyaXB0b3I/OiBEZXNjcmlwdG9yO1xuICBsb2NrdGltZT86IG51bWJlcjtcbiAgc2VxdWVuY2U/OiBudW1iZXI7XG4gIGxvY2t1cElucHV0cz86IG51bWJlcjtcbiAgLyoqIGFkZCB0aGUgcHJpbmNpcGFsIHByZWltYWdlIG9mIHRoZSBsb2NrdXAgaW5wdXQsIHdoaWNoIG1ha2VzIHRoZSBzcGVuZCBhbiBlYXJseSBleGl0ICovXG4gIGVhcmx5RXhpdFByZWltYWdlPzogVWludDhBcnJheTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVBveDVUeChwYXJhbXM6IFBveDVUeFBhcmFtcyA9IHt9KTogeyB0eDogRGVzY3JpcHRvclRyYW5zYWN0aW9uOyByb290UHJ2OiBCSVAzMiB9IHtcbiAgY29uc3QgeyByb290UHJ2LCBrZXlzIH0gPSBnZXRXYWxsZXRLZXlzKCk7XG4gIGNvbnN0IGV4dGVybmFsID0gZ2V0RGVzY3JpcHRvckZyb21CdWlsZGVyKHsgbmFtZTogJ1dzaDJPZjMnLCBrZXlzLCBwYXRoOiAnMC8qJyB9KTtcbiAgY29uc3QgaW50ZXJuYWwgPSBnZXREZXNjcmlwdG9yRnJvbUJ1aWxkZXIoeyBuYW1lOiAnV3NoMk9mMycsIGtleXMsIHBhdGg6ICcxLyonIH0pO1xuICBjb25zdCBsb2NrdXAgPSBwYXJhbXMubG9ja3VwRGVzY3JpcHRvciA/PyBjcmVhdGVMb2NrdXBEZXNjcmlwdG9yKHBhcmFtcy5sb2NrdXBLZXlzID8/IGtleXMpO1xuICBjb25zdCBsb2NrdXBBdEluZGV4ID0gbG9ja3VwLmF0RGVyaXZhdGlvbkluZGV4KDApO1xuXG4gIGNvbnN0IGlucHV0cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHBhcmFtcy5sb2NrdXBJbnB1dHMgPz8gMSB9LCAoXywgaSkgPT4gKHtcbiAgICBoYXNoOiBCdWZmZXIuYWxsb2MoMzIsIGkgKyAxKS50b1N0cmluZygnaGV4JyksXG4gICAgaW5kZXg6IDAsXG4gICAgd2l0bmVzc1V0eG86IHsgc2NyaXB0OiBsb2NrdXBBdEluZGV4LnNjcmlwdFB1YmtleSgpLCB2YWx1ZTogSU5QVVRfVkFMVUUgfSxcbiAgICBkZXNjcmlwdG9yOiBsb2NrdXBBdEluZGV4LFxuICAgIHNlcXVlbmNlOiBwYXJhbXMuc2VxdWVuY2UgPz8gMHhmZmZmZmZmZSxcbiAgfSkpO1xuICBjb25zdCBwc2J0ID0gZGVzY3JpcHRvcldhbGxldC5jcmVhdGVQc2J0KHsgdmVyc2lvbjogMiwgbG9ja3RpbWU6IHBhcmFtcy5sb2NrdGltZSA/PyBVTkxPQ0tfSEVJR0hUIH0sIGlucHV0cywgW1xuICAgIHsgc2NyaXB0OiBleHRlcm5hbC5hdERlcml2YXRpb25JbmRleCg3KS5zY3JpcHRQdWJrZXkoKSwgdmFsdWU6IEVYVEVSTkFMX1ZBTFVFIH0sXG4gICAge1xuICAgICAgc2NyaXB0OiBpbnRlcm5hbC5hdERlcml2YXRpb25JbmRleCgzKS5zY3JpcHRQdWJrZXkoKSxcbiAgICAgIHZhbHVlOiBDSEFOR0VfVkFMVUUsXG4gICAgICBkZXNjcmlwdG9yOiBpbnRlcm5hbC5hdERlcml2YXRpb25JbmRleCgzKSxcbiAgICB9LFxuICBdKTtcblxuICBpZiAocGFyYW1zLmVhcmx5RXhpdFByZWltYWdlKSB7XG4gICAgcHNidC5hZGRTaGEyNTZQcmVpbWFnZSgwLCBwYXJhbXMuZWFybHlFeGl0UHJlaW1hZ2UpO1xuICB9XG5cbiAgY29uc3QgdHg6IERlc2NyaXB0b3JUcmFuc2FjdGlvbiA9IHtcbiAgICB4cHVic1dpdGhEZXJpdmF0aW9uUGF0aDoge1xuICAgICAgdXNlcjogeyB4cHViOiBrZXlzWzBdLnRvQmFzZTU4KCksIGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ6IERFUklWQVRJT05fSUQgfSxcbiAgICAgIGJhY2t1cDogeyB4cHViOiBrZXlzWzFdLnRvQmFzZTU4KCkgfSxcbiAgICAgIGJpdGdvOiB7IHhwdWI6IGtleXNbMl0udG9CYXNlNTgoKSB9LFxuICAgIH0sXG4gICAgY29pblNwZWNpZmljOiB7IHR4SGV4OiBCdWZmZXIuZnJvbShwc2J0LnNlcmlhbGl6ZSgpKS50b1N0cmluZygnaGV4JykgfSxcbiAgICBkZXNjcmlwdG9yczogW1xuICAgICAgeyBuYW1lOiAnZXh0ZXJuYWwnLCB2YWx1ZTogZXh0ZXJuYWwudG9TdHJpbmcoKSB9LFxuICAgICAgeyBuYW1lOiAnaW50ZXJuYWwnLCB2YWx1ZTogaW50ZXJuYWwudG9TdHJpbmcoKSB9LFxuICAgICAgeyBuYW1lOiBgcG94NS1sb2NrdXAtdSR7VU5MT0NLX0hFSUdIVH0tdGVzdGAsIHZhbHVlOiBsb2NrdXAudG9TdHJpbmcoKSB9LFxuICAgIF0sXG4gIH07XG4gIHJldHVybiB7IHR4LCByb290UHJ2IH07XG59XG5cbmZ1bmN0aW9uIGhhbGZTaWduKGNvaW5OYW1lOiBVdHhvQ29pbk5hbWUsIHsgdHgsIHJvb3RQcnYgfTogeyB0eDogRGVzY3JpcHRvclRyYW5zYWN0aW9uOyByb290UHJ2OiBCSVAzMiB9KTogUHNidCB7XG4gIGNvbnN0IHsgaGFsZlNpZ25lZCB9ID0gY3JlYXRlSGFsZlNpZ25lZChjb2luTmFtZSwgcm9vdFBydiwgREVSSVZBVElPTl9JRCwgdHgpO1xuICByZXR1cm4gUHNidC5kZXNlcmlhbGl6ZShCdWZmZXIuZnJvbShoYWxmU2lnbmVkLnR4SGV4LCAnaGV4JykpO1xufVxuXG5kZXNjcmliZSgnT2ZmbGluZVZhdWx0IFBvWC01IGxvY2t1cCBkZXNjcmlwdG9yJywgZnVuY3Rpb24gKCkge1xuICBmb3IgKGNvbnN0IGNvaW5OYW1lIG9mIGNvaW5OYW1lcykge1xuICAgIGRlc2NyaWJlKGNvaW5OYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnZXhwbGFpbnMgYSBsYXRlIGV4aXQgaW5jbHVkaW5nIG5Mb2NrVGltZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgeyB0eCB9ID0gY3JlYXRlUG94NVR4KCk7XG4gICAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gZ2V0VHJhbnNhY3Rpb25FeHBsYW5hdGlvbihjb2luTmFtZSwgdHgpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ubG9ja3RpbWUsIFVOTE9DS19IRUlHSFQpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hbW91bnQsIEVYVEVSTkFMX1ZBTFVFLnRvU3RyaW5nKCkpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0c1swXS5hbW91bnQsIENIQU5HRV9WQUxVRS50b1N0cmluZygpKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLmZlZS5mZWUsIChJTlBVVF9WQUxVRSAtIEVYVEVSTkFMX1ZBTFVFIC0gQ0hBTkdFX1ZBTFVFKS50b1N0cmluZygpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaGFsZi1zaWducyBhIGxhdGUgZXhpdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2lnbmVkID0gaGFsZlNpZ24oY29pbk5hbWUsIGNyZWF0ZVBveDVUeCgpKTtcbiAgICAgICAgYXNzZXJ0Lm9rKHNpZ25lZC5oYXNQYXJ0aWFsU2lnbmF0dXJlcygwKSk7XG4gICAgICAgIGNvbnN0IHNpZ3MgPSBzaWduZWQuZ2V0UGFydGlhbFNpZ25hdHVyZXMoMCk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzaWdzLmxlbmd0aCwgMSk7XG4gICAgICAgIGFzc2VydC5vayhzaWduZWQudmFsaWRhdGVTaWduYXR1cmVBdElucHV0KDAsIHNpZ3NbMF0ucHVia2V5KSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhbGYtc2lnbnMgYSBsYXRlIGV4aXQgd2l0aCBuTG9ja1RpbWUgYWJvdmUgdGhlIHVubG9jayBoZWlnaHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGhhbGZTaWduKGNvaW5OYW1lLCBjcmVhdGVQb3g1VHgoeyBsb2NrdGltZTogVU5MT0NLX0hFSUdIVCArIDEwMCB9KSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ2Vhcmx5IGV4aXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGVhcmx5RXhpdCA9IChwYXJhbXM6IFBveDVUeFBhcmFtcyA9IHt9KSA9PlxuICAgICAgICAgIGNyZWF0ZVBveDVUeCh7IGxvY2t0aW1lOiAwLCBlYXJseUV4aXRQcmVpbWFnZTogUFJJTkNJUEFMX1BSRUlNQUdFLCAuLi5wYXJhbXMgfSk7XG5cbiAgICAgICAgaXQoJ2V4cGxhaW5zIGFuIGVhcmx5IGV4aXQgd2l0aCBhIHplcm8gbkxvY2tUaW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gZ2V0VHJhbnNhY3Rpb25FeHBsYW5hdGlvbihjb2luTmFtZSwgZWFybHlFeGl0KCkudHgpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5sb2NrdGltZSwgMCk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hbW91bnQsIEVYVEVSTkFMX1ZBTFVFLnRvU3RyaW5nKCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnaGFsZi1zaWducyBhbiBlYXJseSBleGl0IHdpdGggdGhlIHVzZXIga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHNpZ25lZCA9IGhhbGZTaWduKGNvaW5OYW1lLCBlYXJseUV4aXQoKSk7XG4gICAgICAgICAgY29uc3Qgc2lncyA9IHNpZ25lZC5nZXRQYXJ0aWFsU2lnbmF0dXJlcygwKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2lncy5sZW5ndGgsIDEpO1xuICAgICAgICAgIGFzc2VydC5vayhzaWduZWQudmFsaWRhdGVTaWduYXR1cmVBdElucHV0KDAsIHNpZ3NbMF0ucHVia2V5KSk7XG4gICAgICAgICAgLy8gdGhlIHByaW5jaXBhbCBwcmVpbWFnZSBzdXJ2aXZlcyBzaWduaW5nXG4gICAgICAgICAgYXNzZXJ0Lm9rKHNpZ25lZC5nZXRJbnB1dEtleVZhbHVlcygwKS5zb21lKChyKSA9PiByLnR5cGUgPT09ICdrbm93bicgJiYgci5rZXkgPT09ICdQU0JUX0lOX1NIQTI1NicpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2hhbGYtc2lnbnMgYW4gZWFybHkgZXhpdCB3aXRoIGEgZmluYWwgc2VxdWVuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaGFsZlNpZ24oY29pbk5hbWUsIGVhcmx5RXhpdCh7IHNlcXVlbmNlOiAweGZmZmZmZmZmIH0pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2ZpbmFsaXplcyBvbmNlIHRoZSBCaXRHbyBrZXkgYW5kIHRoZSBlYXJseS1leGl0IGtleSBoYXZlIHNpZ25lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBlYXJseSA9IGdldEtleSgncG94NS1vZmZsaW5lLXZhdWx0LWVhcmx5LWV4aXQnKTtcbiAgICAgICAgICBjb25zdCBzaWduZWQgPSBoYWxmU2lnbihjb2luTmFtZSwgZWFybHlFeGl0KCkpO1xuICAgICAgICAgIHNpZ25lZC5zaWduV2l0aFhwcnYoZ2V0S2V5VHJpcGxlKCdwb3g1LW9mZmxpbmUtdmF1bHQnKVsyXS50b0Jhc2U1OCgpKTtcbiAgICAgICAgICBzaWduZWQuc2lnbldpdGhQcnYoZWFybHkucHJpdmF0ZUtleSEpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzaWduZWQuZ2V0UGFydGlhbFNpZ25hdHVyZXMoMCkubGVuZ3RoLCAzKTtcbiAgICAgICAgICBzaWduZWQuZmluYWxpemVJbnB1dCgwKTtcbiAgICAgICAgICBjb25zdCB3aXRuZXNzID0gc2lnbmVkLmV4dHJhY3RUcmFuc2FjdGlvbigpLmdldElucHV0cygpWzBdLndpdG5lc3M7XG4gICAgICAgICAgYXNzZXJ0Lm9rKHdpdG5lc3Muc29tZSgoaXRlbSkgPT4gQnVmZmVyLmZyb20oaXRlbSkuZXF1YWxzKFBSSU5DSVBBTF9QUkVJTUFHRSkpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2hhbGYtc2lnbnMgYW4gZWFybHkgZXhpdCB0aGF0IGFscmVhZHkgY2FycmllcyB0aGUgZWFybHktZXhpdCBrZXkgcGFydGlhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBlYXJseSA9IGdldEtleSgncG94NS1vZmZsaW5lLXZhdWx0LWVhcmx5LWV4aXQnKTtcbiAgICAgICAgICBjb25zdCB7IHR4LCByb290UHJ2IH0gPSBlYXJseUV4aXQoKTtcbiAgICAgICAgICBjb25zdCBwc2J0ID0gUHNidC5kZXNlcmlhbGl6ZShCdWZmZXIuZnJvbSh0eC5jb2luU3BlY2lmaWMudHhIZXgsICdoZXgnKSk7XG4gICAgICAgICAgcHNidC5zaWduV2l0aFBydihlYXJseS5wcml2YXRlS2V5ISk7XG4gICAgICAgICAgdHguY29pblNwZWNpZmljLnR4SGV4ID0gQnVmZmVyLmZyb20ocHNidC5zZXJpYWxpemUoKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICAgIGNvbnN0IHNpZ25lZCA9IGhhbGZTaWduKGNvaW5OYW1lLCB7IHR4LCByb290UHJ2IH0pO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzaWduZWQuZ2V0UGFydGlhbFNpZ25hdHVyZXMoMCkubGVuZ3RoLCAyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3JlamVjdHMgYSBub24temVybyBuTG9ja1RpbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBoYWxmU2lnbihjb2luTmFtZSwgZWFybHlFeGl0KHsgbG9ja3RpbWU6IFVOTE9DS19IRUlHSFQgfSkpLCAvbkxvY2tUaW1lIG11c3QgYmUgMC8pO1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gaGFsZlNpZ24oY29pbk5hbWUsIGVhcmx5RXhpdCh7IGxvY2t0aW1lOiAxIH0pKSwgL25Mb2NrVGltZSBtdXN0IGJlIDAvKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3JlamVjdHMgYSBwcmluY2lwYWwgcHJlaW1hZ2UgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgZGVzY3JpcHRvciBjb21taXRtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgICAoKSA9PiBoYWxmU2lnbihjb2luTmFtZSwgZWFybHlFeGl0KHsgZWFybHlFeGl0UHJlaW1hZ2U6IEJ1ZmZlci5hbGxvYygzMiwgMHg0MykgfSkpLFxuICAgICAgICAgICAgL2V4cGVjdGVkIGV4YWN0bHkgb25lIFBTQlRfSU5fU0hBMjU2IHJlY29yZC9cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgncmVqZWN0cyBsb2NrdXAgZGVzY3JpcHRvcnMgd2l0aCBmb3JlaWduIHN0YWtlciBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gaGFsZlNpZ24oY29pbk5hbWUsIGVhcmx5RXhpdCh7IGxvY2t1cEtleXM6IGdldEZvcmVpZ25LZXlzKCkgfSkpLCAvZG9lcyBub3QgbWF0Y2ggcG9saWN5Lyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdyZWplY3RzIG1vcmUgdGhhbiBvbmUgbG9ja3VwIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gaGFsZlNpZ24oY29pbk5hbWUsIGVhcmx5RXhpdCh7IGxvY2t1cElucHV0czogMiB9KSksIC9leGFjdGx5IG9uZSBQb1gtNSBsb2NrdXAgaW5wdXQvKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3JlamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGFzc2VydFJlamVjdGVkKHBhcmFtczogUG94NVR4UGFyYW1zLCBtZXNzYWdlOiBSZWdFeHApIHtcbiAgICAgICAgICBjb25zdCB0eCA9IGNyZWF0ZVBveDVUeChwYXJhbXMpO1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gaGFsZlNpZ24oY29pbk5hbWUsIHR4KSwgbWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpdCgnbG9ja3VwIGRlc2NyaXB0b3JzIHdpdGggZm9yZWlnbiBzdGFrZXIga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7IGxvY2t1cEtleXM6IGdldEZvcmVpZ25LZXlzKCkgfTtcbiAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGdldFRyYW5zYWN0aW9uRXhwbGFuYXRpb24oY29pbk5hbWUsIGNyZWF0ZVBveDVUeChwYXJhbXMpLnR4KSwgL2RvZXMgbm90IG1hdGNoIHBvbGljeS8pO1xuICAgICAgICAgIGFzc2VydFJlamVjdGVkKHBhcmFtcywgL2RvZXMgbm90IG1hdGNoIHBvbGljeS8pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbG9ja3VwIGRlc2NyaXB0b3JzIHdpdGggb25seSBvbmUgZm9yZWlnbiBzdGFrZXIga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHsga2V5cyB9ID0gZ2V0V2FsbGV0S2V5cygpO1xuICAgICAgICAgIGNvbnN0IFtmb3JlaWduXSA9IGdldEZvcmVpZ25LZXlzKCk7XG4gICAgICAgICAgYXNzZXJ0UmVqZWN0ZWQoeyBsb2NrdXBLZXlzOiBba2V5c1swXSwga2V5c1sxXSwgZm9yZWlnbl0gfSwgL2RvZXMgbm90IG1hdGNoIHBvbGljeS8pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbG9ja3VwIGRlc2NyaXB0b3JzIHdpdGggcGVybXV0ZWQgc3Rha2VyIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgeyBrZXlzIH0gPSBnZXRXYWxsZXRLZXlzKCk7XG4gICAgICAgICAgYXNzZXJ0UmVqZWN0ZWQoeyBsb2NrdXBLZXlzOiBba2V5c1sxXSwga2V5c1swXSwga2V5c1syXV0gfSwgL2RvZXMgbm90IG1hdGNoIHBvbGljeS8pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbWFsZm9ybWVkIGxvY2t1cCBkZXNjcmlwdG9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB7IGtleXMgfSA9IGdldFdhbGxldEtleXMoKTtcbiAgICAgICAgICAvLyB1bmxvY2sgaGVpZ2h0IGlzIG91dHNpZGUgb2YgdGhlIGJsb2NrIGhlaWdodCByYW5nZVxuICAgICAgICAgIGNvbnN0IG5vZGUgPSBhc3QuZnJvbURlc2NyaXB0b3IoY3JlYXRlTG9ja3VwRGVzY3JpcHRvcihrZXlzKSkgYXMge1xuICAgICAgICAgICAgd3NoOiB7IGFuZF92OiBbeyAndjpvcl9pJzogW3sgYWZ0ZXI6IG51bWJlciB9LCB1bmtub3duXSB9LCB1bmtub3duXSB9O1xuICAgICAgICAgIH07XG4gICAgICAgICAgbm9kZS53c2guYW5kX3ZbMF1bJ3Y6b3JfaSddWzBdID0geyBhZnRlcjogNjAwXzAwMF8wMDAgfTtcbiAgICAgICAgICBjb25zdCBtYWxmb3JtZWQgPSBEZXNjcmlwdG9yLmZyb21TdHJpbmcoYXN0LmZvcm1hdE5vZGUobm9kZSBhcyBhc3QuRGVzY3JpcHRvck5vZGUpLCAnZGVyaXZhYmxlJyk7XG4gICAgICAgICAgYXNzZXJ0UmVqZWN0ZWQoeyBsb2NrdXBEZXNjcmlwdG9yOiBtYWxmb3JtZWQgfSwgL2RvZXMgbm90IG1hdGNoIHBvbGljeS8pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbm9uLWNhbm9uaWNhbCBsb2NrdXAgZGVzY3JpcHRvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgeyBrZXlzIH0gPSBnZXRXYWxsZXRLZXlzKCk7XG4gICAgICAgICAgY29uc3QgeHB1YnMgPSBrZXlzLm1hcCgoaykgPT4gay50b0Jhc2U1OCgpICsgJy8qJyk7XG4gICAgICAgICAgLy8gcGxhaW4gMi1vZi0zIHdpdGggdGhlIGVhcmx5IGV4aXQgYnJhbmNoIHJlbW92ZWRcbiAgICAgICAgICBjb25zdCBvdGhlciA9IERlc2NyaXB0b3IuZnJvbVN0cmluZyhgd3NoKGFuZF92KHY6cGsoJHt4cHVic1swXX0pLG11bHRpKDIsJHt4cHVicy5qb2luKCcsJyl9KSkpYCwgJ2Rlcml2YWJsZScpO1xuICAgICAgICAgIGFzc2VydFJlamVjdGVkKHsgbG9ja3VwRGVzY3JpcHRvcjogb3RoZXIgfSwgL2RvZXMgbm90IG1hdGNoIHBvbGljeS8pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbkxvY2tUaW1lIGJlbG93IHRoZSB1bmxvY2sgaGVpZ2h0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFzc2VydFJlamVjdGVkKHsgbG9ja3RpbWU6IFVOTE9DS19IRUlHSFQgLSAxIH0sIC9uTG9ja1RpbWUgbXVzdCBiZSBhdCBsZWFzdC8pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbkxvY2tUaW1lIHRoYXQgaXMgYSB0aW1lc3RhbXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXNzZXJ0UmVqZWN0ZWQoeyBsb2NrdGltZTogNTAwXzAwMF8wMDAgfSwgL25Mb2NrVGltZSBtdXN0IGJlIGEgYmxvY2sgaGVpZ2h0Lyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdmaW5hbCBzZXF1ZW5jZSBvbiB0aGUgbG9ja3VwIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFzc2VydFJlamVjdGVkKHsgc2VxdWVuY2U6IDB4ZmZmZmZmZmYgfSwgL25vbi1maW5hbCBzZXF1ZW5jZS8pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbW9yZSB0aGFuIG9uZSBsb2NrdXAgaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXNzZXJ0UmVqZWN0ZWQoeyBsb2NrdXBJbnB1dHM6IDIgfSwgL2V4YWN0bHkgb25lIFBvWC01IGxvY2t1cCBpbnB1dC8pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc3RpbGwgZXhwbGFpbnMgYW5kIHNpZ25zIGEgcmVndWxhciBXc2gyT2YzIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB7IHJvb3RQcnYsIGtleXMgfSA9IGdldFdhbGxldEtleXMoKTtcbiAgICAgICAgY29uc3QgZXh0ZXJuYWwgPSBnZXREZXNjcmlwdG9yRnJvbUJ1aWxkZXIoeyBuYW1lOiAnV3NoMk9mMycsIGtleXMsIHBhdGg6ICcwLyonIH0pO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV4dGVybmFsLmF0RGVyaXZhdGlvbkluZGV4KDEpO1xuICAgICAgICBjb25zdCBwc2J0ID0gZGVzY3JpcHRvcldhbGxldC5jcmVhdGVQc2J0KFxuICAgICAgICAgIHsgdmVyc2lvbjogMiwgbG9ja3RpbWU6IDAgfSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhhc2g6ICcwMScucmVwZWF0KDMyKSxcbiAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICAgIHdpdG5lc3NVdHhvOiB7IHNjcmlwdDogaW5wdXQuc2NyaXB0UHVia2V5KCksIHZhbHVlOiBJTlBVVF9WQUxVRSB9LFxuICAgICAgICAgICAgICBkZXNjcmlwdG9yOiBpbnB1dCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbeyBzY3JpcHQ6IGV4dGVybmFsLmF0RGVyaXZhdGlvbkluZGV4KDIpLnNjcmlwdFB1YmtleSgpLCB2YWx1ZTogOTBfMDAwbiB9XVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0eDogRGVzY3JpcHRvclRyYW5zYWN0aW9uID0ge1xuICAgICAgICAgIHhwdWJzV2l0aERlcml2YXRpb25QYXRoOiB7XG4gICAgICAgICAgICB1c2VyOiB7IHhwdWI6IGtleXNbMF0udG9CYXNlNTgoKSwgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogREVSSVZBVElPTl9JRCB9LFxuICAgICAgICAgICAgYmFja3VwOiB7IHhwdWI6IGtleXNbMV0udG9CYXNlNTgoKSB9LFxuICAgICAgICAgICAgYml0Z286IHsgeHB1Yjoga2V5c1syXS50b0Jhc2U1OCgpIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb2luU3BlY2lmaWM6IHsgdHhIZXg6IEJ1ZmZlci5mcm9tKHBzYnQuc2VyaWFsaXplKCkpLnRvU3RyaW5nKCdoZXgnKSB9LFxuICAgICAgICAgIGRlc2NyaXB0b3JzOiBbeyBuYW1lOiAnZXh0ZXJuYWwnLCB2YWx1ZTogZXh0ZXJuYWwudG9TdHJpbmcoKSB9XSxcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFRyYW5zYWN0aW9uRXhwbGFuYXRpb24oY29pbk5hbWUsIHR4KS5sb2NrdGltZSwgMCk7XG4gICAgICAgIGFzc2VydC5vayhoYWxmU2lnbihjb2luTmFtZSwgeyB0eCwgcm9vdFBydiB9KS5oYXNQYXJ0aWFsU2lnbmF0dXJlcygwKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlc2NyaWJlKCdnZXRQb2xpY3lGb3JFbnYocHJvZCknLCBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUoZGVzY3JpcHRvcnM6IERlc2NyaXB0b3JbXSwga2V5czogYmlwMzIuQklQMzJJbnRlcmZhY2VbXSkge1xuICAgICAgYXNzZXJ0RGVzY3JpcHRvclBvbGljeShcbiAgICAgICAgZGVzY3JpcHRvcnMubWFwKCh2YWx1ZSwgaSkgPT5cbiAgICAgICAgICB0b05hbWVkRGVzY3JpcHRvck5hdGl2ZSh7IG5hbWU6IFN0cmluZyhpKSwgdmFsdWU6IHZhbHVlLnRvU3RyaW5nKCkgfSwgJ2Rlcml2YWJsZScpXG4gICAgICAgICksXG4gICAgICAgIGdldFBvbGljeUZvckVudigncHJvZCcpLFxuICAgICAgICBba2V5c1swXSwga2V5c1sxXSwga2V5c1syXV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaXQoJ2FjY2VwdHMgd2FsbGV0IGRlc2NyaXB0b3JzIHRvZ2V0aGVyIHdpdGggdGhlIFBvWC01IGxvY2t1cCBkZXNjcmlwdG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyBrZXlzIH0gPSBnZXRXYWxsZXRLZXlzKCk7XG4gICAgICBjb25zdCBleHRlcm5hbCA9IGdldERlc2NyaXB0b3JGcm9tQnVpbGRlcih7IG5hbWU6ICdXc2gyT2YzJywga2V5cywgcGF0aDogJzAvKicgfSk7XG4gICAgICB2YWxpZGF0ZShbZXh0ZXJuYWwsIGNyZWF0ZUxvY2t1cERlc2NyaXB0b3Ioa2V5cyldLCBrZXlzKTtcbiAgICAgIHZhbGlkYXRlKFtjcmVhdGVMb2NrdXBEZXNjcmlwdG9yKGtleXMsIDkwMF8wMDApXSwga2V5cyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIGxvY2t1cCBkZXNjcmlwdG9yIHdpdGggZm9yZWlnbiBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyBrZXlzIH0gPSBnZXRXYWxsZXRLZXlzKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHZhbGlkYXRlKFtjcmVhdGVMb2NrdXBEZXNjcmlwdG9yKGdldEZvcmVpZ25LZXlzKCkpXSwga2V5cyksIC9kb2VzIG5vdCBtYXRjaCBwb2xpY3kvKTtcbiAgICB9KTtcblxuICAgIGl0KCdhY2NlcHRzIFdzaDJPZjNDbHR2RHJvcCBkZXNjcmlwdG9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsga2V5cyB9ID0gZ2V0V2FsbGV0S2V5cygpO1xuICAgICAgY29uc3QgY2x0dkRyb3AgPSBnZXREZXNjcmlwdG9yRnJvbUJ1aWxkZXIoeyBuYW1lOiAnV3NoMk9mM0NsdHZEcm9wJywga2V5cywgcGF0aDogJzAvKicsIGxvY2t0aW1lOiAxXzAwMCB9KTtcbiAgICAgIHZhbGlkYXRlKFtjbHR2RHJvcF0sIGtleXMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgZmFsc2UgaW5zdGVhZCBvZiB0aHJvd2luZyBmb3IgZGVzY3JpcHRvcnMgYSB0ZW1wbGF0ZSBjYW5ub3QgcGFyc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IGtleXMgfSA9IGdldFdhbGxldEtleXMoKTtcbiAgICAgIGNvbnN0IGxvY2t1cCA9IHRvTmFtZWREZXNjcmlwdG9yTmF0aXZlKFxuICAgICAgICB7IG5hbWU6ICdsb2NrdXAnLCB2YWx1ZTogY3JlYXRlTG9ja3VwRGVzY3JpcHRvcihrZXlzKS50b1N0cmluZygpIH0sXG4gICAgICAgICdkZXJpdmFibGUnXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIFsnV3NoMk9mMycsICdXc2gyT2YzQ2x0dkRyb3AnLCAnU2hXc2gyT2YzQ2x0dkRyb3AnLCAnU2J0Y0RlcG9zaXQnXSkge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0VmFsaWRhdG9yRGVzY3JpcHRvclRlbXBsYXRlKG5hbWUpLnZhbGlkYXRlKFtsb2NrdXBdLCBba2V5c1swXSwga2V5c1sxXSwga2V5c1syXV0pLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=