@lifeready/core 1.0.21 → 1.0.22

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 (228) hide show
  1. package/bundles/lifeready-core.umd.js +9745 -9700
  2. package/bundles/lifeready-core.umd.js.map +1 -1
  3. package/bundles/lifeready-core.umd.min.js +2 -2
  4. package/bundles/lifeready-core.umd.min.js.map +1 -1
  5. package/esm2015/lib/_common/run-outside-angular.js +2 -2
  6. package/esm2015/lib/_common/types.js +1 -1
  7. package/esm2015/lib/api/lr-apollo.service.js +3 -3
  8. package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +3 -3
  9. package/esm2015/lib/api/query-processor/common-processors.service.js +3 -3
  10. package/esm2015/lib/api/query-processor/query-processor.service.js +4 -4
  11. package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +6 -5
  12. package/esm2015/lib/api/types/lr-graphql.types.js +1 -1
  13. package/esm2015/lib/auth/auth.gql.js +1 -28
  14. package/esm2015/lib/auth/auth.types.js +1 -1
  15. package/esm2015/lib/auth/life-ready-auth.service.js +32 -31
  16. package/esm2015/lib/category/category.gql.js +1 -1
  17. package/esm2015/lib/category/category.service.js +6 -6
  18. package/esm2015/lib/contact-card/contact-card.gql.js +79 -0
  19. package/esm2015/lib/contact-card/contact-card.service.js +154 -0
  20. package/esm2015/lib/contact-card/contact-card2.gql.js +29 -0
  21. package/esm2015/lib/contact-card/contact-card2.service.js +103 -0
  22. package/esm2015/lib/encryption/encryption.service.js +189 -0
  23. package/esm2015/lib/file-upload/file-upload.service.js +74 -0
  24. package/esm2015/lib/file-upload/file-upload.types.js +1 -0
  25. package/esm2015/lib/{auth → idle}/idle.service.js +7 -7
  26. package/esm2015/lib/{auth → idle}/idle.types.js +1 -1
  27. package/esm2015/lib/items2/item2.service.js +20 -20
  28. package/esm2015/lib/key/key-factory.service.js +237 -0
  29. package/esm2015/lib/{cryptography → key}/key-graph.service.js +10 -10
  30. package/esm2015/lib/key/key-meta.service.js +200 -0
  31. package/esm2015/lib/key/key.service.js +124 -0
  32. package/esm2015/lib/key/key.types.js +11 -0
  33. package/esm2015/lib/key-exchange/key-exchange.gql.js +188 -0
  34. package/esm2015/lib/key-exchange/key-exchange.service.js +443 -0
  35. package/esm2015/lib/key-exchange/key-exchange.types.js +7 -0
  36. package/esm2015/lib/key-exchange/key-exchange2.gql.js +171 -0
  37. package/esm2015/lib/key-exchange/key-exchange2.service.js +500 -0
  38. package/esm2015/lib/lbop/lbop.service.js +355 -0
  39. package/esm2015/lib/life-ready.module.js +2 -27
  40. package/esm2015/lib/lock/lock.gql.js +40 -0
  41. package/esm2015/lib/lock/lock.service.js +64 -0
  42. package/esm2015/lib/message/message.gql.js +32 -0
  43. package/esm2015/lib/message/message.service.js +116 -0
  44. package/esm2015/lib/message/message.types.js +1 -0
  45. package/esm2015/lib/password/password.gql.js +28 -0
  46. package/esm2015/lib/password/password.service.js +315 -0
  47. package/esm2015/lib/persist/persist.service.js +180 -0
  48. package/esm2015/lib/profile/profile-details.service.js +214 -0
  49. package/esm2015/lib/profile/profile.gql.js +97 -0
  50. package/esm2015/lib/profile/profile.service.js +169 -0
  51. package/esm2015/lib/profile/profile.types.js +34 -0
  52. package/esm2015/lib/record/record-attachment.service.js +15 -15
  53. package/esm2015/lib/record/record.service.js +3 -3
  54. package/esm2015/lib/register/register.service.js +172 -0
  55. package/esm2015/lib/scenario/scenario.controller.js +2 -2
  56. package/esm2015/lib/scenario/{scenario.gql.private.js → scenario.private.gql.js} +1 -1
  57. package/esm2015/lib/scenario/scenario.service.js +9 -9
  58. package/esm2015/lib/scenario/scenario.types.js +1 -1
  59. package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +119 -0
  60. package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +41 -0
  61. package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +117 -0
  62. package/esm2015/lib/slip39/slip39.service.js +169 -0
  63. package/esm2015/lib/time/time.service.js +146 -0
  64. package/esm2015/lib/tp-assembly/tp-assembly.js +365 -0
  65. package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +22 -0
  66. package/esm2015/lib/tp-assembly/tp-assembly.types.js +1 -0
  67. package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +100 -0
  68. package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +117 -0
  69. package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +4 -0
  70. package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +34 -0
  71. package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +74 -0
  72. package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +165 -0
  73. package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +54 -0
  74. package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +92 -0
  75. package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +1 -0
  76. package/esm2015/lib/trusted-party/trusted-party.gql.js +148 -0
  77. package/esm2015/lib/trusted-party/trusted-party.service.js +326 -0
  78. package/esm2015/lib/trusted-party/trusted-party.types.js +41 -0
  79. package/esm2015/lib/trusted-party/trusted-party2.gql.js +64 -0
  80. package/esm2015/lib/trusted-party/trusted-party2.gql.private.js +25 -0
  81. package/esm2015/lib/trusted-party/trusted-party2.service.js +224 -0
  82. package/esm2015/lib/trusted-party/trusted-party2.types.js +1 -0
  83. package/esm2015/lib/two-factor/two-factor.service.js +74 -0
  84. package/esm2015/lib/user/user.gql.js +60 -0
  85. package/esm2015/lib/user/user.service.js +79 -0
  86. package/esm2015/lib/user/user.types.js +1 -0
  87. package/esm2015/lib/web-crypto/web-crypto.service.js +29 -0
  88. package/esm2015/lifeready-core.js +15 -13
  89. package/esm2015/public-api.js +49 -51
  90. package/fesm2015/lifeready-core.js +9232 -9214
  91. package/fesm2015/lifeready-core.js.map +1 -1
  92. package/lib/_common/types.d.ts +3 -1
  93. package/lib/api/lr-apollo.service.d.ts +1 -1
  94. package/lib/api/lr-graphql/lr-graphql.service.d.ts +1 -1
  95. package/lib/api/query-processor/common-processors.service.d.ts +1 -1
  96. package/lib/api/query-processor/query-processor.service.d.ts +1 -1
  97. package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +1 -1
  98. package/lib/api/types/lr-graphql.types.d.ts +11 -0
  99. package/lib/auth/auth.gql.d.ts +0 -3
  100. package/lib/auth/auth.types.d.ts +2 -2
  101. package/lib/auth/life-ready-auth.service.d.ts +12 -12
  102. package/lib/category/category.gql.d.ts +1 -1
  103. package/lib/category/category.service.d.ts +2 -2
  104. package/lib/{api → contact-card}/contact-card.service.d.ts +9 -9
  105. package/lib/contact-card/contact-card2.gql.d.ts +25 -0
  106. package/lib/{api → contact-card}/contact-card2.service.d.ts +11 -12
  107. package/lib/{cryptography → encryption}/encryption.service.d.ts +2 -2
  108. package/lib/{api/file.service.d.ts → file-upload/file-upload.service.d.ts} +3 -7
  109. package/lib/file-upload/file-upload.types.d.ts +5 -0
  110. package/lib/{auth → idle}/idle.service.d.ts +4 -4
  111. package/lib/items2/item2.service.d.ts +11 -11
  112. package/lib/{cryptography → key}/key-factory.service.d.ts +2 -2
  113. package/lib/{cryptography → key}/key-graph.service.d.ts +5 -5
  114. package/lib/{cryptography → key}/key-meta.service.d.ts +1 -1
  115. package/lib/{cryptography → key}/key.service.d.ts +2 -2
  116. package/lib/{cryptography/cryptography.types.d.ts → key/key.types.d.ts} +9 -13
  117. package/lib/{api → key-exchange}/key-exchange.service.d.ts +5 -5
  118. package/lib/{api → key-exchange}/key-exchange.types.d.ts +4 -4
  119. package/lib/{api → key-exchange}/key-exchange2.gql.d.ts +1 -1
  120. package/lib/{api → key-exchange}/key-exchange2.service.d.ts +71 -18
  121. package/lib/{auth → lbop}/lbop.service.d.ts +7 -7
  122. package/lib/{api → lock}/lock.gql.d.ts +1 -1
  123. package/lib/{api → lock}/lock.service.d.ts +1 -1
  124. package/lib/message/message.gql.d.ts +13 -0
  125. package/lib/message/message.service.d.ts +29 -0
  126. package/lib/message/message.types.d.ts +12 -0
  127. package/lib/password/password.gql.d.ts +3 -0
  128. package/lib/{auth → password}/password.service.d.ts +8 -8
  129. package/lib/{api → persist}/persist.service.d.ts +3 -3
  130. package/lib/{users → profile}/profile-details.service.d.ts +3 -3
  131. package/lib/{users → profile}/profile.gql.d.ts +2 -2
  132. package/lib/{users → profile}/profile.service.d.ts +6 -6
  133. package/lib/{users → profile}/profile.types.d.ts +1 -1
  134. package/lib/record/record-attachment.service.d.ts +6 -6
  135. package/lib/record/record.service.d.ts +1 -1
  136. package/lib/{auth → register}/register.service.d.ts +4 -4
  137. package/lib/scenario/scenario.controller.d.ts +1 -1
  138. package/lib/scenario/scenario.service.d.ts +2 -2
  139. package/lib/scenario/scenario.types.d.ts +1 -1
  140. package/lib/{api → shared-contact-card}/shared-contact-card.service.d.ts +9 -9
  141. package/lib/{api → shared-contact-card}/shared-contact-card2.gql.d.ts +1 -1
  142. package/lib/{api → shared-contact-card}/shared-contact-card2.service.d.ts +6 -6
  143. package/lib/{trusted-parties → tp-assembly}/tp-assembly.d.ts +7 -7
  144. package/lib/{trusted-parties → tp-assembly}/tp-assembly.types.d.ts +1 -1
  145. package/lib/{trusted-parties → tp-password-reset}/tp-password-reset-request.service.d.ts +4 -8
  146. package/lib/{trusted-parties → tp-password-reset}/tp-password-reset-user.service.d.ts +7 -13
  147. package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.controller.d.ts +1 -1
  148. package/lib/tp-password-reset/tp-password-reset.gql.d.ts +63 -0
  149. package/lib/{trusted-parties/tp-password-reset.gql.d.ts → tp-password-reset/tp-password-reset.private.gql.d.ts} +1 -63
  150. package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +59 -0
  151. package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.service.d.ts +6 -89
  152. package/lib/tp-password-reset/tp-password-reset.types.d.ts +40 -0
  153. package/lib/{trusted-parties → trusted-party}/trusted-party.service.d.ts +7 -7
  154. package/lib/{trusted-parties → trusted-party}/trusted-party.types.d.ts +2 -3
  155. package/lib/{trusted-parties → trusted-party}/trusted-party2.gql.d.ts +0 -22
  156. package/lib/trusted-party/trusted-party2.gql.private.d.ts +23 -0
  157. package/lib/{trusted-parties → trusted-party}/trusted-party2.service.d.ts +11 -35
  158. package/lib/trusted-party/trusted-party2.types.d.ts +12 -0
  159. package/lib/{users → user}/user.gql.d.ts +1 -1
  160. package/lib/{users → user}/user.types.d.ts +1 -1
  161. package/lifeready-core.d.ts +14 -12
  162. package/lifeready-core.metadata.json +1 -1
  163. package/package.json +1 -1
  164. package/public-api.d.ts +48 -50
  165. package/esm2015/lib/api/contact-card.gql.js +0 -79
  166. package/esm2015/lib/api/contact-card.service.js +0 -154
  167. package/esm2015/lib/api/contact-card2.gql.js +0 -60
  168. package/esm2015/lib/api/contact-card2.service.js +0 -103
  169. package/esm2015/lib/api/file.service.js +0 -74
  170. package/esm2015/lib/api/key-exchange.gql.js +0 -188
  171. package/esm2015/lib/api/key-exchange.service.js +0 -442
  172. package/esm2015/lib/api/key-exchange.types.js +0 -7
  173. package/esm2015/lib/api/key-exchange2.gql.js +0 -171
  174. package/esm2015/lib/api/key-exchange2.service.js +0 -480
  175. package/esm2015/lib/api/lock.gql.js +0 -40
  176. package/esm2015/lib/api/lock.service.js +0 -64
  177. package/esm2015/lib/api/message.service.js +0 -138
  178. package/esm2015/lib/api/persist.service.js +0 -181
  179. package/esm2015/lib/api/shared-contact-card.service.js +0 -119
  180. package/esm2015/lib/api/shared-contact-card2.gql.js +0 -41
  181. package/esm2015/lib/api/shared-contact-card2.service.js +0 -117
  182. package/esm2015/lib/api/time.service.js +0 -146
  183. package/esm2015/lib/auth/lbop.service.js +0 -355
  184. package/esm2015/lib/auth/password.service.js +0 -315
  185. package/esm2015/lib/auth/register.service.js +0 -172
  186. package/esm2015/lib/auth/two-factor.service.js +0 -74
  187. package/esm2015/lib/cryptography/cryptography.types.js +0 -11
  188. package/esm2015/lib/cryptography/encryption.service.js +0 -189
  189. package/esm2015/lib/cryptography/key-factory.service.js +0 -237
  190. package/esm2015/lib/cryptography/key-meta.service.js +0 -200
  191. package/esm2015/lib/cryptography/key.service.js +0 -124
  192. package/esm2015/lib/cryptography/slip39.service.js +0 -169
  193. package/esm2015/lib/cryptography/web-crypto.service.js +0 -29
  194. package/esm2015/lib/trusted-parties/tp-assembly.gql.private.js +0 -22
  195. package/esm2015/lib/trusted-parties/tp-assembly.js +0 -365
  196. package/esm2015/lib/trusted-parties/tp-assembly.types.js +0 -1
  197. package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +0 -113
  198. package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +0 -129
  199. package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +0 -4
  200. package/esm2015/lib/trusted-parties/tp-password-reset.controller.js +0 -34
  201. package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +0 -237
  202. package/esm2015/lib/trusted-parties/tp-password-reset.service.js +0 -95
  203. package/esm2015/lib/trusted-parties/trusted-party.gql.js +0 -148
  204. package/esm2015/lib/trusted-parties/trusted-party.service.js +0 -326
  205. package/esm2015/lib/trusted-parties/trusted-party.types.js +0 -41
  206. package/esm2015/lib/trusted-parties/trusted-party2.gql.js +0 -87
  207. package/esm2015/lib/trusted-parties/trusted-party2.service.js +0 -218
  208. package/esm2015/lib/users/profile-details.service.js +0 -214
  209. package/esm2015/lib/users/profile.gql.js +0 -97
  210. package/esm2015/lib/users/profile.service.js +0 -169
  211. package/esm2015/lib/users/profile.types.js +0 -34
  212. package/esm2015/lib/users/user.gql.js +0 -60
  213. package/esm2015/lib/users/user.service.js +0 -79
  214. package/esm2015/lib/users/user.types.js +0 -1
  215. package/lib/api/contact-card2.gql.d.ts +0 -34
  216. package/lib/api/message.service.d.ts +0 -59
  217. /package/lib/{api → contact-card}/contact-card.gql.d.ts +0 -0
  218. /package/lib/{auth → idle}/idle.types.d.ts +0 -0
  219. /package/lib/{api → key-exchange}/key-exchange.gql.d.ts +0 -0
  220. /package/lib/scenario/{scenario.gql.private.d.ts → scenario.private.gql.d.ts} +0 -0
  221. /package/lib/{cryptography → slip39}/slip39.service.d.ts +0 -0
  222. /package/lib/{api → time}/time.service.d.ts +0 -0
  223. /package/lib/{trusted-parties/tp-assembly.gql.private.d.ts → tp-assembly/tp-assembly.private.gql.d.ts} +0 -0
  224. /package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.constants.d.ts +0 -0
  225. /package/lib/{trusted-parties → trusted-party}/trusted-party.gql.d.ts +0 -0
  226. /package/lib/{auth → two-factor}/two-factor.service.d.ts +0 -0
  227. /package/lib/{users → user}/user.service.d.ts +0 -0
  228. /package/lib/{cryptography → web-crypto}/web-crypto.service.d.ts +0 -0
@@ -1,365 +0,0 @@
1
- import { __awaiter, __rest } from "tslib";
2
- import { mapEdges, } from '../api/types';
3
- import { EncryptionService } from '../cryptography/encryption.service';
4
- import { KeyFactoryService } from '../cryptography/key-factory.service';
5
- import { KeyGraphService } from '../cryptography/key-graph.service';
6
- import * as slip from '../cryptography/slip39.service';
7
- import { LrBadArgumentException, LrBadStateException, } from '../_common/exceptions';
8
- import { KeyService } from '../cryptography/key.service';
9
- import { LrGraphQLService } from '../api/lr-graphql';
10
- import { TpsKeysQuery } from './tp-assembly.gql.private';
11
- export class TpAssemblyController {
12
- constructor(injector) {
13
- this.keyFactory = injector.get(KeyFactoryService);
14
- this.keyService = injector.get(KeyService);
15
- this.encryptionService = injector.get(EncryptionService);
16
- this.keyGraph = injector.get(KeyGraphService);
17
- this.slip39Service = injector.get(slip.Slip39Service);
18
- this.lrGraphQl = injector.get(LrGraphQLService);
19
- }
20
- recoverAssemblyKey(partials) {
21
- return __awaiter(this, void 0, void 0, function* () {
22
- // Every receiverPbkCipher should contain this and they should all be the same.
23
- let assemblyKeyParams;
24
- const shares = partials.map((partial) => {
25
- if (assemblyKeyParams) {
26
- if (JSON.stringify(assemblyKeyParams) !==
27
- JSON.stringify(partial.assemblyKeyParams)) {
28
- throw new LrBadStateException('The assembly key parameters are different between the approvals.');
29
- }
30
- }
31
- else {
32
- assemblyKeyParams = partial.assemblyKeyParams;
33
- }
34
- return partial.slip39.share.mnemonics;
35
- });
36
- const rawAssemblyKey = yield this.slip39Service.recoverSecret(shares, this.slip39Passphrase);
37
- return yield KeyFactoryService.asKey(Object.assign(Object.assign({}, assemblyKeyParams), { k: rawAssemblyKey }));
38
- });
39
- }
40
- prepareTpWrappingKey(tp) {
41
- return __awaiter(this, void 0, void 0, function* () {
42
- return this.keyGraph.getKey(tp.wrappingKeyId);
43
- });
44
- }
45
- prepareAssembly({ subjectKey, rootKey, }) {
46
- return __awaiter(this, void 0, void 0, function* () {
47
- const assemblyKey = yield this.keyFactory.createKey();
48
- console.log('prepareAssembly assemblyKey', assemblyKey);
49
- const _a = assemblyKey.toJSON(true), { k: rawAssemblyKey } = _a, assemblyKeyParams = __rest(_a, ["k"]);
50
- const assemblyKeyVerifierPrk = yield this.keyFactory.createPkcSignKey();
51
- const wrappedAssemblyKeyVerifierPrk = yield this.encryptionService.encryptToString(assemblyKey, assemblyKeyVerifierPrk.toJSON(true));
52
- const assemblyKeyVerifierPbk = JSON.stringify(assemblyKeyVerifierPrk.toJSON());
53
- const subjectKeyWrappedAssemblyKey = yield this.encryptionService.encryptToString(subjectKey, assemblyKey.toJSON(true));
54
- // Encrypt the rootKey with the assemblyKey
55
- const assemblyCipherData = yield this.encryptionService.encryptToString(assemblyKey, {
56
- rootKey: rootKey.toJSON(true),
57
- });
58
- return {
59
- assemblyKey,
60
- rawAssemblyKey,
61
- assemblyKeyParams,
62
- subjectKeyWrappedAssemblyKey,
63
- assemblyCipherData,
64
- assemblyKeyVerifierPbk,
65
- wrappedAssemblyKeyVerifierPrk,
66
- };
67
- });
68
- }
69
- prepareCreateSubAssemblies({ input, subjectKey, slipSubAssemblies, assemblyKeyParams, }) {
70
- return __awaiter(this, void 0, void 0, function* () {
71
- return Promise.all(input.map((sa, saIndex) => __awaiter(this, void 0, void 0, function* () {
72
- const subjectCipherData = yield this.encryptionService.encryptToString(subjectKey, sa.subjectCipherDataClearJson || '');
73
- const createApprovers = yield Promise.all(sa.approverTps.map((approverTp, approverIndex) => __awaiter(this, void 0, void 0, function* () {
74
- return this.prepareApprover({
75
- tp: approverTp,
76
- approverIndex,
77
- slipSubAssembly: slipSubAssemblies[saIndex],
78
- assemblyKeyParams,
79
- subjectKey,
80
- });
81
- })));
82
- return {
83
- singleReject: sa.singleReject,
84
- quorum: sa.quorum,
85
- subjectCipherData,
86
- createApprovers,
87
- };
88
- })));
89
- });
90
- }
91
- prepareUpdateSubAssemblies({ input, subjectKey, slipSubAssemblies, assemblyKeyParams, subAssemblies, }) {
92
- return __awaiter(this, void 0, void 0, function* () {
93
- if (slipSubAssemblies.length !== input.length) {
94
- throw new LrBadArgumentException('The slipSubAssemblies must be the same length as the input');
95
- }
96
- return Promise.all(input.map((sa, saIndex) => __awaiter(this, void 0, void 0, function* () {
97
- const subjectCipherData = yield this.encryptionService.encryptToString(subjectKey, sa.subjectCipherDataClearJson || '');
98
- // Get the existing sub-assembly
99
- const existingSa = subAssemblies.edges.find((edge) => edge.node.id === sa.id).node;
100
- // Get approvers that do not exist yet
101
- const createApprovers = [];
102
- const updateApprovers = [];
103
- sa.approverTps.forEach((tp) => {
104
- var _a;
105
- const approver = (_a = existingSa.approvers.edges.find((edge) => edge.node.tp.id === tp.tpId)) === null || _a === void 0 ? void 0 : _a.node;
106
- if (approver) {
107
- updateApprovers.push({
108
- tp,
109
- approverId: approver.id,
110
- });
111
- }
112
- else {
113
- createApprovers.push({
114
- tp,
115
- });
116
- }
117
- });
118
- const slipSubAssembly = slipSubAssemblies[saIndex];
119
- return {
120
- subAssemblyId: sa.id,
121
- singleReject: sa.singleReject,
122
- quorum: sa.quorum,
123
- subjectCipherData,
124
- createApprovers: yield Promise.all(createApprovers.map(({ tp }, approverIndex) => __awaiter(this, void 0, void 0, function* () {
125
- return this.prepareApprover({
126
- tp,
127
- approverIndex,
128
- slipSubAssembly,
129
- assemblyKeyParams,
130
- subjectKey,
131
- });
132
- }))),
133
- updateApprovers: yield Promise.all(updateApprovers.map(({ tp, approverId }, approverIndex) => __awaiter(this, void 0, void 0, function* () {
134
- return this.prepareApprover({
135
- approverId,
136
- tp,
137
- approverIndex: approverIndex + createApprovers.length,
138
- slipSubAssembly,
139
- assemblyKeyParams,
140
- subjectKey,
141
- });
142
- }))),
143
- };
144
- })));
145
- });
146
- }
147
- fillWrappingKeyId(input, tps) {
148
- // Fill in wrappingKeyId if not present
149
- input.forEach((sa) => {
150
- sa.approverTps.forEach((approver) => {
151
- if (!approver.wrappingKeyId) {
152
- const tp = tps.find((x) => x.id === approver.tpId);
153
- approver.wrappingKeyId = this.getTpWrappingKeyId(tp);
154
- }
155
- });
156
- });
157
- }
158
- getInputApprovers(input) {
159
- const tpIds = [];
160
- input.forEach((sa) => {
161
- sa.approverTps.forEach((approver) => {
162
- tpIds.push(approver.tpId);
163
- });
164
- });
165
- return tpIds;
166
- }
167
- prepareCreate(input) {
168
- return __awaiter(this, void 0, void 0, function* () {
169
- const rootKey = yield this.keyService.getCurrentRootKey();
170
- const subjectKey = yield this.keyFactory.createKey();
171
- const rootKeyWrappedSubjectKey = yield this.keyGraph.wrapKey(rootKey, subjectKey);
172
- const _a = yield this.prepareAssembly({
173
- rootKey: rootKey.jwk,
174
- subjectKey,
175
- }), { assemblyKey, rawAssemblyKey, assemblyKeyParams } = _a, assemblyInput = __rest(_a, ["assemblyKey", "rawAssemblyKey", "assemblyKeyParams"]);
176
- const slipAssembly = yield this.prepareSlip39(input.createSubAssemblies, input.quorum, rawAssemblyKey);
177
- const tpIds = this.getInputApprovers(input.createSubAssemblies);
178
- // This should contain all the TPs that we need to update the assembly.
179
- const tps = mapEdges((yield this.lrGraphQl.query({
180
- query: TpsKeysQuery,
181
- variables: {
182
- ids: tpIds,
183
- },
184
- })).tps);
185
- // Fill in wrappingKeyId if not present
186
- this.fillWrappingKeyId(input.createSubAssemblies, tps);
187
- const createSubAssemblies = yield this.prepareCreateSubAssemblies({
188
- input: input.createSubAssemblies,
189
- assemblyKeyParams,
190
- slipSubAssemblies: slipAssembly.subAssemblies,
191
- subjectKey,
192
- });
193
- const subjectCipherData = yield this.encryptionService.encryptToString(subjectKey, input.subjectCipherDataClearJson || '');
194
- return {
195
- assemblyKey,
196
- mutationInput: Object.assign(Object.assign({}, assemblyInput), { singleReject: input.singleReject, quorum: input.quorum, subjectCipherData,
197
- createSubAssemblies, rootKeyId: rootKey.id, rootKeyWrappedSubjectKey }),
198
- };
199
- });
200
- }
201
- getAssemblyApprovers(assembly) {
202
- const tpIds = [];
203
- // Find all TPs that belong to sub-assemblies
204
- mapEdges(assembly.subAssemblies).map((sa) => {
205
- mapEdges(sa.approvers).forEach((approver) => tpIds.push(approver.tp.id));
206
- });
207
- return tpIds;
208
- }
209
- prepareUpdate(input, assembly // TODO type this to only what we need.
210
- ) {
211
- var _a;
212
- return __awaiter(this, void 0, void 0, function* () {
213
- input = Object.assign({ createSubAssemblies: [] }, input);
214
- const createSubAssembliesInput = input.createSubAssemblies || [];
215
- const updateSubAssembliesInput = input.updateSubAssemblies || [];
216
- const deleteSubAssembliesInput = input.deleteSubAssemblies || [];
217
- // Must have at least one.
218
- if (createSubAssembliesInput.length === 0 &&
219
- updateSubAssembliesInput.length === 0 &&
220
- deleteSubAssembliesInput.length === 0) {
221
- throw new LrBadArgumentException('Must specify at least one of: [createSubAssemblies, updateSubAssemblies, deleteSubAssemblies]');
222
- }
223
- const rootKey = yield this.keyService.getCurrentRootKey();
224
- const subjectKey = yield this.keyGraph.getKey(assembly.subjectKey.id);
225
- const _b = yield this.prepareAssembly({
226
- rootKey: rootKey.jwk,
227
- subjectKey: subjectKey.jwk,
228
- }), { assemblyKey, rawAssemblyKey, assemblyKeyParams } = _b, assemblyInput = __rest(_b, ["assemblyKey", "rawAssemblyKey", "assemblyKeyParams"]);
229
- // Find all the TPs that we need, duplicates are no problem.
230
- // Existing approvers
231
- const tpIds = this.getAssemblyApprovers(assembly).concat(this.getInputApprovers(createSubAssembliesInput), this.getInputApprovers(updateSubAssembliesInput));
232
- // This should contain all the TPs that we need to update the assembly.
233
- const tps = mapEdges((yield this.lrGraphQl.query({
234
- query: TpsKeysQuery,
235
- variables: {
236
- ids: tpIds,
237
- },
238
- })).tps);
239
- // Auto fill the updateSubAssemblies with existing sub assemblies if they are not
240
- // explicitly deleted.
241
- mapEdges(assembly.subAssemblies).forEach((existing) => {
242
- // Deleting existing, don't include it
243
- if (deleteSubAssembliesInput.includes(existing.id)) {
244
- return;
245
- }
246
- // Update already specified in the input
247
- if (updateSubAssembliesInput.some((sa) => sa.id === existing.id)) {
248
- return;
249
- }
250
- const approverTps = mapEdges(existing.approvers).map((approver) => {
251
- return {
252
- tpId: approver.tp.id,
253
- sharedCipherDataClearJson: approver.sharedCipherDataClearJson,
254
- sharedCipherApprovalDataClearJson: approver.sharedCipherApprovalDataClearJson,
255
- };
256
- });
257
- updateSubAssembliesInput.push({
258
- id: existing.id,
259
- quorum: existing.quorum,
260
- singleReject: existing.singleReject,
261
- approverTps,
262
- subjectCipherDataClearJson: existing.subjectCipherDataClearJson,
263
- });
264
- });
265
- // Fill in wrappingKeyId if not present
266
- this.fillWrappingKeyId(createSubAssembliesInput, tps);
267
- this.fillWrappingKeyId(updateSubAssembliesInput, tps);
268
- let slipAssembly;
269
- try {
270
- slipAssembly = yield this.prepareSlip39((createSubAssembliesInput || []).concat(updateSubAssembliesInput || []), input.quorum, rawAssemblyKey);
271
- }
272
- catch (error) {
273
- // TODO this sometimes happens. Maybe missing await.
274
- console.log('Error while creating slip assembly', error);
275
- }
276
- const common = {
277
- assemblyKeyParams,
278
- subjectKey: subjectKey.jwk,
279
- };
280
- const createSubAssemblies = yield this.prepareCreateSubAssemblies(Object.assign(Object.assign({}, common), { input: createSubAssembliesInput,
281
- // Need to match the slip sub assemblies to the input
282
- slipSubAssemblies: slipAssembly.subAssemblies.slice(0, createSubAssembliesInput.length) }));
283
- const updateSubAssemblies = yield this.prepareUpdateSubAssemblies(Object.assign(Object.assign({}, common), { input: updateSubAssembliesInput,
284
- // Add an offset to the sub assemblies to skip the one that are created.
285
- slipSubAssemblies: slipAssembly.subAssemblies.slice(createSubAssembliesInput.length), subAssemblies: assembly.subAssemblies }));
286
- const subjectCipherData = yield this.encryptionService.encryptToString(subjectKey.jwk, (_a = input.subjectCipherDataClearJson) !== null && _a !== void 0 ? _a : assembly.subjectCipherDataClearJson);
287
- return {
288
- assemblyKey,
289
- mutationInput: Object.assign(Object.assign({}, assemblyInput), { singleReject: input.singleReject, quorum: input.quorum, subjectCipherData, subjectKeyId: subjectKey.id, createSubAssemblies,
290
- updateSubAssemblies }),
291
- };
292
- });
293
- }
294
- prepareApprover({ approverId, tp, approverIndex, slipSubAssembly, assemblyKeyParams, subjectKey, }) {
295
- return __awaiter(this, void 0, void 0, function* () {
296
- const tpWrappingKey = yield this.prepareTpWrappingKey(tp);
297
- // shared key is rotated every time.
298
- const sharedKey = yield this.keyFactory.createKey();
299
- // For TP to access shared_key
300
- const tpWrappedSharedKey = yield this.encryptionService.encryptToString(tpWrappingKey.jwk, sharedKey.toJSON(true));
301
- // For subject to access shared_key
302
- const subjectKeyWrappedSharedKey = yield this.encryptionService.encryptToString(subjectKey, sharedKey.toJSON(true));
303
- // If quorum is 1, then using the same share for every member.
304
- const share = slipSubAssembly.threshold === 1
305
- ? slipSubAssembly.shares[0]
306
- : slipSubAssembly.shares[approverIndex];
307
- const partialAssemblyKey = {
308
- slip39: {
309
- share,
310
- subAssembly: {
311
- quorum: slipSubAssembly.threshold,
312
- size: slipSubAssembly.size,
313
- },
314
- },
315
- assemblyKeyParams,
316
- };
317
- console.log('partialAssemblyKey', partialAssemblyKey);
318
- const sharedCipherData = yield this.encryptionService.encryptToString(sharedKey, tp.sharedCipherDataClearJson || '');
319
- const sharedCipherApprovalData = yield this.encryptionService.encryptToString(sharedKey, tp.sharedCipherApprovalDataClearJson || '');
320
- const sharedCipherPartialAssemblyKey = yield this.encryptionService.encryptToString(sharedKey, partialAssemblyKey);
321
- return {
322
- tpWrappingKeyId: tpWrappingKey.id,
323
- tpWrappedSharedKey,
324
- subjectKeyWrappedSharedKey,
325
- sharedCipherData,
326
- sharedCipherApprovalData,
327
- sharedCipherPartialAssemblyKey,
328
- approverId: approverId || void 0,
329
- tpId: approverId ? void 0 : tp.tpId,
330
- };
331
- });
332
- }
333
- validateApprovers(approvers) {
334
- // Ensure all approvers have mkSharedKey.
335
- for (const tp of approvers) {
336
- if (!tp.currentUserSharedKey.userSharedKey.mkSharedKey) {
337
- const msg = `tp ${tp.other.username} does not have mkSharedKey`;
338
- console.log(msg);
339
- throw new LrBadArgumentException(msg);
340
- }
341
- }
342
- }
343
- // Prepare slip39
344
- prepareSlip39(subAssemblies, assemblyQuorum, rawAssemblyKey) {
345
- return __awaiter(this, void 0, void 0, function* () {
346
- // Is there enough sub assemblies to meet quorum
347
- if (subAssemblies.length < assemblyQuorum) {
348
- throw new LrBadArgumentException('Not enough sub assemblies to meet quorum');
349
- }
350
- const slipAssembly = new slip.Assembly(assemblyQuorum);
351
- subAssemblies.forEach((sa, index) => {
352
- let approverCount = sa.approverTps.length;
353
- // slip39 restricts quorum == 1 to have only 1 member. So we just share the same
354
- // partial key for all sub assembly members.
355
- if (sa.quorum === 1) {
356
- approverCount = 1;
357
- }
358
- slipAssembly.addSubAssembly(new slip.SubAssembly(index, sa.quorum, approverCount));
359
- });
360
- yield this.slip39Service.generateShares(rawAssemblyKey, this.slip39Passphrase, slipAssembly);
361
- return slipAssembly;
362
- });
363
- }
364
- }
365
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAtYXNzZW1ibHkuanMiLCJzb3VyY2VSb290IjoiL29wdC9hdGxhc3NpYW4vcGlwZWxpbmVzL2FnZW50L2J1aWxkL3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL3RydXN0ZWQtcGFydGllcy90cC1hc3NlbWJseS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUVMLFFBQVEsR0FJVCxNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxLQUFLLElBQUksTUFBTSxnQ0FBZ0MsQ0FBQztBQUV2RCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG1CQUFtQixHQUNwQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQVN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsTUFBTSxPQUFnQixvQkFBb0I7SUFVeEMsWUFBWSxRQUFrQjtRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxR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Q0FBQyxNQUFNLENBQUM7Z0JBRTFDLGdGQUFnRjtnQkFDaEYsNENBQTRDO2dCQUM1QyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUNuQixhQUFhLEdBQUcsQ0FBQyxDQUFDO2lCQUNuQjtnQkFDRCxZQUFZLENBQUMsY0FBYyxDQUN6QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQ3RELENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQ3JDLGNBQWMsRUFDZCxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLFlBQVksQ0FDYixDQUFDO1lBQ0YsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztLQUFBO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcbmltcG9ydCB7XG4gIENvbm5lY3Rpb24sXG4gIG1hcEVkZ2VzLFxuICBUcEFzc2VtYmx5Tm9kZSxcbiAgVHBOb2RlLFxuICBUcFN1YkFzc2VtYmx5Tm9kZSxcbn0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBLZXlGYWN0b3J5U2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXktZmFjdG9yeS5zZXJ2aWNlJztcbmltcG9ydCB7IEtleUdyYXBoU2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXktZ3JhcGguc2VydmljZSc7XG5pbXBvcnQgKiBhcyBzbGlwIGZyb20gJy4uL2NyeXB0b2dyYXBoeS9zbGlwMzkuc2VydmljZSc7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5LnR5cGVzJztcbmltcG9ydCB7XG4gIExyQmFkQXJndW1lbnRFeGNlcHRpb24sXG4gIExyQmFkU3RhdGVFeGNlcHRpb24sXG59IGZyb20gJy4uL19jb21tb24vZXhjZXB0aW9ucyc7XG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENyZWF0ZVRwQXNzZW1ibHlJbnB1dCxcbiAgQ3JlYXRlVHBTdWJBc3NlbWJseUlucHV0LFxuICBQYXJ0aWFsQXNzZW1ibHlLZXksXG4gIFRwQXNzZW1ibHlBcHByb3ZlcklucHV0LFxuICBVcGRhdGVUcEFzc2VtYmx5SW5wdXQsXG4gIFVwZGF0ZVRwU3ViQXNzZW1ibHlJbnB1dCxcbn0gZnJvbSAnLi90cC1hc3NlbWJseS50eXBlcyc7XG5pbXBvcnQgeyBMckdyYXBoUUxTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2xyLWdyYXBocWwnO1xuaW1wb3J0IHsgVHBzS2V5c1F1ZXJ5IH0gZnJvbSAnLi90cC1hc3NlbWJseS5ncWwucHJpdmF0ZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcEFzc2VtYmx5Q29udHJvbGxlciB7XG4gIGFic3RyYWN0IHNsaXAzOVBhc3NwaHJhc2U6IHN0cmluZztcblxuICBwcm90ZWN0ZWQga2V5RmFjdG9yeTogS2V5RmFjdG9yeVNlcnZpY2U7XG4gIHByb3RlY3RlZCBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlO1xuICBwcm90ZWN0ZWQga2V5R3JhcGg6IEtleUdyYXBoU2VydmljZTtcbiAgcHJvdGVjdGVkIHNsaXAzOVNlcnZpY2U6IHNsaXAuU2xpcDM5U2VydmljZTtcbiAgcHJvdGVjdGVkIGxyR3JhcGhRbDogTHJHcmFwaFFMU2VydmljZTtcblxuICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICB0aGlzLmtleUZhY3RvcnkgPSBpbmplY3Rvci5nZXQoS2V5RmFjdG9yeVNlcnZpY2UpO1xuICAgIHRoaXMua2V5U2VydmljZSA9IGluamVjdG9yLmdldChLZXlTZXJ2aWNlKTtcbiAgICB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KEVuY3J5cHRpb25TZXJ2aWNlKTtcbiAgICB0aGlzLmtleUdyYXBoID0gaW5qZWN0b3IuZ2V0KEtleUdyYXBoU2VydmljZSk7XG4gICAgdGhpcy5zbGlwMzlTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KHNsaXAuU2xpcDM5U2VydmljZSk7XG4gICAgdGhpcy5sckdyYXBoUWwgPSBpbmplY3Rvci5nZXQoTHJHcmFwaFFMU2VydmljZSk7XG4gIH1cblxuICBhYnN0cmFjdCBnZXRUcFdyYXBwaW5nS2V5SWQodHA6IFRwTm9kZSk6IHN0cmluZztcblxuICBhc3luYyByZWNvdmVyQXNzZW1ibHlLZXkocGFydGlhbHM6IFBhcnRpYWxBc3NlbWJseUtleVtdKSB7XG4gICAgLy8gRXZlcnkgcmVjZWl2ZXJQYmtDaXBoZXIgc2hvdWxkIGNvbnRhaW4gdGhpcyBhbmQgdGhleSBzaG91bGQgYWxsIGJlIHRoZSBzYW1lLlxuICAgIGxldCBhc3NlbWJseUtleVBhcmFtczogb2JqZWN0O1xuXG4gICAgY29uc3Qgc2hhcmVzID0gcGFydGlhbHMubWFwKChwYXJ0aWFsKSA9PiB7XG4gICAgICBpZiAoYXNzZW1ibHlLZXlQYXJhbXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFzc2VtYmx5S2V5UGFyYW1zKSAhPT1cbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShwYXJ0aWFsLmFzc2VtYmx5S2V5UGFyYW1zKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTHJCYWRTdGF0ZUV4Y2VwdGlvbihcbiAgICAgICAgICAgICdUaGUgYXNzZW1ibHkga2V5IHBhcmFtZXRlcnMgYXJlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBhcHByb3ZhbHMuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VtYmx5S2V5UGFyYW1zID0gcGFydGlhbC5hc3NlbWJseUtleVBhcmFtcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJ0aWFsLnNsaXAzOS5zaGFyZS5tbmVtb25pY3M7XG4gICAgfSk7XG5cbiAgICBjb25zdCByYXdBc3NlbWJseUtleSA9IGF3YWl0IHRoaXMuc2xpcDM5U2VydmljZS5yZWNvdmVyU2VjcmV0KFxuICAgICAgc2hhcmVzLFxuICAgICAgdGhpcy5zbGlwMzlQYXNzcGhyYXNlXG4gICAgKTtcblxuICAgIHJldHVybiBhd2FpdCBLZXlGYWN0b3J5U2VydmljZS5hc0tleSh7XG4gICAgICAuLi5hc3NlbWJseUtleVBhcmFtcyxcbiAgICAgIGs6IHJhd0Fzc2VtYmx5S2V5LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHByZXBhcmVUcFdyYXBwaW5nS2V5KFxuICAgIHRwOiBUcEFzc2VtYmx5QXBwcm92ZXJJbnB1dFxuICApOiBQcm9taXNlPEtleT4ge1xuICAgIHJldHVybiB0aGlzLmtleUdyYXBoLmdldEtleSh0cC53cmFwcGluZ0tleUlkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBwcmVwYXJlQXNzZW1ibHkoe1xuICAgIHN1YmplY3RLZXksXG4gICAgcm9vdEtleSxcbiAgfToge1xuICAgIHN1YmplY3RLZXk6IEpXSy5LZXk7XG4gICAgcm9vdEtleTogSldLLktleTtcbiAgfSkge1xuICAgIGNvbnN0IGFzc2VtYmx5S2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuICAgIGNvbnNvbGUubG9nKCdwcmVwYXJlQXNzZW1ibHkgYXNzZW1ibHlLZXknLCBhc3NlbWJseUtleSk7XG5cbiAgICBjb25zdCB7IGs6IHJhd0Fzc2VtYmx5S2V5LCAuLi5hc3NlbWJseUtleVBhcmFtcyB9ID0gYXNzZW1ibHlLZXkudG9KU09OKFxuICAgICAgdHJ1ZVxuICAgICkgYXMgYW55O1xuICAgIGNvbnN0IGFzc2VtYmx5S2V5VmVyaWZpZXJQcmsgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlUGtjU2lnbktleSgpO1xuICAgIGNvbnN0IHdyYXBwZWRBc3NlbWJseUtleVZlcmlmaWVyUHJrID1cbiAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgICBhc3NlbWJseUtleSxcbiAgICAgICAgYXNzZW1ibHlLZXlWZXJpZmllclByay50b0pTT04odHJ1ZSlcbiAgICAgICk7XG4gICAgY29uc3QgYXNzZW1ibHlLZXlWZXJpZmllclBiayA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgYXNzZW1ibHlLZXlWZXJpZmllclByay50b0pTT04oKVxuICAgICk7XG5cbiAgICBjb25zdCBzdWJqZWN0S2V5V3JhcHBlZEFzc2VtYmx5S2V5ID1cbiAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgICBzdWJqZWN0S2V5LFxuICAgICAgICBhc3NlbWJseUtleS50b0pTT04odHJ1ZSlcbiAgICAgICk7XG5cbiAgICAvLyBFbmNyeXB0IHRoZSByb290S2V5IHdpdGggdGhlIGFzc2VtYmx5S2V5XG4gICAgY29uc3QgYXNzZW1ibHlDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBhc3NlbWJseUtleSxcbiAgICAgIHtcbiAgICAgICAgcm9vdEtleTogcm9vdEtleS50b0pTT04odHJ1ZSksXG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhc3NlbWJseUtleSxcbiAgICAgIHJhd0Fzc2VtYmx5S2V5LFxuICAgICAgYXNzZW1ibHlLZXlQYXJhbXMsXG4gICAgICBzdWJqZWN0S2V5V3JhcHBlZEFzc2VtYmx5S2V5LFxuICAgICAgYXNzZW1ibHlDaXBoZXJEYXRhLFxuICAgICAgYXNzZW1ibHlLZXlWZXJpZmllclBiayxcbiAgICAgIHdyYXBwZWRBc3NlbWJseUtleVZlcmlmaWVyUHJrLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcHJlcGFyZUNyZWF0ZVN1YkFzc2VtYmxpZXMoe1xuICAgIGlucHV0LFxuICAgIHN1YmplY3RLZXksXG4gICAgc2xpcFN1YkFzc2VtYmxpZXMsXG4gICAgYXNzZW1ibHlLZXlQYXJhbXMsXG4gIH06IHtcbiAgICBpbnB1dDogQ3JlYXRlVHBTdWJBc3NlbWJseUlucHV0W107XG4gICAgc3ViamVjdEtleTogSldLLktleTtcbiAgICBzbGlwU3ViQXNzZW1ibGllczogc2xpcC5TdWJBc3NlbWJseVtdO1xuICAgIGFzc2VtYmx5S2V5UGFyYW1zOyAvLyBUT0RPIHR5cGUgdGhpc1xuICB9KSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgaW5wdXQubWFwKGFzeW5jIChzYSwgc2FJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzdWJqZWN0Q2lwaGVyRGF0YSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgICAgIHN1YmplY3RLZXksXG4gICAgICAgICAgc2Euc3ViamVjdENpcGhlckRhdGFDbGVhckpzb24gfHwgJydcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBjcmVhdGVBcHByb3ZlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBzYS5hcHByb3ZlclRwcy5tYXAoYXN5bmMgKGFwcHJvdmVyVHAsIGFwcHJvdmVySW5kZXgpID0+XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVBcHByb3Zlcih7XG4gICAgICAgICAgICAgIHRwOiBhcHByb3ZlclRwLFxuICAgICAgICAgICAgICBhcHByb3ZlckluZGV4LFxuICAgICAgICAgICAgICBzbGlwU3ViQXNzZW1ibHk6IHNsaXBTdWJBc3NlbWJsaWVzW3NhSW5kZXhdLFxuICAgICAgICAgICAgICBhc3NlbWJseUtleVBhcmFtcyxcbiAgICAgICAgICAgICAgc3ViamVjdEtleSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2luZ2xlUmVqZWN0OiBzYS5zaW5nbGVSZWplY3QsXG4gICAgICAgICAgcXVvcnVtOiBzYS5xdW9ydW0sXG4gICAgICAgICAgc3ViamVjdENpcGhlckRhdGEsXG4gICAgICAgICAgY3JlYXRlQXBwcm92ZXJzLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHByZXBhcmVVcGRhdGVTdWJBc3NlbWJsaWVzKHtcbiAgICBpbnB1dCxcbiAgICBzdWJqZWN0S2V5LFxuICAgIHNsaXBTdWJBc3NlbWJsaWVzLFxuICAgIGFzc2VtYmx5S2V5UGFyYW1zLFxuICAgIHN1YkFzc2VtYmxpZXMsXG4gIH06IHtcbiAgICBpbnB1dDogVXBkYXRlVHBTdWJBc3NlbWJseUlucHV0W107XG4gICAgc3ViamVjdEtleTogSldLLktleTtcbiAgICBzbGlwU3ViQXNzZW1ibGllczogc2xpcC5TdWJBc3NlbWJseVtdO1xuICAgIGFzc2VtYmx5S2V5UGFyYW1zOyAvLyBUT0RPIHR5cGUgdGhpc1xuICAgIHN1YkFzc2VtYmxpZXM6IENvbm5lY3Rpb248VHBTdWJBc3NlbWJseU5vZGU+O1xuICB9KSB7XG4gICAgaWYgKHNsaXBTdWJBc3NlbWJsaWVzLmxlbmd0aCAhPT0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgTHJCYWRBcmd1bWVudEV4Y2VwdGlvbihcbiAgICAgICAgJ1RoZSBzbGlwU3ViQXNzZW1ibGllcyBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgaW5wdXQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlucHV0Lm1hcChhc3luYyAoc2EsIHNhSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc3ViamVjdENpcGhlckRhdGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgICAgICBzdWJqZWN0S2V5LFxuICAgICAgICAgIHNhLnN1YmplY3RDaXBoZXJEYXRhQ2xlYXJKc29uIHx8ICcnXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBleGlzdGluZyBzdWItYXNzZW1ibHlcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTYSA9IHN1YkFzc2VtYmxpZXMuZWRnZXMuZmluZChcbiAgICAgICAgICAoZWRnZSkgPT4gZWRnZS5ub2RlLmlkID09PSBzYS5pZFxuICAgICAgICApLm5vZGU7XG5cbiAgICAgICAgLy8gR2V0IGFwcHJvdmVycyB0aGF0IGRvIG5vdCBleGlzdCB5ZXRcbiAgICAgICAgY29uc3QgY3JlYXRlQXBwcm92ZXJzID0gW107XG4gICAgICAgIGNvbnN0IHVwZGF0ZUFwcHJvdmVycyA9IFtdO1xuXG4gICAgICAgIHNhLmFwcHJvdmVyVHBzLmZvckVhY2goKHRwKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXBwcm92ZXIgPSBleGlzdGluZ1NhLmFwcHJvdmVycy5lZGdlcy5maW5kKFxuICAgICAgICAgICAgKGVkZ2UpID0+IGVkZ2Uubm9kZS50cC5pZCA9PT0gdHAudHBJZFxuICAgICAgICAgICk/Lm5vZGU7XG4gICAgICAgICAgaWYgKGFwcHJvdmVyKSB7XG4gICAgICAgICAgICB1cGRhdGVBcHByb3ZlcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRwLFxuICAgICAgICAgICAgICBhcHByb3ZlcklkOiBhcHByb3Zlci5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmVhdGVBcHByb3ZlcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzbGlwU3ViQXNzZW1ibHkgPSBzbGlwU3ViQXNzZW1ibGllc1tzYUluZGV4XTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1YkFzc2VtYmx5SWQ6IHNhLmlkLFxuICAgICAgICAgIHNpbmdsZVJlamVjdDogc2Euc2luZ2xlUmVqZWN0LFxuICAgICAgICAgIHF1b3J1bTogc2EucXVvcnVtLFxuICAgICAgICAgIHN1YmplY3RDaXBoZXJEYXRhLFxuICAgICAgICAgIGNyZWF0ZUFwcHJvdmVyczogYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBjcmVhdGVBcHByb3ZlcnMubWFwKGFzeW5jICh7IHRwIH0sIGFwcHJvdmVySW5kZXgpID0+XG4gICAgICAgICAgICAgIHRoaXMucHJlcGFyZUFwcHJvdmVyKHtcbiAgICAgICAgICAgICAgICB0cCxcbiAgICAgICAgICAgICAgICBhcHByb3ZlckluZGV4LFxuICAgICAgICAgICAgICAgIHNsaXBTdWJBc3NlbWJseSxcbiAgICAgICAgICAgICAgICBhc3NlbWJseUtleVBhcmFtcyxcbiAgICAgICAgICAgICAgICBzdWJqZWN0S2V5LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgdXBkYXRlQXBwcm92ZXJzOiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHVwZGF0ZUFwcHJvdmVycy5tYXAoYXN5bmMgKHsgdHAsIGFwcHJvdmVySWQgfSwgYXBwcm92ZXJJbmRleCkgPT5cbiAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlQXBwcm92ZXIoe1xuICAgICAgICAgICAgICAgIGFwcHJvdmVySWQsXG4gICAgICAgICAgICAgICAgdHAsXG4gICAgICAgICAgICAgICAgYXBwcm92ZXJJbmRleDogYXBwcm92ZXJJbmRleCArIGNyZWF0ZUFwcHJvdmVycy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgc2xpcFN1YkFzc2VtYmx5LFxuICAgICAgICAgICAgICAgIGFzc2VtYmx5S2V5UGFyYW1zLFxuICAgICAgICAgICAgICAgIHN1YmplY3RLZXksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsbFdyYXBwaW5nS2V5SWQoaW5wdXQ6IENyZWF0ZVRwU3ViQXNzZW1ibHlJbnB1dFtdLCB0cHM6IFRwTm9kZVtdKSB7XG4gICAgLy8gRmlsbCBpbiB3cmFwcGluZ0tleUlkIGlmIG5vdCBwcmVzZW50XG4gICAgaW5wdXQuZm9yRWFjaCgoc2EpID0+IHtcbiAgICAgIHNhLmFwcHJvdmVyVHBzLmZvckVhY2goKGFwcHJvdmVyKSA9PiB7XG4gICAgICAgIGlmICghYXBwcm92ZXIud3JhcHBpbmdLZXlJZCkge1xuICAgICAgICAgIGNvbnN0IHRwID0gdHBzLmZpbmQoKHgpID0+IHguaWQgPT09IGFwcHJvdmVyLnRwSWQpO1xuICAgICAgICAgIGFwcHJvdmVyLndyYXBwaW5nS2V5SWQgPSB0aGlzLmdldFRwV3JhcHBpbmdLZXlJZCh0cCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbnB1dEFwcHJvdmVycyhpbnB1dDogQ3JlYXRlVHBTdWJBc3NlbWJseUlucHV0W10pIHtcbiAgICBjb25zdCB0cElkczogc3RyaW5nW10gPSBbXTtcbiAgICBpbnB1dC5mb3JFYWNoKChzYSkgPT4ge1xuICAgICAgc2EuYXBwcm92ZXJUcHMuZm9yRWFjaCgoYXBwcm92ZXIpID0+IHtcbiAgICAgICAgdHBJZHMucHVzaChhcHByb3Zlci50cElkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0cElkcztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwcmVwYXJlQ3JlYXRlKGlucHV0OiBDcmVhdGVUcEFzc2VtYmx5SW5wdXQpIHtcbiAgICBjb25zdCByb290S2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRSb290S2V5KCk7XG4gICAgY29uc3Qgc3ViamVjdEtleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcbiAgICBjb25zdCByb290S2V5V3JhcHBlZFN1YmplY3RLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLndyYXBLZXkoXG4gICAgICByb290S2V5LFxuICAgICAgc3ViamVjdEtleVxuICAgICk7XG5cbiAgICBjb25zdCB7IGFzc2VtYmx5S2V5LCByYXdBc3NlbWJseUtleSwgYXNzZW1ibHlLZXlQYXJhbXMsIC4uLmFzc2VtYmx5SW5wdXQgfSA9XG4gICAgICBhd2FpdCB0aGlzLnByZXBhcmVBc3NlbWJseSh7XG4gICAgICAgIHJvb3RLZXk6IHJvb3RLZXkuandrLFxuICAgICAgICBzdWJqZWN0S2V5LFxuICAgICAgfSk7XG5cbiAgICBjb25zdCBzbGlwQXNzZW1ibHkgPSBhd2FpdCB0aGlzLnByZXBhcmVTbGlwMzkoXG4gICAgICBpbnB1dC5jcmVhdGVTdWJBc3NlbWJsaWVzLFxuICAgICAgaW5wdXQucXVvcnVtLFxuICAgICAgcmF3QXNzZW1ibHlLZXlcbiAgICApO1xuXG4gICAgY29uc3QgdHBJZHMgPSB0aGlzLmdldElucHV0QXBwcm92ZXJzKGlucHV0LmNyZWF0ZVN1YkFzc2VtYmxpZXMpO1xuXG4gICAgLy8gVGhpcyBzaG91bGQgY29udGFpbiBhbGwgdGhlIFRQcyB0aGF0IHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBhc3NlbWJseS5cbiAgICBjb25zdCB0cHMgPSBtYXBFZGdlcyhcbiAgICAgIChcbiAgICAgICAgYXdhaXQgdGhpcy5sckdyYXBoUWwucXVlcnkoe1xuICAgICAgICAgIHF1ZXJ5OiBUcHNLZXlzUXVlcnksXG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBpZHM6IHRwSWRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRwc1xuICAgICk7XG5cbiAgICAvLyBGaWxsIGluIHdyYXBwaW5nS2V5SWQgaWYgbm90IHByZXNlbnRcbiAgICB0aGlzLmZpbGxXcmFwcGluZ0tleUlkKGlucHV0LmNyZWF0ZVN1YkFzc2VtYmxpZXMsIHRwcyk7XG5cbiAgICBjb25zdCBjcmVhdGVTdWJBc3NlbWJsaWVzID0gYXdhaXQgdGhpcy5wcmVwYXJlQ3JlYXRlU3ViQXNzZW1ibGllcyh7XG4gICAgICBpbnB1dDogaW5wdXQuY3JlYXRlU3ViQXNzZW1ibGllcyxcbiAgICAgIGFzc2VtYmx5S2V5UGFyYW1zLFxuICAgICAgc2xpcFN1YkFzc2VtYmxpZXM6IHNsaXBBc3NlbWJseS5zdWJBc3NlbWJsaWVzLFxuICAgICAgc3ViamVjdEtleSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN1YmplY3RDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBzdWJqZWN0S2V5LFxuICAgICAgaW5wdXQuc3ViamVjdENpcGhlckRhdGFDbGVhckpzb24gfHwgJydcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgbXV0YXRpb25JbnB1dDoge1xuICAgICAgICAuLi5hc3NlbWJseUlucHV0LFxuICAgICAgICBzaW5nbGVSZWplY3Q6IGlucHV0LnNpbmdsZVJlamVjdCxcbiAgICAgICAgcXVvcnVtOiBpbnB1dC5xdW9ydW0sXG4gICAgICAgIHN1YmplY3RDaXBoZXJEYXRhLFxuICAgICAgICBjcmVhdGVTdWJBc3NlbWJsaWVzLFxuICAgICAgICByb290S2V5SWQ6IHJvb3RLZXkuaWQsXG4gICAgICAgIHJvb3RLZXlXcmFwcGVkU3ViamVjdEtleSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXNzZW1ibHlBcHByb3ZlcnMoYXNzZW1ibHk6IFRwQXNzZW1ibHlOb2RlKSB7XG4gICAgY29uc3QgdHBJZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBGaW5kIGFsbCBUUHMgdGhhdCBiZWxvbmcgdG8gc3ViLWFzc2VtYmxpZXNcbiAgICBtYXBFZGdlcyhhc3NlbWJseS5zdWJBc3NlbWJsaWVzKS5tYXAoKHNhKSA9PiB7XG4gICAgICBtYXBFZGdlcyhzYS5hcHByb3ZlcnMpLmZvckVhY2goKGFwcHJvdmVyKSA9PiB0cElkcy5wdXNoKGFwcHJvdmVyLnRwLmlkKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHBJZHM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZVVwZGF0ZShcbiAgICBpbnB1dDogVXBkYXRlVHBBc3NlbWJseUlucHV0LFxuICAgIGFzc2VtYmx5OiBUcEFzc2VtYmx5Tm9kZSAvLyBUT0RPIHR5cGUgdGhpcyB0byBvbmx5IHdoYXQgd2UgbmVlZC5cbiAgKSB7XG4gICAgaW5wdXQgPSB7XG4gICAgICBjcmVhdGVTdWJBc3NlbWJsaWVzOiBbXSxcbiAgICAgIC4uLmlucHV0LFxuICAgIH07XG5cbiAgICBjb25zdCBjcmVhdGVTdWJBc3NlbWJsaWVzSW5wdXQgPSBpbnB1dC5jcmVhdGVTdWJBc3NlbWJsaWVzIHx8IFtdO1xuICAgIGNvbnN0IHVwZGF0ZVN1YkFzc2VtYmxpZXNJbnB1dCA9IGlucHV0LnVwZGF0ZVN1YkFzc2VtYmxpZXMgfHwgW107XG4gICAgY29uc3QgZGVsZXRlU3ViQXNzZW1ibGllc0lucHV0ID0gaW5wdXQuZGVsZXRlU3ViQXNzZW1ibGllcyB8fCBbXTtcblxuICAgIC8vIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUuXG4gICAgaWYgKFxuICAgICAgY3JlYXRlU3ViQXNzZW1ibGllc0lucHV0Lmxlbmd0aCA9PT0gMCAmJlxuICAgICAgdXBkYXRlU3ViQXNzZW1ibGllc0lucHV0Lmxlbmd0aCA9PT0gMCAmJlxuICAgICAgZGVsZXRlU3ViQXNzZW1ibGllc0lucHV0Lmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IExyQmFkQXJndW1lbnRFeGNlcHRpb24oXG4gICAgICAgICdNdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIG9mOiBbY3JlYXRlU3ViQXNzZW1ibGllcywgdXBkYXRlU3ViQXNzZW1ibGllcywgZGVsZXRlU3ViQXNzZW1ibGllc10nXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3RLZXkgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFJvb3RLZXkoKTtcbiAgICBjb25zdCBzdWJqZWN0S2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRLZXkoYXNzZW1ibHkuc3ViamVjdEtleS5pZCk7XG5cbiAgICBjb25zdCB7IGFzc2VtYmx5S2V5LCByYXdBc3NlbWJseUtleSwgYXNzZW1ibHlLZXlQYXJhbXMsIC4uLmFzc2VtYmx5SW5wdXQgfSA9XG4gICAgICBhd2FpdCB0aGlzLnByZXBhcmVBc3NlbWJseSh7XG4gICAgICAgIHJvb3RLZXk6IHJvb3RLZXkuandrLFxuICAgICAgICBzdWJqZWN0S2V5OiBzdWJqZWN0S2V5Lmp3ayxcbiAgICAgIH0pO1xuXG4gICAgLy8gRmluZCBhbGwgdGhlIFRQcyB0aGF0IHdlIG5lZWQsIGR1cGxpY2F0ZXMgYXJlIG5vIHByb2JsZW0uXG4gICAgLy8gRXhpc3RpbmcgYXBwcm92ZXJzXG4gICAgY29uc3QgdHBJZHMgPSB0aGlzLmdldEFzc2VtYmx5QXBwcm92ZXJzKGFzc2VtYmx5KS5jb25jYXQoXG4gICAgICB0aGlzLmdldElucHV0QXBwcm92ZXJzKGNyZWF0ZVN1YkFzc2VtYmxpZXNJbnB1dCksXG4gICAgICB0aGlzLmdldElucHV0QXBwcm92ZXJzKHVwZGF0ZVN1YkFzc2VtYmxpZXNJbnB1dClcbiAgICApO1xuXG4gICAgLy8gVGhpcyBzaG91bGQgY29udGFpbiBhbGwgdGhlIFRQcyB0aGF0IHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBhc3NlbWJseS5cbiAgICBjb25zdCB0cHMgPSBtYXBFZGdlcyhcbiAgICAgIChcbiAgICAgICAgYXdhaXQgdGhpcy5sckdyYXBoUWwucXVlcnkoe1xuICAgICAgICAgIHF1ZXJ5OiBUcHNLZXlzUXVlcnksXG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBpZHM6IHRwSWRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRwc1xuICAgICk7XG5cbiAgICAvLyBBdXRvIGZpbGwgdGhlIHVwZGF0ZVN1YkFzc2VtYmxpZXMgd2l0aCBleGlzdGluZyBzdWIgYXNzZW1ibGllcyBpZiB0aGV5IGFyZSBub3RcbiAgICAvLyBleHBsaWNpdGx5IGRlbGV0ZWQuXG4gICAgbWFwRWRnZXMoYXNzZW1ibHkuc3ViQXNzZW1ibGllcykuZm9yRWFjaCgoZXhpc3RpbmcpID0+IHtcbiAgICAgIC8vIERlbGV0aW5nIGV4aXN0aW5nLCBkb24ndCBpbmNsdWRlIGl0XG4gICAgICBpZiAoZGVsZXRlU3ViQXNzZW1ibGllc0lucHV0LmluY2x1ZGVzKGV4aXN0aW5nLmlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBhbHJlYWR5IHNwZWNpZmllZCBpbiB0aGUgaW5wdXRcbiAgICAgIGlmICh1cGRhdGVTdWJBc3NlbWJsaWVzSW5wdXQuc29tZSgoc2EpID0+IHNhLmlkID09PSBleGlzdGluZy5pZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhcHByb3ZlclRwczogVHBBc3NlbWJseUFwcHJvdmVySW5wdXRbXSA9IG1hcEVkZ2VzKFxuICAgICAgICBleGlzdGluZy5hcHByb3ZlcnNcbiAgICAgICkubWFwKChhcHByb3ZlcikgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRwSWQ6IGFwcHJvdmVyLnRwLmlkLFxuICAgICAgICAgIHNoYXJlZENpcGhlckRhdGFDbGVhckpzb246IGFwcHJvdmVyLnNoYXJlZENpcGhlckRhdGFDbGVhckpzb24sXG4gICAgICAgICAgc2hhcmVkQ2lwaGVyQXBwcm92YWxEYXRhQ2xlYXJKc29uOlxuICAgICAgICAgICAgYXBwcm92ZXIuc2hhcmVkQ2lwaGVyQXBwcm92YWxEYXRhQ2xlYXJKc29uLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZVN1YkFzc2VtYmxpZXNJbnB1dC5wdXNoKHtcbiAgICAgICAgaWQ6IGV4aXN0aW5nLmlkLFxuICAgICAgICBxdW9ydW06IGV4aXN0aW5nLnF1b3J1bSxcbiAgICAgICAgc2luZ2xlUmVqZWN0OiBleGlzdGluZy5zaW5nbGVSZWplY3QsXG4gICAgICAgIGFwcHJvdmVyVHBzLFxuICAgICAgICBzdWJqZWN0Q2lwaGVyRGF0YUNsZWFySnNvbjogZXhpc3Rpbmcuc3ViamVjdENpcGhlckRhdGFDbGVhckpzb24sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEZpbGwgaW4gd3JhcHBpbmdLZXlJZCBpZiBub3QgcHJlc2VudFxuICAgIHRoaXMuZmlsbFdyYXBwaW5nS2V5SWQoY3JlYXRlU3ViQXNzZW1ibGllc0lucHV0LCB0cHMpO1xuICAgIHRoaXMuZmlsbFdyYXBwaW5nS2V5SWQodXBkYXRlU3ViQXNzZW1ibGllc0lucHV0LCB0cHMpO1xuXG4gICAgbGV0IHNsaXBBc3NlbWJseTtcbiAgICB0cnkge1xuICAgICAgc2xpcEFzc2VtYmx5ID0gYXdhaXQgdGhpcy5wcmVwYXJlU2xpcDM5KFxuICAgICAgICAoY3JlYXRlU3ViQXNzZW1ibGllc0lucHV0IHx8IFtdKS5jb25jYXQodXBkYXRlU3ViQXNzZW1ibGllc0lucHV0IHx8IFtdKSxcbiAgICAgICAgaW5wdXQucXVvcnVtLFxuICAgICAgICByYXdBc3NlbWJseUtleVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gVE9ETyB0aGlzIHNvbWV0aW1lcyBoYXBwZW5zLiBNYXliZSBtaXNzaW5nIGF3YWl0LlxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHdoaWxlIGNyZWF0aW5nIHNsaXAgYXNzZW1ibHknLCBlcnJvcik7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbW9uID0ge1xuICAgICAgYXNzZW1ibHlLZXlQYXJhbXMsXG4gICAgICBzdWJqZWN0S2V5OiBzdWJqZWN0S2V5Lmp3ayxcbiAgICB9O1xuXG4gICAgY29uc3QgY3JlYXRlU3ViQXNzZW1ibGllcyA9IGF3YWl0IHRoaXMucHJlcGFyZUNyZWF0ZVN1YkFzc2VtYmxpZXMoe1xuICAgICAgLi4uY29tbW9uLFxuICAgICAgaW5wdXQ6IGNyZWF0ZVN1YkFzc2VtYmxpZXNJbnB1dCxcbiAgICAgIC8vIE5lZWQgdG8gbWF0Y2ggdGhlIHNsaXAgc3ViIGFzc2VtYmxpZXMgdG8gdGhlIGlucHV0XG4gICAgICBzbGlwU3ViQXNzZW1ibGllczogc2xpcEFzc2VtYmx5LnN1YkFzc2VtYmxpZXMuc2xpY2UoXG4gICAgICAgIDAsXG4gICAgICAgIGNyZWF0ZVN1YkFzc2VtYmxpZXNJbnB1dC5sZW5ndGhcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICBjb25zdCB1cGRhdGVTdWJBc3NlbWJsaWVzID0gYXdhaXQgdGhpcy5wcmVwYXJlVXBkYXRlU3ViQXNzZW1ibGllcyh7XG4gICAgICAuLi5jb21tb24sXG4gICAgICBpbnB1dDogdXBkYXRlU3ViQXNzZW1ibGllc0lucHV0LFxuICAgICAgLy8gQWRkIGFuIG9mZnNldCB0byB0aGUgc3ViIGFzc2VtYmxpZXMgdG8gc2tpcCB0aGUgb25lIHRoYXQgYXJlIGNyZWF0ZWQuXG4gICAgICBzbGlwU3ViQXNzZW1ibGllczogc2xpcEFzc2VtYmx5LnN1YkFzc2VtYmxpZXMuc2xpY2UoXG4gICAgICAgIGNyZWF0ZVN1YkFzc2VtYmxpZXNJbnB1dC5sZW5ndGhcbiAgICAgICksXG4gICAgICBzdWJBc3NlbWJsaWVzOiBhc3NlbWJseS5zdWJBc3NlbWJsaWVzLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3ViamVjdENpcGhlckRhdGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgIHN1YmplY3RLZXkuandrLFxuICAgICAgaW5wdXQuc3ViamVjdENpcGhlckRhdGFDbGVhckpzb24gPz8gYXNzZW1ibHkuc3ViamVjdENpcGhlckRhdGFDbGVhckpzb25cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgbXV0YXRpb25JbnB1dDoge1xuICAgICAgICAuLi5hc3NlbWJseUlucHV0LFxuICAgICAgICBzaW5nbGVSZWplY3Q6IGlucHV0LnNpbmdsZVJlamVjdCxcbiAgICAgICAgcXVvcnVtOiBpbnB1dC5xdW9ydW0sXG4gICAgICAgIHN1YmplY3RDaXBoZXJEYXRhLFxuICAgICAgICBzdWJqZWN0S2V5SWQ6IHN1YmplY3RLZXkuaWQsXG4gICAgICAgIGNyZWF0ZVN1YkFzc2VtYmxpZXMsXG4gICAgICAgIHVwZGF0ZVN1YkFzc2VtYmxpZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVBcHByb3Zlcih7XG4gICAgYXBwcm92ZXJJZCxcbiAgICB0cCxcbiAgICBhcHByb3ZlckluZGV4LFxuICAgIHNsaXBTdWJBc3NlbWJseSxcbiAgICBhc3NlbWJseUtleVBhcmFtcyxcbiAgICBzdWJqZWN0S2V5LFxuICB9OiB7XG4gICAgYXBwcm92ZXJJZD86IHN0cmluZzsgLy8gR2l2ZW4gaWYgdXBkYXRpbmcgZXhpc3RpbmcgYXBwcm92ZXJcbiAgICB0cDogVHBBc3NlbWJseUFwcHJvdmVySW5wdXQ7XG4gICAgYXBwcm92ZXJJbmRleDogbnVtYmVyO1xuICAgIHNsaXBTdWJBc3NlbWJseTogc2xpcC5TdWJBc3NlbWJseTtcbiAgICBhc3NlbWJseUtleVBhcmFtczogb2JqZWN0O1xuICAgIHN1YmplY3RLZXk6IEpXSy5LZXk7XG4gIH0pIHtcbiAgICBjb25zdCB0cFdyYXBwaW5nS2V5ID0gYXdhaXQgdGhpcy5wcmVwYXJlVHBXcmFwcGluZ0tleSh0cCk7XG4gICAgLy8gc2hhcmVkIGtleSBpcyByb3RhdGVkIGV2ZXJ5IHRpbWUuXG4gICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuXG4gICAgLy8gRm9yIFRQIHRvIGFjY2VzcyBzaGFyZWRfa2V5XG4gICAgY29uc3QgdHBXcmFwcGVkU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICB0cFdyYXBwaW5nS2V5Lmp3ayxcbiAgICAgIHNoYXJlZEtleS50b0pTT04odHJ1ZSlcbiAgICApO1xuICAgIC8vIEZvciBzdWJqZWN0IHRvIGFjY2VzcyBzaGFyZWRfa2V5XG4gICAgY29uc3Qgc3ViamVjdEtleVdyYXBwZWRTaGFyZWRLZXkgPVxuICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICAgIHN1YmplY3RLZXksXG4gICAgICAgIHNoYXJlZEtleS50b0pTT04odHJ1ZSlcbiAgICAgICk7XG5cbiAgICAvLyBJZiBxdW9ydW0gaXMgMSwgdGhlbiB1c2luZyB0aGUgc2FtZSBzaGFyZSBmb3IgZXZlcnkgbWVtYmVyLlxuICAgIGNvbnN0IHNoYXJlID1cbiAgICAgIHNsaXBTdWJBc3NlbWJseS50aHJlc2hvbGQgPT09IDFcbiAgICAgICAgPyBzbGlwU3ViQXNzZW1ibHkuc2hhcmVzWzBdXG4gICAgICAgIDogc2xpcFN1YkFzc2VtYmx5LnNoYXJlc1thcHByb3ZlckluZGV4XTtcblxuICAgIGNvbnN0IHBhcnRpYWxBc3NlbWJseUtleTogUGFydGlhbEFzc2VtYmx5S2V5ID0ge1xuICAgICAgc2xpcDM5OiB7XG4gICAgICAgIHNoYXJlLFxuICAgICAgICBzdWJBc3NlbWJseToge1xuICAgICAgICAgIHF1b3J1bTogc2xpcFN1YkFzc2VtYmx5LnRocmVzaG9sZCxcbiAgICAgICAgICBzaXplOiBzbGlwU3ViQXNzZW1ibHkuc2l6ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhc3NlbWJseUtleVBhcmFtcyxcbiAgICB9O1xuXG4gICAgY29uc29sZS5sb2coJ3BhcnRpYWxBc3NlbWJseUtleScsIHBhcnRpYWxBc3NlbWJseUtleSk7XG5cbiAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBzaGFyZWRLZXksXG4gICAgICB0cC5zaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uIHx8ICcnXG4gICAgKTtcblxuICAgIGNvbnN0IHNoYXJlZENpcGhlckFwcHJvdmFsRGF0YSA9XG4gICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgICAgc2hhcmVkS2V5LFxuICAgICAgICB0cC5zaGFyZWRDaXBoZXJBcHByb3ZhbERhdGFDbGVhckpzb24gfHwgJydcbiAgICAgICk7XG5cbiAgICBjb25zdCBzaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXkgPVxuICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICAgIHNoYXJlZEtleSxcbiAgICAgICAgcGFydGlhbEFzc2VtYmx5S2V5XG4gICAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRwV3JhcHBpbmdLZXlJZDogdHBXcmFwcGluZ0tleS5pZCxcbiAgICAgIHRwV3JhcHBlZFNoYXJlZEtleSxcbiAgICAgIHN1YmplY3RLZXlXcmFwcGVkU2hhcmVkS2V5LFxuICAgICAgc2hhcmVkQ2lwaGVyRGF0YSxcbiAgICAgIHNoYXJlZENpcGhlckFwcHJvdmFsRGF0YSxcbiAgICAgIHNoYXJlZENpcGhlclBhcnRpYWxBc3NlbWJseUtleSxcbiAgICAgIGFwcHJvdmVySWQ6IGFwcHJvdmVySWQgfHwgdm9pZCAwLCAvLyBJZiBleGlzdGluZyBhcHByb3ZlclxuICAgICAgdHBJZDogYXBwcm92ZXJJZCA/IHZvaWQgMCA6IHRwLnRwSWQsIC8vIGVsc2UgYWRkaW5nIG5ldyBUUFxuICAgIH07XG4gIH1cblxuICB2YWxpZGF0ZUFwcHJvdmVycyhhcHByb3ZlcnM6IFRwTm9kZVtdKTogdm9pZCB7XG4gICAgLy8gRW5zdXJlIGFsbCBhcHByb3ZlcnMgaGF2ZSBta1NoYXJlZEtleS5cbiAgICBmb3IgKGNvbnN0IHRwIG9mIGFwcHJvdmVycykge1xuICAgICAgaWYgKCF0cC5jdXJyZW50VXNlclNoYXJlZEtleS51c2VyU2hhcmVkS2V5Lm1rU2hhcmVkS2V5KSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGB0cCAke3RwLm90aGVyLnVzZXJuYW1lfSBkb2VzIG5vdCBoYXZlIG1rU2hhcmVkS2V5YDtcbiAgICAgICAgY29uc29sZS5sb2cobXNnKTtcbiAgICAgICAgdGhyb3cgbmV3IExyQmFkQXJndW1lbnRFeGNlcHRpb24obXNnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQcmVwYXJlIHNsaXAzOVxuICBwcm90ZWN0ZWQgYXN5bmMgcHJlcGFyZVNsaXAzOShcbiAgICBzdWJBc3NlbWJsaWVzLFxuICAgIGFzc2VtYmx5UXVvcnVtOiBudW1iZXIsXG4gICAgcmF3QXNzZW1ibHlLZXk6IHN0cmluZ1xuICApOiBQcm9taXNlPHNsaXAuQXNzZW1ibHk+IHtcbiAgICAvLyBJcyB0aGVyZSBlbm91Z2ggc3ViIGFzc2VtYmxpZXMgdG8gbWVldCBxdW9ydW1cbiAgICBpZiAoc3ViQXNzZW1ibGllcy5sZW5ndGggPCBhc3NlbWJseVF1b3J1bSkge1xuICAgICAgdGhyb3cgbmV3IExyQmFkQXJndW1lbnRFeGNlcHRpb24oXG4gICAgICAgICdOb3QgZW5vdWdoIHN1YiBhc3NlbWJsaWVzIHRvIG1lZXQgcXVvcnVtJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzbGlwQXNzZW1ibHkgPSBuZXcgc2xpcC5Bc3NlbWJseShhc3NlbWJseVF1b3J1bSk7XG5cbiAgICBzdWJBc3NlbWJsaWVzLmZvckVhY2goKHNhLCBpbmRleCkgPT4ge1xuICAgICAgbGV0IGFwcHJvdmVyQ291bnQgPSBzYS5hcHByb3ZlclRwcy5sZW5ndGg7XG5cbiAgICAgIC8vIHNsaXAzOSByZXN0cmljdHMgcXVvcnVtID09IDEgdG8gaGF2ZSBvbmx5IDEgbWVtYmVyLiBTbyB3ZSBqdXN0IHNoYXJlIHRoZSBzYW1lXG4gICAgICAvLyBwYXJ0aWFsIGtleSBmb3IgYWxsIHN1YiBhc3NlbWJseSBtZW1iZXJzLlxuICAgICAgaWYgKHNhLnF1b3J1bSA9PT0gMSkge1xuICAgICAgICBhcHByb3ZlckNvdW50ID0gMTtcbiAgICAgIH1cbiAgICAgIHNsaXBBc3NlbWJseS5hZGRTdWJBc3NlbWJseShcbiAgICAgICAgbmV3IHNsaXAuU3ViQXNzZW1ibHkoaW5kZXgsIHNhLnF1b3J1bSwgYXBwcm92ZXJDb3VudClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLnNsaXAzOVNlcnZpY2UuZ2VuZXJhdGVTaGFyZXMoXG4gICAgICByYXdBc3NlbWJseUtleSxcbiAgICAgIHRoaXMuc2xpcDM5UGFzc3BocmFzZSxcbiAgICAgIHNsaXBBc3NlbWJseVxuICAgICk7XG4gICAgcmV0dXJuIHNsaXBBc3NlbWJseTtcbiAgfVxufVxuIl19
@@ -1 +0,0 @@
1
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAtYXNzZW1ibHkudHlwZXMuanMiLCJzb3VyY2VSb290IjoiL29wdC9hdGxhc3NpYW4vcGlwZWxpbmVzL2FnZW50L2J1aWxkL3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL3RydXN0ZWQtcGFydGllcy90cC1hc3NlbWJseS50eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSlNPTk9iamVjdCB9IGZyb20gJy4uL2FwaS90eXBlcyc7XG5pbXBvcnQgKiBhcyBzbGlwIGZyb20gJy4uL2NyeXB0b2dyYXBoeS9zbGlwMzkuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFydGlhbEFzc2VtYmx5S2V5IHtcbiAgc2xpcDM5OiB7XG4gICAgc2hhcmU6IHNsaXAuU2VjcmV0U2hhcmU7XG4gICAgLy8gTWFpbmx5IGZvciBkZWJ1Z2dpbmcuXG4gICAgc3ViQXNzZW1ibHk6IHtcbiAgICAgIHF1b3J1bTogbnVtYmVyO1xuICAgICAgc2l6ZTogbnVtYmVyO1xuICAgIH07XG4gIH07XG4gIGFzc2VtYmx5S2V5UGFyYW1zOiBvYmplY3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVHBTdWJBc3NlbWJseUlucHV0IHtcbiAgcXVvcnVtOiBudW1iZXI7XG4gIHNpbmdsZVJlamVjdDogYm9vbGVhbjtcbiAgYXBwcm92ZXJUcHM6IFRwQXNzZW1ibHlBcHByb3ZlcklucHV0W107IC8vIE1ha2UgdGhpcyBleHBsaWNpdCB0eXBpbmcsIG1heWJlIHVzZSB0cyB0byBwaWNrIG1lbWJlcnNcbiAgc3ViamVjdENpcGhlckRhdGFDbGVhckpzb24/OiBKU09OT2JqZWN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVRwU3ViQXNzZW1ibHlJbnB1dCBleHRlbmRzIENyZWF0ZVRwU3ViQXNzZW1ibHlJbnB1dCB7XG4gIGlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHBBc3NlbWJseUlucHV0IHtcbiAgcXVvcnVtOiBudW1iZXI7XG4gIHNpbmdsZVJlamVjdDogYm9vbGVhbjtcbiAgc3ViamVjdENpcGhlckRhdGFDbGVhckpzb24/OiBKU09OT2JqZWN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVRwQXNzZW1ibHlJbnB1dCBleHRlbmRzIFRwQXNzZW1ibHlJbnB1dCB7XG4gIGNyZWF0ZVN1YkFzc2VtYmxpZXM6IENyZWF0ZVRwU3ViQXNzZW1ibHlJbnB1dFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVRwQXNzZW1ibHlJbnB1dCBleHRlbmRzIFRwQXNzZW1ibHlJbnB1dCB7XG4gIGNyZWF0ZVN1YkFzc2VtYmxpZXM/OiBDcmVhdGVUcFN1YkFzc2VtYmx5SW5wdXRbXTtcbiAgdXBkYXRlU3ViQXNzZW1ibGllcz86IFVwZGF0ZVRwU3ViQXNzZW1ibHlJbnB1dFtdO1xuICBkZWxldGVTdWJBc3NlbWJsaWVzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHBBc3NlbWJseUFwcHJvdmVySW5wdXQge1xuICB0cElkOiBzdHJpbmc7XG4gIC8vIFRoaXMgd3JhcHBpbmcga2V5IGlzIHVzZWQgdG8gZW5jcnlwdCB0aGUgc2hhcmVkIGtleSBiZXR3ZWVuIHRoZSBjdXJyZW50IHVzZXJcbiAgLy8gYW5kIHRoZSBUUC4gVGhpcyBjYW4gYmUgZWl0aGVyIHRoZSBzaGFyZWRLZXkgb3IgbWtTaGFyZWRLZXkgZGVwZW5kaW5nIG9uIHRoZSBtdXRhdGlvbi5cbiAgLy8gZWcuIGZvciB0cCBwYXNzd29yZCByZXN0LCB3ZSB3YW50IHRvIHVzZSBta1NoYXJlZEtleSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgY2FzY2FkaW5nXG4gIC8vIGJyZWFjaGVzIG9mIHRoZSByb290IGtleS4gRm9yIHNjZW5hcmlvLCB3ZSB1c2Ugc2hhcmVkS2V5IGJlY2F1c2Ugd2Ugd2FudCB0byBzY2VuYXJpb3NcbiAgLy8gdG8gcGVyc2lzdCBhZnRlciBtYXN0ZXIga2V5IGhhcyBiZWVuIHJlc2V0LlxuICAvLyBOb3cgd2UgaXNzdWUgYSBUUHMgcXVlcnkgdG8gZmlsbCBpbiBtaXNzaW5nIHVwZGF0ZVN1YkFzc2VtYmx5IGZpZWxkcy4gU28gd2UgZ2V0XG4gIC8vIHRoaXMga2V5IGRpcmVjdG9yeSBmcm9tIHRoZSBUUC5cbiAgd3JhcHBpbmdLZXlJZD86IHN0cmluZztcbiAgc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbj86IEpTT05PYmplY3Q7XG4gIHNoYXJlZENpcGhlckFwcHJvdmFsRGF0YUNsZWFySnNvbj86IEpTT05PYmplY3Q7XG59XG4iXX0=
@@ -1,113 +0,0 @@
1
- import { __awaiter, __decorate } from "tslib";
2
- import { Injectable, Injector, NgZone } from '@angular/core';
3
- import { JWK } from 'node-jose';
4
- import { LrMergedMutation, LrMutation, LrService, } from '../api/lr-graphql';
5
- import { TpAssemblyState, TpClaimApproverState } from '../api/types';
6
- import { EncryptionService } from '../cryptography/encryption.service';
7
- import { LrBadStateException } from '../_common/exceptions';
8
- import { RunOutsideAngular } from '../_common/run-outside-angular';
9
- import { ApproveTpPasswordResetRequestMutation, RejectTpPasswordResetRequestMutation, SharedTpPasswordResetQuery, SharedTpPasswordResetsQuery, } from './tp-password-reset.gql';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "../cryptography/encryption.service";
12
- let TpPasswordResetRequestService = class TpPasswordResetRequestService extends LrService {
13
- constructor(ngZone, injector, encryptionService) {
14
- super(injector);
15
- this.ngZone = ngZone;
16
- this.injector = injector;
17
- this.encryptionService = encryptionService;
18
- }
19
- getSharedResets() {
20
- return __awaiter(this, void 0, void 0, function* () {
21
- return (yield this.query({
22
- query: SharedTpPasswordResetsQuery,
23
- })).sharedTpPasswordResets;
24
- });
25
- }
26
- getSharedReset(id) {
27
- return __awaiter(this, void 0, void 0, function* () {
28
- return (yield this.query({
29
- query: SharedTpPasswordResetQuery,
30
- variables: {
31
- id,
32
- },
33
- })).sharedTpPasswordReset;
34
- });
35
- }
36
- activeRequestOrRaise(sharedReset) {
37
- const state = sharedReset.sharedRequest.claim.state;
38
- if (state !== TpAssemblyState.CLAIMED) {
39
- throw new LrBadStateException(`Claim is already in ${state} state.`);
40
- }
41
- }
42
- rejectRequest(sharedResetId) {
43
- return this.mutate(this.rejectRequestMutation(sharedResetId));
44
- }
45
- rejectRequestMutation(sharedResetId) {
46
- return __awaiter(this, void 0, void 0, function* () {
47
- const sharedReset = yield this.getSharedReset(sharedResetId);
48
- this.activeRequestOrRaise(sharedReset);
49
- return LrMergedMutation.create(sharedReset.sharedRequest.claim.asClaimApprovers.edges
50
- .filter((edge) => edge.node.state === TpClaimApproverState.CLAIMED)
51
- .map((edge) => new LrMutation({
52
- mutation: RejectTpPasswordResetRequestMutation,
53
- variables: { input: { claimApproverId: edge.node.id } },
54
- })));
55
- });
56
- }
57
- approveRequest(sharedResetId, pbkFingerPrint) {
58
- return __awaiter(this, void 0, void 0, function* () {
59
- return this.lrGraphQL.lrMutate(yield this.approveRequestMutation(sharedResetId, pbkFingerPrint));
60
- });
61
- }
62
- approveRequestMutation(sharedResetId, pbkFingerPrint) {
63
- return __awaiter(this, void 0, void 0, function* () {
64
- const sharedReset = yield this.getSharedReset(sharedResetId);
65
- this.activeRequestOrRaise(sharedReset);
66
- const pbk = yield JWK.asKey(JSON.parse(sharedReset.sharedRequest.pxk.pbk));
67
- console.log(pbk.toJSON());
68
- // TODO <AZ> Verify pbk against pbkFingerPrint
69
- const claimApprovers = sharedReset.sharedRequest.claim.asClaimApprovers.edges.filter((edge) => edge.node.state === TpClaimApproverState.CLAIMED);
70
- // A single approver may belong to multiple sub-assemblies. We approve them all here in a single
71
- // transaction.
72
- return LrMergedMutation.create(yield Promise.all(claimApprovers.map((approverEdge) => __awaiter(this, void 0, void 0, function* () {
73
- const ca = approverEdge.node;
74
- const input = {
75
- claimApproverId: ca.id,
76
- receiverApprovals: yield Promise.all(ca.receiverApprovals.edges.map((receiverEdge) => __awaiter(this, void 0, void 0, function* () {
77
- const ra = receiverEdge.node;
78
- return {
79
- receiverApprovalId: ra.id,
80
- receiverCipher: '',
81
- receiverCipherPartialAssemblyKey: yield this.encryptionService.encryptToString(pbk, ca.sharedCipherPartialAssemblyKeyClearJson),
82
- };
83
- }))),
84
- };
85
- console.log(input);
86
- return new LrMutation({
87
- mutation: ApproveTpPasswordResetRequestMutation,
88
- variables: {
89
- input,
90
- },
91
- });
92
- }))));
93
- });
94
- }
95
- };
96
- TpPasswordResetRequestService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TpPasswordResetRequestService_Factory() { return new TpPasswordResetRequestService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.EncryptionService)); }, token: TpPasswordResetRequestService, providedIn: "root" });
97
- TpPasswordResetRequestService.decorators = [
98
- { type: Injectable, args: [{
99
- providedIn: 'root',
100
- },] }
101
- ];
102
- TpPasswordResetRequestService.ctorParameters = () => [
103
- { type: NgZone },
104
- { type: Injector },
105
- { type: EncryptionService }
106
- ];
107
- TpPasswordResetRequestService = __decorate([
108
- RunOutsideAngular({
109
- ngZoneName: 'ngZone',
110
- })
111
- ], TpPasswordResetRequestService);
112
- export { TpPasswordResetRequestService };
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAtcGFzc3dvcmQtcmVzZXQtcmVxdWVzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9vcHQvYXRsYXNzaWFuL3BpcGVsaW5lcy9hZ2VudC9idWlsZC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi90cnVzdGVkLXBhcnRpZXMvdHAtcGFzc3dvcmQtcmVzZXQtcmVxdWVzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFFVixTQUFTLEdBQ1YsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFDTCxxQ0FBcUMsRUFDckMsb0NBQW9DLEVBQ3BDLDBCQUEwQixFQUMxQiwyQkFBMkIsR0FDNUIsTUFBTSx5QkFBeUIsQ0FBQzs7O0lBUXBCLDZCQUE2QixTQUE3Qiw2QkFBOEIsU0FBUSxTQUFTO0lBQzFELFlBQ1UsTUFBYyxFQUNkLFFBQWtCLEVBQ2xCLGlCQUFvQztRQUU1QyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFKUixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO0lBRzlDLENBQUM7SUFFSyxlQUFlOztZQUNuQixPQUFPLENBQ0wsTUFBTSxJ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dG9yLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEpXSyB9IGZyb20gJ25vZGUtam9zZSc7XG5pbXBvcnQge1xuICBMckdyYXBoUUxTZXJ2aWNlLFxuICBMck1lcmdlZE11dGF0aW9uLFxuICBMck11dGF0aW9uLFxuICBMck11dGF0aW9uQmFzZSxcbiAgTHJTZXJ2aWNlLFxufSBmcm9tICcuLi9hcGkvbHItZ3JhcGhxbCc7XG5pbXBvcnQgeyBUcEFzc2VtYmx5U3RhdGUsIFRwQ2xhaW1BcHByb3ZlclN0YXRlIH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBMckJhZFN0YXRlRXhjZXB0aW9uIH0gZnJvbSAnLi4vX2NvbW1vbi9leGNlcHRpb25zJztcbmltcG9ydCB7IFJ1bk91dHNpZGVBbmd1bGFyIH0gZnJvbSAnLi4vX2NvbW1vbi9ydW4tb3V0c2lkZS1hbmd1bGFyJztcbmltcG9ydCB7XG4gIEFwcHJvdmVUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0TXV0YXRpb24sXG4gIFJlamVjdFRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvbixcbiAgU2hhcmVkVHBQYXNzd29yZFJlc2V0UXVlcnksXG4gIFNoYXJlZFRwUGFzc3dvcmRSZXNldHNRdWVyeSxcbn0gZnJvbSAnLi90cC1wYXNzd29yZC1yZXNldC5ncWwnO1xuXG5AUnVuT3V0c2lkZUFuZ3VsYXIoe1xuICBuZ1pvbmVOYW1lOiAnbmdab25lJyxcbn0pXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVHBQYXNzd29yZFJlc2V0UmVxdWVzdFNlcnZpY2UgZXh0ZW5kcyBMclNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgfVxuXG4gIGFzeW5jIGdldFNoYXJlZFJlc2V0cygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgdGhpcy5xdWVyeSh7XG4gICAgICAgIHF1ZXJ5OiBTaGFyZWRUcFBhc3N3b3JkUmVzZXRzUXVlcnksXG4gICAgICB9KVxuICAgICkuc2hhcmVkVHBQYXNzd29yZFJlc2V0cztcbiAgfVxuXG4gIGFzeW5jIGdldFNoYXJlZFJlc2V0KGlkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoe1xuICAgICAgICBxdWVyeTogU2hhcmVkVHBQYXNzd29yZFJlc2V0UXVlcnksXG4gICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgIGlkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLnNoYXJlZFRwUGFzc3dvcmRSZXNldDtcbiAgfVxuXG4gIHByaXZhdGUgYWN0aXZlUmVxdWVzdE9yUmFpc2Uoc2hhcmVkUmVzZXQpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHNoYXJlZFJlc2V0LnNoYXJlZFJlcXVlc3QuY2xhaW0uc3RhdGU7XG4gICAgaWYgKHN0YXRlICE9PSBUcEFzc2VtYmx5U3RhdGUuQ0xBSU1FRCkge1xuICAgICAgdGhyb3cgbmV3IExyQmFkU3RhdGVFeGNlcHRpb24oYENsYWltIGlzIGFscmVhZHkgaW4gJHtzdGF0ZX0gc3RhdGUuYCk7XG4gICAgfVxuICB9XG5cbiAgcmVqZWN0UmVxdWVzdChzaGFyZWRSZXNldElkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5yZWplY3RSZXF1ZXN0TXV0YXRpb24oc2hhcmVkUmVzZXRJZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVqZWN0UmVxdWVzdE11dGF0aW9uKHNoYXJlZFJlc2V0SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNoYXJlZFJlc2V0ID0gYXdhaXQgdGhpcy5nZXRTaGFyZWRSZXNldChzaGFyZWRSZXNldElkKTtcblxuICAgIHRoaXMuYWN0aXZlUmVxdWVzdE9yUmFpc2Uoc2hhcmVkUmVzZXQpO1xuXG4gICAgcmV0dXJuIExyTWVyZ2VkTXV0YXRpb24uY3JlYXRlKFxuICAgICAgc2hhcmVkUmVzZXQuc2hhcmVkUmVxdWVzdC5jbGFpbS5hc0NsYWltQXBwcm92ZXJzLmVkZ2VzXG4gICAgICAgIC5maWx0ZXIoKGVkZ2UpID0+IGVkZ2Uubm9kZS5zdGF0ZSA9PT0gVHBDbGFpbUFwcHJvdmVyU3RhdGUuQ0xBSU1FRClcbiAgICAgICAgLm1hcChcbiAgICAgICAgICAoZWRnZSkgPT5cbiAgICAgICAgICAgIG5ldyBMck11dGF0aW9uKHtcbiAgICAgICAgICAgICAgbXV0YXRpb246IFJlamVjdFRwUGFzc3dvcmRSZXNldFJlcXVlc3RNdXRhdGlvbixcbiAgICAgICAgICAgICAgdmFyaWFibGVzOiB7IGlucHV0OiB7IGNsYWltQXBwcm92ZXJJZDogZWRnZS5ub2RlLmlkIH0gfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgYXBwcm92ZVJlcXVlc3Qoc2hhcmVkUmVzZXRJZDogc3RyaW5nLCBwYmtGaW5nZXJQcmludD86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmxyR3JhcGhRTC5sck11dGF0ZShcbiAgICAgIGF3YWl0IHRoaXMuYXBwcm92ZVJlcXVlc3RNdXRhdGlvbihzaGFyZWRSZXNldElkLCBwYmtGaW5nZXJQcmludClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgYXBwcm92ZVJlcXVlc3RNdXRhdGlvbihzaGFyZWRSZXNldElkOiBzdHJpbmcsIHBia0ZpbmdlclByaW50Pzogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2hhcmVkUmVzZXQgPSBhd2FpdCB0aGlzLmdldFNoYXJlZFJlc2V0KHNoYXJlZFJlc2V0SWQpO1xuXG4gICAgdGhpcy5hY3RpdmVSZXF1ZXN0T3JSYWlzZShzaGFyZWRSZXNldCk7XG5cbiAgICBjb25zdCBwYmsgPSBhd2FpdCBKV0suYXNLZXkoSlNPTi5wYXJzZShzaGFyZWRSZXNldC5zaGFyZWRSZXF1ZXN0LnB4ay5wYmspKTtcbiAgICBjb25zb2xlLmxvZyhwYmsudG9KU09OKCkpO1xuXG4gICAgLy8gVE9ETyA8QVo+IFZlcmlmeSBwYmsgYWdhaW5zdCBwYmtGaW5nZXJQcmludFxuXG4gICAgY29uc3QgY2xhaW1BcHByb3ZlcnMgPSBzaGFyZWRSZXNldC5zaGFyZWRSZXF1ZXN0LmNsYWltLmFzQ2xhaW1BcHByb3ZlcnMuZWRnZXMuZmlsdGVyKFxuICAgICAgKGVkZ2UpID0+IGVkZ2Uubm9kZS5zdGF0ZSA9PT0gVHBDbGFpbUFwcHJvdmVyU3RhdGUuQ0xBSU1FRFxuICAgICk7XG5cbiAgICAvLyBBIHNpbmdsZSBhcHByb3ZlciBtYXkgYmVsb25nIHRvIG11bHRpcGxlIHN1Yi1hc3NlbWJsaWVzLiBXZSBhcHByb3ZlIHRoZW0gYWxsIGhlcmUgaW4gYSBzaW5nbGVcbiAgICAvLyB0cmFuc2FjdGlvbi5cbiAgICByZXR1cm4gTHJNZXJnZWRNdXRhdGlvbi5jcmVhdGUoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY2xhaW1BcHByb3ZlcnMubWFwKGFzeW5jIChhcHByb3ZlckVkZ2UpID0+IHtcbiAgICAgICAgICBjb25zdCBjYSA9IGFwcHJvdmVyRWRnZS5ub2RlO1xuICAgICAgICAgIGNvbnN0IGlucHV0ID0ge1xuICAgICAgICAgICAgY2xhaW1BcHByb3ZlcklkOiBjYS5pZCxcbiAgICAgICAgICAgIHJlY2VpdmVyQXBwcm92YWxzOiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgY2EucmVjZWl2ZXJBcHByb3ZhbHMuZWRnZXMubWFwKGFzeW5jIChyZWNlaXZlckVkZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByYSA9IHJlY2VpdmVyRWRnZS5ub2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICByZWNlaXZlckFwcHJvdmFsSWQ6IHJhLmlkLFxuICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJDaXBoZXI6ICcnLFxuICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXk6IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBwYmssXG4gICAgICAgICAgICAgICAgICAgIGNhLnNoYXJlZENpcGhlclBhcnRpYWxBc3NlbWJseUtleUNsZWFySnNvblxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc29sZS5sb2coaW5wdXQpO1xuXG4gICAgICAgICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgICAgICAgIG11dGF0aW9uOiBBcHByb3ZlVHBQYXNzd29yZFJlc2V0UmVxdWVzdE11dGF0aW9uLFxuICAgICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICB9XG59XG4iXX0=