@bitgo/sdk-coin-sui 5.22.0 → 5.23.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 (46) hide show
  1. package/dist/src/lib/iface.d.ts +19 -1
  2. package/dist/src/lib/iface.d.ts.map +1 -1
  3. package/dist/src/lib/iface.js +8 -1
  4. package/dist/src/lib/mystenlab/builder/Inputs.d.ts +31 -2
  5. package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -1
  6. package/dist/src/lib/mystenlab/builder/Inputs.js +43 -3
  7. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +29 -0
  8. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -1
  9. package/dist/src/lib/mystenlab/builder/TransactionBlock.js +23 -1
  10. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +21 -0
  11. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -1
  12. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +6 -2
  13. package/dist/src/lib/mystenlab/types/coin.d.ts +4 -2
  14. package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -1
  15. package/dist/src/lib/mystenlab/types/coin.js +3 -2
  16. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +18 -0
  17. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -1
  18. package/dist/src/lib/mystenlab/types/sui-bcs.js +13 -1
  19. package/dist/src/lib/tokenTransferBuilder.d.ts +30 -2
  20. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/tokenTransferBuilder.js +82 -12
  22. package/dist/src/lib/tokenTransferTransaction.d.ts +3 -1
  23. package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -1
  24. package/dist/src/lib/tokenTransferTransaction.js +26 -12
  25. package/dist/src/lib/transaction.d.ts.map +1 -1
  26. package/dist/src/lib/transaction.js +23 -1
  27. package/dist/src/lib/transactionBuilder.d.ts +7 -1
  28. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  29. package/dist/src/lib/transactionBuilder.js +15 -2
  30. package/dist/src/lib/transferBuilder.d.ts +44 -1
  31. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  32. package/dist/src/lib/transferBuilder.js +118 -2
  33. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  34. package/dist/src/lib/transferTransaction.js +17 -9
  35. package/dist/src/lib/utils.d.ts +11 -2
  36. package/dist/src/lib/utils.d.ts.map +1 -1
  37. package/dist/src/lib/utils.js +26 -2
  38. package/dist/src/sui.d.ts +2 -2
  39. package/dist/src/sui.d.ts.map +1 -1
  40. package/dist/src/sui.js +35 -7
  41. package/dist/test/unit/sui.js +64 -40
  42. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +107 -1
  43. package/dist/test/unit/transactionBuilder/transferBuilder.js +131 -1
  44. package/dist/test/unit/utils.js +106 -1
  45. package/dist/tsconfig.tsbuildinfo +1 -1
  46. package/package.json +7 -7
@@ -39,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  const should_1 = __importDefault(require("should"));
40
40
  const testData = __importStar(require("../resources/sui"));
41
41
  const utils_1 = __importDefault(require("../../src/lib/utils"));
42
+ const nock_1 = __importDefault(require("nock"));
42
43
  describe('Sui util library', function () {
43
44
  describe('isValidAddress', function () {
44
45
  it('should succeed to validate valid address', function () {
@@ -77,5 +78,109 @@ describe('Sui util library', function () {
77
78
  should_1.default.equal(utils_1.default.normalizeHexId(hexId), hexId);
78
79
  });
79
80
  });
81
+ describe('getBalance', function () {
82
+ const nodeUrl = 'https://fullnode.testnet.sui.io';
83
+ const owner = '0xb7db6234a33f1e35f7114dac69574c6b7b193f3c4a0801e5ddb9fae4009af637';
84
+ afterEach(function () {
85
+ nock_1.default.cleanAll();
86
+ });
87
+ it('should return all funds in address balance when fundsInAddressBalance equals totalBalance', async function () {
88
+ // Real response from testnet: all 2 SUI held in address balance, not in coin objects
89
+ (0, nock_1.default)(nodeUrl)
90
+ .post('/')
91
+ .reply(200, {
92
+ jsonrpc: '2.0',
93
+ id: 1,
94
+ result: {
95
+ coinType: '0x2::sui::SUI',
96
+ coinObjectCount: 1,
97
+ totalBalance: '2000000',
98
+ lockedBalance: {},
99
+ fundsInAddressBalance: '2000000',
100
+ },
101
+ });
102
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
103
+ balanceInfo.totalBalance.should.equal('2000000');
104
+ balanceInfo.fundsInAddressBalance.should.equal('2000000');
105
+ balanceInfo.coinObjectBalance.should.equal('0');
106
+ });
107
+ it('should correctly split totalBalance into coinObjectBalance and fundsInAddressBalance', async function () {
108
+ (0, nock_1.default)(nodeUrl)
109
+ .post('/')
110
+ .reply(200, {
111
+ jsonrpc: '2.0',
112
+ id: 1,
113
+ result: {
114
+ coinType: '0x2::sui::SUI',
115
+ coinObjectCount: 2,
116
+ totalBalance: '1900000000',
117
+ lockedBalance: {},
118
+ fundsInAddressBalance: '900000000',
119
+ },
120
+ });
121
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
122
+ balanceInfo.totalBalance.should.equal('1900000000');
123
+ balanceInfo.fundsInAddressBalance.should.equal('900000000');
124
+ balanceInfo.coinObjectBalance.should.equal('1000000000');
125
+ });
126
+ it('should handle legacy response without fundsInAddressBalance (all funds in coin objects)', async function () {
127
+ (0, nock_1.default)(nodeUrl)
128
+ .post('/')
129
+ .reply(200, {
130
+ jsonrpc: '2.0',
131
+ id: 1,
132
+ result: {
133
+ coinType: '0x2::sui::SUI',
134
+ coinObjectCount: 1,
135
+ totalBalance: '1900000000',
136
+ lockedBalance: {},
137
+ },
138
+ });
139
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
140
+ balanceInfo.totalBalance.should.equal('1900000000');
141
+ balanceInfo.fundsInAddressBalance.should.equal('0');
142
+ balanceInfo.coinObjectBalance.should.equal('1900000000');
143
+ });
144
+ it('should return zero balances for an empty account', async function () {
145
+ (0, nock_1.default)(nodeUrl)
146
+ .post('/')
147
+ .reply(200, {
148
+ jsonrpc: '2.0',
149
+ id: 1,
150
+ result: {
151
+ coinType: '0x2::sui::SUI',
152
+ coinObjectCount: 0,
153
+ totalBalance: '0',
154
+ lockedBalance: {},
155
+ fundsInAddressBalance: '0',
156
+ },
157
+ });
158
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
159
+ balanceInfo.totalBalance.should.equal('0');
160
+ balanceInfo.fundsInAddressBalance.should.equal('0');
161
+ balanceInfo.coinObjectBalance.should.equal('0');
162
+ });
163
+ it('should query with a custom coin type', async function () {
164
+ const packageId = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
165
+ const coinType = `${packageId}::deep::DEEP`;
166
+ (0, nock_1.default)(nodeUrl)
167
+ .post('/', (body) => body.params[1] === coinType)
168
+ .reply(200, {
169
+ jsonrpc: '2.0',
170
+ id: 1,
171
+ result: {
172
+ coinType,
173
+ coinObjectCount: 1,
174
+ totalBalance: '1000',
175
+ lockedBalance: {},
176
+ fundsInAddressBalance: '0',
177
+ },
178
+ });
179
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner, coinType);
180
+ balanceInfo.totalBalance.should.equal('1000');
181
+ balanceInfo.fundsInAddressBalance.should.equal('0');
182
+ balanceInfo.coinObjectBalance.should.equal('1000');
183
+ });
184
+ });
80
185
  });
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsMkRBQTZDO0FBQzdDLGdFQUF3QztBQUV4QyxRQUFRLENBQUMsa0JBQWtCLEVBQUU7SUFDM0IsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3pCLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtZQUM3QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hELGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMxRCxnQkFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUNELHdFQUF3RTtZQUN4RSxnQkFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDM0Qsa0VBQWtFO1lBQ2xFLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtRQUNoQyxFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxvREFBb0QsRUFBRTtZQUN2RCxnQkFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFLLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDaEYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3pCLEVBQUUsQ0FBQyxrREFBa0QsRUFBRTtZQUNyRCxNQUFNLEtBQUssR0FBRywwQ0FBMEMsQ0FBQztZQUN6RCxNQUFNLGtCQUFrQixHQUFHLDRDQUE0QyxDQUFDO1lBQ3hFLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxNQUFNLEtBQUssR0FBRyw0Q0FBNEMsQ0FBQztZQUMzRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcy9zdWknO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuXG5kZXNjcmliZSgnU3VpIHV0aWwgbGlicmFyeScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2lzVmFsaWRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2YWxpZGF0ZSB2YWxpZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBpbnZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB0ZXN0RGF0YS5hZGRyZXNzZXMuaW52YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRlc3RpbmcgZm9yIG1pc3NpbmcgcGFyYW0sIHNob3VsZCBub3QgdGhyb3cgYW4gZXJyb3JcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZEFkZHJlc3ModW5kZWZpbmVkKSk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRlc3RpbmcgZm9yIG1pc3NpbmcgcGFyYW0sIHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyh1bmRlZmluZWQpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkUmF3VHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZhbGlkYXRlIGEgdmFsaWQgcmF3IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5UUkFOU0ZFUiksIHRydWUpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBhbiBpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLklOVkFMSURfUkFXX1RYKSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLklOVkFMSURfUkFXX1RYKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9ybWFsaXplSGV4SWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIG5vcm1hbGl6ZSBoZXhJZCB3aXRoIG5vIHByZWZpeCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGhleElkID0gJ2NiYTRhNDhiYjBmOGI1ODZjMTY3ZTVkY2VmYWExYzVlOTZhYjNmMDgnO1xuICAgICAgY29uc3QgZXhwZWN0ZWROb3JtYWxpemVkID0gJzB4Y2JhNGE0OGJiMGY4YjU4NmMxNjdlNWRjZWZhYTFjNWU5NmFiM2YwOCc7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMubm9ybWFsaXplSGV4SWQoaGV4SWQpLCBleHBlY3RlZE5vcm1hbGl6ZWQpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBoZXhJZCB3aXRoIHByZWZpeCBhbHJlYWR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaGV4SWQgPSAnMHhjYmE0YTQ4YmIwZjhiNTg2YzE2N2U1ZGNlZmFhMWM1ZTk2YWIzZjA4JztcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5ub3JtYWxpemVIZXhJZChoZXhJZCksIGhleElkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsMkRBQTZDO0FBQzdDLGdFQUF3QztBQUN4QyxnREFBd0I7QUFFeEIsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0lBQzNCLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUQsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCx3RUFBd0U7WUFDeEUsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzNELGtFQUFrRTtZQUNsRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFD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RTtnQkFDVixPQUFPLEVBQUUsS0FBSztnQkFDZCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxNQUFNLEVBQUU7b0JBQ04sUUFBUTtvQkFDUixlQUFlLEVBQUUsQ0FBQztvQkFDbEIsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLGFBQWEsRUFBRSxFQUFFO29CQUNqQixxQkFBcUIsRUFBRSxHQUFHO2lCQUMzQjthQUNGLENBQUMsQ0FBQztZQUVMLE1BQU0sV0FBVyxHQUFHLE1BQU0sZUFBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3JFLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxXQUFXLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxXQUFXLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvc3VpJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCBub2NrIGZyb20gJ25vY2snO1xuXG5kZXNjcmliZSgnU3VpIHV0aWwgbGlicmFyeScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2lzVmFsaWRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2YWxpZGF0ZSB2YWxpZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBpbnZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB0ZXN0RGF0YS5hZGRyZXNzZXMuaW52YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRlc3RpbmcgZm9yIG1pc3NpbmcgcGFyYW0sIHNob3VsZCBub3QgdGhyb3cgYW4gZXJyb3JcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZEFkZHJlc3ModW5kZWZpbmVkKSk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRlc3RpbmcgZm9yIG1pc3NpbmcgcGFyYW0sIHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyh1bmRlZmluZWQpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkUmF3VHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZhbGlkYXRlIGEgdmFsaWQgcmF3IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5UUkFOU0ZFUiksIHRydWUpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBhbiBpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLklOVkFMSURfUkFXX1RYKSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLklOVkFMSURfUkFXX1RYKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9ybWFsaXplSGV4SWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIG5vcm1hbGl6ZSBoZXhJZCB3aXRoIG5vIHByZWZpeCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGhleElkID0gJ2NiYTRhNDhiYjBmOGI1ODZjMTY3ZTVkY2VmYWExYzVlOTZhYjNmMDgnO1xuICAgICAgY29uc3QgZXhwZWN0ZWROb3JtYWxpemVkID0gJzB4Y2JhNGE0OGJiMGY4YjU4NmMxNjdlNWRjZWZhYTFjNWU5NmFiM2YwOCc7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMubm9ybWFsaXplSGV4SWQoaGV4SWQpLCBleHBlY3RlZE5vcm1hbGl6ZWQpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBoZXhJZCB3aXRoIHByZWZpeCBhbHJlYWR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaGV4SWQgPSAnMHhjYmE0YTQ4YmIwZjhiNTg2YzE2N2U1ZGNlZmFhMWM1ZTk2YWIzZjA4JztcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5ub3JtYWxpemVIZXhJZChoZXhJZCksIGhleElkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEJhbGFuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgbm9kZVVybCA9ICdodHRwczovL2Z1bGxub2RlLnRlc3RuZXQuc3VpLmlvJztcbiAgICBjb25zdCBvd25lciA9ICcweGI3ZGI2MjM0YTMzZjFlMzVmNzExNGRhYzY5NTc0YzZiN2IxOTNmM2M0YTA4MDFlNWRkYjlmYWU0MDA5YWY2MzcnO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbCBmdW5kcyBpbiBhZGRyZXNzIGJhbGFuY2Ugd2hlbiBmdW5kc0luQWRkcmVzc0JhbGFuY2UgZXF1YWxzIHRvdGFsQmFsYW5jZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFJlYWwgcmVzcG9uc2UgZnJvbSB0ZXN0bmV0OiBhbGwgMiBTVUkgaGVsZCBpbiBhZGRyZXNzIGJhbGFuY2UsIG5vdCBpbiBjb2luIG9iamVjdHNcbiAgICAgIG5vY2sobm9kZVVybClcbiAgICAgICAgLnBvc3QoJy8nKVxuICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgY29pbk9iamVjdENvdW50OiAxLFxuICAgICAgICAgICAgdG90YWxCYWxhbmNlOiAnMjAwMDAwMCcsXG4gICAgICAgICAgICBsb2NrZWRCYWxhbmNlOiB7fSxcbiAgICAgICAgICAgIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZTogJzIwMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBiYWxhbmNlSW5mbyA9IGF3YWl0IHV0aWxzLmdldEJhbGFuY2Uobm9kZVVybCwgb3duZXIpO1xuICAgICAgYmFsYW5jZUluZm8udG90YWxCYWxhbmNlLnNob3VsZC5lcXVhbCgnMjAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uZnVuZHNJbkFkZHJlc3NCYWxhbmNlLnNob3VsZC5lcXVhbCgnMjAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uY29pbk9iamVjdEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBzcGxpdCB0b3RhbEJhbGFuY2UgaW50byBjb2luT2JqZWN0QmFsYW5jZSBhbmQgZnVuZHNJbkFkZHJlc3NCYWxhbmNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9jayhub2RlVXJsKVxuICAgICAgICAucG9zdCgnLycpXG4gICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBjb2luT2JqZWN0Q291bnQ6IDIsXG4gICAgICAgICAgICB0b3RhbEJhbGFuY2U6ICcxOTAwMDAwMDAwJyxcbiAgICAgICAgICAgIGxvY2tlZEJhbGFuY2U6IHt9LFxuICAgICAgICAgICAgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnOTAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgYmFsYW5jZUluZm8gPSBhd2FpdCB1dGlscy5nZXRCYWxhbmNlKG5vZGVVcmwsIG93bmVyKTtcbiAgICAgIGJhbGFuY2VJbmZvLnRvdGFsQmFsYW5jZS5zaG91bGQuZXF1YWwoJzE5MDAwMDAwMDAnKTtcbiAgICAgIGJhbGFuY2VJbmZvLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZS5zaG91bGQuZXF1YWwoJzkwMDAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uY29pbk9iamVjdEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcxMDAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBsZWdhY3kgcmVzcG9uc2Ugd2l0aG91dCBmdW5kc0luQWRkcmVzc0JhbGFuY2UgKGFsbCBmdW5kcyBpbiBjb2luIG9iamVjdHMpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9jayhub2RlVXJsKVxuICAgICAgICAucG9zdCgnLycpXG4gICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBjb2luT2JqZWN0Q291bnQ6IDEsXG4gICAgICAgICAgICB0b3RhbEJhbGFuY2U6ICcxOTAwMDAwMDAwJyxcbiAgICAgICAgICAgIGxvY2tlZEJhbGFuY2U6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBiYWxhbmNlSW5mbyA9IGF3YWl0IHV0aWxzLmdldEJhbGFuY2Uobm9kZVVybCwgb3duZXIpO1xuICAgICAgYmFsYW5jZUluZm8udG90YWxCYWxhbmNlLnNob3VsZC5lcXVhbCgnMTkwMDAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uZnVuZHNJbkFkZHJlc3NCYWxhbmNlLnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgYmFsYW5jZUluZm8uY29pbk9iamVjdEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcxOTAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB6ZXJvIGJhbGFuY2VzIGZvciBhbiBlbXB0eSBhY2NvdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9jayhub2RlVXJsKVxuICAgICAgICAucG9zdCgnLycpXG4gICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBjb2luT2JqZWN0Q291bnQ6IDAsXG4gICAgICAgICAgICB0b3RhbEJhbGFuY2U6ICcwJyxcbiAgICAgICAgICAgIGxvY2tlZEJhbGFuY2U6IHt9LFxuICAgICAgICAgICAgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGJhbGFuY2VJbmZvID0gYXdhaXQgdXRpbHMuZ2V0QmFsYW5jZShub2RlVXJsLCBvd25lcik7XG4gICAgICBiYWxhbmNlSW5mby50b3RhbEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBiYWxhbmNlSW5mby5mdW5kc0luQWRkcmVzc0JhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBiYWxhbmNlSW5mby5jb2luT2JqZWN0QmFsYW5jZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcXVlcnkgd2l0aCBhIGN1c3RvbSBjb2luIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSWQgPSAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4JztcbiAgICAgIGNvbnN0IGNvaW5UeXBlID0gYCR7cGFja2FnZUlkfTo6ZGVlcDo6REVFUGA7XG5cbiAgICAgIG5vY2sobm9kZVVybClcbiAgICAgICAgLnBvc3QoJy8nLCAoYm9keSkgPT4gYm9keS5wYXJhbXNbMV0gPT09IGNvaW5UeXBlKVxuICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICBjb2luVHlwZSxcbiAgICAgICAgICAgIGNvaW5PYmplY3RDb3VudDogMSxcbiAgICAgICAgICAgIHRvdGFsQmFsYW5jZTogJzEwMDAnLFxuICAgICAgICAgICAgbG9ja2VkQmFsYW5jZToge30sXG4gICAgICAgICAgICBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgYmFsYW5jZUluZm8gPSBhd2FpdCB1dGlscy5nZXRCYWxhbmNlKG5vZGVVcmwsIG93bmVyLCBjb2luVHlwZSk7XG4gICAgICBiYWxhbmNlSW5mby50b3RhbEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcxMDAwJyk7XG4gICAgICBiYWxhbmNlSW5mby5mdW5kc0luQWRkcmVzc0JhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBiYWxhbmNlSW5mby5jb2luT2JqZWN0QmFsYW5jZS5zaG91bGQuZXF1YWwoJzEwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==