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