@bitgo/sdk-core 38.21.0 → 38.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.
- package/dist/src/bitgo/errors.d.ts +2 -1
- package/dist/src/bitgo/errors.d.ts.map +1 -1
- package/dist/src/bitgo/errors.js +3 -2
- package/dist/src/bitgo/safe/index.d.ts +1 -0
- package/dist/src/bitgo/safe/index.d.ts.map +1 -1
- package/dist/src/bitgo/safe/index.js +2 -1
- package/dist/src/bitgo/safe/recovery.d.ts +92 -0
- package/dist/src/bitgo/safe/recovery.d.ts.map +1 -0
- package/dist/src/bitgo/safe/recovery.js +148 -0
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts +33 -4
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.js +71 -4
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +2 -1
- package/dist/src/bitgo/utils/siws.d.ts +5 -2
- package/dist/src/bitgo/utils/siws.d.ts.map +1 -1
- package/dist/src/bitgo/utils/siws.js +8 -18
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +7 -2
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +13 -2
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +8 -1
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +7 -3
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +9 -18
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +3 -2
- package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/index.js +2 -1
- package/dist/src/bitgo/utils/tss/keyVerification.d.ts +45 -0
- package/dist/src/bitgo/utils/tss/keyVerification.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/keyVerification.js +192 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +1 -14
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.js +1 -62
- package/dist/src/bitgo/wallet/iWallet.d.ts +16 -2
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts +21 -1
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +52 -38
- package/dist/test/unit/bitgo/recovery/initiate.js +1 -30
- package/dist/test/unit/bitgo/safe/recovery.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/recovery.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/recovery.js +313 -0
- package/dist/test/unit/bitgo/safe/rootCoin.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/rootCoin.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/rootCoin.js +13 -0
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.js +69 -1
- package/dist/test/unit/bitgo/utils/siws.js +57 -7
- package/dist/test/unit/bitgo/utils/tss/keyVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/keyVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/keyVerification.js +229 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +1 -21
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.js +160 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -88,7 +88,8 @@ export declare class MissingEncryptedKeychainError extends Error {
|
|
|
88
88
|
export declare class IncorrectPasswordError extends Error {
|
|
89
89
|
code: string;
|
|
90
90
|
status: number;
|
|
91
|
-
|
|
91
|
+
cause?: unknown;
|
|
92
|
+
constructor(message?: string, cause?: unknown);
|
|
92
93
|
}
|
|
93
94
|
export declare class NeedUserSignupError extends BitGoJsError {
|
|
94
95
|
constructor(message?: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/bitgo/errors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,qBAAa,qBAAsB,SAAQ,YAAY;gBAClC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,oBAAqB,SAAQ,YAAY;gBACjC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,oBAAqB,SAAQ,YAAY;gBACjC,IAAI,EAAE,MAAM;CAKhC;AAED,qBAAa,+BAAgC,SAAQ,YAAY;gBAC5C,UAAU,EAAE,MAAM;CAKtC;AAED,qBAAa,6BAA8B,SAAQ,YAAY;gBACjD,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;CAGxD;AAED,qBAAa,yBAA0B,SAAQ,YAAY;gBAC7C,OAAO,CAAC,EAAE,MAAM;CAG7B;AAED,qBAAa,qBAAsB,SAAQ,YAAY;gBAClC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,oBAAqB,SAAQ,YAAY;gBACjC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,0BAA2B,SAAQ,YAAY;gBACvC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,2BAA4B,SAAQ,YAAY;gBACxC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,mBAAoB,SAAQ,YAAY;gBAChC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,6CAA8C,SAAQ,YAAY;gBAC1D,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,sBAAuB,SAAQ,YAAY;gBACnC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,qCAAsC,SAAQ,YAAY;gBAClD,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,yBAA0B,SAAQ,YAAY;gBACtC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,yBAA0B,SAAQ,YAAY;gBACtC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,wBAAyB,SAAQ,YAAY;gBACrC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,kBAAmB,SAAQ,mBAAmB;gBACtC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,qBAAsB,SAAQ,mBAAmB;gBACzC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,uBAAwB,SAAQ,YAAY;gBACpC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,sBAAuB,SAAQ,YAAY;gBACnC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,+BAAgC,SAAQ,YAAY;gBAC5C,WAAW,EAAE,MAAM;CAGvC;AAED,qBAAa,kCAAmC,SAAQ,YAAY;gBAC/C,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,qBAAsB,SAAQ,YAAY;gBAClC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,mBAAoB,SAAQ,YAAY;gBAChC,OAAO,EAAE,MAAM;CAGnC;AAED,qBAAa,uBAAwB,SAAQ,YAAY;gBACpC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,6BAA8B,SAAQ,KAAK;gBACnC,OAAO,CAAC,EAAE,MAAM;CAGpC;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IACxC,IAAI,SAAiC;IACrC,MAAM,SAAO;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/bitgo/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/src/bitgo/errors.js
CHANGED
|
@@ -168,11 +168,12 @@ class MissingEncryptedKeychainError extends Error {
|
|
|
168
168
|
}
|
|
169
169
|
exports.MissingEncryptedKeychainError = MissingEncryptedKeychainError;
|
|
170
170
|
class IncorrectPasswordError extends Error {
|
|
171
|
-
constructor(message) {
|
|
171
|
+
constructor(message, cause) {
|
|
172
172
|
super(message || 'unable to decrypt keychain with the given wallet passphrase');
|
|
173
173
|
this.code = 'wallet_passphrase_incorrect';
|
|
174
174
|
this.status = 401;
|
|
175
175
|
this.name = 'IncorrectPasswordError';
|
|
176
|
+
this.cause = cause;
|
|
176
177
|
}
|
|
177
178
|
}
|
|
178
179
|
exports.IncorrectPasswordError = IncorrectPasswordError;
|
|
@@ -340,4 +341,4 @@ class TxIntentMismatchApprovalError extends TxIntentMismatchError {
|
|
|
340
341
|
}
|
|
341
342
|
}
|
|
342
343
|
exports.TxIntentMismatchApprovalError = TxIntentMismatchApprovalError;
|
|
343
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0REFBNEQ7QUFDNUQsa0RBQWtEO0FBQ2xELGtEQUErQztBQU90Qyw2RkFQQSwyQkFBWSxPQU9BO0FBRXJCLE1BQWEscUJBQXNCLFNBQVEsMkJBQVk7SUFDckQsWUFBbUIsT0FBZ0I7UUFDakMsS0FBSyxDQUFDLE9BQU8sSUFBSSxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQUpELHNEQUlDO0FBRUQsTUFBYSxvQkFBcUIsU0FBUSwyQkFBWTtJQUNwRCxZQUFtQixPQUFnQjtRQUNqQyxLQUFLLENBQUMsT0FBTyxJQUFJLHVEQUF1RCxDQUFDLENBQUM7SUFDNUUsQ0FBQztDQUNGO0FBSkQsb0RBSUM7QUFFRCxNQUFhLG9CQUFxQixTQUFRLDJCQUFZO0lBQ3BELFlBQW1CLElBQVk7UUFDN0IsS0FBSyxDQUNILHNCQUFzQixJQUFJLGdLQUFnSyxJQUFJLFNBQVMsQ0FDeE0sQ0FBQztJQUNKLENBQUM7Q0FDRjtBQU5ELG9EQU1DO0FBRUQsTUFBYSwrQkFBZ0MsU0FBUSwyQkFBWTtJQUMvRCxZQUFtQixVQUFrQjtRQUNuQyxLQUFLLENBQ0gsd0RBQXdELFVBQVUsa0lBQWtJLFVBQVUsK0NBQStDLENBQzlQLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFORCwwRUFNQztBQUVELE1BQWEsNkJBQThCLFNBQVEsMkJBQVk7SUFDN0QsWUFBWSxXQUFtQixFQUFFLEtBQXNCO1FBQ3JELEtBQUssQ0FBQyxnQkFBZ0IsV0FBVyxpQ0FBaUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0NBQ0Y7QUFKRCxzRUFJQztBQUVELE1BQWEseUJBQTBCLFNBQVEsMkJBQVk7SUFDekQsWUFBWSxPQUFnQjtRQUMxQixLQUFLLENBQUMsT0FBTyxJQUFJLHNDQUFzQyxDQUFDLENBQUM7SUFDM0Qs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QUFDO1FBQ25ELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUF4QkQsd0VBd0JDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSw2QkFBOEIsU0FBUSxxQkFBcUI7SUFHdEU7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFDRSxPQUFlLEVBQ2YsRUFBdUMsRUFDdkMsUUFBNkIsRUFDN0IsS0FBeUIsRUFDekIscUJBQTBDLEVBQzFDLGFBQXVCO1FBRXZCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0lBQ3JELENBQUM7Q0FDRjtBQXhCRCxzRUF3QkM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLDZCQUE4QixTQUFRLHFCQUFxQjtJQUd0RTs7Ozs7Ozs7O09BU0c7SUFDSCxZQUNFLE9BQWUsRUFDZixFQUF1QyxFQUN2QyxRQUE2QixFQUM3QixLQUF5QixFQUN6QixhQUE0QixFQUM1QixhQUF1QjtRQUV2QixLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3JDLENBQUM7Q0FDRjtBQXhCRCxzRUF3QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBEZXNjcmlwdGl2ZSBlcnJvciB0eXBlcyBmb3IgY29tbW9uIGlzc3VlcyB3aGljaCBtYXkgYXJpc2Vcbi8vIGR1cmluZyB0aGUgb3BlcmF0aW9uIG9mIEJpdEdvSlMgb3IgQml0R29FeHByZXNzXG5pbXBvcnQgeyBCaXRHb0pzRXJyb3IgfSBmcm9tICcuLi9iaXRnb2pzRXJyb3InO1xuaW1wb3J0IHsgSVJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi9hcGkvdHlwZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25QYXJhbXMgfSBmcm9tICcuL2Jhc2VDb2luJztcbmltcG9ydCB7IElCYXNlQ29pbiB9IGZyb20gJy4vYmFzZUNvaW4vaUJhc2VDb2luJztcbmltcG9ydCB7IFNlbmRNYW55T3B0aW9ucyB9IGZyb20gJy4vd2FsbGV0JztcblxuLy8gcmUtZXhwb3J0IGZvciBiYWNrd2FyZHMgY29tcGF0XG5leHBvcnQgeyBCaXRHb0pzRXJyb3IgfTtcblxuZXhwb3J0IGNsYXNzIFRsc0NvbmZpZ3VyYXRpb25FcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAnVExTIGlzIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlRW52aXJvbm1lbnRFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAnTk9ERV9FTlYgaXMgaW52YWxpZCBmb3IgdGhlIGN1cnJlbnQgYml0Z28gZW52aXJvbm1lbnQnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRDb2luRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IoY29pbjogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgQ29pbiBvciB0b2tlbiB0eXBlICR7Y29pbn0gbm90IHN1cHBvcnRlZCBvciBub3QgY29tcGlsZWQuIFBsZWFzZSBiZSBzdXJlIHRoYXQgeW91IGFyZSB1c2luZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgQml0R29KUy4gSWYgdXNpbmcgQGJpdGdvL3Nkay1hcGksIHBsZWFzZSBjb25maXJtIHlvdSBoYXZlIHJlZ2lzdGVyZWQgJHtjb2lufSBmaXJzdC5gXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2FmZU1wY0NlcmVtb255VW5zdXBwb3J0ZWRFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb2luRmFtaWx5OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGBDYW5ub3QgY3JlYXRlIFdhbGxldCBTYWZlIHJvb3Qga2V5cyBmb3IgY29pbiBmYW1pbHkgJyR7Y29pbkZhbWlseX0nOiBpdHMgVFNTIHNldHRpbmdzIHJlc29sdmUgdG8gdGhlIGxlZ2FjeSBNUEN2MSBjZXJlbW9ueSwgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBzYWZlIHJvb3QgdGFnZ2luZyAoc2FmZUlkKS4gRW5hYmxlIE1QQ3YyIGZvciAnJHtjb2luRmFtaWx5fScgYmVmb3JlIGNyZWF0aW5nIGEgc2FmZSB3aXRoIHRoaXMgcm9vdCB0eXBlLmBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBZGRyZXNzVHlwZUNoYWluTWlzbWF0Y2hFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGFkZHJlc3NUeXBlOiBzdHJpbmcsIGNoYWluOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICBzdXBlcihgYWRkcmVzcyB0eXBlICR7YWRkcmVzc1R5cGV9IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gY2hhaW4gJHtjaGFpbn1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUDJzaFAyd3NoVW5zdXBwb3J0ZWRFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdwMnNoUDJ3c2ggbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvaW4nKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUDJ3c2hVbnN1cHBvcnRlZEVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdwMndzaCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29pbicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQMnRyVW5zdXBwb3J0ZWRFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAncDJ0ciBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29pbicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQMnRyTXVzaWcyVW5zdXBwb3J0ZWRFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAncDJ0ck11c2lnMiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29pbicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ2ludmFsaWQgYWRkcmVzcyB0eXBlJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRBZGRyZXNzRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ2ludmFsaWQgYWRkcmVzcycpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQWRkcmVzc1ZlcmlmaWNhdGlvbk9iamVjdFByb3BlcnR5RXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ2FkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ2FkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ2FkZHJlc3MgY2hhaW4gYW5kL29yIGluZGV4IGFyZSBpbnZhbGlkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdhbGxldFJlY292ZXJ5VW5zdXBwb3J0ZWQgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ3dhbGxldCByZWNvdmVyeSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29pbicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdtZXRob2Qgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJsb2NrRXhwbG9yZXJVbmF2YWlsYWJsZSBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAndGhpcmQtcGFydHkgYmxvY2tleHBsb3JlciBub3QgcmVzcG9uZGluZycpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkTWVtb0lkRXJyb3IgZXh0ZW5kcyBJbnZhbGlkQWRkcmVzc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdpbnZhbGlkIG1lbW8gaWQnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFBheW1lbnRJZEVycm9yIGV4dGVuZHMgSW52YWxpZEFkZHJlc3NFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAnaW52YWxpZCBwYXltZW50IGlkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEtleVJlY292ZXJ5U2VydmljZUVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdrZXkgcmVjb3Zlcnkgc2VydmljZSBlbmNvdW50ZXJlZCBhbiBlcnJvcicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBZGRyZXNzR2VuZXJhdGlvbkVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdhZGRyZXNzIGdlbmVyYXRpb24gZmFpbGVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV0aGVyZXVtTGlicmFyeVVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFja2FnZU5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKGBFdGhlcmV1bSBsaWJyYXJ5IHJlcXVpcmVkIGZvciBvcGVyYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGluc3RhbGwgXCIke3BhY2thZ2VOYW1lfVwiLmApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGVsbGFyRmVkZXJhdGlvblVzZXJOb3RGb3VuZEVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdhY2NvdW50IG5vdCBmb3VuZCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvck5vSW5wdXRUb1JlY292ZXIgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ05vIGlucHV0IHRvIHJlY292ZXIgLSBhYm9ydGluZyEnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZEtleVBhdGhFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihrZXlQYXRoOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgaW52YWxpZCBrZXlwYXRoOiAke2tleVBhdGh9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRUcmFuc2FjdGlvbkVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ05vIGVuY3J5cHRlZCBrZXljaGFpbnMgb24gdGhpcyB3YWxsZXQuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluY29ycmVjdFBhc3N3b3JkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyBjb2RlID0gJ3dhbGxldF9wYXNzcGhyYXNlX2luY29ycmVjdCc7XG4gIHB1YmxpYyBzdGF0dXMgPSA0MDE7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICd1bmFibGUgdG8gZGVjcnlwdCBrZXljaGFpbiB3aXRoIHRoZSBnaXZlbiB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIHRoaXMubmFtZSA9ICdJbmNvcnJlY3RQYXNzd29yZEVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmVlZFVzZXJTaWdudXBFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAnVXNlciBzaWdudXAgaXMgcmVxdWlyZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXBpUmVzcG9uc2VFcnJvcjxSZXNwb25zZUJvZHlUeXBlID0gYW55PiBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhdHVzOiBudW1iZXI7XG4gIHJlc3VsdD86IFJlc3BvbnNlQm9keVR5cGU7XG4gIGludmFsaWRUb2tlbj86IGJvb2xlYW47XG4gIG5lZWRzT1RQPzogYm9vbGVhbjtcbiAgLy8gRWNob2VkIGJhY2sgdmlhIHRoZSBgUmVxdWVzdC1JRGAgcmVzcG9uc2UgaGVhZGVyIChzZWUgbG9nZ2luZy1leHByZXNzJ3MgYGJlZ2luTG9nZ2luZ2ApLFxuICAvLyBzbyBpdCBjYW4gYmUgdXNlZCB0byBjb3JyZWxhdGUgdGhpcyBlcnJvciB3aXRoIHRoZSBzZXJ2ZXItc2lkZSByZXF1ZXN0IGxvZ3MuXG4gIHJlcXVlc3RJZD86IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHN0YXR1czogbnVtYmVyLFxuICAgIHJlc3VsdD86IFJlc3BvbnNlQm9keVR5cGUsXG4gICAgaW52YWxpZFRva2VuPzogYm9vbGVhbixcbiAgICBuZWVkc09UUD86IGJvb2xlYW4sXG4gICAgcmVxdWVzdElkPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgdGhpcy5pbnZhbGlkVG9rZW4gPSBpbnZhbGlkVG9rZW47XG4gICAgdGhpcy5uZWVkc09UUCA9IG5lZWRzT1RQO1xuICAgIHRoaXMucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICB9XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciB0b2tlbiBhcHByb3ZhbCBpbmZvcm1hdGlvbiB1c2VkIGluIHN1c3BpY2lvdXMgdHJhbnNhY3Rpb24gZGV0ZWN0aW9uXG4gKlxuICogQGludGVyZmFjZSBUb2tlbkFwcHJvdmFsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rva2VuTmFtZV0gLSBPcHRpb25hbCBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSB0b2tlblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRva2VuQWRkcmVzcyAtIFRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSB0b2tlbiBiZWluZyBhcHByb3ZlZFxuICogQHByb3BlcnR5IHtPYmplY3R9IGF1dGhvcml6aW5nQW1vdW50IC0gVGhlIGFtb3VudCBiZWluZyBhdXRob3JpemVkIGZvciBzcGVuZGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGF1dGhvcml6aW5nQWRkcmVzcyAtIFRoZSBhZGRyZXNzIGJlaW5nIGF1dGhvcml6ZWQgdG8gc3BlbmQgdGhlIHRva2Vuc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuQXBwcm92YWwge1xuICB0b2tlbk5hbWU/OiBzdHJpbmc7XG4gIHRva2VuQWRkcmVzczogc3RyaW5nO1xuICBhdXRob3JpemluZ0Ftb3VudDogeyB0eXBlOiAndW5saW1pdGVkJyB9IHwgeyB0eXBlOiAnbGltaXRlZCc7IGFtb3VudDogbnVtYmVyIH07XG4gIGF1dGhvcml6aW5nQWRkcmVzczogc3RyaW5nO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgbWlzbWF0Y2hlZCByZWNpcGllbnQgaW5mb3JtYXRpb24gZGV0ZWN0ZWQgZHVyaW5nIHRyYW5zYWN0aW9uIHZlcmlmaWNhdGlvblxuICpcbiAqIEBpbnRlcmZhY2UgTWlzbWF0Y2hlZFJlY2lwaWVudFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFkZHJlc3MgLSBUaGUgcmVjaXBpZW50IGFkZHJlc3MgdGhhdCB3YXMgZm91bmQgaW4gdGhlIHRyYW5zYWN0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYW1vdW50IC0gVGhlIGFtb3VudCBiZWluZyBzZW50IHRvIHRoaXMgcmVjaXBpZW50XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFRva2VuVHJhbnNmZXJSZWNpcGllbnRQYXJhbXN9IFtkYXRhXSAtIE9wdGlvbmFsIHRyYW5zYWN0aW9uIGRhdGEgb3IgdG9rZW4gdHJhbnNmZXIgcGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0b2tlbk5hbWVdIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgdG9rZW4gYmVpbmcgdHJhbnNmZXJyZWRcbiAqIEBwcm9wZXJ0eSB7VG9rZW5UcmFuc2ZlclJlY2lwaWVudFBhcmFtc30gW3Rva2VuRGF0YV0gLSBPcHRpb25hbCBzdHJ1Y3R1cmVkIHRva2VuIHRyYW5zZmVyIGRhdGFcbiAqL1xuZXhwb3J0IHR5cGUgTWlzbWF0Y2hlZFJlY2lwaWVudCA9IE5vbk51bGxhYmxlPFNlbmRNYW55T3B0aW9uc1sncmVjaXBpZW50cyddPlswXTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNvbnRyYWN0IGludGVyYWN0aW9uIGRhdGEgcGF5bG9hZCB1c2VkIGluIHN1c3BpY2lvdXMgdHJhbnNhY3Rpb24gZGV0ZWN0aW9uXG4gKlxuICogQGludGVyZmFjZSBDb250cmFjdERhdGFQYXlsb2FkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWRkcmVzcyAtIFRoZSBjb250cmFjdCBhZGRyZXNzIGJlaW5nIGludGVyYWN0ZWQgd2l0aFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJhd0NvbnRyYWN0UGF5bG9hZCAtIFRoZSByYXcgY29udHJhY3QgcGF5bG9hZCBpbiBzZXJpYWxpemVkIGZvcm0gc3BlY2lmaWMgdG8gdGhlIGJsb2NrY2hhaW5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bn0gZGVjb2RlZENvbnRyYWN0UGF5bG9hZCAtIFRoZSBkZWNvZGVkIGNvbnRyYWN0IHBheWxvYWQsIHN0cnVjdHVyZSB2YXJpZXMgYnkgY29pbi9jaGFpbiBpbXBsZW1lbnRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyYWN0RGF0YVBheWxvYWQge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIC8vIFRoZSByYXcgY29udHJhY3QgcGF5bG9hZCBpbiBzZXJpYWxpemVkIGZvcm0gb2YgdGhlIGNoYWluXG4gIHJhd0NvbnRyYWN0UGF5bG9hZDogc3RyaW5nO1xuICAvLyBUbyBiZSBkZWZpbmVkIG9uIGEgcGVyLWNvaW4gYmFzaXNcbiAgZGVjb2RlZENvbnRyYWN0UGF5bG9hZDogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciB0cmFuc2FjdGlvbiBpbnRlbnQgbWlzbWF0Y2ggZGV0ZWN0aW9uXG4gKlxuICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1hdGNoIHRoZSB1c2VyJ3Mgb3JpZ2luYWwgaW50ZW50LFxuICogaW5kaWNhdGluZyBwb3RlbnRpYWwgc2VjdXJpdHkgaXNzdWVzIG9yIG1hbGljaW91cyBtb2RpZmljYXRpb25zLlxuICpcbiAqIEBjbGFzcyBUeEludGVudE1pc21hdGNoRXJyb3JcbiAqIEBleHRlbmRzIHtCaXRHb0pzRXJyb3J9XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IElSZXF1ZXN0VHJhY2VyIHwgdW5kZWZpbmVkfSBpZCAtIFRyYW5zYWN0aW9uIElEIG9yIHJlcXVlc3QgdHJhY2VyIGZvciB0cmFja2luZ1xuICogQHByb3BlcnR5IHtUcmFuc2FjdGlvblBhcmFtc1tdfSB0eFBhcmFtcyAtIEFycmF5IG9mIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIGFuYWx5emVkXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gdHhIZXggLSBUaGUgcmF3IHRyYW5zYWN0aW9uIGluIGhleGFkZWNpbWFsIGZvcm1hdFxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IHR4RXhwbGFuYXRpb24gLSBTdHJpbmdpZmllZCB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICovXG5leHBvcnQgY2xhc3MgVHhJbnRlbnRNaXNtYXRjaEVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmcgfCBJUmVxdWVzdFRyYWNlciB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtc1tdO1xuICBwdWJsaWMgcmVhZG9ubHkgdHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IHR4RXhwbGFuYXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUeEludGVudE1pc21hdGNoRXJyb3JcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGludGVudCBtaXNtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IElSZXF1ZXN0VHJhY2VyIHwgdW5kZWZpbmVkfSBpZCAtIFRyYW5zYWN0aW9uIElEIG9yIHJlcXVlc3QgdHJhY2VyXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25QYXJhbXNbXX0gdHhQYXJhbXMgLSBUcmFuc2FjdGlvbiBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhbmFseXplZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdHhIZXggLSBSYXcgdHJhbnNhY3Rpb24gaGV4IHN0cmluZ1xuICAgKiBAcGFyYW0ge3Vua25vd259IHR4RXhwbGFuYXRpb24gLSBUcmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgSVJlcXVlc3RUcmFjZXIgfCB1bmRlZmluZWQsXG4gICAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zW10sXG4gICAgdHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0eEV4cGxhbmF0aW9uPzogdW5rbm93blxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy50eFBhcmFtcyA9IHR4UGFyYW1zO1xuICAgIHRoaXMudHhIZXggPSB0eEhleDtcbiAgICB0aGlzLnR4RXhwbGFuYXRpb24gPSB0eEV4cGxhbmF0aW9uID8gVHhJbnRlbnRNaXNtYXRjaEVycm9yLnNhZmVTdHJpbmdpZnkodHhFeHBsYW5hdGlvbikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2FmZWx5IHN0cmluZ2lmeSBhIHZhbHVlIHdpdGggQmlnSW50IHN1cHBvcnRcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gc3RyaW5naWZ5XG4gICAqIEByZXR1cm5zIEpTT04gc3RyaW5nIHdpdGggQmlnSW50cyBjb252ZXJ0ZWQgdG8gc3RyaW5nc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgc2FmZVN0cmluZ2lmeSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCAoXywgdikgPT4gKHR5cGVvZiB2ID09PSAnYmlnaW50JyA/IHYudG9TdHJpbmcoKSA6IHYpLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gZ2V0IHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uIGZyb20gYSBjb2luJ3MgZXhwbGFpblRyYW5zYWN0aW9uIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIGNvaW4gLSBDb2luIGluc3RhbmNlIGltcGxlbWVudGluZyBJQmFzZUNvaW5cbiAgICogQHBhcmFtIHR4UHJlYnVpbGQgLSBUcmFuc2FjdGlvbiBwcmVidWlsZCBjb250YWluaW5nIHR4SGV4IGFuZCB0eEluZm9cbiAgICogQHJldHVybnMgVHJhbnNhY3Rpb24gZXhwbGFuYXRpb24gb2JqZWN0IG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHRyeUdldFR4RXhwbGFuYXRpb24oXG4gICAgY29pbjogSUJhc2VDb2luLFxuICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg/OiBzdHJpbmc7IHR4SW5mbz86IHVua25vd24gfVxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBpZiAoIXR4UHJlYnVpbGQudHhIZXgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4SGV4OiB0eFByZWJ1aWxkLnR4SGV4LFxuICAgICAgICB0eEluZm86IHR4UHJlYnVpbGQudHhJbmZvLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6ICdGYWlsZWQgdG8gcGFyc2UgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb24nLFxuICAgICAgICB0eEhleDogdHhQcmVidWlsZC50eEhleCxcbiAgICAgICAgZGV0YWlsczogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0cmFuc2FjdGlvbiByZWNpcGllbnRzIGRvbid0IG1hdGNoIHRoZSB1c2VyJ3MgaW50ZW50XG4gKlxuICogVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB0aGUgdHJhbnNhY3Rpb24gY29udGFpbnMgcmVjaXBpZW50cyBvciBhbW91bnRzIHRoYXQgZGlmZmVyXG4gKiBmcm9tIHdoYXQgdGhlIHVzZXIgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBzZW5kLlxuICpcbiAqIEBjbGFzcyBUeEludGVudE1pc21hdGNoUmVjaXBpZW50RXJyb3JcbiAqIEBleHRlbmRzIHtUeEludGVudE1pc21hdGNoRXJyb3J9XG4gKiBAcHJvcGVydHkge01pc21hdGNoZWRSZWNpcGllbnRbXX0gbWlzbWF0Y2hlZFJlY2lwaWVudHMgLSBBcnJheSBvZiByZWNpcGllbnRzIHRoYXQgZG9uJ3QgbWF0Y2ggdXNlciBpbnRlbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvciBleHRlbmRzIFR4SW50ZW50TWlzbWF0Y2hFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBtaXNtYXRjaGVkUmVjaXBpZW50czogTWlzbWF0Y2hlZFJlY2lwaWVudFtdO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvclxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgcmVjaXBpZW50IGludGVudCBtaXNtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IElSZXF1ZXN0VHJhY2VyIHwgdW5kZWZpbmVkfSBpZCAtIFRyYW5zYWN0aW9uIElEIG9yIHJlcXVlc3QgdHJhY2VyXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25QYXJhbXNbXX0gdHhQYXJhbXMgLSBUcmFuc2FjdGlvbiBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhbmFseXplZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdHhIZXggLSBSYXcgdHJhbnNhY3Rpb24gaGV4IHN0cmluZ1xuICAgKiBAcGFyYW0ge01pc21hdGNoZWRSZWNpcGllbnRbXX0gbWlzbWF0Y2hlZFJlY2lwaWVudHMgLSBBcnJheSBvZiByZWNpcGllbnRzIHRoYXQgZG9uJ3QgbWF0Y2ggdXNlciBpbnRlbnRcbiAgICogQHBhcmFtIHt1bmtub3dufSB0eEV4cGxhbmF0aW9uIC0gVHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IElSZXF1ZXN0VHJhY2VyIHwgdW5kZWZpbmVkLFxuICAgIHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtc1tdLFxuICAgIHR4SGV4OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgbWlzbWF0Y2hlZFJlY2lwaWVudHM6IE1pc21hdGNoZWRSZWNpcGllbnRbXSxcbiAgICB0eEV4cGxhbmF0aW9uPzogdW5rbm93blxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBpZCwgdHhQYXJhbXMsIHR4SGV4LCB0eEV4cGxhbmF0aW9uKTtcbiAgICB0aGlzLm1pc21hdGNoZWRSZWNpcGllbnRzID0gbWlzbWF0Y2hlZFJlY2lwaWVudHM7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBjb250cmFjdCBpbnRlcmFjdGlvbiBkb2Vzbid0IG1hdGNoIHRoZSB1c2VyJ3MgaW50ZW50XG4gKlxuICogVGhpcyBlcnJvciBvY2N1cnMgd2hlbiBhIHRyYW5zYWN0aW9uIGludGVyYWN0cyB3aXRoIGEgc21hcnQgY29udHJhY3QgYnV0IHRoZVxuICogY29udHJhY3QgY2FsbCBkYXRhIG9yIG1ldGhvZCBkb2Vzbid0IG1hdGNoIHdoYXQgdGhlIHVzZXIgaW50ZW5kZWQuXG4gKlxuICogQGNsYXNzIFR4SW50ZW50TWlzbWF0Y2hDb250cmFjdEVycm9yXG4gKiBAZXh0ZW5kcyB7VHhJbnRlbnRNaXNtYXRjaEVycm9yfVxuICogQHByb3BlcnR5IHtDb250cmFjdERhdGFQYXlsb2FkfSBtaXNtYXRjaGVkRGF0YVBheWxvYWQgLSBUaGUgY29udHJhY3QgaW50ZXJhY3Rpb24gZGF0YSB0aGF0IGRvZXNuJ3QgbWF0Y2ggdXNlciBpbnRlbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFR4SW50ZW50TWlzbWF0Y2hDb250cmFjdEVycm9yIGV4dGVuZHMgVHhJbnRlbnRNaXNtYXRjaEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IG1pc21hdGNoZWREYXRhUGF5bG9hZDogQ29udHJhY3REYXRhUGF5bG9hZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUeEludGVudE1pc21hdGNoQ29udHJhY3RFcnJvclxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgY29udHJhY3QgaW50ZW50IG1pc21hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgSVJlcXVlc3RUcmFjZXIgfCB1bmRlZmluZWR9IGlkIC0gVHJhbnNhY3Rpb24gSUQgb3IgcmVxdWVzdCB0cmFjZXJcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblBhcmFtc1tdfSB0eFBhcmFtcyAtIFRyYW5zYWN0aW9uIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIGFuYWx5emVkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB0eEhleCAtIFJhdyB0cmFuc2FjdGlvbiBoZXggc3RyaW5nXG4gICAqIEBwYXJhbSB7Q29udHJhY3REYXRhUGF5bG9hZH0gbWlzbWF0Y2hlZERhdGFQYXlsb2FkIC0gVGhlIGNvbnRyYWN0IGludGVyYWN0aW9uIGRhdGEgdGhhdCBkb2Vzbid0IG1hdGNoIHVzZXIgaW50ZW50XG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdHhFeHBsYW5hdGlvbiAtIFRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBJUmVxdWVzdFRyYWNlciB8IHVuZGVmaW5lZCxcbiAgICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXNbXSxcbiAgICB0eEhleDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG1pc21hdGNoZWREYXRhUGF5bG9hZDogQ29udHJhY3REYXRhUGF5bG9hZCxcbiAgICB0eEV4cGxhbmF0aW9uPzogdW5rbm93blxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBpZCwgdHhQYXJhbXMsIHR4SGV4LCB0eEV4cGxhbmF0aW9uKTtcbiAgICB0aGlzLm1pc21hdGNoZWREYXRhUGF5bG9hZCA9IG1pc21hdGNoZWREYXRhUGF5bG9hZDtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRva2VuIGFwcHJvdmFsIGRvZXNuJ3QgbWF0Y2ggdGhlIHVzZXIncyBpbnRlbnRcbiAqXG4gKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIGEgdHJhbnNhY3Rpb24gY29udGFpbnMgYSB0b2tlbiBhcHByb3ZhbCB0aGF0IHRoZSB1c2VyXG4gKiBkaWQgbm90IGludGVuZCB0byBhdXRob3JpemUsIHBvdGVudGlhbGx5IGluZGljYXRpbmcgbWFsaWNpb3VzIGFjdGl2aXR5LlxuICpcbiAqIEBjbGFzcyBUeEludGVudE1pc21hdGNoQXBwcm92YWxFcnJvclxuICogQGV4dGVuZHMge1R4SW50ZW50TWlzbWF0Y2hFcnJvcn1cbiAqIEBwcm9wZXJ0eSB7VG9rZW5BcHByb3ZhbH0gdG9rZW5BcHByb3ZhbCAtIERldGFpbHMgb2YgdGhlIHRva2VuIGFwcHJvdmFsIHRoYXQgZG9lc24ndCBtYXRjaCB1c2VyIGludGVudFxuICovXG5leHBvcnQgY2xhc3MgVHhJbnRlbnRNaXNtYXRjaEFwcHJvdmFsRXJyb3IgZXh0ZW5kcyBUeEludGVudE1pc21hdGNoRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5BcHByb3ZhbDogVG9rZW5BcHByb3ZhbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUeEludGVudE1pc21hdGNoQXBwcm92YWxFcnJvclxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgYXBwcm92YWwgaW50ZW50IG1pc21hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgSVJlcXVlc3RUcmFjZXIgfCB1bmRlZmluZWR9IGlkIC0gVHJhbnNhY3Rpb24gSUQgb3IgcmVxdWVzdCB0cmFjZXJcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblBhcmFtc1tdfSB0eFBhcmFtcyAtIFRyYW5zYWN0aW9uIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIGFuYWx5emVkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB0eEhleCAtIFJhdyB0cmFuc2FjdGlvbiBoZXggc3RyaW5nXG4gICAqIEBwYXJhbSB7VG9rZW5BcHByb3ZhbH0gdG9rZW5BcHByb3ZhbCAtIERldGFpbHMgb2YgdGhlIHRva2VuIGFwcHJvdmFsIHRoYXQgZG9lc24ndCBtYXRjaCB1c2VyIGludGVudFxuICAgKiBAcGFyYW0ge3Vua25vd259IHR4RXhwbGFuYXRpb24gLSBUcmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgSVJlcXVlc3RUcmFjZXIgfCB1bmRlZmluZWQsXG4gICAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zW10sXG4gICAgdHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0b2tlbkFwcHJvdmFsOiBUb2tlbkFwcHJvdmFsLFxuICAgIHR4RXhwbGFuYXRpb24/OiB1bmtub3duXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGlkLCB0eFBhcmFtcywgdHhIZXgsIHR4RXhwbGFuYXRpb24pO1xuICAgIHRoaXMudG9rZW5BcHByb3ZhbCA9IHRva2VuQXBwcm92YWw7XG4gIH1cbn1cbiJdfQ==
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0REFBNEQ7QUFDNUQsa0RBQWtEO0FBQ2xELGtEQUErQztBQU90Qyw2RkFQQSwyQkFBWSxPQU9BO0FBRXJCLE1BQWEscUJBQXNCLFNBQVEsMkJBQVk7SUFDckQsWUFBbUIsT0FBZ0I7UUFDakMsS0FBSyxDQUFDLE9BQU8sSUFBSSxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQUpELHNEQUlDO0FBRUQsTUFBYSxvQkFBcUIsU0FBUSwyQkFBWTtJQUNwRCxZQUFtQixPQUFnQjtRQUNqQyxLQUFLLENBQUMsT0FBTyxJQUFJLHVEQUF1RCxDQUFDLENBQUM7SUFDNUUsQ0FBQztDQUNGO0FBSkQsb0RBSUM7QUFFRCxNQUFhLG9CQUFxQixTQUFRLDJCQUFZO0lBQ3BELFlBQW1CLElBQVk7UUFDN0IsS0FBSyxDQUNILHNCQUFzQixJQUFJLGdLQUFnSyxJQUFJLFNBQVMsQ0FDeE0sQ0FBQztJQUNKLENBQUM7Q0FDRjtBQU5ELG9EQU1DO0FBRUQsTUFBYSwrQkFBZ0MsU0FBUSwyQkFBWTtJQUMvRCxZQUFtQixVQUFrQjtRQUNuQyxLQUFLLENBQ0gsd0RBQXdELFVBQVUsa0lBQWtJLFVBQVUsK0NBQStDLENBQzlQLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFORCwwRUFNQztBQUVELE1BQWEsNkJBQThCLFNBQVEsMkJBQVk7SUFDN0QsWUFBWSxXQUFtQixFQUFFLEtBQXNCO1FBQ3JELEtBQUssQ0FBQyxnQkFBZ0IsV0FBVyxpQ0FBaUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0NBQ0Y7QUFKRCxzRUFJQztBQUVELE1BQWEseUJBQTBCLFNBQVEsMkJBQVk7SUFDekQsWUFBWSxPQUFnQjtRQUMxQixLQUFLLENBQUMsT0FBTyxJQUFJLHNDQUFzQyxDQUFDLENBQUM7SUFDM0Qs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RUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7SUFDbkQsQ0FBQztDQUNGO0FBeEJELHdFQXdCQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsNkJBQThCLFNBQVEscUJBQXFCO0lBR3RFOzs7Ozs7Ozs7T0FTRztJQUNILFlBQ0UsT0FBZSxFQUNmLEVBQXVDLEVBQ3ZDLFFBQTZCLEVBQzdCLEtBQXlCLEVBQ3pCLHFCQUEwQyxFQUMxQyxhQUF1QjtRQUV2QixLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztJQUNyRCxDQUFDO0NBQ0Y7QUF4QkQsc0VBd0JDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSw2QkFBOEIsU0FBUSxxQkFBcUI7SUFHdEU7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFDRSxPQUFlLEVBQ2YsRUFBdUMsRUFDdkMsUUFBNkIsRUFDN0IsS0FBeUIsRUFDekIsYUFBNEIsRUFDNUIsYUFBdUI7UUFFdkIsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztJQUNyQyxDQUFDO0NBQ0Y7QUF4QkQsc0VBd0JDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRGVzY3JpcHRpdmUgZXJyb3IgdHlwZXMgZm9yIGNvbW1vbiBpc3N1ZXMgd2hpY2ggbWF5IGFyaXNlXG4vLyBkdXJpbmcgdGhlIG9wZXJhdGlvbiBvZiBCaXRHb0pTIG9yIEJpdEdvRXhwcmVzc1xuaW1wb3J0IHsgQml0R29Kc0Vycm9yIH0gZnJvbSAnLi4vYml0Z29qc0Vycm9yJztcbmltcG9ydCB7IElSZXF1ZXN0VHJhY2VyIH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uUGFyYW1zIH0gZnJvbSAnLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBJQmFzZUNvaW4gfSBmcm9tICcuL2Jhc2VDb2luL2lCYXNlQ29pbic7XG5pbXBvcnQgeyBTZW5kTWFueU9wdGlvbnMgfSBmcm9tICcuL3dhbGxldCc7XG5cbi8vIHJlLWV4cG9ydCBmb3IgYmFja3dhcmRzIGNvbXBhdFxuZXhwb3J0IHsgQml0R29Kc0Vycm9yIH07XG5cbmV4cG9ydCBjbGFzcyBUbHNDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ1RMUyBpcyBjb25maWd1cmF0aW9uIGlzIGludmFsaWQnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9kZUVudmlyb25tZW50RXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ05PREVfRU5WIGlzIGludmFsaWQgZm9yIHRoZSBjdXJyZW50IGJpdGdvIGVudmlyb25tZW50Jyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkQ29pbkVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvaW46IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgYENvaW4gb3IgdG9rZW4gdHlwZSAke2NvaW59IG5vdCBzdXBwb3J0ZWQgb3Igbm90IGNvbXBpbGVkLiBQbGVhc2UgYmUgc3VyZSB0aGF0IHlvdSBhcmUgdXNpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIEJpdEdvSlMuIElmIHVzaW5nIEBiaXRnby9zZGstYXBpLCBwbGVhc2UgY29uZmlybSB5b3UgaGF2ZSByZWdpc3RlcmVkICR7Y29pbn0gZmlyc3QuYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNhZmVNcGNDZXJlbW9ueVVuc3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IoY29pbkZhbWlseTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgQ2Fubm90IGNyZWF0ZSBXYWxsZXQgU2FmZSByb290IGtleXMgZm9yIGNvaW4gZmFtaWx5ICcke2NvaW5GYW1pbHl9JzogaXRzIFRTUyBzZXR0aW5ncyByZXNvbHZlIHRvIHRoZSBsZWdhY3kgTVBDdjEgY2VyZW1vbnksIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgc2FmZSByb290IHRhZ2dpbmcgKHNhZmVJZCkuIEVuYWJsZSBNUEN2MiBmb3IgJyR7Y29pbkZhbWlseX0nIGJlZm9yZSBjcmVhdGluZyBhIHNhZmUgd2l0aCB0aGlzIHJvb3QgdHlwZS5gXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWRkcmVzc1R5cGVDaGFpbk1pc21hdGNoRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihhZGRyZXNzVHlwZTogc3RyaW5nLCBjaGFpbjogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgc3VwZXIoYGFkZHJlc3MgdHlwZSAke2FkZHJlc3NUeXBlfSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGNoYWluICR7Y2hhaW59YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFAyc2hQMndzaFVuc3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAncDJzaFAyd3NoIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb2luJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFAyd3NoVW5zdXBwb3J0ZWRFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAncDJ3c2ggbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvaW4nKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUDJ0clVuc3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ3AydHIgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvaW4nKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUDJ0ck11c2lnMlVuc3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ3AydHJNdXNpZzIgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvaW4nKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdpbnZhbGlkIGFkZHJlc3MgdHlwZScpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQWRkcmVzc0Vycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdpbnZhbGlkIGFkZHJlc3MnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZEFkZHJlc3NWZXJpZmljYXRpb25PYmplY3RQcm9wZXJ0eUVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZScpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZScpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdhZGRyZXNzIGNoYWluIGFuZC9vciBpbmRleCBhcmUgaW52YWxpZCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXYWxsZXRSZWNvdmVyeVVuc3VwcG9ydGVkIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICd3YWxsZXQgcmVjb3ZlcnkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvaW4nKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAnbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCbG9ja0V4cGxvcmVyVW5hdmFpbGFibGUgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ3RoaXJkLXBhcnR5IGJsb2NrZXhwbG9yZXIgbm90IHJlc3BvbmRpbmcnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZE1lbW9JZEVycm9yIGV4dGVuZHMgSW52YWxpZEFkZHJlc3NFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAnaW52YWxpZCBtZW1vIGlkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRQYXltZW50SWRFcnJvciBleHRlbmRzIEludmFsaWRBZGRyZXNzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ2ludmFsaWQgcGF5bWVudCBpZCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBLZXlSZWNvdmVyeVNlcnZpY2VFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAna2V5IHJlY292ZXJ5IHNlcnZpY2UgZW5jb3VudGVyZWQgYW4gZXJyb3InKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWRkcmVzc0dlbmVyYXRpb25FcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAnYWRkcmVzcyBnZW5lcmF0aW9uIGZhaWxlZCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdGhlcmV1bUxpYnJhcnlVbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhY2thZ2VOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgRXRoZXJldW0gbGlicmFyeSByZXF1aXJlZCBmb3Igb3BlcmF0aW9uIGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBpbnN0YWxsIFwiJHtwYWNrYWdlTmFtZX1cIi5gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RlbGxhckZlZGVyYXRpb25Vc2VyTm90Rm91bmRFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAnYWNjb3VudCBub3QgZm91bmQnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JOb0lucHV0VG9SZWNvdmVyIGV4dGVuZHMgQml0R29Kc0Vycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdObyBpbnB1dCB0byByZWNvdmVyIC0gYWJvcnRpbmchJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRLZXlQYXRoRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3Ioa2V5UGF0aDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYGludmFsaWQga2V5cGF0aDogJHtrZXlQYXRofWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSB8fCAnSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNaXNzaW5nRW5jcnlwdGVkS2V5Y2hhaW5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdObyBlbmNyeXB0ZWQga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbmNvcnJlY3RQYXNzd29yZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgY29kZSA9ICd3YWxsZXRfcGFzc3BocmFzZV9pbmNvcnJlY3QnO1xuICBwdWJsaWMgc3RhdHVzID0gNDAxO1xuICBwdWJsaWMgY2F1c2U/OiB1bmtub3duO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBjYXVzZT86IHVua25vd24pIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICd1bmFibGUgdG8gZGVjcnlwdCBrZXljaGFpbiB3aXRoIHRoZSBnaXZlbiB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIHRoaXMubmFtZSA9ICdJbmNvcnJlY3RQYXNzd29yZEVycm9yJztcbiAgICB0aGlzLmNhdXNlID0gY2F1c2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5lZWRVc2VyU2lnbnVwRXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ1VzZXIgc2lnbnVwIGlzIHJlcXVpcmVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFwaVJlc3BvbnNlRXJyb3I8UmVzcG9uc2VCb2R5VHlwZSA9IGFueT4gZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHN0YXR1czogbnVtYmVyO1xuICByZXN1bHQ/OiBSZXNwb25zZUJvZHlUeXBlO1xuICBpbnZhbGlkVG9rZW4/OiBib29sZWFuO1xuICBuZWVkc09UUD86IGJvb2xlYW47XG4gIC8vIEVjaG9lZCBiYWNrIHZpYSB0aGUgYFJlcXVlc3QtSURgIHJlc3BvbnNlIGhlYWRlciAoc2VlIGxvZ2dpbmctZXhwcmVzcydzIGBiZWdpbkxvZ2dpbmdgKSxcbiAgLy8gc28gaXQgY2FuIGJlIHVzZWQgdG8gY29ycmVsYXRlIHRoaXMgZXJyb3Igd2l0aCB0aGUgc2VydmVyLXNpZGUgcmVxdWVzdCBsb2dzLlxuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBzdGF0dXM6IG51bWJlcixcbiAgICByZXN1bHQ/OiBSZXNwb25zZUJvZHlUeXBlLFxuICAgIGludmFsaWRUb2tlbj86IGJvb2xlYW4sXG4gICAgbmVlZHNPVFA/OiBib29sZWFuLFxuICAgIHJlcXVlc3RJZD86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgIHRoaXMuaW52YWxpZFRva2VuID0gaW52YWxpZFRva2VuO1xuICAgIHRoaXMubmVlZHNPVFAgPSBuZWVkc09UUDtcbiAgICB0aGlzLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgfVxufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgdG9rZW4gYXBwcm92YWwgaW5mb3JtYXRpb24gdXNlZCBpbiBzdXNwaWNpb3VzIHRyYW5zYWN0aW9uIGRldGVjdGlvblxuICpcbiAqIEBpbnRlcmZhY2UgVG9rZW5BcHByb3ZhbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0b2tlbk5hbWVdIC0gT3B0aW9uYWwgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0b2tlbkFkZHJlc3MgLSBUaGUgY29udHJhY3QgYWRkcmVzcyBvZiB0aGUgdG9rZW4gYmVpbmcgYXBwcm92ZWRcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBhdXRob3JpemluZ0Ftb3VudCAtIFRoZSBhbW91bnQgYmVpbmcgYXV0aG9yaXplZCBmb3Igc3BlbmRpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdXRob3JpemluZ0FkZHJlc3MgLSBUaGUgYWRkcmVzcyBiZWluZyBhdXRob3JpemVkIHRvIHNwZW5kIHRoZSB0b2tlbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb2tlbkFwcHJvdmFsIHtcbiAgdG9rZW5OYW1lPzogc3RyaW5nO1xuICB0b2tlbkFkZHJlc3M6IHN0cmluZztcbiAgYXV0aG9yaXppbmdBbW91bnQ6IHsgdHlwZTogJ3VubGltaXRlZCcgfSB8IHsgdHlwZTogJ2xpbWl0ZWQnOyBhbW91bnQ6IG51bWJlciB9O1xuICBhdXRob3JpemluZ0FkZHJlc3M6IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIG1pc21hdGNoZWQgcmVjaXBpZW50IGluZm9ybWF0aW9uIGRldGVjdGVkIGR1cmluZyB0cmFuc2FjdGlvbiB2ZXJpZmljYXRpb25cbiAqXG4gKiBAaW50ZXJmYWNlIE1pc21hdGNoZWRSZWNpcGllbnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhZGRyZXNzIC0gVGhlIHJlY2lwaWVudCBhZGRyZXNzIHRoYXQgd2FzIGZvdW5kIGluIHRoZSB0cmFuc2FjdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFtb3VudCAtIFRoZSBhbW91bnQgYmVpbmcgc2VudCB0byB0aGlzIHJlY2lwaWVudFxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBUb2tlblRyYW5zZmVyUmVjaXBpZW50UGFyYW1zfSBbZGF0YV0gLSBPcHRpb25hbCB0cmFuc2FjdGlvbiBkYXRhIG9yIHRva2VuIHRyYW5zZmVyIHBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdG9rZW5OYW1lXSAtIE9wdGlvbmFsIG5hbWUgb2YgdGhlIHRva2VuIGJlaW5nIHRyYW5zZmVycmVkXG4gKiBAcHJvcGVydHkge1Rva2VuVHJhbnNmZXJSZWNpcGllbnRQYXJhbXN9IFt0b2tlbkRhdGFdIC0gT3B0aW9uYWwgc3RydWN0dXJlZCB0b2tlbiB0cmFuc2ZlciBkYXRhXG4gKi9cbmV4cG9ydCB0eXBlIE1pc21hdGNoZWRSZWNpcGllbnQgPSBOb25OdWxsYWJsZTxTZW5kTWFueU9wdGlvbnNbJ3JlY2lwaWVudHMnXT5bMF07XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBjb250cmFjdCBpbnRlcmFjdGlvbiBkYXRhIHBheWxvYWQgdXNlZCBpbiBzdXNwaWNpb3VzIHRyYW5zYWN0aW9uIGRldGVjdGlvblxuICpcbiAqIEBpbnRlcmZhY2UgQ29udHJhY3REYXRhUGF5bG9hZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFkZHJlc3MgLSBUaGUgY29udHJhY3QgYWRkcmVzcyBiZWluZyBpbnRlcmFjdGVkIHdpdGhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByYXdDb250cmFjdFBheWxvYWQgLSBUaGUgcmF3IGNvbnRyYWN0IHBheWxvYWQgaW4gc2VyaWFsaXplZCBmb3JtIHNwZWNpZmljIHRvIHRoZSBibG9ja2NoYWluXG4gKiBAcHJvcGVydHkge3Vua25vd259IGRlY29kZWRDb250cmFjdFBheWxvYWQgLSBUaGUgZGVjb2RlZCBjb250cmFjdCBwYXlsb2FkLCBzdHJ1Y3R1cmUgdmFyaWVzIGJ5IGNvaW4vY2hhaW4gaW1wbGVtZW50YXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cmFjdERhdGFQYXlsb2FkIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICAvLyBUaGUgcmF3IGNvbnRyYWN0IHBheWxvYWQgaW4gc2VyaWFsaXplZCBmb3JtIG9mIHRoZSBjaGFpblxuICByYXdDb250cmFjdFBheWxvYWQ6IHN0cmluZztcbiAgLy8gVG8gYmUgZGVmaW5lZCBvbiBhIHBlci1jb2luIGJhc2lzXG4gIGRlY29kZWRDb250cmFjdFBheWxvYWQ6IHVua25vd247XG59XG5cbi8qKlxuICogQmFzZSBlcnJvciBjbGFzcyBmb3IgdHJhbnNhY3Rpb24gaW50ZW50IG1pc21hdGNoIGRldGVjdGlvblxuICpcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtYXRjaCB0aGUgdXNlcidzIG9yaWdpbmFsIGludGVudCxcbiAqIGluZGljYXRpbmcgcG90ZW50aWFsIHNlY3VyaXR5IGlzc3VlcyBvciBtYWxpY2lvdXMgbW9kaWZpY2F0aW9ucy5cbiAqXG4gKiBAY2xhc3MgVHhJbnRlbnRNaXNtYXRjaEVycm9yXG4gKiBAZXh0ZW5kcyB7Qml0R29Kc0Vycm9yfVxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBJUmVxdWVzdFRyYWNlciB8IHVuZGVmaW5lZH0gaWQgLSBUcmFuc2FjdGlvbiBJRCBvciByZXF1ZXN0IHRyYWNlciBmb3IgdHJhY2tpbmdcbiAqIEBwcm9wZXJ0eSB7VHJhbnNhY3Rpb25QYXJhbXNbXX0gdHhQYXJhbXMgLSBBcnJheSBvZiB0cmFuc2FjdGlvbiBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhbmFseXplZFxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IHR4SGV4IC0gVGhlIHJhdyB0cmFuc2FjdGlvbiBpbiBoZXhhZGVjaW1hbCBmb3JtYXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB0eEV4cGxhbmF0aW9uIC0gU3RyaW5naWZpZWQgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFR4SW50ZW50TWlzbWF0Y2hFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nIHwgSVJlcXVlc3RUcmFjZXIgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXNbXTtcbiAgcHVibGljIHJlYWRvbmx5IHR4SGV4OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSB0eEV4cGxhbmF0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVHhJbnRlbnRNaXNtYXRjaEVycm9yXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBpbnRlbnQgbWlzbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBJUmVxdWVzdFRyYWNlciB8IHVuZGVmaW5lZH0gaWQgLSBUcmFuc2FjdGlvbiBJRCBvciByZXF1ZXN0IHRyYWNlclxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uUGFyYW1zW119IHR4UGFyYW1zIC0gVHJhbnNhY3Rpb24gcGFyYW1ldGVycyB0aGF0IHdlcmUgYW5hbHl6ZWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHR4SGV4IC0gUmF3IHRyYW5zYWN0aW9uIGhleCBzdHJpbmdcbiAgICogQHBhcmFtIHt1bmtub3dufSB0eEV4cGxhbmF0aW9uIC0gVHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IElSZXF1ZXN0VHJhY2VyIHwgdW5kZWZpbmVkLFxuICAgIHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtc1tdLFxuICAgIHR4SGV4OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdHhFeHBsYW5hdGlvbj86IHVua25vd25cbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMudHhQYXJhbXMgPSB0eFBhcmFtcztcbiAgICB0aGlzLnR4SGV4ID0gdHhIZXg7XG4gICAgdGhpcy50eEV4cGxhbmF0aW9uID0gdHhFeHBsYW5hdGlvbiA/IFR4SW50ZW50TWlzbWF0Y2hFcnJvci5zYWZlU3RyaW5naWZ5KHR4RXhwbGFuYXRpb24pIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhZmVseSBzdHJpbmdpZnkgYSB2YWx1ZSB3aXRoIEJpZ0ludCBzdXBwb3J0XG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHN0cmluZ2lmeVxuICAgKiBAcmV0dXJucyBKU09OIHN0cmluZyB3aXRoIEJpZ0ludHMgY29udmVydGVkIHRvIHN0cmluZ3NcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNhZmVTdHJpbmdpZnkodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgKF8sIHYpID0+ICh0eXBlb2YgdiA9PT0gJ2JpZ2ludCcgPyB2LnRvU3RyaW5nKCkgOiB2KSwgMik7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGdldCB0cmFuc2FjdGlvbiBleHBsYW5hdGlvbiBmcm9tIGEgY29pbidzIGV4cGxhaW5UcmFuc2FjdGlvbiBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBjb2luIC0gQ29pbiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcgSUJhc2VDb2luXG4gICAqIEBwYXJhbSB0eFByZWJ1aWxkIC0gVHJhbnNhY3Rpb24gcHJlYnVpbGQgY29udGFpbmluZyB0eEhleCBhbmQgdHhJbmZvXG4gICAqIEByZXR1cm5zIFRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uIG9iamVjdCBvciB1bmRlZmluZWRcbiAgICovXG4gIHN0YXRpYyBhc3luYyB0cnlHZXRUeEV4cGxhbmF0aW9uKFxuICAgIGNvaW46IElCYXNlQ29pbixcbiAgICB0eFByZWJ1aWxkOiB7IHR4SGV4Pzogc3RyaW5nOyB0eEluZm8/OiB1bmtub3duIH1cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogdHhQcmVidWlsZC50eEhleCxcbiAgICAgICAgdHhJbmZvOiB0eFByZWJ1aWxkLnR4SW5mbyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiAnRmFpbGVkIHRvIHBhcnNlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uJyxcbiAgICAgICAgdHhIZXg6IHR4UHJlYnVpbGQudHhIZXgsXG4gICAgICAgIGRldGFpbHM6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdHJhbnNhY3Rpb24gcmVjaXBpZW50cyBkb24ndCBtYXRjaCB0aGUgdXNlcidzIGludGVudFxuICpcbiAqIFRoaXMgZXJyb3Igb2NjdXJzIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGNvbnRhaW5zIHJlY2lwaWVudHMgb3IgYW1vdW50cyB0aGF0IGRpZmZlclxuICogZnJvbSB3aGF0IHRoZSB1c2VyIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gc2VuZC5cbiAqXG4gKiBAY2xhc3MgVHhJbnRlbnRNaXNtYXRjaFJlY2lwaWVudEVycm9yXG4gKiBAZXh0ZW5kcyB7VHhJbnRlbnRNaXNtYXRjaEVycm9yfVxuICogQHByb3BlcnR5IHtNaXNtYXRjaGVkUmVjaXBpZW50W119IG1pc21hdGNoZWRSZWNpcGllbnRzIC0gQXJyYXkgb2YgcmVjaXBpZW50cyB0aGF0IGRvbid0IG1hdGNoIHVzZXIgaW50ZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBUeEludGVudE1pc21hdGNoUmVjaXBpZW50RXJyb3IgZXh0ZW5kcyBUeEludGVudE1pc21hdGNoRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgbWlzbWF0Y2hlZFJlY2lwaWVudHM6IE1pc21hdGNoZWRSZWNpcGllbnRbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUeEludGVudE1pc21hdGNoUmVjaXBpZW50RXJyb3JcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHJlY2lwaWVudCBpbnRlbnQgbWlzbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBJUmVxdWVzdFRyYWNlciB8IHVuZGVmaW5lZH0gaWQgLSBUcmFuc2FjdGlvbiBJRCBvciByZXF1ZXN0IHRyYWNlclxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uUGFyYW1zW119IHR4UGFyYW1zIC0gVHJhbnNhY3Rpb24gcGFyYW1ldGVycyB0aGF0IHdlcmUgYW5hbHl6ZWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHR4SGV4IC0gUmF3IHRyYW5zYWN0aW9uIGhleCBzdHJpbmdcbiAgICogQHBhcmFtIHtNaXNtYXRjaGVkUmVjaXBpZW50W119IG1pc21hdGNoZWRSZWNpcGllbnRzIC0gQXJyYXkgb2YgcmVjaXBpZW50cyB0aGF0IGRvbid0IG1hdGNoIHVzZXIgaW50ZW50XG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdHhFeHBsYW5hdGlvbiAtIFRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBJUmVxdWVzdFRyYWNlciB8IHVuZGVmaW5lZCxcbiAgICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXNbXSxcbiAgICB0eEhleDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG1pc21hdGNoZWRSZWNpcGllbnRzOiBNaXNtYXRjaGVkUmVjaXBpZW50W10sXG4gICAgdHhFeHBsYW5hdGlvbj86IHVua25vd25cbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgaWQsIHR4UGFyYW1zLCB0eEhleCwgdHhFeHBsYW5hdGlvbik7XG4gICAgdGhpcy5taXNtYXRjaGVkUmVjaXBpZW50cyA9IG1pc21hdGNoZWRSZWNpcGllbnRzO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gY29udHJhY3QgaW50ZXJhY3Rpb24gZG9lc24ndCBtYXRjaCB0aGUgdXNlcidzIGludGVudFxuICpcbiAqIFRoaXMgZXJyb3Igb2NjdXJzIHdoZW4gYSB0cmFuc2FjdGlvbiBpbnRlcmFjdHMgd2l0aCBhIHNtYXJ0IGNvbnRyYWN0IGJ1dCB0aGVcbiAqIGNvbnRyYWN0IGNhbGwgZGF0YSBvciBtZXRob2QgZG9lc24ndCBtYXRjaCB3aGF0IHRoZSB1c2VyIGludGVuZGVkLlxuICpcbiAqIEBjbGFzcyBUeEludGVudE1pc21hdGNoQ29udHJhY3RFcnJvclxuICogQGV4dGVuZHMge1R4SW50ZW50TWlzbWF0Y2hFcnJvcn1cbiAqIEBwcm9wZXJ0eSB7Q29udHJhY3REYXRhUGF5bG9hZH0gbWlzbWF0Y2hlZERhdGFQYXlsb2FkIC0gVGhlIGNvbnRyYWN0IGludGVyYWN0aW9uIGRhdGEgdGhhdCBkb2Vzbid0IG1hdGNoIHVzZXIgaW50ZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBUeEludGVudE1pc21hdGNoQ29udHJhY3RFcnJvciBleHRlbmRzIFR4SW50ZW50TWlzbWF0Y2hFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBtaXNtYXRjaGVkRGF0YVBheWxvYWQ6IENvbnRyYWN0RGF0YVBheWxvYWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVHhJbnRlbnRNaXNtYXRjaENvbnRyYWN0RXJyb3JcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGNvbnRyYWN0IGludGVudCBtaXNtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IElSZXF1ZXN0VHJhY2VyIHwgdW5kZWZpbmVkfSBpZCAtIFRyYW5zYWN0aW9uIElEIG9yIHJlcXVlc3QgdHJhY2VyXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25QYXJhbXNbXX0gdHhQYXJhbXMgLSBUcmFuc2FjdGlvbiBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhbmFseXplZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdHhIZXggLSBSYXcgdHJhbnNhY3Rpb24gaGV4IHN0cmluZ1xuICAgKiBAcGFyYW0ge0NvbnRyYWN0RGF0YVBheWxvYWR9IG1pc21hdGNoZWREYXRhUGF5bG9hZCAtIFRoZSBjb250cmFjdCBpbnRlcmFjdGlvbiBkYXRhIHRoYXQgZG9lc24ndCBtYXRjaCB1c2VyIGludGVudFxuICAgKiBAcGFyYW0ge3Vua25vd259IHR4RXhwbGFuYXRpb24gLSBUcmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgSVJlcXVlc3RUcmFjZXIgfCB1bmRlZmluZWQsXG4gICAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zW10sXG4gICAgdHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBtaXNtYXRjaGVkRGF0YVBheWxvYWQ6IENvbnRyYWN0RGF0YVBheWxvYWQsXG4gICAgdHhFeHBsYW5hdGlvbj86IHVua25vd25cbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgaWQsIHR4UGFyYW1zLCB0eEhleCwgdHhFeHBsYW5hdGlvbik7XG4gICAgdGhpcy5taXNtYXRjaGVkRGF0YVBheWxvYWQgPSBtaXNtYXRjaGVkRGF0YVBheWxvYWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0b2tlbiBhcHByb3ZhbCBkb2Vzbid0IG1hdGNoIHRoZSB1c2VyJ3MgaW50ZW50XG4gKlxuICogVGhpcyBlcnJvciBvY2N1cnMgd2hlbiBhIHRyYW5zYWN0aW9uIGNvbnRhaW5zIGEgdG9rZW4gYXBwcm92YWwgdGhhdCB0aGUgdXNlclxuICogZGlkIG5vdCBpbnRlbmQgdG8gYXV0aG9yaXplLCBwb3RlbnRpYWxseSBpbmRpY2F0aW5nIG1hbGljaW91cyBhY3Rpdml0eS5cbiAqXG4gKiBAY2xhc3MgVHhJbnRlbnRNaXNtYXRjaEFwcHJvdmFsRXJyb3JcbiAqIEBleHRlbmRzIHtUeEludGVudE1pc21hdGNoRXJyb3J9XG4gKiBAcHJvcGVydHkge1Rva2VuQXBwcm92YWx9IHRva2VuQXBwcm92YWwgLSBEZXRhaWxzIG9mIHRoZSB0b2tlbiBhcHByb3ZhbCB0aGF0IGRvZXNuJ3QgbWF0Y2ggdXNlciBpbnRlbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFR4SW50ZW50TWlzbWF0Y2hBcHByb3ZhbEVycm9yIGV4dGVuZHMgVHhJbnRlbnRNaXNtYXRjaEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IHRva2VuQXBwcm92YWw6IFRva2VuQXBwcm92YWw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVHhJbnRlbnRNaXNtYXRjaEFwcHJvdmFsRXJyb3JcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGFwcHJvdmFsIGludGVudCBtaXNtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IElSZXF1ZXN0VHJhY2VyIHwgdW5kZWZpbmVkfSBpZCAtIFRyYW5zYWN0aW9uIElEIG9yIHJlcXVlc3QgdHJhY2VyXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25QYXJhbXNbXX0gdHhQYXJhbXMgLSBUcmFuc2FjdGlvbiBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhbmFseXplZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdHhIZXggLSBSYXcgdHJhbnNhY3Rpb24gaGV4IHN0cmluZ1xuICAgKiBAcGFyYW0ge1Rva2VuQXBwcm92YWx9IHRva2VuQXBwcm92YWwgLSBEZXRhaWxzIG9mIHRoZSB0b2tlbiBhcHByb3ZhbCB0aGF0IGRvZXNuJ3QgbWF0Y2ggdXNlciBpbnRlbnRcbiAgICogQHBhcmFtIHt1bmtub3dufSB0eEV4cGxhbmF0aW9uIC0gVHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IElSZXF1ZXN0VHJhY2VyIHwgdW5kZWZpbmVkLFxuICAgIHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtc1tdLFxuICAgIHR4SGV4OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdG9rZW5BcHByb3ZhbDogVG9rZW5BcHByb3ZhbCxcbiAgICB0eEV4cGxhbmF0aW9uPzogdW5rbm93blxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBpZCwgdHhQYXJhbXMsIHR4SGV4LCB0eEV4cGxhbmF0aW9uKTtcbiAgICB0aGlzLnRva2VuQXBwcm92YWwgPSB0b2tlbkFwcHJvdmFsO1xuICB9XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC"}
|
|
@@ -17,7 +17,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./derivableEd25519Pub"), exports);
|
|
18
18
|
__exportStar(require("./iSafe"), exports);
|
|
19
19
|
__exportStar(require("./iSafes"), exports);
|
|
20
|
+
__exportStar(require("./recovery"), exports);
|
|
20
21
|
__exportStar(require("./safe"), exports);
|
|
21
22
|
__exportStar(require("./safes"), exports);
|
|
22
23
|
__exportStar(require("@bitgo/sdk-lib-safes"), exports);
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsd0RBQXNDO0FBQ3RDLDBDQUF3QjtBQUN4QiwyQ0FBeUI7QUFDekIsNkNBQTJCO0FBQzNCLHlDQUF1QjtBQUN2QiwwQ0FBd0I7QUFDeEIsdURBQXFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kZXJpdmFibGVFZDI1NTE5UHViJztcbmV4cG9ydCAqIGZyb20gJy4vaVNhZmUnO1xuZXhwb3J0ICogZnJvbSAnLi9pU2FmZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWNvdmVyeSc7XG5leHBvcnQgKiBmcm9tICcuL3NhZmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zYWZlcyc7XG5leHBvcnQgKiBmcm9tICdAYml0Z28vc2RrLWxpYi1zYWZlcyc7XG4iXX0=
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @prettier
|
|
3
|
+
*
|
|
4
|
+
* @experimental WRW-facing safe recovery entry points.
|
|
5
|
+
*/
|
|
6
|
+
import { Buffer } from 'buffer';
|
|
7
|
+
import type { RootKeyType } from '@bitgo/public-types';
|
|
8
|
+
import { BitGoBase } from '../bitgoBase';
|
|
9
|
+
export type DecryptedMpcSafeRoot = {
|
|
10
|
+
signing: Buffer;
|
|
11
|
+
vrf: Buffer;
|
|
12
|
+
};
|
|
13
|
+
export type OnchainSafeRoot = {
|
|
14
|
+
user: string;
|
|
15
|
+
backup: string;
|
|
16
|
+
bitgo: string;
|
|
17
|
+
};
|
|
18
|
+
export type MpcSafeRoot = {
|
|
19
|
+
user: DecryptedMpcSafeRoot;
|
|
20
|
+
backup: DecryptedMpcSafeRoot;
|
|
21
|
+
bitgo: string;
|
|
22
|
+
};
|
|
23
|
+
export type Secp256k1MultisigChildKeys = {
|
|
24
|
+
user: {
|
|
25
|
+
prv: string;
|
|
26
|
+
pub: string;
|
|
27
|
+
};
|
|
28
|
+
backup: {
|
|
29
|
+
prv: string;
|
|
30
|
+
pub: string;
|
|
31
|
+
};
|
|
32
|
+
bitgo: {
|
|
33
|
+
pub: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export type EcdsaMpcChildKeys = {
|
|
37
|
+
commonKeychain: string;
|
|
38
|
+
user: string;
|
|
39
|
+
backup: string;
|
|
40
|
+
};
|
|
41
|
+
export type DerivedSafeWalletKeys = {
|
|
42
|
+
slot: 'secp256k1Multisig';
|
|
43
|
+
path: string;
|
|
44
|
+
keys: Secp256k1MultisigChildKeys;
|
|
45
|
+
} | {
|
|
46
|
+
slot: 'ecdsaMpc';
|
|
47
|
+
path: string;
|
|
48
|
+
keys: EcdsaMpcChildKeys;
|
|
49
|
+
};
|
|
50
|
+
export type SafeRecoverKeyParams = {
|
|
51
|
+
userKey: string;
|
|
52
|
+
backupKey: string;
|
|
53
|
+
bitgoKey: string;
|
|
54
|
+
walletPassphrase?: string;
|
|
55
|
+
};
|
|
56
|
+
export type DecryptedSafeRoots = {
|
|
57
|
+
secp256k1Multisig: OnchainSafeRoot;
|
|
58
|
+
ed25519Multisig: OnchainSafeRoot;
|
|
59
|
+
ecdsaMpc: MpcSafeRoot;
|
|
60
|
+
eddsaMpc: MpcSafeRoot;
|
|
61
|
+
};
|
|
62
|
+
export declare function decryptSafeKeycard(params: {
|
|
63
|
+
bitgo: BitGoBase;
|
|
64
|
+
userKeyBox: string;
|
|
65
|
+
backupKeyBox: string;
|
|
66
|
+
bitgoKeyBox: string;
|
|
67
|
+
password: string;
|
|
68
|
+
}): Promise<DecryptedSafeRoots>;
|
|
69
|
+
/**
|
|
70
|
+
* Derives a Safe wallet's child keys at the BIP44 path for a given slot and account.
|
|
71
|
+
* Only `secp256k1Multisig` (slot 1) is supported for now; the remaining slots throw
|
|
72
|
+
* until their derivation arms land (WCN-2736/WCN-2737/WCN-2894).
|
|
73
|
+
*/
|
|
74
|
+
export declare function deriveSafeWalletKeys(params: {
|
|
75
|
+
coin: string;
|
|
76
|
+
slot: RootKeyType;
|
|
77
|
+
account: number;
|
|
78
|
+
roots: DecryptedSafeRoots;
|
|
79
|
+
}): Promise<DerivedSafeWalletKeys>;
|
|
80
|
+
/**
|
|
81
|
+
* Builds the key fields `coin.recover()` expects from derived Safe child keys.
|
|
82
|
+
* Only `secp256k1Multisig` (slot 1) is supported for now. Signed mode re-encrypts the
|
|
83
|
+
* child xprvs under a fresh ephemeral passphrase (v1/SJCL); unsigned mode returns pubs.
|
|
84
|
+
*/
|
|
85
|
+
export declare function buildSafeRecoverKeyParams(params: {
|
|
86
|
+
bitgo: BitGoBase;
|
|
87
|
+
coin: string;
|
|
88
|
+
slot: RootKeyType;
|
|
89
|
+
keys: Secp256k1MultisigChildKeys;
|
|
90
|
+
mode: 'signed' | 'unsigned';
|
|
91
|
+
}): Promise<SafeRecoverKeyParams>;
|
|
92
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/recovery.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,MAAM,MAAM,oBAAoB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9E,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtG,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,0BAA0B,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iBAAiB,EAAE,eAAe,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6C9B;AAUD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,kBAAkB,CAAC;CAC3B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAmDjC;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IACtD,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,0BAA0B,CAAC;IACjC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC7B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAgChC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decryptSafeKeycard = decryptSafeKeycard;
|
|
4
|
+
exports.deriveSafeWalletKeys = deriveSafeWalletKeys;
|
|
5
|
+
exports.buildSafeRecoverKeyParams = buildSafeRecoverKeyParams;
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const utxo_lib_1 = require("@bitgo/utxo-lib");
|
|
8
|
+
const statics_1 = require("@bitgo/statics");
|
|
9
|
+
const sdk_lib_safes_1 = require("@bitgo/sdk-lib-safes");
|
|
10
|
+
const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
|
|
11
|
+
const errors_1 = require("../errors");
|
|
12
|
+
const keyShareEnvelope_1 = require("../utils/tss/keyShareEnvelope");
|
|
13
|
+
async function decryptSafeKeycard(params) {
|
|
14
|
+
const { bitgo, userKeyBox, backupKeyBox, bitgoKeyBox, password } = params;
|
|
15
|
+
const userRoots = (0, sdk_lib_safes_1.parseSafeKeycardBox)(userKeyBox);
|
|
16
|
+
const backupRoots = (0, sdk_lib_safes_1.parseSafeKeycardBox)(backupKeyBox);
|
|
17
|
+
const bitgoRoots = (0, sdk_lib_safes_1.parseSafeKeycardBox)(bitgoKeyBox);
|
|
18
|
+
const decryptRoot = async (root) => {
|
|
19
|
+
try {
|
|
20
|
+
return await bitgo.decrypt({ input: root, password });
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
throw new errors_1.IncorrectPasswordError('unable to decrypt the safe keycard with the provided password', e);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const unwrapMpcRoot = (decrypted) => {
|
|
27
|
+
try {
|
|
28
|
+
return (0, keyShareEnvelope_1.parseSafeMpcKeyEnvelopes)(decrypted);
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
throw new errors_1.IncorrectPasswordError('unable to decrypt the safe keycard with the provided password', e);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
secp256k1Multisig: {
|
|
36
|
+
user: await decryptRoot(userRoots.secp256k1Multisig),
|
|
37
|
+
backup: await decryptRoot(backupRoots.secp256k1Multisig),
|
|
38
|
+
bitgo: bitgoRoots.secp256k1Multisig,
|
|
39
|
+
},
|
|
40
|
+
ed25519Multisig: {
|
|
41
|
+
user: await decryptRoot(userRoots.ed25519Multisig),
|
|
42
|
+
backup: await decryptRoot(backupRoots.ed25519Multisig),
|
|
43
|
+
bitgo: bitgoRoots.ed25519Multisig,
|
|
44
|
+
},
|
|
45
|
+
ecdsaMpc: {
|
|
46
|
+
user: unwrapMpcRoot(await decryptRoot(userRoots.ecdsaMpc)),
|
|
47
|
+
backup: unwrapMpcRoot(await decryptRoot(backupRoots.ecdsaMpc)),
|
|
48
|
+
bitgo: bitgoRoots.ecdsaMpc,
|
|
49
|
+
},
|
|
50
|
+
eddsaMpc: {
|
|
51
|
+
user: unwrapMpcRoot(await decryptRoot(userRoots.eddsaMpc)),
|
|
52
|
+
backup: unwrapMpcRoot(await decryptRoot(backupRoots.eddsaMpc)),
|
|
53
|
+
bitgo: bitgoRoots.eddsaMpc,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function buildSafeUserPath(coinType, slotOrdinal, account) {
|
|
58
|
+
return `m/44'/${coinType}'/${slotOrdinal}'/${account}'`;
|
|
59
|
+
}
|
|
60
|
+
function buildSafeCosignerPath(coinType, slotOrdinal, account) {
|
|
61
|
+
return `m/44/${coinType}/${slotOrdinal}/${account}`;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Derives a Safe wallet's child keys at the BIP44 path for a given slot and account.
|
|
65
|
+
* Only `secp256k1Multisig` (slot 1) is supported for now; the remaining slots throw
|
|
66
|
+
* until their derivation arms land (WCN-2736/WCN-2737/WCN-2894).
|
|
67
|
+
*/
|
|
68
|
+
async function deriveSafeWalletKeys(params) {
|
|
69
|
+
if (!Number.isInteger(params.account) || params.account < 0 || params.account > statics_1.MAX_BIP32_INDEX) {
|
|
70
|
+
throw new Error(`deriveSafeWalletKeys: invalid account '${params.account}'`);
|
|
71
|
+
}
|
|
72
|
+
const coinType = statics_1.coins.get(params.coin).bip44CoinType;
|
|
73
|
+
if (coinType === undefined) {
|
|
74
|
+
throw new Error(`Coin '${params.coin}' has no BIP44 coin type and cannot derive a safe child`);
|
|
75
|
+
}
|
|
76
|
+
const slotOrdinal = statics_1.SAFE_ROOT_SLOT_ORDINALS[params.slot];
|
|
77
|
+
const { account, roots } = params;
|
|
78
|
+
if (params.slot === 'secp256k1Multisig') {
|
|
79
|
+
const root = roots.secp256k1Multisig;
|
|
80
|
+
const user = utxo_lib_1.bip32.fromBase58(root.user).derivePath(buildSafeUserPath(coinType, slotOrdinal, account));
|
|
81
|
+
const backup = utxo_lib_1.bip32.fromBase58(root.backup).derivePath(buildSafeCosignerPath(coinType, slotOrdinal, account));
|
|
82
|
+
const bitgo = utxo_lib_1.bip32.fromBase58(root.bitgo).derivePath(buildSafeCosignerPath(coinType, slotOrdinal, account));
|
|
83
|
+
if (!user.privateKey || !backup.privateKey) {
|
|
84
|
+
throw new Error('deriveSafeWalletKeys: user and backup roots must be private (xprv)');
|
|
85
|
+
}
|
|
86
|
+
if (bitgo.privateKey) {
|
|
87
|
+
throw new Error('deriveSafeWalletKeys: bitgo root must be public (xpub)');
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
slot: 'secp256k1Multisig',
|
|
91
|
+
path: buildSafeUserPath(coinType, slotOrdinal, account),
|
|
92
|
+
keys: {
|
|
93
|
+
user: { prv: user.toBase58(), pub: user.neutered().toBase58() },
|
|
94
|
+
backup: { prv: backup.toBase58(), pub: backup.neutered().toBase58() },
|
|
95
|
+
bitgo: { pub: bitgo.neutered().toBase58() },
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (params.slot === 'ecdsaMpc') {
|
|
100
|
+
const { commonKeychain, userChild, backupChild } = await sdk_lib_mpc_1.DklsVrfUtils.deriveSafeEcdsaMpcChild({
|
|
101
|
+
userRoot: roots.ecdsaMpc.user,
|
|
102
|
+
backupRoot: roots.ecdsaMpc.backup,
|
|
103
|
+
account,
|
|
104
|
+
coinType,
|
|
105
|
+
});
|
|
106
|
+
return {
|
|
107
|
+
slot: 'ecdsaMpc',
|
|
108
|
+
path: buildSafeUserPath(coinType, slotOrdinal, account),
|
|
109
|
+
keys: { commonKeychain, user: userChild, backup: backupChild },
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
throw new Error(`deriveSafeWalletKeys: slot '${params.slot}' is not supported yet`);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Builds the key fields `coin.recover()` expects from derived Safe child keys.
|
|
116
|
+
* Only `secp256k1Multisig` (slot 1) is supported for now. Signed mode re-encrypts the
|
|
117
|
+
* child xprvs under a fresh ephemeral passphrase (v1/SJCL); unsigned mode returns pubs.
|
|
118
|
+
*/
|
|
119
|
+
async function buildSafeRecoverKeyParams(params) {
|
|
120
|
+
if (params.slot !== 'secp256k1Multisig') {
|
|
121
|
+
throw new Error(`buildSafeRecoverKeyParams: slot '${params.slot}' is not supported yet`);
|
|
122
|
+
}
|
|
123
|
+
const { bitgo, keys, mode } = params;
|
|
124
|
+
if (mode === 'unsigned') {
|
|
125
|
+
return {
|
|
126
|
+
userKey: keys.user.pub,
|
|
127
|
+
backupKey: keys.backup.pub,
|
|
128
|
+
bitgoKey: keys.bitgo.pub,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const userPrv = utxo_lib_1.bip32.fromBase58(keys.user.prv);
|
|
132
|
+
const backupPrv = utxo_lib_1.bip32.fromBase58(keys.backup.prv);
|
|
133
|
+
if (!userPrv.privateKey || !backupPrv.privateKey) {
|
|
134
|
+
throw new Error('buildSafeRecoverKeyParams: keys.user.prv and keys.backup.prv must be private xprvs');
|
|
135
|
+
}
|
|
136
|
+
const walletPassphrase = (0, crypto_1.randomBytes)(32).toString('hex');
|
|
137
|
+
const [userKey, backupKey] = await Promise.all([
|
|
138
|
+
bitgo.encrypt({ input: keys.user.prv, password: walletPassphrase, encryptionVersion: 1 }),
|
|
139
|
+
bitgo.encrypt({ input: keys.backup.prv, password: walletPassphrase, encryptionVersion: 1 }),
|
|
140
|
+
]);
|
|
141
|
+
return {
|
|
142
|
+
userKey,
|
|
143
|
+
backupKey,
|
|
144
|
+
bitgoKey: keys.bitgo.pub,
|
|
145
|
+
walletPassphrase,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1EQSxnREFtREM7QUFlRCxvREF3REM7QUFPRCw4REFzQ0M7QUFwTkQsbUNBQXFDO0FBQ3JDLDhDQUF3QztBQUN4Qyw0Q0FBaUY7QUFFakYsd0RBQTJEO0FBQzNELG9EQUFrRDtBQUVsRCxzQ0FBbUQ7QUFDbkQsb0VBQXlFO0FBcUNsRSxLQUFLLFVBQVUsa0JBQWtCLENBQUMsTUFNeEM7SUFDQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUUxRSxNQUFNLFNBQVMsR0FBRyxJQUFBLG1DQUFtQixFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sV0FBVyxHQUFHLElBQUEsbUNBQW1CLEVBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEQsTUFBTSxVQUFVLEdBQUcsSUFBQSxtQ0FBbUIsRUFBQyxXQUFXLENBQUMsQ0FBQztJQUVwRCxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFtQixFQUFFO1FBQzFELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLCtCQUFzQixDQUFDLCtEQUErRCxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLFNBQWlCLEVBQXdCLEVBQUU7UUFDaEUsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFBLDJDQUF3QixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7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RCxNQUFNLE9BQU8sR0FBRyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sU0FBUyxHQUFHLGdCQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvRkFBb0YsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUEsb0JBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekQsTUFBTSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDN0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDekYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0FDNUYsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLE9BQU87UUFDUCxTQUFTO1FBQ1QsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztRQUN4QixnQkFBZ0I7S0FDakIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgV1JXLWZhY2luZyBzYWZlIHJlY292ZXJ5IGVudHJ5IHBvaW50cy5cbiAqL1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGNvaW5zLCBNQVhfQklQMzJfSU5ERVgsIFNBRkVfUk9PVF9TTE9UX09SRElOQUxTIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHR5cGUgeyBSb290S2V5VHlwZSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VTYWZlS2V5Y2FyZEJveCB9IGZyb20gJ0BiaXRnby9zZGstbGliLXNhZmVzJztcbmltcG9ydCB7IERrbHNWcmZVdGlscyB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgSW5jb3JyZWN0UGFzc3dvcmRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBwYXJzZVNhZmVNcGNLZXlFbnZlbG9wZXMgfSBmcm9tICcuLi91dGlscy90c3Mva2V5U2hhcmVFbnZlbG9wZSc7XG5cbmV4cG9ydCB0eXBlIERlY3J5cHRlZE1wY1NhZmVSb290ID0geyBzaWduaW5nOiBCdWZmZXI7IHZyZjogQnVmZmVyIH07XG5cbmV4cG9ydCB0eXBlIE9uY2hhaW5TYWZlUm9vdCA9IHsgdXNlcjogc3RyaW5nOyBiYWNrdXA6IHN0cmluZzsgYml0Z286IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgTXBjU2FmZVJvb3QgPSB7IHVzZXI6IERlY3J5cHRlZE1wY1NhZmVSb290OyBiYWNrdXA6IERlY3J5cHRlZE1wY1NhZmVSb290OyBiaXRnbzogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIFNlY3AyNTZrMU11bHRpc2lnQ2hpbGRLZXlzID0ge1xuICB1c2VyOiB7IHBydjogc3RyaW5nOyBwdWI6IHN0cmluZyB9O1xuICBiYWNrdXA6IHsgcHJ2OiBzdHJpbmc7IHB1Yjogc3RyaW5nIH07XG4gIGJpdGdvOiB7IHB1Yjogc3RyaW5nIH07XG59O1xuXG5leHBvcnQgdHlwZSBFY2RzYU1wY0NoaWxkS2V5cyA9IHtcbiAgY29tbW9uS2V5Y2hhaW46IHN0cmluZztcbiAgdXNlcjogc3RyaW5nO1xuICBiYWNrdXA6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERlcml2ZWRTYWZlV2FsbGV0S2V5cyA9XG4gIHwgeyBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnOyBwYXRoOiBzdHJpbmc7IGtleXM6IFNlY3AyNTZrMU11bHRpc2lnQ2hpbGRLZXlzIH1cbiAgfCB7IHNsb3Q6ICdlY2RzYU1wYyc7IHBhdGg6IHN0cmluZzsga2V5czogRWNkc2FNcGNDaGlsZEtleXMgfTtcblxuZXhwb3J0IHR5cGUgU2FmZVJlY292ZXJLZXlQYXJhbXMgPSB7XG4gIHVzZXJLZXk6IHN0cmluZztcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG4gIGJpdGdvS2V5OiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEZWNyeXB0ZWRTYWZlUm9vdHMgPSB7XG4gIHNlY3AyNTZrMU11bHRpc2lnOiBPbmNoYWluU2FmZVJvb3Q7XG4gIGVkMjU1MTlNdWx0aXNpZzogT25jaGFpblNhZmVSb290O1xuICBlY2RzYU1wYzogTXBjU2FmZVJvb3Q7XG4gIGVkZHNhTXBjOiBNcGNTYWZlUm9vdDtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0U2FmZUtleWNhcmQocGFyYW1zOiB7XG4gIGJpdGdvOiBCaXRHb0Jhc2U7XG4gIHVzZXJLZXlCb3g6IHN0cmluZztcbiAgYmFja3VwS2V5Qm94OiBzdHJpbmc7XG4gIGJpdGdvS2V5Qm94OiBzdHJpbmc7XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG59KTogUHJvbWlzZTxEZWNyeXB0ZWRTYWZlUm9vdHM+IHtcbiAgY29uc3QgeyBiaXRnbywgdXNlcktleUJveCwgYmFja3VwS2V5Qm94LCBiaXRnb0tleUJveCwgcGFzc3dvcmQgfSA9IHBhcmFtcztcblxuICBjb25zdCB1c2VyUm9vdHMgPSBwYXJzZVNhZmVLZXljYXJkQm94KHVzZXJLZXlCb3gpO1xuICBjb25zdCBiYWNrdXBSb290cyA9IHBhcnNlU2FmZUtleWNhcmRCb3goYmFja3VwS2V5Qm94KTtcbiAgY29uc3QgYml0Z29Sb290cyA9IHBhcnNlU2FmZUtleWNhcmRCb3goYml0Z29LZXlCb3gpO1xuXG4gIGNvbnN0IGRlY3J5cHRSb290ID0gYXN5bmMgKHJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBiaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHJvb3QsIHBhc3N3b3JkIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBJbmNvcnJlY3RQYXNzd29yZEVycm9yKCd1bmFibGUgdG8gZGVjcnlwdCB0aGUgc2FmZSBrZXljYXJkIHdpdGggdGhlIHByb3ZpZGVkIHBhc3N3b3JkJywgZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHVud3JhcE1wY1Jvb3QgPSAoZGVjcnlwdGVkOiBzdHJpbmcpOiBEZWNyeXB0ZWRNcGNTYWZlUm9vdCA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXJzZVNhZmVNcGNLZXlFbnZlbG9wZXMoZGVjcnlwdGVkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcigndW5hYmxlIHRvIGRlY3J5cHQgdGhlIHNhZmUga2V5Y2FyZCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzd29yZCcsIGUpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNlY3AyNTZrMU11bHRpc2lnOiB7XG4gICAgICB1c2VyOiBhd2FpdCBkZWNyeXB0Um9vdCh1c2VyUm9vdHMuc2VjcDI1NmsxTXVsdGlzaWcpLFxuICAgICAgYmFja3VwOiBhd2FpdCBkZWNyeXB0Um9vdChiYWNrdXBSb290cy5zZWNwMjU2azFNdWx0aXNpZyksXG4gICAgICBiaXRnbzogYml0Z29Sb290cy5zZWNwMjU2azFNdWx0aXNpZyxcbiAgICB9LFxuICAgIGVkMjU1MTlNdWx0aXNpZzoge1xuICAgICAgdXNlcjogYXdhaXQgZGVjcnlwdFJvb3QodXNlclJvb3RzLmVkMjU1MTlNdWx0aXNpZyksXG4gICAgICBiYWNrdXA6IGF3YWl0IGRlY3J5cHRSb290KGJhY2t1cFJvb3RzLmVkMjU1MTlNdWx0aXNpZyksXG4gICAgICBiaXRnbzogYml0Z29Sb290cy5lZDI1NTE5TXVsdGlzaWcsXG4gICAgfSxcbiAgICBlY2RzYU1wYzoge1xuICAgICAgdXNlcjogdW53cmFwTXBjUm9vdChhd2FpdCBkZWNyeXB0Um9vdCh1c2VyUm9vdHMuZWNkc2FNcGMpKSxcbiAgICAgIGJhY2t1cDogdW53cmFwTXBjUm9vdChhd2FpdCBkZWNyeXB0Um9vdChiYWNrdXBSb290cy5lY2RzYU1wYykpLFxuICAgICAgYml0Z286IGJpdGdvUm9vdHMuZWNkc2FNcGMsXG4gICAgfSxcbiAgICBlZGRzYU1wYzoge1xuICAgICAgdXNlcjogdW53cmFwTXBjUm9vdChhd2FpdCBkZWNyeXB0Um9vdCh1c2VyUm9vdHMuZWRkc2FNcGMpKSxcbiAgICAgIGJhY2t1cDogdW53cmFwTXBjUm9vdChhd2FpdCBkZWNyeXB0Um9vdChiYWNrdXBSb290cy5lZGRzYU1wYykpLFxuICAgICAgYml0Z286IGJpdGdvUm9vdHMuZWRkc2FNcGMsXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTYWZlVXNlclBhdGgoY29pblR5cGU6IG51bWJlciwgc2xvdE9yZGluYWw6IG51bWJlciwgYWNjb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBtLzQ0Jy8ke2NvaW5UeXBlfScvJHtzbG90T3JkaW5hbH0nLyR7YWNjb3VudH0nYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRTYWZlQ29zaWduZXJQYXRoKGNvaW5UeXBlOiBudW1iZXIsIHNsb3RPcmRpbmFsOiBudW1iZXIsIGFjY291bnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbS80NC8ke2NvaW5UeXBlfS8ke3Nsb3RPcmRpbmFsfS8ke2FjY291bnR9YDtcbn1cblxuLyoqXG4gKiBEZXJpdmVzIGEgU2FmZSB3YWxsZXQncyBjaGlsZCBrZXlzIGF0IHRoZSBCSVA0NCBwYXRoIGZvciBhIGdpdmVuIHNsb3QgYW5kIGFjY291bnQuXG4gKiBPbmx5IGBzZWNwMjU2azFNdWx0aXNpZ2AgKHNsb3QgMSkgaXMgc3VwcG9ydGVkIGZvciBub3c7IHRoZSByZW1haW5pbmcgc2xvdHMgdGhyb3dcbiAqIHVudGlsIHRoZWlyIGRlcml2YXRpb24gYXJtcyBsYW5kIChXQ04tMjczNi9XQ04tMjczNy9XQ04tMjg5NCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXJpdmVTYWZlV2FsbGV0S2V5cyhwYXJhbXM6IHtcbiAgY29pbjogc3RyaW5nO1xuICBzbG90OiBSb290S2V5VHlwZTtcbiAgYWNjb3VudDogbnVtYmVyO1xuICByb290czogRGVjcnlwdGVkU2FmZVJvb3RzO1xufSk6IFByb21pc2U8RGVyaXZlZFNhZmVXYWxsZXRLZXlzPiB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJhbXMuYWNjb3VudCkgfHwgcGFyYW1zLmFjY291bnQgPCAwIHx8IHBhcmFtcy5hY2NvdW50ID4gTUFYX0JJUDMyX0lOREVYKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkZXJpdmVTYWZlV2FsbGV0S2V5czogaW52YWxpZCBhY2NvdW50ICcke3BhcmFtcy5hY2NvdW50fSdgKTtcbiAgfVxuXG4gIGNvbnN0IGNvaW5UeXBlID0gY29pbnMuZ2V0KHBhcmFtcy5jb2luKS5iaXA0NENvaW5UeXBlO1xuICBpZiAoY29pblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ29pbiAnJHtwYXJhbXMuY29pbn0nIGhhcyBubyBCSVA0NCBjb2luIHR5cGUgYW5kIGNhbm5vdCBkZXJpdmUgYSBzYWZlIGNoaWxkYCk7XG4gIH1cbiAgY29uc3Qgc2xvdE9yZGluYWwgPSBTQUZFX1JPT1RfU0xPVF9PUkRJTkFMU1twYXJhbXMuc2xvdF07XG4gIGNvbnN0IHsgYWNjb3VudCwgcm9vdHMgfSA9IHBhcmFtcztcblxuICBpZiAocGFyYW1zLnNsb3QgPT09ICdzZWNwMjU2azFNdWx0aXNpZycpIHtcbiAgICBjb25zdCByb290ID0gcm9vdHMuc2VjcDI1NmsxTXVsdGlzaWc7XG4gICAgY29uc3QgdXNlciA9IGJpcDMyLmZyb21CYXNlNTgocm9vdC51c2VyKS5kZXJpdmVQYXRoKGJ1aWxkU2FmZVVzZXJQYXRoKGNvaW5UeXBlLCBzbG90T3JkaW5hbCwgYWNjb3VudCkpO1xuICAgIGNvbnN0IGJhY2t1cCA9IGJpcDMyLmZyb21CYXNlNTgocm9vdC5iYWNrdXApLmRlcml2ZVBhdGgoYnVpbGRTYWZlQ29zaWduZXJQYXRoKGNvaW5UeXBlLCBzbG90T3JkaW5hbCwgYWNjb3VudCkpO1xuICAgIGNvbnN0IGJpdGdvID0gYmlwMzIuZnJvbUJhc2U1OChyb290LmJpdGdvKS5kZXJpdmVQYXRoKGJ1aWxkU2FmZUNvc2lnbmVyUGF0aChjb2luVHlwZSwgc2xvdE9yZGluYWwsIGFjY291bnQpKTtcblxuICAgIGlmICghdXNlci5wcml2YXRlS2V5IHx8ICFiYWNrdXAucHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXJpdmVTYWZlV2FsbGV0S2V5czogdXNlciBhbmQgYmFja3VwIHJvb3RzIG11c3QgYmUgcHJpdmF0ZSAoeHBydiknKTtcbiAgICB9XG4gICAgaWYgKGJpdGdvLnByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGVyaXZlU2FmZVdhbGxldEtleXM6IGJpdGdvIHJvb3QgbXVzdCBiZSBwdWJsaWMgKHhwdWIpJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsXG4gICAgICBwYXRoOiBidWlsZFNhZmVVc2VyUGF0aChjb2luVHlwZSwgc2xvdE9yZGluYWwsIGFjY291bnQpLFxuICAgICAga2V5czoge1xuICAgICAgICB1c2VyOiB7IHBydjogdXNlci50b0Jhc2U1OCgpLCBwdWI6IHVzZXIubmV1dGVyZWQoKS50b0Jhc2U1OCgpIH0sXG4gICAgICAgIGJhY2t1cDogeyBwcnY6IGJhY2t1cC50b0Jhc2U1OCgpLCBwdWI6IGJhY2t1cC5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSxcbiAgICAgICAgYml0Z286IHsgcHViOiBiaXRnby5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2xvdCA9PT0gJ2VjZHNhTXBjJykge1xuICAgIGNvbnN0IHsgY29tbW9uS2V5Y2hhaW4sIHVzZXJDaGlsZCwgYmFja3VwQ2hpbGQgfSA9IGF3YWl0IERrbHNWcmZVdGlscy5kZXJpdmVTYWZlRWNkc2FNcGNDaGlsZCh7XG4gICAgICB1c2VyUm9vdDogcm9vdHMuZWNkc2FNcGMudXNlcixcbiAgICAgIGJhY2t1cFJvb3Q6IHJvb3RzLmVjZHNhTXBjLmJhY2t1cCxcbiAgICAgIGFjY291bnQsXG4gICAgICBjb2luVHlwZSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc2xvdDogJ2VjZHNhTXBjJyxcbiAgICAgIHBhdGg6IGJ1aWxkU2FmZVVzZXJQYXRoKGNvaW5UeXBlLCBzbG90T3JkaW5hbCwgYWNjb3VudCksXG4gICAgICBrZXlzOiB7IGNvbW1vbktleWNoYWluLCB1c2VyOiB1c2VyQ2hpbGQsIGJhY2t1cDogYmFja3VwQ2hpbGQgfSxcbiAgICB9O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBkZXJpdmVTYWZlV2FsbGV0S2V5czogc2xvdCAnJHtwYXJhbXMuc2xvdH0nIGlzIG5vdCBzdXBwb3J0ZWQgeWV0YCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBrZXkgZmllbGRzIGBjb2luLnJlY292ZXIoKWAgZXhwZWN0cyBmcm9tIGRlcml2ZWQgU2FmZSBjaGlsZCBrZXlzLlxuICogT25seSBgc2VjcDI1NmsxTXVsdGlzaWdgIChzbG90IDEpIGlzIHN1cHBvcnRlZCBmb3Igbm93LiBTaWduZWQgbW9kZSByZS1lbmNyeXB0cyB0aGVcbiAqIGNoaWxkIHhwcnZzIHVuZGVyIGEgZnJlc2ggZXBoZW1lcmFsIHBhc3NwaHJhc2UgKHYxL1NKQ0wpOyB1bnNpZ25lZCBtb2RlIHJldHVybnMgcHVicy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXMocGFyYW1zOiB7XG4gIGJpdGdvOiBCaXRHb0Jhc2U7XG4gIGNvaW46IHN0cmluZztcbiAgc2xvdDogUm9vdEtleVR5cGU7XG4gIGtleXM6IFNlY3AyNTZrMU11bHRpc2lnQ2hpbGRLZXlzO1xuICBtb2RlOiAnc2lnbmVkJyB8ICd1bnNpZ25lZCc7XG59KTogUHJvbWlzZTxTYWZlUmVjb3ZlcktleVBhcmFtcz4ge1xuICBpZiAocGFyYW1zLnNsb3QgIT09ICdzZWNwMjU2azFNdWx0aXNpZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXM6IHNsb3QgJyR7cGFyYW1zLnNsb3R9JyBpcyBub3Qgc3VwcG9ydGVkIHlldGApO1xuICB9XG4gIGNvbnN0IHsgYml0Z28sIGtleXMsIG1vZGUgfSA9IHBhcmFtcztcblxuICBpZiAobW9kZSA9PT0gJ3Vuc2lnbmVkJykge1xuICAgIHJldHVybiB7XG4gICAgICB1c2VyS2V5OiBrZXlzLnVzZXIucHViLFxuICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cC5wdWIsXG4gICAgICBiaXRnb0tleToga2V5cy5iaXRnby5wdWIsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJQcnYgPSBiaXAzMi5mcm9tQmFzZTU4KGtleXMudXNlci5wcnYpO1xuICBjb25zdCBiYWNrdXBQcnYgPSBiaXAzMi5mcm9tQmFzZTU4KGtleXMuYmFja3VwLnBydik7XG4gIGlmICghdXNlclBydi5wcml2YXRlS2V5IHx8ICFiYWNrdXBQcnYucHJpdmF0ZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtczoga2V5cy51c2VyLnBydiBhbmQga2V5cy5iYWNrdXAucHJ2IG11c3QgYmUgcHJpdmF0ZSB4cHJ2cycpO1xuICB9XG5cbiAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9IHJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IFt1c2VyS2V5LCBiYWNrdXBLZXldID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGJpdGdvLmVuY3J5cHQoeyBpbnB1dDoga2V5cy51c2VyLnBydiwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRpb25WZXJzaW9uOiAxIH0pLFxuICAgIGJpdGdvLmVuY3J5cHQoeyBpbnB1dDoga2V5cy5iYWNrdXAucHJ2LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGlvblZlcnNpb246IDEgfSksXG4gIF0pO1xuXG4gIHJldHVybiB7XG4gICAgdXNlcktleSxcbiAgICBiYWNrdXBLZXksXG4gICAgYml0Z29LZXk6IGtleXMuYml0Z28ucHViLFxuICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gIH07XG59XG4iXX0=
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import * as openpgp from 'openpgp';
|
|
2
2
|
import { RedPallasMPSTypes } from '@bitgo/sdk-lib-mpc';
|
|
3
|
-
import { RedpallasMPCv2SignatureShareRound1Output, RedpallasMPCv2SignatureShareRound2Output, RedpallasMPCv2SignatureShareRound3Output } from '@bitgo/public-types';
|
|
3
|
+
import { RedpallasMPCv2RerandShareRound1Output, RedpallasMPCv2RerandShareRound2Output, RedpallasMPCv2SignatureShareRound1Output, RedpallasMPCv2SignatureShareRound2Output, RedpallasMPCv2SignatureShareRound3Output } from '@bitgo/public-types';
|
|
4
4
|
import { SignatureShareRecord } from '../../utils/tss/baseTypes';
|
|
5
5
|
import { MPCv2PartiesEnum } from '../../utils/tss/ecdsa/typesMPCv2';
|
|
6
6
|
type SignerPartyId = MPCv2PartiesEnum.USER | MPCv2PartiesEnum.BACKUP;
|
|
7
7
|
/**
|
|
8
|
-
* RedPallas MPS DSG signature-share helpers.
|
|
8
|
+
* RedPallas MPS DSG and rerand signature-share helpers.
|
|
9
9
|
*
|
|
10
|
-
* Groundwork for a future custodial/cold (SMC/OVC)
|
|
11
|
-
* caller in this SDK. Mirrors `../eddsa/eddsaMPCv2.ts` (same
|
|
10
|
+
* Groundwork for a future custodial/cold (SMC/OVC) signing flow - not yet wired up to any
|
|
11
|
+
* caller in this SDK. Mirrors `../eddsa/eddsaMPCv2.ts` (same round shape, same PGP-signed-
|
|
12
12
|
* message envelope), but kept as an independent copy - built on `RedPallasMPSComms` - so
|
|
13
13
|
* RedPallas MPS never depends on the EdDSA MPS module, and vice versa.
|
|
14
|
+
*
|
|
15
|
+
* Since `@bitgo/wasm-mps` 1.17.0, key re-randomization is a separate 2-round rerand
|
|
16
|
+
* protocol that must run before every RedPallas DSG, between the same 2 parties that
|
|
17
|
+
* will then sign: `getRerandShareRoundOne/Two` build those share records and
|
|
18
|
+
* `verifyPeerRerandMessageRoundOne/Two` unwrap the peer's rerand messages (see
|
|
19
|
+
* `RedPallasRerand` in `@bitgo/sdk-lib-mpc`).
|
|
14
20
|
*/
|
|
15
21
|
/**
|
|
16
22
|
* Builds the round-1 signature share record.
|
|
@@ -46,5 +52,28 @@ export declare function verifyPeerMessageRoundThree(parsedRound3Output: Redpalla
|
|
|
46
52
|
* signed transaction via `sendTxRequest`.
|
|
47
53
|
*/
|
|
48
54
|
export declare function getSignatureShareRoundThree(userMsg3: RedPallasMPSTypes.DeserializedMessage, userGpgPrivKey: openpgp.PrivateKey, partyId?: SignerPartyId, otherSignerPartyId?: MPCv2PartiesEnum): Promise<SignatureShareRecord>;
|
|
55
|
+
/**
|
|
56
|
+
* Builds the rerand round-1 signature share record.
|
|
57
|
+
*
|
|
58
|
+
* Rerand must run before every RedPallas DSG, with the same counterpart. Round 1
|
|
59
|
+
* carries the PGP-signed WASM commitment broadcast (`RedPallasRerand.getFirstMessage()`).
|
|
60
|
+
*/
|
|
61
|
+
export declare function getRerandShareRoundOne(userMsg1: RedPallasMPSTypes.DeserializedMessage, userGpgPrivKey: openpgp.PrivateKey, partyId?: SignerPartyId, otherSignerPartyId?: MPCv2PartiesEnum): Promise<SignatureShareRecord>;
|
|
62
|
+
/**
|
|
63
|
+
* Verifies the peer's rerand round-1 PGP signature and returns the raw deserialized
|
|
64
|
+
* message ready for `RedPallasRerand.handleIncomingMessages`.
|
|
65
|
+
*/
|
|
66
|
+
export declare function verifyPeerRerandMessageRoundOne(parsedRound1Output: RedpallasMPCv2RerandShareRound1Output, peerGpgKey: openpgp.Key, peerPartyId?: MPCv2PartiesEnum): Promise<RedPallasMPSTypes.DeserializedMessage>;
|
|
67
|
+
/**
|
|
68
|
+
* Builds the rerand round-2 signature share record (opening message).
|
|
69
|
+
*/
|
|
70
|
+
export declare function getRerandShareRoundTwo(userMsg2: RedPallasMPSTypes.DeserializedMessage, userGpgPrivKey: openpgp.PrivateKey, partyId?: SignerPartyId, otherSignerPartyId?: MPCv2PartiesEnum): Promise<SignatureShareRecord>;
|
|
71
|
+
/**
|
|
72
|
+
* Verifies the peer's rerand round-2 PGP signature and returns the raw deserialized
|
|
73
|
+
* message ready for `RedPallasRerand.handleIncomingMessages`. After this exchange
|
|
74
|
+
* both parties read the rerandomized keyshare via `getRerandomizedKeyShare()` and
|
|
75
|
+
* feed it into `RedPallasDSG.initDsg`.
|
|
76
|
+
*/
|
|
77
|
+
export declare function verifyPeerRerandMessageRoundTwo(parsedRound2Output: RedpallasMPCv2RerandShareRound2Output, peerGpgKey: openpgp.Key, peerPartyId?: MPCv2PartiesEnum): Promise<RedPallasMPSTypes.DeserializedMessage>;
|
|
49
78
|
export {};
|
|
50
79
|
//# sourceMappingURL=redpallasMPCv2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redpallasMPCv2.d.ts","sourceRoot":"","sources":["../../../../../src/bitgo/tss/redpallas/redpallasMPCv2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAqB,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAEL,wCAAwC,EAExC,wCAAwC,EAExC,wCAAwC,EACzC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAsB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,KAAK,aAAa,GAAG,gBAAgB,CAAC,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAarE
|
|
1
|
+
{"version":3,"file":"redpallasMPCv2.d.ts","sourceRoot":"","sources":["../../../../../src/bitgo/tss/redpallas/redpallasMPCv2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAqB,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAEL,qCAAqC,EAErC,qCAAqC,EAErC,wCAAwC,EAExC,wCAAwC,EAExC,wCAAwC,EACzC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAsB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,KAAK,aAAa,GAAG,gBAAgB,CAAC,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAarE;;;;;;;;;;;;;GAaG;AAEH;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,iBAAiB,CAAC,mBAAmB,EAC/C,cAAc,EAAE,OAAO,CAAC,UAAU,EAClC,OAAO,GAAE,aAAqC,EAC9C,kBAAkB,GAAE,gBAAyC,GAC5D,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,kBAAkB,EAAE,wCAAwC,EAC5D,UAAU,EAAE,OAAO,CAAC,GAAG,EACvB,WAAW,GAAE,gBAAyC,GACrD,OAAO,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAMhD;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,iBAAiB,CAAC,mBAAmB,EAC/C,cAAc,EAAE,OAAO,CAAC,UAAU,EAClC,OAAO,GAAE,aAAqC,EAC9C,kBAAkB,GAAE,gBAAyC,GAC5D,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,kBAAkB,EAAE,wCAAwC,EAC5D,UAAU,EAAE,OAAO,CAAC,GAAG,EACvB,WAAW,GAAE,gBAAyC,GACrD,OAAO,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAMhD;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,kBAAkB,EAAE,wCAAwC,EAC5D,UAAU,EAAE,OAAO,CAAC,GAAG,EACvB,WAAW,GAAE,gBAAyC,GACrD,OAAO,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAGhD;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,iBAAiB,CAAC,mBAAmB,EAC/C,cAAc,EAAE,OAAO,CAAC,UAAU,EAClC,OAAO,GAAE,aAAqC,EAC9C,kBAAkB,GAAE,gBAAyC,GAC5D,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,iBAAiB,CAAC,mBAAmB,EAC/C,cAAc,EAAE,OAAO,CAAC,UAAU,EAClC,OAAO,GAAE,aAAqC,EAC9C,kBAAkB,GAAE,gBAAyC,GAC5D,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAED;;;GAGG;AACH,wBAAsB,+BAA+B,CACnD,kBAAkB,EAAE,qCAAqC,EACzD,UAAU,EAAE,OAAO,CAAC,GAAG,EACvB,WAAW,GAAE,gBAAyC,GACrD,OAAO,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAMhD;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,iBAAiB,CAAC,mBAAmB,EAC/C,cAAc,EAAE,OAAO,CAAC,UAAU,EAClC,OAAO,GAAE,aAAqC,EAC9C,kBAAkB,GAAE,gBAAyC,GAC5D,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAED;;;;;GAKG;AACH,wBAAsB,+BAA+B,CACnD,kBAAkB,EAAE,qCAAqC,EACzD,UAAU,EAAE,OAAO,CAAC,GAAG,EACvB,WAAW,GAAE,gBAAyC,GACrD,OAAO,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAMhD"}
|