@lifeready/core 9.0.8 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/lifeready-core.mjs +10522 -0
- package/fesm2022/lifeready-core.mjs.map +1 -0
- package/package.json +21 -16
- package/types/lifeready-core.d.ts +5329 -0
- package/bundles/lifeready-core.umd.js +0 -13231
- package/bundles/lifeready-core.umd.js.map +0 -1
- package/bundles/lifeready-core.umd.min.js +0 -2
- package/bundles/lifeready-core.umd.min.js.map +0 -1
- package/esm2015/lib/_common/ast.js +0 -41
- package/esm2015/lib/_common/deferred-promise.js +0 -24
- package/esm2015/lib/_common/exceptions.js +0 -186
- package/esm2015/lib/_common/index.js +0 -3
- package/esm2015/lib/_common/kc-lodash.js +0 -11
- package/esm2015/lib/_common/key.js +0 -28
- package/esm2015/lib/_common/queries.gql.js +0 -43
- package/esm2015/lib/_common/run-outside-angular.js +0 -80
- package/esm2015/lib/_common/storage.js +0 -28
- package/esm2015/lib/_common/types.js +0 -2
- package/esm2015/lib/_common/utils.js +0 -73
- package/esm2015/lib/api/lr-apollo.service.js +0 -47
- package/esm2015/lib/api/lr-graphql/index.js +0 -6
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +0 -170
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +0 -216
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +0 -51
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +0 -91
- package/esm2015/lib/api/lr-graphql/lr.service.js +0 -18
- package/esm2015/lib/api/query-processor/common-processors.service.js +0 -94
- package/esm2015/lib/api/query-processor/index.js +0 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +0 -307
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +0 -110
- package/esm2015/lib/api/types/graphql.types.js +0 -8
- package/esm2015/lib/api/types/index.js +0 -3
- package/esm2015/lib/api/types/lr-graphql.types.js +0 -182
- package/esm2015/lib/auth/auth.config.js +0 -57
- package/esm2015/lib/auth/auth.gql.private.js +0 -85
- package/esm2015/lib/auth/auth.service.js +0 -616
- package/esm2015/lib/auth/auth.types.js +0 -19
- package/esm2015/lib/contact-card/contact-card.gql.js +0 -79
- package/esm2015/lib/contact-card/contact-card.service.js +0 -156
- package/esm2015/lib/contact-card/contact-card2.gql.js +0 -29
- package/esm2015/lib/contact-card/contact-card2.service.js +0 -103
- package/esm2015/lib/encryption/encryption.service.js +0 -188
- package/esm2015/lib/file-upload/file-upload.service.js +0 -70
- package/esm2015/lib/file-upload/file-upload.types.js +0 -2
- package/esm2015/lib/idle/idle.service.js +0 -159
- package/esm2015/lib/idle/idle.types.js +0 -7
- package/esm2015/lib/item/item.gql.js +0 -166
- package/esm2015/lib/item/item.gql.private.js +0 -41
- package/esm2015/lib/item/item.service.js +0 -662
- package/esm2015/lib/item/item.types.js +0 -2
- package/esm2015/lib/key/key-factory.service.js +0 -226
- package/esm2015/lib/key/key-graph.service.js +0 -314
- package/esm2015/lib/key/key-meta.service.js +0 -153
- package/esm2015/lib/key/key.service.js +0 -124
- package/esm2015/lib/key/key.types.js +0 -16
- package/esm2015/lib/key-exchange/key-exchange.gql.js +0 -174
- package/esm2015/lib/key-exchange/key-exchange.service.js +0 -496
- package/esm2015/lib/lbop/lbop.service.js +0 -351
- package/esm2015/lib/life-ready.config.js +0 -96
- package/esm2015/lib/life-ready.module.js +0 -42
- package/esm2015/lib/lock/lock.gql.js +0 -40
- package/esm2015/lib/lock/lock.service.js +0 -64
- package/esm2015/lib/notification/notification.gql.js +0 -43
- package/esm2015/lib/notification/notification.service.js +0 -118
- package/esm2015/lib/password/password.gql.js +0 -28
- package/esm2015/lib/password/password.service.js +0 -309
- package/esm2015/lib/persist/persist.service.js +0 -181
- package/esm2015/lib/plan/plan.gql.js +0 -91
- package/esm2015/lib/plan/plan.service.js +0 -191
- package/esm2015/lib/plan/plan.types.js +0 -2
- package/esm2015/lib/profile/profile-details.service.js +0 -261
- package/esm2015/lib/profile/profile.gql.js +0 -170
- package/esm2015/lib/profile/profile.service.js +0 -166
- package/esm2015/lib/profile/profile.types.js +0 -45
- package/esm2015/lib/register/register.service.js +0 -173
- package/esm2015/lib/register/register.types.js +0 -3
- package/esm2015/lib/reminder/reminder.gql.js +0 -27
- package/esm2015/lib/reminder/reminder.service.js +0 -85
- package/esm2015/lib/reminder/reminder.types.js +0 -2
- package/esm2015/lib/scenario/scenario.constants.js +0 -2
- package/esm2015/lib/scenario/scenario.controller.js +0 -34
- package/esm2015/lib/scenario/scenario.gql.js +0 -90
- package/esm2015/lib/scenario/scenario.private.gql.js +0 -200
- package/esm2015/lib/scenario/scenario.service.js +0 -679
- package/esm2015/lib/scenario/scenario.types.js +0 -2
- package/esm2015/lib/server-config/server-config.gql.js +0 -9
- package/esm2015/lib/server-config/server-config.service.js +0 -41
- package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +0 -119
- package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +0 -41
- package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +0 -117
- package/esm2015/lib/slip39/slip39.service.js +0 -167
- package/esm2015/lib/time/time.service.js +0 -152
- package/esm2015/lib/tp-assembly/tp-assembly.js +0 -363
- package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +0 -22
- package/esm2015/lib/tp-assembly/tp-assembly.types.js +0 -2
- package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +0 -98
- package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +0 -121
- package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +0 -4
- package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +0 -34
- package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +0 -74
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +0 -166
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +0 -54
- package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +0 -110
- package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +0 -2
- package/esm2015/lib/trusted-party/trusted-party.gql.js +0 -96
- package/esm2015/lib/trusted-party/trusted-party.gql.private.js +0 -51
- package/esm2015/lib/trusted-party/trusted-party.service.js +0 -461
- package/esm2015/lib/trusted-party/trusted-party.types.js +0 -2
- package/esm2015/lib/two-factor/two-factor.service.js +0 -74
- package/esm2015/lib/user/user.gql.js +0 -32
- package/esm2015/lib/user/user.service.js +0 -58
- package/esm2015/lib/user/user.types.js +0 -2
- package/esm2015/lib/web-crypto/web-crypto.service.js +0 -29
- package/esm2015/lifeready-core.js +0 -17
- package/esm2015/public-api.js +0 -60
- package/fesm2015/lifeready-core.js +0 -10970
- package/fesm2015/lifeready-core.js.map +0 -1
- package/lib/_common/ast.d.ts +0 -11
- package/lib/_common/deferred-promise.d.ts +0 -12
- package/lib/_common/exceptions.d.ts +0 -126
- package/lib/_common/index.d.ts +0 -2
- package/lib/_common/kc-lodash.d.ts +0 -5
- package/lib/_common/key.d.ts +0 -14
- package/lib/_common/queries.gql.d.ts +0 -4
- package/lib/_common/run-outside-angular.d.ts +0 -14
- package/lib/_common/storage.d.ts +0 -13
- package/lib/_common/types.d.ts +0 -15
- package/lib/_common/utils.d.ts +0 -12
- package/lib/api/lr-apollo.service.d.ts +0 -15
- package/lib/api/lr-graphql/index.d.ts +0 -5
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +0 -81
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +0 -46
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +0 -28
- package/lib/api/lr-graphql/lr-mutation.d.ts +0 -48
- package/lib/api/lr-graphql/lr.service.d.ts +0 -9
- package/lib/api/query-processor/common-processors.service.d.ts +0 -36
- package/lib/api/query-processor/index.d.ts +0 -2
- package/lib/api/query-processor/query-processor.service.d.ts +0 -18
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +0 -15
- package/lib/api/types/graphql.types.d.ts +0 -30
- package/lib/api/types/index.d.ts +0 -2
- package/lib/api/types/lr-graphql.types.d.ts +0 -807
- package/lib/auth/auth.config.d.ts +0 -5
- package/lib/auth/auth.gql.private.d.ts +0 -25
- package/lib/auth/auth.service.d.ts +0 -72
- package/lib/auth/auth.types.d.ts +0 -70
- package/lib/contact-card/contact-card.gql.d.ts +0 -7
- package/lib/contact-card/contact-card.service.d.ts +0 -53
- package/lib/contact-card/contact-card2.gql.d.ts +0 -25
- package/lib/contact-card/contact-card2.service.d.ts +0 -64
- package/lib/encryption/encryption.service.d.ts +0 -42
- package/lib/file-upload/file-upload.service.d.ts +0 -15
- package/lib/file-upload/file-upload.types.d.ts +0 -5
- package/lib/idle/idle.service.d.ts +0 -47
- package/lib/idle/idle.types.d.ts +0 -10
- package/lib/item/item.gql.d.ts +0 -134
- package/lib/item/item.gql.private.d.ts +0 -35
- package/lib/item/item.service.d.ts +0 -201
- package/lib/item/item.types.d.ts +0 -95
- package/lib/key/key-factory.service.d.ts +0 -40
- package/lib/key/key-graph.service.d.ts +0 -41
- package/lib/key/key-meta.service.d.ts +0 -51
- package/lib/key/key.service.d.ts +0 -36
- package/lib/key/key.types.d.ts +0 -86
- package/lib/key-exchange/key-exchange.gql.d.ts +0 -141
- package/lib/key-exchange/key-exchange.service.d.ts +0 -179
- package/lib/lbop/lbop.service.d.ts +0 -99
- package/lib/life-ready.config.d.ts +0 -26
- package/lib/life-ready.module.d.ts +0 -5
- package/lib/lock/lock.gql.d.ts +0 -27
- package/lib/lock/lock.service.d.ts +0 -34
- package/lib/notification/notification.gql.d.ts +0 -37
- package/lib/notification/notification.service.d.ts +0 -64
- package/lib/password/password.gql.d.ts +0 -3
- package/lib/password/password.service.d.ts +0 -79
- package/lib/persist/persist.service.d.ts +0 -31
- package/lib/plan/plan.gql.d.ts +0 -69
- package/lib/plan/plan.service.d.ts +0 -111
- package/lib/plan/plan.types.d.ts +0 -16
- package/lib/profile/profile-details.service.d.ts +0 -20
- package/lib/profile/profile.gql.d.ts +0 -21
- package/lib/profile/profile.service.d.ts +0 -32
- package/lib/profile/profile.types.d.ts +0 -121
- package/lib/register/register.service.d.ts +0 -25
- package/lib/register/register.types.d.ts +0 -6
- package/lib/reminder/reminder.gql.d.ts +0 -23
- package/lib/reminder/reminder.service.d.ts +0 -33
- package/lib/reminder/reminder.types.d.ts +0 -17
- package/lib/scenario/scenario.constants.d.ts +0 -1
- package/lib/scenario/scenario.controller.d.ts +0 -10
- package/lib/scenario/scenario.gql.d.ts +0 -78
- package/lib/scenario/scenario.private.gql.d.ts +0 -16
- package/lib/scenario/scenario.service.d.ts +0 -655
- package/lib/scenario/scenario.types.d.ts +0 -64
- package/lib/server-config/server-config.gql.d.ts +0 -5
- package/lib/server-config/server-config.service.d.ts +0 -9
- package/lib/shared-contact-card/shared-contact-card.service.d.ts +0 -33
- package/lib/shared-contact-card/shared-contact-card2.gql.d.ts +0 -36
- package/lib/shared-contact-card/shared-contact-card2.service.d.ts +0 -45
- package/lib/slip39/slip39.service.d.ts +0 -42
- package/lib/time/time.service.d.ts +0 -26
- package/lib/tp-assembly/tp-assembly.d.ts +0 -177
- package/lib/tp-assembly/tp-assembly.private.gql.d.ts +0 -5
- package/lib/tp-assembly/tp-assembly.types.d.ts +0 -40
- package/lib/tp-password-reset/tp-password-reset-request.service.d.ts +0 -16
- package/lib/tp-password-reset/tp-password-reset-user.service.d.ts +0 -29
- package/lib/tp-password-reset/tp-password-reset.constants.d.ts +0 -3
- package/lib/tp-password-reset/tp-password-reset.controller.d.ts +0 -10
- package/lib/tp-password-reset/tp-password-reset.gql.d.ts +0 -63
- package/lib/tp-password-reset/tp-password-reset.private.gql.d.ts +0 -163
- package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +0 -59
- package/lib/tp-password-reset/tp-password-reset.service.d.ts +0 -112
- package/lib/tp-password-reset/tp-password-reset.types.d.ts +0 -40
- package/lib/trusted-party/trusted-party.gql.d.ts +0 -85
- package/lib/trusted-party/trusted-party.gql.private.d.ts +0 -40
- package/lib/trusted-party/trusted-party.service.d.ts +0 -192
- package/lib/trusted-party/trusted-party.types.d.ts +0 -31
- package/lib/two-factor/two-factor.service.d.ts +0 -15
- package/lib/user/user.gql.d.ts +0 -8
- package/lib/user/user.service.d.ts +0 -9
- package/lib/user/user.types.d.ts +0 -16
- package/lib/web-crypto/web-crypto.service.d.ts +0 -5
- package/lifeready-core.d.ts +0 -16
- package/lifeready-core.metadata.json +0 -1
- package/public-api.d.ts +0 -56
|
@@ -1,679 +0,0 @@
|
|
|
1
|
-
import { __awaiter, __decorate } from "tslib";
|
|
2
|
-
import { Injectable, Injector, NgZone } from '@angular/core';
|
|
3
|
-
import { LrMergedMutation, LrMutation, LrService } from '../api/lr-graphql';
|
|
4
|
-
import { AccessRoleChoice, mapEdges, ScenarioState, TpClaimApproverState, } from '../api/types';
|
|
5
|
-
import { EncryptionService } from '../encryption/encryption.service';
|
|
6
|
-
import { ItemService } from '../item/item.service';
|
|
7
|
-
import { KeyGraphService } from '../key/key-graph.service';
|
|
8
|
-
import { TpsKeysQuery } from '../tp-assembly/tp-assembly.private.gql';
|
|
9
|
-
import { KcBadArgumentException, KcBadStateException, } from '../_common/exceptions';
|
|
10
|
-
import { RunOutsideAngular } from '../_common/run-outside-angular';
|
|
11
|
-
import { assertExactlyOne } from '../_common/utils';
|
|
12
|
-
import { ScenarioAssemblyController } from './scenario.controller';
|
|
13
|
-
import { ApproveScenarioClaimMutation, CancelScenarioClaimMutation, CreateScenarioClaimMutation, CreateScenarioMutation, DebugExpireScenarioClaimMutation, DeleteScenarioMutation, ReceiveScenarioClaimMutation, RejectScenarioClaimMutation, UpdateScenarioMutation, } from './scenario.gql';
|
|
14
|
-
import { ScenarioQuery, SharedScenarioQuery } from './scenario.private.gql';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "../key/key-graph.service";
|
|
17
|
-
import * as i2 from "../item/item.service";
|
|
18
|
-
import * as i3 from "./scenario.controller";
|
|
19
|
-
import * as i4 from "../encryption/encryption.service";
|
|
20
|
-
export function throwClaimIdMismatch() {
|
|
21
|
-
throw new KcBadArgumentException('claimId does not match with the current claimId of the scenario');
|
|
22
|
-
}
|
|
23
|
-
export function throwClaimNotApproved() {
|
|
24
|
-
throw new KcBadStateException('Scenario claim has not been approved');
|
|
25
|
-
}
|
|
26
|
-
let ScenarioService = class ScenarioService extends LrService {
|
|
27
|
-
constructor(ngZone, injector, keyGraph, itemService, assemblyController, encryptionService) {
|
|
28
|
-
super(injector);
|
|
29
|
-
this.ngZone = ngZone;
|
|
30
|
-
this.injector = injector;
|
|
31
|
-
this.keyGraph = keyGraph;
|
|
32
|
-
this.itemService = itemService;
|
|
33
|
-
this.assemblyController = assemblyController;
|
|
34
|
-
this.encryptionService = encryptionService;
|
|
35
|
-
this.prepareAddReceiverDirectory = this.prepareReceiverDirectory;
|
|
36
|
-
this.prepareUpdateReceiverDirectory = this.prepareReceiverDirectory;
|
|
37
|
-
this.prepareAddReceiverFile = this.prepareReceiverFile;
|
|
38
|
-
this.prepareUpdateReceiverFile = this.prepareReceiverFile;
|
|
39
|
-
}
|
|
40
|
-
// Scenarios
|
|
41
|
-
createScenario(options) {
|
|
42
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
-
return this.mutate(this.createScenarioMutation(options));
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
createScenarioMutation(options) {
|
|
47
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
-
const input = yield this.prepareCreateScenarioMutation(options);
|
|
49
|
-
return new LrMutation({
|
|
50
|
-
mutation: CreateScenarioMutation,
|
|
51
|
-
variables: {
|
|
52
|
-
input,
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
updateScenario(options) {
|
|
58
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
-
return this.mutate(this.updateScenarioMutation(options));
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
updateScenarioMutation(options) {
|
|
63
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
-
const scenario = (yield this.getScenario(options.scenarioId)).scenario;
|
|
65
|
-
const input = yield this.prepareUpdateScenario(options, scenario);
|
|
66
|
-
return new LrMutation({
|
|
67
|
-
mutation: UpdateScenarioMutation,
|
|
68
|
-
variables: {
|
|
69
|
-
input,
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
resetScenario(options) {
|
|
75
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
76
|
-
return this.mutate(this.resetScenarioMutation(options));
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
resetScenarioMutation(options) {
|
|
80
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
-
const scenario = (yield this.getScenario(options.scenarioId)).scenario;
|
|
82
|
-
const { assembly } = scenario;
|
|
83
|
-
// Just need to do an update without changing approvers. This will recreate
|
|
84
|
-
// all assembly keys.
|
|
85
|
-
const updateSubAssemblies = mapEdges(assembly.subAssemblies).map((sa) => {
|
|
86
|
-
const approverTps = mapEdges(sa.approvers).map((approver) => ({
|
|
87
|
-
tpId: approver.tp.id,
|
|
88
|
-
}));
|
|
89
|
-
return {
|
|
90
|
-
id: sa.id,
|
|
91
|
-
quorum: sa.quorum,
|
|
92
|
-
singleReject: sa.singleReject,
|
|
93
|
-
subjectCipherDataClearJson: sa.subjectCipherDataClearJson,
|
|
94
|
-
approverTps,
|
|
95
|
-
};
|
|
96
|
-
});
|
|
97
|
-
const input = yield this.prepareUpdateScenario({
|
|
98
|
-
scenarioId: options.scenarioId,
|
|
99
|
-
enabled: options.enabled,
|
|
100
|
-
updateAssembly: {
|
|
101
|
-
quorum: assembly.quorum,
|
|
102
|
-
singleReject: assembly.singleReject,
|
|
103
|
-
updateSubAssemblies,
|
|
104
|
-
},
|
|
105
|
-
}, scenario);
|
|
106
|
-
return new LrMutation({
|
|
107
|
-
mutation: UpdateScenarioMutation,
|
|
108
|
-
variables: {
|
|
109
|
-
input,
|
|
110
|
-
},
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
deleteScenario(scenarioId) {
|
|
115
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
-
return this.lrGraphQL.lrMutate(this.deleteScenarioMutation(scenarioId));
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
deleteScenarioMutation(scenarioId) {
|
|
120
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
121
|
-
return new LrMutation({
|
|
122
|
-
mutation: DeleteScenarioMutation,
|
|
123
|
-
variables: { input: { scenarioId } },
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
// Claims
|
|
128
|
-
createClaim(scenarioId) {
|
|
129
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
130
|
-
return this.mutate(this.createClaimMutation(scenarioId));
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
createClaimMutation(scenarioId) {
|
|
134
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
135
|
-
return new LrMutation({
|
|
136
|
-
mutation: CreateScenarioClaimMutation,
|
|
137
|
-
variables: { input: { scenarioId } },
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
cancelClaim(claimId) {
|
|
142
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
143
|
-
return this.mutate(this.cancelClaimMutation(claimId));
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
cancelClaimMutation(claimId) {
|
|
147
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
148
|
-
return new LrMutation({
|
|
149
|
-
mutation: CancelScenarioClaimMutation,
|
|
150
|
-
variables: { input: { claimId } },
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
rejectClaim(sharedScenarioId, claimId) {
|
|
155
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
-
return this.mutate(this.rejectClaimMutation(sharedScenarioId, claimId));
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
rejectClaimMutation(sharedScenarioId, claimId) {
|
|
160
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
161
|
-
const mutations = yield this.prepareRejectClaimMutations(sharedScenarioId, claimId);
|
|
162
|
-
return LrMergedMutation.create(yield Promise.all(mutations));
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
approveClaim(sharedScenarioId, sharedClaimId) {
|
|
166
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
167
|
-
// TODO this needs a cast so the result is not ANY.
|
|
168
|
-
return this.mutate(this.approveClaimMutation(sharedScenarioId, sharedClaimId));
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
approveClaimMutation(sharedScenarioId, sharedClaimId) {
|
|
172
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
173
|
-
const mutations = yield this.prepareApproveClaimMutations(sharedScenarioId, sharedClaimId);
|
|
174
|
-
return LrMergedMutation.create(yield Promise.all(mutations));
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
receiveClaim(scenarioId, sharedClaimId) {
|
|
178
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
179
|
-
return this.mutate(this.receiveClaim2Mutation(scenarioId, sharedClaimId));
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
receiveClaim2Mutation(scenarioId, sharedClaimId) {
|
|
183
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
184
|
-
return new LrMutation({
|
|
185
|
-
mutation: ReceiveScenarioClaimMutation,
|
|
186
|
-
variables: {
|
|
187
|
-
input: yield this.prepareReceiveClaim2(scenarioId, sharedClaimId),
|
|
188
|
-
},
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
debugExpireClaim(scenarioId) {
|
|
193
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
194
|
-
return this.mutate(this.debugExpireClaimMutation(scenarioId));
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
debugExpireClaimMutation(scenarioId) {
|
|
198
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
199
|
-
return new LrMutation({
|
|
200
|
-
mutation: DebugExpireScenarioClaimMutation,
|
|
201
|
-
variables: {
|
|
202
|
-
input: { scenarioId },
|
|
203
|
-
},
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
// --------------------------------------------------------------------------------
|
|
208
|
-
// --------------------------------------------------------------------------------
|
|
209
|
-
// Helpers
|
|
210
|
-
// --------------------------------------------------------------------------------
|
|
211
|
-
// --------------------------------------------------------------------------------
|
|
212
|
-
getScenario(scenarioId) {
|
|
213
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
214
|
-
return this.query({
|
|
215
|
-
query: ScenarioQuery,
|
|
216
|
-
variables: { scenarioId },
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
getSharedScenario(scenarioId, claimId) {
|
|
221
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
222
|
-
const ret = yield this.query({
|
|
223
|
-
query: SharedScenarioQuery,
|
|
224
|
-
variables: {
|
|
225
|
-
scenarioId,
|
|
226
|
-
},
|
|
227
|
-
});
|
|
228
|
-
if (claimId && ret.sharedScenario.sharedClaim.id !== claimId) {
|
|
229
|
-
throwClaimIdMismatch();
|
|
230
|
-
}
|
|
231
|
-
return ret;
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
getParticipantTpsKeys(options) {
|
|
235
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
236
|
-
const tpIds = options.map((x) => x.tpId);
|
|
237
|
-
// This should contain all the TPs that we need to update the assembly.
|
|
238
|
-
const tps = mapEdges((yield this.lrGraphQL.query({
|
|
239
|
-
query: TpsKeysQuery,
|
|
240
|
-
variables: {
|
|
241
|
-
ids: tpIds,
|
|
242
|
-
},
|
|
243
|
-
})).tps);
|
|
244
|
-
return tps;
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
fillTpSharedKeyId(options, tps) {
|
|
248
|
-
options.forEach((participant) => {
|
|
249
|
-
if (!participant.tpSharedKeyId) {
|
|
250
|
-
const tp = tps.find((x) => x.id === participant.tpId);
|
|
251
|
-
participant.tpSharedKeyId =
|
|
252
|
-
tp.currentUserSharedKey.userSharedKey.sharedKey.id;
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
prepareCreateScenarioMutation(options) {
|
|
257
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
258
|
-
const { assemblyKey, mutationInput: createAssembly } = yield this.assemblyController.prepareCreate(options.createAssembly);
|
|
259
|
-
const createReceiversOptions = options.createReceivers || [];
|
|
260
|
-
const createClaimantsOptions = options.createClaimants || [];
|
|
261
|
-
// Fetch all the TPs so we don't have to pass in tpSharedKeyId
|
|
262
|
-
const creatParticipantsOptions = createReceiversOptions.concat(createClaimantsOptions);
|
|
263
|
-
const tps = yield this.getParticipantTpsKeys(creatParticipantsOptions);
|
|
264
|
-
this.fillTpSharedKeyId(creatParticipantsOptions, tps);
|
|
265
|
-
const createReceivers = yield Promise.all(createReceiversOptions.map((receiver) => this.prepareCreateReceiver(receiver, assemblyKey)));
|
|
266
|
-
const createClaimants = yield Promise.all(createClaimantsOptions.map((x) => this.prepareCreateClaimant(x)));
|
|
267
|
-
return {
|
|
268
|
-
enabled: options.enabled,
|
|
269
|
-
inactiveSeconds: options.inactiveSeconds,
|
|
270
|
-
createAssembly,
|
|
271
|
-
createReceivers,
|
|
272
|
-
createClaimants,
|
|
273
|
-
};
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
prepareUpdateScenario(options, scenario) {
|
|
277
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
278
|
-
let assemblyKey = yield this.keyGraph.getJwkKey(scenario.assembly.assemblyKey.id);
|
|
279
|
-
const updateAssembly = options.updateAssembly
|
|
280
|
-
? yield (() => __awaiter(this, void 0, void 0, function* () {
|
|
281
|
-
// Assembly key is always rotated when updating assembly.
|
|
282
|
-
const result = yield this.assemblyController.prepareUpdate(options.updateAssembly, scenario.assembly);
|
|
283
|
-
// Use new assembly key.
|
|
284
|
-
assemblyKey = result.assemblyKey;
|
|
285
|
-
return result.mutationInput;
|
|
286
|
-
}))()
|
|
287
|
-
: undefined;
|
|
288
|
-
const createReceiversOptions = options.createReceivers || [];
|
|
289
|
-
const createClaimantsOptions = options.createClaimants || [];
|
|
290
|
-
// Fetch all the TPs so we don't have to pass in tpSharedKeyId
|
|
291
|
-
const creatParticipantsOptions = createReceiversOptions.concat(createClaimantsOptions);
|
|
292
|
-
const tps = yield this.getParticipantTpsKeys(creatParticipantsOptions);
|
|
293
|
-
this.fillTpSharedKeyId(creatParticipantsOptions, tps);
|
|
294
|
-
const createReceivers = options.createReceivers &&
|
|
295
|
-
(yield Promise.all(options.createReceivers.map((x) => this.prepareCreateReceiver(x, assemblyKey))));
|
|
296
|
-
const existingReceivers = mapEdges(scenario.receivers);
|
|
297
|
-
let updateReceivers = options.updateReceivers
|
|
298
|
-
? yield Promise.all(options.updateReceivers.map((updateReceiver) => {
|
|
299
|
-
// Find the receiver we are updating
|
|
300
|
-
const existingReceiver = existingReceivers.find((x) => x.tp.id === updateReceiver.tpId);
|
|
301
|
-
return this.prepareUpdateReceiver(updateReceiver, assemblyKey, existingReceiver);
|
|
302
|
-
}))
|
|
303
|
-
: [];
|
|
304
|
-
// Fill in any missing receivers when updating assembly.
|
|
305
|
-
if (options.updateAssembly) {
|
|
306
|
-
// Filter out the receivers that will be deleted or already updated.
|
|
307
|
-
const existing = existingReceivers.filter((existingReceiver) => !(options.deleteReceivers || []).includes(existingReceiver.tp.id) &&
|
|
308
|
-
!updateReceivers.some((updateReceiver) => updateReceiver.tpId === existingReceiver.tp.id));
|
|
309
|
-
updateReceivers = updateReceivers.concat(yield this.prepareExistingReceivers(existing, assemblyKey));
|
|
310
|
-
}
|
|
311
|
-
const createClaimants = options.createClaimants &&
|
|
312
|
-
(yield Promise.all(options.createClaimants.map((x) => this.prepareCreateClaimant(x))));
|
|
313
|
-
const existingClaimants = mapEdges(scenario.claimants);
|
|
314
|
-
const updateClaimants = options.updateClaimants &&
|
|
315
|
-
(yield Promise.all(options.updateClaimants.map((x) => {
|
|
316
|
-
// Find the claimant we are updating
|
|
317
|
-
const claimant = existingClaimants.find((existingClaimant) => existingClaimant.tp.id === x.tpId);
|
|
318
|
-
return this.prepareUpdateClaimant(x, claimant.sharedKey.id);
|
|
319
|
-
})));
|
|
320
|
-
return {
|
|
321
|
-
scenarioId: options.scenarioId,
|
|
322
|
-
enabled: options.enabled,
|
|
323
|
-
inactiveSeconds: options.inactiveSeconds,
|
|
324
|
-
updateAssembly,
|
|
325
|
-
createReceivers,
|
|
326
|
-
updateReceivers,
|
|
327
|
-
deleteReceivers: options.deleteReceivers,
|
|
328
|
-
createClaimants,
|
|
329
|
-
updateClaimants,
|
|
330
|
-
deleteClaimants: options.deleteClaimants,
|
|
331
|
-
};
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
prepareReceiverItem(options) {
|
|
335
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
336
|
-
const { receiverItemOptions, receiverSharedKey, assemblyKey, directory, file, } = options;
|
|
337
|
-
assertExactlyOne({ directory, file });
|
|
338
|
-
const { accessRole } = receiverItemOptions;
|
|
339
|
-
if (accessRole == AccessRoleChoice.DENY) {
|
|
340
|
-
const ret = {
|
|
341
|
-
accessRole,
|
|
342
|
-
itemKeyId: null,
|
|
343
|
-
wrappedItemKey: null,
|
|
344
|
-
sharedCipherData: null,
|
|
345
|
-
};
|
|
346
|
-
if (directory) {
|
|
347
|
-
// Cryptographic access to item is not required.
|
|
348
|
-
return Object.assign(Object.assign({}, ret), { directoryId: directory.id });
|
|
349
|
-
}
|
|
350
|
-
else {
|
|
351
|
-
return Object.assign(Object.assign({}, ret), { fileId: file.id });
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
else {
|
|
355
|
-
// TODO this should be batched
|
|
356
|
-
let itemKey;
|
|
357
|
-
if (directory) {
|
|
358
|
-
itemKey = yield this.itemService.getDirectoryKey(directory.id, directory.keyId);
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
itemKey = yield this.itemService.getFileKey(file.id, file.keyId);
|
|
362
|
-
}
|
|
363
|
-
let wrappedItemKey = yield this.keyGraph.encryptToString(receiverSharedKey, itemKey.jwk.toJSON(true));
|
|
364
|
-
const sharedCipherData = yield this.keyGraph.encryptToString(receiverSharedKey, receiverItemOptions.sharedCipherDataClearJson || '');
|
|
365
|
-
wrappedItemKey = yield this.keyGraph.encryptToString(assemblyKey, wrappedItemKey);
|
|
366
|
-
const ret = {
|
|
367
|
-
accessRole,
|
|
368
|
-
itemKeyId: itemKey.id,
|
|
369
|
-
wrappedItemKey,
|
|
370
|
-
sharedCipherData,
|
|
371
|
-
};
|
|
372
|
-
if (directory) {
|
|
373
|
-
return Object.assign(Object.assign({}, ret), { directoryId: directory.id });
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
return Object.assign(Object.assign({}, ret), { fileId: file.id });
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
prepareReceiverDirectory(options, receiverSharedKey, assemblyKey) {
|
|
382
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
383
|
-
return this.prepareReceiverItem({
|
|
384
|
-
receiverItemOptions: options,
|
|
385
|
-
receiverSharedKey,
|
|
386
|
-
assemblyKey,
|
|
387
|
-
directory: {
|
|
388
|
-
id: options.directoryId,
|
|
389
|
-
keyId: options.directoryKeyId,
|
|
390
|
-
},
|
|
391
|
-
});
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
prepareReceiverFile(options, receiverSharedKey, assemblyKey) {
|
|
395
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
396
|
-
return this.prepareReceiverItem({
|
|
397
|
-
receiverItemOptions: options,
|
|
398
|
-
receiverSharedKey,
|
|
399
|
-
assemblyKey,
|
|
400
|
-
file: {
|
|
401
|
-
id: options.fileId,
|
|
402
|
-
keyId: options.fileKeyId,
|
|
403
|
-
},
|
|
404
|
-
});
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
prepareCreateReceiver(options, assemblyKey) {
|
|
408
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
409
|
-
const { sharedKey, mutationInput } = yield this.prepareCreateParticipant(options);
|
|
410
|
-
const addDirectories = options.addDirectories &&
|
|
411
|
-
(yield Promise.all(options.addDirectories.map((x) => this.prepareAddReceiverDirectory(x, sharedKey.key, assemblyKey))));
|
|
412
|
-
const addFiles = options.addFiles &&
|
|
413
|
-
(yield Promise.all(options.addFiles.map((x) => this.prepareAddReceiverFile(x, sharedKey.key, assemblyKey))));
|
|
414
|
-
return Object.assign(Object.assign({}, mutationInput), { addDirectories,
|
|
415
|
-
addFiles });
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
prepareUpdateReceiver(options, assemblyKey, existingReceiver) {
|
|
419
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
420
|
-
const sharedKeyId = existingReceiver.sharedKey.id;
|
|
421
|
-
const deleteDirectoriesOptions = options.deleteDirectories || [];
|
|
422
|
-
const updateDirectoriesOptions = options.updateDirectories || [];
|
|
423
|
-
const deleteFilesOptions = options.deleteFiles || [];
|
|
424
|
-
const updateFilesOptions = options.updateFiles || [];
|
|
425
|
-
// Fill in any missing update directories
|
|
426
|
-
mapEdges(existingReceiver.receiverItems.receiverDirectories).forEach((existingDirectory) => {
|
|
427
|
-
if (deleteDirectoriesOptions.includes(existingDirectory.directory.id)) {
|
|
428
|
-
return;
|
|
429
|
-
}
|
|
430
|
-
if (updateDirectoriesOptions.find((x) => x.directoryId === existingDirectory.directory.id)) {
|
|
431
|
-
return;
|
|
432
|
-
}
|
|
433
|
-
updateDirectoriesOptions.push({
|
|
434
|
-
accessRole: existingDirectory.accessRole,
|
|
435
|
-
directoryId: existingDirectory.directory.id,
|
|
436
|
-
directoryKeyId: existingDirectory.directory.keyId,
|
|
437
|
-
sharedCipherDataClearJson: existingDirectory.sharedCipherDataClearJson,
|
|
438
|
-
});
|
|
439
|
-
});
|
|
440
|
-
// Fill in any missing update files
|
|
441
|
-
mapEdges(existingReceiver.receiverItems.receiverFiles).forEach((existingFile) => {
|
|
442
|
-
if (deleteFilesOptions.includes(existingFile.file.id)) {
|
|
443
|
-
return;
|
|
444
|
-
}
|
|
445
|
-
if (updateFilesOptions.find((x) => x.fileId === existingFile.file.id)) {
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
updateFilesOptions.push({
|
|
449
|
-
accessRole: existingFile.accessRole,
|
|
450
|
-
fileId: existingFile.file.id,
|
|
451
|
-
fileKeyId: existingFile.file.keyId,
|
|
452
|
-
sharedCipherDataClearJson: existingFile.sharedCipherDataClearJson,
|
|
453
|
-
});
|
|
454
|
-
});
|
|
455
|
-
const { sharedKey, mutationInput } = yield this.prepareUpdateParticipant(options, sharedKeyId);
|
|
456
|
-
const addDirectories = options.addDirectories &&
|
|
457
|
-
(yield Promise.all(options.addDirectories.map((x) => this.prepareAddReceiverDirectory(x, sharedKey, assemblyKey))));
|
|
458
|
-
const addFiles = options.addFiles &&
|
|
459
|
-
(yield Promise.all(options.addFiles.map((x) => this.prepareAddReceiverFile(x, sharedKey, assemblyKey))));
|
|
460
|
-
const updateDirectories = yield Promise.all(updateDirectoriesOptions.map((x) => this.prepareUpdateReceiverDirectory(x, sharedKey, assemblyKey)));
|
|
461
|
-
const updateFiles = yield Promise.all(updateFilesOptions.map((x) => this.prepareUpdateReceiverFile(x, sharedKey, assemblyKey)));
|
|
462
|
-
return Object.assign(Object.assign({}, mutationInput), { addDirectories,
|
|
463
|
-
addFiles,
|
|
464
|
-
updateDirectories,
|
|
465
|
-
updateFiles, deleteDirectories: options.deleteDirectories, deleteFiles: options.deleteFiles });
|
|
466
|
-
});
|
|
467
|
-
}
|
|
468
|
-
prepareExistingReceiver(existingReceiver, assemblyKey) {
|
|
469
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
470
|
-
const updateDirectories = mapEdges(existingReceiver.receiverItems.receiverDirectories).map(({ accessRole, sharedCipherDataClearJson, directory }) => ({
|
|
471
|
-
accessRole,
|
|
472
|
-
sharedCipherDataClearJson,
|
|
473
|
-
directoryId: directory.id,
|
|
474
|
-
directoryKeyId: directory.keyId,
|
|
475
|
-
}));
|
|
476
|
-
const updateFiles = mapEdges(existingReceiver.receiverItems.receiverFiles).map(({ accessRole, sharedCipherDataClearJson, file }) => ({
|
|
477
|
-
accessRole,
|
|
478
|
-
sharedCipherDataClearJson,
|
|
479
|
-
fileId: file.id,
|
|
480
|
-
fileKeyId: file.keyId,
|
|
481
|
-
}));
|
|
482
|
-
// Fill it in with existing receiver.
|
|
483
|
-
return this.prepareUpdateReceiver({
|
|
484
|
-
tpId: existingReceiver.tp.id,
|
|
485
|
-
sharedCipherDataClearJson: existingReceiver.sharedCipherDataClearJson,
|
|
486
|
-
updateDirectories,
|
|
487
|
-
updateFiles,
|
|
488
|
-
}, assemblyKey, existingReceiver);
|
|
489
|
-
});
|
|
490
|
-
}
|
|
491
|
-
prepareExistingReceivers(existingReceivers, assemblyKey) {
|
|
492
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
493
|
-
return Promise.all(existingReceivers.map((existingReceiver) => this.prepareExistingReceiver(existingReceiver, assemblyKey)));
|
|
494
|
-
});
|
|
495
|
-
}
|
|
496
|
-
prepareCreateParticipant(options) {
|
|
497
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
498
|
-
const sharedKey = yield this.keyGraph.encryptWithNewKey(options.tpSharedKeyId, options.sharedCipherDataClearJson || '');
|
|
499
|
-
return {
|
|
500
|
-
sharedKey,
|
|
501
|
-
mutationInput: {
|
|
502
|
-
tpId: options.tpId,
|
|
503
|
-
tpSharedKeyId: options.tpSharedKeyId,
|
|
504
|
-
tpSharedKeyWrappedSharedKey: sharedKey.wrappedKey,
|
|
505
|
-
sharedCipherData: sharedKey.cipher,
|
|
506
|
-
},
|
|
507
|
-
};
|
|
508
|
-
});
|
|
509
|
-
}
|
|
510
|
-
prepareUpdateParticipant(options, sharedKeyId) {
|
|
511
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
512
|
-
const sharedKey = yield this.keyGraph.getJwkKey(sharedKeyId);
|
|
513
|
-
const sharedCipherData = yield this.keyGraph.encryptToString(sharedKey, options.sharedCipherDataClearJson || '');
|
|
514
|
-
return {
|
|
515
|
-
sharedKey,
|
|
516
|
-
mutationInput: {
|
|
517
|
-
tpId: options.tpId,
|
|
518
|
-
sharedKeyId,
|
|
519
|
-
sharedCipherData,
|
|
520
|
-
},
|
|
521
|
-
};
|
|
522
|
-
});
|
|
523
|
-
}
|
|
524
|
-
prepareCreateClaimant(options) {
|
|
525
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
526
|
-
const { mutationInput } = yield this.prepareCreateParticipant(options);
|
|
527
|
-
return mutationInput;
|
|
528
|
-
});
|
|
529
|
-
}
|
|
530
|
-
prepareUpdateClaimant(options, sharedKeyId) {
|
|
531
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
532
|
-
const { mutationInput } = yield this.prepareUpdateParticipant(options, sharedKeyId);
|
|
533
|
-
return mutationInput;
|
|
534
|
-
});
|
|
535
|
-
}
|
|
536
|
-
prepareReceiveClaim2(scenarioId, sharedClaimId) {
|
|
537
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
538
|
-
// Get all the shared items
|
|
539
|
-
const sharedScenario = (yield this.getSharedScenario(scenarioId, sharedClaimId)).sharedScenario;
|
|
540
|
-
if (sharedScenario.state !== ScenarioState.APPROVED) {
|
|
541
|
-
throwClaimNotApproved();
|
|
542
|
-
}
|
|
543
|
-
const approvals = mapEdges(sharedScenario.sharedClaim.asClaimReceiver.approvals);
|
|
544
|
-
const assemblyKey = yield this.recoverAssemblyKey(approvals);
|
|
545
|
-
// Wrap assembly key with shared key.
|
|
546
|
-
//???
|
|
547
|
-
// This sharedKey is created just for this scenario. It's wrapped by the tpSharedKey.
|
|
548
|
-
const sharedKey = yield this.keyGraph.getKey(sharedScenario.asReceiver.sharedKey.id);
|
|
549
|
-
const sharedKeyWrappedAssemblyKey = yield this.keyGraph.encryptToString(sharedKey, assemblyKey.toJSON(true));
|
|
550
|
-
return {
|
|
551
|
-
scenarioClaimId: sharedClaimId,
|
|
552
|
-
sharedKeyWrappedAssemblyKey,
|
|
553
|
-
sharedKeyId: sharedKey.id,
|
|
554
|
-
assemblyKeyId: sharedScenario.sharedClaim.asClaimReceiver.assemblyKeyId,
|
|
555
|
-
};
|
|
556
|
-
});
|
|
557
|
-
}
|
|
558
|
-
// async prepareReceiveClaim(scenarioId: string, sharedClaimId: string) {
|
|
559
|
-
// // Get all the shared items
|
|
560
|
-
// const sharedScenario = (
|
|
561
|
-
// await this.getSharedScenario(scenarioId, sharedClaimId)
|
|
562
|
-
// ).sharedScenario;
|
|
563
|
-
// if (sharedScenario.state !== ScenarioState.APPROVED) {
|
|
564
|
-
// throwClaimNotApproved();
|
|
565
|
-
// }
|
|
566
|
-
// const approvals = mapEdges(
|
|
567
|
-
// sharedScenario.sharedClaim.asClaimReceiver.approvals
|
|
568
|
-
// );
|
|
569
|
-
// const assemblyKey = await this.recoverAssemblyKey(approvals);
|
|
570
|
-
// // Decrypt all items
|
|
571
|
-
// const receiverDirectories = await Promise.all(
|
|
572
|
-
// sharedScenario.asReceiver.receiverItems.receiverDirectories.edges
|
|
573
|
-
// .map((edge) => edge.node)
|
|
574
|
-
// .map(async (receiverDirectory) => {
|
|
575
|
-
// const wrappedItemKey = await this.encryptionService.decrypt(
|
|
576
|
-
// assemblyKey,
|
|
577
|
-
// receiverDirectory.wrappedItemKey
|
|
578
|
-
// );
|
|
579
|
-
// return {
|
|
580
|
-
// receiverDirectoryId: receiverDirectory.id,
|
|
581
|
-
// // Looks like receiverDirectory.wrappedItemKey has no other content in side it except a wrapped key.
|
|
582
|
-
// // So we can turn this in to a doubly wrapped key and just release the assembly key.
|
|
583
|
-
// receiverSharedKeyWrappedItemKey: wrappedItemKey, // the wrappedItemKey is already wrapped by receiverSharedKey
|
|
584
|
-
// };
|
|
585
|
-
// })
|
|
586
|
-
// );
|
|
587
|
-
// return {
|
|
588
|
-
// scenarioClaimId: sharedClaimId,
|
|
589
|
-
// receiverDirectories,
|
|
590
|
-
// };
|
|
591
|
-
// }
|
|
592
|
-
recoverAssemblyKey(approvals) {
|
|
593
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
594
|
-
const partials = yield Promise.all(approvals.map((approval) => this.keyGraph.decryptFromString(approval.pxk.id, approval.receiverCipherPartialAssemblyKey)));
|
|
595
|
-
return this.assemblyController.recoverAssemblyKey(partials);
|
|
596
|
-
});
|
|
597
|
-
}
|
|
598
|
-
asClaimApprovers(sharedScenarioId, claimId, state) {
|
|
599
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
600
|
-
const sharedScenario = (yield this.getSharedScenario(sharedScenarioId, claimId)).sharedScenario;
|
|
601
|
-
return mapEdges(sharedScenario.sharedClaim.claim.asClaimApprovers).filter((asClaimApprover) => asClaimApprover.state === state);
|
|
602
|
-
});
|
|
603
|
-
}
|
|
604
|
-
prepareApproveClaimMutations(sharedScenarioId, claimId) {
|
|
605
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
606
|
-
// The current user may be acting as approvers in multiple sub-assemblies so
|
|
607
|
-
// we approve them all.
|
|
608
|
-
const asClaimApprovers = yield this.asClaimApprovers(sharedScenarioId, claimId, TpClaimApproverState.CLAIMED);
|
|
609
|
-
return asClaimApprovers.map((asClaimApprover) => __awaiter(this, void 0, void 0, function* () {
|
|
610
|
-
return new LrMutation({
|
|
611
|
-
mutation: ApproveScenarioClaimMutation,
|
|
612
|
-
variables: {
|
|
613
|
-
input: yield this.prepareApproveClaim(asClaimApprover),
|
|
614
|
-
},
|
|
615
|
-
});
|
|
616
|
-
}));
|
|
617
|
-
});
|
|
618
|
-
}
|
|
619
|
-
prepareApproveClaim(asClaimApprover) {
|
|
620
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
621
|
-
const receiverApprovals = yield Promise.all(mapEdges(asClaimApprover.receiverApprovals).map((receiverApproval) => this.prepareReceiverApproval({
|
|
622
|
-
receiverApprovalId: receiverApproval.id,
|
|
623
|
-
receiverApprovalPxkId: receiverApproval.pxk.id,
|
|
624
|
-
sharedCipherPartialAssemblyKeyClearJson: asClaimApprover.sharedCipherPartialAssemblyKeyClearJson,
|
|
625
|
-
})));
|
|
626
|
-
return {
|
|
627
|
-
claimApproverId: asClaimApprover.id,
|
|
628
|
-
receiverApprovals,
|
|
629
|
-
};
|
|
630
|
-
});
|
|
631
|
-
}
|
|
632
|
-
prepareReceiverApproval(options) {
|
|
633
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
634
|
-
return {
|
|
635
|
-
receiverApprovalId: options.receiverApprovalId,
|
|
636
|
-
// TODO allow sending of messages to receiver.
|
|
637
|
-
receiverCipher: '',
|
|
638
|
-
receiverCipherPartialAssemblyKey: yield this.keyGraph.encryptToString(options.receiverApprovalPxkId, options.sharedCipherPartialAssemblyKeyClearJson),
|
|
639
|
-
};
|
|
640
|
-
});
|
|
641
|
-
}
|
|
642
|
-
prepareRejectClaimMutations(sharedScenarioId, claimId) {
|
|
643
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
644
|
-
// The current user may be acting as approvers in multiple sub-assemblies so
|
|
645
|
-
// we reject them all.
|
|
646
|
-
const asClaimApprovers = yield this.asClaimApprovers(sharedScenarioId, claimId, TpClaimApproverState.CLAIMED);
|
|
647
|
-
return asClaimApprovers.map((asClaimApprover) => __awaiter(this, void 0, void 0, function* () {
|
|
648
|
-
return new LrMutation({
|
|
649
|
-
mutation: RejectScenarioClaimMutation,
|
|
650
|
-
variables: {
|
|
651
|
-
input: { claimApproverId: asClaimApprover.id },
|
|
652
|
-
},
|
|
653
|
-
});
|
|
654
|
-
}));
|
|
655
|
-
});
|
|
656
|
-
}
|
|
657
|
-
};
|
|
658
|
-
ScenarioService.SLIP39_PASSPHRASE = 'lifeready';
|
|
659
|
-
ScenarioService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ScenarioService_Factory() { return new ScenarioService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.KeyGraphService), i0.ɵɵinject(i2.ItemService), i0.ɵɵinject(i3.ScenarioAssemblyController), i0.ɵɵinject(i4.EncryptionService)); }, token: ScenarioService, providedIn: "root" });
|
|
660
|
-
ScenarioService.decorators = [
|
|
661
|
-
{ type: Injectable, args: [{
|
|
662
|
-
providedIn: 'root',
|
|
663
|
-
},] }
|
|
664
|
-
];
|
|
665
|
-
ScenarioService.ctorParameters = () => [
|
|
666
|
-
{ type: NgZone },
|
|
667
|
-
{ type: Injector },
|
|
668
|
-
{ type: KeyGraphService },
|
|
669
|
-
{ type: ItemService },
|
|
670
|
-
{ type: ScenarioAssemblyController },
|
|
671
|
-
{ type: EncryptionService }
|
|
672
|
-
];
|
|
673
|
-
ScenarioService = __decorate([
|
|
674
|
-
RunOutsideAngular({
|
|
675
|
-
ngZoneName: 'ngZone',
|
|
676
|
-
})
|
|
677
|
-
], ScenarioService);
|
|
678
|
-
export { ScenarioService };
|
|
679
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmFyaW8uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9zY2VuYXJpby9zY2VuYXJpby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1RSxPQUFPLEVBQ0wsZ0JBQWdCLEVBRWhCLFFBQVEsRUFHUixhQUFhLEVBR2Isb0JBQW9CLEdBRXJCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXRFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBQ3BCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkUsT0FBTyxFQUNMLDRCQUE0QixFQUM1QiwyQkFBMkIsRUFDM0IsMkJBQTJCLEVBQzNCLHNCQUFzQixFQUN0QixnQ0FBZ0MsRUFDaEMsc0JBQXNCLEVBQ3RCLDRCQUE0QixFQUM1QiwyQkFBMkIsRUFDM0Isc0JBQXNCLEdBQ3ZCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFF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Q0YsQ0FBQztRQUNKLENBQUM7S0FBQTtJQUVhLDJCQUEyQixDQUN2QyxnQkFBd0IsRUFDeEIsT0FBZTs7WUFFZiw0RUFBNEU7WUFDNUUsc0JBQXNCO1lBQ3RCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQ2xELGdCQUFnQixFQUNoQixPQUFPLEVBQ1Asb0JBQW9CLENBQUMsT0FBTyxDQUM3QixDQUFDO1lBRUYsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLENBQ3pCLENBQU8sZUFBZSxFQUFFLEVBQUU7Z0JBQ3hCLE9BQUEsSUFBSSxVQUFVLENBQUM7b0JBQ2IsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsU0FBUyxFQUFFO3dCQUNULEtBQUssRUFBRSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUMsRUFBRSxFQUFFO3FCQUMvQztpQkFDRixDQUFDLENBQUE7Y0FBQSxDQUNMLENBQUM7UUFDSixDQUFDO0tBQUE7Q0FDRixDQUFBO0FBLzRCZSxpQ0FBaUIsR0FBRyxXQUFXLENBQUM7OztZQWQvQyxVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQXRFOEIsTUFBTTtZQUFoQixRQUFRO1lBa0JwQixlQUFlO1lBRmYsV0FBVztZQVdYLDBCQUEwQjtZQVoxQixpQkFBaUI7O0FBd0RiLGVBQWU7SUFOM0IsaUJBQWlCLENBQUM7UUFDakIsVUFBVSxFQUFFLFFBQVE7S0FDckIsQ0FBQztHQUlXLGVBQWUsQ0EwNUIzQjtTQTE1QlksZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEpXSyB9IGZyb20gJ25vZGUtam9zZSc7XG5pbXBvcnQgeyBMck1lcmdlZE11dGF0aW9uLCBMck11dGF0aW9uLCBMclNlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItZ3JhcGhxbCc7XG5pbXBvcnQge1xuICBBY2Nlc3NSb2xlQ2hvaWNlLFxuICBKU09OT2JqZWN0LFxuICBtYXBFZGdlcyxcbiAgU2NlbmFyaW9Ob2RlLFxuICBTY2VuYXJpb1JlY2VpdmVyTm9kZSxcbiAgU2NlbmFyaW9TdGF0ZSxcbiAgU2hhcmVkU2NlbmFyaW9DbGFpbVJlY2VpdmVkQXBwcm92YWxOb2RlLFxuICBTaGFyZWRUcENsYWltQXBwcm92ZXJOb2RlLFxuICBUcENsYWltQXBwcm92ZXJTdGF0ZSxcbiAgVHBOb2RlLFxufSBmcm9tICcuLi9hcGkvdHlwZXMnO1xuaW1wb3J0IHsgRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tICcuLi9lbmNyeXB0aW9uL2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJdGVtU2VydmljZSB9IGZyb20gJy4uL2l0ZW0vaXRlbS5zZXJ2aWNlJztcbmltcG9ydCB7IElkS2V5UGFpciB9IGZyb20gJy4uL2l0ZW0vaXRlbS50eXBlcyc7XG5pbXBvcnQgeyBLZXlHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9rZXkva2V5LWdyYXBoLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHBzS2V5c1F1ZXJ5IH0gZnJvbSAnLi4vdHAtYXNzZW1ibHkvdHAtYXNzZW1ibHkucHJpdmF0ZS5ncWwnO1xuaW1wb3J0IHsgUGFydGlhbEFzc2VtYmx5S2V5IH0gZnJvbSAnLi4vdHAtYXNzZW1ibHkvdHAtYXNzZW1ibHkudHlwZXMnO1xuaW1wb3J0IHtcbiAgS2NCYWRBcmd1bWVudEV4Y2VwdGlvbixcbiAgS2NCYWRTdGF0ZUV4Y2VwdGlvbixcbn0gZnJvbSAnLi4vX2NvbW1vbi9leGNlcHRpb25zJztcbmltcG9ydCB7IFJ1bk91dHNpZGVBbmd1bGFyIH0gZnJvbSAnLi4vX2NvbW1vbi9ydW4tb3V0c2lkZS1hbmd1bGFyJztcbmltcG9ydCB7IGFzc2VydEV4YWN0bHlPbmUgfSBmcm9tICcuLi9fY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IFNjZW5hcmlvQXNzZW1ibHlDb250cm9sbGVyIH0gZnJvbSAnLi9zY2VuYXJpby5jb250cm9sbGVyJztcbmltcG9ydCB7XG4gIEFwcHJvdmVTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gIENhbmNlbFNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcbiAgQ3JlYXRlU2NlbmFyaW9DbGFpbU11dGF0aW9uLFxuICBDcmVhdGVTY2VuYXJpb011dGF0aW9uLFxuICBEZWJ1Z0V4cGlyZVNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcbiAgRGVsZXRlU2NlbmFyaW9NdXRhdGlvbixcbiAgUmVjZWl2ZVNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcbiAgUmVqZWN0U2NlbmFyaW9DbGFpbU11dGF0aW9uLFxuICBVcGRhdGVTY2VuYXJpb011dGF0aW9uLFxufSBmcm9tICcuL3NjZW5hcmlvLmdxbCc7XG5pbXBvcnQgeyBTY2VuYXJpb1F1ZXJ5LCBTaGFyZWRTY2VuYXJpb1F1ZXJ5IH0gZnJvbSAnLi9zY2VuYXJpby5wcml2YXRlLmdxbCc7XG5pbXBvcnQge1xuICBDcmVhdGVDbGFpbWFudE9wdGlvbnMsXG4gIENyZWF0ZVBhcnRpY2lwYW50T3B0aW9ucyxcbiAgQ3JlYXRlUmVjZWl2ZXJPcHRpb25zLFxuICBDcmVhdGVTY2VuYXJpb09wdGlvbnMsXG4gIFBhcnRpY2lwYW50T3B0aW9ucyxcbiAgUmVjZWl2ZXJEaXJlY3RvcnlPcHRpb25zLFxuICBSZWNlaXZlckZpbGVPcHRpb25zLFxuICBSZWNlaXZlckl0ZW1PcHRpb25zLFxuICBSZXNldFNjZW5hcmlvT3B0aW9ucyxcbiAgVXBkYXRlQ2xhaW1hbnRPcHRpb25zLFxuICBVcGRhdGVSZWNlaXZlck9wdGlvbnMsXG4gIFVwZGF0ZVNjZW5hcmlvT3B0aW9ucyxcbn0gZnJvbSAnLi9zY2VuYXJpby50eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0NsYWltSWRNaXNtYXRjaCgpIHtcbiAgdGhyb3cgbmV3IEtjQmFkQXJndW1lbnRFeGNlcHRpb24oXG4gICAgJ2NsYWltSWQgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgY3VycmVudCBjbGFpbUlkIG9mIHRoZSBzY2VuYXJpbydcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRocm93Q2xhaW1Ob3RBcHByb3ZlZCgpIHtcbiAgdGhyb3cgbmV3IEtjQmFkU3RhdGVFeGNlcHRpb24oJ1NjZW5hcmlvIGNsYWltIGhhcyBub3QgYmVlbiBhcHByb3ZlZCcpO1xufVxuXG5AUnVuT3V0c2lkZUFuZ3VsYXIoe1xuICBuZ1pvbmVOYW1lOiAnbmdab25lJyxcbn0pXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2NlbmFyaW9TZXJ2aWNlIGV4dGVuZHMgTHJTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGtleUdyYXBoOiBLZXlHcmFwaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhc3NlbWJseUNvbnRyb2xsZXI6IFNjZW5hcmlvQXNzZW1ibHlDb250cm9sbGVyLFxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIFNMSVAzOV9QQVNTUEhSQVNFID0gJ2xpZmVyZWFkeSc7XG5cbiAgcHJpdmF0ZSBwcmVwYXJlQWRkUmVjZWl2ZXJEaXJlY3RvcnkgPSB0aGlzLnByZXBhcmVSZWNlaXZlckRpcmVjdG9yeTtcbiAgcHJpdmF0ZSBwcmVwYXJlVXBkYXRlUmVjZWl2ZXJEaXJlY3RvcnkgPSB0aGlzLnByZXBhcmVSZWNlaXZlckRpcmVjdG9yeTtcblxuICBwcml2YXRlIHByZXBhcmVBZGRSZWNlaXZlckZpbGUgPSB0aGlzLnByZXBhcmVSZWNlaXZlckZpbGU7XG4gIHByaXZhdGUgcHJlcGFyZVVwZGF0ZVJlY2VpdmVyRmlsZSA9IHRoaXMucHJlcGFyZVJlY2VpdmVyRmlsZTtcblxuICAvLyBTY2VuYXJpb3NcbiAgYXN5bmMgY3JlYXRlU2NlbmFyaW8ob3B0aW9uczogQ3JlYXRlU2NlbmFyaW9PcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY3JlYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTY2VuYXJpb011dGF0aW9uKG9wdGlvbnM6IENyZWF0ZVNjZW5hcmlvT3B0aW9ucykge1xuICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5wcmVwYXJlQ3JlYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zKTtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IENyZWF0ZVNjZW5hcmlvTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlU2NlbmFyaW8ob3B0aW9uczogVXBkYXRlU2NlbmFyaW9PcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMudXBkYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVTY2VuYXJpb011dGF0aW9uKG9wdGlvbnM6IFVwZGF0ZVNjZW5hcmlvT3B0aW9ucykge1xuICAgIGNvbnN0IHNjZW5hcmlvID0gKGF3YWl0IHRoaXMuZ2V0U2NlbmFyaW8ob3B0aW9ucy5zY2VuYXJpb0lkKSkuc2NlbmFyaW87XG4gICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLnByZXBhcmVVcGRhdGVTY2VuYXJpbyhvcHRpb25zLCBzY2VuYXJpbyk7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBVcGRhdGVTY2VuYXJpb011dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0U2NlbmFyaW8ob3B0aW9uczogUmVzZXRTY2VuYXJpb09wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5yZXNldFNjZW5hcmlvTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgcmVzZXRTY2VuYXJpb011dGF0aW9uKG9wdGlvbnM6IFJlc2V0U2NlbmFyaW9PcHRpb25zKSB7XG4gICAgY29uc3Qgc2NlbmFyaW8gPSAoYXdhaXQgdGhpcy5nZXRTY2VuYXJpbyhvcHRpb25zLnNjZW5hcmlvSWQpKS5zY2VuYXJpbztcblxuICAgIGNvbnN0IHsgYXNzZW1ibHkgfSA9IHNjZW5hcmlvO1xuXG4gICAgLy8gSnVzdCBuZWVkIHRvIGRvIGFuIHVwZGF0ZSB3aXRob3V0IGNoYW5naW5nIGFwcHJvdmVycy4gVGhpcyB3aWxsIHJlY3JlYXRlXG4gICAgLy8gYWxsIGFzc2VtYmx5IGtleXMuXG4gICAgY29uc3QgdXBkYXRlU3ViQXNzZW1ibGllcyA9IG1hcEVkZ2VzKGFzc2VtYmx5LnN1YkFzc2VtYmxpZXMpLm1hcCgoc2EpID0+IHtcbiAgICAgIGNvbnN0IGFwcHJvdmVyVHBzID0gbWFwRWRnZXMoc2EuYXBwcm92ZXJzKS5tYXAoKGFwcHJvdmVyKSA9PiAoe1xuICAgICAgICB0cElkOiBhcHByb3Zlci50cC5pZCxcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHNhLmlkLFxuICAgICAgICBxdW9ydW06IHNhLnF1b3J1bSxcbiAgICAgICAgc2luZ2xlUmVqZWN0OiBzYS5zaW5nbGVSZWplY3QsXG4gICAgICAgIHN1YmplY3RDaXBoZXJEYXRhQ2xlYXJKc29uOiBzYS5zdWJqZWN0Q2lwaGVyRGF0YUNsZWFySnNvbixcbiAgICAgICAgYXBwcm92ZXJUcHMsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLnByZXBhcmVVcGRhdGVTY2VuYXJpbyhcbiAgICAgIHtcbiAgICAgICAgc2NlbmFyaW9JZDogb3B0aW9ucy5zY2VuYXJpb0lkLFxuICAgICAgICBlbmFibGVkOiBvcHRpb25zLmVuYWJsZWQsXG4gICAgICAgIHVwZGF0ZUFzc2VtYmx5OiB7XG4gICAgICAgICAgcXVvcnVtOiBhc3NlbWJseS5xdW9ydW0sXG4gICAgICAgICAgc2luZ2xlUmVqZWN0OiBhc3NlbWJseS5zaW5nbGVSZWplY3QsXG4gICAgICAgICAgdXBkYXRlU3ViQXNzZW1ibGllcyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzY2VuYXJpb1xuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFVwZGF0ZVNjZW5hcmlvTXV0YXRpb24sIC8vIHVwZGF0aW5nIHNjZW5hcmlvIHJlc2V0cyBpdFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNjZW5hcmlvKHNjZW5hcmlvSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmxyR3JhcGhRTC5sck11dGF0ZSh0aGlzLmRlbGV0ZVNjZW5hcmlvTXV0YXRpb24oc2NlbmFyaW9JZCkpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2NlbmFyaW9NdXRhdGlvbihzY2VuYXJpb0lkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IERlbGV0ZVNjZW5hcmlvTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHsgaW5wdXQ6IHsgc2NlbmFyaW9JZCB9IH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyBDbGFpbXNcbiAgYXN5bmMgY3JlYXRlQ2xhaW0oc2NlbmFyaW9JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY3JlYXRlQ2xhaW1NdXRhdGlvbihzY2VuYXJpb0lkKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDbGFpbU11dGF0aW9uKHNjZW5hcmlvSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogQ3JlYXRlU2NlbmFyaW9DbGFpbU11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7IGlucHV0OiB7IHNjZW5hcmlvSWQgfSB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY2FuY2VsQ2xhaW0oY2xhaW1JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY2FuY2VsQ2xhaW1NdXRhdGlvbihjbGFpbUlkKSk7XG4gIH1cblxuICBhc3luYyBjYW5jZWxDbGFpbU11dGF0aW9uKGNsYWltSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogQ2FuY2VsU2NlbmFyaW9DbGFpbU11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7IGlucHV0OiB7IGNsYWltSWQgfSB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVqZWN0Q2xhaW0oc2hhcmVkU2NlbmFyaW9JZDogc3RyaW5nLCBjbGFpbUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5yZWplY3RDbGFpbU11dGF0aW9uKHNoYXJlZFNjZW5hcmlvSWQsIGNsYWltSWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlamVjdENsYWltTXV0YXRpb24oc2hhcmVkU2NlbmFyaW9JZDogc3RyaW5nLCBjbGFpbUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtdXRhdGlvbnMgPSBhd2FpdCB0aGlzLnByZXBhcmVSZWplY3RDbGFpbU11dGF0aW9ucyhcbiAgICAgIHNoYXJlZFNjZW5hcmlvSWQsXG4gICAgICBjbGFpbUlkXG4gICAgKTtcbiAgICByZXR1cm4gTHJNZXJnZWRNdXRhdGlvbi5jcmVhdGUoYXdhaXQgUHJvbWlzZS5hbGwobXV0YXRpb25zKSk7XG4gIH1cblxuICBhc3luYyBhcHByb3ZlQ2xhaW0oc2hhcmVkU2NlbmFyaW9JZDogc3RyaW5nLCBzaGFyZWRDbGFpbUlkOiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPIHRoaXMgbmVlZHMgYSBjYXN0IHNvIHRoZSByZXN1bHQgaXMgbm90IEFOWS5cbiAgICByZXR1cm4gdGhpcy5tdXRhdGUoXG4gICAgICB0aGlzLmFwcHJvdmVDbGFpbU11dGF0aW9uKHNoYXJlZFNjZW5hcmlvSWQsIHNoYXJlZENsYWltSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGFwcHJvdmVDbGFpbU11dGF0aW9uKHNoYXJlZFNjZW5hcmlvSWQ6IHN0cmluZywgc2hhcmVkQ2xhaW1JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbXV0YXRpb25zID0gYXdhaXQgdGhpcy5wcmVwYXJlQXBwcm92ZUNsYWltTXV0YXRpb25zKFxuICAgICAgc2hhcmVkU2NlbmFyaW9JZCxcbiAgICAgIHNoYXJlZENsYWltSWRcbiAgICApO1xuICAgIHJldHVybiBMck1lcmdlZE11dGF0aW9uLmNyZWF0ZShhd2FpdCBQcm9taXNlLmFsbChtdXRhdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIHJlY2VpdmVDbGFpbShzY2VuYXJpb0lkOiBzdHJpbmcsIHNoYXJlZENsYWltSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnJlY2VpdmVDbGFpbTJNdXRhdGlvbihzY2VuYXJpb0lkLCBzaGFyZWRDbGFpbUlkKSk7XG4gIH1cblxuICBhc3luYyByZWNlaXZlQ2xhaW0yTXV0YXRpb24oc2NlbmFyaW9JZDogc3RyaW5nLCBzaGFyZWRDbGFpbUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFJlY2VpdmVTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IGF3YWl0IHRoaXMucHJlcGFyZVJlY2VpdmVDbGFpbTIoc2NlbmFyaW9JZCwgc2hhcmVkQ2xhaW1JZCksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVidWdFeHBpcmVDbGFpbShzY2VuYXJpb0lkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5kZWJ1Z0V4cGlyZUNsYWltTXV0YXRpb24oc2NlbmFyaW9JZCkpO1xuICB9XG5cbiAgYXN5bmMgZGVidWdFeHBpcmVDbGFpbU11dGF0aW9uKHNjZW5hcmlvSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogRGVidWdFeHBpcmVTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHsgc2NlbmFyaW9JZCB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEhlbHBlcnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHJpdmF0ZSBhc3luYyBnZXRTY2VuYXJpbyhzY2VuYXJpb0lkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSh7XG4gICAgICBxdWVyeTogU2NlbmFyaW9RdWVyeSxcbiAgICAgIHZhcmlhYmxlczogeyBzY2VuYXJpb0lkIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFNoYXJlZFNjZW5hcmlvKHNjZW5hcmlvSWQ6IHN0cmluZywgY2xhaW1JZD86IHN0cmluZykge1xuICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMucXVlcnkoe1xuICAgICAgcXVlcnk6IFNoYXJlZFNjZW5hcmlvUXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgc2NlbmFyaW9JZCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoY2xhaW1JZCAmJiByZXQuc2hhcmVkU2NlbmFyaW8uc2hhcmVkQ2xhaW0uaWQgIT09IGNsYWltSWQpIHtcbiAgICAgIHRocm93Q2xhaW1JZE1pc21hdGNoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UGFydGljaXBhbnRUcHNLZXlzKG9wdGlvbnM6IENyZWF0ZVBhcnRpY2lwYW50T3B0aW9uc1tdKSB7XG4gICAgY29uc3QgdHBJZHMgPSBvcHRpb25zLm1hcCgoeCkgPT4geC50cElkKTtcblxuICAgIC8vIFRoaXMgc2hvdWxkIGNvbnRhaW4gYWxsIHRoZSBUUHMgdGhhdCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYXNzZW1ibHkuXG4gICAgY29uc3QgdHBzID0gbWFwRWRnZXMoXG4gICAgICAoXG4gICAgICAgIGF3YWl0IHRoaXMubHJHcmFwaFFMLnF1ZXJ5KHtcbiAgICAgICAgICBxdWVyeTogVHBzS2V5c1F1ZXJ5LFxuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgaWRzOiB0cElkcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKS50cHNcbiAgICApO1xuXG4gICAgcmV0dXJuIHRwcztcbiAgfVxuXG4gIHByaXZhdGUgZmlsbFRwU2hhcmVkS2V5SWQoXG4gICAgb3B0aW9uczogQ3JlYXRlUGFydGljaXBhbnRPcHRpb25zW10sXG4gICAgdHBzOiBUcE5vZGVbXVxuICApIHtcbiAgICBvcHRpb25zLmZvckVhY2goKHBhcnRpY2lwYW50KSA9PiB7XG4gICAgICBpZiAoIXBhcnRpY2lwYW50LnRwU2hhcmVkS2V5SWQpIHtcbiAgICAgICAgY29uc3QgdHAgPSB0cHMuZmluZCgoeCkgPT4geC5pZCA9PT0gcGFydGljaXBhbnQudHBJZCk7XG4gICAgICAgIHBhcnRpY2lwYW50LnRwU2hhcmVkS2V5SWQgPVxuICAgICAgICAgIHRwLmN1cnJlbnRVc2VyU2hhcmVkS2V5LnVzZXJTaGFyZWRLZXkuc2hhcmVkS2V5LmlkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQ3JlYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zOiBDcmVhdGVTY2VuYXJpb09wdGlvbnMpIHtcbiAgICBjb25zdCB7IGFzc2VtYmx5S2V5LCBtdXRhdGlvbklucHV0OiBjcmVhdGVBc3NlbWJseSB9ID1cbiAgICAgIGF3YWl0IHRoaXMuYXNzZW1ibHlDb250cm9sbGVyLnByZXBhcmVDcmVhdGUob3B0aW9ucy5jcmVhdGVBc3NlbWJseSk7XG5cbiAgICBjb25zdCBjcmVhdGVSZWNlaXZlcnNPcHRpb25zID0gb3B0aW9ucy5jcmVhdGVSZWNlaXZlcnMgfHwgW107XG4gICAgY29uc3QgY3JlYXRlQ2xhaW1hbnRzT3B0aW9ucyA9IG9wdGlvbnMuY3JlYXRlQ2xhaW1hbnRzIHx8IFtdO1xuXG4gICAgLy8gRmV0Y2ggYWxsIHRoZSBUUHMgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXNzIGluIHRwU2hhcmVkS2V5SWRcbiAgICBjb25zdCBjcmVhdFBhcnRpY2lwYW50c09wdGlvbnMgPSBjcmVhdGVSZWNlaXZlcnNPcHRpb25zLmNvbmNhdChcbiAgICAgIGNyZWF0ZUNsYWltYW50c09wdGlvbnNcbiAgICApO1xuXG4gICAgY29uc3QgdHBzID0gYXdhaXQgdGhpcy5nZXRQYXJ0aWNpcGFudFRwc0tleXMoY3JlYXRQYXJ0aWNpcGFudHNPcHRpb25zKTtcblxuICAgIHRoaXMuZmlsbFRwU2hhcmVkS2V5SWQoY3JlYXRQYXJ0aWNpcGFudHNPcHRpb25zLCB0cHMpO1xuXG4gICAgY29uc3QgY3JlYXRlUmVjZWl2ZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjcmVhdGVSZWNlaXZlcnNPcHRpb25zLm1hcCgocmVjZWl2ZXIpID0+XG4gICAgICAgIHRoaXMucHJlcGFyZUNyZWF0ZVJlY2VpdmVyKHJlY2VpdmVyLCBhc3NlbWJseUtleSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgY3JlYXRlQ2xhaW1hbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjcmVhdGVDbGFpbWFudHNPcHRpb25zLm1hcCgoeCkgPT4gdGhpcy5wcmVwYXJlQ3JlYXRlQ2xhaW1hbnQoeCkpXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBlbmFibGVkOiBvcHRpb25zLmVuYWJsZWQsXG4gICAgICBpbmFjdGl2ZVNlY29uZHM6IG9wdGlvbnMuaW5hY3RpdmVTZWNvbmRzLFxuICAgICAgY3JlYXRlQXNzZW1ibHksXG4gICAgICBjcmVhdGVSZWNlaXZlcnMsXG4gICAgICBjcmVhdGVDbGFpbWFudHMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVVwZGF0ZVNjZW5hcmlvKFxuICAgIG9wdGlvbnM6IFVwZGF0ZVNjZW5hcmlvT3B0aW9ucyxcbiAgICBzY2VuYXJpbzogU2NlbmFyaW9Ob2RlXG4gICkge1xuICAgIGxldCBhc3NlbWJseUtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0SndrS2V5KFxuICAgICAgc2NlbmFyaW8uYXNzZW1ibHkuYXNzZW1ibHlLZXkuaWRcbiAgICApO1xuXG4gICAgY29uc3QgdXBkYXRlQXNzZW1ibHkgPSBvcHRpb25zLnVwZGF0ZUFzc2VtYmx5XG4gICAgICA/IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gQXNzZW1ibHkga2V5IGlzIGFsd2F5cyByb3RhdGVkIHdoZW4gdXBkYXRpbmcgYXNzZW1ibHkuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hc3NlbWJseUNvbnRyb2xsZXIucHJlcGFyZVVwZGF0ZShcbiAgICAgICAgICAgIG9wdGlvbnMudXBkYXRlQXNzZW1ibHksXG4gICAgICAgICAgICBzY2VuYXJpby5hc3NlbWJseVxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gVXNlIG5ldyBhc3NlbWJseSBrZXkuXG4gICAgICAgICAgYXNzZW1ibHlLZXkgPSByZXN1bHQuYXNzZW1ibHlLZXk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5tdXRhdGlvbklucHV0O1xuICAgICAgICB9KSgpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNyZWF0ZVJlY2VpdmVyc09wdGlvbnMgPSBvcHRpb25zLmNyZWF0ZVJlY2VpdmVycyB8fCBbXTtcbiAgICBjb25zdCBjcmVhdGVDbGFpbWFudHNPcHRpb25zID0gb3B0aW9ucy5jcmVhdGVDbGFpbWFudHMgfHwgW107XG5cbiAgICAvLyBGZXRjaCBhbGwgdGhlIFRQcyBzbyB3ZSBkb24ndCBoYXZlIHRvIHBhc3MgaW4gdHBTaGFyZWRLZXlJZFxuICAgIGNvbnN0IGNyZWF0UGFydGljaXBhbnRzT3B0aW9ucyA9IGNyZWF0ZVJlY2VpdmVyc09wdGlvbnMuY29uY2F0KFxuICAgICAgY3JlYXRlQ2xhaW1hbnRzT3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCB0cHMgPSBhd2FpdCB0aGlzLmdldFBhcnRpY2lwYW50VHBzS2V5cyhjcmVhdFBhcnRpY2lwYW50c09wdGlvbnMpO1xuXG4gICAgdGhpcy5maWxsVHBTaGFyZWRLZXlJZChjcmVhdFBhcnRpY2lwYW50c09wdGlvbnMsIHRwcyk7XG5cbiAgICBjb25zdCBjcmVhdGVSZWNlaXZlcnMgPVxuICAgICAgb3B0aW9ucy5jcmVhdGVSZWNlaXZlcnMgJiZcbiAgICAgIChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3B0aW9ucy5jcmVhdGVSZWNlaXZlcnMubWFwKCh4KSA9PlxuICAgICAgICAgIHRoaXMucHJlcGFyZUNyZWF0ZVJlY2VpdmVyKHgsIGFzc2VtYmx5S2V5KVxuICAgICAgICApXG4gICAgICApKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nUmVjZWl2ZXJzID0gbWFwRWRnZXMoc2NlbmFyaW8ucmVjZWl2ZXJzKTtcbiAgICBsZXQgdXBkYXRlUmVjZWl2ZXJzID0gb3B0aW9ucy51cGRhdGVSZWNlaXZlcnNcbiAgICAgID8gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgb3B0aW9ucy51cGRhdGVSZWNlaXZlcnMubWFwKCh1cGRhdGVSZWNlaXZlcikgPT4ge1xuICAgICAgICAgICAgLy8gRmluZCB0aGUgcmVjZWl2ZXIgd2UgYXJlIHVwZGF0aW5nXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ1JlY2VpdmVyID0gZXhpc3RpbmdSZWNlaXZlcnMuZmluZChcbiAgICAgICAgICAgICAgKHgpID0+IHgudHAuaWQgPT09IHVwZGF0ZVJlY2VpdmVyLnRwSWRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVVcGRhdGVSZWNlaXZlcihcbiAgICAgICAgICAgICAgdXBkYXRlUmVjZWl2ZXIsXG4gICAgICAgICAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgICAgICAgICBleGlzdGluZ1JlY2VpdmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIDogW107XG5cbiAgICAvLyBGaWxsIGluIGFueSBtaXNzaW5nIHJlY2VpdmVycyB3aGVuIHVwZGF0aW5nIGFzc2VtYmx5LlxuICAgIGlmIChvcHRpb25zLnVwZGF0ZUFzc2VtYmx5KSB7XG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSByZWNlaXZlcnMgdGhhdCB3aWxsIGJlIGRlbGV0ZWQgb3IgYWxyZWFkeSB1cGRhdGVkLlxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBleGlzdGluZ1JlY2VpdmVycy5maWx0ZXIoXG4gICAgICAgIChleGlzdGluZ1JlY2VpdmVyKSA9PlxuICAgICAgICAgICEob3B0aW9ucy5kZWxldGVSZWNlaXZlcnMgfHwgW10pLmluY2x1ZGVzKGV4aXN0aW5nUmVjZWl2ZXIudHAuaWQpICYmXG4gICAgICAgICAgIXVwZGF0ZVJlY2VpdmVycy5zb21lKFxuICAgICAgICAgICAgKHVwZGF0ZVJlY2VpdmVyKSA9PiB1cGRhdGVSZWNlaXZlci50cElkID09PSBleGlzdGluZ1JlY2VpdmVyLnRwLmlkXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHVwZGF0ZVJlY2VpdmVycyA9IHVwZGF0ZVJlY2VpdmVycy5jb25jYXQoXG4gICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZUV4aXN0aW5nUmVjZWl2ZXJzKGV4aXN0aW5nLCBhc3NlbWJseUtleSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlQ2xhaW1hbnRzID1cbiAgICAgIG9wdGlvbnMuY3JlYXRlQ2xhaW1hbnRzICYmXG4gICAgICAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wdGlvbnMuY3JlYXRlQ2xhaW1hbnRzLm1hcCgoeCkgPT4gdGhpcy5wcmVwYXJlQ3JlYXRlQ2xhaW1hbnQoeCkpXG4gICAgICApKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nQ2xhaW1hbnRzID0gbWFwRWRnZXMoc2NlbmFyaW8uY2xhaW1hbnRzKTtcbiAgICBjb25zdCB1cGRhdGVDbGFpbWFudHMgPVxuICAgICAgb3B0aW9ucy51cGRhdGVDbGFpbWFudHMgJiZcbiAgICAgIChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3B0aW9ucy51cGRhdGVDbGFpbWFudHMubWFwKCh4KSA9PiB7XG4gICAgICAgICAgLy8gRmluZCB0aGUgY2xhaW1hbnQgd2UgYXJlIHVwZGF0aW5nXG4gICAgICAgICAgY29uc3QgY2xhaW1hbnQgPSBleGlzdGluZ0NsYWltYW50cy5maW5kKFxuICAgICAgICAgICAgKGV4aXN0aW5nQ2xhaW1hbnQpID0+IGV4aXN0aW5nQ2xhaW1hbnQudHAuaWQgPT09IHgudHBJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVVwZGF0ZUNsYWltYW50KHgsIGNsYWltYW50LnNoYXJlZEtleS5pZCk7XG4gICAgICAgIH0pXG4gICAgICApKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzY2VuYXJpb0lkOiBvcHRpb25zLnNjZW5hcmlvSWQsXG4gICAgICBlbmFibGVkOiBvcHRpb25zLmVuYWJsZWQsXG4gICAgICBpbmFjdGl2ZVNlY29uZHM6IG9wdGlvbnMuaW5hY3RpdmVTZWNvbmRzLFxuICAgICAgdXBkYXRlQXNzZW1ibHksXG4gICAgICBjcmVhdGVSZWNlaXZlcnMsXG4gICAgICB1cGRhdGVSZWNlaXZlcnMsXG4gICAgICBkZWxldGVSZWNlaXZlcnM6IG9wdGlvbnMuZGVsZXRlUmVjZWl2ZXJzLFxuICAgICAgY3JlYXRlQ2xhaW1hbnRzLFxuICAgICAgdXBkYXRlQ2xhaW1hbnRzLFxuICAgICAgZGVsZXRlQ2xhaW1hbnRzOiBvcHRpb25zLmRlbGV0ZUNsYWltYW50cyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlUmVjZWl2ZXJJdGVtKG9wdGlvbnM6IHtcbiAgICByZWNlaXZlckl0ZW1PcHRpb25zOiBSZWNlaXZlckl0ZW1PcHRpb25zO1xuICAgIHJlY2VpdmVyU2hhcmVkS2V5OiBKV0suS2V5O1xuICAgIGFzc2VtYmx5S2V5OiBKV0suS2V5O1xuICAgIGRpcmVjdG9yeT86IElkS2V5UGFpcjtcbiAgICBmaWxlPzogSWRLZXlQYWlyO1xuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgcmVjZWl2ZXJJdGVtT3B0aW9ucyxcbiAgICAgIHJlY2VpdmVyU2hhcmVkS2V5LFxuICAgICAgYXNzZW1ibHlLZXksXG4gICAgICBkaXJlY3RvcnksXG4gICAgICBmaWxlLFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgYXNzZXJ0RXhhY3RseU9uZSh7IGRpcmVjdG9yeSwgZmlsZSB9KTtcblxuICAgIGNvbnN0IHsgYWNjZXNzUm9sZSB9ID0gcmVjZWl2ZXJJdGVtT3B0aW9ucztcblxuICAgIGlmIChhY2Nlc3NSb2xlID09IEFjY2Vzc1JvbGVDaG9pY2UuREVOWSkge1xuICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICBhY2Nlc3NSb2xlLFxuICAgICAgICBpdGVtS2V5SWQ6IG51bGwsXG4gICAgICAgIHdyYXBwZWRJdGVtS2V5OiBudWxsLFxuICAgICAgICBzaGFyZWRDaXBoZXJEYXRhOiBudWxsLFxuICAgICAgfTtcblxuICAgICAgaWYgKGRpcmVjdG9yeSkge1xuICAgICAgICAvLyBDcnlwdG9ncmFwaGljIGFjY2VzcyB0byBpdGVtIGlzIG5vdCByZXF1aXJlZC5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXQsXG4gICAgICAgICAgZGlyZWN0b3J5SWQ6IGRpcmVjdG9yeS5pZCxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmV0LFxuICAgICAgICAgIGZpbGVJZDogZmlsZS5pZCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyB0aGlzIHNob3VsZCBiZSBiYXRjaGVkXG4gICAgICBsZXQgaXRlbUtleTtcbiAgICAgIGlmIChkaXJlY3RvcnkpIHtcbiAgICAgICAgaXRlbUtleSA9IGF3YWl0IHRoaXMuaXRlbVNlcnZpY2UuZ2V0RGlyZWN0b3J5S2V5KFxuICAgICAgICAgIGRpcmVjdG9yeS5pZCxcbiAgICAgICAgICBkaXJlY3Rvcnkua2V5SWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1LZXkgPSBhd2FpdCB0aGlzLml0ZW1TZXJ2aWNlLmdldEZpbGVLZXkoZmlsZS5pZCwgZmlsZS5rZXlJZCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB3cmFwcGVkSXRlbUtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgICByZWNlaXZlclNoYXJlZEtleSxcbiAgICAgICAgaXRlbUtleS5qd2sudG9KU09OKHRydWUpXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICAgIHJlY2VpdmVyU2hhcmVkS2V5LFxuICAgICAgICByZWNlaXZlckl0ZW1PcHRpb25zLnNoYXJlZENpcGhlckRhdGFDbGVhckpzb24gfHwgJydcbiAgICAgICk7XG5cbiAgICAgIHdyYXBwZWRJdGVtS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgICB3cmFwcGVkSXRlbUtleVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICBhY2Nlc3NSb2xlLFxuICAgICAgICBpdGVtS2V5SWQ6IGl0ZW1LZXkuaWQsXG4gICAgICAgIHdyYXBwZWRJdGVtS2V5LFxuICAgICAgICBzaGFyZWRDaXBoZXJEYXRhLFxuICAgICAgfTtcblxuICAgICAgaWYgKGRpcmVjdG9yeSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJldCxcbiAgICAgICAgICBkaXJlY3RvcnlJZDogZGlyZWN0b3J5LmlkLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXQsXG4gICAgICAgICAgZmlsZUlkOiBmaWxlLmlkLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVJlY2VpdmVyRGlyZWN0b3J5KFxuICAgIG9wdGlvbnM6IFJlY2VpdmVyRGlyZWN0b3J5T3B0aW9ucyxcbiAgICByZWNlaXZlclNoYXJlZEtleTogSldLLktleSxcbiAgICBhc3NlbWJseUtleTogSldLLktleVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlUmVjZWl2ZXJJdGVtKHtcbiAgICAgIHJlY2VpdmVySXRlbU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICByZWNlaXZlclNoYXJlZEtleSxcbiAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgZGlyZWN0b3J5OiB7XG4gICAgICAgIGlkOiBvcHRpb25zLmRpcmVjdG9yeUlkLFxuICAgICAgICBrZXlJZDogb3B0aW9ucy5kaXJlY3RvcnlLZXlJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVSZWNlaXZlckZpbGUoXG4gICAgb3B0aW9uczogUmVjZWl2ZXJGaWxlT3B0aW9ucyxcbiAgICByZWNlaXZlclNoYXJlZEtleTogSldLLktleSxcbiAgICBhc3NlbWJseUtleTogSldLLktleVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlUmVjZWl2ZXJJdGVtKHtcbiAgICAgIHJlY2VpdmVySXRlbU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICByZWNlaXZlclNoYXJlZEtleSxcbiAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgZmlsZToge1xuICAgICAgICBpZDogb3B0aW9ucy5maWxlSWQsXG4gICAgICAgIGtleUlkOiBvcHRpb25zLmZpbGVLZXlJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVDcmVhdGVSZWNlaXZlcihcbiAgICBvcHRpb25zOiBDcmVhdGVSZWNlaXZlck9wdGlvbnMsXG4gICAgYXNzZW1ibHlLZXk6IEpXSy5LZXlcbiAgKSB7XG4gICAgY29uc3QgeyBzaGFyZWRLZXksIG11dGF0aW9uSW5wdXQgfSA9IGF3YWl0IHRoaXMucHJlcGFyZUNyZWF0ZVBhcnRpY2lwYW50KFxuICAgICAgb3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCBhZGREaXJlY3RvcmllcyA9XG4gICAgICBvcHRpb25zLmFkZERpcmVjdG9yaWVzICYmXG4gICAgICAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wdGlvbnMuYWRkRGlyZWN0b3JpZXMubWFwKCh4KSA9PlxuICAgICAgICAgIHRoaXMucHJlcGFyZUFkZFJlY2VpdmVyRGlyZWN0b3J5KHgsIHNoYXJlZEtleS5rZXksIGFzc2VtYmx5S2V5KVxuICAgICAgICApXG4gICAgICApKTtcblxuICAgIGNvbnN0IGFkZEZpbGVzID1cbiAgICAgIG9wdGlvbnMuYWRkRmlsZXMgJiZcbiAgICAgIChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3B0aW9ucy5hZGRGaWxlcy5tYXAoKHgpID0+XG4gICAgICAgICAgdGhpcy5wcmVwYXJlQWRkUmVjZWl2ZXJGaWxlKHgsIHNoYXJlZEtleS5rZXksIGFzc2VtYmx5S2V5KVxuICAgICAgICApXG4gICAgICApKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5tdXRhdGlvbklucHV0LFxuICAgICAgYWRkRGlyZWN0b3JpZXMsXG4gICAgICBhZGRGaWxlcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlVXBkYXRlUmVjZWl2ZXIoXG4gICAgb3B0aW9uczogVXBkYXRlUmVjZWl2ZXJPcHRpb25zLFxuICAgIGFzc2VtYmx5S2V5OiBKV0suS2V5LFxuICAgIGV4aXN0aW5nUmVjZWl2ZXI6IFNjZW5hcmlvUmVjZWl2ZXJOb2RlXG4gICkge1xuICAgIGNvbnN0IHNoYXJlZEtleUlkID0gZXhpc3RpbmdSZWNlaXZlci5zaGFyZWRLZXkuaWQ7XG5cbiAgICBjb25zdCBkZWxldGVEaXJlY3Rvcmllc09wdGlvbnMgPSBvcHRpb25zLmRlbGV0ZURpcmVjdG9yaWVzIHx8IFtdO1xuICAgIGNvbnN0IHVwZGF0ZURpcmVjdG9yaWVzT3B0aW9ucyA9IG9wdGlvbnMudXBkYXRlRGlyZWN0b3JpZXMgfHwgW107XG5cbiAgICBjb25zdCBkZWxldGVGaWxlc09wdGlvbnMgPSBvcHRpb25zLmRlbGV0ZUZpbGVzIHx8IFtdO1xuICAgIGNvbnN0IHVwZGF0ZUZpbGVzT3B0aW9ucyA9IG9wdGlvbnMudXBkYXRlRmlsZXMgfHwgW107XG5cbiAgICAvLyBGaWxsIGluIGFueSBtaXNzaW5nIHVwZGF0ZSBkaXJlY3Rvcmllc1xuICAgIG1hcEVkZ2VzKGV4aXN0aW5nUmVjZWl2ZXIucmVjZWl2ZXJJdGVtcy5yZWNlaXZlckRpcmVjdG9yaWVzKS5mb3JFYWNoKFxuICAgICAgKGV4aXN0aW5nRGlyZWN0b3J5KSA9PiB7XG4gICAgICAgIGlmIChkZWxldGVEaXJlY3Rvcmllc09wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdEaXJlY3RvcnkuZGlyZWN0b3J5LmlkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB1cGRhdGVEaXJlY3Rvcmllc09wdGlvbnMuZmluZChcbiAgICAgICAgICAgICh4KSA9PiB4LmRpcmVjdG9yeUlkID09PSBleGlzdGluZ0RpcmVjdG9yeS5kaXJlY3RvcnkuaWRcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZURpcmVjdG9yaWVzT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICBhY2Nlc3NSb2xlOiBleGlzdGluZ0RpcmVjdG9yeS5hY2Nlc3NSb2xlLFxuICAgICAgICAgIGRpcmVjdG9yeUlkOiBleGlzdGluZ0RpcmVjdG9yeS5kaXJlY3RvcnkuaWQsXG4gICAgICAgICAgZGlyZWN0b3J5S2V5SWQ6IGV4aXN0aW5nRGlyZWN0b3J5LmRpcmVjdG9yeS5rZXlJZCxcbiAgICAgICAgICBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uOlxuICAgICAgICAgICAgZXhpc3RpbmdEaXJlY3Rvcnkuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEZpbGwgaW4gYW55IG1pc3NpbmcgdXBkYXRlIGZpbGVzXG4gICAgbWFwRWRnZXMoZXhpc3RpbmdSZWNlaXZlci5yZWNlaXZlckl0ZW1zLnJlY2VpdmVyRmlsZXMpLmZvckVhY2goXG4gICAgICAoZXhpc3RpbmdGaWxlKSA9PiB7XG4gICAgICAgIGlmIChkZWxldGVGaWxlc09wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdGaWxlLmZpbGUuaWQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwZGF0ZUZpbGVzT3B0aW9ucy5maW5kKCh4KSA9PiB4LmZpbGVJZCA9PT0gZXhpc3RpbmdGaWxlLmZpbGUuaWQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlRmlsZXNPcHRpb25zLnB1c2goe1xuICAgICAgICAgIGFjY2Vzc1JvbGU6IGV4aXN0aW5nRmlsZS5hY2Nlc3NSb2xlLFxuICAgICAgICAgIGZpbGVJZDogZXhpc3RpbmdGaWxlLmZpbGUuaWQsXG4gICAgICAgICAgZmlsZUtleUlkOiBleGlzdGluZ0ZpbGUuZmlsZS5rZXlJZCxcbiAgICAgICAgICBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uOiBleGlzdGluZ0ZpbGUuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHsgc2hhcmVkS2V5LCBtdXRhdGlvbklucHV0IH0gPSBhd2FpdCB0aGlzLnByZXBhcmVVcGRhdGVQYXJ0aWNpcGFudChcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzaGFyZWRLZXlJZFxuICAgICk7XG5cbiAgICBjb25zdCBhZGREaXJlY3RvcmllcyA9XG4gICAgICBvcHRpb25zLmFkZERpcmVjdG9yaWVzICYmXG4gICAgICAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wdGlvbnMuYWRkRGlyZWN0b3JpZXMubWFwKCh4KSA9PlxuICAgICAgICAgIHRoaXMucHJlcGFyZUFkZFJlY2VpdmVyRGlyZWN0b3J5KHgsIHNoYXJlZEtleSwgYXNzZW1ibHlLZXkpXG4gICAgICAgIClcbiAgICAgICkpO1xuXG4gICAgY29uc3QgYWRkRmlsZXMgPVxuICAgICAgb3B0aW9ucy5hZGRGaWxlcyAmJlxuICAgICAgKGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBvcHRpb25zLmFkZEZpbGVzLm1hcCgoeCkgPT5cbiAgICAgICAgICB0aGlzLnByZXBhcmVBZGRSZWNlaXZlckZpbGUoeCwgc2hhcmVkS2V5LCBhc3NlbWJseUtleSlcbiAgICAgICAgKVxuICAgICAgKSk7XG5cbiAgICBjb25zdCB1cGRhdGVEaXJlY3RvcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdXBkYXRlRGlyZWN0b3JpZXNPcHRpb25zLm1hcCgoeCkgPT5cbiAgICAgICAgdGhpcy5wcmVwYXJlVXBkYXRlUmVjZWl2ZXJEaXJlY3RvcnkoeCwgc2hhcmVkS2V5LCBhc3NlbWJseUtleSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgdXBkYXRlRmlsZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHVwZGF0ZUZpbGVzT3B0aW9ucy5tYXAoKHgpID0+XG4gICAgICAgIHRoaXMucHJlcGFyZVVwZGF0ZVJlY2VpdmVyRmlsZSh4LCBzaGFyZWRLZXksIGFzc2VtYmx5S2V5KVxuICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubXV0YXRpb25JbnB1dCxcbiAgICAgIGFkZERpcmVjdG9yaWVzLFxuICAgICAgYWRkRmlsZXMsXG4gICAgICB1cGRhdGVEaXJlY3RvcmllcyxcbiAgICAgIHVwZGF0ZUZpbGVzLFxuICAgICAgZGVsZXRlRGlyZWN0b3JpZXM6IG9wdGlvbnMuZGVsZXRlRGlyZWN0b3JpZXMsXG4gICAgICBkZWxldGVGaWxlczogb3B0aW9ucy5kZWxldGVGaWxlcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlRXhpc3RpbmdSZWNlaXZlcihcbiAgICBleGlzdGluZ1JlY2VpdmVyOiBTY2VuYXJpb1JlY2VpdmVyTm9kZSxcbiAgICBhc3NlbWJseUtleTogSldLLktleVxuICApIHtcbiAgICBjb25zdCB1cGRhdGVEaXJlY3RvcmllcyA9IG1hcEVkZ2VzKFxuICAgICAgZXhpc3RpbmdSZWNlaXZlci5yZWNlaXZlckl0ZW1zLnJlY2VpdmVyRGlyZWN0b3JpZXNcbiAgICApLm1hcCgoeyBhY2Nlc3NSb2xlLCBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uLCBkaXJlY3RvcnkgfSkgPT4gKHtcbiAgICAgIGFjY2Vzc1JvbGUsXG4gICAgICBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uLFxuICAgICAgZGlyZWN0b3J5SWQ6IGRpcmVjdG9yeS5pZCxcbiAgICAgIGRpcmVjdG9yeUtleUlkOiBkaXJlY3Rvcnkua2V5SWQsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgdXBkYXRlRmlsZXMgPSBtYXBFZGdlcyhcbiAgICAgIGV4aXN0aW5nUmVjZWl2ZXIucmVjZWl2ZXJJdGVtcy5yZWNlaXZlckZpbGVzXG4gICAgKS5tYXAoKHsgYWNjZXNzUm9sZSwgc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbiwgZmlsZSB9KSA9PiAoe1xuICAgICAgYWNjZXNzUm9sZSxcbiAgICAgIHNoYXJlZENpcGhlckRhdGFDbGVhckpzb24sXG4gICAgICBmaWxlSWQ6IGZpbGUuaWQsXG4gICAgICBmaWxlS2V5SWQ6IGZpbGUua2V5SWQsXG4gICAgfSkpO1xuXG4gICAgLy8gRmlsbCBpdCBpbiB3aXRoIGV4aXN0aW5nIHJlY2VpdmVyLlxuICAgIHJldHVybiB0aGlzLnByZXBhcmVVcGRhdGVSZWNlaXZlcihcbiAgICAgIHtcbiAgICAgICAgdHBJZDogZXhpc3RpbmdSZWNlaXZlci50cC5pZCxcbiAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbjogZXhpc3RpbmdSZWNlaXZlci5zaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uLFxuICAgICAgICB1cGRhdGVEaXJlY3RvcmllcyxcbiAgICAgICAgdXBkYXRlRmlsZXMsXG4gICAgICB9LFxuICAgICAgYXNzZW1ibHlLZXksXG4gICAgICBleGlzdGluZ1JlY2VpdmVyXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUV4aXN0aW5nUmVjZWl2ZXJzKFxuICAgIGV4aXN0aW5nUmVjZWl2ZXJzOiBTY2VuYXJpb1JlY2VpdmVyTm9kZVtdLFxuICAgIGFzc2VtYmx5S2V5OiBKV0suS2V5XG4gICkge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGV4aXN0aW5nUmVjZWl2ZXJzLm1hcCgoZXhpc3RpbmdSZWNlaXZlcikgPT5cbiAgICAgICAgdGhpcy5wcmVwYXJlRXhpc3RpbmdSZWNlaXZlcihleGlzdGluZ1JlY2VpdmVyLCBhc3NlbWJseUtleSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQ3JlYXRlUGFydGljaXBhbnQob3B0aW9uczogQ3JlYXRlUGFydGljaXBhbnRPcHRpb25zKSB7XG4gICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0V2l0aE5ld0tleShcbiAgICAgIG9wdGlvbnMudHBTaGFyZWRLZXlJZCxcbiAgICAgIG9wdGlvbnMuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbiB8fCAnJ1xuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXJlZEtleSxcbiAgICAgIG11dGF0aW9uSW5wdXQ6IHtcbiAgICAgICAgdHBJZDogb3B0aW9ucy50cElkLFxuICAgICAgICB0cFNoYXJlZEtleUlkOiBvcHRpb25zLnRwU2hhcmVkS2V5SWQsXG4gICAgICAgIHRwU2hhcmVkS2V5V3JhcHBlZFNoYXJlZEtleTogc2hhcmVkS2V5LndyYXBwZWRLZXksXG4gICAgICAgIHNoYXJlZENpcGhlckRhdGE6IHNoYXJlZEtleS5jaXBoZXIsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVVcGRhdGVQYXJ0aWNpcGFudChcbiAgICBvcHRpb25zOiBQYXJ0aWNpcGFudE9wdGlvbnMsXG4gICAgc2hhcmVkS2V5SWQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBzaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShzaGFyZWRLZXlJZCk7XG5cbiAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBzaGFyZWRLZXksXG4gICAgICBvcHRpb25zLnNoYXJlZENpcGhlckRhdGFDbGVhckpzb24gfHwgJydcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXJlZEtleSxcbiAgICAgIG11dGF0aW9uSW5wdXQ6IHtcbiAgICAgICAgdHBJZDogb3B0aW9ucy50cElkLFxuICAgICAgICBzaGFyZWRLZXlJZCxcbiAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUNyZWF0ZUNsYWltYW50KG9wdGlvbnM6IENyZWF0ZUNsYWltYW50T3B0aW9ucykge1xuICAgIGNvbnN0IHsgbXV0YXRpb25JbnB1dCB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlQ3JlYXRlUGFydGljaXBhbnQob3B0aW9ucyk7XG4gICAgcmV0dXJuIG11dGF0aW9uSW5wdXQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVVcGRhdGVDbGFpbWFudChcbiAgICBvcHRpb25zOiBVcGRhdGVDbGFpbWFudE9wdGlvbnMsXG4gICAgc2hhcmVkS2V5SWQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCB7IG11dGF0aW9uSW5wdXQgfSA9IGF3YWl0IHRoaXMucHJlcGFyZVVwZGF0ZVBhcnRpY2lwYW50KFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHNoYXJlZEtleUlkXG4gICAgKTtcblxuICAgIHJldHVybiBtdXRhdGlvbklucHV0O1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVJlY2VpdmVDbGFpbTIoc2NlbmFyaW9JZDogc3RyaW5nLCBzaGFyZWRDbGFpbUlkOiBzdHJpbmcpIHtcbiAgICAvLyBHZXQgYWxsIHRoZSBzaGFyZWQgaXRlbXNcbiAgICBjb25zdCBzaGFyZWRTY2VuYXJpbyA9IChcbiAgICAgIGF3YWl0IHRoaXMuZ2V0U2hhcmVkU2NlbmFyaW8oc2NlbmFyaW9JZCwgc2hhcmVkQ2xhaW1JZClcbiAgICApLnNoYXJlZFNjZW5hcmlvO1xuXG4gICAgaWYgKHNoYXJlZFNjZW5hcmlvLnN0YXRlICE9PSBTY2VuYXJpb1N0YXRlLkFQUFJPVkVEKSB7XG4gICAgICB0aHJvd0NsYWltTm90QXBwcm92ZWQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHByb3ZhbHMgPSBtYXBFZGdlcyhcbiAgICAgIHNoYXJlZFNjZW5hcmlvLnNoYXJlZENsYWltLmFzQ2xhaW1SZWNlaXZlci5hcHByb3ZhbHNcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZW1ibHlLZXkgPSBhd2FpdCB0aGlzLnJlY292ZXJBc3NlbWJseUtleShhcHByb3ZhbHMpO1xuXG4gICAgLy8gV3JhcCBhc3NlbWJseSBrZXkgd2l0aCBzaGFyZWQga2V5LlxuICAgIC8vPz8/XG4gICAgLy8gVGhpcyBzaGFyZWRLZXkgaXMgY3JlYXRlZCBqdXN0IGZvciB0aGlzIHNjZW5hcmlvLiBJdCdzIHdyYXBwZWQgYnkgdGhlIHRwU2hhcmVkS2V5LlxuICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KFxuICAgICAgc2hhcmVkU2NlbmFyaW8uYXNSZWNlaXZlci5zaGFyZWRLZXkuaWRcbiAgICApO1xuXG4gICAgY29uc3Qgc2hhcmVkS2V5V3JhcHBlZEFzc2VtYmx5S2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBzaGFyZWRLZXksXG4gICAgICBhc3NlbWJseUtleS50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNjZW5hcmlvQ2xhaW1JZDogc2hhcmVkQ2xhaW1JZCxcbiAgICAgIHNoYXJlZEtleVdyYXBwZWRBc3NlbWJseUtleSxcbiAgICAgIHNoYXJlZEtleUlkOiBzaGFyZWRLZXkuaWQsXG4gICAgICBhc3NlbWJseUtleUlkOiBzaGFyZWRTY2VuYXJpby5zaGFyZWRDbGFpbS5hc0NsYWltUmVjZWl2ZXIuYXNzZW1ibHlLZXlJZCxcbiAgICB9O1xuICB9XG5cbiAgLy8gYXN5bmMgcHJlcGFyZVJlY2VpdmVDbGFpbShzY2VuYXJpb0lkOiBzdHJpbmcsIHNoYXJlZENsYWltSWQ6IHN0cmluZykge1xuICAvLyAgIC8vIEdldCBhbGwgdGhlIHNoYXJlZCBpdGVtc1xuICAvLyAgIGNvbnN0IHNoYXJlZFNjZW5hcmlvID0gKFxuICAvLyAgICAgYXdhaXQgdGhpcy5nZXRTaGFyZWRTY2VuYXJpbyhzY2VuYXJpb0lkLCBzaGFyZWRDbGFpbUlkKVxuICAvLyAgICkuc2hhcmVkU2NlbmFyaW87XG5cbiAgLy8gICBpZiAoc2hhcmVkU2NlbmFyaW8uc3RhdGUgIT09IFNjZW5hcmlvU3RhdGUuQVBQUk9WRUQpIHtcbiAgLy8gICAgIHRocm93Q2xhaW1Ob3RBcHByb3ZlZCgpO1xuICAvLyAgIH1cblxuICAvLyAgIGNvbnN0IGFwcHJvdmFscyA9IG1hcEVkZ2VzKFxuICAvLyAgICAgc2hhcmVkU2NlbmFyaW8uc2hhcmVkQ2xhaW0uYXNDbGFpbVJlY2VpdmVyLmFwcHJvdmFsc1xuICAvLyAgICk7XG5cbiAgLy8gICBjb25zdCBhc3NlbWJseUtleSA9IGF3YWl0IHRoaXMucmVjb3ZlckFzc2VtYmx5S2V5KGFwcHJvdmFscyk7XG5cbiAgLy8gICAvLyBEZWNyeXB0IGFsbCBpdGVtc1xuICAvLyAgIGNvbnN0IHJlY2VpdmVyRGlyZWN0b3JpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgLy8gICAgIHNoYXJlZFNjZW5hcmlvLmFzUmVjZWl2ZXIucmVjZWl2ZXJJdGVtcy5yZWNlaXZlckRpcmVjdG9yaWVzLmVkZ2VzXG4gIC8vICAgICAgIC5tYXAoKGVkZ2UpID0+IGVkZ2Uubm9kZSlcbiAgLy8gICAgICAgLm1hcChhc3luYyAocmVjZWl2ZXJEaXJlY3RvcnkpID0+IHtcbiAgLy8gICAgICAgICBjb25zdCB3cmFwcGVkSXRlbUtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcbiAgLy8gICAgICAgICAgIGFzc2VtYmx5S2V5LFxuICAvLyAgICAgICAgICAgcmVjZWl2ZXJEaXJlY3Rvcnkud3JhcHBlZEl0ZW1LZXlcbiAgLy8gICAgICAgICApO1xuXG4gIC8vICAgICAgICAgcmV0dXJuIHtcbiAgLy8gICAgICAgICAgIHJlY2VpdmVyRGlyZWN0b3J5SWQ6IHJlY2VpdmVyRGlyZWN0b3J5LmlkLFxuICAvLyAgICAgICAgICAgLy8gTG9va3MgbGlrZSByZWNlaXZlckRpcmVjdG9yeS53cmFwcGVkSXRlbUtleSBoYXMgbm8gb3RoZXIgY29udGVudCBpbiBzaWRlIGl0IGV4Y2VwdCBhIHdyYXBwZWQga2V5LlxuICAvLyAgICAgICAgICAgLy8gU28gd2UgY2FuIHR1cm4gdGhpcyBpbiB0byBhIGRvdWJseSB3cmFwcGVkIGtleSBhbmQganVzdCByZWxlYXNlIHRoZSBhc3NlbWJseSBrZXkuXG5cbiAgLy8gICAgICAgICAgIHJlY2VpdmVyU2hhcmVkS2V5V3JhcHBlZEl0ZW1LZXk6IHdyYXBwZWRJdGVtS2V5LCAvLyB0aGUgd3JhcHBlZEl0ZW1LZXkgaXMgYWxyZWFkeSB3cmFwcGVkIGJ5IHJlY2VpdmVyU2hhcmVkS2V5XG4gIC8vICAgICAgICAgfTtcbiAgLy8gICAgICAgfSlcbiAgLy8gICApO1xuXG4gIC8vICAgcmV0dXJuIHtcbiAgLy8gICAgIHNjZW5hcmlvQ2xhaW1JZDogc2hhcmVkQ2xhaW1JZCxcbiAgLy8gICAgIHJlY2VpdmVyRGlyZWN0b3JpZXMsXG4gIC8vICAgfTtcbiAgLy8gfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlckFzc2VtYmx5S2V5KFxuICAgIGFwcHJvdmFsczogU2hhcmVkU2NlbmFyaW9DbGFpbVJlY2VpdmVkQXBwcm92YWxOb2RlW11cbiAgKSB7XG4gICAgY29uc3QgcGFydGlhbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGFwcHJvdmFscy5tYXAoKGFwcHJvdmFsKSA9PlxuICAgICAgICB0aGlzLmtleUdyYXBoLmRlY3J5cHRGcm9tU3RyaW5nPFBhcnRpYWxBc3NlbWJseUtleT4oXG4gICAgICAgICAgYXBwcm92YWwucHhrLmlkLFxuICAgICAgICAgIGFwcHJvdmFsLnJlY2VpdmVyQ2lwaGVyUGFydGlhbEFzc2VtYmx5S2V5XG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuYXNzZW1ibHlDb250cm9sbGVyLnJlY292ZXJBc3NlbWJseUtleShwYXJ0aWFscyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFzQ2xhaW1BcHByb3ZlcnMoXG4gICAgc2hhcmVkU2NlbmFyaW9JZCxcbiAgICBjbGFpbUlkLFxuICAgIHN0YXRlOiBUcENsYWltQXBwcm92ZXJTdGF0ZVxuICApIHtcbiAgICBjb25zdCBzaGFyZWRTY2VuYXJpbyA9IChcbiAgICAgIGF3YWl0IHRoaXMuZ2V0U2hhcmVkU2NlbmFyaW8oc2hhcmVkU2NlbmFyaW9JZCwgY2xhaW1JZClcbiAgICApLnNoYXJlZFNjZW5hcmlvO1xuXG4gICAgcmV0dXJuIG1hcEVkZ2VzKHNoYXJlZFNjZW5hcmlvLnNoYXJlZENsYWltLmNsYWltLmFzQ2xhaW1BcHByb3ZlcnMpLmZpbHRlcihcbiAgICAgIChhc0NsYWltQXBwcm92ZXIpID0+IGFzQ2xhaW1BcHByb3Zlci5zdGF0ZSA9PT0gc3RhdGVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQXBwcm92ZUNsYWltTXV0YXRpb25zKFxuICAgIHNoYXJlZFNjZW5hcmlvSWQ6IHN0cmluZyxcbiAgICBjbGFpbUlkOiBzdHJpbmdcbiAgKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgdXNlciBtYXkgYmUgYWN0aW5nIGFzIGFwcHJvdmVycyBpbiBtdWx0aXBsZSBzdWItYXNzZW1ibGllcyBzb1xuICAgIC8vIHdlIGFwcHJvdmUgdGhlbSBhbGwuXG4gICAgY29uc3QgYXNDbGFpbUFwcHJvdmVycyA9IGF3YWl0IHRoaXMuYXNDbGFpbUFwcHJvdmVycyhcbiAgICAgIHNoYXJlZFNjZW5hcmlvSWQsXG4gICAgICBjbGFpbUlkLFxuICAgICAgVHBDbGFpbUFwcHJvdmVyU3RhdGUuQ0xBSU1FRFxuICAgICk7XG5cbiAgICByZXR1cm4gYXNDbGFpbUFwcHJvdmVycy5tYXAoXG4gICAgICBhc3luYyAoYXNDbGFpbUFwcHJvdmVyKSA9PlxuICAgICAgICBuZXcgTHJNdXRhdGlvbih7XG4gICAgICAgICAgbXV0YXRpb246IEFwcHJvdmVTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBpbnB1dDogYXdhaXQgdGhpcy5wcmVwYXJlQXBwcm92ZUNsYWltKGFzQ2xhaW1BcHByb3ZlciksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQXBwcm92ZUNsYWltKFxuICAgIGFzQ2xhaW1BcHByb3ZlcjogU2hhcmVkVHBDbGFpbUFwcHJvdmVyTm9kZVxuICApIHtcbiAgICBjb25zdCByZWNlaXZlckFwcHJvdmFscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWFwRWRnZXMoYXNDbGFpbUFwcHJvdmVyLnJlY2VpdmVyQXBwcm92YWxzKS5tYXAoKHJlY2VpdmVyQXBwcm92YWwpID0+XG4gICAgICAgIHRoaXMucHJlcGFyZVJlY2VpdmVyQXBwcm92YWwoe1xuICAgICAgICAgIHJlY2VpdmVyQXBwcm92YWxJZDogcmVjZWl2ZXJBcHByb3ZhbC5pZCxcbiAgICAgICAgICByZWNlaXZlckFwcHJvdmFsUHhrSWQ6IHJlY2VpdmVyQXBwcm92YWwucHhrLmlkLFxuICAgICAgICAgIHNoYXJlZENpcGhlclBhcnRpYWxBc3NlbWJseUtleUNsZWFySnNvbjpcbiAgICAgICAgICAgIGFzQ2xhaW1BcHByb3Zlci5zaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXlDbGVhckpzb24sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjbGFpbUFwcHJvdmVySWQ6IGFzQ2xhaW1BcHByb3Zlci5pZCxcbiAgICAgIHJlY2VpdmVyQXBwcm92YWxzLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVSZWNlaXZlckFwcHJvdmFsKG9wdGlvbnM6IHtcbiAgICByZWNlaXZlckFwcHJvdmFsSWQ6IHN0cmluZztcbiAgICByZWNlaXZlckFwcHJvdmFsUHhrSWQ6IHN0cmluZztcbiAgICBzaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXlDbGVhckpzb246IEpTT05PYmplY3Q7XG4gIH0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVjZWl2ZXJBcHByb3ZhbElkOiBvcHRpb25zLnJlY2VpdmVyQXBwcm92YWxJZCxcbiAgICAgIC8vIFRPRE8gYWxsb3cgc2VuZGluZyBvZiBtZXNzYWdlcyB0byByZWNlaXZlci5cbiAgICAgIHJlY2VpdmVyQ2lwaGVyOiAnJyxcbiAgICAgIHJlY2VpdmVyQ2lwaGVyUGFydGlhbEFzc2VtYmx5S2V5OiBhd2FpdCB0aGlzLmtleUdyYXBoLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgICAgb3B0aW9ucy5yZWNlaXZlckFwcHJvdmFsUHhrSWQsXG4gICAgICAgIG9wdGlvbnMuc2hhcmVkQ2lwaGVyUGFydGlhbEFzc2VtYmx5S2V5Q2xlYXJKc29uXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVSZWplY3RDbGFpbU11dGF0aW9ucyhcbiAgICBzaGFyZWRTY2VuYXJpb0lkOiBzdHJpbmcsXG4gICAgY2xhaW1JZDogc3RyaW5nXG4gICkge1xuICAgIC8vIFRoZSBjdXJyZW50IHVzZXIgbWF5IGJlIGFjdGluZyBhcyBhcHByb3ZlcnMgaW4gbXVsdGlwbGUgc3ViLWFzc2VtYmxpZXMgc29cbiAgICAvLyB3ZSByZWplY3QgdGhlbSBhbGwuXG4gICAgY29uc3QgYXNDbGFpbUFwcHJvdmVycyA9IGF3YWl0IHRoaXMuYXNDbGFpbUFwcHJvdmVycyhcbiAgICAgIHNoYXJlZFNjZW5hcmlvSWQsXG4gICAgICBjbGFpbUlkLFxuICAgICAgVHBDbGFpbUFwcHJvdmVyU3RhdGUuQ0xBSU1FRFxuICAgICk7XG5cbiAgICByZXR1cm4gYXNDbGFpbUFwcHJvdmVycy5tYXAoXG4gICAgICBhc3luYyAoYXNDbGFpbUFwcHJvdmVyKSA9PlxuICAgICAgICBuZXcgTHJNdXRhdGlvbih7XG4gICAgICAgICAgbXV0YXRpb246IFJlamVjdFNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIGlucHV0OiB7IGNsYWltQXBwcm92ZXJJZDogYXNDbGFpbUFwcHJvdmVyLmlkIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=
|