@bitgo/sdk-coin-canton 1.29.7 → 1.30.1
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.
- package/dist/src/register.d.ts +2 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +15 -2
- package/dist/test/unit/register.d.ts +2 -0
- package/dist/test/unit/register.d.ts.map +1 -0
- package/dist/test/unit/register.js +65 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
package/dist/src/register.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import { BitGoBase } from '@bitgo/sdk-core';
|
|
2
|
+
import { type CoinMap } from '@bitgo/statics';
|
|
2
3
|
export declare const register: (sdk: BitGoBase) => void;
|
|
4
|
+
export declare const registerWithCoinMap: (sdk: BitGoBase, coinMap: CoinMap) => void;
|
|
3
5
|
//# sourceMappingURL=register.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,KAAK,OAAO,EAA4B,MAAM,gBAAgB,CAAC;AAKxE,eAAO,MAAM,QAAQ,QAAS,SAAS,KAAG,IAMzC,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAS,SAAS,WAAW,OAAO,KAAG,IAStE,CAAC"}
|
package/dist/src/register.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.register = void 0;
|
|
3
|
+
exports.registerWithCoinMap = exports.register = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
5
|
+
const statics_1 = require("@bitgo/statics");
|
|
4
6
|
const canton_1 = require("./canton");
|
|
5
7
|
const tcanton_1 = require("./tcanton");
|
|
6
8
|
const cantonToken_1 = require("./cantonToken");
|
|
@@ -12,4 +14,15 @@ const register = (sdk) => {
|
|
|
12
14
|
});
|
|
13
15
|
};
|
|
14
16
|
exports.register = register;
|
|
15
|
-
|
|
17
|
+
const registerWithCoinMap = (sdk, coinMap) => {
|
|
18
|
+
sdk.register('canton', canton_1.Canton.createInstance);
|
|
19
|
+
sdk.register('tcanton', tcanton_1.Tcanton.createInstance);
|
|
20
|
+
// Registration for Canton tokens from the coin map (includes both hardcoded and dynamic tokens from AMS).
|
|
21
|
+
cantonToken_1.CantonToken.createTokenConstructors((0, statics_1.getFormattedCantonTokens)(coinMap)).forEach(({ name, coinConstructor }) => {
|
|
22
|
+
sdk.register(name, coinConstructor);
|
|
23
|
+
// name is derived from coinMap itself (via getFormattedCantonTokens), so it is always present.
|
|
24
|
+
sdk_core_1.GlobalCoinFactory.registerToken(coinMap.get(name), coinConstructor);
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
exports.registerWithCoinMap = registerWithCoinMap;
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOENBQStEO0FBQy9ELDRDQUF3RTtBQUN4RSxxQ0FBa0M7QUFDbEMsdUNBQW9DO0FBQ3BDLCtDQUE0QztBQUVyQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWMsRUFBUSxFQUFFO0lBQy9DLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGVBQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxpQkFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2hELHlCQUFXLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFO1FBQzFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBTlcsUUFBQSxRQUFRLFlBTW5CO0FBRUssTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEdBQWMsRUFBRSxPQUFnQixFQUFRLEVBQUU7SUFDNUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsZUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLGlCQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDaEQsMEdBQTBHO0lBQzFHLHlCQUFXLENBQUMsdUJBQXVCLENBQUMsSUFBQSxrQ0FBd0IsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUU7UUFDM0csR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDcEMsK0ZBQStGO1FBQy9GLDRCQUFpQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBVFcsUUFBQSxtQkFBbUIsdUJBUzlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQml0R29CYXNlLCBHbG9iYWxDb2luRmFjdG9yeSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyB0eXBlIENvaW5NYXAsIGdldEZvcm1hdHRlZENhbnRvblRva2VucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IENhbnRvbiB9IGZyb20gJy4vY2FudG9uJztcbmltcG9ydCB7IFRjYW50b24gfSBmcm9tICcuL3RjYW50b24nO1xuaW1wb3J0IHsgQ2FudG9uVG9rZW4gfSBmcm9tICcuL2NhbnRvblRva2VuJztcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyID0gKHNkazogQml0R29CYXNlKTogdm9pZCA9PiB7XG4gIHNkay5yZWdpc3RlcignY2FudG9uJywgQ2FudG9uLmNyZWF0ZUluc3RhbmNlKTtcbiAgc2RrLnJlZ2lzdGVyKCd0Y2FudG9uJywgVGNhbnRvbi5jcmVhdGVJbnN0YW5jZSk7XG4gIENhbnRvblRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3JzKCkuZm9yRWFjaCgoeyBuYW1lLCBjb2luQ29uc3RydWN0b3IgfSkgPT4ge1xuICAgIHNkay5yZWdpc3RlcihuYW1lLCBjb2luQ29uc3RydWN0b3IpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlcldpdGhDb2luTWFwID0gKHNkazogQml0R29CYXNlLCBjb2luTWFwOiBDb2luTWFwKTogdm9pZCA9PiB7XG4gIHNkay5yZWdpc3RlcignY2FudG9uJywgQ2FudG9uLmNyZWF0ZUluc3RhbmNlKTtcbiAgc2RrLnJlZ2lzdGVyKCd0Y2FudG9uJywgVGNhbnRvbi5jcmVhdGVJbnN0YW5jZSk7XG4gIC8vIFJlZ2lzdHJhdGlvbiBmb3IgQ2FudG9uIHRva2VucyBmcm9tIHRoZSBjb2luIG1hcCAoaW5jbHVkZXMgYm90aCBoYXJkY29kZWQgYW5kIGR5bmFtaWMgdG9rZW5zIGZyb20gQU1TKS5cbiAgQ2FudG9uVG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoZ2V0Rm9ybWF0dGVkQ2FudG9uVG9rZW5zKGNvaW5NYXApKS5mb3JFYWNoKCh7IG5hbWUsIGNvaW5Db25zdHJ1Y3RvciB9KSA9PiB7XG4gICAgc2RrLnJlZ2lzdGVyKG5hbWUsIGNvaW5Db25zdHJ1Y3Rvcik7XG4gICAgLy8gbmFtZSBpcyBkZXJpdmVkIGZyb20gY29pbk1hcCBpdHNlbGYgKHZpYSBnZXRGb3JtYXR0ZWRDYW50b25Ub2tlbnMpLCBzbyBpdCBpcyBhbHdheXMgcHJlc2VudC5cbiAgICBHbG9iYWxDb2luRmFjdG9yeS5yZWdpc3RlclRva2VuKGNvaW5NYXAuZ2V0KG5hbWUpLCBjb2luQ29uc3RydWN0b3IpO1xuICB9KTtcbn07XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../test/unit/register.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
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 sinon_1 = __importDefault(require("sinon"));
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const sdk_api_1 = require("@bitgo/sdk-api");
|
|
9
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
10
|
+
const statics_1 = require("@bitgo/statics");
|
|
11
|
+
const register_1 = require("../../src/register");
|
|
12
|
+
const cantonToken_1 = require("../../src/cantonToken");
|
|
13
|
+
describe('Canton Register', function () {
|
|
14
|
+
let bitgo;
|
|
15
|
+
let registerSpy;
|
|
16
|
+
let registerTokenSpy;
|
|
17
|
+
beforeEach(function () {
|
|
18
|
+
bitgo = new sdk_api_1.BitGoAPI({ env: 'test' });
|
|
19
|
+
registerSpy = sinon_1.default.spy(bitgo, 'register');
|
|
20
|
+
registerTokenSpy = sinon_1.default.spy(sdk_core_1.GlobalCoinFactory, 'registerToken');
|
|
21
|
+
});
|
|
22
|
+
afterEach(function () {
|
|
23
|
+
registerSpy.restore();
|
|
24
|
+
registerTokenSpy.restore();
|
|
25
|
+
});
|
|
26
|
+
describe('register', function () {
|
|
27
|
+
it('should register base coins and token constructors', function () {
|
|
28
|
+
(0, register_1.register)(bitgo);
|
|
29
|
+
const registeredNames = registerSpy.getCalls().map((call) => call.args[0]);
|
|
30
|
+
// Base coins should be registered
|
|
31
|
+
assert_1.default.ok(registeredNames.includes('canton'));
|
|
32
|
+
assert_1.default.ok(registeredNames.includes('tcanton'));
|
|
33
|
+
// Canton tokens from statics should be registered
|
|
34
|
+
const cantonTokenCount = cantonToken_1.CantonToken.createTokenConstructors().length;
|
|
35
|
+
assert_1.default.strictEqual(registerSpy.callCount, 2 + cantonTokenCount);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('registerWithCoinMap', function () {
|
|
39
|
+
it('should call register internally for base coins and tokens', function () {
|
|
40
|
+
(0, register_1.registerWithCoinMap)(bitgo, statics_1.coins);
|
|
41
|
+
const registeredNames = registerSpy.getCalls().map((call) => call.args[0]);
|
|
42
|
+
// Base coins should be registered
|
|
43
|
+
assert_1.default.ok(registeredNames.includes('canton'));
|
|
44
|
+
assert_1.default.ok(registeredNames.includes('tcanton'));
|
|
45
|
+
});
|
|
46
|
+
it('should add dynamic Canton tokens to the global coin map', function () {
|
|
47
|
+
(0, register_1.registerWithCoinMap)(bitgo, statics_1.coins);
|
|
48
|
+
// registerToken should have been called for Canton tokens in the coin map
|
|
49
|
+
assert_1.default.ok(registerTokenSpy.callCount > 0);
|
|
50
|
+
// Each call should pass a valid coin from the coinMap
|
|
51
|
+
for (let i = 0; i < registerTokenSpy.callCount; i++) {
|
|
52
|
+
const call = registerTokenSpy.getCall(i);
|
|
53
|
+
const staticsCoin = call.args[0];
|
|
54
|
+
assert_1.default.ok(statics_1.coins.has(staticsCoin.name), `${staticsCoin.name} should exist in the coin map`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
it('should not add tokens to the global coin map when coin map has no Canton tokens', function () {
|
|
58
|
+
const limitedCoinMap = statics_1.coins.filter((coin) => !(coin instanceof statics_1.CantonToken));
|
|
59
|
+
(0, register_1.registerWithCoinMap)(bitgo, limitedCoinMap);
|
|
60
|
+
// registerToken should not be called since no Canton tokens are in the map
|
|
61
|
+
assert_1.default.strictEqual(registerTokenSpy.callCount, 0);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsb0RBQTRCO0FBQzVCLDRDQUEwQztBQUMxQyw4Q0FBb0Q7QUFDcEQsNENBQW9EO0FBQ3BELGlEQUFtRTtBQUNuRSx1REFBc0U7QUFFdEUsUUFBUSxDQUFDLGlCQUFpQixFQUFFO0lBQzFCLElBQUksS0FBZSxDQUFDO0lBQ3BCLElBQUksV0FBMkIsQ0FBQztJQUNoQyxJQUFJLGdCQUFnQyxDQUFDO0lBRXJDLFVBQVUsQ0FBQztRQUNULEtBQUssR0FBRyxJQUFJLGtCQUFRLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0QyxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDM0MsZ0JBQWdCLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyw0QkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQztRQUNSLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0QixnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxVQUFVLEVBQUU7UUFDbkIsRUFBRSxDQUFDLG1EQUFtRCxFQUFFO1lBQ3RELElBQUEsbUJBQVEsRUFBQyxLQUFLLENBQUMsQ0FBQztZQUVoQixNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFM0Usa0NBQWtDO1lBQ2xDLGdCQUFNLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM5QyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFFL0Msa0RBQWtEO1lBQ2xELE1BQU0sZ0JBQWdCLEdBQUcseUJBQWMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN6RSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDOUIsRUFBRSxDQUFDLDJEQUEyRCxFQUFFO1lBQzlELElBQUEsOEJBQW1CLEVBQUMsS0FBSyxFQUFFLGVBQUssQ0FBQyxDQUFDO1lBRWxDLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUzRSxrQ0FBa0M7WUFDbEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzlDLGdCQUFNLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5REFBeUQsRUFBRTtZQUM1RCxJQUFBLDhCQUFtQixFQUFDLEtBQUssRUFBRSxlQUFLLENBQUMsQ0FBQztZQUVsQywwRUFBMEU7WUFDMUUsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRTFDLHNEQUFzRDtZQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSwrQkFBK0IsQ0FBQyxDQUFDO1lBQzdGLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpRkFBaUYsRUFBRTtZQUNwRixNQUFNLGNBQWMsR0FBRyxlQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLHFCQUFXLENBQUMsQ0FBQyxDQUFDO1lBRTlFLElBQUEsOEJBQW1CLEVBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBRTNDLDJFQUEyRTtZQUMzRSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuaW1wb3J0IHsgR2xvYmFsQ29pbkZhY3RvcnkgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIENhbnRvblRva2VuIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgcmVnaXN0ZXIsIHJlZ2lzdGVyV2l0aENvaW5NYXAgfSBmcm9tICcuLi8uLi9zcmMvcmVnaXN0ZXInO1xuaW1wb3J0IHsgQ2FudG9uVG9rZW4gYXMgU2RrQ2FudG9uVG9rZW4gfSBmcm9tICcuLi8uLi9zcmMvY2FudG9uVG9rZW4nO1xuXG5kZXNjcmliZSgnQ2FudG9uIFJlZ2lzdGVyJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IEJpdEdvQVBJO1xuICBsZXQgcmVnaXN0ZXJTcHk6IHNpbm9uLlNpbm9uU3B5O1xuICBsZXQgcmVnaXN0ZXJUb2tlblNweTogc2lub24uU2lub25TcHk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBuZXcgQml0R29BUEkoeyBlbnY6ICd0ZXN0JyB9KTtcbiAgICByZWdpc3RlclNweSA9IHNpbm9uLnNweShiaXRnbywgJ3JlZ2lzdGVyJyk7XG4gICAgcmVnaXN0ZXJUb2tlblNweSA9IHNpbm9uLnNweShHbG9iYWxDb2luRmFjdG9yeSwgJ3JlZ2lzdGVyVG9rZW4nKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICByZWdpc3RlclNweS5yZXN0b3JlKCk7XG4gICAgcmVnaXN0ZXJUb2tlblNweS5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWdpc3RlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlZ2lzdGVyIGJhc2UgY29pbnMgYW5kIHRva2VuIGNvbnN0cnVjdG9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZ2lzdGVyKGJpdGdvKTtcblxuICAgICAgY29uc3QgcmVnaXN0ZXJlZE5hbWVzID0gcmVnaXN0ZXJTcHkuZ2V0Q2FsbHMoKS5tYXAoKGNhbGwpID0+IGNhbGwuYXJnc1swXSk7XG5cbiAgICAgIC8vIEJhc2UgY29pbnMgc2hvdWxkIGJlIHJlZ2lzdGVyZWRcbiAgICAgIGFzc2VydC5vayhyZWdpc3RlcmVkTmFtZXMuaW5jbHVkZXMoJ2NhbnRvbicpKTtcbiAgICAgIGFzc2VydC5vayhyZWdpc3RlcmVkTmFtZXMuaW5jbHVkZXMoJ3RjYW50b24nKSk7XG5cbiAgICAgIC8vIENhbnRvbiB0b2tlbnMgZnJvbSBzdGF0aWNzIHNob3VsZCBiZSByZWdpc3RlcmVkXG4gICAgICBjb25zdCBjYW50b25Ub2tlbkNvdW50ID0gU2RrQ2FudG9uVG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoKS5sZW5ndGg7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVnaXN0ZXJTcHkuY2FsbENvdW50LCAyICsgY2FudG9uVG9rZW5Db3VudCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWdpc3RlcldpdGhDb2luTWFwJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY2FsbCByZWdpc3RlciBpbnRlcm5hbGx5IGZvciBiYXNlIGNvaW5zIGFuZCB0b2tlbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZWdpc3RlcldpdGhDb2luTWFwKGJpdGdvLCBjb2lucyk7XG5cbiAgICAgIGNvbnN0IHJlZ2lzdGVyZWROYW1lcyA9IHJlZ2lzdGVyU3B5LmdldENhbGxzKCkubWFwKChjYWxsKSA9PiBjYWxsLmFyZ3NbMF0pO1xuXG4gICAgICAvLyBCYXNlIGNvaW5zIHNob3VsZCBiZSByZWdpc3RlcmVkXG4gICAgICBhc3NlcnQub2socmVnaXN0ZXJlZE5hbWVzLmluY2x1ZGVzKCdjYW50b24nKSk7XG4gICAgICBhc3NlcnQub2socmVnaXN0ZXJlZE5hbWVzLmluY2x1ZGVzKCd0Y2FudG9uJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgZHluYW1pYyBDYW50b24gdG9rZW5zIHRvIHRoZSBnbG9iYWwgY29pbiBtYXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZWdpc3RlcldpdGhDb2luTWFwKGJpdGdvLCBjb2lucyk7XG5cbiAgICAgIC8vIHJlZ2lzdGVyVG9rZW4gc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQgZm9yIENhbnRvbiB0b2tlbnMgaW4gdGhlIGNvaW4gbWFwXG4gICAgICBhc3NlcnQub2socmVnaXN0ZXJUb2tlblNweS5jYWxsQ291bnQgPiAwKTtcblxuICAgICAgLy8gRWFjaCBjYWxsIHNob3VsZCBwYXNzIGEgdmFsaWQgY29pbiBmcm9tIHRoZSBjb2luTWFwXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZ2lzdGVyVG9rZW5TcHkuY2FsbENvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgY2FsbCA9IHJlZ2lzdGVyVG9rZW5TcHkuZ2V0Q2FsbChpKTtcbiAgICAgICAgY29uc3Qgc3RhdGljc0NvaW4gPSBjYWxsLmFyZ3NbMF07XG4gICAgICAgIGFzc2VydC5vayhjb2lucy5oYXMoc3RhdGljc0NvaW4ubmFtZSksIGAke3N0YXRpY3NDb2luLm5hbWV9IHNob3VsZCBleGlzdCBpbiB0aGUgY29pbiBtYXBgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGFkZCB0b2tlbnMgdG8gdGhlIGdsb2JhbCBjb2luIG1hcCB3aGVuIGNvaW4gbWFwIGhhcyBubyBDYW50b24gdG9rZW5zJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGltaXRlZENvaW5NYXAgPSBjb2lucy5maWx0ZXIoKGNvaW4pID0+ICEoY29pbiBpbnN0YW5jZW9mIENhbnRvblRva2VuKSk7XG5cbiAgICAgIHJlZ2lzdGVyV2l0aENvaW5NYXAoYml0Z28sIGxpbWl0ZWRDb2luTWFwKTtcblxuICAgICAgLy8gcmVnaXN0ZXJUb2tlbiBzaG91bGQgbm90IGJlIGNhbGxlZCBzaW5jZSBubyBDYW50b24gdG9rZW5zIGFyZSBpbiB0aGUgbWFwXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVnaXN0ZXJUb2tlblNweS5jYWxsQ291bnQsIDApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|