@bitgo/sdk-core 36.44.0 → 37.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/src/account-lib/baseCoin/enum.d.ts +22 -15
  2. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/enum.js +30 -16
  4. package/dist/src/api/types.d.ts +12 -0
  5. package/dist/src/api/types.d.ts.map +1 -1
  6. package/dist/src/api/types.js +1 -1
  7. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +1 -0
  8. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  9. package/dist/src/bitgo/baseCoin/baseCoin.js +4 -1
  10. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +11 -0
  11. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  12. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  13. package/dist/src/bitgo/bitgoBase.d.ts +3 -1
  14. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  15. package/dist/src/bitgo/bitgoBase.js +1 -1
  16. package/dist/src/bitgo/environments.d.ts +1 -0
  17. package/dist/src/bitgo/environments.d.ts.map +1 -1
  18. package/dist/src/bitgo/environments.js +9 -1
  19. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +12 -1
  20. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -1
  21. package/dist/src/bitgo/keychain/decryptKeychain.js +34 -2
  22. package/dist/src/bitgo/keychain/iKeychains.d.ts +7 -1
  23. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  24. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  25. package/dist/src/bitgo/keychain/keychains.d.ts +19 -2
  26. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  27. package/dist/src/bitgo/keychain/keychains.js +74 -8
  28. package/dist/src/bitgo/trading/iTradingAccount.d.ts +13 -1
  29. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  30. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  31. package/dist/src/bitgo/trading/network/network.d.ts +1 -1
  32. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
  33. package/dist/src/bitgo/trading/network/network.js +3 -5
  34. package/dist/src/bitgo/trading/network/types.d.ts +1 -1
  35. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
  36. package/dist/src/bitgo/trading/network/types.js +1 -1
  37. package/dist/src/bitgo/trading/tradingAccount.d.ts +15 -1
  38. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  39. package/dist/src/bitgo/trading/tradingAccount.js +55 -7
  40. package/dist/src/bitgo/tss/common.d.ts +2 -1
  41. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  42. package/dist/src/bitgo/tss/common.js +10 -1
  43. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +37 -0
  44. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  45. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +95 -0
  46. package/dist/src/bitgo/utils/mpcUtils.d.ts +2 -1
  47. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  48. package/dist/src/bitgo/utils/mpcUtils.js +8 -1
  49. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -1
  50. package/dist/src/bitgo/utils/tss/addressVerification.js +10 -3
  51. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +38 -4
  52. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  53. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +66 -1
  54. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +95 -17
  55. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  56. package/dist/src/bitgo/utils/tss/baseTypes.js +26 -2
  57. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +10 -7
  58. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  59. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +39 -11
  60. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +14 -21
  61. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  62. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +170 -104
  63. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +9 -6
  64. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  65. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +96 -38
  66. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +34 -2
  67. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  68. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +184 -6
  69. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -1
  70. package/dist/src/bitgo/utils/txRequest.js +6 -4
  71. package/dist/src/bitgo/wallet/BuildParams.d.ts +20 -0
  72. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  73. package/dist/src/bitgo/wallet/BuildParams.js +12 -2
  74. package/dist/src/bitgo/wallet/iWallet.d.ts +60 -2
  75. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  76. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  77. package/dist/src/bitgo/wallet/iWallets.d.ts +20 -19
  78. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  79. package/dist/src/bitgo/wallet/iWallets.js +16 -8
  80. package/dist/src/bitgo/wallet/wallet.d.ts +84 -3
  81. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  82. package/dist/src/bitgo/wallet/wallet.js +347 -14
  83. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  84. package/dist/src/bitgo/wallet/wallets.js +49 -23
  85. package/dist/src/coins/ofc.d.ts +15 -1
  86. package/dist/src/coins/ofc.d.ts.map +1 -1
  87. package/dist/src/coins/ofc.js +8 -1
  88. package/dist/src/coins/ofcToken.d.ts +14 -4
  89. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  90. package/dist/src/coins/ofcToken.js +17 -4
  91. package/dist/src/index.d.ts +2 -0
  92. package/dist/src/index.d.ts.map +1 -1
  93. package/dist/src/index.js +4 -2
  94. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  95. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  96. package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
  97. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +119 -1
  98. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  99. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  100. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +305 -0
  101. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +354 -1
  102. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  103. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  104. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +442 -0
  105. package/dist/test/unit/bitgo/utils/txRequest.js +75 -1
  106. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  107. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  108. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
  109. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  110. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  111. package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
  112. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  113. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  114. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
  115. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +45 -1
  116. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +5 -2
  117. package/dist/test/unit/coins/ofc.d.ts +2 -0
  118. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  119. package/dist/test/unit/coins/ofc.js +124 -0
  120. package/dist/tsconfig.tsbuildinfo +1 -1
  121. package/package.json +5 -5
@@ -10,6 +10,7 @@ describe('txRequest utils', () => {
10
10
  baseCoin: { getMPCAlgorithm: () => 'ecdsa' },
11
11
  type: () => 'hot',
12
12
  multisigType: () => 'tss',
13
+ multisigTypeVersion: () => undefined,
13
14
  },
14
15
  requestedApiVersion: 'lite',
15
16
  expectedApiVersion: '',
@@ -20,6 +21,7 @@ describe('txRequest utils', () => {
20
21
  baseCoin: { getMPCAlgorithm: () => 'eddsa' },
21
22
  type: () => 'cold',
22
23
  multisigType: () => 'tss',
24
+ multisigTypeVersion: () => undefined,
23
25
  },
24
26
  requestedApiVersion: 'lite',
25
27
  expectedApiVersion: '',
@@ -30,17 +32,41 @@ describe('txRequest utils', () => {
30
32
  baseCoin: { getMPCAlgorithm: () => 'eddsa' },
31
33
  type: () => 'hot',
32
34
  multisigType: () => 'tss',
35
+ multisigTypeVersion: () => undefined,
33
36
  },
34
37
  requestedApiVersion: undefined,
35
38
  expectedApiVersion: 'lite',
36
39
  expectedErrorMessage: '',
37
40
  },
41
+ {
42
+ wallet: {
43
+ baseCoin: { getMPCAlgorithm: () => 'eddsa' },
44
+ type: () => 'hot',
45
+ multisigType: () => 'tss',
46
+ multisigTypeVersion: () => 'MPCv2',
47
+ },
48
+ requestedApiVersion: 'lite',
49
+ expectedApiVersion: '',
50
+ expectedErrorMessage: 'For EdDSA MPCv2 tss wallets, parameter `apiVersion` must be `full`.',
51
+ },
52
+ {
53
+ wallet: {
54
+ baseCoin: { getMPCAlgorithm: () => 'eddsa' },
55
+ type: () => 'hot',
56
+ multisigType: () => 'tss',
57
+ multisigTypeVersion: () => 'MPCv2',
58
+ },
59
+ requestedApiVersion: undefined,
60
+ expectedApiVersion: 'full',
61
+ expectedErrorMessage: '',
62
+ },
38
63
  ...['hot', 'cold', 'custodial', 'backing'].map((walletType) => {
39
64
  return {
40
65
  wallet: {
41
66
  baseCoin: { getMPCAlgorithm: () => 'ecdsa' },
42
67
  type: () => walletType,
43
68
  multisigType: () => 'tss',
69
+ multisigTypeVersion: () => undefined,
44
70
  },
45
71
  requestedApiVersion: 'full',
46
72
  expectedApiVersion: 'full',
@@ -54,6 +80,7 @@ describe('txRequest utils', () => {
54
80
  baseCoin: { getMPCAlgorithm: () => 'ecdsa' },
55
81
  type: () => walletType,
56
82
  multisigType: () => 'tss',
83
+ multisigTypeVersion: () => undefined,
57
84
  },
58
85
  requestedApiVersion: undefined,
59
86
  expectedApiVersion: 'full',
@@ -67,6 +94,7 @@ describe('txRequest utils', () => {
67
94
  baseCoin: { getMPCAlgorithm: () => 'eddsa' },
68
95
  type: () => walletType,
69
96
  multisigType: () => 'tss',
97
+ multisigTypeVersion: () => undefined,
70
98
  },
71
99
  requestedApiVersion: 'full',
72
100
  expectedApiVersion: 'full',
@@ -80,6 +108,7 @@ describe('txRequest utils', () => {
80
108
  baseCoin: { getMPCAlgorithm: () => 'eddsa' },
81
109
  type: () => walletType,
82
110
  multisigType: () => 'tss',
111
+ multisigTypeVersion: () => undefined,
83
112
  },
84
113
  requestedApiVersion: undefined,
85
114
  expectedApiVersion: 'full',
@@ -87,6 +116,51 @@ describe('txRequest utils', () => {
87
116
  shouldThrow: false,
88
117
  };
89
118
  }),
119
+ // EdDSA MPCv2: all wallet types + 'full' explicitly → returns 'full'
120
+ ...['hot', 'cold', 'custodial', 'backing'].map((walletType) => {
121
+ return {
122
+ wallet: {
123
+ baseCoin: { getMPCAlgorithm: () => 'eddsa' },
124
+ type: () => walletType,
125
+ multisigType: () => 'tss',
126
+ multisigTypeVersion: () => 'MPCv2',
127
+ },
128
+ requestedApiVersion: 'full',
129
+ expectedApiVersion: 'full',
130
+ expectedErrorMessage: '',
131
+ shouldThrow: false,
132
+ };
133
+ }),
134
+ // EdDSA MPCv2: non-hot wallet types + undefined → defaults to 'full'
135
+ ...['cold', 'custodial', 'backing'].map((walletType) => {
136
+ return {
137
+ wallet: {
138
+ baseCoin: { getMPCAlgorithm: () => 'eddsa' },
139
+ type: () => walletType,
140
+ multisigType: () => 'tss',
141
+ multisigTypeVersion: () => 'MPCv2',
142
+ },
143
+ requestedApiVersion: undefined,
144
+ expectedApiVersion: 'full',
145
+ expectedErrorMessage: '',
146
+ shouldThrow: false,
147
+ };
148
+ }),
149
+ // EdDSA MPCv2: non-hot wallet types + 'lite' → throws EdDSA MPCv2 error
150
+ ...['cold', 'custodial', 'backing'].map((walletType) => {
151
+ return {
152
+ wallet: {
153
+ baseCoin: { getMPCAlgorithm: () => 'eddsa' },
154
+ type: () => walletType,
155
+ multisigType: () => 'tss',
156
+ multisigTypeVersion: () => 'MPCv2',
157
+ },
158
+ requestedApiVersion: 'lite',
159
+ expectedApiVersion: '',
160
+ expectedErrorMessage: 'For EdDSA MPCv2 tss wallets, parameter `apiVersion` must be `full`.',
161
+ shouldThrow: true,
162
+ };
163
+ }),
90
164
  ];
91
165
  testCases.forEach((testCase) => {
92
166
  if (testCase.expectedErrorMessage) {
@@ -102,4 +176,4 @@ describe('txRequest utils', () => {
102
176
  });
103
177
  });
104
178
  });
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhSZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3V0aWxzL3R4UmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtCQUFnQjtBQUVoQixxRUFBK0U7QUFFL0UsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtJQUMvQixRQUFRLENBQUMsd0JBQXdCLEVBQUU7UUFDakMsTUFBTSxTQUFTLEdBQUc7WUFDaEI7Z0JBQ0UsTUFBTSxFQUFFO29CQUNOLFFBQVEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUU7b0JBQzVDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO29CQUNqQixZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSztpQkFDUjtnQkFDbkIsbUJBQW1CLEVBQUUsTUFBTTtnQkFDM0Isa0JBQWtCLEVBQUUsRUFBRTtnQkFDdEIsb0JBQW9CLEVBQUUsK0RBQStEO2FBQ3RGO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFO29CQUNOLFFBQVEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUU7b0JBQzVDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNO29CQUNsQixZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSztpQkFDUjtnQkFDbkIsbUJBQW1CLEVBQUUsTUFBTTtnQkFDM0Isa0JBQWtCLEVBQUUsRUFBRTtnQkFDdEIsb0JBQW9CLEVBQUUsa0ZBQWtGO2FBQ3pHO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFO29CQUNOLFFBQVEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUU7b0JBQzVDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO29CQUNqQixZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSztpQkFDUjtnQkFDbkIsbUJBQW1CLEVB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QUcsRUFBRSxDQUNKLElBQUEsa0NBQXNCLEVBQ3BCLFFBQVEsQ0FBQyxNQUFNLEVBQ2YsUUFBUSxDQUFDLG1CQUE2QyxDQUN2RCxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDbkQsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sRUFBRSxDQUFDLGlCQUFpQixRQUFRLENBQUMsa0JBQWtCLCtCQUM3QyxRQUFRLENBQUMsbUJBQ1gsb0JBQW9CLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7b0JBQzVHLElBQUEsa0NBQXNCLEVBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsbUJBQTZDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUMxRyxRQUFRLENBQUMsa0JBQWtCLENBQzVCLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgQXBpVmVyc2lvbiwgSVdhbGxldCB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3RBcGlWZXJzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3R4UmVxdWVzdCc7XG5cbmRlc2NyaWJlKCd0eFJlcXVlc3QgdXRpbHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdnZXRUeFJlcXVlc3RBcGlWZXJzaW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRlc3RDYXNlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgYmFzZUNvaW46IHsgZ2V0TVBDQWxnb3JpdGhtOiAoKSA9PiAnZWNkc2EnIH0sXG4gICAgICAgICAgdHlwZTogKCkgPT4gJ2hvdCcsXG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAoKSA9PiAndHNzJyxcbiAgICAgICAgfSBhcyBhbnkgYXMgSVdhbGxldCxcbiAgICAgICAgcmVxdWVzdGVkQXBpVmVyc2lvbjogJ2xpdGUnLFxuICAgICAgICBleHBlY3RlZEFwaVZlcnNpb246ICcnLFxuICAgICAgICBleHBlY3RlZEVycm9yTWVzc2FnZTogJ0ZvciBFQ0RTQSB0c3Mgd2FsbGV0cywgcGFyYW1ldGVyIGBhcGlWZXJzaW9uYCBtdXN0IGJlIGBmdWxsYC4nLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgYmFzZUNvaW46IHsgZ2V0TVBDQWxnb3JpdGhtOiAoKSA9PiAnZWRkc2EnIH0sXG4gICAgICAgICAgdHlwZTogKCkgPT4gJ2NvbGQnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZTogKCkgPT4gJ3RzcycsXG4gICAgICAgIH0gYXMgYW55IGFzIElXYWxsZXQsXG4gICAgICAgIHJlcXVlc3RlZEFwaVZlcnNpb246ICdsaXRlJyxcbiAgICAgICAgZXhwZWN0ZWRBcGlWZXJzaW9uOiAnJyxcbiAgICAgICAgZXhwZWN0ZWRFcnJvck1lc3NhZ2U6ICdGb3Igbm9uIHNlbGYtY3VzdG9kaWFsIChob3QpIHRzcyB3YWxsZXRzLCBwYXJhbWV0ZXIgYGFwaVZlcnNpb25gIG11c3QgYmUgYGZ1bGxgLicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICBiYXNlQ29pbjogeyBnZXRNUENBbGdvcml0aG06ICgpID0+ICdlZGRzYScgfSxcbiAgICAgICAgICB0eXBlOiAoKSA9PiAnaG90JyxcbiAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICgpID0+ICd0c3MnLFxuICAgICAgICB9IGFzIGFueSBhcyBJV2FsbGV0LFxuICAgICAgICByZXF1ZXN0ZWRBcGlWZXJzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIGV4cGVjdGVkQXBpVmVyc2lvbjogJ2xpdGUnLFxuICAgICAgICBleHBlY3RlZEVycm9yTWVzc2FnZTogJycsXG4gICAgICB9LFxuICAgICAgLi4uWydob3QnLCAnY29sZCcsICdjdXN0b2RpYWwnLCAnYmFja2luZyddLm1hcCgod2FsbGV0VHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdhbGxldDoge1xuICAgICAgICAgICAgYmFzZUNvaW46IHsgZ2V0TVBDQWxnb3JpdGhtOiAoKSA9PiAnZWNkc2EnIH0sXG4gICAgICAgICAgICB0eXBlOiAoKSA9PiB3YWxsZXRUeXBlLFxuICAgICAgICAgICAgbXVsdGlzaWdUeXBlOiAoKSA9PiAndHNzJyxcbiAgICAgICAgICB9IGFzIGFueSBhcyBJV2FsbGV0LFxuICAgICAgICAgIHJlcXVlc3RlZEFwaVZlcnNpb246ICdmdWxsJyxcbiAgICAgICAgICBleHBlY3RlZEFwaVZlcnNpb246ICdmdWxsJyxcbiAgICAgICAgICBleHBlY3RlZEVycm9yTWVzc2FnZTogJycsXG4gICAgICAgICAgc2hvdWxkVGhyb3c6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICAuLi5bJ2hvdCcsICdjb2xkJywgJ2N1c3RvZGlhbCcsICdiYWNraW5nJ10ubWFwKCh3YWxsZXRUeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgICBiYXNlQ29pbjogeyBnZXRNUENBbGdvcml0aG06ICgpID0+ICdlY2RzYScgfSxcbiAgICAgICAgICAgIHR5cGU6ICgpID0+IHdhbGxldFR5cGUsXG4gICAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICgpID0+ICd0c3MnLFxuICAgICAgICAgIH0gYXMgYW55IGFzIElXYWxsZXQsXG4gICAgICAgICAgcmVxdWVzdGVkQXBpVmVyc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICAgIGV4cGVjdGVkQXBpVmVyc2lvbjogJ2Z1bGwnLFxuICAgICAgICAgIGV4cGVjdGVkRXJyb3JNZXNzYWdlOiAnJyxcbiAgICAgICAgICBzaG91bGRUaHJvdzogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIC4uLlsnaG90JywgJ2NvbGQnLCAnY3VzdG9kaWFsJywgJ2JhY2tpbmcnXS5tYXAoKHdhbGxldFR5cGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICAgIGJhc2VDb2luOiB7IGdldE1QQ0FsZ29yaXRobTogKCkgPT4gJ2VkZHNhJyB9LFxuICAgICAgICAgICAgdHlwZTogKCkgPT4gd2FsbGV0VHlwZSxcbiAgICAgICAgICAgIG11bHRpc2lnVHlwZTogKCkgPT4gJ3RzcycsXG4gICAgICAgICAgfSBhcyBhbnkgYXMgSVdhbGxldCxcbiAgICAgICAgICByZXF1ZXN0ZWRBcGlWZXJzaW9uOiAnZnVsbCcsXG4gICAgICAgICAgZXhwZWN0ZWRBcGlWZXJzaW9uOiAnZnVsbCcsXG4gICAgICAgICAgZXhwZWN0ZWRFcnJvck1lc3NhZ2U6ICcnLFxuICAgICAgICAgIHNob3VsZFRocm93OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICAgLi4uWydjb2xkJywgJ2N1c3RvZGlhbCcsICdiYWNraW5nJ10ubWFwKCh3YWxsZXRUeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgICBiYXNlQ29pbjogeyBnZXRNUENBbGdvcml0aG06ICgpID0+ICdlZGRzYScgfSxcbiAgICAgICAgICAgIHR5cGU6ICgpID0+IHdhbGxldFR5cGUsXG4gICAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICgpID0+ICd0c3MnLFxuICAgICAgICAgIH0gYXMgYW55IGFzIElXYWxsZXQsXG4gICAgICAgICAgcmVxdWVzdGVkQXBpVmVyc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICAgIGV4cGVjdGVkQXBpVmVyc2lvbjogJ2Z1bGwnLFxuICAgICAgICAgIGV4cGVjdGVkRXJyb3JNZXNzYWdlOiAnJyxcbiAgICAgICAgICBzaG91bGRUaHJvdzogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICBdO1xuXG4gICAgdGVzdENhc2VzLmZvckVhY2goKHRlc3RDYXNlKSA9PiB7XG4gICAgICBpZiAodGVzdENhc2UuZXhwZWN0ZWRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgaXQoYHNob3VsZCB0aHJvdyBhbiBlcnJvciBpZiByZXF1ZXN0ZWQgYXBpVmVyc2lvbiBpcyAke1xuICAgICAgICAgIHRlc3RDYXNlLnJlcXVlc3RlZEFwaVZlcnNpb25cbiAgICAgICAgfSBmb3Igd2FsbGV0IHR5cGUgJHt0ZXN0Q2FzZS53YWxsZXQudHlwZSgpfSBmb3IgYSAke3Rlc3RDYXNlLndhbGxldC5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKX0gd2FsbGV0YCwgKCkgPT4ge1xuICAgICAgICAgICgoKSA9PlxuICAgICAgICAgICAgZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbihcbiAgICAgICAgICAgICAgdGVzdENhc2Uud2FsbGV0LFxuICAgICAgICAgICAgICB0ZXN0Q2FzZS5yZXF1ZXN0ZWRBcGlWZXJzaW9uIGFzIEFwaVZlcnNpb24gfCB1bmRlZmluZWRcbiAgICAgICAgICAgICkpLnNob3VsZC50aHJvdyh0ZXN0Q2FzZS5leHBlY3RlZEVycm9yTWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXQoYHNob3VsZCByZXR1cm4gJHt0ZXN0Q2FzZS5leHBlY3RlZEFwaVZlcnNpb259IGlmIHJlcXVlc3RlZCBhcGlWZXJzaW9uIGlzICR7XG4gICAgICAgICAgdGVzdENhc2UucmVxdWVzdGVkQXBpVmVyc2lvblxuICAgICAgICB9IGZvciB3YWxsZXQgdHlwZSAke3Rlc3RDYXNlLndhbGxldC50eXBlKCl9IGZvciBhICR7dGVzdENhc2Uud2FsbGV0LmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpfSB3YWxsZXRgLCAoKSA9PiB7XG4gICAgICAgICAgZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbih0ZXN0Q2FzZS53YWxsZXQsIHRlc3RDYXNlLnJlcXVlc3RlZEFwaVZlcnNpb24gYXMgQXBpVmVyc2lvbiB8IHVuZGVmaW5lZCkuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICAgdGVzdENhc2UuZXhwZWN0ZWRBcGlWZXJzaW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhSZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3V0aWxzL3R4UmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtCQUFnQjtBQUVoQixxRUFBK0U7QUFFL0UsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtJQUMvQixRQUFRLENBQUMsd0JBQXdCLEVBQUU7UUFDakMsTUFBTSxTQUFTLEdBQUc7WUFDaEI7Z0JBQ0UsTUFBTSxFQUFFO29CQUNOLFFBQVEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUU7b0JBQzVDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO29CQUNqQixZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSztvQkFDekIsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUztpQkFDbkI7Z0JBQ25CLG1CQUFtQixFQUFFLE1BQU07Z0JBQzNCLGtCQUFrQixFQUFFLEVBQUU7Z0JBQ3RCLG9CQUFvQixFQUFFLCtEQUErRDthQUN0RjtZQUNEO2dCQUNFLE1BQU0sRUFBRTtvQkFDTixRQUFRLEVBQUUsRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFO29CQUM1QyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTTtvQkFDbEIsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7b0JBQ3pCLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVM7aUJBQ25CO2dCQUNuQixtQkFBbUIsRUFBRSxNQUFNO2dCQUMzQixrQkFBa0IsRUFBRSxFQUFFO2dCQUN0QixvQkFBb0IsRUFBRSxrRkFBa0Y7YUFDekc7WUFDRDtnQkFDRSxNQUFNLEVBQUU7b0JBQ04sUUFBUSxFQUFFLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRTtvQkFDNUMsSUFBSSxFQUFF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aVZlcnNpb24sIElXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90eFJlcXVlc3QnO1xuXG5kZXNjcmliZSgndHhSZXF1ZXN0IHV0aWxzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0ZXN0Q2FzZXMgPSBbXG4gICAgICB7XG4gICAgICAgIHdhbGxldDoge1xuICAgICAgICAgIGJhc2VDb2luOiB7IGdldE1QQ0FsZ29yaXRobTogKCkgPT4gJ2VjZHNhJyB9LFxuICAgICAgICAgIHR5cGU6ICgpID0+ICdob3QnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZTogKCkgPT4gJ3RzcycsXG4gICAgICAgICAgbXVsdGlzaWdUeXBlVmVyc2lvbjogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICB9IGFzIGFueSBhcyBJV2FsbGV0LFxuICAgICAgICByZXF1ZXN0ZWRBcGlWZXJzaW9uOiAnbGl0ZScsXG4gICAgICAgIGV4cGVjdGVkQXBpVmVyc2lvbjogJycsXG4gICAgICAgIGV4cGVjdGVkRXJyb3JNZXNzYWdlOiAnRm9yIEVDRFNBIHRzcyB3YWxsZXRzLCBwYXJhbWV0ZXIgYGFwaVZlcnNpb25gIG11c3QgYmUgYGZ1bGxgLicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICBiYXNlQ29pbjogeyBnZXRNUENBbGdvcml0aG06ICgpID0+ICdlZGRzYScgfSxcbiAgICAgICAgICB0eXBlOiAoKSA9PiAnY29sZCcsXG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAoKSA9PiAndHNzJyxcbiAgICAgICAgICBtdWx0aXNpZ1R5cGVWZXJzaW9uOiAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgIH0gYXMgYW55IGFzIElXYWxsZXQsXG4gICAgICAgIHJlcXVlc3RlZEFwaVZlcnNpb246ICdsaXRlJyxcbiAgICAgICAgZXhwZWN0ZWRBcGlWZXJzaW9uOiAnJyxcbiAgICAgICAgZXhwZWN0ZWRFcnJvck1lc3NhZ2U6ICdGb3Igbm9uIHNlbGYtY3VzdG9kaWFsIChob3QpIHRzcyB3YWxsZXRzLCBwYXJhbWV0ZXIgYGFwaVZlcnNpb25gIG11c3QgYmUgYGZ1bGxgLicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICBiYXNlQ29pbjogeyBnZXRNUENBbGdvcml0aG06ICgpID0+ICdlZGRzYScgfSxcbiAgICAgICAgICB0eXBlOiAoKSA9PiAnaG90JyxcbiAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICgpID0+ICd0c3MnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZVZlcnNpb246ICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgfSBhcyBhbnkgYXMgSVdhbGxldCxcbiAgICAgICAgcmVxdWVzdGVkQXBpVmVyc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBleHBlY3RlZEFwaVZlcnNpb246ICdsaXRlJyxcbiAgICAgICAgZXhwZWN0ZWRFcnJvck1lc3NhZ2U6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgYmFzZUNvaW46IHsgZ2V0TVBDQWxnb3JpdGhtOiAoKSA9PiAnZWRkc2EnIH0sXG4gICAgICAgICAgdHlwZTogKCkgPT4gJ2hvdCcsXG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAoKSA9PiAndHNzJyxcbiAgICAgICAgICBtdWx0aXNpZ1R5cGVWZXJzaW9uOiAoKSA9PiAnTVBDdjInLFxuICAgICAgICB9IGFzIGFueSBhcyBJV2FsbGV0LFxuICAgICAgICByZXF1ZXN0ZWRBcGlWZXJzaW9uOiAnbGl0ZScgYXMgQXBpVmVyc2lvbixcbiAgICAgICAgZXhwZWN0ZWRBcGlWZXJzaW9uOiAnJyxcbiAgICAgICAgZXhwZWN0ZWRFcnJvck1lc3NhZ2U6ICdGb3IgRWREU0EgTVBDdjIgdHNzIHdhbGxldHMsIHBhcmFtZXRlciBgYXBpVmVyc2lvbmAgbXVzdCBiZSBgZnVsbGAuJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHdhbGxldDoge1xuICAgICAgICAgIGJhc2VDb2luOiB7IGdldE1QQ0FsZ29yaXRobTogKCkgPT4gJ2VkZHNhJyB9LFxuICAgICAgICAgIHR5cGU6ICgpID0+ICdob3QnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZTogKCkgPT4gJ3RzcycsXG4gICAgICAgICAgbXVsdGlzaWdUeXBlVmVyc2lvbjogKCkgPT4gJ01QQ3YyJyxcbiAgICAgICAgfSBhcyBhbnkgYXMgSVdhbGxldCxcbiAgICAgICAgcmVxdWVzdGVkQXBpVmVyc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBleHBlY3RlZEFwaVZlcnNpb246ICdmdWxsJyxcbiAgICAgICAgZXhwZWN0ZWRFcnJvck1lc3NhZ2U6ICcnLFxuICAgICAgfSxcbiAgICAgIC4uLlsnaG90JywgJ2NvbGQnLCAnY3VzdG9kaWFsJywgJ2JhY2tpbmcnXS5tYXAoKHdhbGxldFR5cGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICAgIGJhc2VDb2luOiB7IGdldE1QQ0FsZ29yaXRobTogKCkgPT4gJ2VjZHNhJyB9LFxuICAgICAgICAgICAgdHlwZTogKCkgPT4gd2FsbGV0VHlwZSxcbiAgICAgICAgICAgIG11bHRpc2lnVHlwZTogKCkgPT4gJ3RzcycsXG4gICAgICAgICAgICBtdWx0aXNpZ1R5cGVWZXJzaW9uOiAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgICAgfSBhcyBhbnkgYXMgSVdhbGxldCxcbiAgICAgICAgICByZXF1ZXN0ZWRBcGlWZXJzaW9uOiAnZnVsbCcsXG4gICAgICAgICAgZXhwZWN0ZWRBcGlWZXJzaW9uOiAnZnVsbCcsXG4gICAgICAgICAgZXhwZWN0ZWRFcnJvck1lc3NhZ2U6ICcnLFxuICAgICAgICAgIHNob3VsZFRocm93OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICAgLi4uWydob3QnLCAnY29sZCcsICdjdXN0b2RpYWwnLCAnYmFja2luZyddLm1hcCgod2FsbGV0VHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdhbGxldDoge1xuICAgICAgICAgICAgYmFzZUNvaW46IHsgZ2V0TVBDQWxnb3JpdGhtOiAoKSA9PiAnZWNkc2EnIH0sXG4gICAgICAgICAgICB0eXBlOiAoKSA9PiB3YWxsZXRUeXBlLFxuICAgICAgICAgICAgbXVsdGlzaWdUeXBlOiAoKSA9PiAndHNzJyxcbiAgICAgICAgICAgIG11bHRpc2lnVHlwZVZlcnNpb246ICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgICB9IGFzIGFueSBhcyBJV2FsbGV0LFxuICAgICAgICAgIHJlcXVlc3RlZEFwaVZlcnNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICBleHBlY3RlZEFwaVZlcnNpb246ICdmdWxsJyxcbiAgICAgICAgICBleHBlY3RlZEVycm9yTWVzc2FnZTogJycsXG4gICAgICAgICAgc2hvdWxkVGhyb3c6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICAuLi5bJ2hvdCcsICdjb2xkJywgJ2N1c3RvZGlhbCcsICdiYWNraW5nJ10ubWFwKCh3YWxsZXRUeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgICBiYXNlQ29pbjogeyBnZXRNUENBbGdvcml0aG06ICgpID0+ICdlZGRzYScgfSxcbiAgICAgICAgICAgIHR5cGU6ICgpID0+IHdhbGxldFR5cGUsXG4gICAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICgpID0+ICd0c3MnLFxuICAgICAgICAgICAgbXVsdGlzaWdUeXBlVmVyc2lvbjogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAgIH0gYXMgYW55IGFzIElXYWxsZXQsXG4gICAgICAgICAgcmVxdWVzdGVkQXBpVmVyc2lvbjogJ2Z1bGwnLFxuICAgICAgICAgIGV4cGVjdGVkQXBpVmVyc2lvbjogJ2Z1bGwnLFxuICAgICAgICAgIGV4cGVjdGVkRXJyb3JNZXNzYWdlOiAnJyxcbiAgICAgICAgICBzaG91bGRUaHJvdzogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIC4uLlsnY29sZCcsICdjdXN0b2RpYWwnLCAnYmFja2luZyddLm1hcCgod2FsbGV0VHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdhbGxldDoge1xuICAgICAgICAgICAgYmFzZUNvaW46IHsgZ2V0TVBDQWxnb3JpdGhtOiAoKSA9PiAnZWRkc2EnIH0sXG4gICAgICAgICAgICB0eXBlOiAoKSA9PiB3YWxsZXRUeXBlLFxuICAgICAgICAgICAgbXVsdGlzaWdUeXBlOiAoKSA9PiAndHNzJyxcbiAgICAgICAgICAgIG11bHRpc2lnVHlwZVZlcnNpb246ICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgICB9IGFzIGFueSBhcyBJV2FsbGV0LFxuICAgICAgICAgIHJlcXVlc3RlZEFwaVZlcnNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICBleHBlY3RlZEFwaVZlcnNpb246ICdmdWxsJyxcbiAgICAgICAgICBleHBlY3RlZEVycm9yTWVzc2FnZTogJycsXG4gICAgICAgICAgc2hvdWxkVGhyb3c6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICAvLyBFZERTQSBNUEN2MjogYWxsIHdhbGxldCB0eXBlcyArICdmdWxsJyBleHBsaWNpdGx5IOKGkiByZXR1cm5zICdmdWxsJ1xuICAgICAgLi4uWydob3QnLCAnY29sZCcsICdjdXN0b2RpYWwnLCAnYmFja2luZyddLm1hcCgod2FsbGV0VHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdhbGxldDoge1xuICAgICAgICAgICAgYmFzZUNvaW46IHsgZ2V0TVBDQWxnb3JpdGhtOiAoKSA9PiAnZWRkc2EnIH0sXG4gICAgICAgICAgICB0eXBlOiAoKSA9PiB3YWxsZXRUeXBlLFxuICAgICAgICAgICAgbXVsdGlzaWdUeXBlOiAoKSA9PiAndHNzJyxcbiAgICAgICAgICAgIG11bHRpc2lnVHlwZVZlcnNpb246ICgpID0+ICdNUEN2MicsXG4gICAgICAgICAgfSBhcyBhbnkgYXMgSVdhbGxldCxcbiAgICAgICAgICByZXF1ZXN0ZWRBcGlWZXJzaW9uOiAnZnVsbCcgYXMgQXBpVmVyc2lvbixcbiAgICAgICAgICBleHBlY3RlZEFwaVZlcnNpb246ICdmdWxsJyxcbiAgICAgICAgICBleHBlY3RlZEVycm9yTWVzc2FnZTogJycsXG4gICAgICAgICAgc2hvdWxkVGhyb3c6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICAvLyBFZERTQSBNUEN2Mjogbm9uLWhvdCB3YWxsZXQgdHlwZXMgKyB1bmRlZmluZWQg4oaSIGRlZmF1bHRzIHRvICdmdWxsJ1xuICAgICAgLi4uWydjb2xkJywgJ2N1c3RvZGlhbCcsICdiYWNraW5nJ10ubWFwKCh3YWxsZXRUeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgICBiYXNlQ29pbjogeyBnZXRNUENBbGdvcml0aG06ICgpID0+ICdlZGRzYScgfSxcbiAgICAgICAgICAgIHR5cGU6ICgpID0+IHdhbGxldFR5cGUsXG4gICAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICgpID0+ICd0c3MnLFxuICAgICAgICAgICAgbXVsdGlzaWdUeXBlVmVyc2lvbjogKCkgPT4gJ01QQ3YyJyxcbiAgICAgICAgICB9IGFzIGFueSBhcyBJV2FsbGV0LFxuICAgICAgICAgIHJlcXVlc3RlZEFwaVZlcnNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICBleHBlY3RlZEFwaVZlcnNpb246ICdmdWxsJyxcbiAgICAgICAgICBleHBlY3RlZEVycm9yTWVzc2FnZTogJycsXG4gICAgICAgICAgc2hvdWxkVGhyb3c6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICAvLyBFZERTQSBNUEN2Mjogbm9uLWhvdCB3YWxsZXQgdHlwZXMgKyAnbGl0ZScg4oaSIHRocm93cyBFZERTQSBNUEN2MiBlcnJvclxuICAgICAgLi4uWydjb2xkJywgJ2N1c3RvZGlhbCcsICdiYWNraW5nJ10ubWFwKCh3YWxsZXRUeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgICBiYXNlQ29pbjogeyBnZXRNUENBbGdvcml0aG06ICgpID0+ICdlZGRzYScgfSxcbiAgICAgICAgICAgIHR5cGU6ICgpID0+IHdhbGxldFR5cGUsXG4gICAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICgpID0+ICd0c3MnLFxuICAgICAgICAgICAgbXVsdGlzaWdUeXBlVmVyc2lvbjogKCkgPT4gJ01QQ3YyJyxcbiAgICAgICAgICB9IGFzIGFueSBhcyBJV2FsbGV0LFxuICAgICAgICAgIHJlcXVlc3RlZEFwaVZlcnNpb246ICdsaXRlJyBhcyBBcGlWZXJzaW9uLFxuICAgICAgICAgIGV4cGVjdGVkQXBpVmVyc2lvbjogJycsXG4gICAgICAgICAgZXhwZWN0ZWRFcnJvck1lc3NhZ2U6ICdGb3IgRWREU0EgTVBDdjIgdHNzIHdhbGxldHMsIHBhcmFtZXRlciBgYXBpVmVyc2lvbmAgbXVzdCBiZSBgZnVsbGAuJyxcbiAgICAgICAgICBzaG91bGRUaHJvdzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIF07XG5cbiAgICB0ZXN0Q2FzZXMuZm9yRWFjaCgodGVzdENhc2UpID0+IHtcbiAgICAgIGlmICh0ZXN0Q2FzZS5leHBlY3RlZEVycm9yTWVzc2FnZSkge1xuICAgICAgICBpdChgc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIHJlcXVlc3RlZCBhcGlWZXJzaW9uIGlzICR7XG4gICAgICAgICAgdGVzdENhc2UucmVxdWVzdGVkQXBpVmVyc2lvblxuICAgICAgICB9IGZvciB3YWxsZXQgdHlwZSAke3Rlc3RDYXNlLndhbGxldC50eXBlKCl9IGZvciBhICR7dGVzdENhc2Uud2FsbGV0LmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpfSB3YWxsZXRgLCAoKSA9PiB7XG4gICAgICAgICAgKCgpID0+XG4gICAgICAgICAgICBnZXRUeFJlcXVlc3RBcGlWZXJzaW9uKFxuICAgICAgICAgICAgICB0ZXN0Q2FzZS53YWxsZXQsXG4gICAgICAgICAgICAgIHRlc3RDYXNlLnJlcXVlc3RlZEFwaVZlcnNpb24gYXMgQXBpVmVyc2lvbiB8IHVuZGVmaW5lZFxuICAgICAgICAgICAgKSkuc2hvdWxkLnRocm93KHRlc3RDYXNlLmV4cGVjdGVkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdChgc2hvdWxkIHJldHVybiAke3Rlc3RDYXNlLmV4cGVjdGVkQXBpVmVyc2lvbn0gaWYgcmVxdWVzdGVkIGFwaVZlcnNpb24gaXMgJHtcbiAgICAgICAgICB0ZXN0Q2FzZS5yZXF1ZXN0ZWRBcGlWZXJzaW9uXG4gICAgICAgIH0gZm9yIHdhbGxldCB0eXBlICR7dGVzdENhc2Uud2FsbGV0LnR5cGUoKX0gZm9yIGEgJHt0ZXN0Q2FzZS53YWxsZXQuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCl9IHdhbGxldGAsICgpID0+IHtcbiAgICAgICAgICBnZXRUeFJlcXVlc3RBcGlWZXJzaW9uKHRlc3RDYXNlLndhbGxldCwgdGVzdENhc2UucmVxdWVzdGVkQXBpVmVyc2lvbiBhcyBBcGlWZXJzaW9uIHwgdW5kZWZpbmVkKS5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgICB0ZXN0Q2FzZS5leHBlY3RlZEFwaVZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=ofcWalletSignTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ofcWalletSignTransaction.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/wallet/ofcWalletSignTransaction.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ /**
7
+ * @prettier
8
+ */
9
+ const sinon_1 = __importDefault(require("sinon"));
10
+ require("should");
11
+ const src_1 = require("../../../../src");
12
+ const coins_1 = require("../../../../src/coins");
13
+ const TEST_TOKEN_CONFIG = {
14
+ coin: 'ofcusdt',
15
+ decimalPlaces: 6,
16
+ name: 'OFCUSDT',
17
+ type: 'ofcusdt',
18
+ backingCoin: 'usdt',
19
+ isFiat: false,
20
+ };
21
+ describe('Wallet - OFC', function () {
22
+ let wallet;
23
+ let mockBitGo;
24
+ let ofcToken;
25
+ let signMessageStub;
26
+ const signatureBytes = Buffer.from('aabbccdd', 'hex');
27
+ const payload = '{"amount":"100","from":"alice","to":"bob"}';
28
+ const prv = 'test-prv';
29
+ // bg-<32 hex chars> is valid for OfcToken without needing to resolve the backing coin
30
+ const recipients = [{ address: 'bg-aabbccddeeff00112233445566778899', amount: '100' }];
31
+ const userPub = 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC51xERxh8vDMjc3PiGpQ3VeQcHBiGxbsrRXbCKQZZxBtDMrmBRzxRMkBJGsC9bsYb5tggVF3jGfEE';
32
+ const walletData = {
33
+ id: 'test-wallet-id',
34
+ coin: 'ofcusdt',
35
+ keys: ['user-key', 'backup-key', 'bitgo-key'],
36
+ type: 'trading',
37
+ multisigType: 'onchain',
38
+ enterprise: 'ent-id',
39
+ };
40
+ /**
41
+ * Creates a fluent request mock that handles .query().send().result() and .send().result()
42
+ * chains, resolving with the provided value.
43
+ */
44
+ function makeRequestChain(resolved) {
45
+ const chain = {};
46
+ chain.query = sinon_1.default.stub().returns(chain);
47
+ chain.send = sinon_1.default.stub().returns(chain);
48
+ chain.result = sinon_1.default.stub().resolves(resolved);
49
+ return chain;
50
+ }
51
+ beforeEach(function () {
52
+ signMessageStub = sinon_1.default.stub(src_1.BaseCoin.prototype, 'signMessage');
53
+ signMessageStub.withArgs({ prv }, payload).resolves(signatureBytes);
54
+ sinon_1.default.stub(src_1.BaseCoin.prototype, 'keychains').returns({
55
+ getKeysForSigning: sinon_1.default.stub().resolves([{ id: walletData.keys[0], pub: userPub }]),
56
+ });
57
+ mockBitGo = {
58
+ url: sinon_1.default.stub().returns('https://test.bitgo.com/'),
59
+ post: sinon_1.default.stub(),
60
+ setRequestTracer: sinon_1.default.stub(),
61
+ };
62
+ ofcToken = new coins_1.OfcToken(mockBitGo, TEST_TOKEN_CONFIG);
63
+ mockBitGo.coin = sinon_1.default.stub().returns(ofcToken);
64
+ wallet = new src_1.Wallet(mockBitGo, ofcToken, walletData);
65
+ });
66
+ afterEach(function () {
67
+ sinon_1.default.restore();
68
+ });
69
+ describe('with userKeySigningRequired: true (local signing via user key)', function () {
70
+ const buildUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/build');
71
+ const signUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/sign');
72
+ const sendUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/send');
73
+ describe('signTransaction', function () {
74
+ it('should call baseCoin.signMessage with the prv and payload', async function () {
75
+ const result = await wallet.signTransaction({ txPrebuild: { payload }, prv });
76
+ signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
77
+ mockBitGo.post.called.should.be.false();
78
+ result.should.deepEqual({ halfSigned: { payload, signature: signatureBytes.toString('hex') } });
79
+ });
80
+ describe('with walletPassphrase and keychain', function () {
81
+ const walletPassphrase = 'test-passphrase';
82
+ const encryptedPrv = 'encrypted-prv-blob';
83
+ beforeEach(function () {
84
+ // compiled wallet.js: getUserPrv (sync) → decryptKeychainPrivateKey → bitgo.decrypt
85
+ // TypeScript source: getUserPrvAsync → decryptKeychainPrivateKeyAsync → bitgo.decryptAsync
86
+ mockBitGo.decrypt = sinon_1.default.stub().returns(prv);
87
+ mockBitGo.decryptAsync = sinon_1.default.stub().resolves(prv);
88
+ });
89
+ it('should decrypt the keychain with the passphrase and sign via baseCoin.signMessage', async function () {
90
+ const result = await wallet.signTransaction({
91
+ txPrebuild: { payload },
92
+ walletPassphrase,
93
+ keychain: { pub: userPub, encryptedPrv },
94
+ });
95
+ const decryptCalled = mockBitGo.decrypt.calledWith({ input: encryptedPrv, password: walletPassphrase }) ||
96
+ mockBitGo.decryptAsync.calledWith({ input: encryptedPrv, password: walletPassphrase });
97
+ decryptCalled.should.be.true();
98
+ signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
99
+ mockBitGo.post.called.should.be.false();
100
+ result.should.deepEqual({ halfSigned: { payload, signature: signatureBytes.toString('hex') } });
101
+ });
102
+ });
103
+ });
104
+ describe('prebuildAndSignTransaction', function () {
105
+ beforeEach(function () {
106
+ mockBitGo.post.withArgs(buildUrl()).returns(makeRequestChain({ payload }));
107
+ });
108
+ it('should call the prebuild API then sign locally with the prv', async function () {
109
+ const result = await wallet.prebuildAndSignTransaction({ prv });
110
+ mockBitGo.post.calledWith(buildUrl()).should.be.true();
111
+ mockBitGo.post.calledWith(signUrl()).should.be.false();
112
+ signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
113
+ result.should.deepEqual({ halfSigned: { payload, signature: signatureBytes.toString('hex') } });
114
+ });
115
+ });
116
+ describe('sendMany', function () {
117
+ beforeEach(function () {
118
+ mockBitGo.post.withArgs(buildUrl()).returns(makeRequestChain({ payload }));
119
+ mockBitGo.post.withArgs(sendUrl()).returns(makeRequestChain({ txid: 'test-txid', status: 'signed' }));
120
+ });
121
+ it('should prebuild, sign locally, and submit to the send endpoint', async function () {
122
+ const result = await wallet.sendMany({ recipients, prv });
123
+ mockBitGo.post.calledWith(buildUrl()).should.be.true();
124
+ signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
125
+ mockBitGo.post.calledWith(sendUrl()).should.be.true();
126
+ result.should.deepEqual({ txid: 'test-txid', status: 'signed' });
127
+ });
128
+ });
129
+ });
130
+ describe('with userKeySigningRequired: false (remote signing via BitGo key)', function () {
131
+ const signUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/sign');
132
+ const buildUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/build');
133
+ const sendUrl = () => ofcToken.url('/wallet/' + walletData.id + '/tx/send');
134
+ const hexSignature = 'deadbeef';
135
+ let remoteWallet;
136
+ beforeEach(function () {
137
+ remoteWallet = new src_1.Wallet(mockBitGo, ofcToken, { ...walletData, userKeySigningRequired: false });
138
+ // compiled wallet.js calls getUserPrv (sync) for all coins; stub to return undefined
139
+ // so the remote signing path reaches baseCoin.signTransaction with prv: undefined
140
+ remoteWallet.getUserPrv = sinon_1.default.stub().returns(undefined);
141
+ mockBitGo.post.withArgs(signUrl()).returns(makeRequestChain({ signature: hexSignature }));
142
+ });
143
+ it('should sign locally when userKeySigningRequired is true and prv is provided', async function () {
144
+ const strictWallet = new src_1.Wallet(mockBitGo, ofcToken, { ...walletData, userKeySigningRequired: true });
145
+ const result = await strictWallet.signTransaction({ txPrebuild: { payload }, prv });
146
+ signMessageStub.calledOnceWith({ prv }, payload).should.be.true();
147
+ mockBitGo.post.calledWith(signUrl()).should.be.false();
148
+ result.should.deepEqual({ halfSigned: { payload, signature: signatureBytes.toString('hex') } });
149
+ });
150
+ describe('signTransaction', function () {
151
+ it('should POST to the sign endpoint and return the halfSigned result', async function () {
152
+ const result = await remoteWallet.signTransaction({ txPrebuild: { payload } });
153
+ mockBitGo.post.calledWith(signUrl()).should.be.true();
154
+ signMessageStub.called.should.be.false();
155
+ result.should.deepEqual({ halfSigned: { payload, signature: hexSignature } });
156
+ });
157
+ });
158
+ describe('prebuildAndSignTransaction', function () {
159
+ beforeEach(function () {
160
+ mockBitGo.post.withArgs(buildUrl()).returns(makeRequestChain({ payload }));
161
+ });
162
+ it('should prebuild and remotely sign the transaction', async function () {
163
+ const result = await remoteWallet.prebuildAndSignTransaction({});
164
+ mockBitGo.post.calledWith(buildUrl()).should.be.true();
165
+ mockBitGo.post.calledWith(signUrl()).should.be.true();
166
+ signMessageStub.called.should.be.false();
167
+ result.should.deepEqual({ halfSigned: { payload, signature: hexSignature } });
168
+ });
169
+ });
170
+ describe('sendMany', function () {
171
+ beforeEach(function () {
172
+ mockBitGo.post.withArgs(buildUrl()).returns(makeRequestChain({ payload }));
173
+ mockBitGo.post.withArgs(sendUrl()).returns(makeRequestChain({ txid: 'test-txid', status: 'signed' }));
174
+ });
175
+ it('should prebuild, remotely sign, and send the transaction', async function () {
176
+ const result = await remoteWallet.sendMany({ recipients });
177
+ mockBitGo.post.calledWith(buildUrl()).should.be.true();
178
+ mockBitGo.post.calledWith(signUrl()).should.be.true();
179
+ signMessageStub.called.should.be.false();
180
+ result.should.deepEqual({ txid: 'test-txid', status: 'signed' });
181
+ });
182
+ });
183
+ });
184
+ });
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjV2FsbGV0U2lnblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC9vZmNXYWxsZXRTaWduVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILGtEQUEwQjtBQUMxQixrQkFBZ0I7QUFDaEIseUNBQW1EO0FBQ25ELGlEQUFpRDtBQUVqRCxNQUFNLGlCQUFpQixHQUFHO0lBQ3hCLElBQUksRUFBRSxTQUFTO0lBQ2YsYUFBYSxFQUFFLENBQUM7SUFDaEIsSUFBSSxFQUFFLFNBQVM7SUFDZixJQUFJLEVBQUUsU0FBUztJQUNmLFdBQVcsRUFBRSxNQUFNO0lBQ25CLE1BQU0sRUFBRSxLQUFLO0NBQ2QsQ0FBQztBQUVGLFFBQVEsQ0FBQyxjQUFjLEVBQUU7SUFDdkIsSUFBSSxNQUFjLENBQUM7SUFDbkIsSUFBSSxTQUFjLENBQUM7SUFDbkIsSUFBSSxRQUFrQixDQUFDO0lBQ3ZCLElBQUksZUFBZ0MsQ0FBQztJQUNyQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyw0Q0FBNEMsQ0FBQztJQUM3RCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUM7SUFDdkIsc0ZBQXNGO0lBQ3RGLE1BQU0sVUFBVSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkYsTUFBTSxPQUFPLEdBQ1gsaUhBQWlILENBQUM7SUFFcEgsTUFBTSxVQUFVLEdBQUc7UUFDakIsRUFBRSxFQUFFLGdCQUFnQjtRQUNwQixJQUFJLEVBQUUsU0FBUztRQUNmLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDO1FBQzdDLElBQUksRUFBRSxTQUFTO1FB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QUFDO2dCQUNULFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RyxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRSxLQUFLO2dCQUNsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUUzRCxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdEQsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgV2FsbGV0LCBCYXNlQ29pbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBPZmNUb2tlbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9jb2lucyc7XG5cbmNvbnN0IFRFU1RfVE9LRU5fQ09ORklHID0ge1xuICBjb2luOiAnb2ZjdXNkdCcsXG4gIGRlY2ltYWxQbGFjZXM6IDYsXG4gIG5hbWU6ICdPRkNVU0RUJyxcbiAgdHlwZTogJ29mY3VzZHQnLFxuICBiYWNraW5nQ29pbjogJ3VzZHQnLFxuICBpc0ZpYXQ6IGZhbHNlLFxufTtcblxuZGVzY3JpYmUoJ1dhbGxldCAtIE9GQycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldDogV2FsbGV0O1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG4gIGxldCBvZmNUb2tlbjogT2ZjVG9rZW47XG4gIGxldCBzaWduTWVzc2FnZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgY29uc3Qgc2lnbmF0dXJlQnl0ZXMgPSBCdWZmZXIuZnJvbSgnYWFiYmNjZGQnLCAnaGV4Jyk7XG4gIGNvbnN0IHBheWxvYWQgPSAne1wiYW1vdW50XCI6XCIxMDBcIixcImZyb21cIjpcImFsaWNlXCIsXCJ0b1wiOlwiYm9iXCJ9JztcbiAgY29uc3QgcHJ2ID0gJ3Rlc3QtcHJ2JztcbiAgLy8gYmctPDMyIGhleCBjaGFycz4gaXMgdmFsaWQgZm9yIE9mY1Rva2VuIHdpdGhvdXQgbmVlZGluZyB0byByZXNvbHZlIHRoZSBiYWNraW5nIGNvaW5cbiAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6ICdiZy1hYWJiY2NkZGVlZmYwMDExMjIzMzQ0NTU2Njc3ODg5OScsIGFtb3VudDogJzEwMCcgfV07XG4gIGNvbnN0IHVzZXJQdWIgPVxuICAgICd4cHViNjYxTXlNd0FxUmJjRnRYZ1M1c1lKQUJxcUc5WUxtQzUxeEVSeGg4dkRNamMzUGlHcFEzVmVRY0hCaUd4YnNyUlhiQ0tRWlp4QnRETXJtQlJ6eFJNa0JKR3NDOWJzWWI1dGdnVkYzakdmRUUnO1xuXG4gIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgY29pbjogJ29mY3VzZHQnLFxuICAgIGtleXM6IFsndXNlci1rZXknLCAnYmFja3VwLWtleScsICdiaXRnby1rZXknXSxcbiAgICB0eXBlOiAndHJhZGluZycsXG4gICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgZW50ZXJwcmlzZTogJ2VudC1pZCcsXG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmbHVlbnQgcmVxdWVzdCBtb2NrIHRoYXQgaGFuZGxlcyAucXVlcnkoKS5zZW5kKCkucmVzdWx0KCkgYW5kIC5zZW5kKCkucmVzdWx0KClcbiAgICogY2hhaW5zLCByZXNvbHZpbmcgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBtYWtlUmVxdWVzdENoYWluKHJlc29sdmVkOiB1bmtub3duKTogYW55IHtcbiAgICBjb25zdCBjaGFpbjogYW55ID0ge307XG4gICAgY2hhaW4ucXVlcnkgPSBzaW5vbi5zdHViKCkucmV0dXJucyhjaGFpbik7XG4gICAgY2hhaW4uc2VuZCA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGNoYWluKTtcbiAgICBjaGFpbi5yZXN1bHQgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMocmVzb2x2ZWQpO1xuICAgIHJldHVybiBjaGFpbjtcbiAgfVxuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpZ25NZXNzYWdlU3R1YiA9IHNpbm9uLnN0dWIoQmFzZUNvaW4ucHJvdG90eXBlLCAnc2lnbk1lc3NhZ2UnKTtcbiAgICBzaWduTWVzc2FnZVN0dWIud2l0aEFyZ3MoeyBwcnYgfSwgcGF5bG9hZCkucmVzb2x2ZXMoc2lnbmF0dXJlQnl0ZXMpO1xuICAgIHNpbm9uLnN0dWIoQmFzZUNvaW4ucHJvdG90eXBlLCAna2V5Y2hhaW5zJykucmV0dXJucyh7XG4gICAgICBnZXRLZXlzRm9yU2lnbmluZzogc2lub24uc3R1YigpLnJlc29sdmVzKFt7IGlkOiB3YWxsZXREYXRhLmtleXNbMF0sIHB1YjogdXNlclB1YiB9XSksXG4gICAgfSBhcyBhbnkpO1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20vJyksXG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCksXG4gICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgfTtcbiAgICBvZmNUb2tlbiA9IG5ldyBPZmNUb2tlbihtb2NrQml0R28sIFRFU1RfVE9LRU5fQ09ORklHKTtcbiAgICBtb2NrQml0R28uY29pbiA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKG9mY1Rva2VuKTtcbiAgICB3YWxsZXQgPSBuZXcgV2FsbGV0KG1vY2tCaXRHbywgb2ZjVG9rZW4sIHdhbGxldERhdGEpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggdXNlcktleVNpZ25pbmdSZXF1aXJlZDogdHJ1ZSAobG9jYWwgc2lnbmluZyB2aWEgdXNlciBrZXkpJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJ1aWxkVXJsID0gKCkgPT4gb2ZjVG9rZW4udXJsKCcvd2FsbGV0LycgKyB3YWxsZXREYXRhLmlkICsgJy90eC9idWlsZCcpO1xuICAgIGNvbnN0IHNpZ25VcmwgPSAoKSA9PiBvZmNUb2tlbi51cmwoJy93YWxsZXQvJyArIHdhbGxldERhdGEuaWQgKyAnL3R4L3NpZ24nKTtcbiAgICBjb25zdCBzZW5kVXJsID0gKCkgPT4gb2ZjVG9rZW4udXJsKCcvd2FsbGV0LycgKyB3YWxsZXREYXRhLmlkICsgJy90eC9zZW5kJyk7XG5cbiAgICBkZXNjcmliZSgnc2lnblRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBjYWxsIGJhc2VDb2luLnNpZ25NZXNzYWdlIHdpdGggdGhlIHBydiBhbmQgcGF5bG9hZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgcGF5bG9hZCB9IGFzIGFueSwgcHJ2IH0pO1xuXG4gICAgICAgIHNpZ25NZXNzYWdlU3R1Yi5jYWxsZWRPbmNlV2l0aCh7IHBydiB9LCBwYXlsb2FkKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkLCBzaWduYXR1cmU6IHNpZ25hdHVyZUJ5dGVzLnRvU3RyaW5nKCdoZXgnKSB9IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aXRoIHdhbGxldFBhc3NwaHJhc2UgYW5kIGtleWNoYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3Rlc3QtcGFzc3BocmFzZSc7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFBydiA9ICdlbmNyeXB0ZWQtcHJ2LWJsb2InO1xuXG4gICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIGNvbXBpbGVkIHdhbGxldC5qczogZ2V0VXNlclBydiAoc3luYykg4oaSIGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkg4oaSIGJpdGdvLmRlY3J5cHRcbiAgICAgICAgICAvLyBUeXBlU2NyaXB0IHNvdXJjZTogIGdldFVzZXJQcnZBc3luYyAgICAgICAg4oaSIGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXlBc3luYyDihpIgYml0Z28uZGVjcnlwdEFzeW5jXG4gICAgICAgICAgbW9ja0JpdEdvLmRlY3J5cHQgPSBzaW5vbi5zdHViKCkucmV0dXJucyhwcnYpO1xuICAgICAgICAgIG1vY2tCaXRHby5kZWNyeXB0QXN5bmMgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMocHJ2KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBkZWNyeXB0IHRoZSBrZXljaGFpbiB3aXRoIHRoZSBwYXNzcGhyYXNlIGFuZCBzaWduIHZpYSBiYXNlQ29pbi5zaWduTWVzc2FnZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgcGF5bG9hZCB9IGFzIGFueSxcbiAgICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgICBrZXljaGFpbjogeyBwdWI6IHVzZXJQdWIsIGVuY3J5cHRlZFBydiB9IGFzIGFueSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGRlY3J5cHRDYWxsZWQgPVxuICAgICAgICAgICAgbW9ja0JpdEdvLmRlY3J5cHQuY2FsbGVkV2l0aCh7IGlucHV0OiBlbmNyeXB0ZWRQcnYsIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pIHx8XG4gICAgICAgICAgICBtb2NrQml0R28uZGVjcnlwdEFzeW5jLmNhbGxlZFdpdGgoeyBpbnB1dDogZW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICAgICAgICBkZWNyeXB0Q2FsbGVkLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgICAgc2lnbk1lc3NhZ2VTdHViLmNhbGxlZE9uY2VXaXRoKHsgcHJ2IH0sIHBheWxvYWQpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkLCBzaWduYXR1cmU6IHNpZ25hdHVyZUJ5dGVzLnRvU3RyaW5nKCdoZXgnKSB9IH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3ByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5wb3N0LndpdGhBcmdzKGJ1aWxkVXJsKCkpLnJldHVybnMobWFrZVJlcXVlc3RDaGFpbih7IHBheWxvYWQgfSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcHJlYnVpbGQgQVBJIHRoZW4gc2lnbiBsb2NhbGx5IHdpdGggdGhlIHBydicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHsgcHJ2IH0pO1xuXG4gICAgICAgIG1vY2tCaXRHby5wb3N0LmNhbGxlZFdpdGgoYnVpbGRVcmwoKSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aChzaWduVXJsKCkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgICBzaWduTWVzc2FnZVN0dWIuY2FsbGVkT25jZVdpdGgoeyBwcnYgfSwgcGF5bG9hZCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyBoYWxmU2lnbmVkOiB7IHBheWxvYWQsIHNpZ25hdHVyZTogc2lnbmF0dXJlQnl0ZXMudG9TdHJpbmcoJ2hleCcpIH0gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZW5kTWFueScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrQml0R28ucG9zdC53aXRoQXJncyhidWlsZFVybCgpKS5yZXR1cm5zKG1ha2VSZXF1ZXN0Q2hhaW4oeyBwYXlsb2FkIH0pKTtcbiAgICAgICAgbW9ja0JpdEdvLnBvc3Qud2l0aEFyZ3Moc2VuZFVybCgpKS5yZXR1cm5zKG1ha2VSZXF1ZXN0Q2hhaW4oeyB0eGlkOiAndGVzdC10eGlkJywgc3RhdHVzOiAnc2lnbmVkJyB9KSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBwcmVidWlsZCwgc2lnbiBsb2NhbGx5LCBhbmQgc3VibWl0IHRvIHRoZSBzZW5kIGVuZHBvaW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuc2VuZE1hbnkoeyByZWNpcGllbnRzLCBwcnYgfSk7XG5cbiAgICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aChidWlsZFVybCgpKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBzaWduTWVzc2FnZVN0dWIuY2FsbGVkT25jZVdpdGgoeyBwcnYgfSwgcGF5bG9hZCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aChzZW5kVXJsKCkpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgdHhpZDogJ3Rlc3QtdHhpZCcsIHN0YXR1czogJ3NpZ25lZCcgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggdXNlcktleVNpZ25pbmdSZXF1aXJlZDogZmFsc2UgKHJlbW90ZSBzaWduaW5nIHZpYSBCaXRHbyBrZXkpJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNpZ25VcmwgPSAoKSA9PiBvZmNUb2tlbi51cmwoJy93YWxsZXQvJyArIHdhbGxldERhdGEuaWQgKyAnL3R4L3NpZ24nKTtcbiAgICBjb25zdCBidWlsZFVybCA9ICgpID0+IG9mY1Rva2VuLnVybCgnL3dhbGxldC8nICsgd2FsbGV0RGF0YS5pZCArICcvdHgvYnVpbGQnKTtcbiAgICBjb25zdCBzZW5kVXJsID0gKCkgPT4gb2ZjVG9rZW4udXJsKCcvd2FsbGV0LycgKyB3YWxsZXREYXRhLmlkICsgJy90eC9zZW5kJyk7XG4gICAgY29uc3QgaGV4U2lnbmF0dXJlID0gJ2RlYWRiZWVmJztcbiAgICBsZXQgcmVtb3RlV2FsbGV0OiBXYWxsZXQ7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbW90ZVdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBvZmNUb2tlbiwgeyAuLi53YWxsZXREYXRhLCB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICAgIC8vIGNvbXBpbGVkIHdhbGxldC5qcyBjYWxscyBnZXRVc2VyUHJ2IChzeW5jKSBmb3IgYWxsIGNvaW5zOyBzdHViIHRvIHJldHVybiB1bmRlZmluZWRcbiAgICAgIC8vIHNvIHRoZSByZW1vdGUgc2lnbmluZyBwYXRoIHJlYWNoZXMgYmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uIHdpdGggcHJ2OiB1bmRlZmluZWRcbiAgICAgIChyZW1vdGVXYWxsZXQgYXMgYW55KS5nZXRVc2VyUHJ2ID0gc2lub24uc3R1YigpLnJldHVybnModW5kZWZpbmVkKTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LndpdGhBcmdzKHNpZ25VcmwoKSkucmV0dXJucyhtYWtlUmVxdWVzdENoYWluKHsgc2lnbmF0dXJlOiBoZXhTaWduYXR1cmUgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGxvY2FsbHkgd2hlbiB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkIGlzIHRydWUgYW5kIHBydiBpcyBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0cmljdFdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBvZmNUb2tlbiwgeyAuLi53YWxsZXREYXRhLCB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkOiB0cnVlIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyaWN0V2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgcGF5bG9hZCB9IGFzIGFueSwgcHJ2IH0pO1xuXG4gICAgICBzaWduTWVzc2FnZVN0dWIuY2FsbGVkT25jZVdpdGgoeyBwcnYgfSwgcGF5bG9hZCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LmNhbGxlZFdpdGgoc2lnblVybCgpKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkLCBzaWduYXR1cmU6IHNpZ25hdHVyZUJ5dGVzLnRvU3RyaW5nKCdoZXgnKSB9IH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NpZ25UcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgUE9TVCB0byB0aGUgc2lnbiBlbmRwb2ludCBhbmQgcmV0dXJuIHRoZSBoYWxmU2lnbmVkIHJlc3VsdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVtb3RlV2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgcGF5bG9hZCB9IGFzIGFueSB9KTtcblxuICAgICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWRXaXRoKHNpZ25VcmwoKSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgc2lnbk1lc3NhZ2VTdHViLmNhbGxlZC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyBoYWxmU2lnbmVkOiB7IHBheWxvYWQsIHNpZ25hdHVyZTogaGV4U2lnbmF0dXJlIH0gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrQml0R28ucG9zdC53aXRoQXJncyhidWlsZFVybCgpKS5yZXR1cm5zKG1ha2VSZXF1ZXN0Q2hhaW4oeyBwYXlsb2FkIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHByZWJ1aWxkIGFuZCByZW1vdGVseSBzaWduIHRoZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVtb3RlV2FsbGV0LnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHt9KTtcblxuICAgICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWRXaXRoKGJ1aWxkVXJsKCkpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIG1vY2tCaXRHby5wb3N0LmNhbGxlZFdpdGgoc2lnblVybCgpKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBzaWduTWVzc2FnZVN0dWIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IGhhbGZTaWduZWQ6IHsgcGF5bG9hZCwgc2lnbmF0dXJlOiBoZXhTaWduYXR1cmUgfSB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NlbmRNYW55JywgZnVuY3Rpb24gKCkge1xuICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5wb3N0LndpdGhBcmdzKGJ1aWxkVXJsKCkpLnJldHVybnMobWFrZVJlcXVlc3RDaGFpbih7IHBheWxvYWQgfSkpO1xuICAgICAgICBtb2NrQml0R28ucG9zdC53aXRoQXJncyhzZW5kVXJsKCkpLnJldHVybnMobWFrZVJlcXVlc3RDaGFpbih7IHR4aWQ6ICd0ZXN0LXR4aWQnLCBzdGF0dXM6ICdzaWduZWQnIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHByZWJ1aWxkLCByZW1vdGVseSBzaWduLCBhbmQgc2VuZCB0aGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlbW90ZVdhbGxldC5zZW5kTWFueSh7IHJlY2lwaWVudHMgfSk7XG5cbiAgICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aChidWlsZFVybCgpKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWRXaXRoKHNpZ25VcmwoKSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgc2lnbk1lc3NhZ2VTdHViLmNhbGxlZC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyB0eGlkOiAndGVzdC10eGlkJywgc3RhdHVzOiAnc2lnbmVkJyB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,3 @@
1
+ import 'should';
2
+ import 'should-sinon';
3
+ //# sourceMappingURL=resourceManagement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceManagement.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/wallet/resourceManagement.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,CAAC;AAChB,OAAO,cAAc,CAAC"}