@bitgo/abstract-utxo 9.8.0 → 9.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/src/transaction/descriptor/parse.d.ts +6 -2
  3. package/dist/src/transaction/descriptor/parse.d.ts.map +1 -1
  4. package/dist/src/transaction/descriptor/parse.js +6 -6
  5. package/dist/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -1
  6. package/dist/src/transaction/descriptor/parseToAmountType.js +4 -1
  7. package/dist/src/transaction/descriptor/verifyTransaction.d.ts +5 -5
  8. package/dist/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
  9. package/dist/src/transaction/descriptor/verifyTransaction.js +1 -1
  10. package/dist/src/transaction/fixedScript/parseTransaction.d.ts +5 -7
  11. package/dist/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  12. package/dist/src/transaction/fixedScript/parseTransaction.js +27 -30
  13. package/dist/src/transaction/outputDifference.d.ts +40 -0
  14. package/dist/src/transaction/outputDifference.d.ts.map +1 -0
  15. package/dist/src/transaction/outputDifference.js +47 -0
  16. package/dist/test/transaction/descriptor/outputDifference.js +41 -25
  17. package/dist/test/transaction/descriptor/parse.js +14 -1
  18. package/dist/tsconfig.tsbuildinfo +1 -1
  19. package/package.json +4 -4
  20. package/dist/src/transaction/descriptor/outputDifference.d.ts +0 -30
  21. package/dist/src/transaction/descriptor/outputDifference.d.ts.map +0 -1
  22. package/dist/src/transaction/descriptor/outputDifference.js +0 -38
  23. package/dist/test/outputDifference.d.ts +0 -2
  24. package/dist/test/outputDifference.d.ts.map +0 -1
  25. package/dist/test/outputDifference.js +0 -86
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo/abstract-utxo",
3
- "version": "9.8.0",
3
+ "version": "9.9.0",
4
4
  "description": "BitGo SDK coin library for UTXO base implementation",
5
5
  "main": "./dist/src/index.js",
6
6
  "types": "./dist/src/index.d.ts",
@@ -40,8 +40,8 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@bitgo/blockapis": "^1.10.9",
43
- "@bitgo/sdk-api": "^1.57.4",
44
- "@bitgo/sdk-core": "^28.17.1",
43
+ "@bitgo/sdk-api": "^1.57.5",
44
+ "@bitgo/sdk-core": "^28.17.2",
45
45
  "@bitgo/unspents": "^0.47.17",
46
46
  "@bitgo/utxo-lib": "^11.2.1",
47
47
  "@bitgo/wasm-miniscript": "^2.0.0-beta.2",
@@ -57,5 +57,5 @@
57
57
  "lodash": "^4.17.14",
58
58
  "superagent": "^9.0.1"
59
59
  },
60
- "gitHead": "71e02443fc94871eb8da4b3bdd95f600d7bc6e4d"
60
+ "gitHead": "ee5390723be96e9588fd0dd126a6106ed2c47c73"
61
61
  }
@@ -1,30 +0,0 @@
1
- export type ComparableOutput = {
2
- script: Buffer;
3
- value: bigint;
4
- };
5
- export declare function equalOutput<T extends ComparableOutput>(a: T, b: T): boolean;
6
- /**
7
- * @returns all outputs in the first array that are not in the second array
8
- * Outputs can occur more than once in each array.
9
- */
10
- export declare function outputDifference<T extends ComparableOutput>(first: T[], second: T[]): T[];
11
- export type OutputDifferenceWithExpected<T extends ComparableOutput> = {
12
- /** These are the external outputs that were expected and found in the transaction. */
13
- explicitExternalOutputs: T[];
14
- /**
15
- * These are the surprise external outputs that were not explicitly specified in the transaction.
16
- * They can be PayGo fees.
17
- */
18
- implicitExternalOutputs: T[];
19
- /**
20
- * These are the outputs that were expected to be in the transaction but were not found.
21
- */
22
- missingOutputs: T[];
23
- };
24
- /**
25
- * @param actualExternalOutputs - external outputs in the transaction
26
- * @param expectedExternalOutputs - external outputs that were expected to be in the transaction
27
- * @returns the difference between the actual and expected external outputs
28
- */
29
- export declare function outputDifferencesWithExpected<T extends ComparableOutput>(actualExternalOutputs: T[], expectedExternalOutputs: T[]): OutputDifferenceWithExpected<T>;
30
- //# sourceMappingURL=outputDifference.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outputDifference.d.ts","sourceRoot":"","sources":["../../../../src/transaction/descriptor/outputDifference.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,WAAW,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,OAAO,CAE3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CASzF;AAED,MAAM,MAAM,4BAA4B,CAAC,CAAC,SAAS,gBAAgB,IAAI;IACrE,sFAAsF;IACtF,uBAAuB,EAAE,CAAC,EAAE,CAAC;IAC7B;;;OAGG;IACH,uBAAuB,EAAE,CAAC,EAAE,CAAC;IAC7B;;OAEG;IACH,cAAc,EAAE,CAAC,EAAE,CAAC;CACrB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,gBAAgB,EACtE,qBAAqB,EAAE,CAAC,EAAE,EAC1B,uBAAuB,EAAE,CAAC,EAAE,GAC3B,4BAA4B,CAAC,CAAC,CAAC,CASjC"}
@@ -1,38 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.equalOutput = equalOutput;
4
- exports.outputDifference = outputDifference;
5
- exports.outputDifferencesWithExpected = outputDifferencesWithExpected;
6
- function equalOutput(a, b) {
7
- return a.value === b.value && a.script.equals(b.script);
8
- }
9
- /**
10
- * @returns all outputs in the first array that are not in the second array
11
- * Outputs can occur more than once in each array.
12
- */
13
- function outputDifference(first, second) {
14
- first = first.slice();
15
- for (const output of second) {
16
- const index = first.findIndex((o) => equalOutput(o, output));
17
- if (index !== -1) {
18
- first.splice(index, 1);
19
- }
20
- }
21
- return first;
22
- }
23
- /**
24
- * @param actualExternalOutputs - external outputs in the transaction
25
- * @param expectedExternalOutputs - external outputs that were expected to be in the transaction
26
- * @returns the difference between the actual and expected external outputs
27
- */
28
- function outputDifferencesWithExpected(actualExternalOutputs, expectedExternalOutputs) {
29
- const implicitExternalOutputs = outputDifference(actualExternalOutputs, expectedExternalOutputs);
30
- const explicitExternalOutputs = outputDifference(actualExternalOutputs, implicitExternalOutputs);
31
- const missingOutputs = outputDifference(expectedExternalOutputs, actualExternalOutputs);
32
- return {
33
- explicitExternalOutputs,
34
- implicitExternalOutputs,
35
- missingOutputs,
36
- };
37
- }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0RGlmZmVyZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9kZXNjcmlwdG9yL291dHB1dERpZmZlcmVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSxrQ0FFQztBQU1ELDRDQVNDO0FBcUJELHNFQVlDO0FBbERELFNBQWdCLFdBQVcsQ0FBNkIsQ0FBSSxFQUFFLENBQUk7SUFDaEUsT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBNkIsS0FBVSxFQUFFLE1BQVc7SUFDbEYsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBZ0JEOzs7O0dBSUc7QUFDSCxTQUFnQiw2QkFBNkIsQ0FDM0MscUJBQTBCLEVBQzFCLHVCQUE0QjtJQUU1QixNQUFNLHVCQUF1QixHQUFHLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDakcsTUFBTSx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ2pHLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDeEYsT0FBTztRQUNMLHVCQUF1QjtRQUN2Qix1QkFBdUI7UUFDdkIsY0FBYztLQUNmLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ29tcGFyYWJsZU91dHB1dCA9IHtcbiAgc2NyaXB0OiBCdWZmZXI7XG4gIHZhbHVlOiBiaWdpbnQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxPdXRwdXQ8VCBleHRlbmRzIENvbXBhcmFibGVPdXRwdXQ+KGE6IFQsIGI6IFQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGEudmFsdWUgPT09IGIudmFsdWUgJiYgYS5zY3JpcHQuZXF1YWxzKGIuc2NyaXB0KTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBhbGwgb3V0cHV0cyBpbiB0aGUgZmlyc3QgYXJyYXkgdGhhdCBhcmUgbm90IGluIHRoZSBzZWNvbmQgYXJyYXlcbiAqIE91dHB1dHMgY2FuIG9jY3VyIG1vcmUgdGhhbiBvbmNlIGluIGVhY2ggYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdXRwdXREaWZmZXJlbmNlPFQgZXh0ZW5kcyBDb21wYXJhYmxlT3V0cHV0PihmaXJzdDogVFtdLCBzZWNvbmQ6IFRbXSk6IFRbXSB7XG4gIGZpcnN0ID0gZmlyc3Quc2xpY2UoKTtcbiAgZm9yIChjb25zdCBvdXRwdXQgb2Ygc2Vjb25kKSB7XG4gICAgY29uc3QgaW5kZXggPSBmaXJzdC5maW5kSW5kZXgoKG8pID0+IGVxdWFsT3V0cHV0KG8sIG91dHB1dCkpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGZpcnN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmaXJzdDtcbn1cblxuZXhwb3J0IHR5cGUgT3V0cHV0RGlmZmVyZW5jZVdpdGhFeHBlY3RlZDxUIGV4dGVuZHMgQ29tcGFyYWJsZU91dHB1dD4gPSB7XG4gIC8qKiBUaGVzZSBhcmUgdGhlIGV4dGVybmFsIG91dHB1dHMgdGhhdCB3ZXJlIGV4cGVjdGVkIGFuZCBmb3VuZCBpbiB0aGUgdHJhbnNhY3Rpb24uICovXG4gIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBUW107XG4gIC8qKlxuICAgKiBUaGVzZSBhcmUgdGhlIHN1cnByaXNlIGV4dGVybmFsIG91dHB1dHMgdGhhdCB3ZXJlIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIFRoZXkgY2FuIGJlIFBheUdvIGZlZXMuXG4gICAqL1xuICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogVFtdO1xuICAvKipcbiAgICogVGhlc2UgYXJlIHRoZSBvdXRwdXRzIHRoYXQgd2VyZSBleHBlY3RlZCB0byBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gYnV0IHdlcmUgbm90IGZvdW5kLlxuICAgKi9cbiAgbWlzc2luZ091dHB1dHM6IFRbXTtcbn07XG5cbi8qKlxuICogQHBhcmFtIGFjdHVhbEV4dGVybmFsT3V0cHV0cyAtIGV4dGVybmFsIG91dHB1dHMgaW4gdGhlIHRyYW5zYWN0aW9uXG4gKiBAcGFyYW0gZXhwZWN0ZWRFeHRlcm5hbE91dHB1dHMgLSBleHRlcm5hbCBvdXRwdXRzIHRoYXQgd2VyZSBleHBlY3RlZCB0byBiZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFjdHVhbCBhbmQgZXhwZWN0ZWQgZXh0ZXJuYWwgb3V0cHV0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gb3V0cHV0RGlmZmVyZW5jZXNXaXRoRXhwZWN0ZWQ8VCBleHRlbmRzIENvbXBhcmFibGVPdXRwdXQ+KFxuICBhY3R1YWxFeHRlcm5hbE91dHB1dHM6IFRbXSxcbiAgZXhwZWN0ZWRFeHRlcm5hbE91dHB1dHM6IFRbXVxuKTogT3V0cHV0RGlmZmVyZW5jZVdpdGhFeHBlY3RlZDxUPiB7XG4gIGNvbnN0IGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZShhY3R1YWxFeHRlcm5hbE91dHB1dHMsIGV4cGVjdGVkRXh0ZXJuYWxPdXRwdXRzKTtcbiAgY29uc3QgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMgPSBvdXRwdXREaWZmZXJlbmNlKGFjdHVhbEV4dGVybmFsT3V0cHV0cywgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMpO1xuICBjb25zdCBtaXNzaW5nT3V0cHV0cyA9IG91dHB1dERpZmZlcmVuY2UoZXhwZWN0ZWRFeHRlcm5hbE91dHB1dHMsIGFjdHVhbEV4dGVybmFsT3V0cHV0cyk7XG4gIHJldHVybiB7XG4gICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMsXG4gICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMsXG4gICAgbWlzc2luZ091dHB1dHMsXG4gIH07XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- import 'should';
2
- //# sourceMappingURL=outputDifference.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outputDifference.d.ts","sourceRoot":"","sources":["../../test/outputDifference.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
@@ -1,86 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- require("should");
4
- const parseTransaction_1 = require("../src/transaction/fixedScript/parseTransaction");
5
- describe('Missing output detection', function () {
6
- it('should recognize count mismatch dupes', function () {
7
- const expectedOutputs = [
8
- {
9
- address: '2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ',
10
- amount: '300000',
11
- },
12
- {
13
- amount: '300000',
14
- address: '2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ',
15
- },
16
- ];
17
- const actualOutputs = [
18
- {
19
- address: '2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ',
20
- amount: 300000,
21
- },
22
- {
23
- address: '2N2womedYhTC3YCDtviFte5G7teQczpVcds',
24
- amount: 15349374,
25
- },
26
- ];
27
- // missing should be one entry of the two
28
- const missingOutputs = (0, parseTransaction_1.outputDifference)(expectedOutputs, actualOutputs);
29
- missingOutputs.length.should.equal(1);
30
- missingOutputs[0].address.should.equal('2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ');
31
- missingOutputs[0].amount.should.equal('300000');
32
- });
33
- it('should be order-agnostic', function () {
34
- const expectedOutputs = [
35
- {
36
- address: '2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ',
37
- amount: '300000',
38
- },
39
- {
40
- amount: '300000',
41
- address: '2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ',
42
- },
43
- ];
44
- const actualOutputs = [
45
- {
46
- address: '2N2womedYhTC3YCDtviFte5G7teQczpVcds',
47
- amount: 15349374,
48
- },
49
- {
50
- address: '2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ',
51
- amount: 300000,
52
- },
53
- ];
54
- // missing should be one entry of the two
55
- const missingOutputs = (0, parseTransaction_1.outputDifference)(expectedOutputs, actualOutputs);
56
- missingOutputs.length.should.equal(1);
57
- missingOutputs[0].address.should.equal('2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ');
58
- missingOutputs[0].amount.should.equal('300000');
59
- });
60
- it('should preserve all dupes', function () {
61
- const expectedOutputs = [
62
- {
63
- address: '2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ',
64
- amount: '300000',
65
- },
66
- {
67
- amount: '300000',
68
- address: '2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ',
69
- },
70
- ];
71
- const actualOutputs = [
72
- {
73
- address: '2N2womedYhTC3YCDtviFte5G7teQczpVcds',
74
- amount: 15349374,
75
- },
76
- ];
77
- // missing should be one entry of the two
78
- const missingOutputs = (0, parseTransaction_1.outputDifference)(expectedOutputs, actualOutputs);
79
- missingOutputs.length.should.equal(2);
80
- missingOutputs[0].address.should.equal('2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ');
81
- missingOutputs[1].address.should.equal('2N6eb6Gosm2jt4o3djFLjb4kuKyPgAj8teZ');
82
- missingOutputs[0].amount.should.equal('300000');
83
- missingOutputs[1].amount.should.equal('300000');
84
- });
85
- });
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0RGlmZmVyZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3Qvb3V0cHV0RGlmZmVyZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtCQUFnQjtBQUNoQixzRkFBbUY7QUFFbkYsUUFBUSxDQUFDLDBCQUEwQixFQUFFO0lBQ25DLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtRQUMxQyxNQUFNLGVBQWUsR0FBRztZQUN0QjtnQkFDRSxPQUFPLEVBQUUscUNBQXFDO2dCQUM5QyxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixPQUFPLEVBQUUscUNBQXFDO2FBQy9DO1NBQ0YsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUFHO1lBQ3BCO2dCQUNFLE9BQU8sRUFBRSxxQ0FBcUM7Z0JBQzlDLE1BQU0sRUFBRSxNQUFNO2FBQ2Y7WUFDRDtnQkFDRSxPQUFPLEVBQUUscUNBQXFDO2dCQUM5QyxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGLENBQUM7UUFDRix5Q0FBeUM7UUFFekMsTUFBTSxjQUFjLEdBQUcsSUFBQSxtQ0FBZ0IsRUFBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFeEUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzlFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQkFBMEIsRUFBRTtRQUM3QixNQUFNLGVBQWUsR0FBRztZQUN0QjtnQkFDRSxPQUFPLEVBQUUscUNBQXFDO2dCQUM5QyxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixPQUFPLEVBQUUscUNBQXFDO2FBQy9DO1NBQ0YsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUFHO1lBQ3BCO2dCQUNFLE9BQU8sRUFBRSxxQ0FBcUM7Z0JBQzlDLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLHFDQUFxQztnQkFDOUMsTUFBTSxFQUFFLE1BQU07YUFDZjtTQUNGLENBQUM7UUFDRix5Q0FBeUM7UUFFekMsTUFBTSxjQUFjLEdBQUcsSUFBQSxtQ0FBZ0IsRUFBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFeEUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzlFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQkFBMkIsRUFBRTtRQUM5QixNQUFNLGVBQWUsR0FBRztZQUN0QjtnQkFDRSxPQUFPLEVBQUUscUNBQXFDO2dCQUM5QyxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixPQUFPLEVBQUUscUNBQXFDO2FBQy9DO1NBQ0YsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUFHO1lBQ3BCO2dCQUNFLE9BQU8sRUFBRSxxQ0FBcUM7Z0JBQzlDLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0YsQ0FBQztRQUNGLHlDQUF5QztRQUV6QyxNQUFNLGNBQWMsR0FBRyxJQUFBLG1DQUFnQixFQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUV4RSxjQUFjLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDOUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDOUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgb3V0cHV0RGlmZmVyZW5jZSB9IGZyb20gJy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9wYXJzZVRyYW5zYWN0aW9uJztcblxuZGVzY3JpYmUoJ01pc3Npbmcgb3V0cHV0IGRldGVjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCByZWNvZ25pemUgY291bnQgbWlzbWF0Y2ggZHVwZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRPdXRwdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiAnMk42ZWI2R29zbTJqdDRvM2RqRkxqYjRrdUt5UGdBajh0ZVonLFxuICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgYWRkcmVzczogJzJONmViNkdvc20yanQ0bzNkakZMamI0a3VLeVBnQWo4dGVaJyxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGFjdHVhbE91dHB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6ICcyTjZlYjZHb3NtMmp0NG8zZGpGTGpiNGt1S3lQZ0FqOHRlWicsXG4gICAgICAgIGFtb3VudDogMzAwMDAwLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogJzJOMndvbWVkWWhUQzNZQ0R0dmlGdGU1Rzd0ZVFjenBWY2RzJyxcbiAgICAgICAgYW1vdW50OiAxNTM0OTM3NCxcbiAgICAgIH0sXG4gICAgXTtcbiAgICAvLyBtaXNzaW5nIHNob3VsZCBiZSBvbmUgZW50cnkgb2YgdGhlIHR3b1xuXG4gICAgY29uc3QgbWlzc2luZ091dHB1dHMgPSBvdXRwdXREaWZmZXJlbmNlKGV4cGVjdGVkT3V0cHV0cywgYWN0dWFsT3V0cHV0cyk7XG5cbiAgICBtaXNzaW5nT3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIG1pc3NpbmdPdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCcyTjZlYjZHb3NtMmp0NG8zZGpGTGpiNGt1S3lQZ0FqOHRlWicpO1xuICAgIG1pc3NpbmdPdXRwdXRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwoJzMwMDAwMCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIG9yZGVyLWFnbm9zdGljJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogJzJONmViNkdvc20yanQ0bzNkakZMamI0a3VLeVBnQWo4dGVaJyxcbiAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGFtb3VudDogJzMwMDAwMCcsXG4gICAgICAgIGFkZHJlc3M6ICcyTjZlYjZHb3NtMmp0NG8zZGpGTGpiNGt1S3lQZ0FqOHRlWicsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCBhY3R1YWxPdXRwdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiAnMk4yd29tZWRZaFRDM1lDRHR2aUZ0ZTVHN3RlUWN6cFZjZHMnLFxuICAgICAgICBhbW91bnQ6IDE1MzQ5Mzc0LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogJzJONmViNkdvc20yanQ0bzNkakZMamI0a3VLeVBnQWo4dGVaJyxcbiAgICAgICAgYW1vdW50OiAzMDAwMDAsXG4gICAgICB9LFxuICAgIF07XG4gICAgLy8gbWlzc2luZyBzaG91bGQgYmUgb25lIGVudHJ5IG9mIHRoZSB0d29cblxuICAgIGNvbnN0IG1pc3NpbmdPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZShleHBlY3RlZE91dHB1dHMsIGFjdHVhbE91dHB1dHMpO1xuXG4gICAgbWlzc2luZ091dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBtaXNzaW5nT3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnMk42ZWI2R29zbTJqdDRvM2RqRkxqYjRrdUt5UGdBajh0ZVonKTtcbiAgICBtaXNzaW5nT3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKCczMDAwMDAnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwcmVzZXJ2ZSBhbGwgZHVwZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRPdXRwdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiAnMk42ZWI2R29zbTJqdDRvM2RqRkxqYjRrdUt5UGdBajh0ZVonLFxuICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgYWRkcmVzczogJzJONmViNkdvc20yanQ0bzNkakZMamI0a3VLeVBnQWo4dGVaJyxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGFjdHVhbE91dHB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6ICcyTjJ3b21lZFloVEMzWUNEdHZpRnRlNUc3dGVRY3pwVmNkcycsXG4gICAgICAgIGFtb3VudDogMTUzNDkzNzQsXG4gICAgICB9LFxuICAgIF07XG4gICAgLy8gbWlzc2luZyBzaG91bGQgYmUgb25lIGVudHJ5IG9mIHRoZSB0d29cblxuICAgIGNvbnN0IG1pc3NpbmdPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZShleHBlY3RlZE91dHB1dHMsIGFjdHVhbE91dHB1dHMpO1xuXG4gICAgbWlzc2luZ091dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICBtaXNzaW5nT3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnMk42ZWI2R29zbTJqdDRvM2RqRkxqYjRrdUt5UGdBajh0ZVonKTtcbiAgICBtaXNzaW5nT3V0cHV0c1sxXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnMk42ZWI2R29zbTJqdDRvM2RqRkxqYjRrdUt5UGdBajh0ZVonKTtcbiAgICBtaXNzaW5nT3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKCczMDAwMDAnKTtcbiAgICBtaXNzaW5nT3V0cHV0c1sxXS5hbW91bnQuc2hvdWxkLmVxdWFsKCczMDAwMDAnKTtcbiAgfSk7XG59KTtcbiJdfQ==