kwikid-forms 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/bundles/kwikid-forms.umd.js +425 -281
  2. package/bundles/kwikid-forms.umd.js.map +1 -1
  3. package/esm2015/lib/renderer/form-view/definitions/actions/form-view.actions.enum.definitions.js +2 -1
  4. package/esm2015/lib/renderer/form-view/definitions/fields/form-view.fields.enum.definitions.js +2 -1
  5. package/esm2015/lib/renderer/form-view/definitions/fields/form-view.fields.type.definitions.js +1 -1
  6. package/esm2015/lib/renderer/form-view/form-view.component.js +109 -114
  7. package/esm2015/lib/renderer/form-view/form-view.module.js +4 -3
  8. package/esm2015/lib/renderer/form-view/form-view.service.js +4 -4
  9. package/esm2015/lib/renderer/form-view/helpers/form-view.apis.helper.js +11 -2
  10. package/esm2015/lib/renderer/form-view/helpers/form-view.defaults.helper.js +33 -2
  11. package/esm2015/lib/renderer/form-view/helpers/form-view.fields.helper.js +5 -5
  12. package/esm2015/lib/renderer/form-view/helpers/form-view.validations.helper.js +11 -2
  13. package/esm2015/lib/renderer/form-view/pipes/safe-html.pipe.js +25 -0
  14. package/esm2015/lib/renderer/renderer.config-converter.helper.js +109 -54
  15. package/fesm2015/kwikid-forms.js +300 -178
  16. package/fesm2015/kwikid-forms.js.map +1 -1
  17. package/lib/renderer/form-view/definitions/actions/form-view.actions.enum.definitions.d.ts +2 -1
  18. package/lib/renderer/form-view/definitions/fields/form-view.fields.enum.definitions.d.ts +1 -0
  19. package/lib/renderer/form-view/definitions/fields/form-view.fields.type.definitions.d.ts +10 -2
  20. package/lib/renderer/form-view/form-view.component.d.ts +2 -2
  21. package/lib/renderer/form-view/form-view.module.d.ts +7 -6
  22. package/lib/renderer/form-view/helpers/form-view.apis.helper.d.ts +2 -1
  23. package/lib/renderer/form-view/helpers/form-view.defaults.helper.d.ts +3 -1
  24. package/lib/renderer/form-view/helpers/form-view.validations.helper.d.ts +4 -1
  25. package/lib/renderer/form-view/pipes/safe-html.pipe.d.ts +15 -0
  26. package/package.json +3 -3
@@ -33,33 +33,50 @@ export class Converter {
33
33
  }
34
34
  convertFormConfig(formConfig) {
35
35
  const updateOnFieldType = (field) => {
36
+ const formatFieldTypeHtml = (field) => {
37
+ field = this.setFieldKeyValue(field, "isFormElement", false);
38
+ return field;
39
+ };
36
40
  const formatFieldTypeTitle = (field) => {
37
41
  field = this.setFieldKeyValue(field, "hidden", false);
42
+ field = this.setFieldKeyValue(field, "isFormElement", false);
38
43
  return field;
39
44
  };
40
- const formatFieldTypeRadio = (field) => {
41
- field.properties = this.setMissingFieldKeyValue(field.properties, "size", "m");
42
- field.properties = this.setMissingFieldKeyValue(field.properties, "orientation", "vertical");
43
- field = this.setFieldKeyValue(field, "hidden", false);
44
- field.options = field.options.map((x) => {
45
- if (typeof x === "string" || typeof x === "number") {
46
- return { label: x, disabled: false };
47
- }
48
- else {
49
- if (checkObjectKeyExists(x, "label") &&
50
- checkObjectKeyExists(x, "disabled")) {
51
- return x;
52
- }
53
- }
54
- });
45
+ const formatFieldTypeText = (field) => {
46
+ field = this.setFieldKeyValue(field, "isFormElement", true);
47
+ field.properties = this.setMissingFieldKeyValue(field.properties, "case", "default");
55
48
  return field;
56
49
  };
57
- const formatFieldTypeOtp = (field) => {
58
- field.properties = this.setMissingFieldKeyValue(field.properties, "mask", new Array(field.properties.otpLength).fill("#").join(" "));
50
+ const formatFieldTypeCheckbox = (field) => {
51
+ field = this.setFieldKeyValue(field, "isFormElement", true);
52
+ return field;
53
+ };
54
+ const formatFieldTypeNumber = (field) => {
55
+ field = this.setFieldKeyValue(field, "isFormElement", true);
56
+ if (checkObjectKeyExists(field, "key")) {
57
+ if (field.key === "aadhaar_number") {
58
+ field = this.setFieldKeyValue(field, "type", "aadhaar_number");
59
+ }
60
+ if (field.key === "contact_number") {
61
+ field = this.setFieldKeyValue(field, "type", "phone");
62
+ }
63
+ if (field.type === "phone" || field.type === "number") {
64
+ field.properties = this.setMissingFieldKeyValue(field.properties, "countryCode", "+91");
65
+ field.properties = this.setMissingFieldKeyValue(field.properties, "phoneMaskAfterCountryCode", "####-######");
66
+ field.properties = this.setMissingFieldKeyValue(field.properties, "removeCountryCodeFromValue", true);
67
+ field.properties = this.setMissingFieldKeyValue(field.properties, "decimal", "never");
68
+ field.properties = this.setMissingFieldKeyValue(field.properties, "prefix", "");
69
+ field.properties = this.setMissingFieldKeyValue(field.properties, "postfix", "");
70
+ field.properties = this.setMissingFieldKeyValue(field.properties, "min", -Infinity);
71
+ field.properties = this.setMissingFieldKeyValue(field.properties, "max", Infinity);
72
+ field.properties = this.setMissingFieldKeyValue(field.properties, "precision", 2);
73
+ }
74
+ }
59
75
  field = this.setFieldKeyValue(field, "hidden", false);
60
76
  return field;
61
77
  };
62
78
  const formatFieldTypeDate = (field) => {
79
+ field = this.setFieldKeyValue(field, "isFormElement", true);
63
80
  if (checkObjectKeyExists(field, "min")) {
64
81
  const tuiDay = convertDateStringToTuiDayFormat(field["min"]);
65
82
  field.properties = this.setFieldKeyValue(field.properties, "min", tuiDay);
@@ -81,30 +98,51 @@ export class Converter {
81
98
  field = this.setFieldKeyValue(field, "hidden", false);
82
99
  return field;
83
100
  };
84
- const formatFieldTypeNumber = (field) => {
85
- if (checkObjectKeyExists(field, "key")) {
86
- if (field.key === "aadhaar_number") {
87
- field = this.setFieldKeyValue(field, "type", "aadhaar_number");
101
+ const formatFieldTypePhone = (field) => {
102
+ field = this.setFieldKeyValue(field, "isFormElement", true);
103
+ return field;
104
+ };
105
+ const formatFieldTypeRadio = (field) => {
106
+ field = this.setFieldKeyValue(field, "isFormElement", true);
107
+ field.properties = this.setMissingFieldKeyValue(field.properties, "size", "m");
108
+ field.properties = this.setMissingFieldKeyValue(field.properties, "orientation", "vertical");
109
+ field = this.setFieldKeyValue(field, "hidden", false);
110
+ field.options = field.options.map((x) => {
111
+ if (typeof x === "string" || typeof x === "number") {
112
+ return { label: x, disabled: false, description: "" };
88
113
  }
89
- if (field.key === "contact_number") {
90
- field = this.setFieldKeyValue(field, "type", "phone");
114
+ else {
115
+ if (checkObjectKeyExists(x, "label") &&
116
+ checkObjectKeyExists(x, "disabled") &&
117
+ checkObjectKeyExists(x, "description")) {
118
+ return x;
119
+ }
120
+ if (!checkObjectKeyExists(x, "disabled")) {
121
+ x = Object.assign(Object.assign({}, x), { disabled: false });
122
+ }
123
+ if (!checkObjectKeyExists(x, "description")) {
124
+ x = Object.assign(Object.assign({}, x), { description: false });
125
+ }
126
+ return x;
91
127
  }
92
- if (field.type === "phone" || field.type === "number") {
93
- field.properties = this.setMissingFieldKeyValue(field.properties, "countryCode", "+91");
94
- field.properties = this.setMissingFieldKeyValue(field.properties, "phoneMaskAfterCountryCode", "####-######");
95
- field.properties = this.setMissingFieldKeyValue(field.properties, "removeCountryCodeFromValue", true);
96
- field.properties = this.setMissingFieldKeyValue(field.properties, "decimal", "never");
97
- field.properties = this.setMissingFieldKeyValue(field.properties, "prefix", "");
98
- field.properties = this.setMissingFieldKeyValue(field.properties, "postfix", "");
99
- field.properties = this.setMissingFieldKeyValue(field.properties, "min", -Infinity);
100
- field.properties = this.setMissingFieldKeyValue(field.properties, "max", Infinity);
101
- field.properties = this.setMissingFieldKeyValue(field.properties, "precision", 2);
128
+ });
129
+ return field;
130
+ };
131
+ const formatFieldTypeSearchText = (field) => {
132
+ field = this.setFieldKeyValue(field, "isFormElement", true);
133
+ if (checkObjectKeyExists(field, "type")) {
134
+ if (field.type === "search-text") {
135
+ field = this.setFieldKeyValue(field, "type", "dropdown-with-search");
102
136
  }
103
137
  }
104
- field = this.setFieldKeyValue(field, "hidden", false);
138
+ return field;
139
+ };
140
+ const formatFieldTypeDropdownWithSearch = (field) => {
141
+ field = this.setFieldKeyValue(field, "isFormElement", true);
105
142
  return field;
106
143
  };
107
144
  const formatFieldTypeApiCall = (field) => {
145
+ field = this.setFieldKeyValue(field, "isFormElement", true);
108
146
  if (!checkObjectKeyExists(field.properties, "shape")) {
109
147
  field.properties = this.setFieldKeyValue(field.properties, "shape", null);
110
148
  }
@@ -130,39 +168,56 @@ export class Converter {
130
168
  }
131
169
  return field;
132
170
  };
133
- const formatFieldTypeSearchText = (field) => {
134
- if (checkObjectKeyExists(field, "type")) {
135
- if (field.type === "search-text") {
136
- field = this.setFieldKeyValue(field, "type", "dropdown-with-search");
137
- }
138
- }
171
+ const formatFieldTypeOtp = (field) => {
172
+ field = this.setFieldKeyValue(field, "isFormElement", true);
173
+ field.properties = this.setMissingFieldKeyValue(field.properties, "mask", new Array(field.properties.otpLength).fill("#").join(" "));
174
+ field = this.setFieldKeyValue(field, "hidden", false);
139
175
  return field;
140
176
  };
141
- const formatFieldTypeText = (field) => {
177
+ const formatFieldTypeAadhaarNumber = (field) => {
178
+ field = this.setFieldKeyValue(field, "isFormElement", true);
142
179
  return field;
143
180
  };
144
181
  switch (field.type) {
182
+ case "html":
183
+ field = formatFieldTypeHtml(field);
184
+ break;
145
185
  case "title":
146
186
  field = formatFieldTypeTitle(field);
147
187
  break;
148
- case "radio":
149
- field = formatFieldTypeRadio(field);
188
+ case "text":
189
+ field = formatFieldTypeText(field);
150
190
  break;
151
- case "otp":
152
- field = formatFieldTypeOtp(field);
191
+ case "checkbox":
192
+ field = formatFieldTypeCheckbox(field);
193
+ break;
194
+ case "number":
195
+ field = formatFieldTypeNumber(field);
153
196
  break;
154
197
  case "date":
155
198
  field = formatFieldTypeDate(field);
156
199
  break;
157
- case "number":
158
- field = formatFieldTypeNumber(field);
200
+ case "phone":
201
+ field = formatFieldTypePhone(field);
159
202
  break;
160
- case "api-call":
161
- field = formatFieldTypeApiCall(field);
203
+ case "radio":
204
+ field = formatFieldTypeRadio(field);
162
205
  break;
163
206
  case "search-text":
164
207
  field = formatFieldTypeSearchText(field);
165
208
  break;
209
+ case "dropdown-with-search":
210
+ field = formatFieldTypeDropdownWithSearch(field);
211
+ break;
212
+ case "api-call":
213
+ field = formatFieldTypeApiCall(field);
214
+ break;
215
+ case "otp":
216
+ field = formatFieldTypeOtp(field);
217
+ break;
218
+ case "aadhaar-number":
219
+ field = formatFieldTypeAadhaarNumber(field);
220
+ break;
166
221
  default:
167
222
  break;
168
223
  }
@@ -253,7 +308,7 @@ export class Converter {
253
308
  };
254
309
  const updateFieldValidatorConfig = (field) => {
255
310
  var _a, _b, _c, _d, _e;
256
- if (field.type !== "title") {
311
+ if (field.isFormElement) {
257
312
  const validators = checkObjectKeyExists(field, "validators")
258
313
  ? field.validators
259
314
  : {};
@@ -334,7 +389,7 @@ export class Converter {
334
389
  return field;
335
390
  };
336
391
  const updateFieldDefaultValueConfig = (field) => {
337
- if (field.type !== "title") {
392
+ if (field.isFormElement) {
338
393
  if (checkObjectKeyExists(field, "defaultValue")) {
339
394
  return field;
340
395
  }
@@ -514,13 +569,13 @@ export class Converter {
514
569
  return field;
515
570
  };
516
571
  const updateFieldMessages = (field) => {
517
- if (field.type !== "title") {
572
+ if (field.isFormElement) {
518
573
  field = this.setMissingFieldKeyValue(field, "messages", []);
519
574
  }
520
575
  return field;
521
576
  };
522
577
  const updateFieldResetButton = (field) => {
523
- if (field.type === "title") {
578
+ if (field.isFormElement) {
524
579
  if (checkObjectKeyExists(field, "action") &&
525
580
  field.action === "reset" &&
526
581
  checkObjectKeyExists(field, "fields")) {
@@ -583,4 +638,4 @@ export class Converter {
583
638
  __decorate([
584
639
  logMethod
585
640
  ], Converter.prototype, "convertFormConfig", null);
586
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuY29uZmlnLWNvbnZlcnRlci5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9yZW5kZXJlci9yZW5kZXJlci5jb25maWctY29udmVydGVyLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQ0wsU0FBUyxFQUNULG9CQUFvQixFQUNwQixZQUFZLEVBQ1osZUFBZSxFQUNoQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTlGLE1BQU0sT0FBTyxTQUFTO0lBQXRCO1FBQ0Usa0JBQWEsR0FBRyxDQUFDLFVBQWUsRUFBUyxFQUFFO1lBQ3pDLElBQUksTUFBYSxDQUFDO1lBRWxCLElBQUksb0JBQW9CLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2dCQUNqRCxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7YUFDdEM7aUJBQU07Z0JBQ0wsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDNUI7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUM7UUFFRiw0QkFBdUIsR0FBRyxDQUFDLEtBQVUsRUFBRSxHQUFXLEVBQUUsS0FBVSxFQUFPLEVBQUU7WUFDckUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDckMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUNwQjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDO1FBRUYscUJBQWdCLEdBQUcsQ0FBQyxLQUFVLEVBQUUsR0FBVyxFQUFFLEtBQVUsRUFBTyxFQUFFO1lBQzlELEtBQUssQ0FBQyxH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QUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRW5ELElBQUksV0FBVyxHQUFRLEVBQUUsQ0FBQztRQUUxQixLQUFLLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRTtZQUN4QixLQUFLLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFakMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUUvQiwyREFBMkQ7WUFDM0QsV0FBVztZQUNYLDBCQUEwQjtZQUMxQixLQUFLO1lBQ0wseUVBQXlFO1lBQ3pFLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFeEQsS0FBSyxHQUFHLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTdDLEtBQUssR0FBRywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUUxQyxLQUFLLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdEMsS0FBSyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsVUFBVSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUV6RCxVQUFVLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUvQyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUExdEJDO0lBREMsU0FBUztrREEwdEJUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHVpRGF5IH0gZnJvbSBcIkB0YWlnYS11aS9jZGtcIjtcbmltcG9ydCB7XG4gIGxvZ01ldGhvZCxcbiAgY2hlY2tPYmplY3RLZXlFeGlzdHMsXG4gIGlzRW1wdHlWYWx1ZSxcbiAgaXNOb3RFbXB0eVZhbHVlXG59IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuaW1wb3J0IHsgY29udmVydERhdGVTdHJpbmdUb1R1aURheUZvcm1hdCB9IGZyb20gXCIuL2Zvcm0tdmlldy9oZWxwZXJzL2Zvcm0tdmlldy5maWVsZHMuaGVscGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBDb252ZXJ0ZXIge1xuICBnZXRGb3JtRmllbGRzID0gKGZvcm1Db25maWc6IGFueSk6IGFueVtdID0+IHtcbiAgICBsZXQgZmllbGRzOiBhbnlbXTtcblxuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtQ29uZmlnLCBcIm11bHRpRm9ybVwiKSkge1xuICAgICAgZmllbGRzID0gZm9ybUNvbmZpZy5tdWx0aUZvcm0uZmllbGRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZHMgPSBmb3JtQ29uZmlnLmZpZWxkcztcbiAgICB9XG5cbiAgICByZXR1cm4gZmllbGRzO1xuICB9O1xuXG4gIHNldE1pc3NpbmdGaWVsZEtleVZhbHVlID0gKGZpZWxkOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBrZXkpKSB7XG4gICAgICBmaWVsZFtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBmaWVsZDtcbiAgfTtcblxuICBzZXRGaWVsZEtleVZhbHVlID0gKGZpZWxkOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICBmaWVsZFtrZXldID0gdmFsdWU7XG5cbiAgICByZXR1cm4gZmllbGQ7XG4gIH07XG5cbiAgcmVtb3ZlRmllbGRLZXkgPSAoZmllbGQ6IGFueSwga2V5OiBzdHJpbmcpOiBhbnkgPT4ge1xuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwga2V5KSkge1xuICAgICAgZGVsZXRlIGZpZWxkW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkO1xuICB9O1xuXG4gIEBsb2dNZXRob2RcbiAgY29udmVydEZvcm1Db25maWcoZm9ybUNvbmZpZzogYW55KTogYW55IHtcbiAgICBjb25zdCB1cGRhdGVPbkZpZWxkVHlwZSA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZVRpdGxlID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJoaWRkZW5cIiwgZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVSYWRpbyA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICBcInNpemVcIixcbiAgICAgICAgICBcIm1cIlxuICAgICAgICApO1xuICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgIFwib3JpZW50YXRpb25cIixcbiAgICAgICAgICBcInZlcnRpY2FsXCJcbiAgICAgICAgKTtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaGlkZGVuXCIsIGZhbHNlKTtcblxuICAgICAgICBmaWVsZC5vcHRpb25zID0gZmllbGQub3B0aW9ucy5tYXAoKHg6IGFueSk6IGFueSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB4ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB4ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBsYWJlbDogeCwgZGlzYWJsZWQ6IGZhbHNlIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoeCwgXCJsYWJlbFwiKSAmJlxuICAgICAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyh4LCBcImRpc2FibGVkXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlT3RwID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgIFwibWFza1wiLFxuICAgICAgICAgIG5ldyBBcnJheShmaWVsZC5wcm9wZXJ0aWVzLm90cExlbmd0aCkuZmlsbChcIiNcIikuam9pbihcIiBcIilcbiAgICAgICAgKTtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaGlkZGVuXCIsIGZhbHNlKTtcblxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlRGF0ZSA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcIm1pblwiKSkge1xuICAgICAgICAgIGNvbnN0IHR1aURheSA9IGNvbnZlcnREYXRlU3RyaW5nVG9UdWlEYXlGb3JtYXQoZmllbGRbXCJtaW5cIl0pO1xuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgXCJtaW5cIixcbiAgICAgICAgICAgIHR1aURheVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgXCJtaW5cIixcbiAgICAgICAgICAgIG5ldyBUdWlEYXkoMCwgMCwgMSlcbiAgICAgICAgICApOyAvLyBZZWFyIC0gMDAwMCwgTW9udGggLSAwICgwIEluZGV4aW5nKSwgRGF5IC0gMVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcIm1heFwiKSkge1xuICAgICAgICAgIGNvbnN0IHR1aURheSA9IGNvbnZlcnREYXRlU3RyaW5nVG9UdWlEYXlGb3JtYXQoZmllbGRbXCJtYXhcIl0pO1xuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgXCJtYXhcIixcbiAgICAgICAgICAgIHR1aURheVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgXCJtYXhcIixcbiAgICAgICAgICAgIG5ldyBUdWlEYXkoXG4gICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSwgLy8gWWVhciAtIDk5OTlcbiAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRNb250aCgpLCAvLyBNb250aCAtIDExICgwIEluZGV4aW5nKVxuICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldERhdGUoKSAvLyBEYXkgLSAzMVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgIFwicGxhY2Vob2xkZXJcIixcbiAgICAgICAgICBcIlwiXG4gICAgICAgICk7XG5cbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaGlkZGVuXCIsIGZhbHNlKTtcblxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlTnVtYmVyID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwia2V5XCIpKSB7XG4gICAgICAgICAgaWYgKGZpZWxkLmtleSA9PT0gXCJhYWRoYWFyX251bWJlclwiKSB7XG4gICAgICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJ0eXBlXCIsIFwiYWFkaGFhcl9udW1iZXJcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWVsZC5rZXkgPT09IFwiY29udGFjdF9udW1iZXJcIikge1xuICAgICAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwidHlwZVwiLCBcInBob25lXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSBcInBob25lXCIgfHwgZmllbGQudHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwiY291bnRyeUNvZGVcIixcbiAgICAgICAgICAgICAgXCIrOTFcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICBcInBob25lTWFza0FmdGVyQ291bnRyeUNvZGVcIixcbiAgICAgICAgICAgICAgXCIjIyMjLSMjIyMjI1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwicmVtb3ZlQ291bnRyeUNvZGVGcm9tVmFsdWVcIixcbiAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICBcImRlY2ltYWxcIixcbiAgICAgICAgICAgICAgXCJuZXZlclwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwicHJlZml4XCIsXG4gICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJwb3N0Zml4XCIsXG4gICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJtaW5cIixcbiAgICAgICAgICAgICAgLUluZmluaXR5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwibWF4XCIsXG4gICAgICAgICAgICAgIEluZmluaXR5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwicHJlY2lzaW9uXCIsXG4gICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaGlkZGVuXCIsIGZhbHNlKTtcblxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlQXBpQ2FsbCA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZC5wcm9wZXJ0aWVzLCBcInNoYXBlXCIpKSB7XG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBcInNoYXBlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInNob3dMb2FkZXJcIikpIHtcbiAgICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJzaG93TG9hZGVyXCIsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLnByb3BlcnRpZXMsIFwic2l6ZVwiKSkge1xuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgXCJzaXplXCIsXG4gICAgICAgICAgICBcIm1cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJhcGlcIikpIHtcbiAgICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJhcGlcIiwge30pO1xuXG4gICAgICAgICAgZmllbGQuYXBpID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShmaWVsZC5hcGksIFwidXJsXCIsIFwiXCIpO1xuICAgICAgICAgIGZpZWxkLmFwaSA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoZmllbGQuYXBpLCBcInJlcXVlc3RcIiwgXCJcIik7XG4gICAgICAgICAgZmllbGQuYXBpID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShmaWVsZC5hcGksIFwicmVzcG9uc2VcIiwgXCJcIik7XG4gICAgICAgICAgZmllbGQuYXBpID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShmaWVsZC5hcGksIFwic3RhdHVzXCIsIFwiXCIpO1xuXG4gICAgICAgICAgZmllbGQuYXBpLnN0YXR1cyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICBmaWVsZC5hcGkuc3RhdHVzLFxuICAgICAgICAgICAgXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgXCJkZWZhdWx0XCJcbiAgICAgICAgICApO1xuICAgICAgICAgIGZpZWxkLmFwaS5zdGF0dXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgZmllbGQuYXBpLnN0YXR1cyxcbiAgICAgICAgICAgIFwibGFiZWxzXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IFwiQ2FsbCBBUElcIixcbiAgICAgICAgICAgICAgbG9hZGluZzogXCJDYWxsIEFQSVwiLFxuICAgICAgICAgICAgICBzdWNjZXNzOiBcIkFQSSBTdWNjZXNzXCIsXG4gICAgICAgICAgICAgIGZhaWxlZDogXCJBUEkgRmFpbGVkXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVTZWFyY2hUZXh0ID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidHlwZVwiKSkge1xuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSBcInNlYXJjaC10ZXh0XCIpIHtcbiAgICAgICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgICAgICAgIFwiZHJvcGRvd24td2l0aC1zZWFyY2hcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlVGV4dCA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcblxuICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJ0aXRsZVwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlVGl0bGUoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZVJhZGlvKGZpZWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm90cFwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlT3RwKGZpZWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZURhdGUoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVOdW1iZXIoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXBpLWNhbGxcIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZUFwaUNhbGwoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic2VhcmNoLXRleHRcIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZVNlYXJjaFRleHQoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldENvbm5lY3RlZEVsZW1lbnRLZXlWYWx1ZU9iamVjdCA9IChrZXk6IGFueSk6IGFueSA9PiB7XG4gICAgICBjb25zdCBvYmplY3QgPSB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBjb25kaXRpb25zOiB7IGZvcm11bGE6IFwiXCIsIHJ1bGVzOiBbXSB9LFxuICAgICAgICBhY3Rpb25zOiB7IHN1Y2Nlc3M6IFtdLCBmYWlsdXJlOiBbXSB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9O1xuXG4gICAgY29uc3QgZm9ybWF0RmllbGRLZXlzID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZFRvXCIpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmllbGRbXCJjb25uZWN0ZWRUb1wiXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkRWxlbWVudHNcIl0gPSBbXG4gICAgICAgICAgICBnZXRDb25uZWN0ZWRFbGVtZW50S2V5VmFsdWVPYmplY3QoZmllbGRbXCJjb25uZWN0ZWRUb1wiXSlcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkVG9cIl0gPSBmaWVsZFtcImNvbm5lY3RlZFRvXCJdLm1hcCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb25uZWN0ZWRFbGVtZW50S2V5VmFsdWVPYmplY3Qoa2V5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZEVsZW1lbnRzXCJdID0gZmllbGRbXCJjb25uZWN0ZWRUb1wiXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVGaWVsZEtleShmaWVsZCwgXCJjb25uZWN0ZWRUb1wiKTtcblxuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZFRvUGFyZW50XCIpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmllbGRbXCJjb25uZWN0ZWRUb1BhcmVudFwiXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkUGFyZW50RmllbGRzXCJdID0gW1xuICAgICAgICAgICAgZ2V0Q29ubmVjdGVkRWxlbWVudEtleVZhbHVlT2JqZWN0KGZpZWxkW1wiY29ubmVjdGVkVG9QYXJlbnRcIl0pXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFBhcmVudEZpZWxkc1wiXSA9IGdldENvbm5lY3RlZEVsZW1lbnRLZXlWYWx1ZU9iamVjdChcbiAgICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkVG9QYXJlbnRcIl1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJlbW92ZUZpZWxkS2V5KGZpZWxkLCBcImNvbm5lY3RlZFRvUGFyZW50XCIpO1xuXG4gICAgICB0aGlzLnJlbW92ZUZpZWxkS2V5KGZpZWxkLCBcInNpZGVFZmZlY3RcIik7XG5cbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q29ubmVjdGVkRWxlbWVudEZpZWxkTWFwcGluZyA9IChcbiAgICAgIGZpZWxkOiBhbnksXG4gICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmc6IGFueVxuICAgICk6IGFueSA9PiB7XG4gICAgICBjb25zdCBnZXRDb25uZWN0ZWRFbGVtZW50Q2hpbGRGaWVsZE1hcHBpbmcgPSAoXG4gICAgICAgIGZpZWxkOiBhbnksXG4gICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZzogYW55XG4gICAgICApOiBhbnkgPT4ge1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIikpIHtcbiAgICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXVtmaWVsZC5rZXldID0gZmllbGQuY29ubmVjdGVkRWxlbWVudHM7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl0sIGZpZWxkLmtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmllbGRbXCJjb25uZWN0ZWRFbGVtZW50c1wiXSA9XG4gICAgICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXVtmaWVsZC5rZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZmllbGQ6IGZpZWxkLCBjb25uZWN0ZWRGaWVsZE1hcHBpbmc6IGNvbm5lY3RlZEZpZWxkTWFwcGluZyB9O1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0Q29ubmVjdGVkRWxlbWVudFBhcmVudEZpZWxkTWFwcGluZyA9IChcbiAgICAgICAgZmllbGQ6IGFueSxcbiAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBhbnlcbiAgICAgICk6IGFueSA9PiB7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXSwgZmllbGQua2V5KSkge1xuICAgICAgICAgIGZvciAobGV0IGNvbm5lY3RlZFBhcmVudEtleSBvZiBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXVtcbiAgICAgICAgICAgIGZpZWxkLmtleVxuICAgICAgICAgIF0pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoXG4gICAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wicGFyZW50XCJdLFxuICAgICAgICAgICAgICAgIGNvbm5lY3RlZFBhcmVudEtleVtcImtleVwiXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wicGFyZW50XCJdW2Nvbm5lY3RlZFBhcmVudEtleVtcImtleVwiXV0ucHVzaChcbiAgICAgICAgICAgICAgICBmaWVsZC5rZXlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcInBhcmVudFwiXVtjb25uZWN0ZWRQYXJlbnRLZXlbXCJrZXlcIl1dID0gW1xuICAgICAgICAgICAgICAgIGZpZWxkLmtleVxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGZpZWxkOiBmaWVsZCwgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBjb25uZWN0ZWRGaWVsZE1hcHBpbmcgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNvbm5lY3RlZENoaWxkRmllbGRNYXBwaW5nID0gZ2V0Q29ubmVjdGVkRWxlbWVudENoaWxkRmllbGRNYXBwaW5nKFxuICAgICAgICBmaWVsZCxcbiAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nXG4gICAgICApO1xuICAgICAgZmllbGQgPSBjb25uZWN0ZWRDaGlsZEZpZWxkTWFwcGluZ1tcImZpZWxkXCJdO1xuICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nID1cbiAgICAgICAgY29ubmVjdGVkQ2hpbGRGaWVsZE1hcHBpbmdbXCJjb25uZWN0ZWRGaWVsZE1hcHBpbmdcIl07XG5cbiAgICAgIGNvbnN0IGNvbm5lY3RlZFBhcmVudEZpZWxkTWFwcGluZyA9IGdldENvbm5lY3RlZEVsZW1lbnRQYXJlbnRGaWVsZE1hcHBpbmcoXG4gICAgICAgIGZpZWxkLFxuICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdcbiAgICAgICk7XG4gICAgICBmaWVsZCA9IGNvbm5lY3RlZFBhcmVudEZpZWxkTWFwcGluZ1tcImZpZWxkXCJdO1xuICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nID1cbiAgICAgICAgY29ubmVjdGVkUGFyZW50RmllbGRNYXBwaW5nW1wiY29ubmVjdGVkRmllbGRNYXBwaW5nXCJdO1xuXG4gICAgICByZXR1cm4gY29ubmVjdGVkRmllbGRNYXBwaW5nO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVDb25uZWN0ZWRFbGVtZW50c0tleVZhbHVlID0gKFxuICAgICAgZmllbGQ6IGFueSxcbiAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZzogYW55XG4gICAgKTogYW55ID0+IHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXSwgZmllbGQua2V5KSkge1xuICAgICAgICBmaWVsZFtcImNvbm5lY3RlZEVsZW1lbnRzXCJdID0gY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl1bZmllbGQua2V5XTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcInBhcmVudFwiXSwgZmllbGQua2V5KSkge1xuICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFBhcmVudEZpZWxkc1wiXSA9XG4gICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wicGFyZW50XCJdW2ZpZWxkLmtleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlRmllbGRWYWxpZGF0b3JDb25maWcgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoZmllbGQudHlwZSAhPT0gXCJ0aXRsZVwiKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJ2YWxpZGF0b3JzXCIpXG4gICAgICAgICAgPyBmaWVsZC52YWxpZGF0b3JzXG4gICAgICAgICAgOiB7fTtcblxuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoZmllbGQsIFwidmFsaWRhdG9yc1wiLCB7fSk7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcInZhbGlkYXRvcnNcIiwge1xuICAgICAgICAgIC4uLmZpZWxkW1widmFsaWRhdG9yc1wiXSxcbiAgICAgICAgICBtaW46IGNoZWNrT2JqZWN0S2V5RXhpc3RzKHZhbGlkYXRvcnMsIFwibWluXCIpXG4gICAgICAgICAgICA/IGlzTm90RW1wdHlWYWx1ZSh2YWxpZGF0b3JzLm1pbilcbiAgICAgICAgICAgICAgPyBOdW1iZXIodmFsaWRhdG9ycy5taW4pXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJtaW5cIilcbiAgICAgICAgICAgID8gTnVtYmVyKGZpZWxkLm1pbilcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBtYXg6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKHZhbGlkYXRvcnMsIFwibWF4XCIpXG4gICAgICAgICAgICA/IGlzTm90RW1wdHlWYWx1ZSh2YWxpZGF0b3JzLm1heClcbiAgICAgICAgICAgICAgPyBOdW1iZXIodmFsaWRhdG9ycy5tYXgpXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJtYXhcIilcbiAgICAgICAgICAgID8gTnVtYmVyKGZpZWxkLm1heClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICByZXF1aXJlZDogY2hlY2tPYmplY3RLZXlFeGlzdHModmFsaWRhdG9ycywgXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgPyBCb29sZWFuKHZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICAgICAgICA6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICA/IEJvb2xlYW4oZmllbGQucmVxdWlyZWQpXG4gICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgIG1pbkxlbmd0aDogY2hlY2tPYmplY3RLZXlFeGlzdHModmFsaWRhdG9ycywgXCJtaW5MZW5ndGhcIilcbiAgICAgICAgICAgID8gaXNOb3RFbXB0eVZhbHVlKHZhbGlkYXRvcnMubWluTGVuZ3RoKVxuICAgICAgICAgICAgICA/IE51bWJlcih2YWxpZGF0b3JzLm1pbkxlbmd0aClcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICA6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcIm1pbkxlbmd0aFwiKVxuICAgICAgICAgICAgPyBOdW1iZXIoZmllbGQubWluTGVuZ3RoKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIG1heExlbmd0aDogY2hlY2tPYmplY3RLZXlFeGlzdHModmFsaWRhdG9ycywgXCJtYXhMZW5ndGhcIilcbiAgICAgICAgICAgID8gaXNOb3RFbXB0eVZhbHVlKHZhbGlkYXRvcnMubWF4TGVuZ3RoKVxuICAgICAgICAgICAgICA/IE51bWJlcih2YWxpZGF0b3JzLm1heExlbmd0aClcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICA6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImxlbmd0aFwiKVxuICAgICAgICAgICAgPyBOdW1iZXIoZmllbGQubGVuZ3RoKVxuICAgICAgICAgICAgOiBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJtYXhMZW5ndGhcIilcbiAgICAgICAgICAgID8gTnVtYmVyKGZpZWxkLm1heExlbmd0aClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBwYXR0ZXJuOiBjaGVja09iamVjdEtleUV4aXN0cyh2YWxpZGF0b3JzLCBcInBhdHRlcm5cIilcbiAgICAgICAgICAgID8gaXNOb3RFbXB0eVZhbHVlKHZhbGlkYXRvcnMucGF0dGVybilcbiAgICAgICAgICAgICAgPyB2YWxpZGF0b3JzLnBhdHRlcm5cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIDogY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwicGF0dGVyblwiKVxuICAgICAgICAgICAgPyB7IGtleTogXCJDVVNUT01cIiwgcGF0dGVybjogU3RyaW5nKGZpZWxkLnBhdHRlcm4pIH1cbiAgICAgICAgICAgIDogY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwicmVnZXhcIilcbiAgICAgICAgICAgID8geyBrZXk6IFwiQ1VTVE9NXCIsIHBhdHRlcm46IFN0cmluZyhmaWVsZC5yZWdleCkgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVsZXRlIGZpZWxkLm1pbjtcbiAgICAgICAgZGVsZXRlIGZpZWxkLm1heDtcbiAgICAgICAgZGVsZXRlIGZpZWxkLnJlcXVpcmVkO1xuICAgICAgICBkZWxldGUgZmllbGQubWluTGVuZ3RoO1xuICAgICAgICBkZWxldGUgZmllbGQubGVuZ3RoO1xuICAgICAgICBkZWxldGUgZmllbGQubWF4TGVuZ3RoO1xuICAgICAgICBkZWxldGUgZmllbGQucGF0dGVybjtcbiAgICAgICAgZGVsZXRlIGZpZWxkLnJlZ2V4O1xuXG4gICAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICBkZWxldGUgZmllbGQudmFsaWRhdG9ycy5taW47XG4gICAgICAgICAgICBkZWxldGUgZmllbGQudmFsaWRhdG9ycy5tYXg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNFbXB0eVZhbHVlKGZpZWxkLnZhbGlkYXRvcnM/Lm1pbikpIHtcbiAgICAgICAgICBkZWxldGUgZmllbGQudmFsaWRhdG9ycy5taW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRW1wdHlWYWx1ZShmaWVsZC52YWxpZGF0b3JzPy5tYXgpKSB7XG4gICAgICAgICAgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMubWluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0VtcHR5VmFsdWUoZmllbGQudmFsaWRhdG9ycz8ubWluTGVuZ3RoKSkge1xuICAgICAgICAgIGRlbGV0ZSBmaWVsZC52YWxpZGF0b3JzLm1pbkxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNFbXB0eVZhbHVlKGZpZWxkLnZhbGlkYXRvcnM/Lm1heExlbmd0aCkpIHtcbiAgICAgICAgICBkZWxldGUgZmllbGQudmFsaWRhdG9ycy5tYXhMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRW1wdHlWYWx1ZShmaWVsZC52YWxpZGF0b3JzPy5wYXR0ZXJuKSkge1xuICAgICAgICAgIGRlbGV0ZSBmaWVsZC52YWxpZGF0b3JzLnBhdHRlcm47XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZC5mb2N1cyA9IGZhbHNlO1xuICAgICAgICBmaWVsZC5pbnZhbGlkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlRmllbGREZWZhdWx0VmFsdWVDb25maWcgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoZmllbGQudHlwZSAhPT0gXCJ0aXRsZVwiKSB7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJkZWZhdWx0VmFsdWVcIikpIHtcbiAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiZGVmYXVsdFwiKSkge1xuICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiZGVmYXVsdFZhbFwiKSkge1xuICAgICAgICAgICAgLy8gQ3VycmVudGx5IGJlbG93IGxpbmUgaXMgY29tbWVudGVkIGJlY2F1c2UgaXQgY2F1c2VkIGlzc3VlcyBpbiBzZXR0aW5nIERlZmF1bHQgVmFsdWUuXG4gICAgICAgICAgICAvLyBmaWVsZFtcImRlZmF1bHRWYWx1ZVwiXSA9IGZpZWxkW1wiZGVmYXVsdFZhbFwiXTtcbiAgICAgICAgICAgIC8vIGRlbGV0ZSBmaWVsZFtcImRlZmF1bHRWYWxcIl07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVE9ETzogQ29uZGl0aW9uIGZvciBhbGxfZm9ybXNfZGF0YSBpcyBub3QgY29uc2lkZXJlZCB5ZXQuXG4gICAgICAgICAgaWYgKGZpZWxkLmF1dG9Qb3B1bGF0ZUZyb21TdW1tYXJ5RGF0YSkge1xuICAgICAgICAgICAgZmllbGRbXCJkZWZhdWx0VmFsdWVcIl0gPSB7XG4gICAgICAgICAgICAgIGlzX2ZvdW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgICAgIHNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IFwic3VtbWFyeV9kYXRhXCIsXG4gICAgICAgICAgICAgICAgICBzdW1tYXJ5X2RhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogYCQuJHtmaWVsZC5rZXl9YCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaXNfbm90X2VtcHR5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vdF9lbXB0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZW5hYmxlX2ZpZWxkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxIE9SIE5PVCgxKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZmllbGQ6IHsgdmFsdWU6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImF1dG9maWxsXCIpKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQuYXV0b2ZpbGwsIFwidHlwZVwiKSkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQuYXV0b2ZpbGwudHlwZSA9PT0gXCJzdG9yYWdlXCIpIHtcbiAgICAgICAgICAgICAgICBmaWVsZFtcImRlZmF1bHRWYWx1ZVwiXSA9IHtcbiAgICAgICAgICAgICAgICAgIGlzX2ZvdW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgc291cmNlczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBcImJyb3dzZXJfc3RvcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJfc3RvcmFnZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogYCQuJHtmaWVsZC5rZXl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpc19ub3RfZW1wdHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vdF9lbXB0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0X2RlZmF1bHRfdmFsdWVfZm91bmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlbmFibGVfZmllbGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxIE9SIE5PVCgxKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZpZWxkOiB7IHZhbHVlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmF1dG9maWxsLnR5cGUgPT09IFwiY29uZmlnXCIpIHtcbiAgICAgICAgICAgICAgICBmaWVsZFtcImRlZmF1bHRWYWx1ZVwiXSA9IHtcbiAgICAgICAgICAgICAgICAgIGlzX2ZvdW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgc291cmNlczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBcImZpZWxkX2NvbmZpZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2NvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogYCQuJHtmaWVsZC5rZXl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpc19ub3RfZW1wdHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vdF9lbXB0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0X2RlZmF1bHRfdmFsdWVfZm91bmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlbmFibGVfZmllbGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxIE9SIE5PVCgxKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZpZWxkOiB7IHZhbHVlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpZWxkW1wiZGVmYXVsdFZhbHVlXCJdID0ge1xuICAgICAgICAgICAgICBpc19mb3VuZDogZmFsc2UsXG4gICAgICAgICAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgICAgICAgICBzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc291cmNlOiBcImZvcm1fZGF0YVwiLFxuICAgICAgICAgICAgICAgICAgZm9ybV9kYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGAkLiR7ZmllbGQua2V5fWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlzX25vdF9lbXB0eVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ub3RfZW1wdHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0X2RlZmF1bHRfdmFsdWVfZm91bmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2RlZmF1bHRfdmFsdWVfZm91bmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVuYWJsZV9maWVsZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwiMSBPUiBOT1QoMSlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZpZWxkOiB7IHZhbHVlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIGZpZWxkW1wiZGVmYXVsdFZhbFwiXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVGaWVsZE1lc3NhZ2VzID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgIT09IFwidGl0bGVcIikge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoZmllbGQsIFwibWVzc2FnZXNcIiwgW10pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUZpZWxkUmVzZXRCdXR0b24gPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gXCJ0aXRsZVwiKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJhY3Rpb25cIikgJiZcbiAgICAgICAgICBmaWVsZC5hY3Rpb24gPT09IFwicmVzZXRcIiAmJlxuICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImZpZWxkc1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJyZXNldFwiLCB7XG4gICAgICAgICAgICBmaWVsZHM6IGZpZWxkLmZpZWxkc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2V0Rm9ybUZpZWxkcyA9IChmb3JtQ29uZmlnOiBhbnksIGZpZWxkczogYW55W10pOiBhbnkgPT4ge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm1Db25maWcsIFwibXVsdGlGb3JtXCIpKSB7XG4gICAgICAgIGZvcm1Db25maWcubXVsdGlGb3JtW1wiZmllbGRzXCJdID0gZmllbGRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybUNvbmZpZ1tcImZpZWxkc1wiXSA9IGZpZWxkcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm1Db25maWc7XG4gICAgfTtcblxuICAgIGNvbnN0IHNldEZvcm1GaWVsZEdyb3VwcyA9IChmb3JtQ29uZmlnOiBhbnksIGdyb3VwczogYW55KTogYW55ID0+IHtcbiAgICAgIGZvcm1Db25maWdbXCJmaWVsZEdyb3Vwc1wiXSA9IGdyb3VwcztcblxuICAgICAgcmV0dXJuIGZvcm1Db25maWc7XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUZvcm1GaWVsZEdyb3VwcyA9IChmaWVsZEdyb3VwczogYW55LCBmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJncm91cEtleVwiKSkge1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGRHcm91cHMsIGZpZWxkLmdyb3VwS2V5KSkge1xuICAgICAgICAgIGZpZWxkR3JvdXBzW2ZpZWxkLmdyb3VwS2V5XS5wdXNoKGZpZWxkLmtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRHcm91cHNbZmllbGQuZ3JvdXBLZXldID0gW2ZpZWxkLmtleV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpZWxkR3JvdXBzO1xuICAgIH07XG5cbiAgICBsZXQgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBhbnkgPSB7XG4gICAgICBwYXJlbnQ6IHt9LFxuICAgICAgY2hpbGQ6IHt9XG4gICAgfTtcblxuICAgIGxldCBmaWVsZHM6IGFueVtdID0gdGhpcy5nZXRGb3JtRmllbGRzKGZvcm1Db25maWcpO1xuXG4gICAgbGV0IGZpZWxkR3JvdXBzOiBhbnkgPSB7fTtcblxuICAgIGZvciAobGV0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgZmllbGQgPSB1cGRhdGVPbkZpZWxkVHlwZShmaWVsZCk7XG5cbiAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRLZXlzKGZpZWxkKTtcblxuICAgICAgLy8gY29ubmVjdGVkRmllbGRNYXBwaW5nID0gZ2V0Q29ubmVjdGVkRWxlbWVudEZpZWxkTWFwcGluZyhcbiAgICAgIC8vICAgZmllbGQsXG4gICAgICAvLyAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZ1xuICAgICAgLy8gKTtcbiAgICAgIC8vIGZpZWxkID0gdXBkYXRlQ29ubmVjdGVkRWxlbWVudHNLZXlWYWx1ZShmaWVsZCwgY29ubmVjdGVkRmllbGRNYXBwaW5nKTtcbiAgICAgIGZpZWxkR3JvdXBzID0gdXBkYXRlRm9ybUZpZWxkR3JvdXBzKGZpZWxkR3JvdXBzLCBmaWVsZCk7XG5cbiAgICAgIGZpZWxkID0gdXBkYXRlRmllbGREZWZhdWx0VmFsdWVDb25maWcoZmllbGQpO1xuXG4gICAgICBmaWVsZCA9IHVwZGF0ZUZpZWxkVmFsaWRhdG9yQ29uZmlnKGZpZWxkKTtcblxuICAgICAgZmllbGQgPSB1cGRhdGVGaWVsZFJlc2V0QnV0dG9uKGZpZWxkKTtcblxuICAgICAgZmllbGQgPSB1cGRhdGVGaWVsZE1lc3NhZ2VzKGZpZWxkKTtcbiAgICB9XG5cbiAgICBmb3JtQ29uZmlnID0gc2V0Rm9ybUZpZWxkR3JvdXBzKGZvcm1Db25maWcsIGZpZWxkR3JvdXBzKTtcblxuICAgIGZvcm1Db25maWcgPSBzZXRGb3JtRmllbGRzKGZvcm1Db25maWcsIGZpZWxkcyk7XG5cbiAgICByZXR1cm4gZm9ybUNvbmZpZztcbiAgfVxufVxuIl19
641
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuY29uZmlnLWNvbnZlcnRlci5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9yZW5kZXJlci9yZW5kZXJlci5jb25maWctY29udmVydGVyLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQ0wsU0FBUyxFQUNULG9CQUFvQixFQUNwQixZQUFZLEVBQ1osZUFBZSxFQUNoQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTlGLE1BQU0sT0FBTyxTQUFTO0lBQXRCO1FBQ0Usa0JBQWEsR0FBRyxDQUFDLFVBQWUsRUFBUyxFQUFFO1lBQ3pDLElBQUksTUFBYSxDQUFDO1lBRWxCLElBQUksb0JBQW9CLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2dCQUNqRCxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7YUFDdEM7aUJBQU07Z0JBQ0wsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDNUI7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUM7UUFFRiw0QkFBdUIsR0FBRyxDQUFDLEtBQVUsRUFBRSxHQUFXLEVBQUUsS0FBVSxFQUFPLEVBQUU7WUFDckUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDckMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUNwQjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDO1FBRUYscUJBQWdCLEdBQUcsQ0FBQyxLQUFVLEVBQUUsR0FBVyxFQUFFLEtBQVUsRUFBTyxFQUFFO1lBQzlELEtBQUssQ0FBQyxH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QUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRS9DLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXR4QkM7SUFEQyxTQUFTO2tEQXN4QlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUdWlEYXkgfSBmcm9tIFwiQHRhaWdhLXVpL2Nka1wiO1xuaW1wb3J0IHtcbiAgbG9nTWV0aG9kLFxuICBjaGVja09iamVjdEtleUV4aXN0cyxcbiAgaXNFbXB0eVZhbHVlLFxuICBpc05vdEVtcHR5VmFsdWVcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgeyBjb252ZXJ0RGF0ZVN0cmluZ1RvVHVpRGF5Rm9ybWF0IH0gZnJvbSBcIi4vZm9ybS12aWV3L2hlbHBlcnMvZm9ybS12aWV3LmZpZWxkcy5oZWxwZXJcIjtcblxuZXhwb3J0IGNsYXNzIENvbnZlcnRlciB7XG4gIGdldEZvcm1GaWVsZHMgPSAoZm9ybUNvbmZpZzogYW55KTogYW55W10gPT4ge1xuICAgIGxldCBmaWVsZHM6IGFueVtdO1xuXG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm1Db25maWcsIFwibXVsdGlGb3JtXCIpKSB7XG4gICAgICBmaWVsZHMgPSBmb3JtQ29uZmlnLm11bHRpRm9ybS5maWVsZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkcyA9IGZvcm1Db25maWcuZmllbGRzO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZHM7XG4gIH07XG5cbiAgc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUgPSAoZmllbGQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBhbnkgPT4ge1xuICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIGtleSkpIHtcbiAgICAgIGZpZWxkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9O1xuXG4gIHNldEZpZWxkS2V5VmFsdWUgPSAoZmllbGQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBhbnkgPT4ge1xuICAgIGZpZWxkW2tleV0gPSB2YWx1ZTtcblxuICAgIHJldHVybiBmaWVsZDtcbiAgfTtcblxuICByZW1vdmVGaWVsZEtleSA9IChmaWVsZDogYW55LCBrZXk6IHN0cmluZyk6IGFueSA9PiB7XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBrZXkpKSB7XG4gICAgICBkZWxldGUgZmllbGRba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmllbGQ7XG4gIH07XG5cbiAgQGxvZ01ldGhvZFxuICBjb252ZXJ0Rm9ybUNvbmZpZyhmb3JtQ29uZmlnOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHVwZGF0ZU9uRmllbGRUeXBlID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlSHRtbCA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZVRpdGxlID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJoaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIGZhbHNlKTtcblxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlVGV4dCA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCB0cnVlKTtcbiAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICBcImNhc2VcIixcbiAgICAgICAgICBcImRlZmF1bHRcIlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlQ2hlY2tib3ggPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVOdW1iZXIgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJrZXlcIikpIHtcbiAgICAgICAgICBpZiAoZmllbGQua2V5ID09PSBcImFhZGhhYXJfbnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcInR5cGVcIiwgXCJhYWRoYWFyX251bWJlclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpZWxkLmtleSA9PT0gXCJjb250YWN0X251bWJlclwiKSB7XG4gICAgICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJ0eXBlXCIsIFwicGhvbmVcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IFwicGhvbmVcIiB8fCBmaWVsZC50eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJjb3VudHJ5Q29kZVwiLFxuICAgICAgICAgICAgICBcIis5MVwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwicGhvbmVNYXNrQWZ0ZXJDb3VudHJ5Q29kZVwiLFxuICAgICAgICAgICAgICBcIiMjIyMtIyMjIyMjXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJyZW1vdmVDb3VudHJ5Q29kZUZyb21WYWx1ZVwiLFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwiZGVjaW1hbFwiLFxuICAgICAgICAgICAgICBcIm5ldmVyXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJwcmVmaXhcIixcbiAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICBcInBvc3RmaXhcIixcbiAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICBcIm1pblwiLFxuICAgICAgICAgICAgICAtSW5maW5pdHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJtYXhcIixcbiAgICAgICAgICAgICAgSW5maW5pdHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJwcmVjaXNpb25cIixcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJoaWRkZW5cIiwgZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVEYXRlID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIHRydWUpO1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibWluXCIpKSB7XG4gICAgICAgICAgY29uc3QgdHVpRGF5ID0gY29udmVydERhdGVTdHJpbmdUb1R1aURheUZvcm1hdChmaWVsZFtcIm1pblwiXSk7XG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBcIm1pblwiLFxuICAgICAgICAgICAgdHVpRGF5XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBcIm1pblwiLFxuICAgICAgICAgICAgbmV3IFR1aURheSgwLCAwLCAxKVxuICAgICAgICAgICk7IC8vIFllYXIgLSAwMDAwLCBNb250aCAtIDAgKDAgSW5kZXhpbmcpLCBEYXkgLSAxXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibWF4XCIpKSB7XG4gICAgICAgICAgY29uc3QgdHVpRGF5ID0gY29udmVydERhdGVTdHJpbmdUb1R1aURheUZvcm1hdChmaWVsZFtcIm1heFwiXSk7XG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBcIm1heFwiLFxuICAgICAgICAgICAgdHVpRGF5XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBcIm1heFwiLFxuICAgICAgICAgICAgbmV3IFR1aURheShcbiAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLCAvLyBZZWFyIC0gOTk5OVxuICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldE1vbnRoKCksIC8vIE1vbnRoIC0gMTEgKDAgSW5kZXhpbmcpXG4gICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0RGF0ZSgpIC8vIERheSAtIDMxXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgXCJwbGFjZWhvbGRlclwiLFxuICAgICAgICAgIFwiXCJcbiAgICAgICAgKTtcblxuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJoaWRkZW5cIiwgZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVQaG9uZSA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZVJhZGlvID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIHRydWUpO1xuICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgIFwic2l6ZVwiLFxuICAgICAgICAgIFwibVwiXG4gICAgICAgICk7XG4gICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgXCJvcmllbnRhdGlvblwiLFxuICAgICAgICAgIFwidmVydGljYWxcIlxuICAgICAgICApO1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJoaWRkZW5cIiwgZmFsc2UpO1xuXG4gICAgICAgIGZpZWxkLm9wdGlvbnMgPSBmaWVsZC5vcHRpb25zLm1hcCgoeDogYW55KTogYW55ID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiB4LCBkaXNhYmxlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcIlwiIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoeCwgXCJsYWJlbFwiKSAmJlxuICAgICAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyh4LCBcImRpc2FibGVkXCIpICYmXG4gICAgICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHgsIFwiZGVzY3JpcHRpb25cIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoeCwgXCJkaXNhYmxlZFwiKSkge1xuICAgICAgICAgICAgICB4ID0geyAuLi54LCBkaXNhYmxlZDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoeCwgXCJkZXNjcmlwdGlvblwiKSkge1xuICAgICAgICAgICAgICB4ID0geyAuLi54LCBkZXNjcmlwdGlvbjogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZVNlYXJjaFRleHQgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IFwic2VhcmNoLXRleHRcIikge1xuICAgICAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICBcInR5cGVcIixcbiAgICAgICAgICAgICAgXCJkcm9wZG93bi13aXRoLXNlYXJjaFwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVEcm9wZG93bldpdGhTZWFyY2ggPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVBcGlDYWxsID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIHRydWUpO1xuICAgICAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLnByb3BlcnRpZXMsIFwic2hhcGVcIikpIHtcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgIFwic2hhcGVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwic2hvd0xvYWRlclwiKSkge1xuICAgICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcInNob3dMb2FkZXJcIiwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQucHJvcGVydGllcywgXCJzaXplXCIpKSB7XG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBcInNpemVcIixcbiAgICAgICAgICAgIFwibVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImFwaVwiKSkge1xuICAgICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImFwaVwiLCB7fSk7XG5cbiAgICAgICAgICBmaWVsZC5hcGkgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKGZpZWxkLmFwaSwgXCJ1cmxcIiwgXCJcIik7XG4gICAgICAgICAgZmllbGQuYXBpID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShmaWVsZC5hcGksIFwicmVxdWVzdFwiLCBcIlwiKTtcbiAgICAgICAgICBmaWVsZC5hcGkgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKGZpZWxkLmFwaSwgXCJyZXNwb25zZVwiLCBcIlwiKTtcbiAgICAgICAgICBmaWVsZC5hcGkgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKGZpZWxkLmFwaSwgXCJzdGF0dXNcIiwgXCJcIik7XG5cbiAgICAgICAgICBmaWVsZC5hcGkuc3RhdHVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLmFwaS5zdGF0dXMsXG4gICAgICAgICAgICBcInZhbHVlXCIsXG4gICAgICAgICAgICBcImRlZmF1bHRcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgZmllbGQuYXBpLnN0YXR1cyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICBmaWVsZC5hcGkuc3RhdHVzLFxuICAgICAgICAgICAgXCJsYWJlbHNcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGVmYXVsdDogXCJDYWxsIEFQSVwiLFxuICAgICAgICAgICAgICBsb2FkaW5nOiBcIkNhbGwgQVBJXCIsXG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IFwiQVBJIFN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgZmFpbGVkOiBcIkFQSSBGYWlsZWRcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZU90cCA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCB0cnVlKTtcbiAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICBcIm1hc2tcIixcbiAgICAgICAgICBuZXcgQXJyYXkoZmllbGQucHJvcGVydGllcy5vdHBMZW5ndGgpLmZpbGwoXCIjXCIpLmpvaW4oXCIgXCIpXG4gICAgICAgICk7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImhpZGRlblwiLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZUFhZGhhYXJOdW1iZXIgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG5cbiAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgICBjYXNlIFwiaHRtbFwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlSHRtbChmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ0aXRsZVwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlVGl0bGUoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlVGV4dChmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlQ2hlY2tib3goZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVOdW1iZXIoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlRGF0ZShmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJwaG9uZVwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlUGhvbmUoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZVJhZGlvKGZpZWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInNlYXJjaC10ZXh0XCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVTZWFyY2hUZXh0KGZpZWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRyb3Bkb3duLXdpdGgtc2VhcmNoXCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVEcm9wZG93bldpdGhTZWFyY2goZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXBpLWNhbGxcIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZUFwaUNhbGwoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwib3RwXCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVPdHAoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYWFkaGFhci1udW1iZXJcIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZUFhZGhhYXJOdW1iZXIoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldENvbm5lY3RlZEVsZW1lbnRLZXlWYWx1ZU9iamVjdCA9IChrZXk6IGFueSk6IGFueSA9PiB7XG4gICAgICBjb25zdCBvYmplY3QgPSB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBjb25kaXRpb25zOiB7IGZvcm11bGE6IFwiXCIsIHJ1bGVzOiBbXSB9LFxuICAgICAgICBhY3Rpb25zOiB7IHN1Y2Nlc3M6IFtdLCBmYWlsdXJlOiBbXSB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9O1xuXG4gICAgY29uc3QgZm9ybWF0RmllbGRLZXlzID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZFRvXCIpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmllbGRbXCJjb25uZWN0ZWRUb1wiXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkRWxlbWVudHNcIl0gPSBbXG4gICAgICAgICAgICBnZXRDb25uZWN0ZWRFbGVtZW50S2V5VmFsdWVPYmplY3QoZmllbGRbXCJjb25uZWN0ZWRUb1wiXSlcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkVG9cIl0gPSBmaWVsZFtcImNvbm5lY3RlZFRvXCJdLm1hcCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb25uZWN0ZWRFbGVtZW50S2V5VmFsdWVPYmplY3Qoa2V5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZEVsZW1lbnRzXCJdID0gZmllbGRbXCJjb25uZWN0ZWRUb1wiXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVGaWVsZEtleShmaWVsZCwgXCJjb25uZWN0ZWRUb1wiKTtcblxuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZFRvUGFyZW50XCIpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmllbGRbXCJjb25uZWN0ZWRUb1BhcmVudFwiXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkUGFyZW50RmllbGRzXCJdID0gW1xuICAgICAgICAgICAgZ2V0Q29ubmVjdGVkRWxlbWVudEtleVZhbHVlT2JqZWN0KGZpZWxkW1wiY29ubmVjdGVkVG9QYXJlbnRcIl0pXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFBhcmVudEZpZWxkc1wiXSA9IGdldENvbm5lY3RlZEVsZW1lbnRLZXlWYWx1ZU9iamVjdChcbiAgICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkVG9QYXJlbnRcIl1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJlbW92ZUZpZWxkS2V5KGZpZWxkLCBcImNvbm5lY3RlZFRvUGFyZW50XCIpO1xuXG4gICAgICB0aGlzLnJlbW92ZUZpZWxkS2V5KGZpZWxkLCBcInNpZGVFZmZlY3RcIik7XG5cbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q29ubmVjdGVkRWxlbWVudEZpZWxkTWFwcGluZyA9IChcbiAgICAgIGZpZWxkOiBhbnksXG4gICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmc6IGFueVxuICAgICk6IGFueSA9PiB7XG4gICAgICBjb25zdCBnZXRDb25uZWN0ZWRFbGVtZW50Q2hpbGRGaWVsZE1hcHBpbmcgPSAoXG4gICAgICAgIGZpZWxkOiBhbnksXG4gICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZzogYW55XG4gICAgICApOiBhbnkgPT4ge1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIikpIHtcbiAgICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXVtmaWVsZC5rZXldID0gZmllbGQuY29ubmVjdGVkRWxlbWVudHM7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl0sIGZpZWxkLmtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmllbGRbXCJjb25uZWN0ZWRFbGVtZW50c1wiXSA9XG4gICAgICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXVtmaWVsZC5rZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZmllbGQ6IGZpZWxkLCBjb25uZWN0ZWRGaWVsZE1hcHBpbmc6IGNvbm5lY3RlZEZpZWxkTWFwcGluZyB9O1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0Q29ubmVjdGVkRWxlbWVudFBhcmVudEZpZWxkTWFwcGluZyA9IChcbiAgICAgICAgZmllbGQ6IGFueSxcbiAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBhbnlcbiAgICAgICk6IGFueSA9PiB7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXSwgZmllbGQua2V5KSkge1xuICAgICAgICAgIGZvciAobGV0IGNvbm5lY3RlZFBhcmVudEtleSBvZiBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXVtcbiAgICAgICAgICAgIGZpZWxkLmtleVxuICAgICAgICAgIF0pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoXG4gICAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wicGFyZW50XCJdLFxuICAgICAgICAgICAgICAgIGNvbm5lY3RlZFBhcmVudEtleVtcImtleVwiXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wicGFyZW50XCJdW2Nvbm5lY3RlZFBhcmVudEtleVtcImtleVwiXV0ucHVzaChcbiAgICAgICAgICAgICAgICBmaWVsZC5rZXlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcInBhcmVudFwiXVtjb25uZWN0ZWRQYXJlbnRLZXlbXCJrZXlcIl1dID0gW1xuICAgICAgICAgICAgICAgIGZpZWxkLmtleVxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGZpZWxkOiBmaWVsZCwgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBjb25uZWN0ZWRGaWVsZE1hcHBpbmcgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNvbm5lY3RlZENoaWxkRmllbGRNYXBwaW5nID0gZ2V0Q29ubmVjdGVkRWxlbWVudENoaWxkRmllbGRNYXBwaW5nKFxuICAgICAgICBmaWVsZCxcbiAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nXG4gICAgICApO1xuICAgICAgZmllbGQgPSBjb25uZWN0ZWRDaGlsZEZpZWxkTWFwcGluZ1tcImZpZWxkXCJdO1xuICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nID1cbiAgICAgICAgY29ubmVjdGVkQ2hpbGRGaWVsZE1hcHBpbmdbXCJjb25uZWN0ZWRGaWVsZE1hcHBpbmdcIl07XG5cbiAgICAgIGNvbnN0IGNvbm5lY3RlZFBhcmVudEZpZWxkTWFwcGluZyA9IGdldENvbm5lY3RlZEVsZW1lbnRQYXJlbnRGaWVsZE1hcHBpbmcoXG4gICAgICAgIGZpZWxkLFxuICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdcbiAgICAgICk7XG4gICAgICBmaWVsZCA9IGNvbm5lY3RlZFBhcmVudEZpZWxkTWFwcGluZ1tcImZpZWxkXCJdO1xuICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nID1cbiAgICAgICAgY29ubmVjdGVkUGFyZW50RmllbGRNYXBwaW5nW1wiY29ubmVjdGVkRmllbGRNYXBwaW5nXCJdO1xuXG4gICAgICByZXR1cm4gY29ubmVjdGVkRmllbGRNYXBwaW5nO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVDb25uZWN0ZWRFbGVtZW50c0tleVZhbHVlID0gKFxuICAgICAgZmllbGQ6IGFueSxcbiAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZzogYW55XG4gICAgKTogYW55ID0+IHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXSwgZmllbGQua2V5KSkge1xuICAgICAgICBmaWVsZFtcImNvbm5lY3RlZEVsZW1lbnRzXCJdID0gY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl1bZmllbGQua2V5XTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcInBhcmVudFwiXSwgZmllbGQua2V5KSkge1xuICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFBhcmVudEZpZWxkc1wiXSA9XG4gICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wicGFyZW50XCJdW2ZpZWxkLmtleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlRmllbGRWYWxpZGF0b3JDb25maWcgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidmFsaWRhdG9yc1wiKVxuICAgICAgICAgID8gZmllbGQudmFsaWRhdG9yc1xuICAgICAgICAgIDoge307XG5cbiAgICAgICAgZmllbGQgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKGZpZWxkLCBcInZhbGlkYXRvcnNcIiwge30pO1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJ2YWxpZGF0b3JzXCIsIHtcbiAgICAgICAgICAuLi5maWVsZFtcInZhbGlkYXRvcnNcIl0sXG4gICAgICAgICAgbWluOiBjaGVja09iamVjdEtleUV4aXN0cyh2YWxpZGF0b3JzLCBcIm1pblwiKVxuICAgICAgICAgICAgPyBpc05vdEVtcHR5VmFsdWUodmFsaWRhdG9ycy5taW4pXG4gICAgICAgICAgICAgID8gTnVtYmVyKHZhbGlkYXRvcnMubWluKVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIDogY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibWluXCIpXG4gICAgICAgICAgICA/IE51bWJlcihmaWVsZC5taW4pXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgbWF4OiBjaGVja09iamVjdEtleUV4aXN0cyh2YWxpZGF0b3JzLCBcIm1heFwiKVxuICAgICAgICAgICAgPyBpc05vdEVtcHR5VmFsdWUodmFsaWRhdG9ycy5tYXgpXG4gICAgICAgICAgICAgID8gTnVtYmVyKHZhbGlkYXRvcnMubWF4KVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIDogY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibWF4XCIpXG4gICAgICAgICAgICA/IE51bWJlcihmaWVsZC5tYXgpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgcmVxdWlyZWQ6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKHZhbGlkYXRvcnMsIFwicmVxdWlyZWRcIilcbiAgICAgICAgICAgID8gQm9vbGVhbih2YWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICAgICAgICAgOiBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgPyBCb29sZWFuKGZpZWxkLnJlcXVpcmVkKVxuICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICBtaW5MZW5ndGg6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKHZhbGlkYXRvcnMsIFwibWluTGVuZ3RoXCIpXG4gICAgICAgICAgICA/IGlzTm90RW1wdHlWYWx1ZSh2YWxpZGF0b3JzLm1pbkxlbmd0aClcbiAgICAgICAgICAgICAgPyBOdW1iZXIodmFsaWRhdG9ycy5taW5MZW5ndGgpXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJtaW5MZW5ndGhcIilcbiAgICAgICAgICAgID8gTnVtYmVyKGZpZWxkLm1pbkxlbmd0aClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBtYXhMZW5ndGg6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKHZhbGlkYXRvcnMsIFwibWF4TGVuZ3RoXCIpXG4gICAgICAgICAgICA/IGlzTm90RW1wdHlWYWx1ZSh2YWxpZGF0b3JzLm1heExlbmd0aClcbiAgICAgICAgICAgICAgPyBOdW1iZXIodmFsaWRhdG9ycy5tYXhMZW5ndGgpXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJsZW5ndGhcIilcbiAgICAgICAgICAgID8gTnVtYmVyKGZpZWxkLmxlbmd0aClcbiAgICAgICAgICAgIDogY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibWF4TGVuZ3RoXCIpXG4gICAgICAgICAgICA/IE51bWJlcihmaWVsZC5tYXhMZW5ndGgpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgcGF0dGVybjogY2hlY2tPYmplY3RLZXlFeGlzdHModmFsaWRhdG9ycywgXCJwYXR0ZXJuXCIpXG4gICAgICAgICAgICA/IGlzTm90RW1wdHlWYWx1ZSh2YWxpZGF0b3JzLnBhdHRlcm4pXG4gICAgICAgICAgICAgID8gdmFsaWRhdG9ycy5wYXR0ZXJuXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInBhdHRlcm5cIilcbiAgICAgICAgICAgID8geyBrZXk6IFwiQ1VTVE9NXCIsIHBhdHRlcm46IFN0cmluZyhmaWVsZC5wYXR0ZXJuKSB9XG4gICAgICAgICAgICA6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInJlZ2V4XCIpXG4gICAgICAgICAgICA/IHsga2V5OiBcIkNVU1RPTVwiLCBwYXR0ZXJuOiBTdHJpbmcoZmllbGQucmVnZXgpIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlbGV0ZSBmaWVsZC5taW47XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5tYXg7XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5yZXF1aXJlZDtcbiAgICAgICAgZGVsZXRlIGZpZWxkLm1pbkxlbmd0aDtcbiAgICAgICAgZGVsZXRlIGZpZWxkLmxlbmd0aDtcbiAgICAgICAgZGVsZXRlIGZpZWxkLm1heExlbmd0aDtcbiAgICAgICAgZGVsZXRlIGZpZWxkLnBhdHRlcm47XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5yZWdleDtcblxuICAgICAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMubWluO1xuICAgICAgICAgICAgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMubWF4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRW1wdHlWYWx1ZShmaWVsZC52YWxpZGF0b3JzPy5taW4pKSB7XG4gICAgICAgICAgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMubWluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0VtcHR5VmFsdWUoZmllbGQudmFsaWRhdG9ycz8ubWF4KSkge1xuICAgICAgICAgIGRlbGV0ZSBmaWVsZC52YWxpZGF0b3JzLm1pbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNFbXB0eVZhbHVlKGZpZWxkLnZhbGlkYXRvcnM/Lm1pbkxlbmd0aCkpIHtcbiAgICAgICAgICBkZWxldGUgZmllbGQudmFsaWRhdG9ycy5taW5MZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRW1wdHlWYWx1ZShmaWVsZC52YWxpZGF0b3JzPy5tYXhMZW5ndGgpKSB7XG4gICAgICAgICAgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMubWF4TGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0VtcHR5VmFsdWUoZmllbGQudmFsaWRhdG9ycz8ucGF0dGVybikpIHtcbiAgICAgICAgICBkZWxldGUgZmllbGQudmFsaWRhdG9ycy5wYXR0ZXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGQuZm9jdXMgPSBmYWxzZTtcbiAgICAgICAgZmllbGQuaW52YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUZpZWxkRGVmYXVsdFZhbHVlQ29uZmlnID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImRlZmF1bHRWYWx1ZVwiKSkge1xuICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgfSBlbHNlIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJkZWZhdWx0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJkZWZhdWx0VmFsXCIpKSB7XG4gICAgICAgICAgICAvLyBDdXJyZW50bHkgYmVsb3cgbGluZSBpcyBjb21tZW50ZWQgYmVjYXVzZSBpdCBjYXVzZWQgaXNzdWVzIGluIHNldHRpbmcgRGVmYXVsdCBWYWx1ZS5cbiAgICAgICAgICAgIC8vIGZpZWxkW1wiZGVmYXVsdFZhbHVlXCJdID0gZmllbGRbXCJkZWZhdWx0VmFsXCJdO1xuICAgICAgICAgICAgLy8gZGVsZXRlIGZpZWxkW1wiZGVmYXVsdFZhbFwiXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUT0RPOiBDb25kaXRpb24gZm9yIGFsbF9mb3Jtc19kYXRhIGlzIG5vdCBjb25zaWRlcmVkIHlldC5cbiAgICAgICAgICBpZiAoZmllbGQuYXV0b1BvcHVsYXRlRnJvbVN1bW1hcnlEYXRhKSB7XG4gICAgICAgICAgICBmaWVsZFtcImRlZmF1bHRWYWx1ZVwiXSA9IHtcbiAgICAgICAgICAgICAgaXNfZm91bmQ6IGZhbHNlLFxuICAgICAgICAgICAgICB2YWx1ZTogXCJcIixcbiAgICAgICAgICAgICAgc291cmNlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZTogXCJzdW1tYXJ5X2RhdGFcIixcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnlfZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiBgJC4ke2ZpZWxkLmtleX1gLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpc19ub3RfZW1wdHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbm90X2VtcHR5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNldF9kZWZhdWx0X3ZhbHVlX2ZvdW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9kZWZhdWx0X3ZhbHVlX2ZvdW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlbmFibGVfZmllbGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjEgT1IgTk9UKDEpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZV9maWVsZDogeyB2YWx1ZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiYXV0b2ZpbGxcIikpIHtcbiAgICAgICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZC5hdXRvZmlsbCwgXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC5hdXRvZmlsbC50eXBlID09PSBcInN0b3JhZ2VcIikge1xuICAgICAgICAgICAgICAgIGZpZWxkW1wiZGVmYXVsdFZhbHVlXCJdID0ge1xuICAgICAgICAgICAgICAgICAgaXNfZm91bmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IFwiYnJvd3Nlcl9zdG9yYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYnJvd3Nlcl9zdG9yYWdlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBgJC4ke2ZpZWxkLmtleX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlzX25vdF9lbXB0eVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbm90X2VtcHR5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9kZWZhdWx0X3ZhbHVlX2ZvdW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVuYWJsZV9maWVsZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjEgT1IgTk9UKDEpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZmllbGQ6IHsgdmFsdWU6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuYXV0b2ZpbGwudHlwZSA9PT0gXCJjb25maWdcIikge1xuICAgICAgICAgICAgICAgIGZpZWxkW1wiZGVmYXVsdFZhbHVlXCJdID0ge1xuICAgICAgICAgICAgICAgICAgaXNfZm91bmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IFwiZmllbGRfY29uZmlnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZmllbGRfY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBgJC4ke2ZpZWxkLmtleX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlzX25vdF9lbXB0eVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbm90X2VtcHR5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9kZWZhdWx0X3ZhbHVlX2ZvdW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVuYWJsZV9maWVsZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjEgT1IgTk9UKDEpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZmllbGQ6IHsgdmFsdWU6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmllbGRbXCJkZWZhdWx0VmFsdWVcIl0gPSB7XG4gICAgICAgICAgICAgIGlzX2ZvdW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgICAgIHNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IFwiZm9ybV9kYXRhXCIsXG4gICAgICAgICAgICAgICAgICBmb3JtX2RhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogYCQuJHtmaWVsZC5rZXl9YCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaXNfbm90X2VtcHR5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vdF9lbXB0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZW5hYmxlX2ZpZWxkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxIE9SIE5PVCgxKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZmllbGQ6IHsgdmFsdWU6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgZmllbGRbXCJkZWZhdWx0VmFsXCJdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUZpZWxkTWVzc2FnZXMgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoZmllbGQsIFwibWVzc2FnZXNcIiwgW10pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUZpZWxkUmVzZXRCdXR0b24gPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiYWN0aW9uXCIpICYmXG4gICAgICAgICAgZmllbGQuYWN0aW9uID09PSBcInJlc2V0XCIgJiZcbiAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJmaWVsZHNcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwicmVzZXRcIiwge1xuICAgICAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHNldEZvcm1GaWVsZHMgPSAoZm9ybUNvbmZpZzogYW55LCBmaWVsZHM6IGFueVtdKTogYW55ID0+IHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtQ29uZmlnLCBcIm11bHRpRm9ybVwiKSkge1xuICAgICAgICBmb3JtQ29uZmlnLm11bHRpRm9ybVtcImZpZWxkc1wiXSA9IGZpZWxkcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1Db25maWdbXCJmaWVsZHNcIl0gPSBmaWVsZHM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmb3JtQ29uZmlnO1xuICAgIH07XG5cbiAgICBjb25zdCBzZXRGb3JtRmllbGRHcm91cHMgPSAoZm9ybUNvbmZpZzogYW55LCBncm91cHM6IGFueSk6IGFueSA9PiB7XG4gICAgICBmb3JtQ29uZmlnW1wiZmllbGRHcm91cHNcIl0gPSBncm91cHM7XG5cbiAgICAgIHJldHVybiBmb3JtQ29uZmlnO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVGb3JtRmllbGRHcm91cHMgPSAoZmllbGRHcm91cHM6IGFueSwgZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiZ3JvdXBLZXlcIikpIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkR3JvdXBzLCBmaWVsZC5ncm91cEtleSkpIHtcbiAgICAgICAgICBmaWVsZEdyb3Vwc1tmaWVsZC5ncm91cEtleV0ucHVzaChmaWVsZC5rZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkR3JvdXBzW2ZpZWxkLmdyb3VwS2V5XSA9IFtmaWVsZC5rZXldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWVsZEdyb3VwcztcbiAgICB9O1xuXG4gICAgbGV0IGNvbm5lY3RlZEZpZWxkTWFwcGluZzogYW55ID0ge1xuICAgICAgcGFyZW50OiB7fSxcbiAgICAgIGNoaWxkOiB7fVxuICAgIH07XG5cbiAgICBsZXQgZmllbGRzOiBhbnlbXSA9IHRoaXMuZ2V0Rm9ybUZpZWxkcyhmb3JtQ29uZmlnKTtcblxuICAgIGxldCBmaWVsZEdyb3VwczogYW55ID0ge307XG5cbiAgICBmb3IgKGxldCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGZpZWxkID0gdXBkYXRlT25GaWVsZFR5cGUoZmllbGQpO1xuXG4gICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkS2V5cyhmaWVsZCk7XG5cbiAgICAgIC8vIGNvbm5lY3RlZEZpZWxkTWFwcGluZyA9IGdldENvbm5lY3RlZEVsZW1lbnRGaWVsZE1hcHBpbmcoXG4gICAgICAvLyAgIGZpZWxkLFxuICAgICAgLy8gICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdcbiAgICAgIC8vICk7XG4gICAgICAvLyBmaWVsZCA9IHVwZGF0ZUNvbm5lY3RlZEVsZW1lbnRzS2V5VmFsdWUoZmllbGQsIGNvbm5lY3RlZEZpZWxkTWFwcGluZyk7XG4gICAgICBmaWVsZEdyb3VwcyA9IHVwZGF0ZUZvcm1GaWVsZEdyb3VwcyhmaWVsZEdyb3VwcywgZmllbGQpO1xuXG4gICAgICBmaWVsZCA9IHVwZGF0ZUZpZWxkRGVmYXVsdFZhbHVlQ29uZmlnKGZpZWxkKTtcblxuICAgICAgZmllbGQgPSB1cGRhdGVGaWVsZFZhbGlkYXRvckNvbmZpZyhmaWVsZCk7XG5cbiAgICAgIGZpZWxkID0gdXBkYXRlRmllbGRSZXNldEJ1dHRvbihmaWVsZCk7XG5cbiAgICAgIGZpZWxkID0gdXBkYXRlRmllbGRNZXNzYWdlcyhmaWVsZCk7XG4gICAgfVxuXG4gICAgZm9ybUNvbmZpZyA9IHNldEZvcm1GaWVsZEdyb3Vwcyhmb3JtQ29uZmlnLCBmaWVsZEdyb3Vwcyk7XG5cbiAgICBmb3JtQ29uZmlnID0gc2V0Rm9ybUZpZWxkcyhmb3JtQ29uZmlnLCBmaWVsZHMpO1xuXG4gICAgcmV0dXJuIGZvcm1Db25maWc7XG4gIH1cbn1cbiJdfQ==