@bitgo-beta/sdk-api 1.10.1-beta.1597 → 1.10.1-beta.1599
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/package.json +7 -7
- package/dist/src/api.d.ts +4 -2
- package/dist/src/api.d.ts.map +1 -1
- package/dist/src/api.js +50 -17
- package/dist/src/bitgoAPI.d.ts +9 -0
- package/dist/src/bitgoAPI.d.ts.map +1 -1
- package/dist/src/bitgoAPI.js +69 -1
- package/dist/test/unit/api.js +150 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
package/dist/test/unit/api.js
CHANGED
|
@@ -36,6 +36,155 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
const assert = __importStar(require("assert"));
|
|
37
37
|
const src_1 = require("../../src");
|
|
38
38
|
describe('bitgo:api unit tests', function () {
|
|
39
|
+
describe('serializeRequestData', function () {
|
|
40
|
+
it('should return string data as-is for v4 raw body support', function () {
|
|
41
|
+
const stringBody = '{"address": "tb1qtest", "amount":100000}';
|
|
42
|
+
const mockReq = {
|
|
43
|
+
_data: stringBody,
|
|
44
|
+
get: () => 'application/json',
|
|
45
|
+
};
|
|
46
|
+
const result = (0, src_1.serializeRequestData)(mockReq);
|
|
47
|
+
assert.strictEqual(result, stringBody);
|
|
48
|
+
// Verify _data was not modified
|
|
49
|
+
assert.strictEqual(mockReq._data, stringBody);
|
|
50
|
+
});
|
|
51
|
+
it('should return empty string as-is', function () {
|
|
52
|
+
const mockReq = {
|
|
53
|
+
_data: '',
|
|
54
|
+
get: () => 'application/json',
|
|
55
|
+
};
|
|
56
|
+
const result = (0, src_1.serializeRequestData)(mockReq);
|
|
57
|
+
assert.strictEqual(result, '');
|
|
58
|
+
});
|
|
59
|
+
it('should convert Buffer to UTF-8 string and mutate _data', function () {
|
|
60
|
+
const jsonString = '{"address":"tb1qtest","amount":100000}';
|
|
61
|
+
const bufferBody = Buffer.from(jsonString, 'utf8');
|
|
62
|
+
const mockReq = {
|
|
63
|
+
_data: bufferBody,
|
|
64
|
+
get: () => 'application/json',
|
|
65
|
+
};
|
|
66
|
+
const result = (0, src_1.serializeRequestData)(mockReq);
|
|
67
|
+
assert.strictEqual(typeof result, 'string');
|
|
68
|
+
assert.strictEqual(result, jsonString);
|
|
69
|
+
// Verify _data WAS mutated to string - critical for superagent to send correct bytes
|
|
70
|
+
assert.strictEqual(typeof mockReq._data, 'string');
|
|
71
|
+
assert.strictEqual(mockReq._data, jsonString);
|
|
72
|
+
});
|
|
73
|
+
it('should convert empty Buffer to empty string and mutate _data', function () {
|
|
74
|
+
const mockReq = {
|
|
75
|
+
_data: Buffer.from(''),
|
|
76
|
+
get: () => 'application/json',
|
|
77
|
+
};
|
|
78
|
+
const result = (0, src_1.serializeRequestData)(mockReq);
|
|
79
|
+
assert.strictEqual(typeof result, 'string');
|
|
80
|
+
assert.strictEqual(result, '');
|
|
81
|
+
// Verify _data WAS mutated to string
|
|
82
|
+
assert.strictEqual(typeof mockReq._data, 'string');
|
|
83
|
+
assert.strictEqual(mockReq._data, '');
|
|
84
|
+
});
|
|
85
|
+
it('should produce identical results on retry for HMAC consistency', function () {
|
|
86
|
+
const jsonString = '{"address":"tb1qtest","amount":100000}';
|
|
87
|
+
const bufferBody = Buffer.from(jsonString, 'utf8');
|
|
88
|
+
const mockReq = {
|
|
89
|
+
_data: bufferBody,
|
|
90
|
+
get: () => 'application/json',
|
|
91
|
+
};
|
|
92
|
+
// First call (original request) - converts Buffer to string, mutates _data
|
|
93
|
+
const result1 = (0, src_1.serializeRequestData)(mockReq);
|
|
94
|
+
assert.strictEqual(result1, jsonString);
|
|
95
|
+
assert.strictEqual(typeof mockReq._data, 'string');
|
|
96
|
+
// Second call (simulating retry) - _data is now a string, returns as-is
|
|
97
|
+
const result2 = (0, src_1.serializeRequestData)(mockReq);
|
|
98
|
+
// Both calls should return identical strings for consistent HMAC
|
|
99
|
+
assert.strictEqual(result1, result2);
|
|
100
|
+
assert.strictEqual(result2, jsonString);
|
|
101
|
+
// _data should now be a string (mutated on first call)
|
|
102
|
+
assert.strictEqual(typeof mockReq._data, 'string');
|
|
103
|
+
assert.strictEqual(mockReq._data, jsonString);
|
|
104
|
+
});
|
|
105
|
+
it('should mutate Buffer to prevent superagent JSON serialization', function () {
|
|
106
|
+
// This test verifies the critical behavior: if we don't mutate _data from Buffer to string,
|
|
107
|
+
// superagent will serialize the Buffer as {"type":"Buffer","data":[...]}, which won't match
|
|
108
|
+
// the HMAC calculated on the UTF-8 string. By mutating _data, we ensure superagent sends
|
|
109
|
+
// the exact bytes we used for HMAC calculation.
|
|
110
|
+
const jsonString = '{"address":"tb1qtest","amount":100000}';
|
|
111
|
+
const bufferBody = Buffer.from(jsonString, 'utf8');
|
|
112
|
+
const mockReq = {
|
|
113
|
+
_data: bufferBody,
|
|
114
|
+
get: () => 'application/json',
|
|
115
|
+
};
|
|
116
|
+
(0, src_1.serializeRequestData)(mockReq);
|
|
117
|
+
// After serialization, _data MUST be a string, not a Buffer
|
|
118
|
+
assert.strictEqual(typeof mockReq._data, 'string');
|
|
119
|
+
assert.strictEqual(mockReq._data, jsonString);
|
|
120
|
+
// This ensures when superagent sends the request, it sends the UTF-8 string,
|
|
121
|
+
// not the JSON-serialized Buffer representation.
|
|
122
|
+
});
|
|
123
|
+
it('should serialize object data to JSON', function () {
|
|
124
|
+
const objectBody = { address: 'tb1qtest', amount: 100000 };
|
|
125
|
+
const mockReq = {
|
|
126
|
+
_data: objectBody,
|
|
127
|
+
get: () => 'application/json',
|
|
128
|
+
};
|
|
129
|
+
const result = (0, src_1.serializeRequestData)(mockReq);
|
|
130
|
+
assert.strictEqual(result, JSON.stringify(objectBody));
|
|
131
|
+
// Verify _data was updated to serialized form
|
|
132
|
+
assert.strictEqual(mockReq._data, JSON.stringify(objectBody));
|
|
133
|
+
});
|
|
134
|
+
it('should handle nested objects', function () {
|
|
135
|
+
const nestedBody = { level1: { level2: { value: 'deep' } } };
|
|
136
|
+
const mockReq = {
|
|
137
|
+
_data: nestedBody,
|
|
138
|
+
get: () => 'application/json',
|
|
139
|
+
};
|
|
140
|
+
const result = (0, src_1.serializeRequestData)(mockReq);
|
|
141
|
+
assert.strictEqual(result, JSON.stringify(nestedBody));
|
|
142
|
+
});
|
|
143
|
+
it('should return undefined for undefined data', function () {
|
|
144
|
+
const mockReq = {
|
|
145
|
+
_data: undefined,
|
|
146
|
+
get: () => 'application/json',
|
|
147
|
+
};
|
|
148
|
+
const result = (0, src_1.serializeRequestData)(mockReq);
|
|
149
|
+
assert.strictEqual(result, undefined);
|
|
150
|
+
});
|
|
151
|
+
it('should return undefined for null data', function () {
|
|
152
|
+
const mockReq = {
|
|
153
|
+
_data: null,
|
|
154
|
+
get: () => 'application/json',
|
|
155
|
+
};
|
|
156
|
+
const result = (0, src_1.serializeRequestData)(mockReq);
|
|
157
|
+
assert.strictEqual(result, undefined);
|
|
158
|
+
});
|
|
159
|
+
it('should handle Content-Type with charset', function () {
|
|
160
|
+
const objectBody = { test: 'value' };
|
|
161
|
+
const mockReq = {
|
|
162
|
+
_data: objectBody,
|
|
163
|
+
get: () => 'application/json; charset=utf-8',
|
|
164
|
+
};
|
|
165
|
+
const result = (0, src_1.serializeRequestData)(mockReq);
|
|
166
|
+
assert.strictEqual(result, JSON.stringify(objectBody));
|
|
167
|
+
});
|
|
168
|
+
it('should handle application/vnd.api+json content type', function () {
|
|
169
|
+
const objectBody = { data: 'test' };
|
|
170
|
+
const mockReq = {
|
|
171
|
+
_data: objectBody,
|
|
172
|
+
get: () => 'application/vnd.api+json',
|
|
173
|
+
};
|
|
174
|
+
const result = (0, src_1.serializeRequestData)(mockReq);
|
|
175
|
+
assert.strictEqual(result, JSON.stringify(objectBody));
|
|
176
|
+
});
|
|
177
|
+
it('should return undefined for unsupported content type without serializer', function () {
|
|
178
|
+
const objectBody = { test: 'value' };
|
|
179
|
+
const mockReq = {
|
|
180
|
+
_data: objectBody,
|
|
181
|
+
get: () => 'text/plain',
|
|
182
|
+
};
|
|
183
|
+
const result = (0, src_1.serializeRequestData)(mockReq);
|
|
184
|
+
// text/plain doesn't have a JSON serializer, so returns undefined
|
|
185
|
+
assert.strictEqual(result, undefined);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
39
188
|
describe('handleResponseResult', function () {
|
|
40
189
|
it('should return text for text-based responses', function () {
|
|
41
190
|
const csvText = `transactionId,date,amount,currency,status
|
|
@@ -155,4 +304,4 @@ describe('bitgo:api unit tests', function () {
|
|
|
155
304
|
});
|
|
156
305
|
});
|
|
157
306
|
});
|
|
158
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyxtQ0FBc0U7QUFFdEUsUUFBUSxDQUFDLHNCQUFzQixFQUFFO0lBQy9CLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtRQUMvQixFQUFFLENBQUMsNkNBQTZDLEVBQUU7WUFDaEQsTUFBTSxPQUFPLEdBQUc7Ozs7NkNBSXVCLENBQUM7WUFFeEMsTUFBTSxRQUFRLEdBQVE7Z0JBQ3BCLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUU7Z0JBQ3RDLElBQUksRUFBRSxPQUFPO2FBQ2QsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLElBQUEsMEJBQW9CLEdBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0ZBQWdGLEVBQUU7WUFDbkYsTUFBTSxRQUFRLEdBQVE7Z0JBQ3BCLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtnQkFDOUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO2FBQy9CLENBQUM7WUFFRixNQUFNLE1BQU0sR0FBRyxJQUFBLDBCQUFvQixHQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVFQUF1RSxFQUFFO1lBQzFF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QUc7YUFDWixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTtZQUN0QyxNQUFNLGFBQWEsR0FBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3ZDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ25FLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSx5QkFBbUIsRUFBQyxhQUFhLENBQUMsRUFBRTtnQkFDdEQsSUFBSSxFQUFFLGtCQUFrQjtnQkFDeEIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLFFBQVEsRUFBRSxJQUFJO2dCQUNkLE1BQU0sRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUk7Z0JBQ25DLE1BQU0sRUFBRSxHQUFHO2FBQ1osQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBoYW5kbGVSZXNwb25zZUVycm9yLCBoYW5kbGVSZXNwb25zZVJlc3VsdCB9IGZyb20gJy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdiaXRnbzphcGkgdW5pdCB0ZXN0cycsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2hhbmRsZVJlc3BvbnNlUmVzdWx0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRleHQgZm9yIHRleHQtYmFzZWQgcmVzcG9uc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY3N2VGV4dCA9IGB0cmFuc2FjdGlvbklkLGRhdGUsYW1vdW50LGN1cnJlbmN5LHN0YXR1c1xuICAgICAgICAxMjM0NSwyMDI1LTAxLTE1LDEwMC4wMCxVU0QsY29tcGxldGVkXG4gICAgICAgIDY3ODkwLDIwMjUtMDEtMjIsNTAuNTAsRVVSLGNvbXBsZXRlZFxuICAgICAgICAxMzU3OSwyMDI1LTAyLTEwLDIwMC4wMCxVU0QscGVuZGluZ1xuICAgICAgICAyNDY4MCwyMDI1LTAyLTI4LDc1LjI1LEJUQyxjb21wbGV0ZWRgO1xuXG4gICAgICBjb25zdCByZXNwb25zZTogYW55ID0ge1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgaGVhZGVyOiB7ICdjb250ZW50LXR5cGUnOiAndGV4dC9jc3YnIH0sXG4gICAgICAgIHRleHQ6IGNzdlRleHQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVSZXNwb25zZVJlc3VsdCgpKHJlc3BvbnNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHJlc3BvbnNlLnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBKU09OIHJlc3BvbnNlIGFuZCByZXR1cm4gdGhlIGVudGlyZSBib2R5IGlmIG5vIGZpZWxkIGlzIHNwZWNpZmllZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSB7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBoZWFkZXI6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiB7IGZvbzogJ2JhcicsIGJhejogMTIzIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVSZXNwb25zZVJlc3VsdCgpKHJlc3BvbnNlKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0LCByZXNwb25zZS5ib2R5KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgSlNPTiByZXNwb25zZSBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgZmllbGQgaWYgcHJvdmlkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXNwb25zZTogYW55ID0ge1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgaGVhZGVyOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogeyBmb286ICdiYXInLCBiYXo6IDEyMyB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlUmVzcG9uc2VSZXN1bHQoJ2ZvbycpKHJlc3BvbnNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsICdiYXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBlbnRpcmUgcmVzcG9uc2UgZm9yIG5vbi1KU09OIGFuZCBub24tdGV4dCByZXNwb25zZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXNwb25zZTogYW55ID0ge1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgaGVhZGVyOiB7ICdjb250ZW50LXR5cGUnOiAnaW1hZ2UvcG5nJyB9LFxuICAgICAgICBibG9iOiAnYWJjZGVmZ2hpamsnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlUmVzcG9uc2VSZXN1bHQoKShyZXNwb25zZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCByZXNwb25zZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgZnVsbCBib2R5IGlmIHRoaXMgZmllbGQgZXhpc3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIGhlYWRlcjogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSxcbiAgICAgICAgYm9keTogeyBpcnJlbGV2YW50OiB0cnVlIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVSZXNwb25zZVJlc3VsdCgpKHJlc3BvbnNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHJlc3BvbnNlLmJvZHkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaGFuZGxlUmVzcG9uc2VFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlLXRocm93IGFuIGVycm9yIHdpdGhvdXQgcmVzcG9uc2UgcHJvcGVydHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9yID0gbmV3IEVycm9yKCdIYW4gc2hvdCBmaXJzdCcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yKG9yaWdpbmFsRXJyb3IpLCB7IG5hbWU6ICdFcnJvcicsIG1lc3NhZ2U6ICdIYW4gc2hvdCBmaXJzdCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgc3RhdHVzIGNvZGUgaWYgdGhlIHJlc3BvbnNlIGhhcyBubyBlcnJvciB0ZXh0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFcnJvcjogYW55ID0gbmV3IEVycm9yKCk7XG4gICAgICBvcmlnaW5hbEVycm9yLnJlc3BvbnNlID0geyBzdGF0dXM6IDQwMCB9O1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yKG9yaWdpbmFsRXJyb3IpLCB7XG4gICAgICAgIG5hbWU6ICdBcGlSZXNwb25zZUVycm9yJyxcbiAgICAgICAgbWVzc2FnZTogJzQwMCcsXG4gICAgICAgIGludmFsaWRUb2tlbjogZmFsc2UsXG4gICAgICAgIG5lZWRzT1RQOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgcmVzcG9uc2UgYm9keS5lcnJvciB0ZXh0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFcnJvcjogYW55ID0gbmV3IEVycm9yKCk7XG4gICAgICBvcmlnaW5hbEVycm9yLnJlc3BvbnNlID0geyBzdGF0dXM6IDQwMCwgYm9keTogeyBlcnJvcjogJ0hhbiBzaG90IGZpcnN0JyB9IH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHtcbiAgICAgICAgbmFtZTogJ0FwaVJlc3BvbnNlRXJyb3InLFxuICAgICAgICBtZXNzYWdlOiAnSGFuIHNob3QgZmlyc3QnLFxuICAgICAgICBpbnZhbGlkVG9rZW46IGZhbHNlLFxuICAgICAgICBuZWVkc09UUDogZmFsc2UsXG4gICAgICAgIHJlc3VsdDogb3JpZ2luYWxFcnJvci5yZXNwb25zZS5ib2R5LFxuICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBIVE1MIGNvZGUgZnJvbSB0aGUgcmVzcG9uc2UgdGV4dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3I6IGFueSA9IG5ldyBFcnJvcigpO1xuICAgICAgb3JpZ2luYWxFcnJvci5yZXNwb25zZSA9IHsgc3RhdHVzOiA0MDAsIHRleHQ6ICcgPGI+IEhhbiBzaG90IGZpcnN0IDwvYj4nIH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHtcbiAgICAgICAgbmFtZTogJ0FwaVJlc3BvbnNlRXJyb3InLFxuICAgICAgICBtZXNzYWdlOiAnNDAwXFxuSGFuIHNob3QgZmlyc3QnLFxuICAgICAgICBpbnZhbGlkVG9rZW46IGZhbHNlLFxuICAgICAgICBuZWVkc09UUDogZmFsc2UsXG4gICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbm5vdGF0ZSBpbnZhbGlkVG9rZW4gcHJvcGVydHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9yOiBhbnkgPSBuZXcgRXJyb3IoKTtcbiAgICAgIG9yaWdpbmFsRXJyb3IucmVzcG9uc2UgPSB7IHN0YXR1czogNDAwLCBoZWFkZXI6IHsgJ3gtYXV0aC1yZXF1aXJlZCc6ICd0cnVlJyB9IH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHtcbiAgICAgICAgbmFtZTogJ0FwaVJlc3BvbnNlRXJyb3InLFxuICAgICAgICBtZXNzYWdlOiAnNDAwJyxcbiAgICAgICAgaW52YWxpZFRva2VuOiB0cnVlLFxuICAgICAgICBuZWVkc09UUDogZmFsc2UsXG4gICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbm5vdGF0ZSBuZWVkc09UUCBwcm9wZXJ0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3I6IGFueSA9IG5ldyBFcnJvcigpO1xuICAgICAgb3JpZ2luYWxFcnJvci5yZXNwb25zZSA9IHsgc3RhdHVzOiA0MDAsIGJvZHk6IHsgbmVlZHNPVFA6IHRydWUgfSB9O1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yKG9yaWdpbmFsRXJyb3IpLCB7XG4gICAgICAgIG5hbWU6ICdBcGlSZXNwb25zZUVycm9yJyxcbiAgICAgICAgbWVzc2FnZTogJzQwMCcsXG4gICAgICAgIGludmFsaWRUb2tlbjogZmFsc2UsXG4gICAgICAgIG5lZWRzT1RQOiB0cnVlLFxuICAgICAgICByZXN1bHQ6IG9yaWdpbmFsRXJyb3IucmVzcG9uc2UuYm9keSxcbiAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyxtQ0FBNEY7QUFFNUYsUUFBUSxDQUFDLHNCQUFzQixFQUFFO0lBQy9CLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtRQUMvQixFQUFFLENBQUMseURBQXlELEVBQUU7WUFDNUQsTUFBTSxVQUFVLEdBQUcsNkNBQTZDLENBQUM7WUFDakUsTUFBTSxPQUFPLEdBQVE7Z0JBQ25CLEtBQUssRUFBRSxVQUFVO2dCQUNqQixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsa0JBQWtCO2FBQzlCLENBQUM7WUFFRixNQUFNLE1BQU0sR0FBRyxJQUFBLDBCQUFvQixFQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZDLGdDQUFnQztZQUNoQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUU7WUFDckMsTUFBTSxPQUFPLEdBQVE7Z0JBQ25CLEtBQUssRUFBRSxFQUFFO2dCQUNULEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxrQkFBa0I7YUFDOUIsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLElBQUEsMEJBQW9CLEVBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDM0QsTUFBTSxVQUFVLEdBQUcsd0NBQXdDLENBQUM7WUFDNUQsTUFBTSxVQUFVLEdBQUcs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QUksRUFBRSxrQkFBa0I7Z0JBQ3hCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLFlBQVksRUFBRSxLQUFLO2dCQUNuQixRQUFRLEVBQUUsSUFBSTtnQkFDZCxNQUFNLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQyxNQUFNLEVBQUUsR0FBRzthQUNaLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgaGFuZGxlUmVzcG9uc2VFcnJvciwgaGFuZGxlUmVzcG9uc2VSZXN1bHQsIHNlcmlhbGl6ZVJlcXVlc3REYXRhIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ2JpdGdvOmFwaSB1bml0IHRlc3RzJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnc2VyaWFsaXplUmVxdWVzdERhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gc3RyaW5nIGRhdGEgYXMtaXMgZm9yIHY0IHJhdyBib2R5IHN1cHBvcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdHJpbmdCb2R5ID0gJ3tcImFkZHJlc3NcIjogIFwidGIxcXRlc3RcIiwgICBcImFtb3VudFwiOjEwMDAwMH0nO1xuICAgICAgY29uc3QgbW9ja1JlcTogYW55ID0ge1xuICAgICAgICBfZGF0YTogc3RyaW5nQm9keSxcbiAgICAgICAgZ2V0OiAoKSA9PiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBzZXJpYWxpemVSZXF1ZXN0RGF0YShtb2NrUmVxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHN0cmluZ0JvZHkpO1xuICAgICAgLy8gVmVyaWZ5IF9kYXRhIHdhcyBub3QgbW9kaWZpZWRcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrUmVxLl9kYXRhLCBzdHJpbmdCb2R5KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHN0cmluZyBhcy1pcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6ICcnLFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IEJ1ZmZlciB0byBVVEYtOCBzdHJpbmcgYW5kIG11dGF0ZSBfZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSAne1wiYWRkcmVzc1wiOlwidGIxcXRlc3RcIixcImFtb3VudFwiOjEwMDAwMH0nO1xuICAgICAgY29uc3QgYnVmZmVyQm9keSA9IEJ1ZmZlci5mcm9tKGpzb25TdHJpbmcsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtb2NrUmVxOiBhbnkgPSB7XG4gICAgICAgIF9kYXRhOiBidWZmZXJCb2R5LFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiByZXN1bHQsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGpzb25TdHJpbmcpO1xuICAgICAgLy8gVmVyaWZ5IF9kYXRhIFdBUyBtdXRhdGVkIHRvIHN0cmluZyAtIGNyaXRpY2FsIGZvciBzdXBlcmFnZW50IHRvIHNlbmQgY29ycmVjdCBieXRlc1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBtb2NrUmVxLl9kYXRhLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja1JlcS5fZGF0YSwganNvblN0cmluZyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgZW1wdHkgQnVmZmVyIHRvIGVtcHR5IHN0cmluZyBhbmQgbXV0YXRlIF9kYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1JlcTogYW55ID0ge1xuICAgICAgICBfZGF0YTogQnVmZmVyLmZyb20oJycpLFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiByZXN1bHQsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsICcnKTtcbiAgICAgIC8vIFZlcmlmeSBfZGF0YSBXQVMgbXV0YXRlZCB0byBzdHJpbmdcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgbW9ja1JlcS5fZGF0YSwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tSZXEuX2RhdGEsICcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBpZGVudGljYWwgcmVzdWx0cyBvbiByZXRyeSBmb3IgSE1BQyBjb25zaXN0ZW5jeScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSAne1wiYWRkcmVzc1wiOlwidGIxcXRlc3RcIixcImFtb3VudFwiOjEwMDAwMH0nO1xuICAgICAgY29uc3QgYnVmZmVyQm9keSA9IEJ1ZmZlci5mcm9tKGpzb25TdHJpbmcsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtb2NrUmVxOiBhbnkgPSB7XG4gICAgICAgIF9kYXRhOiBidWZmZXJCb2R5LFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IGNhbGwgKG9yaWdpbmFsIHJlcXVlc3QpIC0gY29udmVydHMgQnVmZmVyIHRvIHN0cmluZywgbXV0YXRlcyBfZGF0YVxuICAgICAgY29uc3QgcmVzdWx0MSA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdDEsIGpzb25TdHJpbmcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBtb2NrUmVxLl9kYXRhLCAnc3RyaW5nJyk7XG5cbiAgICAgIC8vIFNlY29uZCBjYWxsIChzaW11bGF0aW5nIHJldHJ5KSAtIF9kYXRhIGlzIG5vdyBhIHN0cmluZywgcmV0dXJucyBhcy1pc1xuICAgICAgY29uc3QgcmVzdWx0MiA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuXG4gICAgICAvLyBCb3RoIGNhbGxzIHNob3VsZCByZXR1cm4gaWRlbnRpY2FsIHN0cmluZ3MgZm9yIGNvbnNpc3RlbnQgSE1BQ1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdDEsIHJlc3VsdDIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdDIsIGpzb25TdHJpbmcpO1xuICAgICAgLy8gX2RhdGEgc2hvdWxkIG5vdyBiZSBhIHN0cmluZyAobXV0YXRlZCBvbiBmaXJzdCBjYWxsKVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBtb2NrUmVxLl9kYXRhLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja1JlcS5fZGF0YSwganNvblN0cmluZyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG11dGF0ZSBCdWZmZXIgdG8gcHJldmVudCBzdXBlcmFnZW50IEpTT04gc2VyaWFsaXphdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgY3JpdGljYWwgYmVoYXZpb3I6IGlmIHdlIGRvbid0IG11dGF0ZSBfZGF0YSBmcm9tIEJ1ZmZlciB0byBzdHJpbmcsXG4gICAgICAvLyBzdXBlcmFnZW50IHdpbGwgc2VyaWFsaXplIHRoZSBCdWZmZXIgYXMge1widHlwZVwiOlwiQnVmZmVyXCIsXCJkYXRhXCI6Wy4uLl19LCB3aGljaCB3b24ndCBtYXRjaFxuICAgICAgLy8gdGhlIEhNQUMgY2FsY3VsYXRlZCBvbiB0aGUgVVRGLTggc3RyaW5nLiBCeSBtdXRhdGluZyBfZGF0YSwgd2UgZW5zdXJlIHN1cGVyYWdlbnQgc2VuZHNcbiAgICAgIC8vIHRoZSBleGFjdCBieXRlcyB3ZSB1c2VkIGZvciBITUFDIGNhbGN1bGF0aW9uLlxuICAgICAgY29uc3QganNvblN0cmluZyA9ICd7XCJhZGRyZXNzXCI6XCJ0YjFxdGVzdFwiLFwiYW1vdW50XCI6MTAwMDAwfSc7XG4gICAgICBjb25zdCBidWZmZXJCb2R5ID0gQnVmZmVyLmZyb20oanNvblN0cmluZywgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6IGJ1ZmZlckJvZHksXG4gICAgICAgIGdldDogKCkgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfTtcblxuICAgICAgc2VyaWFsaXplUmVxdWVzdERhdGEobW9ja1JlcSk7XG5cbiAgICAgIC8vIEFmdGVyIHNlcmlhbGl6YXRpb24sIF9kYXRhIE1VU1QgYmUgYSBzdHJpbmcsIG5vdCBhIEJ1ZmZlclxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBtb2NrUmVxLl9kYXRhLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja1JlcS5fZGF0YSwganNvblN0cmluZyk7XG5cbiAgICAgIC8vIFRoaXMgZW5zdXJlcyB3aGVuIHN1cGVyYWdlbnQgc2VuZHMgdGhlIHJlcXVlc3QsIGl0IHNlbmRzIHRoZSBVVEYtOCBzdHJpbmcsXG4gICAgICAvLyBub3QgdGhlIEpTT04tc2VyaWFsaXplZCBCdWZmZXIgcmVwcmVzZW50YXRpb24uXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNlcmlhbGl6ZSBvYmplY3QgZGF0YSB0byBKU09OJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb2JqZWN0Qm9keSA9IHsgYWRkcmVzczogJ3RiMXF0ZXN0JywgYW1vdW50OiAxMDAwMDAgfTtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6IG9iamVjdEJvZHksXG4gICAgICAgIGdldDogKCkgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VyaWFsaXplUmVxdWVzdERhdGEobW9ja1JlcSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBKU09OLnN0cmluZ2lmeShvYmplY3RCb2R5KSk7XG4gICAgICAvLyBWZXJpZnkgX2RhdGEgd2FzIHVwZGF0ZWQgdG8gc2VyaWFsaXplZCBmb3JtXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja1JlcS5fZGF0YSwgSlNPTi5zdHJpbmdpZnkob2JqZWN0Qm9keSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmVzdGVkIG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBuZXN0ZWRCb2R5ID0geyBsZXZlbDE6IHsgbGV2ZWwyOiB7IHZhbHVlOiAnZGVlcCcgfSB9IH07XG4gICAgICBjb25zdCBtb2NrUmVxOiBhbnkgPSB7XG4gICAgICAgIF9kYXRhOiBuZXN0ZWRCb2R5LFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgSlNPTi5zdHJpbmdpZnkobmVzdGVkQm9keSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciB1bmRlZmluZWQgZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgZ2V0OiAoKSA9PiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBzZXJpYWxpemVSZXF1ZXN0RGF0YShtb2NrUmVxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIG51bGwgZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6IG51bGwsXG4gICAgICAgIGdldDogKCkgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VyaWFsaXplUmVxdWVzdERhdGEobW9ja1JlcSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgQ29udGVudC1UeXBlIHdpdGggY2hhcnNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iamVjdEJvZHkgPSB7IHRlc3Q6ICd2YWx1ZScgfTtcbiAgICAgIGNvbnN0IG1vY2tSZXE6IGFueSA9IHtcbiAgICAgICAgX2RhdGE6IG9iamVjdEJvZHksXG4gICAgICAgIGdldDogKCkgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VyaWFsaXplUmVxdWVzdERhdGEobW9ja1JlcSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBKU09OLnN0cmluZ2lmeShvYmplY3RCb2R5KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24gY29udGVudCB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb2JqZWN0Qm9keSA9IHsgZGF0YTogJ3Rlc3QnIH07XG4gICAgICBjb25zdCBtb2NrUmVxOiBhbnkgPSB7XG4gICAgICAgIF9kYXRhOiBvYmplY3RCb2R5LFxuICAgICAgICBnZXQ6ICgpID0+ICdhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24nLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gc2VyaWFsaXplUmVxdWVzdERhdGEobW9ja1JlcSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBKU09OLnN0cmluZ2lmeShvYmplY3RCb2R5KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIHVuc3VwcG9ydGVkIGNvbnRlbnQgdHlwZSB3aXRob3V0IHNlcmlhbGl6ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvYmplY3RCb2R5ID0geyB0ZXN0OiAndmFsdWUnIH07XG4gICAgICBjb25zdCBtb2NrUmVxOiBhbnkgPSB7XG4gICAgICAgIF9kYXRhOiBvYmplY3RCb2R5LFxuICAgICAgICBnZXQ6ICgpID0+ICd0ZXh0L3BsYWluJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKG1vY2tSZXEpO1xuICAgICAgLy8gdGV4dC9wbGFpbiBkb2Vzbid0IGhhdmUgYSBKU09OIHNlcmlhbGl6ZXIsIHNvIHJldHVybnMgdW5kZWZpbmVkXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaGFuZGxlUmVzcG9uc2VSZXN1bHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGV4dCBmb3IgdGV4dC1iYXNlZCByZXNwb25zZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjc3ZUZXh0ID0gYHRyYW5zYWN0aW9uSWQsZGF0ZSxhbW91bnQsY3VycmVuY3ksc3RhdHVzXG4gICAgICAgIDEyMzQ1LDIwMjUtMDEtMTUsMTAwLjAwLFVTRCxjb21wbGV0ZWRcbiAgICAgICAgNjc4OTAsMjAyNS0wMS0yMiw1MC41MCxFVVIsY29tcGxldGVkXG4gICAgICAgIDEzNTc5LDIwMjUtMDItMTAsMjAwLjAwLFVTRCxwZW5kaW5nXG4gICAgICAgIDI0NjgwLDIwMjUtMDItMjgsNzUuMjUsQlRDLGNvbXBsZXRlZGA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSB7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBoZWFkZXI6IHsgJ2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2NzdicgfSxcbiAgICAgICAgdGV4dDogY3N2VGV4dCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZVJlc3BvbnNlUmVzdWx0KCkocmVzcG9uc2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcmVzcG9uc2UudGV4dCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIEpTT04gcmVzcG9uc2UgYW5kIHJldHVybiB0aGUgZW50aXJlIGJvZHkgaWYgbm8gZmllbGQgaXMgc3BlY2lmaWVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIGhlYWRlcjogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IHsgZm9vOiAnYmFyJywgYmF6OiAxMjMgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZVJlc3BvbnNlUmVzdWx0KCkocmVzcG9uc2UpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHQsIHJlc3BvbnNlLmJvZHkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBKU09OIHJlc3BvbnNlIGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBmaWVsZCBpZiBwcm92aWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSB7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBoZWFkZXI6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiB7IGZvbzogJ2JhcicsIGJhejogMTIzIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVSZXNwb25zZVJlc3VsdCgnZm9vJykocmVzcG9uc2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgJ2JhcicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGVudGlyZSByZXNwb25zZSBmb3Igbm9uLUpTT04gYW5kIG5vbi10ZXh0IHJlc3BvbnNlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSB7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBoZWFkZXI6IHsgJ2NvbnRlbnQtdHlwZSc6ICdpbWFnZS9wbmcnIH0sXG4gICAgICAgIGJsb2I6ICdhYmNkZWZnaGlqaycsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVSZXNwb25zZVJlc3VsdCgpKHJlc3BvbnNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHJlc3BvbnNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBmdWxsIGJvZHkgaWYgdGhpcyBmaWVsZCBleGlzdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXNwb25zZTogYW55ID0ge1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgaGVhZGVyOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9LFxuICAgICAgICBib2R5OiB7IGlycmVsZXZhbnQ6IHRydWUgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZVJlc3BvbnNlUmVzdWx0KCkocmVzcG9uc2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcmVzcG9uc2UuYm9keSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdoYW5kbGVSZXNwb25zZUVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmUtdGhyb3cgYW4gZXJyb3Igd2l0aG91dCByZXNwb25zZSBwcm9wZXJ0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3IgPSBuZXcgRXJyb3IoJ0hhbiBzaG90IGZpcnN0Jyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHsgbmFtZTogJ0Vycm9yJywgbWVzc2FnZTogJ0hhbiBzaG90IGZpcnN0JyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHRoZSBzdGF0dXMgY29kZSBpZiB0aGUgcmVzcG9uc2UgaGFzIG5vIGVycm9yIHRleHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9yOiBhbnkgPSBuZXcgRXJyb3IoKTtcbiAgICAgIG9yaWdpbmFsRXJyb3IucmVzcG9uc2UgPSB7IHN0YXR1czogNDAwIH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHtcbiAgICAgICAgbmFtZTogJ0FwaVJlc3BvbnNlRXJyb3InLFxuICAgICAgICBtZXNzYWdlOiAnNDAwJyxcbiAgICAgICAgaW52YWxpZFRva2VuOiBmYWxzZSxcbiAgICAgICAgbmVlZHNPVFA6IGZhbHNlLFxuICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHRoZSByZXNwb25zZSBib2R5LmVycm9yIHRleHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9yOiBhbnkgPSBuZXcgRXJyb3IoKTtcbiAgICAgIG9yaWdpbmFsRXJyb3IucmVzcG9uc2UgPSB7IHN0YXR1czogNDAwLCBib2R5OiB7IGVycm9yOiAnSGFuIHNob3QgZmlyc3QnIH0gfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gaGFuZGxlUmVzcG9uc2VFcnJvcihvcmlnaW5hbEVycm9yKSwge1xuICAgICAgICBuYW1lOiAnQXBpUmVzcG9uc2VFcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6ICdIYW4gc2hvdCBmaXJzdCcsXG4gICAgICAgIGludmFsaWRUb2tlbjogZmFsc2UsXG4gICAgICAgIG5lZWRzT1RQOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0OiBvcmlnaW5hbEVycm9yLnJlc3BvbnNlLmJvZHksXG4gICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIEhUTUwgY29kZSBmcm9tIHRoZSByZXNwb25zZSB0ZXh0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFcnJvcjogYW55ID0gbmV3IEVycm9yKCk7XG4gICAgICBvcmlnaW5hbEVycm9yLnJlc3BvbnNlID0geyBzdGF0dXM6IDQwMCwgdGV4dDogJyA8Yj4gSGFuIHNob3QgZmlyc3QgPC9iPicgfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gaGFuZGxlUmVzcG9uc2VFcnJvcihvcmlnaW5hbEVycm9yKSwge1xuICAgICAgICBuYW1lOiAnQXBpUmVzcG9uc2VFcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6ICc0MDBcXG5IYW4gc2hvdCBmaXJzdCcsXG4gICAgICAgIGludmFsaWRUb2tlbjogZmFsc2UsXG4gICAgICAgIG5lZWRzT1RQOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFubm90YXRlIGludmFsaWRUb2tlbiBwcm9wZXJ0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3I6IGFueSA9IG5ldyBFcnJvcigpO1xuICAgICAgb3JpZ2luYWxFcnJvci5yZXNwb25zZSA9IHsgc3RhdHVzOiA0MDAsIGhlYWRlcjogeyAneC1hdXRoLXJlcXVpcmVkJzogJ3RydWUnIH0gfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gaGFuZGxlUmVzcG9uc2VFcnJvcihvcmlnaW5hbEVycm9yKSwge1xuICAgICAgICBuYW1lOiAnQXBpUmVzcG9uc2VFcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6ICc0MDAnLFxuICAgICAgICBpbnZhbGlkVG9rZW46IHRydWUsXG4gICAgICAgIG5lZWRzT1RQOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFubm90YXRlIG5lZWRzT1RQIHByb3BlcnR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFcnJvcjogYW55ID0gbmV3IEVycm9yKCk7XG4gICAgICBvcmlnaW5hbEVycm9yLnJlc3BvbnNlID0geyBzdGF0dXM6IDQwMCwgYm9keTogeyBuZWVkc09UUDogdHJ1ZSB9IH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHtcbiAgICAgICAgbmFtZTogJ0FwaVJlc3BvbnNlRXJyb3InLFxuICAgICAgICBtZXNzYWdlOiAnNDAwJyxcbiAgICAgICAgaW52YWxpZFRva2VuOiBmYWxzZSxcbiAgICAgICAgbmVlZHNPVFA6IHRydWUsXG4gICAgICAgIHJlc3VsdDogb3JpZ2luYWxFcnJvci5yZXNwb25zZS5ib2R5LFxuICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|