kwikid-forms 0.0.0-watch
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 +44 -0
- package/assets/done1.png +0 -0
- package/assets/edit.png +0 -0
- package/assets/lock.png +0 -0
- package/esm2015/kwikid-forms.js +5 -0
- package/esm2015/lib/builder/builder.component.js +138 -0
- package/esm2015/lib/builder/builder.module.js +21 -0
- package/esm2015/lib/kwikid-forms.module.js +53 -0
- package/esm2015/lib/renderer/form-view/definitions/actions/form-view.actions.enum.definitions.js +16 -0
- package/esm2015/lib/renderer/form-view/definitions/actions/form-view.actions.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/apis/form-view.apis.enum.definitions.js +8 -0
- package/esm2015/lib/renderer/form-view/definitions/apis/form-view.apis.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/common/form-view.common.enum.definitions.js +47 -0
- package/esm2015/lib/renderer/form-view/definitions/common/form-view.common.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/fields/form-view.fields.enum.definitions.js +15 -0
- package/esm2015/lib/renderer/form-view/definitions/fields/form-view.fields.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/rules/form-view.rules.enum.definitions.js +7 -0
- package/esm2015/lib/renderer/form-view/definitions/rules/form-view.rules.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/sources/form-view.sources.enum.definitions.js +16 -0
- package/esm2015/lib/renderer/form-view/definitions/sources/form-view.sources.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/triggers/form-view.triggers.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/validations/form-view.validations.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/form-view.component.js +654 -0
- package/esm2015/lib/renderer/form-view/form-view.decorators.js +93 -0
- package/esm2015/lib/renderer/form-view/form-view.module.js +37 -0
- package/esm2015/lib/renderer/form-view/form-view.service.js +27 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.actions.helper.js +27 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.apis.helper.js +105 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.common.helper.js +136 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.condition.helper.js +46 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.defaults.helper.js +52 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.fields.helper.js +146 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.rules.helper.js +86 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.sources.helper.js +161 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.validations.helper.js +156 -0
- package/esm2015/lib/renderer/forms-list/forms-list.component.js +61 -0
- package/esm2015/lib/renderer/forms-list/forms-list.helper.js +4 -0
- package/esm2015/lib/renderer/forms-list/forms-list.module.js +37 -0
- package/esm2015/lib/renderer/renderer.component.js +201 -0
- package/esm2015/lib/renderer/renderer.config-converter.helper.js +530 -0
- package/esm2015/lib/renderer/renderer.helper.js +50 -0
- package/esm2015/lib/renderer/renderer.module.js +39 -0
- package/esm2015/lib/renderer/renderer.service.js +115 -0
- package/esm2015/public_api.js +17 -0
- package/fesm2015/kwikid-forms.js +2970 -0
- package/fesm2015/kwikid-forms.js.map +1 -0
- package/kwikid-forms.d.ts +5 -0
- package/lib/builder/builder.component.d.ts +68 -0
- package/lib/builder/builder.module.d.ts +10 -0
- package/lib/kwikid-forms.module.d.ts +13 -0
- package/lib/renderer/form-view/definitions/actions/form-view.actions.enum.definitions.d.ts +14 -0
- package/lib/renderer/form-view/definitions/actions/form-view.actions.type.definitions.d.ts +91 -0
- package/lib/renderer/form-view/definitions/apis/form-view.apis.enum.definitions.d.ts +6 -0
- package/lib/renderer/form-view/definitions/apis/form-view.apis.type.definitions.d.ts +40 -0
- package/lib/renderer/form-view/definitions/common/form-view.common.enum.definitions.d.ts +43 -0
- package/lib/renderer/form-view/definitions/common/form-view.common.type.definitions.d.ts +7 -0
- package/lib/renderer/form-view/definitions/fields/form-view.fields.enum.definitions.d.ts +13 -0
- package/lib/renderer/form-view/definitions/fields/form-view.fields.type.definitions.d.ts +137 -0
- package/lib/renderer/form-view/definitions/rules/form-view.rules.enum.definitions.d.ts +5 -0
- package/lib/renderer/form-view/definitions/rules/form-view.rules.type.definitions.d.ts +41 -0
- package/lib/renderer/form-view/definitions/sources/form-view.sources.enum.definitions.d.ts +13 -0
- package/lib/renderer/form-view/definitions/sources/form-view.sources.type.definitions.d.ts +16 -0
- package/lib/renderer/form-view/definitions/triggers/form-view.triggers.type.definitions.d.ts +1 -0
- package/lib/renderer/form-view/definitions/validations/form-view.validations.type.definitions.d.ts +17 -0
- package/lib/renderer/form-view/form-view.component.d.ts +66 -0
- package/lib/renderer/form-view/form-view.decorators.d.ts +7 -0
- package/lib/renderer/form-view/form-view.module.d.ts +11 -0
- package/lib/renderer/form-view/form-view.service.d.ts +5 -0
- package/lib/renderer/form-view/helpers/form-view.actions.helper.d.ts +13 -0
- package/lib/renderer/form-view/helpers/form-view.apis.helper.d.ts +17 -0
- package/lib/renderer/form-view/helpers/form-view.common.helper.d.ts +19 -0
- package/lib/renderer/form-view/helpers/form-view.condition.helper.d.ts +8 -0
- package/lib/renderer/form-view/helpers/form-view.defaults.helper.d.ts +10 -0
- package/lib/renderer/form-view/helpers/form-view.fields.helper.d.ts +20 -0
- package/lib/renderer/form-view/helpers/form-view.rules.helper.d.ts +12 -0
- package/lib/renderer/form-view/helpers/form-view.sources.helper.d.ts +29 -0
- package/lib/renderer/form-view/helpers/form-view.validations.helper.d.ts +25 -0
- package/lib/renderer/forms-list/forms-list.component.d.ts +18 -0
- package/lib/renderer/forms-list/forms-list.helper.d.ts +1 -0
- package/lib/renderer/forms-list/forms-list.module.d.ts +11 -0
- package/lib/renderer/renderer.component.d.ts +30 -0
- package/lib/renderer/renderer.config-converter.helper.d.ts +7 -0
- package/lib/renderer/renderer.helper.d.ts +6 -0
- package/lib/renderer/renderer.module.d.ts +12 -0
- package/lib/renderer/renderer.service.d.ts +27 -0
- package/package.json +47 -0
- package/public_api.d.ts +9 -0
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
import { __awaiter, __decorate } from "tslib";
|
|
2
|
+
import { Component, EventEmitter, Input, Output } from "@angular/core";
|
|
3
|
+
import { FormGroup } from "@angular/forms";
|
|
4
|
+
import { pairwise } from "rxjs/operators";
|
|
5
|
+
import { EActionKey } from "./definitions/actions/form-view.actions.enum.definitions";
|
|
6
|
+
import { EApiStatusType } from "./definitions/apis/form-view.apis.enum.definitions";
|
|
7
|
+
import { EMessageType } from "./definitions/common/form-view.common.enum.definitions";
|
|
8
|
+
import { log } from "./form-view.decorators";
|
|
9
|
+
import { KwikIDFormViewService } from "./form-view.service";
|
|
10
|
+
import { Actions } from "./helpers/form-view.actions.helper";
|
|
11
|
+
import { Apis } from "./helpers/form-view.apis.helper";
|
|
12
|
+
import { hasKey, isEmpty, isNotEmpty, isNull, setEmptyValue } from "./helpers/form-view.common.helper";
|
|
13
|
+
import { Condition } from "./helpers/form-view.condition.helper";
|
|
14
|
+
import { addMessage, findFieldFromKey, findFieldIndexFromKey, formatDateToStandardFormat, getSearchTextOptionsFromFieldConfig, getSearchTextOptionsFromRemoteFile, highlightFieldError, removeMessage, setFieldError } from "./helpers/form-view.fields.helper";
|
|
15
|
+
import { Rules } from "./helpers/form-view.rules.helper";
|
|
16
|
+
import { Sources } from "./helpers/form-view.sources.helper";
|
|
17
|
+
import { Validations } from "./helpers/form-view.validations.helper";
|
|
18
|
+
import * as i0 from "@angular/core";
|
|
19
|
+
import * as i1 from "./form-view.service";
|
|
20
|
+
import * as i2 from "kwikui";
|
|
21
|
+
import * as i3 from "@taiga-ui/core";
|
|
22
|
+
import * as i4 from "@angular/common";
|
|
23
|
+
import * as i5 from "@angular/forms";
|
|
24
|
+
export class KwikIDFormViewComponent {
|
|
25
|
+
constructor(formViewService) {
|
|
26
|
+
this.formViewService = formViewService;
|
|
27
|
+
this.componentThis = this;
|
|
28
|
+
this.apiCallResponse = {};
|
|
29
|
+
this.isMobileView = false;
|
|
30
|
+
this.onClickViewForms = new EventEmitter();
|
|
31
|
+
this.onClickSaveForm = new EventEmitter();
|
|
32
|
+
this.onClickApiCall = new EventEmitter();
|
|
33
|
+
this.getActiveFormData = new EventEmitter();
|
|
34
|
+
this.formFields = [];
|
|
35
|
+
this.previousFormData = {};
|
|
36
|
+
this.loading = true;
|
|
37
|
+
this.viewFormsButton = {
|
|
38
|
+
disabled: false,
|
|
39
|
+
showLoader: false
|
|
40
|
+
};
|
|
41
|
+
this.saveFormButton = {
|
|
42
|
+
disabled: false,
|
|
43
|
+
showLoader: false
|
|
44
|
+
};
|
|
45
|
+
this.formGroup = new FormGroup({});
|
|
46
|
+
}
|
|
47
|
+
ngOnInit() {
|
|
48
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
49
|
+
yield this.initFormConfig(this.formConfig);
|
|
50
|
+
this.loading = false;
|
|
51
|
+
}))();
|
|
52
|
+
}
|
|
53
|
+
ngAfterViewInit() { }
|
|
54
|
+
ngOnChanges(changes) {
|
|
55
|
+
const verifyChange = (key) => {
|
|
56
|
+
return hasKey(changes, key) && !changes[key].firstChange;
|
|
57
|
+
};
|
|
58
|
+
if (verifyChange("formData")) {
|
|
59
|
+
this.formData = Object.assign(Object.assign({}, this.formData), changes.formData.currentValue);
|
|
60
|
+
}
|
|
61
|
+
if (verifyChange("apiCallResponse")) {
|
|
62
|
+
this.apiCallResponse = changes.apiCallResponse.currentValue;
|
|
63
|
+
this.formData = Object.assign(Object.assign({}, this.formData), { [this.apiCallResponse.key]: this.apiCallResponse.response });
|
|
64
|
+
this.formGroup.patchValue({
|
|
65
|
+
[this.apiCallResponse.key]: this.apiCallResponse.response
|
|
66
|
+
}, { emitEvent: false });
|
|
67
|
+
let field = findFieldFromKey(this.formFields, this.apiCallResponse.key);
|
|
68
|
+
const apis = new Apis(field, this.formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this));
|
|
69
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
field = yield apis.validateApiCallResponse();
|
|
71
|
+
}))();
|
|
72
|
+
}
|
|
73
|
+
if (verifyChange("isMobileView")) {
|
|
74
|
+
this.isMobileView = changes.isMobileView.currentValue;
|
|
75
|
+
}
|
|
76
|
+
if (verifyChange("allFormsData")) {
|
|
77
|
+
this.allFormsData = changes.allFormsData.currentValue;
|
|
78
|
+
}
|
|
79
|
+
if (verifyChange("formsList")) {
|
|
80
|
+
this.formsList = changes.formsList.currentValue;
|
|
81
|
+
}
|
|
82
|
+
if (verifyChange("formConfig")) {
|
|
83
|
+
this.formConfig = changes.formConfig.currentValue;
|
|
84
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
85
|
+
yield this.initFormConfig(this.formConfig);
|
|
86
|
+
}))();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
initFormConfig(formConfig) {
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
this.setFormFieldsFromFormConfig(formConfig);
|
|
92
|
+
this.setFormDataFromAllFormsData();
|
|
93
|
+
this.formGroup = yield this.formViewService.createFormGroup(this.formFields, this.formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this));
|
|
94
|
+
for (let field of this.formFields) {
|
|
95
|
+
if (field.type !== "title") {
|
|
96
|
+
this.previousFormData = Object.assign(Object.assign({}, this.previousFormData), { [field.key]: this.formGroup.controls[field.key].value });
|
|
97
|
+
this.formGroup.controls[field.key].valueChanges
|
|
98
|
+
.pipe(pairwise())
|
|
99
|
+
.subscribe(([previousValue, currentValue]) => {
|
|
100
|
+
this.previousFormData = Object.assign(Object.assign({}, this.previousFormData), { [field.key]: previousValue });
|
|
101
|
+
this.formData = Object.assign(Object.assign({}, this.formData), { [field.key]: currentValue });
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
for (let field of this.formFields) {
|
|
106
|
+
if (field.type !== "title") {
|
|
107
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
108
|
+
field = yield this.handleConnectedElements({
|
|
109
|
+
key: field.key,
|
|
110
|
+
value: this.formGroup.controls[field.key].value
|
|
111
|
+
}, "ON_INIT");
|
|
112
|
+
}))();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
setFormFieldsFromFormConfig(formConfig) {
|
|
118
|
+
if (hasKey(formConfig, "fields")) {
|
|
119
|
+
this.formFields = formConfig.fields;
|
|
120
|
+
}
|
|
121
|
+
else if (hasKey(formConfig, "multiForm") &&
|
|
122
|
+
hasKey(formConfig.multiForm, "fields")) {
|
|
123
|
+
this.formFields = formConfig.multiForm.fields;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
setFormDataFromAllFormsData() {
|
|
127
|
+
if (hasKey(this.allFormsData, this.formConfig.key)) {
|
|
128
|
+
this.formData = this.allFormsData[this.formConfig.key];
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
this.formData = {};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
handleConnectedElementFieldActions(connectedFieldConfig, connectedField) {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
if (hasKey(connectedFieldConfig, "rules")) {
|
|
137
|
+
const rulesMapping = new Rules(connectedFieldConfig.rules, connectedField, this.formData, this.previousFormData, this.allFormsData).mapping();
|
|
138
|
+
for (let action of connectedFieldConfig.actions) {
|
|
139
|
+
const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate();
|
|
140
|
+
if (conditionSuccess) {
|
|
141
|
+
const actions = new Actions(action, connectedField, rulesMapping, this.allFormsData, this.formData, this.previousFormData, this.takeAction.bind(this));
|
|
142
|
+
yield actions.execute();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return connectedField;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
handleConnectedElementFields(currentField, connectedFieldConfig, eventType) {
|
|
150
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
151
|
+
let connectedField = findFieldFromKey(this.formFields, connectedFieldConfig["key"]);
|
|
152
|
+
switch (eventType) {
|
|
153
|
+
case "INIT":
|
|
154
|
+
if (hasKey(connectedField, "triggers") &&
|
|
155
|
+
connectedField.triggers.includes("INIT")) {
|
|
156
|
+
if (this.isFieldEnabled(connectedField.key)) {
|
|
157
|
+
if (hasKey(connectedFieldConfig, "connectedParentFields")) {
|
|
158
|
+
switch (connectedFieldConfig.type) {
|
|
159
|
+
case "dropdown-with-search":
|
|
160
|
+
connectedField = yield this.handleFieldTypeSearchText(currentField, connectedField);
|
|
161
|
+
break;
|
|
162
|
+
default:
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
connectedField = yield this.handleConnectedElementFieldActions(connectedFieldConfig, connectedField);
|
|
168
|
+
}
|
|
169
|
+
break;
|
|
170
|
+
case "VALUE_CHANGE":
|
|
171
|
+
if (hasKey(connectedFieldConfig, "triggers") &&
|
|
172
|
+
connectedFieldConfig.triggers.includes("VALUE_CHANGE")) {
|
|
173
|
+
switch (connectedField.type) {
|
|
174
|
+
case "dropdown-with-search":
|
|
175
|
+
connectedField = yield this.handleFieldTypeSearchText(currentField, connectedField);
|
|
176
|
+
break;
|
|
177
|
+
default:
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
connectedField = yield this.handleConnectedElementFieldActions(connectedFieldConfig, connectedField);
|
|
181
|
+
}
|
|
182
|
+
break;
|
|
183
|
+
case "NESTED_LINK":
|
|
184
|
+
if (hasKey(connectedFieldConfig, "triggers") &&
|
|
185
|
+
connectedFieldConfig.triggers.includes("NESTED_LINK")) {
|
|
186
|
+
connectedField = yield this.handleConnectedElementFieldActions(connectedFieldConfig, connectedField);
|
|
187
|
+
}
|
|
188
|
+
default:
|
|
189
|
+
if (hasKey(connectedFieldConfig, "triggers")) {
|
|
190
|
+
connectedField = yield this.handleConnectedElementFieldActions(connectedFieldConfig, connectedField);
|
|
191
|
+
}
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
if (hasKey(connectedField, "connectedElements")) {
|
|
195
|
+
for (const connectedFieldConfig of connectedField.connectedElements
|
|
196
|
+
.fields) {
|
|
197
|
+
connectedField = this.handleConnectedElementFields(connectedField, connectedFieldConfig, "NESTED_LINK");
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return currentField;
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
handleConnectedElements(e, eventType) {
|
|
204
|
+
let currentField = findFieldFromKey(this.formFields, e.key);
|
|
205
|
+
if (hasKey(currentField, "connectedElements")) {
|
|
206
|
+
let connectedFields = currentField.connectedElements.connectedFields;
|
|
207
|
+
for (let connectedFieldConfig of connectedFields) {
|
|
208
|
+
currentField = this.handleConnectedElementFields(currentField, connectedFieldConfig, eventType);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// DOM Event Handlers
|
|
213
|
+
handleGetKeyValue(e) {
|
|
214
|
+
this.formGroup.patchValue({
|
|
215
|
+
[e.key]: e.value
|
|
216
|
+
}, { emitEvent: false });
|
|
217
|
+
// Currently set only for dropdown-with-search connected fields
|
|
218
|
+
let field = findFieldFromKey(this.formFields, e.key);
|
|
219
|
+
if (field.type !== "title" &&
|
|
220
|
+
field.validation.triggers.includes("ON_CHANGE")) {
|
|
221
|
+
const validations = new Validations(field, this.formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this));
|
|
222
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
223
|
+
yield validations.validateField();
|
|
224
|
+
}))();
|
|
225
|
+
this.handleConnectedElements({
|
|
226
|
+
key: field.key,
|
|
227
|
+
value: this.formGroup.controls[field.key].value
|
|
228
|
+
}, "ON_CHANGE");
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
handleOnClickResetFormFields(e, field) {
|
|
232
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
233
|
+
for (let f of field.reset.fields) {
|
|
234
|
+
for (let a of f.actions) {
|
|
235
|
+
const resetField = findFieldFromKey(this.formFields, a.props.fieldKey);
|
|
236
|
+
const actions = new Actions(a, resetField, {}, this.allFormsData, this.formData, this.previousFormData, this.takeAction.bind(this));
|
|
237
|
+
yield actions.execute();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
handleOnClickApiCall(e) {
|
|
243
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
244
|
+
let field = findFieldFromKey(this.formFields, e.key);
|
|
245
|
+
if (field.type === "api-call") {
|
|
246
|
+
// set button status to loading
|
|
247
|
+
field["api"]["status"]["value"] = EApiStatusType.LOADING;
|
|
248
|
+
field["showLoader"] = true;
|
|
249
|
+
this.viewFormsButton["disabled"] = true;
|
|
250
|
+
this.viewFormsButton["showLoader"] = true;
|
|
251
|
+
this.saveFormButton["disabled"] = true;
|
|
252
|
+
this.saveFormButton["showLoader"] = true;
|
|
253
|
+
const apis = new Apis(field, this.formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this));
|
|
254
|
+
field = yield apis.setRequestBodyParams();
|
|
255
|
+
field = yield apis.validateRequestBody();
|
|
256
|
+
if (field.api.request.body.validation.is_valid) {
|
|
257
|
+
// Call API Here
|
|
258
|
+
this.onClickApiCall.emit({
|
|
259
|
+
key: e.key,
|
|
260
|
+
request: {
|
|
261
|
+
mode: "POST",
|
|
262
|
+
body: field.api.request.body.value,
|
|
263
|
+
headers: {}
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
// Request Body Validation Failed
|
|
269
|
+
// Highlight Error in UI to User to Retry After Sometime.
|
|
270
|
+
// Take Actions based on Validation
|
|
271
|
+
setTimeout(() => {
|
|
272
|
+
field["api"]["status"]["value"] = EApiStatusType.FAILED;
|
|
273
|
+
field["showLoader"] = false;
|
|
274
|
+
}, 500);
|
|
275
|
+
}
|
|
276
|
+
this.viewFormsButton["disabled"] = false;
|
|
277
|
+
this.viewFormsButton["showLoader"] = false;
|
|
278
|
+
this.saveFormButton["disabled"] = false;
|
|
279
|
+
this.saveFormButton["showLoader"] = false;
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
handleOnClickViewForms(e) {
|
|
284
|
+
this.onClickViewForms.emit({
|
|
285
|
+
clicked: true
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
handleOnClickSaveForm(e) {
|
|
289
|
+
let formData = this.formGroup.getRawValue();
|
|
290
|
+
for (let field of this.formFields) {
|
|
291
|
+
if (field.type !== "title" &&
|
|
292
|
+
field.validation.triggers.includes("ON_SAVE")) {
|
|
293
|
+
const validations = new Validations(field, this.formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this));
|
|
294
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
295
|
+
yield validations.validateField();
|
|
296
|
+
}))();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (this.formGroup.invalid) {
|
|
300
|
+
const controls = new Validations(undefined, this.formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this)).findInvalidControlsRecursive(this.formGroup);
|
|
301
|
+
let firstFieldWithError = "";
|
|
302
|
+
for (let control of controls) {
|
|
303
|
+
if (control.invalid && isEmpty(firstFieldWithError)) {
|
|
304
|
+
firstFieldWithError = control.key;
|
|
305
|
+
}
|
|
306
|
+
this.formFields = setFieldError(this.formFields, this.formGroup.controls[control.key].errors, control.key, control.invalid);
|
|
307
|
+
}
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
// Need to have an API Validator as well here.
|
|
311
|
+
// if(apiCallSuccess()) { then only proceed further, else highlight the button to click to call api}
|
|
312
|
+
for (let field of this.formFields) {
|
|
313
|
+
switch (field.type) {
|
|
314
|
+
case "radio":
|
|
315
|
+
if (hasKey(formData[field.key], "label")) {
|
|
316
|
+
formData[field.key] = formData[field.key].label;
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
formData[field.key] = "";
|
|
320
|
+
}
|
|
321
|
+
break;
|
|
322
|
+
case "date":
|
|
323
|
+
if (isNull(formData[field.key])) {
|
|
324
|
+
formData[field.key] = "";
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
formData[field.key] = formatDateToStandardFormat(formData[field.key]);
|
|
328
|
+
}
|
|
329
|
+
break;
|
|
330
|
+
case "title":
|
|
331
|
+
break;
|
|
332
|
+
default:
|
|
333
|
+
if (isEmpty(formData[field.key])) {
|
|
334
|
+
formData[field.key] = "";
|
|
335
|
+
}
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
Object.keys(formData).map((key) => {
|
|
340
|
+
if (isEmpty(formData[key])) {
|
|
341
|
+
formData[key] = "";
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
this.onClickSaveForm.emit({ data: formData });
|
|
345
|
+
}
|
|
346
|
+
// Component Helpers
|
|
347
|
+
fieldHide(fieldKey) {
|
|
348
|
+
let field = findFieldFromKey(this.formFields, fieldKey);
|
|
349
|
+
let fieldIndex = this.formFields.findIndex((_) => {
|
|
350
|
+
return field.key === _.key;
|
|
351
|
+
});
|
|
352
|
+
this.formFields[fieldIndex]["hidden"] = true;
|
|
353
|
+
}
|
|
354
|
+
fieldShow(fieldKey) {
|
|
355
|
+
let field = findFieldFromKey(this.formFields, fieldKey);
|
|
356
|
+
let fieldIndex = this.formFields.findIndex((_) => {
|
|
357
|
+
return field.key === _.key;
|
|
358
|
+
});
|
|
359
|
+
this.formFields[fieldIndex]["hidden"] = false;
|
|
360
|
+
this.formGroup.updateValueAndValidity();
|
|
361
|
+
}
|
|
362
|
+
fieldDisable(fieldKey) {
|
|
363
|
+
let field = findFieldFromKey(this.formFields, fieldKey);
|
|
364
|
+
let fieldIndex = this.formFields.findIndex((_) => {
|
|
365
|
+
return field.key === _.key;
|
|
366
|
+
});
|
|
367
|
+
this.formFields[fieldIndex]["disabled"] = true;
|
|
368
|
+
if (isNotEmpty(this.formGroup.controls)) {
|
|
369
|
+
this.formGroup.controls[field.key].disable({
|
|
370
|
+
emitEvent: false
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
fieldEnable(fieldKey) {
|
|
375
|
+
let field = findFieldFromKey(this.formFields, fieldKey);
|
|
376
|
+
let fieldIndex = this.formFields.findIndex((_) => {
|
|
377
|
+
return field.key === _.key;
|
|
378
|
+
});
|
|
379
|
+
this.formFields[fieldIndex]["disabled"] = false;
|
|
380
|
+
if (isNotEmpty(this.formGroup.controls)) {
|
|
381
|
+
this.formGroup.controls[field.key].enable({
|
|
382
|
+
emitEvent: false
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
fieldReset(fieldKey) {
|
|
387
|
+
// Find the field and its index in the formFields array
|
|
388
|
+
let field = findFieldFromKey(this.formFields, fieldKey);
|
|
389
|
+
let fieldIndex = findFieldIndexFromKey(this.formFields, fieldKey);
|
|
390
|
+
// Delete the field from the formData object
|
|
391
|
+
delete this.formData[fieldKey];
|
|
392
|
+
// Reset the value of the field in the formGroup
|
|
393
|
+
this.formGroup.controls[field.key].reset(setEmptyValue(field), {
|
|
394
|
+
emitEvent: false
|
|
395
|
+
});
|
|
396
|
+
// Reset the messages and errors for the field
|
|
397
|
+
field = removeMessage(field, {
|
|
398
|
+
type: EMessageType.WARNING,
|
|
399
|
+
message: ""
|
|
400
|
+
});
|
|
401
|
+
field = removeMessage(field, {
|
|
402
|
+
type: EMessageType.SUCCESS,
|
|
403
|
+
message: ""
|
|
404
|
+
});
|
|
405
|
+
this.fieldErrorHide(fieldKey, {
|
|
406
|
+
type: EMessageType.ERROR,
|
|
407
|
+
message: ""
|
|
408
|
+
});
|
|
409
|
+
// Reset the value of the field in the formFields array
|
|
410
|
+
switch (field.type) {
|
|
411
|
+
case "api-call":
|
|
412
|
+
const fieldApiCall = field;
|
|
413
|
+
fieldApiCall.api.status.value = EApiStatusType.DEFAULT;
|
|
414
|
+
this.formFields[fieldIndex] = fieldApiCall;
|
|
415
|
+
break;
|
|
416
|
+
default:
|
|
417
|
+
field.focus = false;
|
|
418
|
+
field.invalid = false;
|
|
419
|
+
this.formFields[fieldIndex] = field;
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
fieldErrorShow(fieldKey, message) {
|
|
424
|
+
let field = findFieldFromKey(this.formFields, fieldKey);
|
|
425
|
+
let fieldIndex = this.formFields.findIndex((_) => {
|
|
426
|
+
return field.key === _.key;
|
|
427
|
+
});
|
|
428
|
+
field = highlightFieldError(field, true);
|
|
429
|
+
field = addMessage(field, message);
|
|
430
|
+
this.formFields[fieldIndex] = field;
|
|
431
|
+
}
|
|
432
|
+
fieldErrorHide(fieldKey, message) {
|
|
433
|
+
let field = findFieldFromKey(this.formFields, fieldKey);
|
|
434
|
+
let fieldIndex = this.formFields.findIndex((_) => {
|
|
435
|
+
return field.key === _.key;
|
|
436
|
+
});
|
|
437
|
+
field = highlightFieldError(field, false);
|
|
438
|
+
field = removeMessage(field, message);
|
|
439
|
+
this.formFields[fieldIndex] = field;
|
|
440
|
+
}
|
|
441
|
+
fieldMessageShow(fieldKey, message) {
|
|
442
|
+
let field = findFieldFromKey(this.formFields, fieldKey);
|
|
443
|
+
let fieldIndex = this.formFields.findIndex((_) => {
|
|
444
|
+
return field.key === _.key;
|
|
445
|
+
});
|
|
446
|
+
field = addMessage(field, message);
|
|
447
|
+
this.formFields[fieldIndex] = field;
|
|
448
|
+
}
|
|
449
|
+
fieldMessageHide(fieldKey, message) {
|
|
450
|
+
let field = findFieldFromKey(this.formFields, fieldKey);
|
|
451
|
+
let fieldIndex = this.formFields.findIndex((_) => {
|
|
452
|
+
return field.key === _.key;
|
|
453
|
+
});
|
|
454
|
+
field = removeMessage(field, message);
|
|
455
|
+
this.formFields[fieldIndex] = field;
|
|
456
|
+
}
|
|
457
|
+
setObjectValue(field, path, value) { }
|
|
458
|
+
patchFieldControlValue(key, value) {
|
|
459
|
+
this.formGroup.patchValue({
|
|
460
|
+
[key]: value
|
|
461
|
+
}, { emitEvent: false });
|
|
462
|
+
}
|
|
463
|
+
isFieldValid(fieldKey) {
|
|
464
|
+
return this.formGroup.controls[fieldKey].valid;
|
|
465
|
+
}
|
|
466
|
+
isFieldEnabled(fieldKey) {
|
|
467
|
+
return this.formGroup.controls[fieldKey].enabled;
|
|
468
|
+
}
|
|
469
|
+
getFormGroupRawValues() {
|
|
470
|
+
return this.formGroup.getRawValue();
|
|
471
|
+
}
|
|
472
|
+
handleFieldTypeSearchText(field, childField) {
|
|
473
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
474
|
+
if (hasKey(childField, "json")) {
|
|
475
|
+
childField.options = getSearchTextOptionsFromFieldConfig(field, childField, this.formGroup);
|
|
476
|
+
}
|
|
477
|
+
if (hasKey(childField, "fetchJsonFromRemote")) {
|
|
478
|
+
childField.options = yield getSearchTextOptionsFromRemoteFile(field, childField, this.formGroup);
|
|
479
|
+
}
|
|
480
|
+
return childField;
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
takeAction(action, field, allFormsData, formData, previousFormData) {
|
|
484
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
485
|
+
switch (action.key) {
|
|
486
|
+
case EActionKey.FIELD_HIDE:
|
|
487
|
+
this.fieldHide(action.props.fieldKey);
|
|
488
|
+
break;
|
|
489
|
+
case EActionKey.FIELD_SHOW:
|
|
490
|
+
this.fieldShow(action.props.fieldKey);
|
|
491
|
+
break;
|
|
492
|
+
case EActionKey.FIELD_DISABLE:
|
|
493
|
+
this.fieldDisable(action.props.fieldKey);
|
|
494
|
+
break;
|
|
495
|
+
case EActionKey.FIELD_ENABLE:
|
|
496
|
+
this.fieldEnable(action.props.fieldKey);
|
|
497
|
+
break;
|
|
498
|
+
case EActionKey.FIELD_RESET:
|
|
499
|
+
this.fieldReset(action.props.fieldKey);
|
|
500
|
+
break;
|
|
501
|
+
case EActionKey.FIELD_ERROR_SHOW:
|
|
502
|
+
this.fieldErrorShow(action.props.fieldKey, action.props.message);
|
|
503
|
+
break;
|
|
504
|
+
case EActionKey.FIELD_ERROR_HIDE:
|
|
505
|
+
this.fieldErrorHide(action.props.fieldKey, action.props.message);
|
|
506
|
+
break;
|
|
507
|
+
case EActionKey.FIELD_MESSAGE_SHOW:
|
|
508
|
+
this.fieldMessageShow(action.props.fieldKey, action.props.message);
|
|
509
|
+
break;
|
|
510
|
+
case EActionKey.FIELD_MESSAGES_HIDE:
|
|
511
|
+
this.fieldMessageHide(action.props.fieldKey, action.props.message);
|
|
512
|
+
break;
|
|
513
|
+
case EActionKey.SET_VALUE:
|
|
514
|
+
const sources = new Sources(field, this.formData, this.previousFormData, this.allFormsData);
|
|
515
|
+
const sourceValue = yield sources.getValueFromSource(action.props.value.source);
|
|
516
|
+
sources.setValueToSource(action.props.value.destination, sourceValue);
|
|
517
|
+
field = sources.field;
|
|
518
|
+
this.formData = sources.formData;
|
|
519
|
+
this.allFormsData = sources.allFormsData;
|
|
520
|
+
this.previousFormData = sources.previousFormData;
|
|
521
|
+
break;
|
|
522
|
+
case EActionKey.HANDLE_CONNECTED_ELEMENTS:
|
|
523
|
+
this.handleConnectedElements({ key: field.key }, "ACTION");
|
|
524
|
+
break;
|
|
525
|
+
case EActionKey.CUSTOM:
|
|
526
|
+
break;
|
|
527
|
+
default:
|
|
528
|
+
break;
|
|
529
|
+
}
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
/** @nocollapse */ KwikIDFormViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: KwikIDFormViewComponent, deps: [{ token: i1.KwikIDFormViewService }], target: i0.ɵɵFactoryTarget.Component });
|
|
534
|
+
/** @nocollapse */ KwikIDFormViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: KwikIDFormViewComponent, selector: "kwikid-form-view", inputs: { formConfig: "formConfig", formData: "formData", apiCallResponse: "apiCallResponse", isMobileView: "isMobileView", allFormsData: "allFormsData", formsList: "formsList" }, outputs: { onClickViewForms: "onClickViewForms", onClickSaveForm: "onClickSaveForm", onClickApiCall: "onClickApiCall", getActiveFormData: "getActiveFormData" }, providers: [KwikIDFormViewService], usesOnChanges: true, ngImport: i0, template: "<div\r\n class=\"kwikid-form-container\"\r\n *ngIf=\"!this.loading\"\r\n>\r\n <div id=\"uf-form-fields-header-container\">\r\n <div id=\"uf-form-fields-title\">\r\n {{ this.formConfig.title }}\r\n </div>\r\n <div id=\"uf-form-fields-steps\">\r\n Step {{ this.formConfig.sequenceNo }} of {{ this.formsList.length }}\r\n </div>\r\n </div>\r\n <form\r\n class=\"kwikid-form show\"\r\n [formGroup]=\"this.formGroup\"\r\n >\r\n <ng-container *ngFor=\"let field of this.formFields; let i = index\">\r\n <ng-container [ngSwitch]=\"field.type\">\r\n <!-- Form Title -->\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <div class=\"title\">\r\n <div>\r\n {{ field.label }}\r\n </div>\r\n <kwikui-button\r\n *ngIf=\"field?.reset\"\r\n appearance=\"whiteblock\"\r\n size=\"s\"\r\n label=\"Reset\"\r\n (onClick)=\"this.handleOnClickResetFormFields($event, field)\"\r\n ></kwikui-button>\r\n </div>\r\n </ng-container>\r\n <!-- Input Text -->\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div [hidden]=\"field?.hidden\">\r\n <kwikui-input\r\n [case]=\"field?.properties?.case\"\r\n [disabled]=\"field?.disabled\"\r\n [focus]=\"field?.focus\"\r\n [formControl]=\"formGroup.controls[field.key]\"\r\n [formControlName]=\"field.key\"\r\n [id]=\"field.key\"\r\n [invalid]=\"field?.invalid\"\r\n [label]=\"field.label\"\r\n [placeholder]=\"field?.properties?.placeholder\"\r\n [type]=\"'text'\"\r\n [validators]=\"field?.validators\"\r\n (getKeyValue)=\"handleGetKeyValue($event)\"\r\n ></kwikui-input>\r\n <kwikui-messages\r\n [messages]=\"field.messages\"\r\n [id]=\"field.key\"\r\n ></kwikui-messages>\r\n </div>\r\n </ng-container>\r\n <!-- Checkbox -->\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [hidden]=\"field?.hidden\">\r\n <kwikui-checkbox-block\r\n [contentAlign]=\"field?.properties?.contentAlign ?? 'left'\"\r\n [disabled]=\"field?.disabled\"\r\n [focus]=\"field?.focus\"\r\n [formControl]=\"formGroup.controls[field.key]\"\r\n [formControlName]=\"field.key\"\r\n [id]=\"field.key\"\r\n [invalid]=\"field?.invalid\"\r\n [label]=\"field?.properties?.placeholder\"\r\n [placeholder]=\"field?.properties?.placeholder\"\r\n [properties]=\"field?.properties\"\r\n [size]=\"field?.properties?.size ?? 'l'\"\r\n [validators]=\"field?.validators\"\r\n (getKeyValue)=\"handleGetKeyValue($event)\"\r\n ></kwikui-checkbox-block\r\n ><kwikui-messages\r\n [messages]=\"field.messages\"\r\n [id]=\"field.key\"\r\n ></kwikui-messages>\r\n </div>\r\n </ng-container>\r\n <!-- Input Number -->\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <div [hidden]=\"field?.hidden\">\r\n <kwikui-input-number\r\n [decimal]=\"field?.properties?.decimal\"\r\n [disabled]=\"field?.disabled\"\r\n [focus]=\"field?.focus\"\r\n [formControl]=\"formGroup.controls[field.key]\"\r\n [formControlName]=\"field.key\"\r\n [id]=\"field.key\"\r\n [invalid]=\"field?.invalid\"\r\n [label]=\"field?.label\"\r\n [max]=\"field?.properties?.max\"\r\n [min]=\"field?.properties?.min\"\r\n [placeholder]=\"field?.properties?.placeholder\"\r\n [postfix]=\"field?.properties?.postfix ?? ''\"\r\n [precision]=\"field?.properties?.precision\"\r\n [prefix]=\"field?.properties?.prefix ?? ''\"\r\n [properties]=\"field?.properties\"\r\n [validators]=\"field?.validators\"\r\n (getKeyValue)=\"handleGetKeyValue($event)\"\r\n ></kwikui-input-number\r\n ><kwikui-messages\r\n [messages]=\"field.messages\"\r\n [id]=\"field.key\"\r\n ></kwikui-messages>\r\n </div>\r\n </ng-container>\r\n <!-- Input Date -->\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <div [hidden]=\"field?.hidden\">\r\n <kwikui-input-date\r\n [disabled]=\"field?.disabled\"\r\n [focus]=\"field?.focus\"\r\n [formControl]=\"formGroup.controls[field.key]\"\r\n [formControlName]=\"field.key\"\r\n [id]=\"field.key\"\r\n [invalid]=\"field?.invalid\"\r\n [label]=\"field.label\"\r\n [max]=\"field?.properties?.max\"\r\n [min]=\"field?.properties?.min\"\r\n [placeholder]=\"field?.placeholder\"\r\n [properties]=\"field?.properties\"\r\n [validators]=\"field?.validators\"\r\n (getKeyValue)=\"handleGetKeyValue($event)\"\r\n ></kwikui-input-date>\r\n <kwikui-messages\r\n [messages]=\"field.messages\"\r\n [id]=\"field.key\"\r\n ></kwikui-messages>\r\n </div>\r\n </ng-container>\r\n <!-- Input Phone -->\r\n <ng-container *ngSwitchCase=\"'phone'\">\r\n <div [hidden]=\"field?.hidden\">\r\n <kwikui-input-phone\r\n [countryCode]=\"field?.properties?.countryCode\"\r\n [disabled]=\"field?.disabled\"\r\n [focus]=\"field?.focus\"\r\n [formControl]=\"formGroup.controls[field.key]\"\r\n [formControlName]=\"field.key\"\r\n [id]=\"field.key\"\r\n [invalid]=\"field?.invalid\"\r\n [label]=\"field?.label\"\r\n [phoneMaskAfterCountryCode]=\"\r\n field?.properties?.phoneMaskAfterCountryCode\r\n \"\r\n [placeholder]=\"field?.placeholder\"\r\n [validators]=\"field?.validators\"\r\n (getKeyValue)=\"handleGetKeyValue($event)\"\r\n ></kwikui-input-phone>\r\n <kwikui-messages\r\n [messages]=\"field.messages\"\r\n [id]=\"field.key\"\r\n ></kwikui-messages>\r\n </div>\r\n </ng-container>\r\n <!-- Input Radio -->\r\n <ng-container *ngSwitchCase=\"'radio'\">\r\n <div [hidden]=\"field?.hidden\">\r\n <label\r\n [tuiLabel]=\"labelTemplate\"\r\n style=\"min-height: auto\"\r\n >\r\n <kwikui-radio-list\r\n [disabled]=\"field?.disabled\"\r\n [focus]=\"field?.focus\"\r\n [formControl]=\"formGroup.controls[field.key]\"\r\n [formControlName]=\"field.key\"\r\n [id]=\"field.key\"\r\n [invalid]=\"field?.invalid\"\r\n [items]=\"field?.options\"\r\n [label]=\"field?.label\"\r\n [orientation]=\"field?.properties?.orientation\"\r\n [placeholder]=\"field?.placeholder\"\r\n [properties]=\"field?.properties\"\r\n [size]=\"field?.properties?.size\"\r\n [validators]=\"field?.validators\"\r\n (getKeyValue)=\"handleGetKeyValue($event)\"\r\n ></kwikui-radio-list>\r\n </label>\r\n <ng-template #labelTemplate>\r\n <p\r\n class=\"tui-space_bottom-2\"\r\n [hidden]=\"field?.hidden\"\r\n >\r\n <b>\r\n {{ field.label }}\r\n <span *ngIf=\"field.validators?.required\"></span>\r\n </b>\r\n </p>\r\n </ng-template>\r\n <kwikui-messages\r\n [messages]=\"field.messages\"\r\n [id]=\"field.key\"\r\n ></kwikui-messages>\r\n </div>\r\n </ng-container>\r\n <!-- Dropdown -->\r\n <ng-container *ngSwitchCase=\"'dropdown-with-search'\">\r\n <div [hidden]=\"field?.hidden\">\r\n <kwikui-select-combobox\r\n [disabled]=\"field?.disabled\"\r\n [focus]=\"field?.focus\"\r\n [formControl]=\"formGroup.controls[field.key]\"\r\n [formControlName]=\"field.key\"\r\n [id]=\"field.key\"\r\n [invalid]=\"field?.invalid\"\r\n [label]=\"field.label\"\r\n [options]=\"field.options\"\r\n [placeholder]=\"field?.properties?.placeholder\"\r\n [properties]=\"field?.properties\"\r\n [validators]=\"field?.validators\"\r\n (getKeyValue)=\"handleGetKeyValue($event)\"\r\n ></kwikui-select-combobox>\r\n <kwikui-messages\r\n [messages]=\"field.messages\"\r\n [id]=\"field.key\"\r\n ></kwikui-messages>\r\n </div>\r\n </ng-container>\r\n <!-- API Call -->\r\n <ng-container *ngSwitchCase=\"'api-call'\">\r\n <div [hidden]=\"field?.hidden\">\r\n <kwikui-button-api-call\r\n [apiStatus]=\"field?.api?.status?.value\"\r\n [class]=\"field?.class\"\r\n [disabled]=\"field?.disabled\"\r\n [id]=\"field.key\"\r\n [label]=\"field?.api?.status?.labels[field?.api?.status?.value]\"\r\n [showLoader]=\"field?.disabled === 'loading'\"\r\n shape=\"null\"\r\n size=\"m\"\r\n styles=\"width: fit-content\"\r\n (onClick)=\"this.handleOnClickApiCall($event)\"\r\n ></kwikui-button-api-call>\r\n <kwikui-messages\r\n [messages]=\"field.messages\"\r\n [id]=\"field.key\"\r\n ></kwikui-messages>\r\n </div>\r\n </ng-container>\r\n <!-- Mobile OTP -->\r\n <ng-container *ngSwitchCase=\"'otp'\">\r\n <div [hidden]=\"field?.hidden\">\r\n <kwikui-input-otp\r\n [disabled]=\"field?.disabled\"\r\n [focus]=\"field?.focus\"\r\n [formControl]=\"formGroup.controls[field.key]\"\r\n [formControlName]=\"field.key\"\r\n [id]=\"field.key\"\r\n [invalid]=\"field?.invalid\"\r\n [label]=\"field?.label\"\r\n [mask]=\"field?.properties?.mask\"\r\n [placeholder]=\"field?.properties?.placeholder\"\r\n [properties]=\"field?.properties\"\r\n [validators]=\"field?.validators\"\r\n (getKeyValue)=\"handleGetKeyValue($event)\"\r\n ></kwikui-input-otp>\r\n <kwikui-messages\r\n [messages]=\"field.messages\"\r\n [id]=\"field.key\"\r\n ></kwikui-messages>\r\n </div>\r\n </ng-container>\r\n <!-- Aadhaar Number -->\r\n <ng-container *ngSwitchCase=\"'aadhaar-number'\">\r\n <div [hidden]=\"field?.hidden\">\r\n <kwikui-input-aadhaar\r\n [disabled]=\"field?.disabled\"\r\n [focus]=\"field?.focus\"\r\n [formControl]=\"formGroup.controls[field.key]\"\r\n [formControlName]=\"field.key\"\r\n [id]=\"field.key\"\r\n [invalid]=\"field?.invalid\"\r\n [label]=\"field?.label\"\r\n [placeholder]=\"field?.placeholder\"\r\n [properties]=\"field?.properties\"\r\n [validators]=\"field?.validators\"\r\n (getKeyValue)=\"handleGetKeyValue($event)\"\r\n ></kwikui-input-aadhaar>\r\n <kwikui-messages\r\n [messages]=\"field.messages\"\r\n [id]=\"field.key\"\r\n ></kwikui-messages>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </form>\r\n <div class=\"kwikid-form-buttons\">\r\n <kwikui-button\r\n *ngIf=\"this.isMobileView\"\r\n [disabled]=\"viewFormsButton.disabled\"\r\n id=\"\"\r\n label=\"View Forms\"\r\n [showLoader]=\"viewFormsButton.showLoader\"\r\n styles=\"\"\r\n class=\"\"\r\n type=\"button\"\r\n appearance=\"secondary\"\r\n icon=\"\"\r\n iconRight=\"\"\r\n shape=\"null\"\r\n size=\"m\"\r\n styles=\"width: 100%\"\r\n (onClick)=\"this.handleOnClickViewForms($event)\"\r\n ></kwikui-button>\r\n <kwikui-button\r\n [disabled]=\"saveFormButton.disabled\"\r\n id=\"\"\r\n label=\"Save\"\r\n [showLoader]=\"saveFormButton.showLoader\"\r\n styles=\"\"\r\n class=\"\"\r\n type=\"button\"\r\n appearance=\"primary\"\r\n icon=\"\"\r\n iconRight=\"\"\r\n shape=\"null\"\r\n size=\"m\"\r\n styles=\"width: 100%\"\r\n (onClick)=\"this.handleOnClickSaveForm($event)\"\r\n ></kwikui-button>\r\n </div>\r\n</div>\r\n<div\r\n class=\"kwikid-form-container-loading\"\r\n *ngIf=\"this.loading\"\r\n>\r\n <div\r\n class=\"large-wrapper\"\r\n [class.tui-skeleton]=\"this.loading\"\r\n [class.tui-skeleton_rounded]=\"this.loading\"\r\n ></div>\r\n <div\r\n class=\"large-wrapper\"\r\n [class.tui-skeleton]=\"this.loading\"\r\n [class.tui-skeleton_rounded]=\"this.loading\"\r\n ></div>\r\n <div\r\n class=\"large-wrapper\"\r\n [class.tui-skeleton]=\"this.loading\"\r\n [class.tui-skeleton_rounded]=\"this.loading\"\r\n ></div>\r\n <div\r\n class=\"large-wrapper\"\r\n [class.tui-skeleton]=\"this.loading\"\r\n [class.tui-skeleton_rounded]=\"this.loading\"\r\n ></div>\r\n <div\r\n class=\"large-wrapper\"\r\n [class.tui-skeleton]=\"this.loading\"\r\n [class.tui-skeleton_rounded]=\"this.loading\"\r\n ></div>\r\n <div\r\n class=\"large-wrapper\"\r\n [class.tui-skeleton]=\"this.loading\"\r\n [class.tui-skeleton_rounded]=\"this.loading\"\r\n ></div>\r\n <div\r\n class=\"large-wrapper\"\r\n [class.tui-skeleton]=\"this.loading\"\r\n [class.tui-skeleton_rounded]=\"this.loading\"\r\n ></div>\r\n</div>\r\n", styles: ["::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}.kwikid-form-container{width:100%;height:100%;margin:0 auto;display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;align-content:center}.kwikid-form.show{width:100%;height:100%;padding:1rem;overflow-y:auto;display:flex;flex-direction:column;align-content:center;justify-content:flex-start;align-items:stretch;grid-row-gap:1rem;row-gap:1rem}.kwikid-form-buttons{width:100%;bottom:0px;padding:1rem;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-column-gap:10px;column-gap:10px}.kwikid-form-buttons *{flex-grow:1}#uf-form-fields-header-container{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:flex-start;grid-row-gap:.5rem;row-gap:.5rem;padding:1rem}#uf-form-fields-title{color:#000;font-size:1.75em;font-weight:bold}#uf-form-fields-steps{color:var(--color-on-secondary-container);font-size:1em}.title{border-left:.25rem solid var(--tui-primary);padding:.75rem;font-size:1.4em;font-weight:bold;background-color:var(--tui-secondary);display:flex;flex-direction:row;align-content:center;justify-content:space-between;align-items:center;grid-gap:.5rem;gap:.5rem}.title:not(:first-child){margin-top:.5rem}.large-wrapper{width:100%;height:60px}.large-wrapper:first-child{margin-bottom:auto}.large-wrapper:last-child{margin-top:auto}.kwikid-form-container-loading{width:100%;height:100%;margin:0 auto;display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;align-content:center;grid-row-gap:1rem;row-gap:1rem;padding:1rem}\n"], components: [{ type: i2.KwikUIButtonComponent, selector: "kwikui-button", inputs: ["disabled", "id", "label", "showLoader", "styles", "class", "type", "appearance", "icon", "iconRight", "shape", "size"], outputs: ["onClick"] }, { type: i2.KwikUIInputComponent, selector: "kwikui-input", inputs: ["label", "id", "type", "formControlName", "formControl", "placeholder", "focus", "invalid", "disabled", "validators", "case", "properties"], outputs: ["getKeyValue"] }, { type: i2.KwikUIMessagesComponent, selector: "kwikui-messages", inputs: ["messages", "id"] }, { type: i2.KwikUICheckboxBlockComponent, selector: "kwikui-checkbox-block", inputs: ["label", "id", "formControlName", "formControl", "placeholder", "focus", "invalid", "disabled", "size", "contentAlign", "validators", "properties"], outputs: ["getKeyValue"] }, { type: i2.KwikUIInputNumberComponent, selector: "kwikui-input-number", inputs: ["label", "id", "formControlName", "formControl", "focus", "invalid", "disabled", "placeholder", "min", "max", "prefix", "postfix", "precision", "decimal", "validators", "properties"], outputs: ["getKeyValue"] }, { type: i2.KwikUIInputDateComponent, selector: "kwikui-input-date", inputs: ["label", "id", "formControlName", "formControl", "focus", "invalid", "disabled", "placeholder", "min", "max", "validators", "properties"], outputs: ["getKeyValue"] }, { type: i2.KwikUIInputPhoneComponent, selector: "kwikui-input-phone", inputs: ["label", "id", "formControlName", "formControl", "focus", "invalid", "disabled", "placeholder", "countryCode", "phoneMaskAfterCountryCode", "validators", "properties"], outputs: ["getKeyValue"] }, { type: i3.TuiLabelComponent, selector: "label[tuiLabel]", inputs: ["tuiLabel", "context"] }, { type: i2.KwikUIRadioListComponent, selector: "kwikui-radio-list", inputs: ["label", "id", "formControlName", "formControl", "placeholder", "focus", "invalid", "disabled", "size", "items", "orientation", "validators", "properties"], outputs: ["getKeyValue"] }, { type: i2.KwikUISelectComboboxComponent, selector: "kwikui-select-combobox", inputs: ["label", "id", "formControlName", "formControl", "placeholder", "focus", "invalid", "disabled", "options", "validators", "properties"], outputs: ["getKeyValue"] }, { type: i2.KwikUIButtonApiCallComponent, selector: "kwikui-button-api-call", inputs: ["disabled", "id", "label", "showLoader", "styles", "class", "shape", "size", "apiStatus"], outputs: ["onClick"] }, { type: i2.KwikUIInputOtpComponent, selector: "kwikui-input-otp", inputs: ["label", "id", "formControlName", "formControl", "focus", "invalid", "disabled", "placeholder", "mask", "validators", "properties"], outputs: ["getKeyValue"] }, { type: i2.KwikUIInputAadhaarComponent, selector: "kwikui-input-aadhaar", inputs: ["label", "id", "formControlName", "formControl", "focus", "invalid", "disabled", "placeholder", "mask", "validators", "properties"], outputs: ["getKeyValue"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i5.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }] });
|
|
535
|
+
__decorate([
|
|
536
|
+
log
|
|
537
|
+
], KwikIDFormViewComponent.prototype, "ngOnInit", null);
|
|
538
|
+
__decorate([
|
|
539
|
+
log
|
|
540
|
+
], KwikIDFormViewComponent.prototype, "ngAfterViewInit", null);
|
|
541
|
+
__decorate([
|
|
542
|
+
log
|
|
543
|
+
], KwikIDFormViewComponent.prototype, "ngOnChanges", null);
|
|
544
|
+
__decorate([
|
|
545
|
+
log
|
|
546
|
+
], KwikIDFormViewComponent.prototype, "initFormConfig", null);
|
|
547
|
+
__decorate([
|
|
548
|
+
log
|
|
549
|
+
], KwikIDFormViewComponent.prototype, "setFormFieldsFromFormConfig", null);
|
|
550
|
+
__decorate([
|
|
551
|
+
log
|
|
552
|
+
], KwikIDFormViewComponent.prototype, "setFormDataFromAllFormsData", null);
|
|
553
|
+
__decorate([
|
|
554
|
+
log
|
|
555
|
+
], KwikIDFormViewComponent.prototype, "handleConnectedElementFieldActions", null);
|
|
556
|
+
__decorate([
|
|
557
|
+
log
|
|
558
|
+
], KwikIDFormViewComponent.prototype, "handleConnectedElementFields", null);
|
|
559
|
+
__decorate([
|
|
560
|
+
log
|
|
561
|
+
], KwikIDFormViewComponent.prototype, "handleConnectedElements", null);
|
|
562
|
+
__decorate([
|
|
563
|
+
log
|
|
564
|
+
], KwikIDFormViewComponent.prototype, "handleGetKeyValue", null);
|
|
565
|
+
__decorate([
|
|
566
|
+
log
|
|
567
|
+
], KwikIDFormViewComponent.prototype, "handleOnClickResetFormFields", null);
|
|
568
|
+
__decorate([
|
|
569
|
+
log
|
|
570
|
+
], KwikIDFormViewComponent.prototype, "handleOnClickApiCall", null);
|
|
571
|
+
__decorate([
|
|
572
|
+
log
|
|
573
|
+
], KwikIDFormViewComponent.prototype, "handleOnClickViewForms", null);
|
|
574
|
+
__decorate([
|
|
575
|
+
log
|
|
576
|
+
], KwikIDFormViewComponent.prototype, "handleOnClickSaveForm", null);
|
|
577
|
+
__decorate([
|
|
578
|
+
log
|
|
579
|
+
], KwikIDFormViewComponent.prototype, "fieldHide", null);
|
|
580
|
+
__decorate([
|
|
581
|
+
log
|
|
582
|
+
], KwikIDFormViewComponent.prototype, "fieldShow", null);
|
|
583
|
+
__decorate([
|
|
584
|
+
log
|
|
585
|
+
], KwikIDFormViewComponent.prototype, "fieldDisable", null);
|
|
586
|
+
__decorate([
|
|
587
|
+
log
|
|
588
|
+
], KwikIDFormViewComponent.prototype, "fieldEnable", null);
|
|
589
|
+
__decorate([
|
|
590
|
+
log
|
|
591
|
+
], KwikIDFormViewComponent.prototype, "fieldReset", null);
|
|
592
|
+
__decorate([
|
|
593
|
+
log
|
|
594
|
+
], KwikIDFormViewComponent.prototype, "fieldErrorShow", null);
|
|
595
|
+
__decorate([
|
|
596
|
+
log
|
|
597
|
+
], KwikIDFormViewComponent.prototype, "fieldErrorHide", null);
|
|
598
|
+
__decorate([
|
|
599
|
+
log
|
|
600
|
+
], KwikIDFormViewComponent.prototype, "fieldMessageShow", null);
|
|
601
|
+
__decorate([
|
|
602
|
+
log
|
|
603
|
+
], KwikIDFormViewComponent.prototype, "fieldMessageHide", null);
|
|
604
|
+
__decorate([
|
|
605
|
+
log
|
|
606
|
+
], KwikIDFormViewComponent.prototype, "setObjectValue", null);
|
|
607
|
+
__decorate([
|
|
608
|
+
log
|
|
609
|
+
], KwikIDFormViewComponent.prototype, "patchFieldControlValue", null);
|
|
610
|
+
__decorate([
|
|
611
|
+
log
|
|
612
|
+
], KwikIDFormViewComponent.prototype, "isFieldValid", null);
|
|
613
|
+
__decorate([
|
|
614
|
+
log
|
|
615
|
+
], KwikIDFormViewComponent.prototype, "isFieldEnabled", null);
|
|
616
|
+
__decorate([
|
|
617
|
+
log
|
|
618
|
+
], KwikIDFormViewComponent.prototype, "getFormGroupRawValues", null);
|
|
619
|
+
__decorate([
|
|
620
|
+
log
|
|
621
|
+
], KwikIDFormViewComponent.prototype, "handleFieldTypeSearchText", null);
|
|
622
|
+
__decorate([
|
|
623
|
+
log
|
|
624
|
+
], KwikIDFormViewComponent.prototype, "takeAction", null);
|
|
625
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: KwikIDFormViewComponent, decorators: [{
|
|
626
|
+
type: Component,
|
|
627
|
+
args: [{
|
|
628
|
+
selector: "kwikid-form-view",
|
|
629
|
+
templateUrl: "./form-view.component.html",
|
|
630
|
+
styleUrls: ["./form-view.component.scss"],
|
|
631
|
+
providers: [KwikIDFormViewService]
|
|
632
|
+
}]
|
|
633
|
+
}], ctorParameters: function () { return [{ type: i1.KwikIDFormViewService }]; }, propDecorators: { formConfig: [{
|
|
634
|
+
type: Input
|
|
635
|
+
}], formData: [{
|
|
636
|
+
type: Input
|
|
637
|
+
}], apiCallResponse: [{
|
|
638
|
+
type: Input
|
|
639
|
+
}], isMobileView: [{
|
|
640
|
+
type: Input
|
|
641
|
+
}], allFormsData: [{
|
|
642
|
+
type: Input
|
|
643
|
+
}], formsList: [{
|
|
644
|
+
type: Input
|
|
645
|
+
}], onClickViewForms: [{
|
|
646
|
+
type: Output
|
|
647
|
+
}], onClickSaveForm: [{
|
|
648
|
+
type: Output
|
|
649
|
+
}], onClickApiCall: [{
|
|
650
|
+
type: Output
|
|
651
|
+
}], getActiveFormData: [{
|
|
652
|
+
type: Output
|
|
653
|
+
}], ngOnInit: [], ngAfterViewInit: [], ngOnChanges: [], initFormConfig: [], setFormFieldsFromFormConfig: [], setFormDataFromAllFormsData: [], handleConnectedElementFieldActions: [], handleConnectedElementFields: [], handleConnectedElements: [], handleGetKeyValue: [], handleOnClickResetFormFields: [], handleOnClickApiCall: [], handleOnClickViewForms: [], handleOnClickSaveForm: [], fieldHide: [], fieldShow: [], fieldDisable: [], fieldEnable: [], fieldReset: [], fieldErrorShow: [], fieldErrorHide: [], fieldMessageShow: [], fieldMessageHide: [], setObjectValue: [], patchFieldControlValue: [], isFieldValid: [], isFieldEnabled: [], getFormGroupRawValues: [], handleFieldTypeSearchText: [], takeAction: [] } });
|
|
654
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1mb3Jtcy9zcmMvbGliL3JlbmRlcmVyL2Zvcm0tdmlldy9mb3JtLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvcmVuZGVyZXIvZm9ybS12aWV3L2Zvcm0tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUV0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBT3RGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZELE9BQU8sRUFDTCxNQUFNLEVBQ04sT0FBTyxFQUNQLFVBQVUsRUFDVixNQUFNLEVBQ04sYUFBYSxFQUNkLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFDTCxVQUFVLEVBQ1YsZ0JBQWdC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Z0JBSU4sZ0JBQWdCO3NCQURmLE1BQU07Z0JBSVAsZUFBZTtzQkFEZCxNQUFNO2dCQUlQLGNBQWM7c0JBRGIsTUFBTTtnQkFJUCxpQkFBaUI7c0JBRGhCLE1BQU07Z0JBcUJQLFFBQVEsTUFTUixlQUFlLE1BR2YsV0FBVyxNQTZETCxjQUFjLE1BbURwQiwyQkFBMkIsTUFZM0IsMkJBQTJCLE1BU3JCLGtDQUFrQyxNQXVDbEMsNEJBQTRCLE1BNEZsQyx1QkFBdUIsTUFpQnZCLGlCQUFpQixNQXNDWCw0QkFBNEIsTUFtQjVCLG9CQUFvQixNQW9EMUIsc0JBQXNCLE1BT3RCLHFCQUFxQixNQTBGckIsU0FBUyxNQVVULFNBQVMsTUFXVCxZQUFZLE1BZ0JaLFdBQVcsTUFnQlgsVUFBVSxNQTJDVixjQUFjLE1BYWQsY0FBYyxNQWFkLGdCQUFnQixNQVloQixnQkFBZ0IsTUFZaEIsY0FBYyxNQUdkLHNCQUFzQixNQVV0QixZQUFZLE1BS1osY0FBYyxNQUtkLHFCQUFxQixNQUtmLHlCQUF5QixNQW9CekIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlc1xyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBwYWlyd2lzZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBFQWN0aW9uS2V5IH0gZnJvbSBcIi4vZGVmaW5pdGlvbnMvYWN0aW9ucy9mb3JtLXZpZXcuYWN0aW9ucy5lbnVtLmRlZmluaXRpb25zXCI7XHJcbmltcG9ydCB7IFRBY3Rpb24gfSBmcm9tIFwiLi9kZWZpbml0aW9ucy9hY3Rpb25zL2Zvcm0tdmlldy5hY3Rpb25zLnR5cGUuZGVmaW5pdGlvbnNcIjtcclxuaW1wb3J0IHsgRUFwaVN0YXR1c1R5cGUgfSBmcm9tIFwiLi9kZWZpbml0aW9ucy9hcGlzL2Zvcm0tdmlldy5hcGlzLmVudW0uZGVmaW5pdGlvbnNcIjtcclxuaW1wb3J0IHsgRU1lc3NhZ2VUeXBlIH0gZnJvbSBcIi4vZGVmaW5pdGlvbnMvY29tbW9uL2Zvcm0tdmlldy5jb21tb24uZW51bS5kZWZpbml0aW9uc1wiO1xyXG5pbXBvcnQgeyBUTWVzc2FnZSB9IGZyb20gXCIuL2RlZmluaXRpb25zL2NvbW1vbi9mb3JtLXZpZXcuY29tbW9uLnR5cGUuZGVmaW5pdGlvbnNcIjtcclxuaW1wb3J0IHtcclxuICBURmllbGQsXHJcbiAgVEZpZWxkQXBpQ2FsbCxcclxuICBURmllbGRUaXRsZVxyXG59IGZyb20gXCIuL2RlZmluaXRpb25zL2ZpZWxkcy9mb3JtLXZpZXcuZmllbGRzLnR5cGUuZGVmaW5pdGlvbnNcIjtcclxuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIi4vZm9ybS12aWV3LmRlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgS3dpa0lERm9ybVZpZXdTZXJ2aWNlIH0gZnJvbSBcIi4vZm9ybS12aWV3LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQWN0aW9ucyB9IGZyb20gXCIuL2hlbHBlcnMvZm9ybS12aWV3LmFjdGlvbnMuaGVscGVyXCI7XHJcbmltcG9ydCB7IEFwaXMgfSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy5hcGlzLmhlbHBlclwiO1xyXG5pbXBvcnQge1xyXG4gIGhhc0tleSxcclxuICBpc0VtcHR5LFxyXG4gIGlzTm90RW1wdHksXHJcbiAgaXNOdWxsLFxyXG4gIHNldEVtcHR5VmFsdWVcclxufSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy5jb21tb24uaGVscGVyXCI7XHJcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuL2hlbHBlcnMvZm9ybS12aWV3LmNvbmRpdGlvbi5oZWxwZXJcIjtcclxuaW1wb3J0IHtcclxuICBhZGRNZXNzYWdlLFxyXG4gIGZpbmRGaWVsZEZyb21LZXksXHJcbiAgZmluZEZpZWxkSW5kZXhGcm9tS2V5LFxyXG4gIGZvcm1hdERhdGVUb1N0YW5kYXJkRm9ybWF0LFxyXG4gIGdldFNlYXJjaFRleHRPcHRpb25zRnJvbUZpZWxkQ29uZmlnLFxyXG4gIGdldFNlYXJjaFRleHRPcHRpb25zRnJvbVJlbW90ZUZpbGUsXHJcbiAgaGlnaGxpZ2h0RmllbGRFcnJvcixcclxuICByZW1vdmVNZXNzYWdlLFxyXG4gIHNldEZpZWxkRXJyb3JcclxufSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy5maWVsZHMuaGVscGVyXCI7XHJcbmltcG9ydCB7IFJ1bGVzIH0gZnJvbSBcIi4vaGVscGVycy9mb3JtLXZpZXcucnVsZXMuaGVscGVyXCI7XHJcbmltcG9ydCB7IFNvdXJjZXMgfSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy5zb3VyY2VzLmhlbHBlclwiO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9ucyB9IGZyb20gXCIuL2hlbHBlcnMvZm9ybS12aWV3LnZhbGlkYXRpb25zLmhlbHBlclwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwia3dpa2lkLWZvcm0tdmlld1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vZm9ybS12aWV3LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2Zvcm0tdmlldy5jb21wb25lbnQuc2Nzc1wiXSxcclxuICBwcm92aWRlcnM6IFtLd2lrSURGb3JtVmlld1NlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBLd2lrSURGb3JtVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgY29tcG9uZW50VGhpcyA9IHRoaXM7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZm9ybUNvbmZpZzogYW55O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGZvcm1EYXRhOiBhbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgYXBpQ2FsbFJlc3BvbnNlOiBhbnkgPSB7fTtcclxuXHJcbiAgQElucHV0KClcclxuICBpc01vYmlsZVZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBhbGxGb3Jtc0RhdGE6IGFueTtcclxuXHJcbiAgQElucHV0KClcclxuICBmb3Jtc0xpc3Q6IGFueVtdO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBvbkNsaWNrVmlld0Zvcm1zOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBvbkNsaWNrU2F2ZUZvcm06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIG9uQ2xpY2tBcGlDYWxsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBnZXRBY3RpdmVGb3JtRGF0YTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgZm9ybUZpZWxkczogYW55W10gPSBbXTtcclxuICBwcmV2aW91c0Zvcm1EYXRhOiBhbnkgPSB7fTtcclxuXHJcbiAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgdmlld0Zvcm1zQnV0dG9uID0ge1xyXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgc2hvd0xvYWRlcjogZmFsc2VcclxuICB9O1xyXG4gIHNhdmVGb3JtQnV0dG9uID0ge1xyXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgc2hvd0xvYWRlcjogZmFsc2VcclxuICB9O1xyXG5cclxuICBmb3JtR3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1WaWV3U2VydmljZTogS3dpa0lERm9ybVZpZXdTZXJ2aWNlKSB7fVxyXG5cclxuICBAbG9nXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmluaXRGb3JtQ29uZmlnKHRoaXMuZm9ybUNvbmZpZyk7XHJcblxyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH0pKCk7XHJcbiAgfVxyXG5cclxuICBAbG9nXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge31cclxuXHJcbiAgQGxvZ1xyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICByZXR1cm4gaGFzS2V5KGNoYW5nZXMsIGtleSkgJiYgIWNoYW5nZXNba2V5XS5maXJzdENoYW5nZTtcclxuICAgIH07XHJcbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZm9ybURhdGFcIikpIHtcclxuICAgICAgdGhpcy5mb3JtRGF0YSA9IHtcclxuICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxyXG4gICAgICAgIC4uLmNoYW5nZXMuZm9ybURhdGEuY3VycmVudFZhbHVlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiYXBpQ2FsbFJlc3BvbnNlXCIpKSB7XHJcbiAgICAgIHRoaXMuYXBpQ2FsbFJlc3BvbnNlID0gY2hhbmdlcy5hcGlDYWxsUmVzcG9uc2UuY3VycmVudFZhbHVlO1xyXG5cclxuICAgICAgdGhpcy5mb3JtRGF0YSA9IHtcclxuICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxyXG4gICAgICAgIFt0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXldOiB0aGlzLmFwaUNhbGxSZXNwb25zZS5yZXNwb25zZVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBbdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5XTogdGhpcy5hcGlDYWxsUmVzcG9uc2UucmVzcG9uc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICBsZXQgZmllbGQ6IFRGaWVsZEFwaUNhbGwgPSBmaW5kRmllbGRGcm9tS2V5KFxyXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcclxuICAgICAgICB0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IGFwaXMgPSBuZXcgQXBpcyhcclxuICAgICAgICBmaWVsZCxcclxuICAgICAgICB0aGlzLmZvcm1EYXRhLFxyXG4gICAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSxcclxuICAgICAgICB0aGlzLmFsbEZvcm1zRGF0YSxcclxuICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICBmaWVsZCA9IGF3YWl0IGFwaXMudmFsaWRhdGVBcGlDYWxsUmVzcG9uc2UoKTtcclxuICAgICAgfSkoKTtcclxuICAgIH1cclxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJpc01vYmlsZVZpZXdcIikpIHtcclxuICAgICAgdGhpcy5pc01vYmlsZVZpZXcgPSBjaGFuZ2VzLmlzTW9iaWxlVmlldy5jdXJyZW50VmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiYWxsRm9ybXNEYXRhXCIpKSB7XHJcbiAgICAgIHRoaXMuYWxsRm9ybXNEYXRhID0gY2hhbmdlcy5hbGxGb3Jtc0RhdGEuY3VycmVudFZhbHVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvcm1zTGlzdFwiKSkge1xyXG4gICAgICB0aGlzLmZvcm1zTGlzdCA9IGNoYW5nZXMuZm9ybXNMaXN0LmN1cnJlbnRWYWx1ZTtcclxuICAgIH1cclxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJmb3JtQ29uZmlnXCIpKSB7XHJcbiAgICAgIHRoaXMuZm9ybUNvbmZpZyA9IGNoYW5nZXMuZm9ybUNvbmZpZy5jdXJyZW50VmFsdWU7XHJcblxyXG4gICAgICAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdEZvcm1Db25maWcodGhpcy5mb3JtQ29uZmlnKTtcclxuICAgICAgfSkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBsb2dcclxuICBhc3luYyBpbml0Rm9ybUNvbmZpZyhmb3JtQ29uZmlnOiBhbnkpIHtcclxuICAgIHRoaXMuc2V0Rm9ybUZpZWxkc0Zyb21Gb3JtQ29uZmlnKGZvcm1Db25maWcpO1xyXG5cclxuICAgIHRoaXMuc2V0Rm9ybURhdGFGcm9tQWxsRm9ybXNEYXRhKCk7XHJcblxyXG4gICAgdGhpcy5mb3JtR3JvdXAgPSBhd2FpdCB0aGlzLmZvcm1WaWV3U2VydmljZS5jcmVhdGVGb3JtR3JvdXAoXHJcbiAgICAgIHRoaXMuZm9ybUZpZWxkcyxcclxuICAgICAgdGhpcy5mb3JtRGF0YSxcclxuICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxyXG4gICAgICB0aGlzLmFsbEZvcm1zRGF0YSxcclxuICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcclxuICAgICk7XHJcblxyXG4gICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5mb3JtRmllbGRzKSB7XHJcbiAgICAgIGlmIChmaWVsZC50eXBlICE9PSBcInRpdGxlXCIpIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEgPSB7XHJcbiAgICAgICAgICAuLi50aGlzLnByZXZpb3VzRm9ybURhdGEsXHJcbiAgICAgICAgICBbZmllbGQua2V5XTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAucGlwZShwYWlyd2lzZSgpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoW3ByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZV0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhID0ge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMucHJldmlvdXNGb3JtRGF0YSxcclxuICAgICAgICAgICAgICBbZmllbGQua2V5XTogcHJldmlvdXNWYWx1ZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxyXG4gICAgICAgICAgICAgIFtmaWVsZC5rZXldOiBjdXJyZW50VmFsdWVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZvcm1GaWVsZHMpIHtcclxuICAgICAgaWYgKGZpZWxkLnR5cGUgIT09IFwidGl0bGVcIikge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICBmaWVsZCA9IGF3YWl0IHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBrZXk6IGZpZWxkLmtleSxcclxuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBcIk9OX0lOSVRcIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAbG9nXHJcbiAgc2V0Rm9ybUZpZWxkc0Zyb21Gb3JtQ29uZmlnKGZvcm1Db25maWc6IGFueSkge1xyXG4gICAgaWYgKGhhc0tleShmb3JtQ29uZmlnLCBcImZpZWxkc1wiKSkge1xyXG4gICAgICB0aGlzLmZvcm1GaWVsZHMgPSBmb3JtQ29uZmlnLmZpZWxkcztcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIGhhc0tleShmb3JtQ29uZmlnLCBcIm11bHRpRm9ybVwiKSAmJlxyXG4gICAgICBoYXNLZXkoZm9ybUNvbmZpZy5tdWx0aUZvcm0sIFwiZmllbGRzXCIpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5mb3JtRmllbGRzID0gZm9ybUNvbmZpZy5tdWx0aUZvcm0uZmllbGRzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQGxvZ1xyXG4gIHNldEZvcm1EYXRhRnJvbUFsbEZvcm1zRGF0YSgpIHtcclxuICAgIGlmIChoYXNLZXkodGhpcy5hbGxGb3Jtc0RhdGEsIHRoaXMuZm9ybUNvbmZpZy5rZXkpKSB7XHJcbiAgICAgIHRoaXMuZm9ybURhdGEgPSB0aGlzLmFsbEZvcm1zRGF0YVt0aGlzLmZvcm1Db25maWcua2V5XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybURhdGEgPSB7fTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBsb2dcclxuICBhc3luYyBoYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRBY3Rpb25zKFxyXG4gICAgY29ubmVjdGVkRmllbGRDb25maWc6IGFueSxcclxuICAgIGNvbm5lY3RlZEZpZWxkOiBhbnlcclxuICApIHtcclxuICAgIGlmIChoYXNLZXkoY29ubmVjdGVkRmllbGRDb25maWcsIFwicnVsZXNcIikpIHtcclxuICAgICAgY29uc3QgcnVsZXNNYXBwaW5nID0gbmV3IFJ1bGVzKFxyXG4gICAgICAgIGNvbm5lY3RlZEZpZWxkQ29uZmlnLnJ1bGVzLFxyXG4gICAgICAgIGNvbm5lY3RlZEZpZWxkLFxyXG4gICAgICAgIHRoaXMuZm9ybURhdGEsXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxyXG4gICAgICAgIHRoaXMuYWxsRm9ybXNEYXRhXHJcbiAgICAgICkubWFwcGluZygpO1xyXG5cclxuICAgICAgZm9yIChsZXQgYWN0aW9uIG9mIGNvbm5lY3RlZEZpZWxkQ29uZmlnLmFjdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBjb25kaXRpb25TdWNjZXNzID0gbmV3IENvbmRpdGlvbihcclxuICAgICAgICAgIGFjdGlvbi5jb25kaXRpb24sXHJcbiAgICAgICAgICBydWxlc01hcHBpbmdcclxuICAgICAgICApLmV2YWx1YXRlKCk7XHJcblxyXG4gICAgICAgIGlmIChjb25kaXRpb25TdWNjZXNzKSB7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25zID0gbmV3IEFjdGlvbnMoXHJcbiAgICAgICAgICAgIGFjdGlvbixcclxuICAgICAgICAgICAgY29ubmVjdGVkRmllbGQsXHJcbiAgICAgICAgICAgIHJ1bGVzTWFwcGluZyxcclxuICAgICAgICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEsXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybURhdGEsXHJcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSxcclxuICAgICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgYXdhaXQgYWN0aW9ucy5leGVjdXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbm5lY3RlZEZpZWxkO1xyXG4gIH1cclxuXHJcbiAgQGxvZ1xyXG4gIGFzeW5jIGhhbmRsZUNvbm5lY3RlZEVsZW1lbnRGaWVsZHMoXHJcbiAgICBjdXJyZW50RmllbGQ6IGFueSxcclxuICAgIGNvbm5lY3RlZEZpZWxkQ29uZmlnOiBhbnksXHJcbiAgICBldmVudFR5cGU6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgbGV0IGNvbm5lY3RlZEZpZWxkID0gZmluZEZpZWxkRnJvbUtleShcclxuICAgICAgdGhpcy5mb3JtRmllbGRzLFxyXG4gICAgICBjb25uZWN0ZWRGaWVsZENvbmZpZ1tcImtleVwiXVxyXG4gICAgKTtcclxuXHJcbiAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xyXG4gICAgICBjYXNlIFwiSU5JVFwiOlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGhhc0tleShjb25uZWN0ZWRGaWVsZCwgXCJ0cmlnZ2Vyc1wiKSAmJlxyXG4gICAgICAgICAgY29ubmVjdGVkRmllbGQudHJpZ2dlcnMuaW5jbHVkZXMoXCJJTklUXCIpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5pc0ZpZWxkRW5hYmxlZChjb25uZWN0ZWRGaWVsZC5rZXkpKSB7XHJcbiAgICAgICAgICAgIGlmIChoYXNLZXkoY29ubmVjdGVkRmllbGRDb25maWcsIFwiY29ubmVjdGVkUGFyZW50RmllbGRzXCIpKSB7XHJcbiAgICAgICAgICAgICAgc3dpdGNoIChjb25uZWN0ZWRGaWVsZENvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZHJvcGRvd24td2l0aC1zZWFyY2hcIjpcclxuICAgICAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGQgPSBhd2FpdCB0aGlzLmhhbmRsZUZpZWxkVHlwZVNlYXJjaFRleHQoXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25uZWN0ZWRGaWVsZCA9IGF3YWl0IHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkQWN0aW9ucyhcclxuICAgICAgICAgICAgY29ubmVjdGVkRmllbGRDb25maWcsXHJcbiAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIlZBTFVFX0NIQU5HRVwiOlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGhhc0tleShjb25uZWN0ZWRGaWVsZENvbmZpZywgXCJ0cmlnZ2Vyc1wiKSAmJlxyXG4gICAgICAgICAgY29ubmVjdGVkRmllbGRDb25maWcudHJpZ2dlcnMuaW5jbHVkZXMoXCJWQUxVRV9DSEFOR0VcIilcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHN3aXRjaCAoY29ubmVjdGVkRmllbGQudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiZHJvcGRvd24td2l0aC1zZWFyY2hcIjpcclxuICAgICAgICAgICAgICBjb25uZWN0ZWRGaWVsZCA9IGF3YWl0IHRoaXMuaGFuZGxlRmllbGRUeXBlU2VhcmNoVGV4dChcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZCxcclxuICAgICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkID0gYXdhaXQgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRBY3Rpb25zKFxyXG4gICAgICAgICAgICBjb25uZWN0ZWRGaWVsZENvbmZpZyxcclxuICAgICAgICAgICAgY29ubmVjdGVkRmllbGRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiTkVTVEVEX0xJTktcIjpcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBoYXNLZXkoY29ubmVjdGVkRmllbGRDb25maWcsIFwidHJpZ2dlcnNcIikgJiZcclxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkQ29uZmlnLnRyaWdnZXJzLmluY2x1ZGVzKFwiTkVTVEVEX0xJTktcIilcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkID0gYXdhaXQgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRBY3Rpb25zKFxyXG4gICAgICAgICAgICBjb25uZWN0ZWRGaWVsZENvbmZpZyxcclxuICAgICAgICAgICAgY29ubmVjdGVkRmllbGRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlmIChoYXNLZXkoY29ubmVjdGVkRmllbGRDb25maWcsIFwidHJpZ2dlcnNcIikpIHtcclxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkID0gYXdhaXQgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRBY3Rpb25zKFxyXG4gICAgICAgICAgICBjb25uZWN0ZWRGaWVsZENvbmZpZyxcclxuICAgICAgICAgICAgY29ubmVjdGVkRmllbGRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYXNLZXkoY29ubmVjdGVkRmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIikpIHtcclxuICAgICAgZm9yIChjb25zdCBjb25uZWN0ZWRGaWVsZENvbmZpZyBvZiBjb25uZWN0ZWRGaWVsZC5jb25uZWN0ZWRFbGVtZW50c1xyXG4gICAgICAgIC5maWVsZHMpIHtcclxuICAgICAgICBjb25uZWN0ZWRGaWVsZCA9IHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkcyhcclxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkLFxyXG4gICAgICAgICAgY29ubmVjdGVkRmllbGRDb25maWcsXHJcbiAgICAgICAgICBcIk5FU1RFRF9MSU5LXCJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnRGaWVsZDtcclxuICB9XHJcblxyXG4gIEBsb2dcclxuICBoYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhlOiBhbnksIGV2ZW50VHlwZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgY3VycmVudEZpZWxkID0gZmluZEZpZWxkRnJvbUtleSh0aGlzLmZvcm1GaWVsZHMsIGUua2V5KTtcclxuXHJcbiAgICBpZiAoaGFzS2V5KGN1cnJlbnRGaWVsZCwgXCJjb25uZWN0ZWRFbGVtZW50c1wiKSkge1xyXG4gICAgICBsZXQgY29ubmVjdGVkRmllbGRzID0gY3VycmVudEZpZWxkLmNvbm5lY3RlZEVsZW1lbnRzLmNvbm5lY3RlZEZpZWxkcztcclxuICAgICAgZm9yIChsZXQgY29ubmVjdGVkRmllbGRDb25maWcgb2YgY29ubmVjdGVkRmllbGRzKSB7XHJcbiAgICAgICAgY3VycmVudEZpZWxkID0gdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRzKFxyXG4gICAgICAgICAgY3VycmVudEZpZWxkLFxyXG4gICAgICAgICAgY29ubmVjdGVkRmllbGRDb25maWcsXHJcbiAgICAgICAgICBldmVudFR5cGVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBET00gRXZlbnQgSGFuZGxlcnNcclxuICBAbG9nXHJcbiAgaGFuZGxlR2V0S2V5VmFsdWUoZTogYW55KSB7XHJcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxyXG4gICAgICB7XHJcbiAgICAgICAgW2Uua2V5XTogZS52YWx1ZVxyXG4gICAgICB9LFxyXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBDdXJyZW50bHkgc2V0IG9ubHkgZm9yIGRyb3Bkb3duLXdpdGgtc2VhcmNoIGNvbm5lY3RlZCBmaWVsZHNcclxuICAgIGxldCBmaWVsZCA9IGZpbmRGaWVsZEZyb21LZXkodGhpcy5mb3JtRmllbGRzLCBlLmtleSk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBmaWVsZC50eXBlICE9PSBcInRpdGxlXCIgJiZcclxuICAgICAgZmllbGQudmFsaWRhdGlvbi50cmlnZ2Vycy5pbmNsdWRlcyhcIk9OX0NIQU5HRVwiKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25zID0gbmV3IFZhbGlkYXRpb25zKFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICAgIHRoaXMuZm9ybURhdGEsXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxyXG4gICAgICAgIHRoaXMuYWxsRm9ybXNEYXRhLFxyXG4gICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IHZhbGlkYXRpb25zLnZhbGlkYXRlRmllbGQoKTtcclxuICAgICAgfSkoKTtcclxuXHJcbiAgICAgIHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAga2V5OiBmaWVsZC5rZXksXHJcbiAgICAgICAgICB2YWx1ZTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJPTl9DSEFOR0VcIlxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQGxvZ1xyXG4gIGFzeW5jIGhhbmRsZU9uQ2xpY2tSZXNldEZvcm1GaWVsZHMoZTogYW55LCBmaWVsZDogVEZpZWxkVGl0bGUpIHtcclxuICAgIGZvciAobGV0IGYgb2YgZmllbGQucmVzZXQuZmllbGRzKSB7XHJcbiAgICAgIGZvciAobGV0IGEgb2YgZi5hY3Rpb25zKSB7XHJcbiAgICAgICAgY29uc3QgcmVzZXRGaWVsZCA9IGZpbmRGaWVsZEZyb21LZXkodGhpcy5mb3JtRmllbGRzLCBhLnByb3BzLmZpZWxkS2V5KTtcclxuICAgICAgICBjb25zdCBhY3Rpb25zID0gbmV3IEFjdGlvbnMoXHJcbiAgICAgICAgICBhLFxyXG4gICAgICAgICAgcmVzZXRGaWVsZCxcclxuICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEsXHJcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhLFxyXG4gICAgICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxyXG4gICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IGFjdGlvbnMuZXhlY3V0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAbG9nXHJcbiAgYXN5bmMgaGFuZGxlT25DbGlja0FwaUNhbGwoZTogYW55KSB7XHJcbiAgICBsZXQgZmllbGQ6IFRGaWVsZEFwaUNhbGwgPSBmaW5kRmllbGRGcm9tS2V5KHRoaXMuZm9ybUZpZWxkcywgZS5rZXkpO1xyXG5cclxuICAgIGlmIChmaWVsZC50eXBlID09PSBcImFwaS1jYWxsXCIpIHtcclxuICAgICAgLy8gc2V0IGJ1dHRvbiBzdGF0dXMgdG8gbG9hZGluZ1xyXG4gICAgICBmaWVsZFtcImFwaVwiXVtcInN0YXR1c1wiXVtcInZhbHVlXCJdID0gRUFwaVN0YXR1c1R5cGUuTE9BRElORztcclxuICAgICAgZmllbGRbXCJzaG93TG9hZGVyXCJdID0gdHJ1ZTtcclxuICAgICAgdGhpcy52aWV3Rm9ybXNCdXR0b25bXCJkaXNhYmxlZFwiXSA9IHRydWU7XHJcbiAgICAgIHRoaXMudmlld0Zvcm1zQnV0dG9uW1wic2hvd0xvYWRlclwiXSA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2F2ZUZvcm1CdXR0b25bXCJkaXNhYmxlZFwiXSA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2F2ZUZvcm1CdXR0b25bXCJzaG93TG9hZGVyXCJdID0gdHJ1ZTtcclxuXHJcbiAgICAgIGNvbnN0IGFwaXMgPSBuZXcgQXBpcyhcclxuICAgICAgICBmaWVsZCxcclxuICAgICAgICB0aGlzLmZvcm1EYXRhLFxyXG4gICAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSxcclxuICAgICAgICB0aGlzLmFsbEZvcm1zRGF0YSxcclxuICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgZmllbGQgPSBhd2FpdCBhcGlzLnNldFJlcXVlc3RCb2R5UGFyYW1zKCk7XHJcblxyXG4gICAgICBmaWVsZCA9IGF3YWl0IGFwaXMudmFsaWRhdGVSZXF1ZXN0Qm9keSgpO1xyXG5cclxuICAgICAgaWYgKGZpZWxkLmFwaS5yZXF1ZXN0LmJvZHkudmFsaWRhdGlvbi5pc192YWxpZCkge1xyXG4gICAgICAgIC8vIENhbGwgQVBJIEhlcmVcclxuICAgICAgICB0aGlzLm9uQ2xpY2tBcGlDYWxsLmVtaXQoe1xyXG4gICAgICAgICAga2V5OiBlLmtleSxcclxuICAgICAgICAgIHJlcXVlc3Q6IHtcclxuICAgICAgICAgICAgbW9kZTogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgIGJvZHk6IGZpZWxkLmFwaS5yZXF1ZXN0LmJvZHkudmFsdWUsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gUmVxdWVzdCBCb2R5IFZhbGlkYXRpb24gRmFpbGVkXHJcbiAgICAgICAgLy8gSGlnaGxpZ2h0IEVycm9yIGluIFVJIHRvIFVzZXIgdG8gUmV0cnkgQWZ0ZXIgU29tZXRpbWUuXHJcbiAgICAgICAgLy8gVGFrZSBBY3Rpb25zIGJhc2VkIG9uIFZhbGlkYXRpb25cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGZpZWxkW1wiYXBpXCJdW1wic3RhdHVzXCJdW1widmFsdWVcIl0gPSBFQXBpU3RhdHVzVHlwZS5GQUlMRUQ7XHJcbiAgICAgICAgICBmaWVsZFtcInNob3dMb2FkZXJcIl0gPSBmYWxzZTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnZpZXdGb3Jtc0J1dHRvbltcImRpc2FibGVkXCJdID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudmlld0Zvcm1zQnV0dG9uW1wic2hvd0xvYWRlclwiXSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNhdmVGb3JtQnV0dG9uW1wiZGlzYWJsZWRcIl0gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zYXZlRm9ybUJ1dHRvbltcInNob3dMb2FkZXJcIl0gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBsb2dcclxuICBoYW5kbGVPbkNsaWNrVmlld0Zvcm1zKGU6IGFueSkge1xyXG4gICAgdGhpcy5vbkNsaWNrVmlld0Zvcm1zLmVtaXQoe1xyXG4gICAgICBjbGlja2VkOiB0cnVlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEBsb2dcclxuICBoYW5kbGVPbkNsaWNrU2F2ZUZvcm0oZTogYW55KSB7XHJcbiAgICBsZXQgZm9ybURhdGEgPSB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xyXG5cclxuICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZm9ybUZpZWxkcykge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZmllbGQudHlwZSAhPT0gXCJ0aXRsZVwiICYmXHJcbiAgICAgICAgZmllbGQudmFsaWRhdGlvbi50cmlnZ2Vycy5pbmNsdWRlcyhcIk9OX1NBVkVcIilcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbnMgPSBuZXcgVmFsaWRhdGlvbnMoXHJcbiAgICAgICAgICBmaWVsZCxcclxuICAgICAgICAgIHRoaXMuZm9ybURhdGEsXHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEsXHJcbiAgICAgICAgICB0aGlzLmFsbEZvcm1zRGF0YSxcclxuICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGF3YWl0IHZhbGlkYXRpb25zLnZhbGlkYXRlRmllbGQoKTtcclxuICAgICAgICB9KSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLmludmFsaWQpIHtcclxuICAgICAgY29uc3QgY29udHJvbHMgPSBuZXcgVmFsaWRhdGlvbnMoXHJcbiAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgIHRoaXMuZm9ybURhdGEsXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxyXG4gICAgICAgIHRoaXMuYWxsRm9ybXNEYXRhLFxyXG4gICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXHJcbiAgICAgICkuZmluZEludmFsaWRDb250cm9sc1JlY3Vyc2l2ZSh0aGlzLmZvcm1Hcm91cCk7XHJcblxyXG4gICAgICBsZXQgZmlyc3RGaWVsZFdpdGhFcnJvcjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAgIGZvciAobGV0IGNvbnRyb2wgb2YgY29udHJvbHMpIHtcclxuICAgICAgICBpZiAoY29udHJvbC5pbnZhbGlkICYmIGlzRW1wdHkoZmlyc3RGaWVsZFdpdGhFcnJvcikpIHtcclxuICAgICAgICAgIGZpcnN0RmllbGRXaXRoRXJyb3IgPSBjb250cm9sLmtleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzID0gc2V0RmllbGRFcnJvcihcclxuICAgICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcclxuICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbnRyb2wua2V5XS5lcnJvcnMsXHJcbiAgICAgICAgICBjb250cm9sLmtleSxcclxuICAgICAgICAgIGNvbnRyb2wuaW52YWxpZFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBOZWVkIHRvIGhhdmUgYW4gQVBJIFZhbGlkYXRvciBhcyB3ZWxsIGhlcmUuXHJcbiAgICAvLyBpZihhcGlDYWxsU3VjY2VzcygpKSB7IHRoZW4gb25seSBwcm9jZWVkIGZ1cnRoZXIsIGVsc2UgaGlnaGxpZ2h0IHRoZSBidXR0b24gdG8gY2xpY2sgdG8gY2FsbCBhcGl9XHJcblxyXG4gICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5mb3JtRmllbGRzKSB7XHJcbiAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xyXG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOlxyXG4gICAgICAgICAgaWYgKGhhc0tleShmb3JtRGF0YVtmaWVsZC5rZXldLCBcImxhYmVsXCIpKSB7XHJcbiAgICAgICAgICAgIGZvcm1EYXRhW2ZpZWxkLmtleV0gPSBmb3JtRGF0YVtmaWVsZC5rZXldLmxhYmVsO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9ybURhdGFbZmllbGQua2V5XSA9IFwiXCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICAgICAgaWYgKGlzTnVsbChmb3JtRGF0YVtmaWVsZC5rZXldKSkge1xyXG4gICAgICAgICAgICBmb3JtRGF0YVtmaWVsZC5rZXldID0gXCJcIjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvcm1EYXRhW2ZpZWxkLmtleV0gPSBmb3JtYXREYXRlVG9TdGFuZGFyZEZvcm1hdChcclxuICAgICAgICAgICAgICBmb3JtRGF0YVtmaWVsZC5rZXldXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwidGl0bGVcIjpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpZiAoaXNFbXB0eShmb3JtRGF0YVtmaWVsZC5rZXldKSkge1xyXG4gICAgICAgICAgICBmb3JtRGF0YVtmaWVsZC5rZXldID0gXCJcIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmtleXMoZm9ybURhdGEpLm1hcCgoa2V5KSA9PiB7XHJcbiAgICAgIGlmIChpc0VtcHR5KGZvcm1EYXRhW2tleV0pKSB7XHJcbiAgICAgICAgZm9ybURhdGFba2V5XSA9IFwiXCI7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMub25DbGlja1NhdmVGb3JtLmVtaXQoeyBkYXRhOiBmb3JtRGF0YSB9KTtcclxuICB9XHJcblxyXG4gIC8vIENvbXBvbmVudCBIZWxwZXJzXHJcbiAgQGxvZ1xyXG4gIGZpZWxkSGlkZShmaWVsZEtleTogc3RyaW5nKSB7XHJcbiAgICBsZXQgZmllbGQgPSBmaW5kRmllbGRGcm9tS2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xyXG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF1bXCJoaWRkZW5cIl0gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgQGxvZ1xyXG4gIGZpZWxkU2hvdyhmaWVsZEtleTogc3RyaW5nKSB7XHJcbiAgICBsZXQgZmllbGQgPSBmaW5kRmllbGRGcm9tS2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xyXG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF1bXCJoaWRkZW5cIl0gPSBmYWxzZTtcclxuICAgIHRoaXMuZm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICB9XHJcblxyXG4gIEBsb2dcclxuICBmaWVsZERpc2FibGUoZmllbGRLZXk6IHN0cmluZykge1xyXG4gICAgbGV0IGZpZWxkID0gZmluZEZpZWxkRnJvbUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcclxuICAgIGxldCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdW1wiZGlzYWJsZWRcIl0gPSB0cnVlO1xyXG5cclxuICAgIGlmIChpc05vdEVtcHR5KHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKSkge1xyXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLmRpc2FibGUoe1xyXG4gICAgICAgIGVtaXRFdmVudDogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAbG9nXHJcbiAgZmllbGRFbmFibGUoZmllbGRLZXk6IHN0cmluZykge1xyXG4gICAgbGV0IGZpZWxkID0gZmluZEZpZWxkRnJvbUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcclxuICAgIGxldCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdW1wiZGlzYWJsZWRcIl0gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoaXNOb3RFbXB0eSh0aGlzLmZvcm1Hcm91cC5jb250cm9scykpIHtcclxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS5lbmFibGUoe1xyXG4gICAgICAgIGVtaXRFdmVudDogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAbG9nXHJcbiAgZmllbGRSZXNldChmaWVsZEtleTogc3RyaW5nKSB7XHJcbiAgICAvLyBGaW5kIHRoZSBmaWVsZCBhbmQgaXRzIGluZGV4IGluIHRoZSBmb3JtRmllbGRzIGFycmF5XHJcbiAgICBsZXQgZmllbGQgPSBmaW5kRmllbGRGcm9tS2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xyXG4gICAgbGV0IGZpZWxkSW5kZXggPSBmaW5kRmllbGRJbmRleEZyb21LZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XHJcblxyXG4gICAgLy8gRGVsZXRlIHRoZSBmaWVsZCBmcm9tIHRoZSBmb3JtRGF0YSBvYmplY3RcclxuICAgIGRlbGV0ZSB0aGlzLmZvcm1EYXRhW2ZpZWxkS2V5XTtcclxuXHJcbiAgICAvLyBSZXNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtR3JvdXBcclxuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0ucmVzZXQoc2V0RW1wdHlWYWx1ZShmaWVsZCksIHtcclxuICAgICAgZW1pdEV2ZW50OiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gUmVzZXQgdGhlIG1lc3NhZ2VzIGFuZCBlcnJvcnMgZm9yIHRoZSBmaWVsZFxyXG4gICAgZmllbGQgPSByZW1vdmVNZXNzYWdlKGZpZWxkLCB7XHJcbiAgICAgIHR5cGU6IEVNZXNzYWdlVHlwZS5XQVJOSU5HLFxyXG4gICAgICBtZXNzYWdlOiBcIlwiXHJcbiAgICB9KTtcclxuICAgIGZpZWxkID0gcmVtb3ZlTWVzc2FnZShmaWVsZCwge1xyXG4gICAgICB0eXBlOiBFTWVzc2FnZVR5cGUuU1VDQ0VTUyxcclxuICAgICAgbWVzc2FnZTogXCJcIlxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZpZWxkRXJyb3JIaWRlKGZpZWxkS2V5LCB7XHJcbiAgICAgIHR5cGU6IEVNZXNzYWdlVHlwZS5FUlJPUixcclxuICAgICAgbWVzc2FnZTogXCJcIlxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gUmVzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgZm9ybUZpZWxkcyBhcnJheVxyXG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XHJcbiAgICAgIGNhc2UgXCJhcGktY2FsbFwiOlxyXG4gICAgICAgIGNvbnN0IGZpZWxkQXBpQ2FsbCA9IGZpZWxkIGFzIFRGaWVsZEFwaUNhbGw7XHJcbiAgICAgICAgZmllbGRBcGlDYWxsLmFwaS5zdGF0dXMudmFsdWUgPSBFQXBpU3RhdHVzVHlwZS5ERUZBVUxUO1xyXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkQXBpQ2FsbDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBmaWVsZC5mb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIGZpZWxkLmludmFsaWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBsb2dcclxuICBmaWVsZEVycm9yU2hvdyhmaWVsZEtleTogc3RyaW5nLCBtZXNzYWdlOiBUTWVzc2FnZSkge1xyXG4gICAgbGV0IGZpZWxkID0gZmluZEZpZWxkRnJvbUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcclxuICAgIGxldCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xyXG4gICAgfSk7XHJcblxyXG4gICAgZmllbGQgPSBoaWdobGlnaHRGaWVsZEVycm9yKGZpZWxkLCB0cnVlKTtcclxuICAgIGZpZWxkID0gYWRkTWVzc2FnZShmaWVsZCwgbWVzc2FnZSk7XHJcblxyXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGQ7XHJcbiAgfVxyXG5cclxuICBAbG9nXHJcbiAgZmllbGRFcnJvckhpZGUoZmllbGRLZXk6IHN0cmluZywgbWVzc2FnZTogVE1lc3NhZ2UpIHtcclxuICAgIGxldCBmaWVsZCA9IGZpbmRGaWVsZEZyb21LZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XHJcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZpZWxkID0gaGlnaGxpZ2h0RmllbGRFcnJvcihmaWVsZCwgZmFsc2UpO1xyXG4gICAgZmllbGQgPSByZW1vdmVNZXNzYWdlKGZpZWxkLCBtZXNzYWdlKTtcclxuXHJcbiAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcclxuICB9XHJcblxyXG4gIEBsb2dcclxuICBmaWVsZE1lc3NhZ2VTaG93KGZpZWxkS2V5OiBzdHJpbmcsIG1lc3NhZ2U6IFRNZXNzYWdlKSB7XHJcbiAgICBsZXQgZmllbGQgPSBmaW5kRmllbGRGcm9tS2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xyXG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmaWVsZCA9IGFkZE1lc3NhZ2UoZmllbGQsIG1lc3NhZ2UpO1xyXG5cclxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xyXG4gIH1cclxuXHJcbiAgQGxvZ1xyXG4gIGZpZWxkTWVzc2FnZUhpZGUoZmllbGRLZXk6IHN0cmluZywgbWVzc2FnZTogVE1lc3NhZ2UpIHtcclxuICAgIGxldCBmaWVsZCA9IGZpbmRGaWVsZEZyb21LZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XHJcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZpZWxkID0gcmVtb3ZlTWVzc2FnZShmaWVsZCwgbWVzc2FnZSk7XHJcblxyXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGQ7XHJcbiAgfVxyXG5cclxuICBAbG9nXHJcbiAgc2V0T2JqZWN0VmFsdWUoZmllbGQ6IGFueSwgcGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KSB7fVxyXG5cclxuICBAbG9nXHJcbiAgcGF0Y2hGaWVsZENvbnRyb2xWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZShcclxuICAgICAge1xyXG4gICAgICAgIFtrZXldOiB2YWx1ZVxyXG4gICAgICB9LFxyXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIEBsb2dcclxuICBpc0ZpZWxkVmFsaWQoZmllbGRLZXk6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkS2V5XS52YWxpZDtcclxuICB9XHJcblxyXG4gIEBsb2dcclxuICBpc0ZpZWxkRW5hYmxlZChmaWVsZEtleTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGRLZXldLmVuYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBAbG9nXHJcbiAgZ2V0Rm9ybUdyb3VwUmF3VmFsdWVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBAbG9nXHJcbiAgYXN5bmMgaGFuZGxlRmllbGRUeXBlU2VhcmNoVGV4dChmaWVsZDogYW55LCBjaGlsZEZpZWxkOiBhbnkpIHtcclxuICAgIGlmIChoYXNLZXkoY2hpbGRGaWVsZCwgXCJqc29uXCIpKSB7XHJcbiAgICAgIGNoaWxkRmllbGQub3B0aW9ucyA9IGdldFNlYXJjaFRleHRPcHRpb25zRnJvbUZpZWxkQ29uZmlnKFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICAgIGNoaWxkRmllbGQsXHJcbiAgICAgICAgdGhpcy5mb3JtR3JvdXBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChoYXNLZXkoY2hpbGRGaWVsZCwgXCJmZXRjaEpzb25Gcm9tUmVtb3RlXCIpKSB7XHJcbiAgICAgIGNoaWxkRmllbGQub3B0aW9ucyA9IGF3YWl0IGdldFNlYXJjaFRleHRPcHRpb25zRnJvbVJlbW90ZUZpbGUoXHJcbiAgICAgICAgZmllbGQsXHJcbiAgICAgICAgY2hpbGRGaWVsZCxcclxuICAgICAgICB0aGlzLmZvcm1Hcm91cFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjaGlsZEZpZWxkO1xyXG4gIH1cclxuXHJcbiAgQGxvZ1xyXG4gIGFzeW5jIHRha2VBY3Rpb24oXHJcbiAgICBhY3Rpb246IFRBY3Rpb24sXHJcbiAgICBmaWVsZDogVEZpZWxkLFxyXG4gICAgYWxsRm9ybXNEYXRhOiBhbnksXHJcbiAgICBmb3JtRGF0YTogYW55LFxyXG4gICAgcHJldmlvdXNGb3JtRGF0YTogYW55XHJcbiAgKSB7XHJcbiAgICBzd2l0Y2ggKGFjdGlvbi5rZXkpIHtcclxuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0hJREU6XHJcbiAgICAgICAgdGhpcy5maWVsZEhpZGUoYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX1NIT1c6XHJcbiAgICAgICAgdGhpcy5maWVsZFNob3coYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0RJU0FCTEU6XHJcbiAgICAgICAgdGhpcy5maWVsZERpc2FibGUoYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0VOQUJMRTpcclxuICAgICAgICB0aGlzLmZpZWxkRW5hYmxlKGFjdGlvbi5wcm9wcy5maWVsZEtleSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9SRVNFVDpcclxuICAgICAgICB0aGlzLmZpZWxkUmVzZXQoYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0VSUk9SX1NIT1c6XHJcbiAgICAgICAgdGhpcy5maWVsZEVycm9yU2hvdyhhY3Rpb24ucHJvcHMuZmllbGRLZXksIGFjdGlvbi5wcm9wcy5tZXNzYWdlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0VSUk9SX0hJREU6XHJcbiAgICAgICAgdGhpcy5maWVsZEVycm9ySGlkZShhY3Rpb24ucHJvcHMuZmllbGRLZXksIGFjdGlvbi5wcm9wcy5tZXNzYWdlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX01FU1NBR0VfU0hPVzpcclxuICAgICAgICB0aGlzLmZpZWxkTWVzc2FnZVNob3coYWN0aW9uLnByb3BzLmZpZWxkS2V5LCBhY3Rpb24ucHJvcHMubWVzc2FnZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9NRVNTQUdFU19ISURFOlxyXG4gICAgICAgIHRoaXMuZmllbGRNZXNzYWdlSGlkZShhY3Rpb24ucHJvcHMuZmllbGRLZXksIGFjdGlvbi5wcm9wcy5tZXNzYWdlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNFVF9WQUxVRTpcclxuICAgICAgICBjb25zdCBzb3VyY2VzID0gbmV3IFNvdXJjZXMoXHJcbiAgICAgICAgICBmaWVsZCxcclxuICAgICAgICAgIHRoaXMuZm9ybURhdGEsXHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEsXHJcbiAgICAgICAgICB0aGlzLmFsbEZvcm1zRGF0YVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gYXdhaXQgc291cmNlcy5nZXRWYWx1ZUZyb21Tb3VyY2UoXHJcbiAgICAgICAgICBhY3Rpb24ucHJvcHMudmFsdWUuc291cmNlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBzb3VyY2VzLnNldFZhbHVlVG9Tb3VyY2UoYWN0aW9uLnByb3BzLnZhbHVlLmRlc3RpbmF0aW9uLCBzb3VyY2VWYWx1ZSk7XHJcblxyXG4gICAgICAgIGZpZWxkID0gc291cmNlcy5maWVsZDtcclxuICAgICAgICB0aGlzLmZvcm1EYXRhID0gc291cmNlcy5mb3JtRGF0YTtcclxuICAgICAgICB0aGlzLmFsbEZvcm1zRGF0YSA9IHNvdXJjZXMuYWxsRm9ybXNEYXRhO1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSA9IHNvdXJjZXMucHJldmlvdXNGb3JtRGF0YTtcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgRUFjdGlvbktleS5IQU5ETEVfQ09OTkVDVEVEX0VMRU1FTlRTOlxyXG4gICAgICAgIHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoeyBrZXk6IGZpZWxkLmtleSB9LCBcIkFDVElPTlwiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBFQWN0aW9uS2V5LkNVU1RPTTpcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gIGNsYXNzPVwia3dpa2lkLWZvcm0tY29udGFpbmVyXCJcclxuICAqbmdJZj1cIiF0aGlzLmxvYWRpbmdcIlxyXG4+XHJcbiAgPGRpdiBpZD1cInVmLWZvcm0tZmllbGRzLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgIDxkaXYgaWQ9XCJ1Zi1mb3JtLWZpZWxkcy10aXRsZVwiPlxyXG4gICAgICB7eyB0aGlzLmZvcm1Db25maWcudGl0bGUgfX1cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBpZD1cInVmLWZvcm0tZmllbGRzLXN0ZXBzXCI+XHJcbiAgICAgIFN0ZXAge3sgdGhpcy5mb3JtQ29uZmlnLnNlcXVlbmNlTm8gfX0gb2Yge3sgdGhpcy5mb3Jtc0xpc3QubGVuZ3RoIH19XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8Zm9ybVxyXG4gICAgY2xhc3M9XCJrd2lraWQtZm9ybSBzaG93XCJcclxuICAgIFtmb3JtR3JvdXBdPVwidGhpcy5mb3JtR3JvdXBcIlxyXG4gID5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHRoaXMuZm9ybUZpZWxkczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmaWVsZC50eXBlXCI+XHJcbiAgICAgICAgPCEtLSBGb3JtIFRpdGxlIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0aXRsZSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8a3dpa3VpLWJ1dHRvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiZmllbGQ/LnJlc2V0XCJcclxuICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwid2hpdGVibG9ja1wiXHJcbiAgICAgICAgICAgICAgc2l6ZT1cInNcIlxyXG4gICAgICAgICAgICAgIGxhYmVsPVwiUmVzZXRcIlxyXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cInRoaXMuaGFuZGxlT25DbGlja1Jlc2V0Rm9ybUZpZWxkcygkZXZlbnQsIGZpZWxkKVwiXHJcbiAgICAgICAgICAgID48L2t3aWt1aS1idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tIElucHV0IFRleHQgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCI+XHJcbiAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiPlxyXG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0XHJcbiAgICAgICAgICAgICAgW2Nhc2VdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNhc2VcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcclxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQubGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXHJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxyXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0PlxyXG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXHJcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcclxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcclxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPCEtLSBDaGVja2JveCAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XHJcbiAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiPlxyXG4gICAgICAgICAgICA8a3dpa3VpLWNoZWNrYm94LWJsb2NrXHJcbiAgICAgICAgICAgICAgW2NvbnRlbnRBbGlnbl09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGVudEFsaWduID8/ICdsZWZ0J1wiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXHJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXHJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxyXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICBbc2l6ZV09XCJmaWVsZD8ucHJvcGVydGllcz8uc2l6ZSA/PyAnbCdcIlxyXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcclxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID48L2t3aWt1aS1jaGVja2JveC1ibG9ja1xyXG4gICAgICAgICAgICA+PGt3aWt1aS1tZXNzYWdlc1xyXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXHJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXHJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwhLS0gSW5wdXQgTnVtYmVyIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiPlxyXG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LW51bWJlclxyXG4gICAgICAgICAgICAgIFtkZWNpbWFsXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5kZWNpbWFsXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcclxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcclxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgW21heF09XCJmaWVsZD8ucHJvcGVydGllcz8ubWF4XCJcclxuICAgICAgICAgICAgICBbbWluXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5taW5cIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtwb3N0Zml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wb3N0Zml4ID8/ICcnXCJcclxuICAgICAgICAgICAgICBbcHJlY2lzaW9uXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wcmVjaXNpb25cIlxyXG4gICAgICAgICAgICAgIFtwcmVmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWZpeCA/PyAnJ1wiXHJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcclxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1udW1iZXJcclxuICAgICAgICAgICAgPjxrd2lrdWktbWVzc2FnZXNcclxuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tIElucHV0IERhdGUgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XHJcbiAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiPlxyXG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LWRhdGVcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcclxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcclxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkLmxhYmVsXCJcclxuICAgICAgICAgICAgICBbbWF4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5tYXhcIlxyXG4gICAgICAgICAgICAgIFttaW5dPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1pblwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcclxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1kYXRlPlxyXG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXHJcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcclxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcclxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPCEtLSBJbnB1dCBQaG9uZSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGhvbmUnXCI+XHJcbiAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiPlxyXG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LXBob25lXHJcbiAgICAgICAgICAgICAgW2NvdW50cnlDb2RlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb3VudHJ5Q29kZVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXHJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXHJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxyXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtwaG9uZU1hc2tBZnRlckNvdW50cnlDb2RlXT1cIlxyXG4gICAgICAgICAgICAgICAgZmllbGQ/LnByb3BlcnRpZXM/LnBob25lTWFza0FmdGVyQ291bnRyeUNvZGVcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcclxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1waG9uZT5cclxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xyXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXHJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXHJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwhLS0gSW5wdXQgUmFkaW8gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3JhZGlvJ1wiPlxyXG4gICAgICAgICAgPGRpdiBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIj5cclxuICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgW3R1aUxhYmVsXT1cImxhYmVsVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwibWluLWhlaWdodDogYXV0b1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8a3dpa3VpLXJhZGlvLWxpc3RcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXHJcbiAgICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwiZmllbGQ/Lm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbb3JpZW50YXRpb25dPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm9yaWVudGF0aW9uXCJcclxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgICAgW3NpemVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNpemVcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxyXG4gICAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgID48L2t3aWt1aS1yYWRpby1saXN0PlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsVGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPHBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHVpLXNwYWNlX2JvdHRvbS0yXCJcclxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQudmFsaWRhdG9ycz8ucmVxdWlyZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2I+XHJcbiAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXHJcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcclxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcclxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPCEtLSBEcm9wZG93biAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24td2l0aC1zZWFyY2gnXCI+XHJcbiAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiPlxyXG4gICAgICAgICAgICA8a3dpa3VpLXNlbGVjdC1jb21ib2JveFxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcclxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQubGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpZWxkLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXHJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxyXG4gICAgICAgICAgICA+PC9rd2lrdWktc2VsZWN0LWNvbWJvYm94PlxyXG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXHJcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcclxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcclxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPCEtLSBBUEkgQ2FsbCAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXBpLWNhbGwnXCI+XHJcbiAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiPlxyXG4gICAgICAgICAgICA8a3dpa3VpLWJ1dHRvbi1hcGktY2FsbFxyXG4gICAgICAgICAgICAgIFthcGlTdGF0dXNdPVwiZmllbGQ/LmFwaT8uc3RhdHVzPy52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImZpZWxkPy5jbGFzc1wiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5hcGk/LnN0YXR1cz8ubGFiZWxzW2ZpZWxkPy5hcGk/LnN0YXR1cz8udmFsdWVdXCJcclxuICAgICAgICAgICAgICBbc2hvd0xvYWRlcl09XCJmaWVsZD8uZGlzYWJsZWQgPT09ICdsb2FkaW5nJ1wiXHJcbiAgICAgICAgICAgICAgc2hhcGU9XCJudWxsXCJcclxuICAgICAgICAgICAgICBzaXplPVwibVwiXHJcbiAgICAgICAgICAgICAgc3R5bGVzPVwid2lkdGg6IGZpdC1jb250ZW50XCJcclxuICAgICAgICAgICAgICAob25DbGljayk9XCJ0aGlzLmhhbmRsZU9uQ2xpY2tBcGlDYWxsKCRldmVudClcIlxyXG4gICAgICAgICAgICA+PC9rd2lrdWktYnV0dG9uLWFwaS1jYWxsPlxyXG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXHJcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcclxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcclxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPCEtLSBNb2JpbGUgT1RQIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidvdHAnXCI+XHJcbiAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiPlxyXG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LW90cFxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcclxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcclxuICAgICAgICAgICAgICBbbWFza109XCJmaWVsZD8ucHJvcGVydGllcz8ubWFza1wiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcclxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1vdHA+XHJcbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcclxuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tIEFhZGhhYXIgTnVtYmVyIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidhYWRoYWFyLW51bWJlcidcIj5cclxuICAgICAgICAgIDxkaXYgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtYWFkaGFhclxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcclxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxyXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LWFhZGhhYXI+XHJcbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcclxuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Zvcm0+XHJcbiAgPGRpdiBjbGFzcz1cImt3aWtpZC1mb3JtLWJ1dHRvbnNcIj5cclxuICAgIDxrd2lrdWktYnV0dG9uXHJcbiAgICAgICpuZ0lmPVwidGhpcy5pc01vYmlsZVZpZXdcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwidmlld0Zvcm1zQnV0dG9uLmRpc2FibGVkXCJcclxuICAgICAgaWQ9XCJcIlxyXG4gICAgICBsYWJlbD1cIlZpZXcgRm9ybXNcIlxyXG4gICAgICBbc2hvd0xvYWRlcl09XCJ2aWV3Rm9ybXNCdXR0b24uc2hvd0xvYWRlclwiXHJcbiAgICAgIHN0eWxlcz1cIlwiXHJcbiAgICAgIGNsYXNzPVwiXCJcclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxyXG4gICAgICBpY29uPVwiXCJcclxuICAgICAgaWNvblJpZ2h0PVwiXCJcclxuICAgICAgc2hhcGU9XCJudWxsXCJcclxuICAgICAgc2l6ZT1cIm1cIlxyXG4gICAgICBzdHlsZXM9XCJ3aWR0aDogMTAwJVwiXHJcbiAgICAgIChvbkNsaWNrKT1cInRoaXMuaGFuZGxlT25DbGlja1ZpZXdGb3JtcygkZXZlbnQpXCJcclxuICAgID48L2t3aWt1aS1idXR0b24+XHJcbiAgICA8a3dpa3VpLWJ1dHRvblxyXG4gICAgICBbZGlzYWJsZWRdPVwic2F2ZUZvcm1CdXR0b24uZGlzYWJsZWRcIlxyXG4gICAgICBpZD1cIlwiXHJcbiAgICAgIGxhYmVsPVwiU2F2ZVwiXHJcbiAgICAgIFtzaG93TG9hZGVyXT1cInNhdmVGb3JtQnV0dG9uLnNob3dMb2FkZXJcIlxyXG4gICAgICBzdHlsZXM9XCJcIlxyXG4gICAgICBjbGFzcz1cIlwiXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBhcHBlYXJhbmNlPVwicHJpbWFyeVwiXHJcbiAgICAgIGljb249XCJcIlxyXG4gICAgICBpY29uUmlnaHQ9XCJcIlxyXG4gICAgICBzaGFwZT1cIm51bGxcIlxyXG4gICAgICBzaXplPVwibVwiXHJcbiAgICAgIHN0eWxlcz1cIndpZHRoOiAxMDAlXCJcclxuICAgICAgKG9uQ2xpY2spPVwidGhpcy5oYW5kbGVPbkNsaWNrU2F2ZUZvcm0oJGV2ZW50KVwiXHJcbiAgICA+PC9rd2lrdWktYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdlxyXG4gIGNsYXNzPVwia3dpa2lkLWZvcm0tY29udGFpbmVyLWxvYWRpbmdcIlxyXG4gICpuZ0lmPVwidGhpcy5sb2FkaW5nXCJcclxuPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwibGFyZ2Utd3JhcHBlclwiXHJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uXT1cInRoaXMubG9hZGluZ1wiXHJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uX3JvdW5kZWRdPVwidGhpcy5sb2FkaW5nXCJcclxuICA+PC9kaXY+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJsYXJnZS13cmFwcGVyXCJcclxuICAgIFtjbGFzcy50dWktc2tlbGV0b25dPVwidGhpcy5sb2FkaW5nXCJcclxuICAgIFtjbGFzcy50dWktc2tlbGV0b25fcm91bmRlZF09XCJ0aGlzLmxvYWRpbmdcIlxyXG4gID48L2Rpdj5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImxhcmdlLXdyYXBwZXJcIlxyXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl09XCJ0aGlzLmxvYWRpbmdcIlxyXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl9yb3VuZGVkXT1cInRoaXMubG9hZGluZ1wiXHJcbiAgPjwvZGl2PlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwibGFyZ2Utd3JhcHBlclwiXHJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uXT1cInRoaXMubG9hZGluZ1wiXHJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uX3JvdW5kZWRdPVwidGhpcy5sb2FkaW5nXCJcclxuICA+PC9kaXY+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJsYXJnZS13cmFwcGVyXCJcclxuICAgIFtjbGFzcy50dWktc2tlbGV0b25dPVwidGhpcy5sb2FkaW5nXCJcclxuICAgIFtjbGFzcy50dWktc2tlbGV0b25fcm91bmRlZF09XCJ0aGlzLmxvYWRpbmdcIlxyXG4gID48L2Rpdj5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImxhcmdlLXdyYXBwZXJcIlxyXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl09XCJ0aGlzLmxvYWRpbmdcIlxyXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl9yb3VuZGVkXT1cInRoaXMubG9hZGluZ1wiXHJcbiAgPjwvZGl2PlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwibGFyZ2Utd3JhcHBlclwiXHJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uXT1cInRoaXMubG9hZGluZ1wiXHJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uX3JvdW5kZWRdPVwidGhpcy5sb2FkaW5nXCJcclxuICA+PC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|