@bitgo-beta/sdk-coin-trx 1.2.3-alpha.404 → 1.2.3-alpha.405

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 (74) hide show
  1. package/.eslintignore +5 -0
  2. package/.mocharc.yml +8 -0
  3. package/CHANGELOG.md +1088 -0
  4. package/dist/src/lib/utils.d.ts +0 -28
  5. package/dist/src/lib/utils.d.ts.map +1 -1
  6. package/dist/src/lib/utils.js +1 -80
  7. package/dist/src/trx.d.ts +0 -4
  8. package/dist/src/trx.d.ts.map +1 -1
  9. package/dist/src/trx.js +1 -52
  10. package/package.json +7 -10
  11. package/resources/README.md +31 -0
  12. package/resources/protobuf/Contract.proto +288 -0
  13. package/resources/protobuf/Discover.proto +44 -0
  14. package/resources/protobuf/tron.d.ts +12469 -0
  15. package/resources/protobuf/tron.js +37192 -0
  16. package/resources/protobuf/tron.proto +683 -0
  17. package/dist/test/fixtures.d.ts +0 -40
  18. package/dist/test/fixtures.d.ts.map +0 -1
  19. package/dist/test/fixtures.js +0 -46
  20. package/dist/test/resources.d.ts +0 -586
  21. package/dist/test/resources.d.ts.map +0 -1
  22. package/dist/test/resources.js +0 -746
  23. package/dist/test/unit/index.d.ts +0 -2
  24. package/dist/test/unit/index.d.ts.map +0 -1
  25. package/dist/test/unit/index.js +0 -19
  26. package/dist/test/unit/keyPair.d.ts +0 -2
  27. package/dist/test/unit/keyPair.d.ts.map +0 -1
  28. package/dist/test/unit/keyPair.js +0 -163
  29. package/dist/test/unit/transaction.d.ts +0 -2
  30. package/dist/test/unit/transaction.d.ts.map +0 -1
  31. package/dist/test/unit/transaction.js +0 -38
  32. package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts +0 -2
  33. package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts.map +0 -1
  34. package/dist/test/unit/transactionBuilder/contractCallBuilder.js +0 -315
  35. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts +0 -2
  36. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts.map +0 -1
  37. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.js +0 -255
  38. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts +0 -2
  39. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts.map +0 -1
  40. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.js +0 -256
  41. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -2
  42. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  43. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -42
  44. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts +0 -2
  45. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts.map +0 -1
  46. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.js +0 -255
  47. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts +0 -2
  48. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts.map +0 -1
  49. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.js +0 -256
  50. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts +0 -2
  51. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts.map +0 -1
  52. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.js +0 -277
  53. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts +0 -2
  54. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts.map +0 -1
  55. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.js +0 -213
  56. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts +0 -2
  57. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts.map +0 -1
  58. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.js +0 -213
  59. package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts +0 -2
  60. package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts.map +0 -1
  61. package/dist/test/unit/transactionBuilder/wrappedBuilder.js +0 -50
  62. package/dist/test/unit/transactionBuilder.d.ts +0 -2
  63. package/dist/test/unit/transactionBuilder.d.ts.map +0 -1
  64. package/dist/test/unit/transactionBuilder.js +0 -178
  65. package/dist/test/unit/trx.d.ts +0 -2
  66. package/dist/test/unit/trx.d.ts.map +0 -1
  67. package/dist/test/unit/trx.js +0 -532
  68. package/dist/test/unit/util.d.ts +0 -2
  69. package/dist/test/unit/util.d.ts.map +0 -1
  70. package/dist/test/unit/util.js +0 -141
  71. package/dist/test/unit/verifyTransaction.d.ts +0 -2
  72. package/dist/test/unit/verifyTransaction.d.ts.map +0 -1
  73. package/dist/test/unit/verifyTransaction.js +0 -378
  74. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=util.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../test/unit/util.ts"],"names":[],"mappings":""}
@@ -1,141 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const node_test_1 = require("node:test");
7
- const assert_1 = __importDefault(require("assert"));
8
- const src_1 = require("../../src");
9
- const resources_1 = require("../resources");
10
- const utils_1 = require("../../src/lib/utils");
11
- (0, node_test_1.describe)('Util library should', function () {
12
- // arbitrary text
13
- const arr = [127, 255, 31, 192, 3, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
14
- const hex = '7FFF1FC0037E0000000000000000000000000000000000000000000000000000';
15
- const txt = 'arbitrary string to sign';
16
- const signedString = '0x9424113f32c17b6ffbeee024e1a54b6991d756e82f66cca16a41231fdfa270d03b08e833f5dbbd5cc86896c2e5ea6c74d2e292cda21f717164f994fcdf28486d1b';
17
- // prv-pub-address hex
18
- const prv = 'FB3AA887E0BE3FAC9D75E661DAFF4A7FE0E91AAB13DA9775CD8586D7CB9B7640';
19
- const pub = '046EBFB90C396B4A3B992B727CB4714A32E2A6DE43FDB3EC266286AC2246D8FD1E23E12C0DEB752C631A9011BBF8B56E2FBAA20E99D3952F0A558D11F96E7C1C5D';
20
- const addressHex = '412C2BA4A9FF6C53207DC5B686BFECF75EA7B80577';
21
- const base58 = 'TDzm1tCXM2YS1PDa3GoXSvxdy4AgwVbBPE';
22
- const addrBytes = [65, 44, 43, 164, 169, 255, 108, 83, 32, 125, 197, 182, 134, 191, 236, 247, 94, 167, 184, 5, 119];
23
- // tx information
24
- (0, node_test_1.it)('be able to convert hex to bytes', () => {
25
- const ba = src_1.Utils.getByteArrayFromHexAddress(hex);
26
- assert_1.default.deepStrictEqual(ba, arr);
27
- });
28
- (0, node_test_1.it)('be able to convert hex with 0x to bytes ', () => {
29
- const ba = src_1.Utils.getByteArrayFromHexAddress('0x' + hex);
30
- assert_1.default.deepStrictEqual(ba, arr);
31
- });
32
- (0, node_test_1.it)('be able to convert hex to bytes', () => {
33
- const hs = src_1.Utils.getHexAddressFromByteArray(arr);
34
- assert_1.default.equal(hs, hex);
35
- });
36
- (0, node_test_1.it)('get a pub from a prv', () => {
37
- const derivedPub = src_1.Utils.getPubKeyFromPriKey(Buffer.from(prv, 'hex'));
38
- const derivedPubHex = src_1.Utils.getHexAddressFromByteArray(derivedPub);
39
- assert_1.default.equal(derivedPubHex, pub);
40
- });
41
- (0, node_test_1.it)('get an hex address from a prv', () => {
42
- const addr = src_1.Utils.getAddressFromPriKey(Buffer.from(prv, 'hex'));
43
- const hexAddr = src_1.Utils.getHexAddressFromByteArray(addr);
44
- assert_1.default.equal(hexAddr, addressHex);
45
- });
46
- (0, node_test_1.it)('get an base58 address', () => {
47
- const addr = src_1.Utils.getAddressFromPriKey(Buffer.from(prv, 'hex'));
48
- const addr58 = src_1.Utils.getBase58AddressFromByteArray(addr);
49
- assert_1.default.equal(addr58, base58);
50
- });
51
- (0, node_test_1.it)('get an base58 address from hex', () => {
52
- const addr58 = src_1.Utils.getBase58AddressFromHex(addressHex);
53
- assert_1.default.equal(addr58, base58);
54
- });
55
- (0, node_test_1.it)('get hex from base58 address', () => {
56
- const hexAddr = src_1.Utils.getHexAddressFromBase58Address(base58);
57
- assert_1.default.equal(hexAddr, addressHex);
58
- });
59
- (0, node_test_1.it)('validate a hex string', () => {
60
- const hex = ['0xaffd', '0x11'];
61
- hex.map((hex) => {
62
- assert_1.default.ok(src_1.Utils.isValidHex(hex));
63
- });
64
- const invalidHex = ['0xa11', '0xFFdYYY', '0x', ''];
65
- invalidHex.map((hex) => {
66
- assert_1.default.strictEqual(src_1.Utils.isValidHex(hex), false);
67
- });
68
- });
69
- (0, node_test_1.it)('sign a string', () => {
70
- const hexText = Buffer.from(txt).toString('hex');
71
- const signed = src_1.Utils.signString(hexText, prv);
72
- assert_1.default.equal(signedString, signed);
73
- });
74
- (0, node_test_1.it)('should calculate an address from a pub', () => {
75
- const pubBytes = src_1.Utils.getByteArrayFromHexAddress(pub);
76
- const bytes = src_1.Utils.getRawAddressFromPubKey(pubBytes);
77
- assert_1.default.deepStrictEqual(bytes, addrBytes);
78
- });
79
- (0, node_test_1.it)('should verify a signed message', () => {
80
- const hexEncodedMessage = Buffer.from(txt).toString('hex');
81
- assert_1.default.strictEqual(src_1.Utils.verifySignature(hexEncodedMessage, base58, signedString, true), true);
82
- });
83
- (0, node_test_1.it)('should fail to verify a signed message if the message is not in hex', () => {
84
- assert_1.default.throws(() => src_1.Utils.verifySignature(txt, base58, signedString, true));
85
- });
86
- (0, node_test_1.it)('should fail to verify a signed message if the address is not in base58', () => {
87
- const hexEncodedString = Buffer.from(txt).toString('hex');
88
- assert_1.default.throws(() => src_1.Utils.verifySignature(hexEncodedString, addressHex, signedString, true));
89
- });
90
- (0, node_test_1.it)('should fail to verify a signed message if the signature is not in hex', () => {
91
- const hexEncodedString = Buffer.from(txt).toString('hex');
92
- assert_1.default.throws(() => src_1.Utils.verifySignature(hexEncodedString, base58, 'abc', true));
93
- });
94
- (0, node_test_1.it)('should return transaction data', () => {
95
- const data = src_1.Utils.decodeRawTransaction(resources_1.UnsignedTransferContractTx.tx.raw_data_hex);
96
- assert_1.default.equal(data.timestamp, resources_1.UnsignedTransferContractTx.tx.raw_data.timestamp);
97
- assert_1.default.equal(data.expiration, resources_1.UnsignedTransferContractTx.tx.raw_data.expiration);
98
- assert_1.default.ok(data.contracts);
99
- });
100
- (0, node_test_1.it)('should decode a transfer contract', () => {
101
- const tx = resources_1.UnsignedTransferContractTx.tx;
102
- const rawTx = src_1.Utils.decodeRawTransaction(tx.raw_data_hex);
103
- const value = resources_1.UnsignedTransferContractTx.tx.raw_data.contract[0].parameter.value;
104
- const parsedContract = src_1.Utils.decodeTransferContract(rawTx.contracts[0].parameter.value);
105
- const toAddress = src_1.Utils.getBase58AddressFromHex(value.to_address);
106
- const ownerAddress = src_1.Utils.getBase58AddressFromHex(value.owner_address);
107
- const amount = value.amount;
108
- assert_1.default.equal(parsedContract[0].parameter.value.to_address, toAddress);
109
- assert_1.default.equal(parsedContract[0].parameter.value.owner_address, ownerAddress);
110
- assert_1.default.equal(parsedContract[0].parameter.value.amount, amount);
111
- });
112
- (0, node_test_1.it)('should decode an AccountPermissionUpdate Contract', () => {
113
- const tx = resources_1.SignedAccountPermissionUpdateContractTx;
114
- const value = tx.raw_data.contract[0].parameter.value;
115
- const rawTx = src_1.Utils.decodeRawTransaction(tx.raw_data_hex);
116
- const parsedTx = src_1.Utils.decodeAccountPermissionUpdateContract(rawTx.contracts[0].parameter.value);
117
- const ownerAddress = src_1.Utils.getBase58AddressFromHex(value.owner_address);
118
- assert_1.default.equal(parsedTx.ownerAddress, ownerAddress);
119
- assert_1.default.equal(parsedTx.owner.type, 0);
120
- assert_1.default.equal(parsedTx.owner.threshold, 2);
121
- assert_1.default.equal(parsedTx.actives.length, 1);
122
- assert_1.default.equal(parsedTx.actives[0].type, 2);
123
- assert_1.default.equal(parsedTx.actives[0].threshold, 2);
124
- });
125
- (0, node_test_1.it)('should encode and decode data parameters for transfer', () => {
126
- const types = ['address', 'uint256'];
127
- const amount = '2000000000000000000000';
128
- const values = [addressHex, amount];
129
- const methodId = '0xa9059cbb';
130
- const data = src_1.Utils.encodeDataParams(types, values, methodId);
131
- assert_1.default.equal(data, 'a9059cbb0000000000000000000000002c2ba4a9ff6c53207dc5b686bfecf75ea7b8057700000000000000000000000000000000000000000000006c6b935b8bbd400000');
132
- const decodedData = src_1.Utils.decodeDataParams(types, 'a9059cbb0000000000000000000000002c2ba4a9ff6c53207dc5b686bfecf75ea7b8057700000000000000000000000000000000000000000000006c6b935b8bbd400000');
133
- assert_1.default.equal(decodedData[0], addressHex.toLocaleLowerCase());
134
- assert_1.default.equal(decodedData[1].toString(), amount);
135
- });
136
- (0, node_test_1.it)('should correctly map testnet and mainnet tokens', () => {
137
- assert_1.default.strictEqual(utils_1.tokenMainnetContractAddresses.includes('TSSMHYeV2uE9qYH95DqyoCuNCzEL1NvU3S'), true);
138
- assert_1.default.strictEqual(utils_1.tokenTestnetContractAddresses.includes('TGkfUshdbAiNj5G1mynp2meq2BfF6XSGPf'), true);
139
- });
140
- });
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQXlDO0FBQ3pDLG9EQUE0QjtBQUM1QixtQ0FBNkM7QUFFN0MsNENBQW1HO0FBQ25HLCtDQUFtRztBQUVuRyxJQUFBLG9CQUFRLEVBQUMscUJBQXFCLEVBQUU7SUFDOUIsaUJBQWlCO0lBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RILE1BQU0sR0FBRyxHQUFHLGtFQUFrRSxDQUFDO0lBQy9FLE1BQU0sR0FBRyxHQUFHLDBCQUEwQixDQUFDO0lBQ3ZDLE1BQU0sWUFBWSxHQUNoQixzSUFBc0ksQ0FBQztJQUV6SSxzQkFBc0I7SUFDdEIsTUFBTSxHQUFHLEdBQUcsa0VBQWtFLENBQUM7SUFDL0UsTUFBTSxHQUFHLEdBQ1Asb0lBQW9JLENBQUM7SUFDdkksTUFBTSxVQUFVLEdBQUcsNENBQTRDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsb0NBQW9DLENBQUM7SUFDcEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXBILGlCQUFpQjtJQUNqQixJQUFBLGNBQUUsRUFBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7UUFDekMsTUFBTSxFQUFFLEdBQUcsV0FBSyxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELGdCQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsY0FBRSxFQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtRQUNsRCxNQUFNLEVBQUUsR0FBRyxXQUFLLENBQUMsMEJBQTBCLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELGdCQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsY0FBRSxFQUFDLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtRQUN6QyxNQUFNLEVBQUUsR0FBRyxXQUFLLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxjQUFFLEVBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQzlCLE1BQU0sVUFBVSxHQUFHLFdBQUssQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sYUFBYSxHQUFHLFdBQUssQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUUsRUFBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEdBQUcsV0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakUsTUFBTSxPQUFPLEdBQUcsV0FBSyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsY0FBRSxFQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUMvQixNQUFNLElBQUksR0FBRyxXQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqRSxNQUFNLE1BQU0sR0FBRyxXQUFLLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxjQUFFLEVBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLFdBQUssQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUUsRUFBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUU7UUFDckMsTUFBTSxPQUFPLEdBQUcsV0FBSyxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdELGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsY0FBRSxFQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUMvQixNQUFNLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDZCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNyQixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUUsRUFBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELE1BQU0sTUFBTSxHQUFHLFdBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTlDLGdCQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsY0FBRSxFQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtRQUNoRCxNQUFNLFFBQVEsR0FBRyxXQUFLLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkQsTUFBTSxLQUFLLEdBQUcsV0FBSyxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELGdCQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsY0FBRSxFQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtRQUN4QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNELGdCQUFNLENBQUMsV0FBVyxDQUFDLFdBQUssQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsY0FBRSxFQUFDLHFFQUFxRSxFQUFFLEdBQUcsRUFBRTtRQUM3RSxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUUsRUFBQyx3RUFBd0UsRUFBRSxHQUFHLEVBQUU7UUFDaEYsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRCxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFLLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsY0FBRSxFQUFDLHVFQUF1RSxFQUFFLEdBQUcsRUFBRTtRQUMvRSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQUssQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxjQUFFLEVBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLFdBQUssQ0FBQyxvQkFBb0IsQ0FBQyxzQ0FBMEIsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxzQ0FBMEIsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9FLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsc0NBQTBCLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRixnQkFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUUsRUFBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7UUFDM0MsTUFBTSxFQUFFLEdBQUcsc0NBQTBCLENBQUMsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLFdBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQUcsc0NBQTBCLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUNqRixNQUFNLGNBQWMsR0FBRyxXQUFLLENBQUMsc0JBQXNCLENBQ2pELEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FDSCxDQUFDO1FBRWxDLE1BQU0sU0FBUyxHQUFHLFdBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEUsTUFBTSxZQUFZLEdBQUcsV0FBSyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBRTVCLGdCQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDNUUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pFLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxjQUFFLEVBQUMsbURBQW1ELEVBQUUsR0FBRyxFQUFFO1FBQzNELE1BQU0sRUFBRSxHQUFHLG1EQUF1QyxDQUFDO1FBQ25ELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDdEQsTUFBTSxLQUFLLEdBQUcsV0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxNQUFNLFFBQVEsR0FBRyxXQUFLLENBQUMscUNBQXFDLENBQzFELEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FDVSxDQUFDO1FBQy9DLE1BQU0sWUFBWSxHQUFHLFdBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNsRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsY0FBRSxFQUFDLHVEQUF1RCxFQUFFLEdBQUcsRUFBRTtRQUMvRCxNQUFNLEtBQUssR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQUcsV0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0QsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsSUFBSSxFQUNKLDBJQUEwSSxDQUMzSSxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsV0FBSyxDQUFDLGdCQUFnQixDQUN4QyxLQUFLLEVBQ0wsMElBQTBJLENBQzNJLENBQUM7UUFDRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUM3RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUUsRUFBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7UUFDekQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMscUNBQTZCLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkcsZ0JBQU0sQ0FBQyxXQUFXLENBQUMscUNBQTZCLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ25vZGU6dGVzdCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBJbnRlcmZhY2UsIFV0aWxzIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuaW1wb3J0IHsgVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgsIFNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeCB9IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyB0b2tlbk1haW5uZXRDb250cmFjdEFkZHJlc3NlcywgdG9rZW5UZXN0bmV0Q29udHJhY3RBZGRyZXNzZXMgfSBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcblxuZGVzY3JpYmUoJ1V0aWwgbGlicmFyeSBzaG91bGQnLCBmdW5jdGlvbiAoKSB7XG4gIC8vIGFyYml0cmFyeSB0ZXh0XG4gIGNvbnN0IGFyciA9IFsxMjcsIDI1NSwgMzEsIDE5MiwgMywgMTI2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgY29uc3QgaGV4ID0gJzdGRkYxRkMwMDM3RTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuICBjb25zdCB0eHQgPSAnYXJiaXRyYXJ5IHN0cmluZyB0byBzaWduJztcbiAgY29uc3Qgc2lnbmVkU3RyaW5nID1cbiAgICAnMHg5NDI0MTEzZjMyYzE3YjZmZmJlZWUwMjRlMWE1NGI2OTkxZDc1NmU4MmY2NmNjYTE2YTQxMjMxZmRmYTI3MGQwM2IwOGU4MzNmNWRiYmQ1Y2M4Njg5NmMyZTVlYTZjNzRkMmUyOTJjZGEyMWY3MTcxNjRmOTk0ZmNkZjI4NDg2ZDFiJztcblxuICAvLyBwcnYtcHViLWFkZHJlc3MgaGV4XG4gIGNvbnN0IHBydiA9ICdGQjNBQTg4N0UwQkUzRkFDOUQ3NUU2NjFEQUZGNEE3RkUwRTkxQUFCMTNEQTk3NzVDRDg1ODZEN0NCOUI3NjQwJztcbiAgY29uc3QgcHViID1cbiAgICAnMDQ2RUJGQjkwQzM5NkI0QTNCOTkyQjcyN0NCNDcxNEEzMkUyQTZERTQzRkRCM0VDMjY2Mjg2QUMyMjQ2RDhGRDFFMjNFMTJDMERFQjc1MkM2MzFBOTAxMUJCRjhCNTZFMkZCQUEyMEU5OUQzOTUyRjBBNTU4RDExRjk2RTdDMUM1RCc7XG4gIGNvbnN0IGFkZHJlc3NIZXggPSAnNDEyQzJCQTRBOUZGNkM1MzIwN0RDNUI2ODZCRkVDRjc1RUE3QjgwNTc3JztcbiAgY29uc3QgYmFzZTU4ID0gJ1REem0xdENYTTJZUzFQRGEzR29YU3Z4ZHk0QWd3VmJCUEUnO1xuICBjb25zdCBhZGRyQnl0ZXMgPSBbNjUsIDQ0LCA0MywgMTY0LCAxNjksIDI1NSwgMTA4LCA4MywgMzIsIDEyNSwgMTk3LCAxODIsIDEzNCwgMTkxLCAyMzYsIDI0NywgOTQsIDE2NywgMTg0LCA1LCAxMTldO1xuXG4gIC8vIHR4IGluZm9ybWF0aW9uXG4gIGl0KCdiZSBhYmxlIHRvIGNvbnZlcnQgaGV4IHRvIGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGJhID0gVXRpbHMuZ2V0Qnl0ZUFycmF5RnJvbUhleEFkZHJlc3MoaGV4KTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGJhLCBhcnIpO1xuICB9KTtcblxuICBpdCgnYmUgYWJsZSB0byBjb252ZXJ0IGhleCB3aXRoIDB4IHRvIGJ5dGVzICcsICgpID0+IHtcbiAgICBjb25zdCBiYSA9IFV0aWxzLmdldEJ5dGVBcnJheUZyb21IZXhBZGRyZXNzKCcweCcgKyBoZXgpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmEsIGFycik7XG4gIH0pO1xuXG4gIGl0KCdiZSBhYmxlIHRvIGNvbnZlcnQgaGV4IHRvIGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGhzID0gVXRpbHMuZ2V0SGV4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYXJyKTtcbiAgICBhc3NlcnQuZXF1YWwoaHMsIGhleCk7XG4gIH0pO1xuXG4gIGl0KCdnZXQgYSBwdWIgZnJvbSBhIHBydicsICgpID0+IHtcbiAgICBjb25zdCBkZXJpdmVkUHViID0gVXRpbHMuZ2V0UHViS2V5RnJvbVByaUtleShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gICAgY29uc3QgZGVyaXZlZFB1YkhleCA9IFV0aWxzLmdldEhleEFkZHJlc3NGcm9tQnl0ZUFycmF5KGRlcml2ZWRQdWIpO1xuICAgIGFzc2VydC5lcXVhbChkZXJpdmVkUHViSGV4LCBwdWIpO1xuICB9KTtcblxuICBpdCgnZ2V0IGFuIGhleCBhZGRyZXNzIGZyb20gYSBwcnYnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRkciA9IFV0aWxzLmdldEFkZHJlc3NGcm9tUHJpS2V5KEJ1ZmZlci5mcm9tKHBydiwgJ2hleCcpKTtcbiAgICBjb25zdCBoZXhBZGRyID0gVXRpbHMuZ2V0SGV4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYWRkcik7XG4gICAgYXNzZXJ0LmVxdWFsKGhleEFkZHIsIGFkZHJlc3NIZXgpO1xuICB9KTtcblxuICBpdCgnZ2V0IGFuIGJhc2U1OCBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IGFkZHIgPSBVdGlscy5nZXRBZGRyZXNzRnJvbVByaUtleShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gICAgY29uc3QgYWRkcjU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYWRkcik7XG4gICAgYXNzZXJ0LmVxdWFsKGFkZHI1OCwgYmFzZTU4KTtcbiAgfSk7XG5cbiAgaXQoJ2dldCBhbiBiYXNlNTggYWRkcmVzcyBmcm9tIGhleCcsICgpID0+IHtcbiAgICBjb25zdCBhZGRyNTggPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleChhZGRyZXNzSGV4KTtcbiAgICBhc3NlcnQuZXF1YWwoYWRkcjU4LCBiYXNlNTgpO1xuICB9KTtcblxuICBpdCgnZ2V0IGhleCBmcm9tIGJhc2U1OCBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IGhleEFkZHIgPSBVdGlscy5nZXRIZXhBZGRyZXNzRnJvbUJhc2U1OEFkZHJlc3MoYmFzZTU4KTtcbiAgICBhc3NlcnQuZXF1YWwoaGV4QWRkciwgYWRkcmVzc0hleCk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZSBhIGhleCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4ID0gWycweGFmZmQnLCAnMHgxMSddO1xuICAgIGhleC5tYXAoKGhleCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKFV0aWxzLmlzVmFsaWRIZXgoaGV4KSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnZhbGlkSGV4ID0gWycweGExMScsICcweEZGZFlZWScsICcweCcsICcnXTtcbiAgICBpbnZhbGlkSGV4Lm1hcCgoaGV4KSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVXRpbHMuaXNWYWxpZEhleChoZXgpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaWduIGEgc3RyaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGhleFRleHQgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBzaWduZWQgPSBVdGlscy5zaWduU3RyaW5nKGhleFRleHQsIHBydik7XG5cbiAgICBhc3NlcnQuZXF1YWwoc2lnbmVkU3RyaW5nLCBzaWduZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBhbiBhZGRyZXNzIGZyb20gYSBwdWInLCAoKSA9PiB7XG4gICAgY29uc3QgcHViQnl0ZXMgPSBVdGlscy5nZXRCeXRlQXJyYXlGcm9tSGV4QWRkcmVzcyhwdWIpO1xuICAgIGNvbnN0IGJ5dGVzID0gVXRpbHMuZ2V0UmF3QWRkcmVzc0Zyb21QdWJLZXkocHViQnl0ZXMpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYnl0ZXMsIGFkZHJCeXRlcyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IGEgc2lnbmVkIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4RW5jb2RlZE1lc3NhZ2UgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVXRpbHMudmVyaWZ5U2lnbmF0dXJlKGhleEVuY29kZWRNZXNzYWdlLCBiYXNlNTgsIHNpZ25lZFN0cmluZywgdHJ1ZSksIHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IGEgc2lnbmVkIG1lc3NhZ2UgaWYgdGhlIG1lc3NhZ2UgaXMgbm90IGluIGhleCcsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLnZlcmlmeVNpZ25hdHVyZSh0eHQsIGJhc2U1OCwgc2lnbmVkU3RyaW5nLCB0cnVlKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgYSBzaWduZWQgbWVzc2FnZSBpZiB0aGUgYWRkcmVzcyBpcyBub3QgaW4gYmFzZTU4JywgKCkgPT4ge1xuICAgIGNvbnN0IGhleEVuY29kZWRTdHJpbmcgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLnZlcmlmeVNpZ25hdHVyZShoZXhFbmNvZGVkU3RyaW5nLCBhZGRyZXNzSGV4LCBzaWduZWRTdHJpbmcsIHRydWUpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIHNpZ25lZCBtZXNzYWdlIGlmIHRoZSBzaWduYXR1cmUgaXMgbm90IGluIGhleCcsICgpID0+IHtcbiAgICBjb25zdCBoZXhFbmNvZGVkU3RyaW5nID0gQnVmZmVyLmZyb20odHh0KS50b1N0cmluZygnaGV4Jyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBVdGlscy52ZXJpZnlTaWduYXR1cmUoaGV4RW5jb2RlZFN0cmluZywgYmFzZTU4LCAnYWJjJywgdHJ1ZSkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0cmFuc2FjdGlvbiBkYXRhJywgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBVdGlscy5kZWNvZGVSYXdUcmFuc2FjdGlvbihVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YV9oZXgpO1xuICAgIGFzc2VydC5lcXVhbChkYXRhLnRpbWVzdGFtcCwgVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHgucmF3X2RhdGEudGltZXN0YW1wKTtcbiAgICBhc3NlcnQuZXF1YWwoZGF0YS5leHBpcmF0aW9uLCBVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YS5leHBpcmF0aW9uKTtcbiAgICBhc3NlcnQub2soZGF0YS5jb250cmFjdHMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlY29kZSBhIHRyYW5zZmVyIGNvbnRyYWN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHR4ID0gVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHg7XG4gICAgY29uc3QgcmF3VHggPSBVdGlscy5kZWNvZGVSYXdUcmFuc2FjdGlvbih0eC5yYXdfZGF0YV9oZXgpO1xuICAgIGNvbnN0IHZhbHVlID0gVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHgucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlO1xuICAgIGNvbnN0IHBhcnNlZENvbnRyYWN0ID0gVXRpbHMuZGVjb2RlVHJhbnNmZXJDb250cmFjdChcbiAgICAgIHJhd1R4LmNvbnRyYWN0c1swXS5wYXJhbWV0ZXIudmFsdWVcbiAgICApIGFzIEludGVyZmFjZS5UcmFuc2ZlckNvbnRyYWN0W107XG5cbiAgICBjb25zdCB0b0FkZHJlc3MgPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh2YWx1ZS50b19hZGRyZXNzKTtcbiAgICBjb25zdCBvd25lckFkZHJlc3MgPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh2YWx1ZS5vd25lcl9hZGRyZXNzKTtcbiAgICBjb25zdCBhbW91bnQgPSB2YWx1ZS5hbW91bnQ7XG5cbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkQ29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLnRvX2FkZHJlc3MsIHRvQWRkcmVzcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZENvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5vd25lcl9hZGRyZXNzLCBvd25lckFkZHJlc3MpO1xuICAgIGFzc2VydC5lcXVhbChwYXJzZWRDb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWUuYW1vdW50LCBhbW91bnQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlY29kZSBhbiBBY2NvdW50UGVybWlzc2lvblVwZGF0ZSBDb250cmFjdCcsICgpID0+IHtcbiAgICBjb25zdCB0eCA9IFNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeDtcbiAgICBjb25zdCB2YWx1ZSA9IHR4LnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZTtcbiAgICBjb25zdCByYXdUeCA9IFV0aWxzLmRlY29kZVJhd1RyYW5zYWN0aW9uKHR4LnJhd19kYXRhX2hleCk7XG4gICAgY29uc3QgcGFyc2VkVHggPSBVdGlscy5kZWNvZGVBY2NvdW50UGVybWlzc2lvblVwZGF0ZUNvbnRyYWN0KFxuICAgICAgcmF3VHguY29udHJhY3RzWzBdLnBhcmFtZXRlci52YWx1ZVxuICAgICkgYXMgSW50ZXJmYWNlLkFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3Q7XG4gICAgY29uc3Qgb3duZXJBZGRyZXNzID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgodmFsdWUub3duZXJfYWRkcmVzcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4Lm93bmVyQWRkcmVzcywgb3duZXJBZGRyZXNzKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHgub3duZXIudHlwZSwgMCk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4Lm93bmVyLnRocmVzaG9sZCwgMik7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4LmFjdGl2ZXMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHguYWN0aXZlc1swXS50eXBlLCAyKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHguYWN0aXZlc1swXS50aHJlc2hvbGQsIDIpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGVuY29kZSBhbmQgZGVjb2RlIGRhdGEgcGFyYW1ldGVycyBmb3IgdHJhbnNmZXInLCAoKSA9PiB7XG4gICAgY29uc3QgdHlwZXMgPSBbJ2FkZHJlc3MnLCAndWludDI1NiddO1xuICAgIGNvbnN0IGFtb3VudCA9ICcyMDAwMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICBjb25zdCB2YWx1ZXMgPSBbYWRkcmVzc0hleCwgYW1vdW50XTtcbiAgICBjb25zdCBtZXRob2RJZCA9ICcweGE5MDU5Y2JiJztcbiAgICBjb25zdCBkYXRhID0gVXRpbHMuZW5jb2RlRGF0YVBhcmFtcyh0eXBlcywgdmFsdWVzLCBtZXRob2RJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgZGF0YSxcbiAgICAgICdhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJjMmJhNGE5ZmY2YzUzMjA3ZGM1YjY4NmJmZWNmNzVlYTdiODA1NzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmM2YjkzNWI4YmJkNDAwMDAwJ1xuICAgICk7XG5cbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IFV0aWxzLmRlY29kZURhdGFQYXJhbXMoXG4gICAgICB0eXBlcyxcbiAgICAgICdhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJjMmJhNGE5ZmY2YzUzMjA3ZGM1YjY4NmJmZWNmNzVlYTdiODA1NzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmM2YjkzNWI4YmJkNDAwMDAwJ1xuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKGRlY29kZWREYXRhWzBdLCBhZGRyZXNzSGV4LnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgIGFzc2VydC5lcXVhbChkZWNvZGVkRGF0YVsxXS50b1N0cmluZygpLCBhbW91bnQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvcnJlY3RseSBtYXAgdGVzdG5ldCBhbmQgbWFpbm5ldCB0b2tlbnMnLCAoKSA9PiB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRva2VuTWFpbm5ldENvbnRyYWN0QWRkcmVzc2VzLmluY2x1ZGVzKCdUU1NNSFllVjJ1RTlxWUg5NURxeW9DdU5DekVMMU52VTNTJyksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b2tlblRlc3RuZXRDb250cmFjdEFkZHJlc3Nlcy5pbmNsdWRlcygnVEdrZlVzaGRiQWlOajVHMW15bnAybWVxMkJmRjZYU0dQZicpLCB0cnVlKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=verifyTransaction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verifyTransaction.d.ts","sourceRoot":"","sources":["../../../test/unit/verifyTransaction.ts"],"names":[],"mappings":""}
@@ -1,378 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const node_assert_1 = __importDefault(require("node:assert"));
7
- const crypto_1 = require("crypto");
8
- const node_test_1 = require("node:test");
9
- const sdk_api_1 = require("@bitgo-beta/sdk-api");
10
- const sdk_test_1 = require("@bitgo-beta/sdk-test");
11
- const src_1 = require("../../src");
12
- const lib_1 = require("../../src/lib");
13
- const resources_1 = require("../resources");
14
- (0, node_test_1.describe)('TRON Verify Transaction:', function () {
15
- const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
16
- bitgo.initializeTestVars();
17
- bitgo.safeRegister('trx', src_1.Trx.createInstance);
18
- bitgo.safeRegister('ttrx', src_1.Ttrx.createInstance);
19
- let basecoin;
20
- (0, node_test_1.before)(function () {
21
- basecoin = bitgo.coin('ttrx');
22
- });
23
- (0, node_test_1.describe)('Parameter Validation', () => {
24
- (0, node_test_1.it)('should throw error when txParams is missing', async function () {
25
- const params = {
26
- txPrebuild: {
27
- txHex: JSON.stringify({
28
- ...resources_1.UnsignedBuildTransaction,
29
- raw_data: {
30
- ...resources_1.UnsignedBuildTransaction.raw_data,
31
- expiration: Date.now() + 3600000,
32
- timestamp: Date.now(),
33
- },
34
- }),
35
- },
36
- wallet: {},
37
- };
38
- await node_assert_1.default.rejects(basecoin.verifyTransaction(params), {
39
- message: 'missing txParams',
40
- });
41
- });
42
- (0, node_test_1.it)('should throw error when wallet or txPrebuild is missing', async function () {
43
- const params = {
44
- txParams: {
45
- recipients: [{ address: 'TQFxDSoXy2yXRE5HtKwAwrNRXGxYxkeSGk', amount: '1000000' }],
46
- },
47
- };
48
- await node_assert_1.default.rejects(basecoin.verifyTransaction(params), {
49
- message: 'missing txPrebuild',
50
- });
51
- });
52
- (0, node_test_1.it)('should throw error when txPrebuild.txHex is missing', async function () {
53
- const params = {
54
- txParams: {
55
- recipients: [{ address: 'TQFxDSoXy2yXRE5HtKwAwrNRXGxYxkeSGk', amount: '1000000' }],
56
- },
57
- txPrebuild: {},
58
- wallet: {},
59
- };
60
- await node_assert_1.default.rejects(basecoin.verifyTransaction(params), {
61
- message: 'missing txHex in txPrebuild',
62
- });
63
- });
64
- });
65
- (0, node_test_1.describe)('Contract Type Validation', () => {
66
- (0, node_test_1.describe)('TransferContract', () => {
67
- (0, node_test_1.it)('should validate valid TransferContract', async function () {
68
- const timestamp = Date.now();
69
- const transferContract = {
70
- parameter: {
71
- value: {
72
- amount: 1000000,
73
- owner_address: '4173a5993cd182ae152adad8203163f780c65a8aa5',
74
- to_address: '41d6cd6a2c0ff35a319e6abb5b9503ba0278679882',
75
- },
76
- type_url: 'type.googleapis.com/protocol.TransferContract',
77
- },
78
- type: 'TransferContract',
79
- };
80
- const rawData = {
81
- contract: [transferContract],
82
- ref_block_bytes: 'c8cf',
83
- ref_block_hash: '89177fd84c5d9196',
84
- expiration: timestamp + 3600000,
85
- timestamp: timestamp,
86
- fee_limit: 150000000,
87
- };
88
- // Transform rawData to match the expected parameter structure
89
- const transformedRawData = {
90
- contract: rawData.contract,
91
- refBlockBytes: rawData.ref_block_bytes,
92
- refBlockHash: rawData.ref_block_hash,
93
- expiration: rawData.expiration,
94
- timestamp: rawData.timestamp,
95
- feeLimit: rawData.fee_limit,
96
- };
97
- // Generate raw_data_hex using the utility function
98
- const rawDataHex = lib_1.Utils.generateRawDataHex(transformedRawData);
99
- // Calculate txID as SHA256 hash of raw_data_hex
100
- const txID = (0, crypto_1.createHash)('sha256').update(Buffer.from(rawDataHex, 'hex')).digest('hex');
101
- const params = {
102
- txParams: {
103
- recipients: [
104
- {
105
- address: lib_1.Utils.getBase58AddressFromHex('41d6cd6a2c0ff35a319e6abb5b9503ba0278679882'),
106
- amount: '1000000',
107
- },
108
- ],
109
- },
110
- txPrebuild: {
111
- txHex: JSON.stringify({
112
- txID,
113
- raw_data: rawData,
114
- raw_data_hex: rawDataHex,
115
- }),
116
- },
117
- wallet: {},
118
- };
119
- const result = await basecoin.verifyTransaction(params);
120
- node_assert_1.default.strictEqual(result, true);
121
- });
122
- (0, node_test_1.it)('should fail with missing owner address', async function () {
123
- const timestamp = Date.now();
124
- const txID = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef';
125
- const transferContract = {
126
- parameter: {
127
- value: {
128
- amount: 1000000,
129
- to_address: '41c25420255c2c5a2dd54ef69f92ef261e6bd4216a',
130
- },
131
- type_url: 'type.googleapis.com/protocol.TransferContract',
132
- },
133
- type: 'TransferContract',
134
- };
135
- const rawData = {
136
- txID,
137
- contract: [transferContract],
138
- ref_block_bytes: 'c8cf',
139
- ref_block_hash: '89177fd84c5d9196',
140
- expiration: timestamp + 3600000,
141
- timestamp: timestamp,
142
- fee_limit: 150000000,
143
- };
144
- const transformedRawData = {
145
- contract: rawData.contract,
146
- refBlockBytes: rawData.ref_block_bytes,
147
- refBlockHash: rawData.ref_block_hash,
148
- expiration: rawData.expiration,
149
- timestamp: rawData.timestamp,
150
- feeLimit: rawData.fee_limit,
151
- };
152
- const expectedRawDataHex = lib_1.Utils.generateRawDataHex(transformedRawData);
153
- const params = {
154
- txParams: {
155
- recipients: [{ address: 'TLWh67P93KgtnZNCtGnEHM1H33Nhq2uvvN', amount: '1000000' }],
156
- },
157
- txPrebuild: {
158
- txHex: JSON.stringify({
159
- txID,
160
- raw_data: rawData,
161
- raw_data_hex: expectedRawDataHex,
162
- }),
163
- },
164
- wallet: {},
165
- };
166
- await node_assert_1.default.rejects(basecoin.verifyTransaction(params), {
167
- message: 'Transaction has not have a valid id',
168
- });
169
- });
170
- (0, node_test_1.it)('should fail with missing destination address', async function () {
171
- const timestamp = Date.now();
172
- const txID = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef';
173
- const transferContract = {
174
- parameter: {
175
- value: {
176
- amount: 1000000,
177
- owner_address: '4173a5993cd182ae152adad8203163f780c65a8aa5',
178
- },
179
- type_url: 'type.googleapis.com/protocol.TransferContract',
180
- },
181
- type: 'TransferContract',
182
- };
183
- const rawData = {
184
- txID,
185
- contract: [transferContract],
186
- ref_block_bytes: 'c8cf',
187
- ref_block_hash: '89177fd84c5d9196',
188
- expiration: timestamp + 3600000,
189
- timestamp: timestamp,
190
- fee_limit: 150000000,
191
- };
192
- const transformedRawData = {
193
- contract: rawData.contract,
194
- refBlockBytes: rawData.ref_block_bytes,
195
- refBlockHash: rawData.ref_block_hash,
196
- expiration: rawData.expiration,
197
- timestamp: rawData.timestamp,
198
- feeLimit: rawData.fee_limit,
199
- };
200
- const expectedRawDataHex = lib_1.Utils.generateRawDataHex(transformedRawData);
201
- const params = {
202
- txParams: {
203
- recipients: [{ address: 'TLWh67P93KgtnZNCtGnEHM1H33Nhq2uvvN', amount: '1000000' }],
204
- },
205
- txPrebuild: {
206
- txHex: JSON.stringify({
207
- txID,
208
- raw_data: rawData,
209
- raw_data_hex: expectedRawDataHex,
210
- }),
211
- },
212
- wallet: {},
213
- };
214
- await node_assert_1.default.rejects(basecoin.verifyTransaction(params), {
215
- message: 'Transaction has not have a valid id',
216
- });
217
- });
218
- (0, node_test_1.it)('should fail with missing amount', async function () {
219
- const timestamp = Date.now();
220
- const transferContract = {
221
- parameter: {
222
- value: {
223
- owner_address: '4173a5993cd182ae152adad8203163f780c65a8aa5',
224
- to_address: '41c25420255c2c5a2dd54ef69f92ef261e6bd4216a',
225
- },
226
- type_url: 'type.googleapis.com/protocol.TransferContract',
227
- },
228
- type: 'TransferContract',
229
- };
230
- const rawData = {
231
- contract: [transferContract],
232
- ref_block_bytes: 'c8cf',
233
- ref_block_hash: '89177fd84c5d9196',
234
- expiration: timestamp + 3600000,
235
- timestamp: timestamp,
236
- fee_limit: 150000000,
237
- };
238
- const transformedRawData = {
239
- contract: rawData.contract,
240
- refBlockBytes: rawData.ref_block_bytes,
241
- refBlockHash: rawData.ref_block_hash,
242
- expiration: rawData.expiration,
243
- timestamp: rawData.timestamp,
244
- feeLimit: rawData.fee_limit,
245
- };
246
- const expectedRawDataHex = lib_1.Utils.generateRawDataHex(transformedRawData);
247
- const params = {
248
- txParams: {
249
- recipients: [{ address: 'TLWh67P93KgtnZNCtGnEHM1H33Nhq2uvvN', amount: '1000000' }],
250
- },
251
- txPrebuild: {
252
- txHex: JSON.stringify({
253
- raw_data: rawData,
254
- raw_data_hex: expectedRawDataHex,
255
- }),
256
- },
257
- wallet: {},
258
- };
259
- await node_assert_1.default.rejects(basecoin.verifyTransaction(params), {
260
- message: 'Amount does not exist in this transfer contract.',
261
- });
262
- });
263
- (0, node_test_1.it)('should fail due to amount missmatch', async function () {
264
- const timestamp = Date.now();
265
- const transferContract = {
266
- parameter: {
267
- value: {
268
- amount: 2000000,
269
- owner_address: '4173a5993cd182ae152adad8203163f780c65a8aa5',
270
- to_address: '41d6cd6a2c0ff35a319e6abb5b9503ba0278679882',
271
- },
272
- type_url: 'type.googleapis.com/protocol.TransferContract',
273
- },
274
- type: 'TransferContract',
275
- };
276
- const rawData = {
277
- contract: [transferContract],
278
- ref_block_bytes: 'c8cf',
279
- ref_block_hash: '89177fd84c5d9196',
280
- expiration: timestamp + 3600000,
281
- timestamp: timestamp,
282
- fee_limit: 150000000,
283
- };
284
- // Transform rawData to match the expected parameter structure
285
- const transformedRawData = {
286
- contract: rawData.contract,
287
- refBlockBytes: rawData.ref_block_bytes,
288
- refBlockHash: rawData.ref_block_hash,
289
- expiration: rawData.expiration,
290
- timestamp: rawData.timestamp,
291
- feeLimit: rawData.fee_limit,
292
- };
293
- // Generate raw_data_hex using the utility function
294
- const rawDataHex = lib_1.Utils.generateRawDataHex(transformedRawData);
295
- // Calculate txID as SHA256 hash of raw_data_hex
296
- const txID = (0, crypto_1.createHash)('sha256').update(Buffer.from(rawDataHex, 'hex')).digest('hex');
297
- const params = {
298
- txParams: {
299
- recipients: [
300
- {
301
- address: '41d6cd6a2c0ff35a319e6abb5b9503ba0278679882',
302
- amount: '1000000',
303
- },
304
- ],
305
- },
306
- txPrebuild: {
307
- txHex: JSON.stringify({
308
- txID,
309
- raw_data: rawData,
310
- raw_data_hex: rawDataHex,
311
- }),
312
- },
313
- wallet: {},
314
- };
315
- await node_assert_1.default.rejects(basecoin.verifyTransaction(params), {
316
- message: 'transaction amount in txPrebuild does not match the value given by client',
317
- });
318
- });
319
- (0, node_test_1.it)('should fail due to destination address missmatch', async function () {
320
- const timestamp = Date.now();
321
- const transferContract = {
322
- parameter: {
323
- value: {
324
- amount: 1000000,
325
- owner_address: '4173a5993cd182ae152adad8203163f780c65a8aa5',
326
- to_address: '41d6cd6a2c0ff35a319e6abb5b9503ba0278679882',
327
- },
328
- type_url: 'type.googleapis.com/protocol.TransferContract',
329
- },
330
- type: 'TransferContract',
331
- };
332
- const rawData = {
333
- contract: [transferContract],
334
- ref_block_bytes: 'c8cf',
335
- ref_block_hash: '89177fd84c5d9196',
336
- expiration: timestamp + 3600000,
337
- timestamp: timestamp,
338
- fee_limit: 150000000,
339
- };
340
- // Transform rawData to match the expected parameter structure
341
- const transformedRawData = {
342
- contract: rawData.contract,
343
- refBlockBytes: rawData.ref_block_bytes,
344
- refBlockHash: rawData.ref_block_hash,
345
- expiration: rawData.expiration,
346
- timestamp: rawData.timestamp,
347
- feeLimit: rawData.fee_limit,
348
- };
349
- // Generate raw_data_hex using the utility function
350
- const rawDataHex = lib_1.Utils.generateRawDataHex(transformedRawData);
351
- // Calculate txID as SHA256 hash of raw_data_hex
352
- const txID = (0, crypto_1.createHash)('sha256').update(Buffer.from(rawDataHex, 'hex')).digest('hex');
353
- const params = {
354
- txParams: {
355
- recipients: [
356
- {
357
- address: '41d6cd6a2c0ff35a319e6abb5b9503ba0278679883',
358
- amount: '1000000',
359
- },
360
- ],
361
- },
362
- txPrebuild: {
363
- txHex: JSON.stringify({
364
- txID,
365
- raw_data: rawData,
366
- raw_data_hex: rawDataHex,
367
- }),
368
- },
369
- wallet: {},
370
- };
371
- await node_assert_1.default.rejects(basecoin.verifyTransaction(params), {
372
- message: 'destination address does not match with the recipient address',
373
- });
374
- });
375
- });
376
- });
377
- });
378
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5VHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdmVyaWZ5VHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4REFBaUM7QUFDakMsbUNBQW9DO0FBQ3BDLHlDQUFpRDtBQUNqRCxpREFBK0M7QUFDL0MsbURBQStEO0FBQy9ELG1DQUFzQztBQUN0Qyx1Q0FBc0M7QUFDdEMsNENBQXdEO0FBRXhELElBQUEsb0JBQVEsRUFBQywwQkFBMEIsRUFBRTtJQUNuQyxNQUFNLEtBQUssR0FBaUIsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFaEQsSUFBSSxRQUFRLENBQUM7SUFFYixJQUFBLGtCQUFNLEVBQUM7UUFDTCxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsb0JBQVEsRUFBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7UUFDcEMsSUFBQSxjQUFFLEVBQUMsNkNBQTZDLEVBQUUsS0FBSztZQUNyRCxNQUFNLE1BQU0sR0FBRztnQkFDYixVQUFVLEVBQUU7b0JBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ3BCLEdBQUcsb0NBQXdCO3dCQUMzQixRQUFRLEVBQUU7NEJBQ1IsR0FBRyxvQ0FBd0IsQ0FBQyxRQUFROzRCQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU87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QU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFdkYsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsUUFBUSxFQUFFO3dCQUNSLFVBQVUsRUFBRTs0QkFDVjtnQ0FDRSxPQUFPLEVBQUUsNENBQTRDO2dDQUNyRCxNQUFNLEVBQUUsU0FBUzs2QkFDbEI7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsVUFBVSxFQUFFO3dCQUNWLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNwQixJQUFJOzRCQUNKLFFBQVEsRUFBRSxPQUFPOzRCQUNqQixZQUFZLEVBQUUsVUFBVTt5QkFDekIsQ0FBQztxQkFDSDtvQkFDRCxNQUFNLEVBQUUsRUFBRTtpQkFDWCxDQUFDO2dCQUVGLE1BQU0scUJBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN2RCxPQUFPLEVBQUUsK0RBQStEO2lCQUN6RSxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQsIGJlZm9yZSB9IGZyb20gJ25vZGU6dGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuaW1wb3J0IHsgVGVzdEJpdEdvQVBJLCBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28tYmV0YS9zZGstdGVzdCc7XG5pbXBvcnQgeyBUcngsIFR0cnggfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IFVuc2lnbmVkQnVpbGRUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3Jlc291cmNlcyc7XG5cbmRlc2NyaWJlKCdUUk9OIFZlcmlmeSBUcmFuc2FjdGlvbjonLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpdGdvOiBUZXN0Qml0R29BUEkgPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RyeCcsIFRyeC5jcmVhdGVJbnN0YW5jZSk7XG4gIGJpdGdvLnNhZmVSZWdpc3RlcigndHRyeCcsIFR0cnguY3JlYXRlSW5zdGFuY2UpO1xuXG4gIGxldCBiYXNlY29pbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndHRyeCcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFyYW1ldGVyIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHR4UGFyYW1zIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgLi4uVW5zaWduZWRCdWlsZFRyYW5zYWN0aW9uLFxuICAgICAgICAgICAgcmF3X2RhdGE6IHtcbiAgICAgICAgICAgICAgLi4uVW5zaWduZWRCdWlsZFRyYW5zYWN0aW9uLnJhd19kYXRhLFxuICAgICAgICAgICAgICBleHBpcmF0aW9uOiBEYXRlLm5vdygpICsgMzYwMDAwMCxcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgbWVzc2FnZTogJ21pc3NpbmcgdHhQYXJhbXMnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gd2FsbGV0IG9yIHR4UHJlYnVpbGQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnVFFGeERTb1h5MnlYUkU1SHRLd0F3ck5SWEd4WXhrZVNHaycsIGFtb3VudDogJzEwMDAwMDAnIH1dLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKSwge1xuICAgICAgICBtZXNzYWdlOiAnbWlzc2luZyB0eFByZWJ1aWxkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHR4UHJlYnVpbGQudHhIZXggaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnVFFGeERTb1h5MnlYUkU1SHRLd0F3ck5SWEd4WXhrZVNHaycsIGFtb3VudDogJzEwMDAwMDAnIH1dLFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7fSxcbiAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgbWVzc2FnZTogJ21pc3NpbmcgdHhIZXggaW4gdHhQcmVidWlsZCcsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NvbnRyYWN0IFR5cGUgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBkZXNjcmliZSgnVHJhbnNmZXJDb250cmFjdCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdmFsaWQgVHJhbnNmZXJDb250cmFjdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJDb250cmFjdCA9IHtcbiAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMCxcbiAgICAgICAgICAgICAgb3duZXJfYWRkcmVzczogJzQxNzNhNTk5M2NkMTgyYWUxNTJhZGFkODIwMzE2M2Y3ODBjNjVhOGFhNScsXG4gICAgICAgICAgICAgIHRvX2FkZHJlc3M6ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGVfdXJsOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiBbdHJhbnNmZXJDb250cmFjdF0sXG4gICAgICAgICAgcmVmX2Jsb2NrX2J5dGVzOiAnYzhjZicsXG4gICAgICAgICAgcmVmX2Jsb2NrX2hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgICBleHBpcmF0aW9uOiB0aW1lc3RhbXAgKyAzNjAwMDAwLFxuICAgICAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wLFxuICAgICAgICAgIGZlZV9saW1pdDogMTUwMDAwMDAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSByYXdEYXRhIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBwYXJhbWV0ZXIgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmF3RGF0YSA9IHtcbiAgICAgICAgICBjb250cmFjdDogcmF3RGF0YS5jb250cmFjdCBhcyBhbnksXG4gICAgICAgICAgcmVmQmxvY2tCeXRlczogcmF3RGF0YS5yZWZfYmxvY2tfYnl0ZXMsXG4gICAgICAgICAgcmVmQmxvY2tIYXNoOiByYXdEYXRhLnJlZl9ibG9ja19oYXNoLFxuICAgICAgICAgIGV4cGlyYXRpb246IHJhd0RhdGEuZXhwaXJhdGlvbixcbiAgICAgICAgICB0aW1lc3RhbXA6IHJhd0RhdGEudGltZXN0YW1wLFxuICAgICAgICAgIGZlZUxpbWl0OiByYXdEYXRhLmZlZV9saW1pdCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSByYXdfZGF0YV9oZXggdXNpbmcgdGhlIHV0aWxpdHkgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgcmF3RGF0YUhleCA9IFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0eElEIGFzIFNIQTI1NiBoYXNoIG9mIHJhd19kYXRhX2hleFxuICAgICAgICBjb25zdCB0eElEID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEJ1ZmZlci5mcm9tKHJhd0RhdGFIZXgsICdoZXgnKSkuZGlnZXN0KCdoZXgnKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KCc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInKSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICB0eEhleDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB0eElELFxuICAgICAgICAgICAgICByYXdfZGF0YTogcmF3RGF0YSxcbiAgICAgICAgICAgICAgcmF3X2RhdGFfaGV4OiByYXdEYXRhSGV4LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIG1pc3Npbmcgb3duZXIgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdHhJRCA9ICcwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmJztcbiAgICAgICAgY29uc3QgdHJhbnNmZXJDb250cmFjdCA9IHtcbiAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMCxcbiAgICAgICAgICAgICAgdG9fYWRkcmVzczogJzQxYzI1NDIwMjU1YzJjNWEyZGQ1NGVmNjlmOTJlZjI2MWU2YmQ0MjE2YScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZV91cmw6ICd0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlRyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJhd0RhdGEgPSB7XG4gICAgICAgICAgdHhJRCxcbiAgICAgICAgICBjb250cmFjdDogW3RyYW5zZmVyQ29udHJhY3RdLFxuICAgICAgICAgIHJlZl9ibG9ja19ieXRlczogJ2M4Y2YnLFxuICAgICAgICAgIHJlZl9ibG9ja19oYXNoOiAnODkxNzdmZDg0YzVkOTE5NicsXG4gICAgICAgICAgZXhwaXJhdGlvbjogdGltZXN0YW1wICsgMzYwMDAwMCxcbiAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCxcbiAgICAgICAgICBmZWVfbGltaXQ6IDE1MDAwMDAwMCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFJhd0RhdGEgPSB7XG4gICAgICAgICAgY29udHJhY3Q6IHJhd0RhdGEuY29udHJhY3QgYXMgYW55LFxuICAgICAgICAgIHJlZkJsb2NrQnl0ZXM6IHJhd0RhdGEucmVmX2Jsb2NrX2J5dGVzLFxuICAgICAgICAgIHJlZkJsb2NrSGFzaDogcmF3RGF0YS5yZWZfYmxvY2tfaGFzaCxcbiAgICAgICAgICBleHBpcmF0aW9uOiByYXdEYXRhLmV4cGlyYXRpb24sXG4gICAgICAgICAgdGltZXN0YW1wOiByYXdEYXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICBmZWVMaW1pdDogcmF3RGF0YS5mZWVfbGltaXQsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZXhwZWN0ZWRSYXdEYXRhSGV4ID0gVXRpbHMuZ2VuZXJhdGVSYXdEYXRhSGV4KHRyYW5zZm9ybWVkUmF3RGF0YSk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnVExXaDY3UDkzS2d0blpOQ3RHbkVITTFIMzNOaHEydXZ2TicsIGFtb3VudDogJzEwMDAwMDAnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgICAgdHhIZXg6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgdHhJRCxcbiAgICAgICAgICAgICAgcmF3X2RhdGE6IHJhd0RhdGEsXG4gICAgICAgICAgICAgIHJhd19kYXRhX2hleDogZXhwZWN0ZWRSYXdEYXRhSGV4LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXQ6IHt9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtcyksIHtcbiAgICAgICAgICBtZXNzYWdlOiAnVHJhbnNhY3Rpb24gaGFzIG5vdCBoYXZlIGEgdmFsaWQgaWQnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBtaXNzaW5nIGRlc3RpbmF0aW9uIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHR4SUQgPSAnMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZic7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyQ29udHJhY3QgPSB7XG4gICAgICAgICAgcGFyYW1ldGVyOiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAsXG4gICAgICAgICAgICAgIG93bmVyX2FkZHJlc3M6ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGVfdXJsOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByYXdEYXRhID0ge1xuICAgICAgICAgIHR4SUQsXG4gICAgICAgICAgY29udHJhY3Q6IFt0cmFuc2ZlckNvbnRyYWN0XSxcbiAgICAgICAgICByZWZfYmxvY2tfYnl0ZXM6ICdjOGNmJyxcbiAgICAgICAgICByZWZfYmxvY2tfaGFzaDogJzg5MTc3ZmQ4NGM1ZDkxOTYnLFxuICAgICAgICAgIGV4cGlyYXRpb246IHRpbWVzdGFtcCArIDM2MDAwMDAsXG4gICAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAsXG4gICAgICAgICAgZmVlX2xpbWl0OiAxNTAwMDAwMDAsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiByYXdEYXRhLmNvbnRyYWN0IGFzIGFueSxcbiAgICAgICAgICByZWZCbG9ja0J5dGVzOiByYXdEYXRhLnJlZl9ibG9ja19ieXRlcyxcbiAgICAgICAgICByZWZCbG9ja0hhc2g6IHJhd0RhdGEucmVmX2Jsb2NrX2hhc2gsXG4gICAgICAgICAgZXhwaXJhdGlvbjogcmF3RGF0YS5leHBpcmF0aW9uLFxuICAgICAgICAgIHRpbWVzdGFtcDogcmF3RGF0YS50aW1lc3RhbXAsXG4gICAgICAgICAgZmVlTGltaXQ6IHJhd0RhdGEuZmVlX2xpbWl0LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkUmF3RGF0YUhleCA9IFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1RMV2g2N1A5M0tndG5aTkN0R25FSE0xSDMzTmhxMnV2dk4nLCBhbW91bnQ6ICcxMDAwMDAwJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHR4SUQsXG4gICAgICAgICAgICAgIHJhd19kYXRhOiByYXdEYXRhLFxuICAgICAgICAgICAgICByYXdfZGF0YV9oZXg6IGV4cGVjdGVkUmF3RGF0YUhleCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ1RyYW5zYWN0aW9uIGhhcyBub3QgaGF2ZSBhIHZhbGlkIGlkJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggbWlzc2luZyBhbW91bnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyQ29udHJhY3QgPSB7XG4gICAgICAgICAgcGFyYW1ldGVyOiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBvd25lcl9hZGRyZXNzOiAnNDE3M2E1OTkzY2QxODJhZTE1MmFkYWQ4MjAzMTYzZjc4MGM2NWE4YWE1JyxcbiAgICAgICAgICAgICAgdG9fYWRkcmVzczogJzQxYzI1NDIwMjU1YzJjNWEyZGQ1NGVmNjlmOTJlZjI2MWU2YmQ0MjE2YScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZV91cmw6ICd0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlRyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJhd0RhdGEgPSB7XG4gICAgICAgICAgY29udHJhY3Q6IFt0cmFuc2ZlckNvbnRyYWN0XSxcbiAgICAgICAgICByZWZfYmxvY2tfYnl0ZXM6ICdjOGNmJyxcbiAgICAgICAgICByZWZfYmxvY2tfaGFzaDogJzg5MTc3ZmQ4NGM1ZDkxOTYnLFxuICAgICAgICAgIGV4cGlyYXRpb246IHRpbWVzdGFtcCArIDM2MDAwMDAsXG4gICAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAsXG4gICAgICAgICAgZmVlX2xpbWl0OiAxNTAwMDAwMDAsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiByYXdEYXRhLmNvbnRyYWN0IGFzIGFueSxcbiAgICAgICAgICByZWZCbG9ja0J5dGVzOiByYXdEYXRhLnJlZl9ibG9ja19ieXRlcyxcbiAgICAgICAgICByZWZCbG9ja0hhc2g6IHJhd0RhdGEucmVmX2Jsb2NrX2hhc2gsXG4gICAgICAgICAgZXhwaXJhdGlvbjogcmF3RGF0YS5leHBpcmF0aW9uLFxuICAgICAgICAgIHRpbWVzdGFtcDogcmF3RGF0YS50aW1lc3RhbXAsXG4gICAgICAgICAgZmVlTGltaXQ6IHJhd0RhdGEuZmVlX2xpbWl0LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkUmF3RGF0YUhleCA9IFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1RMV2g2N1A5M0tndG5aTkN0R25FSE0xSDMzTmhxMnV2dk4nLCBhbW91bnQ6ICcxMDAwMDAwJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHJhd19kYXRhOiByYXdEYXRhLFxuICAgICAgICAgICAgICByYXdfZGF0YV9oZXg6IGV4cGVjdGVkUmF3RGF0YUhleCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0OiB7fSxcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXMpLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ0Ftb3VudCBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIHRyYW5zZmVyIGNvbnRyYWN0LicsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBkdWUgdG8gYW1vdW50IG1pc3NtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJDb250cmFjdCA9IHtcbiAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogMjAwMDAwMCxcbiAgICAgICAgICAgICAgb3duZXJfYWRkcmVzczogJzQxNzNhNTk5M2NkMTgyYWUxNTJhZGFkODIwMzE2M2Y3ODBjNjVhOGFhNScsXG4gICAgICAgICAgICAgIHRvX2FkZHJlc3M6ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGVfdXJsOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiBbdHJhbnNmZXJDb250cmFjdF0sXG4gICAgICAgICAgcmVmX2Jsb2NrX2J5dGVzOiAnYzhjZicsXG4gICAgICAgICAgcmVmX2Jsb2NrX2hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgICBleHBpcmF0aW9uOiB0aW1lc3RhbXAgKyAzNjAwMDAwLFxuICAgICAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wLFxuICAgICAgICAgIGZlZV9saW1pdDogMTUwMDAwMDAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSByYXdEYXRhIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBwYXJhbWV0ZXIgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmF3RGF0YSA9IHtcbiAgICAgICAgICBjb250cmFjdDogcmF3RGF0YS5jb250cmFjdCBhcyBhbnksXG4gICAgICAgICAgcmVmQmxvY2tCeXRlczogcmF3RGF0YS5yZWZfYmxvY2tfYnl0ZXMsXG4gICAgICAgICAgcmVmQmxvY2tIYXNoOiByYXdEYXRhLnJlZl9ibG9ja19oYXNoLFxuICAgICAgICAgIGV4cGlyYXRpb246IHJhd0RhdGEuZXhwaXJhdGlvbixcbiAgICAgICAgICB0aW1lc3RhbXA6IHJhd0RhdGEudGltZXN0YW1wLFxuICAgICAgICAgIGZlZUxpbWl0OiByYXdEYXRhLmZlZV9saW1pdCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSByYXdfZGF0YV9oZXggdXNpbmcgdGhlIHV0aWxpdHkgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgcmF3RGF0YUhleCA9IFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0eElEIGFzIFNIQTI1NiBoYXNoIG9mIHJhd19kYXRhX2hleFxuICAgICAgICBjb25zdCB0eElEID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEJ1ZmZlci5mcm9tKHJhd0RhdGFIZXgsICdoZXgnKSkuZGlnZXN0KCdoZXgnKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInLFxuICAgICAgICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHR4SUQsXG4gICAgICAgICAgICAgIHJhd19kYXRhOiByYXdEYXRhLFxuICAgICAgICAgICAgICByYXdfZGF0YV9oZXg6IHJhd0RhdGFIZXgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldDoge30sXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICd0cmFuc2FjdGlvbiBhbW91bnQgaW4gdHhQcmVidWlsZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgZ2l2ZW4gYnkgY2xpZW50JyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGR1ZSB0byBkZXN0aW5hdGlvbiBhZGRyZXNzIG1pc3NtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJDb250cmFjdCA9IHtcbiAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMCxcbiAgICAgICAgICAgICAgb3duZXJfYWRkcmVzczogJzQxNzNhNTk5M2NkMTgyYWUxNTJhZGFkODIwMzE2M2Y3ODBjNjVhOGFhNScsXG4gICAgICAgICAgICAgIHRvX2FkZHJlc3M6ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODInLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGVfdXJsOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByYXdEYXRhID0ge1xuICAgICAgICAgIGNvbnRyYWN0OiBbdHJhbnNmZXJDb250cmFjdF0sXG4gICAgICAgICAgcmVmX2Jsb2NrX2J5dGVzOiAnYzhjZicsXG4gICAgICAgICAgcmVmX2Jsb2NrX2hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgICBleHBpcmF0aW9uOiB0aW1lc3RhbXAgKyAzNjAwMDAwLFxuICAgICAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wLFxuICAgICAgICAgIGZlZV9saW1pdDogMTUwMDAwMDAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSByYXdEYXRhIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBwYXJhbWV0ZXIgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmF3RGF0YSA9IHtcbiAgICAgICAgICBjb250cmFjdDogcmF3RGF0YS5jb250cmFjdCBhcyBhbnksXG4gICAgICAgICAgcmVmQmxvY2tCeXRlczogcmF3RGF0YS5yZWZfYmxvY2tfYnl0ZXMsXG4gICAgICAgICAgcmVmQmxvY2tIYXNoOiByYXdEYXRhLnJlZl9ibG9ja19oYXNoLFxuICAgICAgICAgIGV4cGlyYXRpb246IHJhd0RhdGEuZXhwaXJhdGlvbixcbiAgICAgICAgICB0aW1lc3RhbXA6IHJhd0RhdGEudGltZXN0YW1wLFxuICAgICAgICAgIGZlZUxpbWl0OiByYXdEYXRhLmZlZV9saW1pdCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSByYXdfZGF0YV9oZXggdXNpbmcgdGhlIHV0aWxpdHkgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgcmF3RGF0YUhleCA9IFV0aWxzLmdlbmVyYXRlUmF3RGF0YUhleCh0cmFuc2Zvcm1lZFJhd0RhdGEpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0eElEIGFzIFNIQTI1NiBoYXNoIG9mIHJhd19kYXRhX2hleFxuICAgICAgICBjb25zdCB0eElEID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEJ1ZmZlci5mcm9tKHJhd0RhdGFIZXgsICdoZXgnKSkuZGlnZXN0KCdoZXgnKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6ICc0MWQ2Y2Q2YTJjMGZmMzVhMzE5ZTZhYmI1Yjk1MDNiYTAyNzg2Nzk4ODMnLFxuICAgICAgICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIHR4SGV4OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHR4SUQsXG4gICAgICAgICAgICAgIHJhd19kYXRhOiByYXdEYXRhLFxuICAgICAgICAgICAgICByYXdfZGF0YV9oZXg6IHJhd0RhdGFIZXgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldDoge30sXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zKSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdkZXN0aW5hdGlvbiBhZGRyZXNzIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHJlY2lwaWVudCBhZGRyZXNzJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==