@lifeready/core 6.0.5 → 6.1.2

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 (101) hide show
  1. package/bundles/lifeready-core.umd.js +3485 -7369
  2. package/bundles/lifeready-core.umd.js.map +1 -1
  3. package/bundles/lifeready-core.umd.min.js +1 -1
  4. package/bundles/lifeready-core.umd.min.js.map +1 -1
  5. package/esm2015/lib/auth2/auth.config.js +57 -0
  6. package/esm2015/lib/auth2/auth2.gql.private.js +8 -1
  7. package/esm2015/lib/auth2/auth2.service.js +3 -4
  8. package/esm2015/lib/auth2/auth2.types.js +1 -1
  9. package/esm2015/lib/encryption/encryption.service.js +7 -6
  10. package/esm2015/lib/file-upload/file-upload.service.js +4 -4
  11. package/esm2015/lib/idle/idle.service.js +1 -2
  12. package/esm2015/lib/item2/item2.service.js +17 -46
  13. package/esm2015/lib/key/key-graph.service.js +3 -3
  14. package/esm2015/lib/key/key-meta.service.js +16 -64
  15. package/esm2015/lib/key/key.types.js +6 -1
  16. package/esm2015/lib/key-exchange/key-exchange2.service.js +6 -25
  17. package/esm2015/lib/life-ready.module.js +2 -9
  18. package/esm2015/lib/password/password.service.js +1 -1
  19. package/esm2015/lib/profile/profile-details.service.js +120 -75
  20. package/esm2015/lib/profile/profile.gql.js +134 -1
  21. package/esm2015/lib/profile/profile.service.js +8 -5
  22. package/esm2015/lib/profile/profile.types.js +14 -3
  23. package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +2 -2
  24. package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +1 -1
  25. package/esm2015/lib/trusted-party/trusted-party2.service.js +3 -7
  26. package/esm2015/lifeready-core.js +7 -9
  27. package/esm2015/public-api.js +2 -20
  28. package/fesm2015/lifeready-core.js +3223 -6588
  29. package/fesm2015/lifeready-core.js.map +1 -1
  30. package/lib/auth2/auth2.gql.private.d.ts +15 -2
  31. package/lib/auth2/auth2.service.d.ts +1 -1
  32. package/lib/auth2/auth2.types.d.ts +19 -2
  33. package/lib/file-upload/file-upload.service.d.ts +2 -2
  34. package/lib/item2/item2.service.d.ts +12 -75
  35. package/lib/key/key-meta.service.d.ts +8 -1
  36. package/lib/key/key.types.d.ts +4 -1
  37. package/lib/key-exchange/key-exchange2.service.d.ts +5 -66
  38. package/lib/password/password.service.d.ts +1 -1
  39. package/lib/profile/profile-details.service.d.ts +10 -11
  40. package/lib/profile/profile.gql.d.ts +12 -0
  41. package/lib/profile/profile.service.d.ts +1 -3
  42. package/lib/profile/profile.types.d.ts +31 -4
  43. package/lib/shared-contact-card/shared-contact-card.service.d.ts +1 -2
  44. package/lib/tp-password-reset/tp-password-reset.types.d.ts +3 -3
  45. package/lib/trusted-party/trusted-party2.service.d.ts +2 -7
  46. package/lifeready-core.d.ts +6 -8
  47. package/lifeready-core.metadata.json +1 -1
  48. package/package.json +1 -1
  49. package/public-api.d.ts +1 -19
  50. package/esm2015/lib/auth/auth.config.js +0 -57
  51. package/esm2015/lib/auth/auth.gql.js +0 -16
  52. package/esm2015/lib/auth/auth.types.js +0 -18
  53. package/esm2015/lib/auth/life-ready-auth.service.js +0 -568
  54. package/esm2015/lib/category/category-meta.service.js +0 -99
  55. package/esm2015/lib/category/category.gql.js +0 -385
  56. package/esm2015/lib/category/category.service.js +0 -361
  57. package/esm2015/lib/category/category.types.js +0 -29
  58. package/esm2015/lib/key-exchange/key-exchange.gql.js +0 -188
  59. package/esm2015/lib/key-exchange/key-exchange.service.js +0 -436
  60. package/esm2015/lib/key-exchange/key-exchange.types.js +0 -7
  61. package/esm2015/lib/message/message.gql.js +0 -32
  62. package/esm2015/lib/message/message.service.js +0 -118
  63. package/esm2015/lib/message/message.types.js +0 -2
  64. package/esm2015/lib/plan/plan.gql.js +0 -123
  65. package/esm2015/lib/plan/plan.service.js +0 -150
  66. package/esm2015/lib/plan/plan.types.js +0 -11
  67. package/esm2015/lib/record/record-attachment.service.js +0 -102
  68. package/esm2015/lib/record/record.gql.js +0 -182
  69. package/esm2015/lib/record/record.service.js +0 -194
  70. package/esm2015/lib/record/record.types.js +0 -15
  71. package/esm2015/lib/record-type/record-type.service.js +0 -75
  72. package/esm2015/lib/record-type/record-type.types.js +0 -28
  73. package/esm2015/lib/trusted-party/trusted-party.gql.js +0 -148
  74. package/esm2015/lib/trusted-party/trusted-party.service.js +0 -308
  75. package/esm2015/lib/trusted-party/trusted-party.types.js +0 -41
  76. package/lib/auth/auth.gql.d.ts +0 -12
  77. package/lib/auth/auth.types.d.ts +0 -52
  78. package/lib/auth/life-ready-auth.service.d.ts +0 -73
  79. package/lib/category/category-meta.service.d.ts +0 -23
  80. package/lib/category/category.gql.d.ts +0 -44
  81. package/lib/category/category.service.d.ts +0 -66
  82. package/lib/category/category.types.d.ts +0 -75
  83. package/lib/key-exchange/key-exchange.gql.d.ts +0 -9
  84. package/lib/key-exchange/key-exchange.service.d.ts +0 -37
  85. package/lib/key-exchange/key-exchange.types.d.ts +0 -188
  86. package/lib/message/message.gql.d.ts +0 -13
  87. package/lib/message/message.service.d.ts +0 -36
  88. package/lib/message/message.types.d.ts +0 -12
  89. package/lib/plan/plan.gql.d.ts +0 -11
  90. package/lib/plan/plan.service.d.ts +0 -34
  91. package/lib/plan/plan.types.d.ts +0 -32
  92. package/lib/record/record-attachment.service.d.ts +0 -16
  93. package/lib/record/record.gql.d.ts +0 -14
  94. package/lib/record/record.service.d.ts +0 -25
  95. package/lib/record/record.types.d.ts +0 -56
  96. package/lib/record-type/record-type.service.d.ts +0 -11
  97. package/lib/record-type/record-type.types.d.ts +0 -50
  98. package/lib/trusted-party/trusted-party.gql.d.ts +0 -9
  99. package/lib/trusted-party/trusted-party.service.d.ts +0 -43
  100. package/lib/trusted-party/trusted-party.types.d.ts +0 -101
  101. /package/lib/{auth → auth2}/auth.config.d.ts +0 -0
@@ -1,436 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
- import { Injectable } from '@angular/core';
4
- import { LrApolloService } from '../api/lr-apollo.service';
5
- import { Auth2Service } from '../auth2/auth2.service';
6
- import { EncryptionService, JoseSerialization, } from '../encryption/encryption.service';
7
- import { KeyFactoryService as KFS } from '../key/key-factory.service';
8
- import { KeyService } from '../key/key.service';
9
- import { KcCodeMismatchException } from '../_common/exceptions';
10
- import { CompleteOtkMutation, CurrentUserSharedKeyQuery, InitiateOtkMutation, KeyExchangeQuery, KeyExchangesQuery, KeyExchangeTokenQuery, RespondOtkMutation, } from './key-exchange.gql';
11
- import { OtkState, } from './key-exchange.types';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "../key/key-factory.service";
14
- import * as i2 from "../key/key.service";
15
- import * as i3 from "../api/lr-apollo.service";
16
- import * as i4 from "../encryption/encryption.service";
17
- import * as i5 from "../auth2/auth2.service";
18
- export class KeyExchangeService {
19
- constructor(keyFactory, keyService, lrApollo, encryptionService, auth2Service) {
20
- this.keyFactory = keyFactory;
21
- this.keyService = keyService;
22
- this.lrApollo = lrApollo;
23
- this.encryptionService = encryptionService;
24
- this.auth2Service = auth2Service;
25
- this.CLIENT_NONCE_LENGTH = 32;
26
- }
27
- getKeyExchangeList(input = {}) {
28
- return __awaiter(this, void 0, void 0, function* () {
29
- const { keyExchanges } = yield this.lrApollo.query({
30
- query: KeyExchangesQuery,
31
- variables: Object.assign({}, input),
32
- });
33
- return keyExchanges;
34
- });
35
- }
36
- /**
37
- * @param id If the current user can responder the key exchange if they are either the initiator or the receiver.
38
- * @param token If not signed in, or not the initiator or responder, 'token' must be given.
39
- * @param otKeyK Is the raw one-time key (string). If the responder is explicitly specified at time of initiation, then
40
- * it's possible to have the otKey wrapped by the public key of the responder. In which case, the otKeyK is not needed.
41
- */
42
- getKeyExchange(id, { otKeyK, token } = {}) {
43
- return __awaiter(this, void 0, void 0, function* () {
44
- const { keyExchange } = yield this.lrApollo.query({
45
- query: token ? KeyExchangeTokenQuery : KeyExchangeQuery,
46
- variables: {
47
- id,
48
- token,
49
- },
50
- });
51
- return yield this.decryptKeyExchange(keyExchange, otKeyK);
52
- });
53
- }
54
- decryptResponseCipher(otKey, otPrk, content) {
55
- return __awaiter(this, void 0, void 0, function* () {
56
- // The response could be wrapped by the OtK as well as we the OtPrk
57
- try {
58
- content = yield this.encryptionService.decrypt(otKey, content);
59
- }
60
- catch (error) {
61
- if (error.message !== 'no key found') {
62
- throw error;
63
- }
64
- // Do nothing to support older versions where message is not wrapped with otk.
65
- }
66
- // The Prk is single-use and only used to send information from the responder back to the initiator.
67
- return yield this.encryptionService.decrypt(otPrk, content);
68
- });
69
- }
70
- decryptKeyExchange(keyExchange, otKeyK) {
71
- return __awaiter(this, void 0, void 0, function* () {
72
- if (keyExchange.isInitiator) {
73
- const rootKey = this.keyService.currentRootKey;
74
- // Decrypt using the root key to get the Prk
75
- const plainInitiatorRootKeyCipher = (yield this.encryptionService.decrypt(rootKey.jwk, keyExchange.initiatorRootKeyCipher));
76
- const plainInitiatorOneTimePbkCipher = keyExchange.otk
77
- .initiatorOneTimePbkCipher
78
- ? yield this.decryptResponseCipher(yield KFS.asKey(plainInitiatorRootKeyCipher.otKey), yield KFS.asKey(plainInitiatorRootKeyCipher.oneTimePrk), keyExchange.otk.initiatorOneTimePbkCipher)
79
- : null;
80
- const responder = plainInitiatorOneTimePbkCipher &&
81
- plainInitiatorOneTimePbkCipher.responder;
82
- const initiator = plainInitiatorRootKeyCipher && plainInitiatorRootKeyCipher.initiator;
83
- return Object.assign(Object.assign({}, keyExchange), { message: responder ? responder.message : null, contactCard: responder && responder.contactCard
84
- ? responder.contactCard.plainSharedCipherDataJson
85
- : null, myContactCard: initiator && initiator.contactCard
86
- ? initiator.contactCard.plainSharedCipherDataJson
87
- : null, myMessage: initiator && initiator.message });
88
- }
89
- else {
90
- const decryptedOtk = yield this.decryptOtk(keyExchange, otKeyK);
91
- const initiator = decryptedOtk && decryptedOtk.plainOtKeyCipher.initiator;
92
- return Object.assign(Object.assign({}, keyExchange), { decryptedOtk, message: initiator && initiator.message, contactCard: initiator &&
93
- initiator.contactCard &&
94
- initiator.contactCard.plainSharedCipherDataJson });
95
- }
96
- });
97
- }
98
- decryptOtk(keyExchange, otKeyK) {
99
- return __awaiter(this, void 0, void 0, function* () {
100
- const otKey = yield this.getOtKey(keyExchange, otKeyK);
101
- return otKey && keyExchange.otk.otKeyCipher
102
- ? {
103
- plainOtKeyCipher: yield this.encryptionService.decrypt(otKey, keyExchange.otk.otKeyCipher),
104
- otKey,
105
- }
106
- : null;
107
- });
108
- }
109
- getOtKey(keyExchange, otKeyK) {
110
- return __awaiter(this, void 0, void 0, function* () {
111
- if (otKeyK) {
112
- return yield KFS.asKey(Object.assign(Object.assign({}, JSON.parse(keyExchange.otk.otKeyParams)), { k: otKeyK }));
113
- }
114
- else if (keyExchange.otk.state === OtkState.OTK_INITIATED &&
115
- !keyExchange.isInitiator &&
116
- keyExchange.otk.responderPbkCipher) {
117
- // Assuming existing user getting invited where OTK is wrapped in responder's public key.
118
- const prk = this.keyService.currentPxk;
119
- const decryptedCipher = yield this.encryptionService.decrypt(prk.jwk, JSON.parse(keyExchange.otk.responderPbkCipher), {
120
- serializations: [JoseSerialization.COMPACT],
121
- });
122
- if (decryptedCipher.otKey) {
123
- return yield KFS.asKey(decryptedCipher.otKey);
124
- }
125
- }
126
- return null;
127
- });
128
- }
129
- initiateOtk({ message, email, contactCard, upgrade, }) {
130
- return __awaiter(this, void 0, void 0, function* () {
131
- const otKey = yield this.keyFactory.createKey();
132
- const nonce = this.keyFactory.randomString(this.CLIENT_NONCE_LENGTH);
133
- const user = yield this.auth2Service.getUser();
134
- // New PKC key for encryption. This key is used only once when the responder sends
135
- // back their signing public key.
136
- const initiatorOneTimePrk = yield this.keyFactory.createPkcKey();
137
- // Option 1: New PKC key for signing
138
- // const initiatorSigPrk = await this.keyService.createPkcSignKey();
139
- // Option 2: Use the user's global signing key.
140
- // This key is used to prove the initiator's identity.
141
- const initiatorPrk = this.keyService.currentPxk;
142
- const initiatorSigPrk = this.keyService.currentSigPxk;
143
- let initiatorPlainDataSig = null;
144
- if (contactCard && contactCard.ownerPlainData) {
145
- initiatorPlainDataSig = JSON.stringify(yield this.encryptionService.sign(initiatorSigPrk.jwk, contactCard.ownerPlainData));
146
- }
147
- const initiator = {
148
- message,
149
- contactCard: contactCard
150
- ? {
151
- plainSharedCipherDataJson: contactCard.plainSharedCipherDataJson,
152
- }
153
- : null,
154
- };
155
- // Content to be encrypted using the OTK.
156
- const plainOtKeyCipher = {
157
- nonce,
158
- initiator: Object.assign(Object.assign({}, initiator), { oneTimePbk: initiatorOneTimePrk.toJSON(), pbk: initiatorPrk.jwk.toJSON(), sigPbk: initiatorSigPrk.jwk.toJSON(), profile: {
159
- username: user.username,
160
- } }),
161
- };
162
- const otKeyCipher = yield this.encryptionService.encrypt(otKey, plainOtKeyCipher);
163
- // Content to be encrypted using the initiator's root key.
164
- const plainInitiatorRootKeyCipher = {
165
- nonce,
166
- oneTimePrk: initiatorOneTimePrk.toJSON(true),
167
- // Should not need to keep this encrypted since we are using the global signing key.
168
- // sigPrk: initiatorSigPrk.toJSON(true),
169
- // Save it in case the initiator want to decode the otKeyCipher.
170
- // Since the otKey is only used once, and that otKeyCipher contains only
171
- // the public key of the initiator, it's safe just leave the otKey stored here.
172
- otKey: otKey.toJSON(true),
173
- // These should be storing information such as how the fields of the shared contact card is
174
- // derived from the master contact card.
175
- initiatorContactCard: contactCard,
176
- initiator,
177
- };
178
- const rootKey = this.keyService.currentRootKey;
179
- const initiatorRootKeyCipher = yield this.encryptionService.encrypt(rootKey.jwk, plainInitiatorRootKeyCipher);
180
- // The raw OTK
181
- const otKeyK = otKey.toJSON(true).k;
182
- // API call
183
- const { initiateKeyExchangeOtk } = yield this.lrApollo.mutate({
184
- mutation: InitiateOtkMutation,
185
- variables: {
186
- input: {
187
- // These will be stored on the server
188
- initiatorRootKeyCipher: JSON.stringify(initiatorRootKeyCipher),
189
- initiatorPxkId: initiatorPrk.id,
190
- initiatorSigPxkId: initiatorSigPrk.id,
191
- // These will be sent to the responder
192
- otKeyParams: JSON.stringify(otKey.toJSON()),
193
- otKeyCipher: JSON.stringify(otKeyCipher),
194
- sendEmail: email
195
- ? {
196
- email,
197
- rawOtKey: otKeyK,
198
- }
199
- : null,
200
- createTp: true,
201
- initiatorPlainDataSig,
202
- upgrade,
203
- },
204
- },
205
- });
206
- return { keyExchange: initiateKeyExchangeOtk.keyExchange, otKeyK };
207
- });
208
- }
209
- respondOtk({ id, token, decryptedOtk, message, initiatorContactCard, responderContactCard: sentContactCard, }) {
210
- return __awaiter(this, void 0, void 0, function* () {
211
- const user = yield this.auth2Service.getUser();
212
- const rootKey = this.keyService.currentRootKey;
213
- const masterKey = this.keyService.currentMasterKey;
214
- const sharedKey = yield this.keyFactory.createKey();
215
- const mkSharedKey = yield this.keyFactory.createKey();
216
- const rkWrappedSharedKey = yield this.encryptionService.encrypt(rootKey.jwk, sharedKey.toJSON(true));
217
- const mkWrappedMkSharedKey = yield this.encryptionService.encrypt(masterKey.jwk, mkSharedKey.toJSON(true));
218
- const initiatorOneTimePbk = yield KFS.asKey(decryptedOtk.plainOtKeyCipher.initiator.oneTimePbk);
219
- const initiatorPbk = yield KFS.asKey(decryptedOtk.plainOtKeyCipher.initiator.pbk);
220
- const initiatorSigPbk = yield KFS.asKey(decryptedOtk.plainOtKeyCipher.initiator.sigPbk);
221
- // Option 1: Using new Prk for each TP pair
222
- // Create a new public signing key for the responder.
223
- // const responderSigPrk = await this.keyService.createPkcSignKey()
224
- // const rkWrappedResponderSigPrk = await this.encrypt(rootKey, responderSigPrk.toJSON(true));
225
- // Option 2: Responder already has a signing Prk
226
- const responderPrk = this.keyService.currentPxk;
227
- const responderSigPrk = this.keyService.currentSigPxk;
228
- const signedInitiatorPbk = yield this.encryptionService.sign(responderSigPrk.jwk, initiatorPbk.toJSON());
229
- const signedInitiatorSigPbk = yield this.encryptionService.sign(responderSigPrk.jwk, initiatorSigPbk.toJSON());
230
- const plainInitiatorOneTimePbkCipher = {
231
- nonce: decryptedOtk.plainOtKeyCipher.nonce,
232
- sharedKey: sharedKey.toJSON(true),
233
- mkSharedKey: mkSharedKey.toJSON(true),
234
- responder: {
235
- pbk: responderPrk.jwk.toJSON(),
236
- sigPbk: responderSigPrk.jwk.toJSON(),
237
- profile: {
238
- username: user.username,
239
- },
240
- message,
241
- },
242
- };
243
- let receivedCardInput;
244
- if (decryptedOtk.plainOtKeyCipher.initiator.contactCard) {
245
- // Set the info about the initiator to be the ones sent by the initiator. We need th responder to do the encryption here
246
- // because the initiator does not have the shared key yet, and we want the responder to have a functional contact card after
247
- // this exchange. The initiator can double check the contact details are correct and sign it when it completes the exchange.
248
- const plainSharedCipherDataJson = decryptedOtk.plainOtKeyCipher.initiator.contactCard
249
- .plainSharedCipherDataJson;
250
- // Create keys
251
- const receiverKey = yield this.keyFactory.createKey();
252
- const ccSharedKey = yield this.keyFactory.createKey();
253
- const sigPxk = this.keyService.currentSigPxk;
254
- receivedCardInput = {
255
- receiverWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, receiverKey.toJSON(true))),
256
- receiverWrappingKeyId: rootKey.id,
257
- receiverCipherData: initiatorContactCard
258
- ? JSON.stringify(yield this.encryptionService.encrypt(receiverKey, initiatorContactCard.plainReceiverCipherDataJson))
259
- : '',
260
- sharedWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(sharedKey, ccSharedKey.toJSON(true))),
261
- };
262
- const sharedCipherData = yield this.encryptionService.encrypt(ccSharedKey, plainSharedCipherDataJson);
263
- receivedCardInput.sharedCipherDataSig = JSON.stringify(yield this.encryptionService.sign(sigPxk.jwk, sharedCipherData));
264
- receivedCardInput.sigPxkId = sigPxk.id;
265
- plainInitiatorOneTimePbkCipher.responder.contactCard = Object.assign(Object.assign({}, plainInitiatorOneTimePbkCipher.responder.contactCard), { sharedCipherKey: ccSharedKey.toJSON(true) });
266
- }
267
- let sentCardInput;
268
- if (sentContactCard) {
269
- // Create keys
270
- const ownerKey = yield this.keyFactory.createKey();
271
- const ccSharedKey = yield this.keyFactory.createKey();
272
- const sigPxk = this.keyService.currentSigPxk;
273
- sentCardInput = {
274
- ownerWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, ownerKey.toJSON(true))),
275
- ownerWrappingKeyId: rootKey.id,
276
- ownerCipherData: sentContactCard.plainOwnerCipherDataJson
277
- ? JSON.stringify(yield this.encryptionService.encrypt(ownerKey, sentContactCard.plainOwnerCipherDataJson))
278
- : '',
279
- sharedWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(sharedKey, ccSharedKey.toJSON(true))),
280
- };
281
- const sharedCipherData = yield this.encryptionService.encrypt(ccSharedKey, sentContactCard.plainSharedCipherDataJson);
282
- sentCardInput.sharedCipherDataSig = JSON.stringify(yield this.encryptionService.sign(sigPxk.jwk, sharedCipherData));
283
- sentCardInput.sigPxkId = sigPxk.id;
284
- if (sentContactCard.ownerPlainData) {
285
- sentCardInput.ownerPlainDataSig = JSON.stringify(yield this.encryptionService.sign(responderSigPrk.jwk, sentContactCard.ownerPlainData));
286
- }
287
- // Contact card info readable by the initiator
288
- plainInitiatorOneTimePbkCipher.responder.contactCard = Object.assign(Object.assign({}, plainInitiatorOneTimePbkCipher.responder.contactCard), { plainSharedCipherDataJson: sentContactCard.plainSharedCipherDataJson });
289
- }
290
- // Encrypt with one-time public key
291
- let initiatorOneTimePbkCipher = yield this.encryptionService.encrypt(initiatorOneTimePbk, plainInitiatorOneTimePbkCipher);
292
- // Encrypt with the otk again to keep use of asymmetric keys to a minimum.
293
- initiatorOneTimePbkCipher = yield this.encryptionService.encrypt(decryptedOtk.otKey, initiatorOneTimePbkCipher);
294
- const { respondKeyExchangeOtk } = yield this.lrApollo.mutate({
295
- mutation: RespondOtkMutation,
296
- variables: {
297
- input: {
298
- keyExchangeId: id,
299
- keyExchangeToken: token,
300
- rootKeyId: rootKey.id,
301
- masterKeyId: masterKey.id,
302
- // These will be stored on the server
303
- responderPxkId: responderPrk.id,
304
- responderSigPxkId: responderSigPrk.id,
305
- signedInitiatorPbk: JSON.stringify(signedInitiatorPbk),
306
- signedInitiatorSigPbk: JSON.stringify(signedInitiatorSigPbk),
307
- // rkWrappedInitiatorSigPbk: JSON.stringify(rkWrappedInitiatorSigPbk),
308
- // Option 1: Using new Prk for each TP pair
309
- // rkWrappedResponderSigPrk: JSON.stringify(rkWrappedResponderSigPrk),
310
- rkWrappedSharedKey: JSON.stringify(rkWrappedSharedKey),
311
- mkWrappedMkSharedKey: JSON.stringify(mkWrappedMkSharedKey),
312
- // These will be sent to the initiator
313
- initiatorOneTimePbkCipher: JSON.stringify(initiatorOneTimePbkCipher),
314
- initiatorContactCard: receivedCardInput,
315
- responderContactCard: sentCardInput,
316
- },
317
- },
318
- });
319
- return {
320
- keyExchange: respondKeyExchangeOtk.keyExchange,
321
- userSharedKey: respondKeyExchangeOtk.userSharedKey,
322
- tp: respondKeyExchangeOtk.tp,
323
- };
324
- });
325
- }
326
- completeOtk(keyExchangeId, initiatorRootKeyCipher, initiatorOneTimePbkCipher, responderContactCard) {
327
- return __awaiter(this, void 0, void 0, function* () {
328
- const rootKey = this.keyService.currentRootKey;
329
- const masterKey = this.keyService.currentMasterKey;
330
- // Decrypt using the root key to get the Prk
331
- const plainInitiatorRootKeyCipher = (yield this.encryptionService.decrypt(rootKey.jwk, initiatorRootKeyCipher));
332
- // The Prk is single-use and only used to send information from the responder back to the initiator.
333
- const plainInitiatorOneTimePbkCipher = yield this.decryptResponseCipher(yield KFS.asKey(plainInitiatorRootKeyCipher.otKey), yield KFS.asKey(plainInitiatorRootKeyCipher.oneTimePrk), initiatorOneTimePbkCipher);
334
- // Check the nonce match to ensure the responder was the one holding the OTK
335
- if (plainInitiatorRootKeyCipher.nonce !== plainInitiatorOneTimePbkCipher.nonce) {
336
- throw new KcCodeMismatchException('The nonce returned by responder does not match with the one created by the initiator.');
337
- }
338
- // Option 1: Assuming the signing key is unique between users.
339
- // const initiatorSigPrk = await KFS.asKey(ke.plainInitiatorRootKeyCipher.sigPrk);
340
- // const rkWrappedInitiatorSigPrk = await this.encrypt(rootKey, initiatorSigPrk.toJSON(true));
341
- // Option 2: Use the user's global signing key.
342
- // In this case the initiatorSigPrk is already a part of the key graph.
343
- // So there's nothing to do here.
344
- // Protected the signing public key of the responder.
345
- const initiatorSigPrk = this.keyService.currentSigPxk;
346
- const responderSigPbk = yield KFS.asKey(plainInitiatorOneTimePbkCipher.responder.sigPbk);
347
- const responderPbk = yield KFS.asKey(plainInitiatorOneTimePbkCipher.responder.pbk);
348
- const signedResponderPbk = yield this.encryptionService.sign(initiatorSigPrk.jwk, responderPbk.toJSON());
349
- const signedResponderSigPbk = yield this.encryptionService.sign(initiatorSigPrk.jwk, responderSigPbk.toJSON());
350
- const sharedKey = yield KFS.asKey(plainInitiatorOneTimePbkCipher.sharedKey);
351
- const rkWrappedSharedKey = yield this.encryptionService.encrypt(rootKey.jwk, sharedKey.toJSON(true));
352
- const mkSharedKey = yield KFS.asKey(plainInitiatorOneTimePbkCipher.mkSharedKey);
353
- const mkWrappedMkSharedKey = yield this.encryptionService.encrypt(masterKey.jwk, mkSharedKey.toJSON(true));
354
- let responderContactCardCipherInput;
355
- if (responderContactCard) {
356
- // Create key
357
- const receiverKey = yield this.keyFactory.createKey();
358
- responderContactCardCipherInput = {
359
- receiverWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, receiverKey.toJSON(true))),
360
- receiverWrappingKeyId: rootKey.id,
361
- receiverCipherData: JSON.stringify(yield this.encryptionService.encrypt(receiverKey, responderContactCard)),
362
- };
363
- }
364
- // Get the data needed from the initiator's cipher data.
365
- let initiatorContactCardCipherInput;
366
- let initiatorContactCardSharedCipherInput;
367
- if (plainInitiatorRootKeyCipher.initiatorContactCard) {
368
- const initiatorContactCard = plainInitiatorRootKeyCipher.initiatorContactCard;
369
- const ownerKey = yield this.keyFactory.createKey();
370
- const sharedCipherKey = yield KFS.asKey(plainInitiatorOneTimePbkCipher.responder.contactCard.sharedCipherKey);
371
- const ownerWrappedKey = JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, ownerKey.toJSON(true)));
372
- const ownerCipherData = initiatorContactCard.plainOwnerCipherDataJson
373
- ? JSON.stringify(yield this.encryptionService.encrypt(ownerKey, initiatorContactCard.plainOwnerCipherDataJson))
374
- : '';
375
- initiatorContactCardCipherInput = {
376
- ownerWrappedKey,
377
- ownerWrappingKeyId: rootKey.id,
378
- ownerCipherData,
379
- };
380
- initiatorContactCardSharedCipherInput = {
381
- sigPxkId: initiatorSigPrk.id,
382
- };
383
- const sharedCipherData = yield this.encryptionService.encrypt(sharedCipherKey, initiatorContactCard.plainSharedCipherDataJson);
384
- initiatorContactCardSharedCipherInput.sharedCipherDataSig =
385
- JSON.stringify(yield this.encryptionService.sign(initiatorSigPrk.jwk, sharedCipherData));
386
- }
387
- // TODO ideally we update the shared data in the contact card sent to the responder as well since that
388
- // CC was created by the responder.
389
- const res = yield this.lrApollo.mutate({
390
- mutation: CompleteOtkMutation,
391
- variables: {
392
- input: {
393
- keyExchangeId,
394
- rootKeyId: rootKey.id,
395
- masterKeyId: masterKey.id,
396
- initiatorSigPxkId: initiatorSigPrk.id,
397
- signedResponderPbk: JSON.stringify(signedResponderPbk),
398
- signedResponderSigPbk: JSON.stringify(signedResponderSigPbk),
399
- rkWrappedSharedKey: JSON.stringify(rkWrappedSharedKey),
400
- mkWrappedMkSharedKey: JSON.stringify(mkWrappedMkSharedKey),
401
- responderContactCardCipher: responderContactCardCipherInput,
402
- initiatorContactCardCipher: initiatorContactCardCipherInput,
403
- initiatorContactCardSharedCipher: initiatorContactCardSharedCipherInput,
404
- },
405
- },
406
- });
407
- return res.completeKeyExchangeOtk;
408
- });
409
- }
410
- currentUserSharedKey(input) {
411
- return __awaiter(this, void 0, void 0, function* () {
412
- const { currentUserSharedKey } = yield this.lrApollo.query({
413
- query: CurrentUserSharedKeyQuery,
414
- variables: {
415
- username: input.username,
416
- userId: input.userId,
417
- },
418
- });
419
- return currentUserSharedKey.userSharedKey;
420
- });
421
- }
422
- }
423
- KeyExchangeService.ɵprov = i0.ɵɵdefineInjectable({ factory: function KeyExchangeService_Factory() { return new KeyExchangeService(i0.ɵɵinject(i1.KeyFactoryService), i0.ɵɵinject(i2.KeyService), i0.ɵɵinject(i3.LrApolloService), i0.ɵɵinject(i4.EncryptionService), i0.ɵɵinject(i5.Auth2Service)); }, token: KeyExchangeService, providedIn: "root" });
424
- KeyExchangeService.decorators = [
425
- { type: Injectable, args: [{
426
- providedIn: 'root',
427
- },] }
428
- ];
429
- KeyExchangeService.ctorParameters = () => [
430
- { type: KFS },
431
- { type: KeyService },
432
- { type: LrApolloService },
433
- { type: EncryptionService },
434
- { type: Auth2Service }
435
- ];
436
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWV4Y2hhbmdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIva2V5LWV4Y2hhbmdlL2tleS1leGNoYW5nZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsaUJBQWlCLEdBQ2xCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixJQUFJLEdBQUcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsa0JBQWtCLEdBQ25CLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQVFMLFFBQVEsR0FPVCxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7O0FBSzlCLE1BQU0sT0FBTyxrQkFBa0I7SUFHN0IsWUFDVSxVQUFlLEVBQ2YsVUFBc0IsRUFDdEIsUUFBeUIsRUFDekIsaUJBQW9DLEVBQ3BDLFlBQTBCO1FBSjFCLGVBQVUsR0FBVixVQUFVLENBQUs7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFQbkIsd0JBQW1CLEdBQUcsRUFBRSxDQUFDO0lBUXZDLENBQUM7SUFFUyxrQkFBa0IsQ0FDN0IsUUFBbUMsRUFBRTs7WUFFckMsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBRy9DO2dCQUNELEtBQUssRUFBRSxpQkFBaUI7Z0JBQ3hCLFNBQVMsb0JBQ0osS0FBSyxDQUNUO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztLQUFBO0lBRUQ7Ozs7O09BS0c7SUFDVSxjQUFjLENBQ3pCLEVBQVUsRUFDVixFQUFFLE1BQU0sRUFBRSxLQUFLLEtBQTRCLEVBQUU7O1lBRTdDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUc5QztnQkFDRCxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO2dCQUN2RCxTQUFTLEVBQUU7b0JBQ1QsRUFBRTtvQkFDRixLQUFLO2lCQUNOO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUQsQ0FBQztLQUFBO0lBRWEscUJBQXFCLENBQ2pDLEtBQWMsRUFDZCxLQUFjLEVBQ2QsT0FBWTs7WUFFWixtRUFBbUU7WUFDbkUsSUFBSTtnQkFDRixPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNoRTtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNkLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxjQUFjLEVBQUU7b0JBQ3BDLE1BQU0sS0FBSyxDQUFDO2lCQUNiO2dCQUNELDhFQUE4RTthQUMvRTtZQUVELG9HQUFvRztZQUNwRyxPQUFPLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUQsQ0FBQztLQUFBO0lBRVksa0JBQWtCLENBQzdCLFdBQXdCLEVBQ3hCLE1BQWU7O1lBRWYsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFO2dCQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQztnQkFDL0MsNENBQTRDO2dCQUM1QyxNQUFNLDJCQUEyQixHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUN2RSxPQUFPLENBQUMsR0FBRyxFQUNYLFdBQVcsQ0FBQyxzQkFBc0IsQ0FDbkMsQ0FBMkMsQ0FBQztnQkFFN0MsTUFBTSw4QkFBOEIsR0FBRyxXQUFXLENBQUMsR0FBRztxQkFDbkQseUJBQXlCO29CQUMxQixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQzlCLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsRUFDbEQsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxFQUN2RCxXQUFXLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUMxQztvQkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUVULE1BQU0sU0FBUyxHQUNiLDhCQUE4QjtvQkFDOUIsOEJBQThCLENBQUMsU0FBUyxDQUFDO2dCQUMzQyxNQUFNLFNBQVMsR0FDYiwyQkFBMkIsSUFBSSwyQkFBMkIsQ0FBQyxTQUFTLENBQUM7Z0JBRXZFLHVDQUNLLFdBQVcsS0FDZCxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQzdDLFdBQVcsRUFDVCxTQUFTLElBQUksU0FBUyxDQUFDLFdBQVc7d0JBQ2hDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLHlCQUF5Qjt3QkFDakQsQ0FBQyxDQUFDLElBQUksRUFDVixhQUFhLEVBQ1gsU0FBUyxJQUFJLFNBQVMsQ0FBQyxXQUFXO3dCQUNoQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyx5QkFBeUI7d0JBQ2pELENBQUMsQ0FBQyxJQUFJLEVBQ1YsU0FBUyxFQUFFLFNBQVMsSUFBSSxTQUFTLENBQUMsT0FBTyxJQUN6QzthQUNIO2lCQUFNO2dCQUNMLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBRWhFLE1BQU0sU0FBUyxHQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO2dCQUUxRSx1Q0FDSyxXQUFXLEtBQ2QsWUFBWSxFQUNaLE9BQU8sRUFBRSxTQUFTLElBQUksU0FBUyxDQUFDLE9BQU8sRUFDdkMsV0FBVyxFQUNULFNBQVM7d0JBQ1QsU0FBUyxDQUFDLFdBQVc7d0JBQ3JCLFNBQVMsQ0FBQyxXQUFXLENBQUMseUJBQXlCLElBQ2pEO2FBQ0g7UUFDSCxDQUFDO0tBQUE7SUFFYSxVQUFVLENBQ3RCLFdBQXdCLEVBQ3hCLE1BQWU7O1lBRWYsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV2RCxPQUFPLEtBQUssSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVc7Z0JBQ3pDLENBQUMsQ0FBQztvQkFDRSxnQkFBZ0IsRUFBRSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQ3BELEtBQUssRUFDTCxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FDNUI7b0JBQ0QsS0FBSztpQkFDTjtnQkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1gsQ0FBQztLQUFBO0lBRWEsUUFBUSxDQUNwQixXQUF3QixFQUN4QixNQUFlOztZQUVmLElBQUksTUFBTSxFQUFFO2dCQUNWLE9BQU8sTUFBTSxHQUFHLENBQUMsS0FBSyxpQ0FDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUMxQyxDQUFDLEVBQUUsTUFBTSxJQUNULENBQUM7YUFDSjtpQkFBTSxJQUNMLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxhQUFhO2dCQUNoRCxDQUFDLFdBQVcsQ0FBQyxXQUFXO2dCQUN4QixXQUFXLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUNsQztnQkFDQSx5RkFBeUY7Z0JBQ3pGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO2dCQUN2QyxNQUFNLGVBQWUsR0FBUSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQy9ELEdBQUcsQ0FBQyxHQUFHLEVBQ1AsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQzlDO29CQUNFLGNBQWMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztpQkFDNUMsQ0FDRixDQUFDO2dCQUNGLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRTtvQkFDekIsT0FBTyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMvQzthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0tBQUE7SUFFSyxXQUFXLENBQUMsRUFDaEIsT0FBTyxFQUNQLEtBQUssRUFDTCxXQUFXLEVBQ1gsT0FBTyxHQUNVOztZQUNqQixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDaEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDckUsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRS9DLGtGQUFrRjtZQUNsRixpQ0FBaUM7WUFDakMsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFakUsb0NBQW9DO1lBQ3BDLG9FQUFvRTtZQUVwRSwrQ0FBK0M7WUFDL0Msc0RBQXNEO1lBQ3RELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBQ2hELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBRXRELElBQUkscUJBQXFCLEdBQVcsSUFBSSxDQUFDO1lBRXpDLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxjQUFjLEVBQUU7Z0JBQzdDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ3BDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FDL0IsZUFBZSxDQUFDLEdBQUcsRUFDbkIsV0FBVyxDQUFDLGNBQWMsQ0FDM0IsQ0FDRixDQUFDO2FBQ0g7WUFFRCxNQUFNLFNBQVMsR0FBRztnQkFDaEIsT0FBTztnQkFDUCxXQUFXLEVBQUUsV0FBVztvQkFDdEIsQ0FBQyxDQUFDO3dCQUNFLHlCQUF5QixFQUFFLFdBQVcsQ0FBQyx5QkFBeUI7cUJBQ2pFO29CQUNILENBQUMsQ0FBQyxJQUFJO2FBQ1QsQ0FBQztZQUVGLHlDQUF5QztZQUN6QyxNQUFNLGdCQUFnQixHQUFxQjtnQkFDekMsS0FBSztnQkFDTCxTQUFTLGtDQUNKLFNBQVMsS0FDWixVQUFVLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEVBQ3hDLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUM5QixNQUFNLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFDcEMsT0FBTyxFQUFFO3dCQUNQLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtxQkFDeEIsR0FDRjthQUNGLENBQUM7WUFFRixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQ3RELEtBQUssRUFDTCxnQkFBZ0IsQ0FDakIsQ0FBQztZQUVGLDBEQUEwRDtZQUMxRCxNQUFNLDJCQUEyQixHQUFnQztnQkFDL0QsS0FBSztnQkFDTCxVQUFVLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDNUMsb0ZBQW9GO2dCQUNwRix3Q0FBd0M7Z0JBRXhDLGdFQUFnRTtnQkFDaEUsd0VBQXdFO2dCQUN4RSwrRUFBK0U7Z0JBQy9FLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDekIsMkZBQTJGO2dCQUMzRix3Q0FBd0M7Z0JBQ3hDLG9CQUFvQixFQUFFLFdBQVc7Z0JBQ2pDLFNBQVM7YUFDVixDQUFDO1lBRUYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUM7WUFDL0MsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQ2pFLE9BQU8sQ0FBQyxHQUFHLEVBQ1gsMkJBQTJCLENBQzVCLENBQUM7WUFFRixjQUFjO1lBQ2QsTUFBTSxNQUFNLEdBQVksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQVMsQ0FBQyxDQUFDLENBQUM7WUFFckQsV0FBVztZQUNYLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQU07Z0JBQ2pFLFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLFNBQVMsRUFBRTtvQkFDVCxLQUFLLEVBQUU7d0JBQ0wscUNBQXFDO3dCQUNyQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDO3dCQUM5RCxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUU7d0JBQy9CLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxFQUFFO3dCQUNyQyxzQ0FBc0M7d0JBQ3RDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDM0MsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO3dCQUN4QyxTQUFTLEVBQUUsS0FBSzs0QkFDZCxDQUFDLENBQUM7Z0NBQ0UsS0FBSztnQ0FDTCxRQUFRLEVBQUUsTUFBTTs2QkFDakI7NEJBQ0gsQ0FBQyxDQUFDLElBQUk7d0JBQ1IsUUFBUSxFQUFFLElBQUk7d0JBQ2QscUJBQXFCO3dCQUNyQixPQUFPO3FCQUNSO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDckUsQ0FBQztLQUFBO0lBRUssVUFBVSxDQUFDLEVBQ2YsRUFBRSxFQUNGLEtBQUssRUFDTCxZQUFZLEVBQ1osT0FBTyxFQUNQLG9CQUFvQixFQUNwQixvQkFBb0IsRUFBRSxlQUFlLEdBQ3JCOztZQUNoQixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUM7WUFFL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUVuRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEQsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRXRELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUM3RCxPQUFPLENBQUMsR0FBRyxFQUNYLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQ3ZCLENBQUM7WUFDRixNQUFNLG9CQUFvQixHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FDL0QsU0FBUyxDQUFDLEdBQUcsRUFDYixXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUN6QixDQUFDO1lBRUYsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQ3pDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUNuRCxDQUFDO1lBRUYsTUFBTSxZQUFZLEdBQUcsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUNsQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FDNUMsQ0FBQztZQUNGLE1BQU0sZUFBZSxHQUFHLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FDckMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQy9DLENBQUM7WUFFRiwyQ0FBMkM7WUFDM0MscURBQXFEO1lBQ3JELG1FQUFtRTtZQUNuRSw4RkFBOEY7WUFFOUYsZ0RBQWdEO1lBQ2hELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBQ2hELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBRXRELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUMxRCxlQUFlLENBQUMsR0FBRyxFQUNuQixZQUFZLENBQUMsTUFBTSxFQUFFLENBQ3RCLENBQUM7WUFDRixNQUFNLHFCQUFxQixHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FDN0QsZUFBZSxDQUFDLEdBQUcsRUFDbkIsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUN6QixDQUFDO1lBRUYsTUFBTSw4QkFBOEIsR0FBbUM7Z0JBQ3JFLEtBQUssRUFBRSxZQUFZLENBQUMsZ0JBQWdCLENBQUMsS0FBSztnQkFDMUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNqQyxXQUFXLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ3JDLFNBQVMsRUFBRTtvQkFDVCxHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7b0JBQzlCLE1BQU0sRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtvQkFDcEMsT0FBTyxFQUFFO3dCQUNQLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtxQkFDeEI7b0JBQ0QsT0FBTztpQkFDUjthQUNGLENBQUM7WUFFRixJQUFJLGlCQUFpQixDQUFDO1lBQ3RCLElBQUksWUFBWSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3ZELHdIQUF3SDtnQkFDeEgsNEhBQTRIO2dCQUM1SCw0SEFBNEg7Z0JBQzVILE1BQU0seUJBQXlCLEdBQzdCLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsV0FBVztxQkFDaEQseUJBQXlCLENBQUM7Z0JBRS9CLGNBQWM7Z0JBQ2QsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN0RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO2dCQUU3QyxpQkFBaUIsR0FBRztvQkFDbEIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FDaEMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUNsQyxPQUFPLENBQUMsR0FBRyxFQUNYLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQ3pCLENBQ0Y7b0JBQ0QscUJBQXFCLEVBQUUsT0FBTyxDQUFDLEVBQUU7b0JBQ2pDLGtCQUFrQixFQUFFLG9CQUFvQjt3QkFDdEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ1osTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUNsQyxXQUFXLEVBQ1gsb0JBQW9CLENBQUMsMkJBQTJCLENBQ2pELENBQ0Y7d0JBQ0gsQ0FBQyxDQUFDLEVBQUU7b0JBQ04sZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FDOUIsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUNsQyxTQUFTLEVBQ1QsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FDekIsQ0FDRjtpQkFDRixDQUFDO2dCQUVGLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUMzRCxXQUFXLEVBQ1gseUJBQXlCLENBQzFCLENBQUM7Z0JBQ0YsaUJBQWlCLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDcEQsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FDaEUsQ0FBQztnQkFDRixpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFFdkMsOEJBQThCLENBQUMsU0FBUyxDQUFDLFdBQVcsbUNBQy9DLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxXQUFXLEtBQ3ZELGVBQWUsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUMxQyxDQUFDO2FBQ0g7WUFFRCxJQUFJLGFBQWEsQ0FBQztZQUNsQixJQUFJLGVBQWUsRUFBRTtnQkFDbkIsY0FBYztnQkFDZCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7Z0JBRTdDLGFBQWEsR0FBRztvQkFDZCxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FDN0IsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUNsQyxPQUFPLENBQUMsR0FBRyxFQUNYLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQ3RCLENBQ0Y7b0JBQ0Qsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLEVBQUU7b0JBQzlCLGVBQWUsRUFBRSxlQUFlLENBQUMsd0JBQXdCO3dCQUN2RCxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDWixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQ2xDLFFBQVEsRUFDUixlQUFlLENBQUMsd0JBQXdCLENBQ3pDLENBQ0Y7d0JBQ0gsQ0FBQyxDQUFDLEVBQUU7b0JBRU4sZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FDOUIsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUNsQyxTQUFTLEVBQ1QsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FDekIsQ0FDRjtpQkFDRixDQUFDO2dCQUVGLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUMzRCxXQUFXLEVBQ1gsZUFBZSxDQUFDLHlCQUF5QixDQUMxQyxDQUFDO2dCQUNGLGFBQWEsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUNoRCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUNoRSxDQUFDO2dCQUNGLGFBQWEsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFFbkMsSUFBSSxlQUFlLENBQUMsY0FBYyxFQUFFO29CQUNsQyxhQUFhLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDOUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUMvQixlQUFlLENBQUMsR0FBRyxFQUNuQixlQUFlLENBQUMsY0FBYyxDQUMvQixDQUNGLENBQUM7aUJBQ0g7Z0JBRUQsOENBQThDO2dCQUM5Qyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsV0FBVyxtQ0FDL0MsOEJBQThCLENBQUMsU0FBUyxDQUFDLFdBQVcsS0FDdkQseUJBQXlCLEVBQUUsZUFBZSxDQUFDLHlCQUF5QixHQUNyRSxDQUFDO2FBQ0g7WUFFRCxtQ0FBbUM7WUFDbkMsSUFBSSx5QkFBeUIsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQ2xFLG1CQUFtQixFQUNuQiw4QkFBOEIsQ0FDL0IsQ0FBQztZQUVGLDBFQUEwRTtZQUMxRSx5QkFBeUIsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQzlELFlBQVksQ0FBQyxLQUFLLEVBQ2xCLHlCQUF5QixDQUMxQixDQUFDO1lBRUYsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBTTtnQkFDaEUsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsU0FBUyxFQUFFO29CQUNULEtBQUssRUFBRTt3QkFDTCxhQUFhLEVBQUUsRUFBRTt3QkFDakIsZ0JBQWdCLEVBQUUsS0FBSzt3QkFDdkIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO3dCQUNyQixXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUU7d0JBQ3pCLHFDQUFxQzt3QkFDckMsY0FBYyxFQUFFLFlBQVksQ0FBQyxFQUFFO3dCQUMvQixpQkFBaUIsRUFBRSxlQUFlLENBQUMsRUFBRTt3QkFDckMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQzt3QkFDdEQscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQzt3QkFDNUQsc0VBQXNFO3dCQUV0RSwyQ0FBMkM7d0JBQzNDLHNFQUFzRTt3QkFDdEUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQzt3QkFDdEQsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQzt3QkFDMUQsc0NBQXNDO3dCQUN0Qyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLHlCQUF5QixDQUFDO3dCQUNwRSxvQkFBb0IsRUFBRSxpQkFBaUI7d0JBQ3ZDLG9CQUFvQixFQUFFLGFBQWE7cUJBQ3BDO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsT0FBTztnQkFDTCxXQUFXLEVBQUUscUJBQXFCLENBQUMsV0FBVztnQkFDOUMsYUFBYSxFQUFFLHFCQUFxQixDQUFDLGFBQWE7Z0JBQ2xELEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFO2FBQzdCLENBQUM7UUFDSixDQUFDO0tBQUE7SUFFSyxXQUFXLENBQ2YsYUFBcUIsRUFDckIsc0JBQThCLEVBQzlCLHlCQUFpQyxFQUNqQyxvQkFBNkI7O1lBRTdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDO1lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUM7WUFFbkQsNENBQTRDO1lBQzVDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQ3ZFLE9BQU8sQ0FBQyxHQUFHLEVBQ1gsc0JBQXNCLENBQ3ZCLENBQTJDLENBQUM7WUFFN0Msb0dBQW9HO1lBQ3BHLE1BQU0sOEJBQThCLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQ3JFLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsRUFDbEQsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxFQUN2RCx5QkFBeUIsQ0FDMUIsQ0FBQztZQUVGLDRFQUE0RTtZQUM1RSxJQUNFLDJCQUEyQixDQUFDLEtBQUssS0FBSyw4QkFBOEIsQ0FBQyxLQUFLLEVBQzFFO2dCQUNBLE1BQU0sSUFBSSx1QkFBdUIsQ0FDL0IsdUZBQXVGLENBQ3hGLENBQUM7YUFDSDtZQUVELDhEQUE4RDtZQUM5RCxrRkFBa0Y7WUFDbEYsOEZBQThGO1lBRTlGLCtDQUErQztZQUMvQyx1RUFBdUU7WUFDdkUsaUNBQWlDO1lBRWpDLHFEQUFxRDtZQUNyRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztZQUN0RCxNQUFNLGVBQWUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQ3JDLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQ2hELENBQUM7WUFDRixNQUFNLFlBQVksR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQ2xDLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQzdDLENBQUM7WUFFRixNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FDMUQsZUFBZSxDQUFDLEdBQUcsRUFDbkIsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUN0QixDQUFDO1lBQ0YsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQzdELGVBQWUsQ0FBQyxHQUFHLEVBQ25CLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FDekIsQ0FBQztZQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RSxNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FDN0QsT0FBTyxDQUFDLEdBQUcsRUFDWCxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUN2QixDQUFDO1lBRUYsTUFBTSxXQUFXLEdBQUcsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUNqQyw4QkFBOEIsQ0FBQyxXQUFXLENBQzNDLENBQUM7WUFDRixNQUFNLG9CQUFvQixHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FDL0QsU0FBUyxDQUFDLEdBQUcsRUFDYixXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUN6QixDQUFDO1lBRUYsSUFBSSwrQkFBK0IsQ0FBQztZQUNwQyxJQUFJLG9CQUFvQixFQUFFO2dCQUN4QixhQUFhO2dCQUNiLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFFdEQsK0JBQStCLEdBQUc7b0JBQ2hDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQ2hDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FDbEMsT0FBTyxDQUFDLEdBQUcsRUFDWCxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUN6QixDQUNGO29CQUNELHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxFQUFFO29CQUNqQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUNoQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQ2xDLFdBQVcsRUFDWCxvQkFBb0IsQ0FDckIsQ0FDRjtpQkFDRixDQUFDO2FBQ0g7WUFFRCx3REFBd0Q7WUFDeEQsSUFBSSwrQkFBK0IsQ0FBQztZQUNwQyxJQUFJLHFDQUFxQyxDQUFDO1lBQzFDLElBQUksMkJBQTJCLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ3BELE1BQU0sb0JBQW9CLEdBQ3hCLDJCQUEyQixDQUFDLG9CQUFvQixDQUFDO2dCQUNuRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sZUFBZSxHQUFHLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FDckMsOEJBQThCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQ3JFLENBQUM7Z0JBRUYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDcEMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN6RSxDQUFDO2dCQUNGLE1BQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFDLHdCQUF3QjtvQkFDbkUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ1osTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUNsQyxRQUFRLEVBQ1Isb0JBQW9CLENBQUMsd0JBQXdCLENBQzlDLENBQ0Y7b0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFFUCwrQkFBK0IsR0FBRztvQkFDaEMsZUFBZTtvQkFDZixrQkFBa0IsRUFBRSxPQUFPLENBQUMsRUFBRTtvQkFDOUIsZUFBZTtpQkFDaEIsQ0FBQztnQkFFRixxQ0FBcUMsR0FBRztvQkFDdEMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxFQUFFO2lCQUM3QixDQUFDO2dCQUVGLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUMzRCxlQUFlLEVBQ2Ysb0JBQW9CLENBQUMseUJBQXlCLENBQy9DLENBQUM7Z0JBQ0YscUNBQXFDLENBQUMsbUJBQW1CO29CQUN2RCxJQUFJLENBQUMsU0FBUyxDQUNaLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FDL0IsZUFBZSxDQUFDLEdBQUcsRUFDbkIsZ0JBQWdCLENBQ2pCLENBQ0YsQ0FBQzthQUNMO1lBRUQsc0dBQXNHO1lBQ3RHLG1DQUFtQztZQUVuQyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFNO2dCQUMxQyxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFO3dCQUNMLGFBQWE7d0JBQ2IsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO3dCQUNyQixXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUU7d0JBQ3pCLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxFQUFFO3dCQUNyQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDO3dCQUN0RCxxQkFBcUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDO3dCQUM1RCxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDO3dCQUN0RCxvQkFBb0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDO3dCQUMxRCwwQkFBMEIsRUFBRSwrQkFBK0I7d0JBQzNELDBCQUEwQixFQUFFLCtCQUErQjt3QkFDM0QsZ0NBQWdDLEVBQzlCLHFDQUFxQztxQkFDeEM7aUJBQ0Y7YUFDRixDQUFDLENBQUM7WUFDSCxPQUFPLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztRQUNwQyxDQUFDO0tBQUE7SUFFWSxvQkFBb0IsQ0FBQyxLQUdqQzs7WUFDQyxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFNO2dCQUM5RCxLQUFLLEVBQUUseUJBQXlCO2dCQUNoQyxTQUFTLEVBQUU7b0JBQ1QsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO29CQUN4QixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07aUJBQ3JCO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxvQkFBb0IsQ0FBQyxhQUFhLENBQUM7UUFDNUMsQ0FBQztLQUFBOzs7O1lBanJCRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQWhDNkIsR0FBRztZQUN4QixVQUFVO1lBUFYsZUFBZTtZQUd0QixpQkFBaUI7WUFGVixZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcbmltcG9ydCB7IExyQXBvbGxvU2VydmljZSB9IGZyb20gJy4uL2FwaS9sci1hcG9sbG8uc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoMlNlcnZpY2UgfSBmcm9tICcuLi9hdXRoMi9hdXRoMi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEVuY3J5cHRpb25TZXJ2aWNlLFxuICBKb3NlU2VyaWFsaXphdGlvbixcbn0gZnJvbSAnLi4vZW5jcnlwdGlvbi9lbmNyeXB0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5RmFjdG9yeVNlcnZpY2UgYXMgS0ZTIH0gZnJvbSAnLi4va2V5L2tleS1mYWN0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL2tleS9rZXkuc2VydmljZSc7XG5pbXBvcnQgeyBLZXlHcmFwaFJlc3BvbnNlIH0gZnJvbSAnLi4va2V5L2tleS50eXBlcyc7XG5pbXBvcnQgeyBLY0NvZGVNaXNtYXRjaEV4Y2VwdGlvbiB9IGZyb20gJy4uL19jb21tb24vZXhjZXB0aW9ucyc7XG5pbXBvcnQge1xuICBDb21wbGV0ZU90a011dGF0aW9uLFxuICBDdXJyZW50VXNlclNoYXJlZEtleVF1ZXJ5LFxuICBJbml0aWF0ZU90a011dGF0aW9uLFxuICBLZXlFeGNoYW5nZVF1ZXJ5LFxuICBLZXlFeGNoYW5nZXNRdWVyeSxcbiAgS2V5RXhjaGFuZ2VUb2tlblF1ZXJ5LFxuICBSZXNwb25kT3RrTXV0YXRpb24sXG59IGZyb20gJy4va2V5LWV4Y2hhbmdlLmdxbCc7XG5pbXBvcnQge1xuICBDb21wbGV0ZU90ayxcbiAgRGVjcnlwdGVkS2V5RXhjaGFuZ2UsXG4gIERlY3J5cHRlZE90ayxcbiAgR2V0S2V5RXhjaGFuZ2VMaXN0T3B0aW9ucyxcbiAgR2V0S2V5RXhjaGFuZ2VPcHRpb25zLFxuICBJbml0aWF0ZU90a0lucHV0LFxuICBLZXlFeGNoYW5nZSxcbiAgT3RrU3RhdGUsXG4gIFBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlcixcbiAgUGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyLFxuICBQbGFpbk90S2V5Q2lwaGVyLFxuICBSZXNwb25kT3RrLFxuICBSZXNwb25kT3RrSW5wdXQsXG4gIFVzZXJTaGFyZWRLZXksXG59IGZyb20gJy4va2V5LWV4Y2hhbmdlLnR5cGVzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEtleUV4Y2hhbmdlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0xJRU5UX05PTkNFX0xFTkdUSCA9IDMyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUga2V5RmFjdG9yeTogS0ZTLFxuICAgIHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcbiAgICBwcml2YXRlIGxyQXBvbGxvOiBMckFwb2xsb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbmNyeXB0aW9uU2VydmljZTogRW5jcnlwdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoMlNlcnZpY2U6IEF1dGgyU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIGFzeW5jIGdldEtleUV4Y2hhbmdlTGlzdChcbiAgICBpbnB1dDogR2V0S2V5RXhjaGFuZ2VMaXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgeyBrZXlFeGNoYW5nZXMgfSA9IGF3YWl0IHRoaXMubHJBcG9sbG8ucXVlcnk8e1xuICAgICAga2V5RXhjaGFuZ2VzOiBhbnk7XG4gICAgICBrZXlHcmFwaDogS2V5R3JhcGhSZXNwb25zZTtcbiAgICB9Pih7XG4gICAgICBxdWVyeTogS2V5RXhjaGFuZ2VzUXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgLi4uaW5wdXQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBrZXlFeGNoYW5nZXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGlkIElmIHRoZSBjdXJyZW50IHVzZXIgY2FuIHJlc3BvbmRlciB0aGUga2V5IGV4Y2hhbmdlIGlmIHRoZXkgYXJlIGVpdGhlciB0aGUgaW5pdGlhdG9yIG9yIHRoZSByZWNlaXZlci5cbiAgICogQHBhcmFtIHRva2VuIElmIG5vdCBzaWduZWQgaW4sIG9yIG5vdCB0aGUgaW5pdGlhdG9yIG9yIHJlc3BvbmRlciwgJ3Rva2VuJyBtdXN0IGJlIGdpdmVuLlxuICAgKiBAcGFyYW0gb3RLZXlLIElzIHRoZSByYXcgb25lLXRpbWUga2V5IChzdHJpbmcpLiBJZiB0aGUgcmVzcG9uZGVyIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGF0IHRpbWUgb2YgaW5pdGlhdGlvbiwgdGhlblxuICAgKiAgIGl0J3MgcG9zc2libGUgdG8gaGF2ZSB0aGUgb3RLZXkgd3JhcHBlZCBieSB0aGUgcHVibGljIGtleSBvZiB0aGUgcmVzcG9uZGVyLiBJbiB3aGljaCBjYXNlLCB0aGUgb3RLZXlLIGlzIG5vdCBuZWVkZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0S2V5RXhjaGFuZ2UoXG4gICAgaWQ6IHN0cmluZyxcbiAgICB7IG90S2V5SywgdG9rZW4gfTogR2V0S2V5RXhjaGFuZ2VPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxEZWNyeXB0ZWRLZXlFeGNoYW5nZT4ge1xuICAgIGNvbnN0IHsga2V5RXhjaGFuZ2UgfSA9IGF3YWl0IHRoaXMubHJBcG9sbG8ucXVlcnk8e1xuICAgICAga2V5RXhjaGFuZ2U6IEtleUV4Y2hhbmdlO1xuICAgICAga2V5R3JhcGg6IEtleUdyYXBoUmVzcG9uc2U7XG4gICAgfT4oe1xuICAgICAgcXVlcnk6IHRva2VuID8gS2V5RXhjaGFuZ2VUb2tlblF1ZXJ5IDogS2V5RXhjaGFuZ2VRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpZCxcbiAgICAgICAgdG9rZW4sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmRlY3J5cHRLZXlFeGNoYW5nZShrZXlFeGNoYW5nZSwgb3RLZXlLKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVjcnlwdFJlc3BvbnNlQ2lwaGVyKFxuICAgIG90S2V5OiBKV0suS2V5LFxuICAgIG90UHJrOiBKV0suS2V5LFxuICAgIGNvbnRlbnQ6IGFueVxuICApOiBQcm9taXNlPFBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlcj4ge1xuICAgIC8vIFRoZSByZXNwb25zZSBjb3VsZCBiZSB3cmFwcGVkIGJ5IHRoZSBPdEsgYXMgd2VsbCBhcyB3ZSB0aGUgT3RQcmtcbiAgICB0cnkge1xuICAgICAgY29udGVudCA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChvdEtleSwgY29udGVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlICE9PSAnbm8ga2V5IGZvdW5kJykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIERvIG5vdGhpbmcgdG8gc3VwcG9ydCBvbGRlciB2ZXJzaW9ucyB3aGVyZSBtZXNzYWdlIGlzIG5vdCB3cmFwcGVkIHdpdGggb3RrLlxuICAgIH1cblxuICAgIC8vIFRoZSBQcmsgaXMgc2luZ2xlLXVzZSBhbmQgb25seSB1c2VkIHRvIHNlbmQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVzcG9uZGVyIGJhY2sgdG8gdGhlIGluaXRpYXRvci5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KG90UHJrLCBjb250ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWNyeXB0S2V5RXhjaGFuZ2UoXG4gICAga2V5RXhjaGFuZ2U6IEtleUV4Y2hhbmdlLFxuICAgIG90S2V5Sz86IHN0cmluZ1xuICApOiBQcm9taXNlPERlY3J5cHRlZEtleUV4Y2hhbmdlPiB7XG4gICAgaWYgKGtleUV4Y2hhbmdlLmlzSW5pdGlhdG9yKSB7XG4gICAgICBjb25zdCByb290S2V5ID0gdGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRSb290S2V5O1xuICAgICAgLy8gRGVjcnlwdCB1c2luZyB0aGUgcm9vdCBrZXkgdG8gZ2V0IHRoZSBQcmtcbiAgICAgIGNvbnN0IHBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlciA9IChhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXG4gICAgICAgIHJvb3RLZXkuandrLFxuICAgICAgICBrZXlFeGNoYW5nZS5pbml0aWF0b3JSb290S2V5Q2lwaGVyXG4gICAgICApKSBhcyB1bmtub3duIGFzIFBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlcjtcblxuICAgICAgY29uc3QgcGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyID0ga2V5RXhjaGFuZ2Uub3RrXG4gICAgICAgIC5pbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyXG4gICAgICAgID8gYXdhaXQgdGhpcy5kZWNyeXB0UmVzcG9uc2VDaXBoZXIoXG4gICAgICAgICAgICBhd2FpdCBLRlMuYXNLZXkocGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyLm90S2V5KSxcbiAgICAgICAgICAgIGF3YWl0IEtGUy5hc0tleShwbGFpbkluaXRpYXRvclJvb3RLZXlDaXBoZXIub25lVGltZVByayksXG4gICAgICAgICAgICBrZXlFeGNoYW5nZS5vdGsuaW5pdGlhdG9yT25lVGltZVBia0NpcGhlclxuICAgICAgICAgIClcbiAgICAgICAgOiBudWxsO1xuXG4gICAgICBjb25zdCByZXNwb25kZXIgPVxuICAgICAgICBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIgJiZcbiAgICAgICAgcGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyLnJlc3BvbmRlcjtcbiAgICAgIGNvbnN0IGluaXRpYXRvciA9XG4gICAgICAgIHBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlciAmJiBwbGFpbkluaXRpYXRvclJvb3RLZXlDaXBoZXIuaW5pdGlhdG9yO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5rZXlFeGNoYW5nZSxcbiAgICAgICAgbWVzc2FnZTogcmVzcG9uZGVyID8gcmVzcG9uZGVyLm1lc3NhZ2UgOiBudWxsLFxuICAgICAgICBjb250YWN0Q2FyZDpcbiAgICAgICAgICByZXNwb25kZXIgJiYgcmVzcG9uZGVyLmNvbnRhY3RDYXJkXG4gICAgICAgICAgICA/IHJlc3BvbmRlci5jb250YWN0Q2FyZC5wbGFpblNoYXJlZENpcGhlckRhdGFKc29uXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIG15Q29udGFjdENhcmQ6XG4gICAgICAgICAgaW5pdGlhdG9yICYmIGluaXRpYXRvci5jb250YWN0Q2FyZFxuICAgICAgICAgICAgPyBpbml0aWF0b3IuY29udGFjdENhcmQucGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvblxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICBteU1lc3NhZ2U6IGluaXRpYXRvciAmJiBpbml0aWF0b3IubWVzc2FnZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZE90ayA9IGF3YWl0IHRoaXMuZGVjcnlwdE90ayhrZXlFeGNoYW5nZSwgb3RLZXlLKTtcblxuICAgICAgY29uc3QgaW5pdGlhdG9yID0gZGVjcnlwdGVkT3RrICYmIGRlY3J5cHRlZE90ay5wbGFpbk90S2V5Q2lwaGVyLmluaXRpYXRvcjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ua2V5RXhjaGFuZ2UsXG4gICAgICAgIGRlY3J5cHRlZE90ayxcbiAgICAgICAgbWVzc2FnZTogaW5pdGlhdG9yICYmIGluaXRpYXRvci5tZXNzYWdlLFxuICAgICAgICBjb250YWN0Q2FyZDpcbiAgICAgICAgICBpbml0aWF0b3IgJiZcbiAgICAgICAgICBpbml0aWF0b3IuY29udGFjdENhcmQgJiZcbiAgICAgICAgICBpbml0aWF0b3IuY29udGFjdENhcmQucGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvbixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWNyeXB0T3RrKFxuICAgIGtleUV4Y2hhbmdlOiBLZXlFeGNoYW5nZSxcbiAgICBvdEtleUs/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEZWNyeXB0ZWRPdGs+IHtcbiAgICBjb25zdCBvdEtleSA9IGF3YWl0IHRoaXMuZ2V0T3RLZXkoa2V5RXhjaGFuZ2UsIG90S2V5Syk7XG5cbiAgICByZXR1cm4gb3RLZXkgJiYga2V5RXhjaGFuZ2Uub3RrLm90S2V5Q2lwaGVyXG4gICAgICA/IHtcbiAgICAgICAgICBwbGFpbk90S2V5Q2lwaGVyOiBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXG4gICAgICAgICAgICBvdEtleSxcbiAgICAgICAgICAgIGtleUV4Y2hhbmdlLm90ay5vdEtleUNpcGhlclxuICAgICAgICAgICksXG4gICAgICAgICAgb3RLZXksXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3RLZXkoXG4gICAga2V5RXhjaGFuZ2U6IEtleUV4Y2hhbmdlLFxuICAgIG90S2V5Sz86IHN0cmluZ1xuICApOiBQcm9taXNlPEpXSy5LZXk+IHtcbiAgICBpZiAob3RLZXlLKSB7XG4gICAgICByZXR1cm4gYXdhaXQgS0ZTLmFzS2V5KHtcbiAgICAgICAgLi4uSlNPTi5wYXJzZShrZXlFeGNoYW5nZS5vdGsub3RLZXlQYXJhbXMpLFxuICAgICAgICBrOiBvdEtleUssXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAga2V5RXhjaGFuZ2Uub3RrLnN0YXRlID09PSBPdGtTdGF0ZS5PVEtfSU5JVElBVEVEICYmXG4gICAgICAha2V5RXhjaGFuZ2UuaXNJbml0aWF0b3IgJiZcbiAgICAgIGtleUV4Y2hhbmdlLm90ay5yZXNwb25kZXJQYmtDaXBoZXJcbiAgICApIHtcbiAgICAgIC8vIEFzc3VtaW5nIGV4aXN0aW5nIHVzZXIgZ2V0dGluZyBpbnZpdGVkIHdoZXJlIE9USyBpcyB3cmFwcGVkIGluIHJlc3BvbmRlcidzIHB1YmxpYyBrZXkuXG4gICAgICBjb25zdCBwcmsgPSB0aGlzLmtleVNlcnZpY2UuY3VycmVudFB4aztcbiAgICAgIGNvbnN0IGRlY3J5cHRlZENpcGhlcjogYW55ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KFxuICAgICAgICBwcmsuandrLFxuICAgICAgICBKU09OLnBhcnNlKGtleUV4Y2hhbmdlLm90ay5yZXNwb25kZXJQYmtDaXBoZXIpLFxuICAgICAgICB7XG4gICAgICAgICAgc2VyaWFsaXphdGlvbnM6IFtKb3NlU2VyaWFsaXphdGlvbi5DT01QQUNUXSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChkZWNyeXB0ZWRDaXBoZXIub3RLZXkpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEtGUy5hc0tleShkZWNyeXB0ZWRDaXBoZXIub3RLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYXRlT3RrKHtcbiAgICBtZXNzYWdlLFxuICAgIGVtYWlsLFxuICAgIGNvbnRhY3RDYXJkLFxuICAgIHVwZ3JhZGUsXG4gIH06IEluaXRpYXRlT3RrSW5wdXQpOiBQcm9taXNlPHsga2V5RXhjaGFuZ2U6IEtleUV4Y2hhbmdlOyBvdEtleUs6IHN0cmluZyB9PiB7XG4gICAgY29uc3Qgb3RLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG4gICAgY29uc3Qgbm9uY2UgPSB0aGlzLmtleUZhY3RvcnkucmFuZG9tU3RyaW5nKHRoaXMuQ0xJRU5UX05PTkNFX0xFTkdUSCk7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aDJTZXJ2aWNlLmdldFVzZXIoKTtcblxuICAgIC8vIE5ldyBQS0Mga2V5IGZvciBlbmNyeXB0aW9uLiBUaGlzIGtleSBpcyB1c2VkIG9ubHkgb25jZSB3aGVuIHRoZSByZXNwb25kZXIgc2VuZHNcbiAgICAvLyBiYWNrIHRoZWlyIHNpZ25pbmcgcHVibGljIGtleS5cbiAgICBjb25zdCBpbml0aWF0b3JPbmVUaW1lUHJrID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZVBrY0tleSgpO1xuXG4gICAgLy8gT3B0aW9uIDE6IE5ldyBQS0Mga2V5IGZvciBzaWduaW5nXG4gICAgLy8gY29uc3QgaW5pdGlhdG9yU2lnUHJrID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmNyZWF0ZVBrY1NpZ25LZXkoKTtcblxuICAgIC8vIE9wdGlvbiAyOiBVc2UgdGhlIHVzZXIncyBnbG9iYWwgc2lnbmluZyBrZXkuXG4gICAgLy8gVGhpcyBrZXkgaXMgdXNlZCB0byBwcm92ZSB0aGUgaW5pdGlhdG9yJ3MgaWRlbnRpdHkuXG4gICAgY29uc3QgaW5pdGlhdG9yUHJrID0gdGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRQeGs7XG4gICAgY29uc3QgaW5pdGlhdG9yU2lnUHJrID0gdGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRTaWdQeGs7XG5cbiAgICBsZXQgaW5pdGlhdG9yUGxhaW5EYXRhU2lnOiBzdHJpbmcgPSBudWxsO1xuXG4gICAgaWYgKGNvbnRhY3RDYXJkICYmIGNvbnRhY3RDYXJkLm93bmVyUGxhaW5EYXRhKSB7XG4gICAgICBpbml0aWF0b3JQbGFpbkRhdGFTaWcgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduKFxuICAgICAgICAgIGluaXRpYXRvclNpZ1Byay5qd2ssXG4gICAgICAgICAgY29udGFjdENhcmQub3duZXJQbGFpbkRhdGFcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWF0b3IgPSB7XG4gICAgICBtZXNzYWdlLFxuICAgICAgY29udGFjdENhcmQ6IGNvbnRhY3RDYXJkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvbjogY29udGFjdENhcmQucGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvbixcbiAgICAgICAgICB9XG4gICAgICAgIDogbnVsbCxcbiAgICB9O1xuXG4gICAgLy8gQ29udGVudCB0byBiZSBlbmNyeXB0ZWQgdXNpbmcgdGhlIE9USy5cbiAgICBjb25zdCBwbGFpbk90S2V5Q2lwaGVyOiBQbGFpbk90S2V5Q2lwaGVyID0ge1xuICAgICAgbm9uY2UsXG4gICAgICBpbml0aWF0b3I6IHtcbiAgICAgICAgLi4uaW5pdGlhdG9yLFxuICAgICAgICBvbmVUaW1lUGJrOiBpbml0aWF0b3JPbmVUaW1lUHJrLnRvSlNPTigpLCAvLyBvbmV0aW1lIHB1YmxpYyBlbmNyeXB0aW9uIGtleSByZXNwb25kZXIgdXNlIHRvIHNlbmQgZGF0YSBiYWNrIHRvIGluaXRpYXRvclxuICAgICAgICBwYms6IGluaXRpYXRvclByay5qd2sudG9KU09OKCksIC8vIHB1YmxpYyBlbmNyeXB0aW9uIGtleVxuICAgICAgICBzaWdQYms6IGluaXRpYXRvclNpZ1Byay5qd2sudG9KU09OKCksIC8vIHB1YmxpYyBzaWduaW5nIGtleVxuICAgICAgICBwcm9maWxlOiB7XG4gICAgICAgICAgdXNlcm5hbWU6IHVzZXIudXNlcm5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBvdEtleUNpcGhlciA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIG90S2V5LFxuICAgICAgcGxhaW5PdEtleUNpcGhlclxuICAgICk7XG5cbiAgICAvLyBDb250ZW50IHRvIGJlIGVuY3J5cHRlZCB1c2luZyB0aGUgaW5pdGlhdG9yJ3Mgcm9vdCBrZXkuXG4gICAgY29uc3QgcGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyOiBQbGFpbkluaXRpYXRvclJvb3RLZXlDaXBoZXIgPSB7XG4gICAgICBub25jZSxcbiAgICAgIG9uZVRpbWVQcms6IGluaXRpYXRvck9uZVRpbWVQcmsudG9KU09OKHRydWUpLFxuICAgICAgLy8gU2hvdWxkIG5vdCBuZWVkIHRvIGtlZXAgdGhpcyBlbmNyeXB0ZWQgc2luY2Ugd2UgYXJlIHVzaW5nIHRoZSBnbG9iYWwgc2lnbmluZyBrZXkuXG4gICAgICAvLyBzaWdQcms6IGluaXRpYXRvclNpZ1Byay50b0pTT04odHJ1ZSksXG5cbiAgICAgIC8vIFNhdmUgaXQgaW4gY2FzZSB0aGUgaW5pdGlhdG9yIHdhbnQgdG8gZGVjb2RlIHRoZSBvdEtleUNpcGhlci5cbiAgICAgIC8vIFNpbmNlIHRoZSBvdEtleSBpcyBvbmx5IHVzZWQgb25jZSwgYW5kIHRoYXQgb3RLZXlDaXBoZXIgY29udGFpbnMgb25seVxuICAgICAgLy8gdGhlIHB1YmxpYyBrZXkgb2YgdGhlIGluaXRpYXRvciwgaXQncyBzYWZlIGp1c3QgbGVhdmUgdGhlIG90S2V5IHN0b3JlZCBoZXJlLlxuICAgICAgb3RLZXk6IG90S2V5LnRvSlNPTih0cnVlKSxcbiAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBzdG9yaW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgaG93IHRoZSBmaWVsZHMgb2YgdGhlIHNoYXJlZCBjb250YWN0IGNhcmQgaXNcbiAgICAgIC8vIGRlcml2ZWQgZnJvbSB0aGUgbWFzdGVyIGNvbnRhY3QgY2FyZC5cbiAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkOiBjb250YWN0Q2FyZCxcbiAgICAgIGluaXRpYXRvcixcbiAgICB9O1xuXG4gICAgY29uc3Qgcm9vdEtleSA9IHRoaXMua2V5U2VydmljZS5jdXJyZW50Um9vdEtleTtcbiAgICBjb25zdCBpbml0aWF0b3JSb290S2V5Q2lwaGVyID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgcm9vdEtleS5qd2ssXG4gICAgICBwbGFpbkluaXRpYXRvclJvb3RLZXlDaXBoZXJcbiAgICApO1xuXG4gICAgLy8gVGhlIHJhdyBPVEtcbiAgICBjb25zdCBvdEtleUs6IHN0cmluZyA9IChvdEtleS50b0pTT04odHJ1ZSkgYXMgYW55KS5rO1xuXG4gICAgLy8gQVBJIGNhbGxcbiAgICBjb25zdCB7IGluaXRpYXRlS2V5RXhjaGFuZ2VPdGsgfSA9IGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlPGFueT4oe1xuICAgICAgbXV0YXRpb246IEluaXRpYXRlT3RrTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAvLyBUaGVzZSB3aWxsIGJlIHN0b3JlZCBvbiB0aGUgc2VydmVyXG4gICAgICAgICAgaW5pdGlhdG9yUm9vdEtleUNpcGhlcjogSlNPTi5zdHJpbmdpZnkoaW5pdGlhdG9yUm9vdEtleUNpcGhlciksXG4gICAgICAgICAgaW5pdGlhdG9yUHhrSWQ6IGluaXRpYXRvclByay5pZCxcbiAgICAgICAgICBpbml0aWF0b3JTaWdQeGtJZDogaW5pdGlhdG9yU2lnUHJrLmlkLFxuICAgICAgICAgIC8vIFRoZXNlIHdpbGwgYmUgc2VudCB0byB0aGUgcmVzcG9uZGVyXG4gICAgICAgICAgb3RLZXlQYXJhbXM6IEpTT04uc3RyaW5naWZ5KG90S2V5LnRvSlNPTigpKSxcbiAgICAgICAgICBvdEtleUNpcGhlcjogSlNPTi5zdHJpbmdpZnkob3RLZXlDaXBoZXIpLFxuICAgICAgICAgIHNlbmRFbWFpbDogZW1haWxcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgICAgIHJhd090S2V5OiBvdEtleUssXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBjcmVhdGVUcDogdHJ1ZSxcbiAgICAgICAgICBpbml0aWF0b3JQbGFpbkRhdGFTaWcsXG4gICAgICAgICAgdXBncmFkZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsga2V5RXhjaGFuZ2U6IGluaXRpYXRlS2V5RXhjaGFuZ2VPdGsua2V5RXhjaGFuZ2UsIG90S2V5SyB9O1xuICB9XG5cbiAgYXN5bmMgcmVzcG9uZE90ayh7XG4gICAgaWQsXG4gICAgdG9rZW4sXG4gICAgZGVjcnlwdGVkT3RrLFxuICAgIG1lc3NhZ2UsXG4gICAgaW5pdGlhdG9yQ29udGFjdENhcmQsXG4gICAgcmVzcG9uZGVyQ29udGFjdENhcmQ6IHNlbnRDb250YWN0Q2FyZCxcbiAgfTogUmVzcG9uZE90a0lucHV0KTogUHJvbWlzZTxSZXNwb25kT3RrPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aDJTZXJ2aWNlLmdldFVzZXIoKTtcbiAgICBjb25zdCByb290S2V5ID0gdGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRSb290S2V5O1xuXG4gICAgY29uc3QgbWFzdGVyS2V5ID0gdGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRNYXN0ZXJLZXk7XG5cbiAgICBjb25zdCBzaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG4gICAgY29uc3QgbWtTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG5cbiAgICBjb25zdCBya1dyYXBwZWRTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICByb290S2V5Lmp3ayxcbiAgICAgIHNoYXJlZEtleS50b0pTT04odHJ1ZSlcbiAgICApO1xuICAgIGNvbnN0IG1rV3JhcHBlZE1rU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgbWFzdGVyS2V5Lmp3ayxcbiAgICAgIG1rU2hhcmVkS2V5LnRvSlNPTih0cnVlKVxuICAgICk7XG5cbiAgICBjb25zdCBpbml0aWF0b3JPbmVUaW1lUGJrID0gYXdhaXQgS0ZTLmFzS2V5KFxuICAgICAgZGVjcnlwdGVkT3RrLnBsYWluT3RLZXlDaXBoZXIuaW5pdGlhdG9yLm9uZVRpbWVQYmtcbiAgICApO1xuXG4gICAgY29uc3QgaW5pdGlhdG9yUGJrID0gYXdhaXQgS0ZTLmFzS2V5KFxuICAgICAgZGVjcnlwdGVkT3RrLnBsYWluT3RLZXlDaXBoZXIuaW5pdGlhdG9yLnBia1xuICAgICk7XG4gICAgY29uc3QgaW5pdGlhdG9yU2lnUGJrID0gYXdhaXQgS0ZTLmFzS2V5KFxuICAgICAgZGVjcnlwdGVkT3RrLnBsYWluT3RLZXlDaXBoZXIuaW5pdGlhdG9yLnNpZ1Bia1xuICAgICk7XG5cbiAgICAvLyBPcHRpb24gMTogVXNpbmcgbmV3IFByayBmb3IgZWFjaCBUUCBwYWlyXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHB1YmxpYyBzaWduaW5nIGtleSBmb3IgdGhlIHJlc3BvbmRlci5cbiAgICAvLyBjb25zdCByZXNwb25kZXJTaWdQcmsgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuY3JlYXRlUGtjU2lnbktleSgpXG4gICAgLy8gY29uc3QgcmtXcmFwcGVkUmVzcG9uZGVyU2lnUHJrID0gYXdhaXQgdGhpcy5lbmNyeXB0KHJvb3RLZXksIHJlc3BvbmRlclNpZ1Byay50b0pTT04odHJ1ZSkpO1xuXG4gICAgLy8gT3B0aW9uIDI6IFJlc3BvbmRlciBhbHJlYWR5IGhhcyBhIHNpZ25pbmcgUHJrXG4gICAgY29uc3QgcmVzcG9uZGVyUHJrID0gdGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRQeGs7XG4gICAgY29uc3QgcmVzcG9uZGVyU2lnUHJrID0gdGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRTaWdQeGs7XG5cbiAgICBjb25zdCBzaWduZWRJbml0aWF0b3JQYmsgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnNpZ24oXG4gICAgICByZXNwb25kZXJTaWdQcmsuandrLFxuICAgICAgaW5pdGlhdG9yUGJrLnRvSlNPTigpXG4gICAgKTtcbiAgICBjb25zdCBzaWduZWRJbml0aWF0b3JTaWdQYmsgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnNpZ24oXG4gICAgICByZXNwb25kZXJTaWdQcmsuandrLFxuICAgICAgaW5pdGlhdG9yU2lnUGJrLnRvSlNPTigpXG4gICAgKTtcblxuICAgIGNvbnN0IHBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlcjogUGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyID0ge1xuICAgICAgbm9uY2U6IGRlY3J5cHRlZE90ay5wbGFpbk90S2V5Q2lwaGVyLm5vbmNlLFxuICAgICAgc2hhcmVkS2V5OiBzaGFyZWRLZXkudG9KU09OKHRydWUpLFxuICAgICAgbWtTaGFyZWRLZXk6IG1rU2hhcmVkS2V5LnRvSlNPTih0cnVlKSxcbiAgICAgIHJlc3BvbmRlcjoge1xuICAgICAgICBwYms6IHJlc3BvbmRlclByay5qd2sudG9KU09OKCksIC8vIHB1YmxpYyBrZXlcbiAgICAgICAgc2lnUGJrOiByZXNwb25kZXJTaWdQcmsuandrLnRvSlNPTigpLCAvLyBwdWJsaWMga2V5XG4gICAgICAgIHByb2ZpbGU6IHtcbiAgICAgICAgICB1c2VybmFtZTogdXNlci51c2VybmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGxldCByZWNlaXZlZENhcmRJbnB1dDtcbiAgICBpZiAoZGVjcnlwdGVkT3RrLnBsYWluT3RLZXlDaXBoZXIuaW5pdGlhdG9yLmNvbnRhY3RDYXJkKSB7XG4gICAgICAvLyBTZXQgdGhlIGluZm8gYWJvdXQgdGhlIGluaXRpYXRvciB0byBiZSB0aGUgb25lcyBzZW50IGJ5IHRoZSBpbml0aWF0b3IuIFdlIG5lZWQgdGggcmVzcG9uZGVyIHRvIGRvIHRoZSBlbmNyeXB0aW9uIGhlcmVcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGluaXRpYXRvciBkb2VzIG5vdCBoYXZlIHRoZSBzaGFyZWQga2V5IHlldCwgYW5kIHdlIHdhbnQgdGhlIHJlc3BvbmRlciB0byBoYXZlIGEgZnVuY3Rpb25hbCBjb250YWN0IGNhcmQgYWZ0ZXJcbiAgICAgIC8vIHRoaXMgZXhjaGFuZ2UuIFRoZSBpbml0aWF0b3IgY2FuIGRvdWJsZSBjaGVjayB0aGUgY29udGFjdCBkZXRhaWxzIGFyZSBjb3JyZWN0IGFuZCBzaWduIGl0IHdoZW4gaXQgY29tcGxldGVzIHRoZSBleGNoYW5nZS5cbiAgICAgIGNvbnN0IHBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb24gPVxuICAgICAgICBkZWNyeXB0ZWRPdGsucGxhaW5PdEtleUNpcGhlci5pbml0aWF0b3IuY29udGFjdENhcmRcbiAgICAgICAgICAucGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvbjtcblxuICAgICAgLy8gQ3JlYXRlIGtleXNcbiAgICAgIGNvbnN0IHJlY2VpdmVyS2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuICAgICAgY29uc3QgY2NTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG4gICAgICBjb25zdCBzaWdQeGsgPSB0aGlzLmtleVNlcnZpY2UuY3VycmVudFNpZ1B4aztcblxuICAgICAgcmVjZWl2ZWRDYXJkSW5wdXQgPSB7XG4gICAgICAgIHJlY2VpdmVyV3JhcHBlZEtleTogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICAgICAgcm9vdEtleS5qd2ssXG4gICAgICAgICAgICByZWNlaXZlcktleS50b0pTT04odHJ1ZSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHJlY2VpdmVyV3JhcHBpbmdLZXlJZDogcm9vdEtleS5pZCxcbiAgICAgICAgcmVjZWl2ZXJDaXBoZXJEYXRhOiBpbml0aWF0b3JDb250YWN0Q2FyZFxuICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgICAgICAgICAgICByZWNlaXZlcktleSxcbiAgICAgICAgICAgICAgICBpbml0aWF0b3JDb250YWN0Q2FyZC5wbGFpblJlY2VpdmVyQ2lwaGVyRGF0YUpzb25cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogJycsXG4gICAgICAgIHNoYXJlZFdyYXBwZWRLZXk6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgICAgICAgIHNoYXJlZEtleSxcbiAgICAgICAgICAgIGNjU2hhcmVkS2V5LnRvSlNPTih0cnVlKVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHNoYXJlZENpcGhlckRhdGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICAgIGNjU2hhcmVkS2V5LFxuICAgICAgICBwbGFpblNoYXJlZENpcGhlckRhdGFKc29uXG4gICAgICApO1xuICAgICAgcmVjZWl2ZWRDYXJkSW5wdXQuc2hhcmVkQ2lwaGVyRGF0YVNpZyA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnNpZ24oc2lnUHhrLmp3aywgc2hhcmVkQ2lwaGVyRGF0YSlcbiAgICAgICk7XG4gICAgICByZWNlaXZlZENhcmRJbnB1dC5zaWdQeGtJZCA9IHNpZ1B4ay5pZDtcblxuICAgICAgcGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyLnJlc3BvbmRlci5jb250YWN0Q2FyZCA9IHtcbiAgICAgICAgLi4ucGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyLnJlc3BvbmRlci5jb250YWN0Q2FyZCxcbiAgICAgICAgc2hhcmVkQ2lwaGVyS2V5OiBjY1NoYXJlZEtleS50b0pTT04odHJ1ZSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBzZW50Q2FyZElucHV0O1xuICAgIGlmIChzZW50Q29udGFjdENhcmQpIHtcbiAgICAgIC8vIENyZWF0ZSBrZXlzXG4gICAgICBjb25zdCBvd25lcktleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcbiAgICAgIGNvbnN0IGNjU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuICAgICAgY29uc3Qgc2lnUHhrID0gdGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRTaWdQeGs7XG5cbiAgICAgIHNlbnRDYXJkSW5wdXQgPSB7XG4gICAgICAgIG93bmVyV3JhcHBlZEtleTogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICAgICAgcm9vdEtleS5qd2ssXG4gICAgICAgICAgICBvd25lcktleS50b0pTT04odHJ1ZSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIG93bmVyV3JhcHBpbmdLZXlJZDogcm9vdEtleS5pZCxcbiAgICAgICAgb3duZXJDaXBoZXJEYXRhOiBzZW50Q29udGFjdENhcmQucGxhaW5Pd25lckNpcGhlckRhdGFKc29uXG4gICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICAgICAgICAgIG93bmVyS2V5LFxuICAgICAgICAgICAgICAgIHNlbnRDb250YWN0Q2FyZC5wbGFpbk93bmVyQ2lwaGVyRGF0YUpzb25cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogJycsXG5cbiAgICAgICAgc2hhcmVkV3JhcHBlZEtleTogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICAgICAgc2hhcmVkS2V5LFxuICAgICAgICAgICAgY2NTaGFyZWRLZXkudG9KU09OKHRydWUpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2hhcmVkQ2lwaGVyRGF0YSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgICAgY2NTaGFyZWRLZXksXG4gICAgICAgIHNlbnRDb250YWN0Q2FyZC5wbGFpblNoYXJlZENpcGhlckRhdGFKc29uXG4gICAgICApO1xuICAgICAgc2VudENhcmRJbnB1dC5zaGFyZWRDaXBoZXJEYXRhU2lnID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihzaWdQeGsuandrLCBzaGFyZWRDaXBoZXJEYXRhKVxuICAgICAgKTtcbiAgICAgIHNlbnRDYXJkSW5wdXQuc2lnUHhrSWQgPSBzaWdQeGsuaWQ7XG5cbiAgICAgIGlmIChzZW50Q29udGFjdENhcmQub3duZXJQbGFpbkRhdGEpIHtcbiAgICAgICAgc2VudENhcmRJbnB1dC5vd25lclBsYWluRGF0YVNpZyA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihcbiAgICAgICAgICAgIHJlc3BvbmRlclNpZ1Byay5qd2ssXG4gICAgICAgICAgICBzZW50Q29udGFjdENhcmQub3duZXJQbGFpbkRhdGFcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRhY3QgY2FyZCBpbmZvIHJlYWRhYmxlIGJ5IHRoZSBpbml0aWF0b3JcbiAgICAgIHBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlci5yZXNwb25kZXIuY29udGFjdENhcmQgPSB7XG4gICAgICAgIC4uLnBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlci5yZXNwb25kZXIuY29udGFjdENhcmQsXG4gICAgICAgIHBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb246IHNlbnRDb250YWN0Q2FyZC5wbGFpblNoYXJlZENpcGhlckRhdGFKc29uLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFbmNyeXB0IHdpdGggb25lLXRpbWUgcHVibGljIGtleVxuICAgIGxldCBpbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgaW5pdGlhdG9yT25lVGltZVBiayxcbiAgICAgIHBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlclxuICAgICk7XG5cbiAgICAvLyBFbmNyeXB0IHdpdGggdGhlIG90ayBhZ2FpbiB0byBrZWVwIHVzZSBvZiBhc3ltbWV0cmljIGtleXMgdG8gYSBtaW5pbXVtLlxuICAgIGluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICBkZWNyeXB0ZWRPdGsub3RLZXksXG4gICAgICBpbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyXG4gICAgKTtcblxuICAgIGNvbnN0IHsgcmVzcG9uZEtleUV4Y2hhbmdlT3RrIH0gPSBhd2FpdCB0aGlzLmxyQXBvbGxvLm11dGF0ZTxhbnk+KHtcbiAgICAgIG11dGF0aW9uOiBSZXNwb25kT3RrTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBrZXlFeGNoYW5nZUlkOiBpZCxcbiAgICAgICAgICBrZXlFeGNoYW5nZVRva2VuOiB0b2tlbixcbiAgICAgICAgICByb290S2V5SWQ6IHJvb3RLZXkuaWQsXG4gICAgICAgICAgbWFzdGVyS2V5SWQ6IG1hc3RlcktleS5pZCxcbiAgICAgICAgICAvLyBUaGVzZSB3aWxsIGJlIHN0b3JlZCBvbiB0aGUgc2VydmVyXG4gICAgICAgICAgcmVzcG9uZGVyUHhrSWQ6IHJlc3BvbmRlclByay5pZCxcbiAgICAgICAgICByZXNwb25kZXJTaWdQeGtJZDogcmVzcG9uZGVyU2lnUHJrLmlkLFxuICAgICAgICAgIHNpZ25lZEluaXRpYXRvclBiazogSlNPTi5zdHJpbmdpZnkoc2lnbmVkSW5pdGlhdG9yUGJrKSxcbiAgICAgICAgICBzaWduZWRJbml0aWF0b3JTaWdQYms6IEpTT04uc3RyaW5naWZ5KHNpZ25lZEluaXRpYXRvclNpZ1BiayksXG4gICAgICAgICAgLy8gcmtXcmFwcGVkSW5pdGlhdG9yU2lnUGJrOiBKU09OLnN0cmluZ2lmeShya1dyYXBwZWRJbml0aWF0b3JTaWdQYmspLFxuXG4gICAgICAgICAgLy8gT3B0aW9uIDE6IFVzaW5nIG5ldyBQcmsgZm9yIGVhY2ggVFAgcGFpclxuICAgICAgICAgIC8vIHJrV3JhcHBlZFJlc3BvbmRlclNpZ1ByazogSlNPTi5zdHJpbmdpZnkocmtXcmFwcGVkUmVzcG9uZGVyU2lnUHJrKSxcbiAgICAgICAgICBya1dyYXBwZWRTaGFyZWRLZXk6IEpTT04uc3RyaW5naWZ5KHJrV3JhcHBlZFNoYXJlZEtleSksXG4gICAgICAgICAgbWtXcmFwcGVkTWtTaGFyZWRLZXk6IEpTT04uc3RyaW5naWZ5KG1rV3JhcHBlZE1rU2hhcmVkS2V5KSxcbiAgICAgICAgICAvLyBUaGVzZSB3aWxsIGJlIHNlbnQgdG8gdGhlIGluaXRpYXRvclxuICAgICAgICAgIGluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXI6IEpTT04uc3RyaW5naWZ5KGluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIpLFxuICAgICAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkOiByZWNlaXZlZENhcmRJbnB1dCxcbiAgICAgICAgICByZXNwb25kZXJDb250YWN0Q2FyZDogc2VudENhcmRJbnB1dCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAga2V5RXhjaGFuZ2U6IHJlc3BvbmRLZXlFeGNoYW5nZU90ay5rZXlFeGNoYW5nZSxcbiAgICAgIHVzZXJTaGFyZWRLZXk6IHJlc3BvbmRLZXlFeGNoYW5nZU90ay51c2VyU2hhcmVkS2V5LFxuICAgICAgdHA6IHJlc3BvbmRLZXlFeGNoYW5nZU90ay50cCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY29tcGxldGVPdGsoXG4gICAga2V5RXhjaGFuZ2VJZDogc3RyaW5nLFxuICAgIGluaXRpYXRvclJvb3RLZXlDaXBoZXI6IHN0cmluZyxcbiAgICBpbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyOiBzdHJpbmcsXG4gICAgcmVzcG9uZGVyQ29udGFjdENhcmQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxDb21wbGV0ZU90az4ge1xuICAgIGNvbnN0IHJvb3RLZXkgPSB0aGlzLmtleVNlcnZpY2UuY3VycmVudFJvb3RLZXk7XG4gICAgY29uc3QgbWFzdGVyS2V5ID0gdGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRNYXN0ZXJLZXk7XG5cbiAgICAvLyBEZWNyeXB0IHVzaW5nIHRoZSByb290IGtleSB0byBnZXQgdGhlIFBya1xuICAgIGNvbnN0IHBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlciA9IChhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXG4gICAgICByb290S2V5Lmp3ayxcbiAgICAgIGluaXRpYXRvclJvb3RLZXlDaXBoZXJcbiAgICApKSBhcyB1bmtub3duIGFzIFBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlcjtcblxuICAgIC8vIFRoZSBQcmsgaXMgc2luZ2xlLXVzZSBhbmQgb25seSB1c2VkIHRvIHNlbmQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVzcG9uZGVyIGJhY2sgdG8gdGhlIGluaXRpYXRvci5cbiAgICBjb25zdCBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIgPSBhd2FpdCB0aGlzLmRlY3J5cHRSZXNwb25zZUNpcGhlcihcbiAgICAgIGF3YWl0IEtGUy5hc0tleShwbGFpbkluaXRpYXRvclJvb3RLZXlDaXBoZXIub3RLZXkpLFxuICAgICAgYXdhaXQgS0ZTLmFzS2V5KHBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlci5vbmVUaW1lUHJrKSxcbiAgICAgIGluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXJcbiAgICApO1xuXG4gICAgLy8gQ2hlY2sgdGhlIG5vbmNlIG1hdGNoIHRvIGVuc3VyZSB0aGUgcmVzcG9uZGVyIHdhcyB0aGUgb25lIGhvbGRpbmcgdGhlIE9US1xuICAgIGlmIChcbiAgICAgIHBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlci5ub25jZSAhPT0gcGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyLm5vbmNlXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgS2NDb2RlTWlzbWF0Y2hFeGNlcHRpb24oXG4gICAgICAgICdUaGUgbm9uY2UgcmV0dXJuZWQgYnkgcmVzcG9uZGVyIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIG9uZSBjcmVhdGVkIGJ5IHRoZSBpbml0aWF0b3IuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpb24gMTogQXNzdW1pbmcgdGhlIHNpZ25pbmcga2V5IGlzIHVuaXF1ZSBiZXR3ZWVuIHVzZXJzLlxuICAgIC8vIGNvbnN0IGluaXRpYXRvclNpZ1ByayA9IGF3YWl0IEtGUy5hc0tleShrZS5wbGFpbkluaXRpYXRvclJvb3RLZXlDaXBoZXIuc2lnUHJrKTtcbiAgICAvLyBjb25zdCBya1dyYXBwZWRJbml0aWF0b3JTaWdQcmsgPSBhd2FpdCB0aGlzLmVuY3J5cHQocm9vdEtleSwgaW5pdGlhdG9yU2lnUHJrLnRvSlNPTih0cnVlKSk7XG5cbiAgICAvLyBPcHRpb24gMjogVXNlIHRoZSB1c2VyJ3MgZ2xvYmFsIHNpZ25pbmcga2V5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB0aGUgaW5pdGlhdG9yU2lnUHJrIGlzIGFscmVhZHkgYSBwYXJ0IG9mIHRoZSBrZXkgZ3JhcGguXG4gICAgLy8gU28gdGhlcmUncyBub3RoaW5nIHRvIGRvIGhlcmUuXG5cbiAgICAvLyBQcm90ZWN0ZWQgdGhlIHNpZ25pbmcgcHVibGljIGtleSBvZiB0aGUgcmVzcG9uZGVyLlxuICAgIGNvbnN0IGluaXRpYXRvclNpZ1ByayA9IHRoaXMua2V5U2VydmljZS5jdXJyZW50U2lnUHhrO1xuICAgIGNvbnN0IHJlc3BvbmRlclNpZ1BiayA9IGF3YWl0IEtGUy5hc0tleShcbiAgICAgIHBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlci5yZXNwb25kZXIuc2lnUGJrXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25kZXJQYmsgPSBhd2FpdCBLRlMuYXNLZXkoXG4gICAgICBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIucmVzcG9uZGVyLnBia1xuICAgICk7XG5cbiAgICBjb25zdCBzaWduZWRSZXNwb25kZXJQYmsgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnNpZ24oXG4gICAgICBpbml0aWF0b3JTaWdQcmsuandrLFxuICAgICAgcmVzcG9uZGVyUGJrLnRvSlNPTigpXG4gICAgKTtcbiAgICBjb25zdCBzaWduZWRSZXNwb25kZXJTaWdQYmsgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnNpZ24oXG4gICAgICBpbml0aWF0b3JTaWdQcmsuandrLFxuICAgICAgcmVzcG9uZGVyU2lnUGJrLnRvSlNPTigpXG4gICAgKTtcblxuICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IEtGUy5hc0tleShwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIuc2hhcmVkS2V5KTtcbiAgICBjb25zdCBya1dyYXBwZWRTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICByb290S2V5Lmp3ayxcbiAgICAgIHNoYXJlZEtleS50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgY29uc3QgbWtTaGFyZWRLZXkgPSBhd2FpdCBLRlMuYXNLZXkoXG4gICAgICBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIubWtTaGFyZWRLZXlcbiAgICApO1xuICAgIGNvbnN0IG1rV3JhcHBlZE1rU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgbWFzdGVyS2V5Lmp3ayxcbiAgICAgIG1rU2hhcmVkS2V5LnRvSlNPTih0cnVlKVxuICAgICk7XG5cbiAgICBsZXQgcmVzcG9uZGVyQ29udGFjdENhcmRDaXBoZXJJbnB1dDtcbiAgICBpZiAocmVzcG9uZGVyQ29udGFjdENhcmQpIHtcbiAgICAgIC8vIENyZWF0ZSBrZXlcbiAgICAgIGNvbnN0IHJlY2VpdmVyS2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuXG4gICAgICByZXNwb25kZXJDb250YWN0Q2FyZENpcGhlcklucHV0ID0ge1xuICAgICAgICByZWNlaXZlcldyYXBwZWRLZXk6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgICAgICAgIHJvb3RLZXkuandrLFxuICAgICAgICAgICAgcmVjZWl2ZXJLZXkudG9KU09OKHRydWUpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICByZWNlaXZlcldyYXBwaW5nS2V5SWQ6IHJvb3RLZXkuaWQsXG4gICAgICAgIHJlY2VpdmVyQ2lwaGVyRGF0YTogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICAgICAgcmVjZWl2ZXJLZXksXG4gICAgICAgICAgICByZXNwb25kZXJDb250YWN0Q2FyZFxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkYXRhIG5lZWRlZCBmcm9tIHRoZSBpbml0aWF0b3IncyBjaXBoZXIgZGF0YS5cbiAgICBsZXQgaW5pdGlhdG9yQ29udGFjdENhcmRDaXBoZXJJbnB1dDtcbiAgICBsZXQgaW5pdGlhdG9yQ29udGFjdENhcmRTaGFyZWRDaXBoZXJJbnB1dDtcbiAgICBpZiAocGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyLmluaXRpYXRvckNvbnRhY3RDYXJkKSB7XG4gICAgICBjb25zdCBpbml0aWF0b3JDb250YWN0Q2FyZCA9XG4gICAgICAgIHBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlci5pbml0aWF0b3JDb250YWN0Q2FyZDtcbiAgICAgIGNvbnN0IG93bmVyS2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuICAgICAgY29uc3Qgc2hhcmVkQ2lwaGVyS2V5ID0gYXdhaXQgS0ZTLmFzS2V5KFxuICAgICAgICBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIucmVzcG9uZGVyLmNvbnRhY3RDYXJkLnNoYXJlZENpcGhlcktleVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgb3duZXJXcmFwcGVkS2V5ID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChyb290S2V5Lmp3aywgb3duZXJLZXkudG9KU09OKHRydWUpKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG93bmVyQ2lwaGVyRGF0YSA9IGluaXRpYXRvckNvbnRhY3RDYXJkLnBsYWluT3duZXJDaXBoZXJEYXRhSnNvblxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICAgICAgICBvd25lcktleSxcbiAgICAgICAgICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmQucGxhaW5Pd25lckNpcGhlckRhdGFKc29uXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6ICcnO1xuXG4gICAgICBpbml0aWF0b3JDb250YWN0Q2FyZENpcGhlcklucHV0ID0ge1xuICAgICAgICBvd25lcldyYXBwZWRLZXksXG4gICAgICAgIG93bmVyV3JhcHBpbmdLZXlJZDogcm9vdEtleS5pZCxcbiAgICAgICAgb3duZXJDaXBoZXJEYXRhLFxuICAgICAgfTtcblxuICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmRTaGFyZWRDaXBoZXJJbnB1dCA9IHtcbiAgICAgICAgc2lnUHhrSWQ6IGluaXRpYXRvclNpZ1Byay5pZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHNoYXJlZENpcGhlckRhdGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICAgIHNoYXJlZENpcGhlcktleSxcbiAgICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmQucGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvblxuICAgICAgKTtcbiAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkU2hhcmVkQ2lwaGVySW5wdXQuc2hhcmVkQ2lwaGVyRGF0YVNpZyA9XG4gICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihcbiAgICAgICAgICAgIGluaXRpYXRvclNpZ1Byay5qd2ssXG4gICAgICAgICAgICBzaGFyZWRDaXBoZXJEYXRhXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIFRPRE8gaWRlYWxseSB3ZSB1cGRhdGUgdGhlIHNoYXJlZCBkYXRhIGluIHRoZSBjb250YWN0IGNhcmQgc2VudCB0byB0aGUgcmVzcG9uZGVyIGFzIHdlbGwgc2luY2UgdGhhdFxuICAgIC8vIENDIHdhcyBjcmVhdGVkIGJ5IHRoZSByZXNwb25kZXIuXG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmxyQXBvbGxvLm11dGF0ZTxhbnk+KHtcbiAgICAgIG11dGF0aW9uOiBDb21wbGV0ZU90a011dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAga2V5RXhjaGFuZ2VJZCxcbiAgICAgICAgICByb290S2V5SWQ6IHJvb3RLZXkuaWQsXG4gICAgICAgICAgbWFzdGVyS2V5SWQ6IG1hc3RlcktleS5pZCxcbiAgICAgICAgICBpbml0aWF0b3JTaWdQeGtJZDogaW5pdGlhdG9yU2lnUHJrLmlkLFxuICAgICAgICAgIHNpZ25lZFJlc3BvbmRlclBiazogSlNPTi5zdHJpbmdpZnkoc2lnbmVkUmVzcG9uZGVyUGJrKSxcbiAgICAgICAgICBzaWduZWRSZXNwb25kZXJTaWdQYms6IEpTT04uc3RyaW5naWZ5KHNpZ25lZFJlc3BvbmRlclNpZ1BiayksXG4gICAgICAgICAgcmtXcmFwcGVkU2hhcmVkS2V5OiBKU09OLnN0cmluZ2lmeShya1dyYXBwZWRTaGFyZWRLZXkpLFxuICAgICAgICAgIG1rV3JhcHBlZE1rU2hhcmVkS2V5OiBKU09OLnN0cmluZ2lmeShta1dyYXBwZWRNa1NoYXJlZEtleSksXG4gICAgICAgICAgcmVzcG9uZGVyQ29udGFjdENhcmRDaXBoZXI6IHJlc3BvbmRlckNvbnRhY3RDYXJkQ2lwaGVySW5wdXQsXG4gICAgICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmRDaXBoZXI6IGluaXRpYXRvckNvbnRhY3RDYXJkQ2lwaGVySW5wdXQsXG4gICAgICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmRTaGFyZWRDaXBoZXI6XG4gICAgICAgICAgICBpbml0aWF0b3JDb250YWN0Q2FyZFNoYXJlZENpcGhlcklucHV0LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzLmNvbXBsZXRlS2V5RXhjaGFuZ2VPdGs7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3VycmVudFVzZXJTaGFyZWRLZXkoaW5wdXQ6IHtcbiAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICB1c2VySWQ/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFVzZXJTaGFyZWRLZXk+IHtcbiAgICBjb25zdCB7IGN1cnJlbnRVc2VyU2hhcmVkS2V5IH0gPSBhd2FpdCB0aGlzLmxyQXBvbGxvLnF1ZXJ5PGFueT4oe1xuICAgICAgcXVlcnk6IEN1cnJlbnRVc2VyU2hhcmVkS2V5UXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgdXNlcm5hbWU6IGlucHV0LnVzZXJuYW1lLFxuICAgICAgICB1c2VySWQ6IGlucHV0LnVzZXJJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGN1cnJlbnRVc2VyU2hhcmVkS2V5LnVzZXJTaGFyZWRLZXk7XG4gIH1cbn1cbiJdfQ==
@@ -1,7 +0,0 @@
1
- export var OtkState;
2
- (function (OtkState) {
3
- OtkState["OTK_INITIATED"] = "OTK_INITIATED";
4
- OtkState["OTK_ACCEPTED"] = "OTK_ACCEPTED";
5
- OtkState["OTK_COMPLETED"] = "OTK_COMPLETED";
6
- })(OtkState || (OtkState = {}));
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWV4Y2hhbmdlLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2tleS1leGNoYW5nZS9rZXktZXhjaGFuZ2UudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0ZBLE1BQU0sQ0FBTixJQUFZLFFBSVg7QUFKRCxXQUFZLFFBQVE7SUFDbEIsMkNBQStCLENBQUE7SUFDL0IseUNBQTZCLENBQUE7SUFDN0IsMkNBQStCLENBQUE7QUFDakMsQ0FBQyxFQUpXLFFBQVEsS0FBUixRQUFRLFFBSW5CIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlcyAqL1xuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcbmltcG9ydCB7IEpTT05PYmplY3QsIEtleUV4Y2hhbmdlTW9kZSwgS2V5RXhjaGFuZ2VTdGF0ZSB9IGZyb20gJy4uL2FwaS90eXBlcyc7XG5pbXBvcnQgeyBBY2Nlc3NMZXZlbCB9IGZyb20gJy4uL2NhdGVnb3J5L2NhdGVnb3J5LnR5cGVzJztcbmltcG9ydCB7IEtleSB9IGZyb20gJy4uL2tleS9rZXkudHlwZXMnO1xuaW1wb3J0IHsgQ29udGFjdENhcmROYW1lLCBUcnVzdGVkUGFydHlEZXRhaWxzIH0gZnJvbSAnLi4vcHJvZmlsZS9wcm9maWxlLnR5cGVzJztcblxuLy8gV2lsbCBiZSBlbmNyeXB0ZWQgdXNpbmcgdGhlIHJvb3Qga2V5IG9mIHRoZSBpbml0aWF0b3JcbmV4cG9ydCBpbnRlcmZhY2UgUGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyIHtcbiAgbm9uY2U6IHN0cmluZztcbiAgb25lVGltZVByazogb2JqZWN0OyAvLyBvbmV0aW1lIHB1YmxpYyBlbmNyeXB0aW9uIGtleSByZXNwb25kZXIgdXNlIHRvIHNlbmQgZGF0YSBiYWNrIHRvIGluaXRpYXRvclxuICBvdEtleTogb2JqZWN0O1xuICBpbml0aWF0b3JDb250YWN0Q2FyZD86IHtcbiAgICAvLyBPd25lciBvbmx5IGFjY2VzcyB0byB0aGlzIGRhdGFcbiAgICBwbGFpbk93bmVyQ2lwaGVyRGF0YUpzb246IEpTT05PYmplY3Q7XG4gICAgLy8gU2hhcmVkIHJlYWQgYWNjZXNzIGJldHdlZW4gb3duZXIgYW5kIHJlY2VpdmVyLiBPbmx5IHRoZSBvd25lciBoYXMgd3JpdGUgYWNjZXNzLlxuICAgIHBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb246IEpTT05PYmplY3Q7XG4gIH07XG4gIGluaXRpYXRvcjoge1xuICAgIG1lc3NhZ2U/OiBLZXlFeGNoYW5nZU1lc3NhZ2U7XG4gICAgY29udGFjdENhcmQ/OiB7XG4gICAgICAvLyBTaGFyZWQgcmVhZCBhY2Nlc3MgYmV0d2VlbiBvd25lciBhbmQgcmVjZWl2ZXIuIE9ubHkgdGhlIG93bmVyIGhhcyB3cml0ZSBhY2Nlc3MuXG4gICAgICBwbGFpblNoYXJlZENpcGhlckRhdGFKc29uOiBUcnVzdGVkUGFydHlEZXRhaWxzO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmVkQ29udGFjdENhcmRJbnB1dCB7XG4gIHBsYWluQ2lwaGVyRGF0YUpzb24/OiBKU09OT2JqZWN0O1xuICBwbGFpblNoYXJlZENpcGhlckRhdGFKc29uPzogSlNPTk9iamVjdDtcbiAgc2hhcmVkQ2lwaGVyS2V5Pzogb2JqZWN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXBhcmVkUGVybWlzc2lvbnMge1xuICBjYXRlZ29yaWVzPzogeyBjYXRlZ29yeUlkOiBzdHJpbmc7IGFjY2Vzc0xldmVsOiBBY2Nlc3NMZXZlbCB9W107XG4gIHJlY29yZHM/OiB7IHJlY29yZElkOiBzdHJpbmc7IGFjY2Vzc0xldmVsOiBBY2Nlc3NMZXZlbCB9W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5RXhjaGFuZ2VNZXNzYWdlIHtcbiAgbmFtZT86IHN0cmluZztcbiAgZW1haWw/OiBzdHJpbmc7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zPzogUHJlcGFyZWRQZXJtaXNzaW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFpbk90S2V5Q2lwaGVyIHtcbiAgbm9uY2U6IHN0cmluZztcbiAgaW5pdGlhdG9yOiB7XG4gICAgb25lVGltZVBiazogb2JqZWN0OyAvLyBvbmV0aW1lIHB1YmxpYyBlbmNyeXB0aW9uIGtleSByZXNwb25kZXIgdXNlIHRvIHNlbmQgZGF0YSBiYWNrIHRvIGluaXRpYXRvclxuICAgIHBiazogb2JqZWN0OyAvLyBwdWJsaWMgZW5jcnlwdGlvbiBrZXlcbiAgICBzaWdQYms6IG9iamVjdDsgLy8gcHVibGljIHNpZ25pbmcga2V5XG4gICAgcHJvZmlsZT86IHtcbiAgICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIH07XG4gICAgbWVzc2FnZT86IEtleUV4Y2hhbmdlTWVzc2FnZTtcbiAgICBjb250YWN0Q2FyZD86IHtcbiAgICAgIC8vIFNoYXJlZCByZWFkIGFjY2VzcyBiZXR3ZWVuIG93bmVyIGFuZCByZWNlaXZlci4gT25seSB0aGUgb3duZXIgaGFzIHdyaXRlIGFjY2Vzcy5cbiAgICAgIHBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb246IFRydXN0ZWRQYXJ0eURldGFpbHM7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWNyeXB0ZWRPdGsge1xuICBwbGFpbk90S2V5Q2lwaGVyOiBQbGFpbk90S2V5Q2lwaGVyO1xuICBvdEtleTogSldLLktleTsgLy8gVGhlIG9uZS10aW1lIGtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlciB7XG4gIG5vbmNlOiBzdHJpbmc7XG4gIHNoYXJlZEtleTogb2JqZWN0O1xuICBta1NoYXJlZEtleTogb2JqZWN0O1xuICByZXNwb25kZXI6IHtcbiAgICBwYms6IG9iamVjdDtcbiAgICBzaWdQYms6IG9iamVjdDtcbiAgICBwcm9maWxlPzoge1xuICAgICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBtZXNzYWdlPzogS2V5RXhjaGFuZ2VNZXNzYWdlO1xuICAgIGNvbnRhY3RDYXJkPzoge1xuICAgICAgcGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvbjogVHJ1c3RlZFBhcnR5RGV0YWlscztcbiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIF9ub3RfIHRoZSBzYW1lIGtleSBhcyB0aGUgc2hhcmVkS2V5LiBUaGUgc2hhcmVkS2V5IHdyYXBzXG4gICAgICAvLyB0aGlzIGtleSBpbiB0aGUga2V5IGdyYXBoLiBCdXQgYmVjYXVzZSB0aGlzIGtleSBoYXMgbm90IGJlZW4gZW50ZXJlZCBpbnRvXG4gICAgICAvLyB0aGUga2V5IGdyYXBoIHRoZW4gdGhlIHJlc3BvbmRlciBjYWxscyB0aGUgQVBJLCB3ZSBwYXNzIHRoZSBKV0sgZGlyZWN0bHkgaGVyZS5cbiAgICAgIHNoYXJlZENpcGhlcktleTogb2JqZWN0O1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBlbnVtIE90a1N0YXRlIHtcbiAgT1RLX0lOSVRJQVRFRCA9ICdPVEtfSU5JVElBVEVEJyxcbiAgT1RLX0FDQ0VQVEVEID0gJ09US19BQ0NFUFRFRCcsXG4gIE9US19DT01QTEVURUQgPSAnT1RLX0NPTVBMRVRFRCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5RXhjaGFuZ2VDb250YWN0Q2FyZElucHV0IHtcbiAgLy8gQWNjZXNzaWJsZSBieSB0aGUgc2VydmVyIGFuZCBpbml0aWF0b3IuIFNlcnZlciBzaWRlIG5vdGlmaWNhdGlvbiBlbWFpbHMgbmVlZCB0byBrbm93IHNvbWVcbiAgLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluaXRpYXRvci5cbiAgb3duZXJQbGFpbkRhdGE/OiB7XG4gICAgbmFtZTogQ29udGFjdENhcmROYW1lO1xuICB9O1xuICAvLyBPd25lciBvbmx5IGFjY2VzcyB0byB0aGlzIGRhdGFcbiAgcGxhaW5Pd25lckNpcGhlckRhdGFKc29uOiBKU09OT2JqZWN0O1xuICAvLyBTaGFyZWQgcmVhZCBhY2Nlc3MgYmV0d2VlbiBvd25lciBhbmQgcmVjZWl2ZXIuIE9ubHkgdGhlIG93bmVyIGhhcyB3cml0ZSBhY2Nlc3MuXG4gIHBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb246IFRydXN0ZWRQYXJ0eURldGFpbHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhdGVPdGtJbnB1dCB7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBtZXNzYWdlPzogS2V5RXhjaGFuZ2VNZXNzYWdlO1xuICBjb250YWN0Q2FyZD86IEtleUV4Y2hhbmdlQ29udGFjdENhcmRJbnB1dDtcbiAgdXBncmFkZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uZE90a0lucHV0IHtcbiAgaWQ6IHN0cmluZztcbiAgdG9rZW46IHN0cmluZztcbiAgZGVjcnlwdGVkT3RrOiBEZWNyeXB0ZWRPdGs7XG4gIG1lc3NhZ2U/OiBLZXlFeGNoYW5nZU1lc3NhZ2U7XG4gIGluaXRpYXRvckNvbnRhY3RDYXJkPzoge1xuICAgIHBsYWluUmVjZWl2ZXJDaXBoZXJEYXRhSnNvbjogSlNPTk9iamVjdDtcbiAgfTtcbiAgcmVzcG9uZGVyQ29udGFjdENhcmQ/OiBLZXlFeGNoYW5nZUNvbnRhY3RDYXJkSW5wdXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3RrIHtcbiAgaWQ6IHN0cmluZztcbiAgc3RhdGU6IE90a1N0YXRlO1xuICBvdEtleVBhcmFtczogc3RyaW5nO1xuICBvdEtleUNpcGhlcjogc3RyaW5nO1xuICBzaGFyZWRLZXk6IEtleTtcbiAgbWtTaGFyZWRLZXk6IEtleTtcbiAgaW5pdGlhdG9yU2lnUHhrOiBLZXk7XG4gIHJlc3BvbmRlclNpZ1B4azogS2V5O1xuICAvLyBFbmNyeXB0ZWRcbiAgaW5pdGlhdG9yT25lVGltZVBia0NpcGhlcjogc3RyaW5nOyAvLyBzaW5nbGUgdGltZSB1c2UgcHVibGljIGtleSBjcmVhdGVkIGJ5IHRoZSBpbml0aWF0b3IuXG4gIHJlc3BvbmRlclBia0NpcGhlcj86IHN0cmluZzsgLy8gcmVzcG9uZGVyUGJrIGlzIHRoZSBsb25nIGxpdmVkIFBiayBvZiB0aGUgcmVzcG9uZGVyLlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtleUV4Y2hhbmdlIHtcbiAgaWQ6IHN0cmluZztcbiAgc3RhdGU6IEtleUV4Y2hhbmdlU3RhdGU7XG4gIG1vZGU6IEtleUV4Y2hhbmdlTW9kZTtcbiAgY3JlYXRlZDogc3RyaW5nO1xuICBtb2RpZmllZDogc3RyaW5nO1xuICBpc0luaXRpYXRvcjogYm9vbGVhbjtcbiAgaW5pdGlhdG9yOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICB9O1xuICByZXNwb25kZXI6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gIH07XG4gIGluaXRpYXRvckFjdGlvblJlcXVpcmVkPzogYm9vbGVhbjtcbiAgcmVzcG9uZGVyQWN0aW9uUmVxdWlyZWQ/OiBib29sZWFuO1xuICByZXNwb25kZXJFbWFpbEFkZHJlc3M/OiBzdHJpbmc7XG4gIHRva2VuPzogc3RyaW5nO1xuICB0b2tlbkV4cGlyeVRpbWU/OiBzdHJpbmc7XG4gIGlzRXhwaXJlZD86IGJvb2xlYW47XG4gIG90az86IE90aztcbiAgaW5pdGlhdG9yUm9vdEtleUNpcGhlcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlY3J5cHRlZEtleUV4Y2hhbmdlIGV4dGVuZHMgS2V5RXhjaGFuZ2Uge1xuICBkZWNyeXB0ZWRPdGs/OiBEZWNyeXB0ZWRPdGs7XG4gIG1lc3NhZ2U/OiBLZXlFeGNoYW5nZU1lc3NhZ2U7XG4gIGNvbnRhY3RDYXJkPzogVHJ1c3RlZFBhcnR5RGV0YWlscztcbiAgbXlNZXNzYWdlPzogS2V5RXhjaGFuZ2VNZXNzYWdlO1xuICBteUNvbnRhY3RDYXJkPzogVHJ1c3RlZFBhcnR5RGV0YWlscztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRLZXlFeGNoYW5nZU9wdGlvbnMge1xuICAvLyBUaGUgb3RLZXkgYXMgYSByYXcgc3RyaW5nLiBpLmUuIGtleS50b0pTT04odHJ1ZSkua1xuICBvdEtleUs/OiBzdHJpbmc7XG4gIC8vIFVzZXIgbmVlZCB0aGUgdG9rZW4gaWYgdGhleSBoYXZlIG5vdCByZXNwb25kZWQgdG8gdGhlIGtleSBleGNoYW5nZSB5ZXQuXG4gIC8vIE9uY2UgdGhleSd2ZSByZXNwb25kZWQgKGhlbmNlIHByb3ZlbiB0aGV5IGhhdmUgdGhlIE9PQiBLZXkpIHRoZXkgYmVjb21lXG4gIC8vIHRoZSBcInJlc3BvbmRlclwiIG9mIHRoaXMgZXhjaGFuZ2UsIGFuZCBjYW4gYWNjZXNzIGl0IHdoZW4gc2lnbmVkIGluLlxuICB0b2tlbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNwb25kT3RrIHtcbiAga2V5RXhjaGFuZ2U6IEtleUV4Y2hhbmdlO1xuICB1c2VyU2hhcmVkS2V5OiBVc2VyU2hhcmVkS2V5O1xuICB0cDoge1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGVPdGsge1xuICBrZXlFeGNoYW5nZTogS2V5RXhjaGFuZ2U7XG4gIHVzZXJTaGFyZWRLZXk6IFVzZXJTaGFyZWRLZXk7XG4gIHRwOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyU2hhcmVkS2V5IHtcbiAgdXNlclNpZ1ByazogS2V5O1xuICBzaGFyZWRLZXk6IEtleTtcbiAgbWtTaGFyZWRLZXk/OiBLZXk7XG4gIG1rUHhrPzogS2V5O1xuICBta1Jlc2hhcmVSZXF1ZXN0Q2lwaGVyPzogc3RyaW5nO1xuICBta1Jlc2hhcmVSZXNwb25zZUNpcGhlcj86IHN0cmluZztcbiAgbWtSZXNoYXJlUmVxdWVzdFNlbnQ/OiBib29sZWFuO1xuICBta1Jlc2hhcmVSZXNwb25zZVNlbnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEtleUV4Y2hhbmdlTGlzdE9wdGlvbnMge1xuICBvcmRlckJ5PzpcbiAgICB8ICdjcmVhdGVkJ1xuICAgIHwgJy1jcmVhdGVkJ1xuICAgIHwgJ21vZGlmaWVkJ1xuICAgIHwgJy1tb2RpZmllZCdcbiAgICB8ICdleHBpcnlfdGltZSdcbiAgICB8ICctZXhwaXJ5X3RpbWUnO1xuICBpc0V4cGlyZWQ/OiBib29sZWFuO1xuICBpbml0aWF0b3JBY3Rpb25SZXF1aXJlZD86IGJvb2xlYW47XG4gIHJlc3BvbmRlckFjdGlvblJlcXVpcmVkPzogYm9vbGVhbjtcbiAgaW5pdGlhdG9yPzogc3RyaW5nO1xuICByZXNwb25kZXI/OiBzdHJpbmc7XG4gIHN0YXRlPzogJ0lOX1BST0dSRVNTJyB8ICdDT01QTEVURUQnIHwgJ0RFQ0xJTkVEJyB8ICdDQU5DRUxMRUQnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYWluUmVzcG9uZGVyUGJrQ2lwaGVyIHtcbiAgb3RLZXk6IG9iamVjdDtcbn1cbiJdfQ==
@@ -1,32 +0,0 @@
1
- import { gqlTyped } from '../_common/ast';
2
- export const SendMessageMutation = gqlTyped `
3
- mutation SendMessageMutation($input: SendMessageInput!) {
4
- sendMessage(input: $input) {
5
- message {
6
- id
7
- }
8
- }
9
- }
10
- `;
11
- export const MessageQuery = gqlTyped `
12
- query MessageQuery($id: LrRelayIdInput!) {
13
- message(id: $id) {
14
- id
15
- sender {
16
- username
17
- }
18
- receiver {
19
- username
20
- }
21
- plainMessage
22
- signedCipherMessage
23
- sharedKey {
24
- id
25
- }
26
- senderSigPbk {
27
- id
28
- }
29
- }
30
- }
31
- `;
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5ncWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvbWVzc2FnZS9tZXNzYWdlLmdxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFTMUMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUEyQjs7Ozs7Ozs7Q0FRckUsQ0FBQztBQUtGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQW9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW9CdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElELCBNZXNzYWdlTm9kZSB9IGZyb20gJy4uL2FwaS90eXBlcyc7XG5pbXBvcnQgeyBncWxUeXBlZCB9IGZyb20gJy4uL19jb21tb24vYXN0JztcblxuZXhwb3J0IGludGVyZmFjZSBTZW5kTWVzc2FnZU11dGF0aW9uUmVzdWx0IHtcbiAgc2VuZE1lc3NhZ2U6IHtcbiAgICBtZXNzYWdlOiB7XG4gICAgICBpZDogSUQ7XG4gICAgfTtcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBTZW5kTWVzc2FnZU11dGF0aW9uID0gZ3FsVHlwZWQ8U2VuZE1lc3NhZ2VNdXRhdGlvblJlc3VsdD5gXG5tdXRhdGlvbiBTZW5kTWVzc2FnZU11dGF0aW9uKCRpbnB1dDogU2VuZE1lc3NhZ2VJbnB1dCEpIHtcbiAgc2VuZE1lc3NhZ2UoaW5wdXQ6ICRpbnB1dCkge1xuICAgIG1lc3NhZ2Uge1xuICAgICAgaWRcbiAgICB9XG4gIH1cbn1cbmA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZVF1ZXJ5UmVzdWx0IHtcbiAgbWVzc2FnZTogTWVzc2FnZU5vZGU7XG59XG5leHBvcnQgY29uc3QgTWVzc2FnZVF1ZXJ5ID0gZ3FsVHlwZWQ8TWVzc2FnZVF1ZXJ5UmVzdWx0PmBcbnF1ZXJ5IE1lc3NhZ2VRdWVyeSgkaWQ6IExyUmVsYXlJZElucHV0ISkge1xuICBtZXNzYWdlKGlkOiAkaWQpIHtcbiAgICBpZFxuICAgIHNlbmRlciB7XG4gICAgICB1c2VybmFtZVxuICAgIH1cbiAgICByZWNlaXZlciB7XG4gICAgICB1c2VybmFtZVxuICAgIH1cbiAgICBwbGFpbk1lc3NhZ2VcbiAgICBzaWduZWRDaXBoZXJNZXNzYWdlXG4gICAgc2hhcmVkS2V5IHtcbiAgICAgIGlkXG4gICAgfVxuICAgIHNlbmRlclNpZ1BiayB7XG4gICAgICBpZFxuICAgIH1cbiAgfVxufVxuYDtcbiJdfQ==