ngx-material-entity 18.0.1 → 18.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/components/custom-table/custom-table-configuration.model.d.ts +65 -0
  2. package/components/custom-table/custom-table.component.d.ts +111 -0
  3. package/components/edit-page/edit-page.component.d.ts +5 -1
  4. package/components/input/array/array-date-input/array-date-input.component.d.ts +2 -2
  5. package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +3 -3
  6. package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +3 -3
  7. package/components/input/array/array-table.class.d.ts +25 -19
  8. package/components/input/input.component.d.ts +99 -80
  9. package/components/input/relations/references-many-input/references-many-input.component.d.ts +12 -17
  10. package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +5 -5
  11. package/components/table/table-data.d.ts +9 -4
  12. package/components/table/table.component.d.ts +15 -37
  13. package/decorators/array/array-decorator-internal.data.d.ts +5 -1
  14. package/decorators/array/array-decorator.data.d.ts +38 -82
  15. package/decorators/references-many/references-many-decorator-internal.data.d.ts +3 -1
  16. package/decorators/references-many/references-many-decorator.data.d.ts +13 -1
  17. package/directives/dynamic-style-class.directive.d.ts +4 -5
  18. package/esm2022/components/confirm-dialog/confirm-dialog.component.mjs +5 -6
  19. package/esm2022/components/create-page/create-page.component.mjs +6 -7
  20. package/esm2022/components/custom-table/custom-table-configuration.model.mjs +37 -0
  21. package/esm2022/components/custom-table/custom-table.component.mjs +213 -0
  22. package/esm2022/components/edit-page/edit-page.component.mjs +19 -9
  23. package/esm2022/components/form/form.component.mjs +5 -6
  24. package/esm2022/components/input/array/array-date-input/array-date-input.component.mjs +16 -20
  25. package/esm2022/components/input/array/array-date-range-input/array-date-range-input.component.mjs +27 -26
  26. package/esm2022/components/input/array/array-date-time-input/array-date-time-input.component.mjs +17 -21
  27. package/esm2022/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +4 -4
  28. package/esm2022/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +4 -4
  29. package/esm2022/components/input/array/array-table.class.mjs +51 -43
  30. package/esm2022/components/input/date/date-range-input/date-range-input.component.mjs +5 -6
  31. package/esm2022/components/input/date/date-time-input/date-time-input.component.mjs +4 -4
  32. package/esm2022/components/input/file/file-image-input/file-image-input.component.mjs +4 -7
  33. package/esm2022/components/input/file/file-input/file-input.component.mjs +4 -5
  34. package/esm2022/components/input/input.component.mjs +143 -106
  35. package/esm2022/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +4 -5
  36. package/esm2022/components/input/relations/references-many-input/references-many-input.component.mjs +40 -55
  37. package/esm2022/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +4 -5
  38. package/esm2022/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +4 -5
  39. package/esm2022/components/input/string/string-password-input/string-password-input.component.mjs +4 -4
  40. package/esm2022/components/table/create-dialog/create-entity-dialog.component.mjs +7 -8
  41. package/esm2022/components/table/edit-dialog/edit-entity-dialog.component.mjs +19 -14
  42. package/esm2022/components/table/table-data.mjs +1 -1
  43. package/esm2022/components/table/table.component.mjs +40 -107
  44. package/esm2022/components/tooltip/tooltip.component.mjs +3 -3
  45. package/esm2022/decorators/array/array-decorator-internal.data.mjs +14 -1
  46. package/esm2022/decorators/array/array-decorator.data.mjs +33 -2
  47. package/esm2022/decorators/has-many/has-many-decorator-internal.data.mjs +1 -1
  48. package/esm2022/decorators/references-many/references-many-decorator-internal.data.mjs +8 -1
  49. package/esm2022/decorators/references-many/references-many-decorator.data.mjs +1 -1
  50. package/esm2022/directives/dynamic-style-class.directive.mjs +5 -5
  51. package/esm2022/directives/tooltip.directive.mjs +4 -1
  52. package/esm2022/functions/get-changes-tooltip-content.function.mjs +23 -0
  53. package/esm2022/functions/get-validation-errors-tooltip-content.function.mjs +23 -0
  54. package/esm2022/functions/table-column-value-to-sort-value.function.mjs +29 -0
  55. package/esm2022/public-api.mjs +3 -2
  56. package/esm2022/utilities/date.utilities.mjs +7 -6
  57. package/esm2022/utilities/entity.utilities.mjs +23 -7
  58. package/esm2022/utilities/validation.utilities.mjs +2 -2
  59. package/fesm2022/ngx-material-entity.mjs +2545 -2224
  60. package/fesm2022/ngx-material-entity.mjs.map +1 -1
  61. package/functions/get-changes-tooltip-content.function.d.ts +13 -0
  62. package/functions/table-column-value-to-sort-value.function.d.ts +9 -0
  63. package/package.json +1 -1
  64. package/public-api.d.ts +2 -1
  65. package/utilities/entity.utilities.d.ts +7 -3
  66. package/esm2022/functions/get-validation-errors-tooltip-content.function.ts.mjs +0 -23
  67. /package/functions/{get-validation-errors-tooltip-content.function.ts.d.ts → get-validation-errors-tooltip-content.function.d.ts} +0 -0
@@ -212,25 +212,28 @@ export class EntityUtilities {
212
212
  * @param entity - The entity after all changes.
213
213
  * @param entityPriorChanges - The entity before the changes.
214
214
  * @param http - The angular HttpClient. Used to fetch files.
215
+ * @param injector - An angular environment injector.
215
216
  * @returns Whether or not the entity is dirty.
216
217
  */
217
- static async isDirty(entity, entityPriorChanges, http) {
218
+ static async isDirty(entity, entityPriorChanges, http, injector) {
218
219
  if (!entityPriorChanges) {
219
220
  return false;
220
221
  }
221
- const differences = await this.getDifferencesBetweenEntities(entity, entityPriorChanges, http);
222
- return differences.length ? true : false;
222
+ const differences = await this.getDifferencesBetweenEntities(entity, entityPriorChanges, http, injector);
223
+ return !!differences.length;
223
224
  }
224
225
  /**
225
- * Gets the differences between the two given entities.
226
+ * Gets the differences between the two given entities. Only checks properties which are decorated.
226
227
  * @param entity - The entity as is.
227
228
  * @param entityPriorChanges - The entity before any changes have been made.
228
229
  * @param http - The angular http client, is needed to check if files are equal.
230
+ * @param injector - An angular environment injector.
229
231
  * @returns The differences as an array consisting of key, before and after.
230
232
  */
231
- static async getDifferencesBetweenEntities(entity, entityPriorChanges, http) {
233
+ static async getDifferencesBetweenEntities(entity, entityPriorChanges, http, injector) {
232
234
  const res = [];
233
- for (const key in entity) {
235
+ // values that are not decorated can be ignored, as they are not transferred via http.
236
+ for (const key of this.keysOf(entity, injector)) {
234
237
  const type = this.getPropertyType(entity, key);
235
238
  const metadata = this.getPropertyMetadata(entity, key);
236
239
  if (!await this.isEqual(entity[key], entityPriorChanges[key], metadata, type, http)) {
@@ -258,6 +261,11 @@ export class EntityUtilities {
258
261
  * @returns Whether or not the given values are equal.
259
262
  */
260
263
  static async isEqual(value, valuePriorChanges, metadata, type, http) {
264
+ if ((value == undefined && valuePriorChanges == undefined)
265
+ || this.differenceIsUndefinedAndEmptyArray(value, valuePriorChanges)
266
+ || this.differenceIsUndefinedAndEmptyString(value, valuePriorChanges)) {
267
+ return true;
268
+ }
261
269
  switch (type) {
262
270
  case DecoratorTypes.DATE_RANGE:
263
271
  return this.isEqualDateRange(value, valuePriorChanges, metadata.filter);
@@ -283,6 +291,14 @@ export class EntityUtilities {
283
291
  return LodashUtilities.isEqual(value, valuePriorChanges);
284
292
  }
285
293
  }
294
+ static differenceIsUndefinedAndEmptyString(value, valuePriorChanges) {
295
+ return (valuePriorChanges == undefined && typeof value === 'string' && !value.length)
296
+ || (value == undefined && typeof valuePriorChanges === 'string' && !valuePriorChanges.length);
297
+ }
298
+ static differenceIsUndefinedAndEmptyArray(value, valuePriorChanges) {
299
+ return (valuePriorChanges == undefined && Array.isArray(value) && !value.length)
300
+ || (value == undefined && Array.isArray(valuePriorChanges) && !valuePriorChanges.length);
301
+ }
286
302
  static isEqualArrayString(value, valuePriorChanges) {
287
303
  let stringArray = LodashUtilities.cloneDeep(value);
288
304
  if (stringArray) {
@@ -577,4 +593,4 @@ export class EntityUtilities {
577
593
  return res;
578
594
  }
579
595
  }
580
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBdUIscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUdqRCxPQUFPLEVBQWlCLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBUXhGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQW9CdEU7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGVBQWU7SUFFakM7O09BRUc7SUFDSCxNQUFNLENBQVUsMEJBQTBCLEdBQVcscUJBQXFCLENBQUM7SUFFM0U7O09BRUc7SUFDSCxNQUFNLENBQVUsd0JBQXdCLEdBQVcsb0JBQW9CLENBQUM7SUFFeEU7O09BRUc7SUFDSCxNQUFNLENBQVUsd0JBQXdCLEdBQVcsb0JBQW9CLENBQUM7SUFFeEU7O09BRUc7SUFDSCxNQUFNLENBQVUsYUFBYSxHQUFXLFdBQVcsQ0FBQztJQUVwRDs7T0FFRztJQUNILE1BQU0sQ0FBVSxvQkFBb0IsR0FBVyxpQkFBaUIsQ0FBQztJQUVqRTs7T0FFRztJQUNILE1BQU0sQ0FBVSxRQUFRLEdBQVcsTUFBTSxDQUFDO0lBRTFDOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQWdELE1BQWtCO1FBQ3JGLE1BQU0sR0FBRyxHQUF5QixFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN2QixNQUFNLFFBQVEsR0FBeUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3RyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdEMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQWdELE1BQWtCO1FBQ3JGLE1BQU0sR0FBRyxHQUF5QixFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN2QixNQUFNLFFBQVEsR0FBeUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3RyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdEMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsMEJBQTBCLENBQWdELE1BQWtCO1FBQy9GLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUF3QixDQUFDO0lBQzlGLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQ25DLE1BQWtCLEVBQ2xCLGtCQUE4QixFQUM5QixJQUFnQixFQUNoQixRQUE2QjtRQUU3QixNQUFNLEdBQUcsR0FBd0IsRUFBRSxDQUFDO1FBQ3BDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNELE1BQU0sUUFBUSxHQUF5RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzdHLE1BQU0sSUFBSSxHQUErQixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2xGLFFBQVEsSUFBSSxFQUFFLENBQUM7b0JBQ1gsS0FBSyxjQUFjLENBQUMsTUFBTTt3QkFDdEIsc0RBQXNEO3dCQUNyRCxHQUFHLENBQUMsR0FBRyxDQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3BHLE1BQU07b0JBQ1YsS0FBSyxjQUFjLENBQUMsS0FBSzt3QkFDcEIsR0FBRyxDQUFDLEdBQUcsQ0FBYyxHQUFJLE1BQU0sQ0FBQyxHQUFHLENBQWM7NkJBQzdDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzdFLE1BQU07b0JBQ1Y7d0JBQ0ksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDdkIsTUFBTTtnQkFDZCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQWdELE1BQWtCO1FBQ3JGLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQXlELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0csSUFBSSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ3BCLHVGQUF1RjtnQkFDdkYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQVMsQ0FBQztZQUM1QyxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxpQkFBaUIsQ0FDcEIsTUFBa0IsRUFDbEIsSUFBMEI7UUFFMUIsTUFBTSxHQUFHLEdBQXlCLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxHQUErQixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzRSxJQUFJLElBQUksS0FBSyxjQUFjLENBQUMsWUFBWSxJQUFJLElBQUksS0FBSyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzdFLDZDQUE2QztnQkFDN0MsTUFBTSxRQUFRLEdBQTZDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUE2QyxDQUFDO2dCQUM3SSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxJQUFJLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDbkcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxtQkFBbUIsQ0FLdEIsTUFBa0IsRUFDbEIsV0FBNkI7SUFDN0Isd0RBQXdEO0lBQ3hELElBQVE7UUFFUixNQUFNLFFBQVEsR0FBWSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN4RiwwQkFBMEI7UUFDMUIsOEhBQThIO1FBQzlILElBQUk7UUFDSixPQUFPLFFBQTRELENBQUM7SUFDeEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQ2xCLE1BQWtCLEVBQUUsV0FBNkI7UUFFakQsT0FBTyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQStCLENBQUM7SUFDbkcsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFnRCxNQUFrQixFQUFFLE1BQW1CO1FBQzdGLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEdBQStCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzNFLElBQUksS0FBSyxHQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzVFLFFBQVEsSUFBSSxFQUFFLENBQUM7Z0JBQ1gsS0FBSyxjQUFjLENBQUMsTUFBTTtvQkFDdEIsc0RBQXNEO29CQUN0RCxNQUFNLGNBQWM7b0JBQ2hCLHNEQUFzRDtzQkFDcEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBOEMsQ0FBQztvQkFDaEgsS0FBSyxHQUFHLElBQUksY0FBYyxDQUFDLFdBQVcsQ0FBQyxLQUEyQixDQUFDLENBQUM7b0JBQ3BFLE1BQU07Z0JBQ1YsS0FBSyxjQUFjLENBQUMsS0FBSztvQkFDckIsTUFBTSxVQUFVLEdBQTZCLEtBQWlDLENBQUM7b0JBQy9FLE1BQU0sUUFBUSxHQUFpQixFQUFFLENBQUM7b0JBQ2xDLElBQUksVUFBVSxFQUFFLENBQUM7d0JBQ2Isc0RBQXNEO3dCQUN0RCxNQUFNLGFBQWE7d0JBQ2Ysc0RBQXNEOzBCQUNwRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUE0QyxDQUFDO3dCQUM3RyxLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDOzRCQUM1QixNQUFNLGdCQUFnQixHQUFlLElBQUksYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQWUsQ0FBQzs0QkFDdkYsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3dCQUNwQyxDQUFDO29CQUNMLENBQUM7b0JBQ0QsS0FBSyxHQUFHLFFBQVEsQ0FBQztvQkFDakIsTUFBTTtnQkFDVjtvQkFDSSxNQUFNO1lBQ2QsQ0FBQztZQUNELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDTCxDQUFDO0lBQ0QsK0ZBQStGO0lBQy9GLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUM1QiwrRkFBK0Y7SUFDL0YsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBRXhCOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUNoQixNQUFrQixFQUNsQixrQkFBOEIsRUFDOUIsSUFBZ0I7UUFFaEIsSUFBSSxDQUFFLGtCQUE2QyxFQUFFLENBQUM7WUFDbEQsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUE2QixNQUFNLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekgsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FDdEMsTUFBa0IsRUFDbEIsa0JBQThCLEVBQzlCLElBQWdCO1FBRWhCLE1BQU0sR0FBRyxHQUE2QixFQUFFLENBQUM7UUFDekMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksR0FBK0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0UsTUFBTSxRQUFRLEdBQXlELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0csSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNsRixHQUFHLENBQUMsSUFBSSxDQUFDO29CQUNMLEdBQUcsRUFBRSxHQUFHO29CQUNSLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7b0JBQy9CLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUNyQixDQUFDLENBQUM7WUFDUCxDQUFDO2lCQUNJLENBQUM7Z0JBQ0YsMEVBQTBFO2dCQUMxRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2hCLEtBQWMsRUFDZCxpQkFBMEIsRUFDMUIsUUFBOEQsRUFDOUQsSUFBZ0MsRUFDaEMsSUFBZ0I7UUFFaEIsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNYLEtBQUssY0FBYyxDQUFDLFVBQVU7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUN4QixLQUFLLEVBQ0wsaUJBQWlCLEVBQ2hCLFFBQWlELENBQUMsTUFBTSxDQUM1RCxDQUFDO1lBQ04sS0FBSyxjQUFjLENBQUMsSUFBSTtnQkFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3RELEtBQUssY0FBYyxDQUFDLFNBQVM7Z0JBQ3pCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUMxRCxLQUFLLGNBQWMsQ0FBQyxVQUFVLENBQUM7WUFDL0IsS0FBSyxjQUFjLENBQUMsZUFBZTtnQkFDL0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDM0QsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO2dCQUNoQyxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FDN0IsS0FBSyxFQUNMLGlCQUFpQixFQUNoQixRQUFrRCxDQUFDLE1BQU0sQ0FDN0QsQ0FBQztZQUNOLEtBQUssY0FBYyxDQUFDLGtCQUFrQixDQUFDO1lBQ3ZDLEtBQUssY0FBYyxDQUFDLCtCQUErQjtnQkFDL0MsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDN0QsS0FBSyxjQUFjLENBQUMsVUFBVSxDQUFDO1lBQy9CLEtBQUssY0FBYyxDQUFDLFlBQVk7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUcsUUFBK0MsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkgsS0FBSyxjQUFjLENBQUMsTUFBTTtnQkFDdEIsc0RBQXNEO2dCQUN0RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFFBQTZELENBQUMsQ0FBQztZQUN2SDtnQkFDSSxPQUFPLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDakUsQ0FBQztJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBYyxFQUFFLGlCQUEwQjtRQUN4RSxJQUFJLFdBQVcsR0FBeUIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxLQUE2QixDQUFDLENBQUM7UUFDakcsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNkLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksdUJBQXVCLEdBQXlCLGVBQWUsQ0FBQyxTQUFTLENBQUMsaUJBQXlDLENBQUMsQ0FBQztRQUN6SCxJQUFJLHVCQUF1QixFQUFFLENBQUM7WUFDMUIsdUJBQXVCLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUNELE9BQU8sZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQWMsRUFBRSxpQkFBMEI7UUFDdEUsSUFBSSxRQUFRLEdBQXVCLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBMkIsQ0FBQyxDQUFDO1FBQzFGLElBQUksUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckQsQ0FBQztRQUNELElBQUksb0JBQW9CLEdBQXVCLGVBQWUsQ0FBQyxTQUFTLENBQUMsaUJBQXVDLENBQUMsQ0FBQztRQUNsSCxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDdkIsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTyxNQUFNLENBQUMscUJBQXFCLENBQUMsS0FBYyxFQUFFLGlCQUEwQixFQUFFLE1BQTJCO1FBQ3hHLElBQUksVUFBVSxHQUE0QixlQUFlLENBQUMsU0FBUyxDQUFDLEtBQWdDLENBQUMsQ0FBQztRQUN0RyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2IsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsSUFBSSxzQkFBc0IsR0FBNEIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxpQkFBNEMsQ0FBQyxDQUFDO1FBQzlILElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxVQUFVLEVBQUUsTUFBTSxLQUFLLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3hELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxJQUFJLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNyQixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDL0UsT0FBTyxLQUFLLENBQUM7Z0JBQ2pCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQWMsRUFBRSxpQkFBMEI7UUFDckUsTUFBTSxJQUFJLEdBQVMsSUFBSSxJQUFJLENBQUMsS0FBYSxDQUFDLENBQUM7UUFDM0MsTUFBTSxnQkFBZ0IsR0FBUyxJQUFJLElBQUksQ0FBQyxpQkFBeUIsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFjLEVBQUUsaUJBQTBCO1FBQ2pFLE1BQU0sSUFBSSxHQUFTLElBQUksSUFBSSxDQUFDLEtBQWEsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sZ0JBQWdCLEdBQVMsSUFBSSxJQUFJLENBQUMsaUJBQXlCLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFCLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxPQUFPLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFjLEVBQUUsaUJBQTBCLEVBQUUsTUFBMkI7UUFDbkcsTUFBTSxTQUFTLEdBQW1DLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFtQyxDQUFDO1FBQ3JILElBQUksU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ25CLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNqQixTQUFTLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxTQUFTLEVBQUUsS0FBSyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwQyxTQUFTLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxlQUFlLENBQzVDLFNBQVMsQ0FBQyxLQUFLLEVBQ2YsU0FBUyxDQUFDLEdBQUcsRUFDYixNQUFNLENBQ1QsQ0FBQztRQUNOLENBQUM7UUFDRCw2Q0FBNkM7UUFDN0MsTUFBTSxxQkFBcUIsR0FBbUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBbUMsQ0FBQztRQUM3SSxJQUFJLHFCQUFxQixFQUFFLEtBQUssRUFBRSxDQUFDO1lBQy9CLHFCQUFxQixDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUM3QixxQkFBcUIsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELElBQUkscUJBQXFCLEVBQUUsS0FBSyxJQUFJLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzVELHFCQUFxQixDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsZUFBZSxDQUN4RCxxQkFBcUIsQ0FBQyxLQUFLLEVBQzNCLHFCQUFxQixDQUFDLEdBQUcsRUFDekIsTUFBTSxDQUNULENBQUM7UUFDTixDQUFDO1FBQ0QsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsMEJBQTBCO0lBQzFCLHNEQUFzRDtJQUM5QyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFjLEVBQUUsaUJBQTBCLEVBQUUsUUFBaUIsRUFBRSxJQUFnQjtRQUM1RyxJQUFJLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNyQixPQUFPLGlCQUFpQixJQUFJLFNBQVMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxpQkFBaUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQWUsUUFBUSxDQUFDLENBQUMsQ0FBRSxLQUFvQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQWlCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvRixNQUFNLGlCQUFpQixHQUFlLFFBQVEsQ0FBQyxDQUFDLENBQUUsaUJBQWdDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQTZCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUMsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsNEVBQTRFO1lBQzVFLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2SCxPQUFPLEtBQUssQ0FBQztZQUNqQixDQUFDO1lBQ0QsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzlDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLGFBQWEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzRCxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDOUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxhQUFhLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNuRixpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDakcsT0FBTyxLQUFLLENBQUM7WUFDakIsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sTUFBTSxDQUFDLGFBQWEsQ0FDeEIsS0FBYyxFQUNkLGlCQUEwQjtJQUMxQixzREFBc0Q7SUFDdEQsUUFBMkQ7UUFFM0QsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FDZixDQUFtQixFQUNuQixDQUFtQixFQUNuQixNQUFrQjtRQUVsQixNQUFNLFNBQVMsR0FBeUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RyxNQUFNLFNBQVMsR0FBeUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU1RyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0IsT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDO1FBRUQsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xDLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxDQUFDLENBQUM7WUFDYixDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDO2FBQ0ksSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBZ0QsTUFBa0IsRUFBRSxHQUFxQjtRQUMzRyxNQUFNLFFBQVEsR0FBeUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3RyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxPQUFPLFVBQVUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN6SCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxvQkFBb0IsQ0FBZ0QsTUFBa0IsRUFBRSxrQkFBOEI7UUFDekgsS0FBSyxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ25DLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLElBQUksZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDN0UsS0FBSyxNQUFNLENBQUMsSUFBSyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxHQUFHLENBQWMsRUFBRSxDQUFDO29CQUN2RyxJQUFJLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQy9DLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDL0QsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLGFBQWEsQ0FDeEIsTUFBa0IsRUFDbEIsR0FBVyxFQUNYLGlCQUEwQixFQUMxQixlQUF3QixFQUN4QixvQkFBMEMsRUFDMUMsUUFBNkI7UUFFN0IsTUFBTSxHQUFHLEdBQTRCLEVBQUUsQ0FBQztRQUV4QyxNQUFNLElBQUksR0FBeUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsQ0FBQzthQUMvRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sWUFBWSxHQUFXLElBQUksQ0FBQyxlQUFlLENBQWEsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsTUFBTSxHQUFHLEdBQTBCO2dCQUMvQixHQUFHLEVBQUUsQ0FBQztnQkFDTixJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBYSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7YUFDN0QsQ0FBQztZQUNGLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBYSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9ELE1BQU0sT0FBTyxHQUEwQjtnQkFDbkMsR0FBRyxFQUFFLFlBQVksR0FBRyxDQUFDO2dCQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBYSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQzthQUM5RCxDQUFDO1lBQ0YsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUNoQixNQUFrQixFQUNsQixRQUE2QixFQUM3QixvQkFBNkIsS0FBSyxFQUNsQyxrQkFBMkIsS0FBSyxFQUNoQyxxQkFBMkMsRUFBRTtRQUU3QyxNQUFNLEdBQUcsR0FBNEIsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxHQUF5QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxDQUFDO2FBQy9GLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxZQUFZLEdBQVcsSUFBSSxDQUFDLGVBQWUsQ0FBYSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFNUUsTUFBTSxZQUFZLEdBQTRCLElBQUksQ0FBQyxhQUFhLENBQzVELE1BQU0sRUFDTixDQUFDLENBQUMsRUFDRixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixRQUFRLENBQ1gsQ0FBQztRQUNGLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLE1BQU0sUUFBUSxHQUEwQjtnQkFDcEMsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO2dCQUNyQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNQLElBQUksRUFBRSxZQUFZO2FBQ3JCLENBQUM7WUFDRixHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsTUFBTSxJQUFJLEdBQTRCLElBQUksQ0FBQyxhQUFhLENBQ3BELE1BQU0sRUFBRSxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsQ0FDOUUsQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLE1BQU0sR0FBRyxHQUEwQjtvQkFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztvQkFDbkMsR0FBRyxFQUFFLENBQUM7b0JBQ04sSUFBSSxFQUFFLElBQUk7aUJBQ2IsQ0FBQztnQkFDRixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRU8sTUFBTSxDQUFDLGFBQWEsQ0FDeEIsSUFBMEIsRUFDMUIsTUFBa0IsRUFDbEIsR0FBVyxFQUNYLEdBQVc7UUFFWCxPQUFPLElBQUk7YUFDTixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDO2FBQ3RFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7YUFDdEUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQzFCLElBQTBCLEVBQzFCLE1BQWtCLEVBQ2xCLEdBQVc7UUFFWCxPQUFRLElBQUk7YUFDUCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDO2FBQ3RFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBYzthQUN4RSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQWdELElBQTBCLEVBQUUsTUFBa0I7UUFDeEgsT0FBUSxJQUFJO2FBQ1AsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7YUFDN0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFjO2FBQ3hFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sTUFBTSxDQUFDLFVBQVUsQ0FBZ0QsTUFBa0IsRUFBRSxHQUFXO1FBQ3BHLE1BQU0sZUFBZSxHQUF1QixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2FBQ3ZFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDN0MsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNoRixPQUFPLGVBQWUsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFTyxNQUFNLENBQUMsZUFBZSxDQUFnRCxNQUFrQjtRQUM1RixNQUFNLGVBQWUsR0FBdUIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQzthQUN2RSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzdDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUMvRSxPQUFPLGVBQWUsSUFBSSxPQUFPLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUNULE1BQWtCLEVBQ2xCLFFBQTZCLEVBQzdCLG9CQUE2QixLQUFLLEVBQ2xDLGtCQUEyQixLQUFLO1FBRWhDLElBQUksSUFBSSxHQUF5QixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEUsTUFBTSxlQUFlLEdBQXlCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEYsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDcEIsTUFBTSxpQkFBaUIsR0FBeUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNsQixNQUFNLGlCQUFpQixHQUF5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sTUFBTSxDQUFDLGtCQUFrQixDQUM3QixNQUFrQixFQUNsQixRQUE2QjtRQUU3QixNQUFNLEdBQUcsR0FBeUIsRUFBRSxDQUFDO1FBQ3JDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQXlELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0csaUVBQWlFO1lBQ2pFLElBQUkscUJBQXFCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRJbmplY3RvciwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRlRmlsdGVyRm4gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcblxuaW1wb3J0IHsgRGF0ZVV0aWxpdGllcyB9IGZyb20gJy4vZGF0ZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgRmlsZVV0aWxpdGllcyB9IGZyb20gJy4vZmlsZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUgfSBmcm9tICcuLi9jbGFzc2VzL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsLCBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9hcnJheS9hcnJheS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEZWNvcmF0b3JUeXBlLCBEZWNvcmF0b3JUeXBlcyB9IGZyb20gJy4uL2RlY29yYXRvcnMvYmFzZS9kZWNvcmF0b3ItdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9iYXNlL3Byb3BlcnR5LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IEN1c3RvbURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9jdXN0b20vY3VzdG9tLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERhdGVSYW5nZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvZGF0ZS9kYXRlLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4uL2RlY29yYXRvcnMvZGF0ZS9kYXRlLWRlY29yYXRvci5kYXRhJztcbmltcG9ydCB7IERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2ZpbGUvZmlsZS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBGaWxlRGF0YSB9IGZyb20gJy4uL2RlY29yYXRvcnMvZmlsZS9maWxlLWRlY29yYXRvci5kYXRhJztcbmltcG9ydCB7IERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvb2JqZWN0L29iamVjdC1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBMb2Rhc2hVdGlsaXRpZXMgfSBmcm9tICcuLi9lbmNhcHN1bGF0aW9uL2xvZGFzaC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgUmVmbGVjdFV0aWxpdGllcyB9IGZyb20gJy4uL2VuY2Fwc3VsYXRpb24vcmVmbGVjdC51dGlsaXRpZXMnO1xuXG4vKipcbiAqIFNob3dzIGluZm9ybWF0aW9uIGFib3V0IGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIGVudGl0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpZmZlcmVuY2U8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiB7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSB3aGVyZSB0aGUgdHdvIGVudGl0aWVzIGhhdmUgZGlmZmVyZW50IHZhbHVlcy5cbiAgICAgKi9cbiAgICBrZXk6IGtleW9mIEVudGl0eVR5cGUsXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIGJlZm9yZSBhbnkgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBiZWZvcmU6IHVua25vd24sXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmFsdWUgYWZ0ZXIgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBhZnRlcjogdW5rbm93blxufVxuXG4vKipcbiAqIENvbnRhaW5zIEhlbHBlck1ldGhvZHMgYXJvdW5kIGhhbmRsaW5nIEVudGl0aWVzIGFuZCB0aGVpciBwcm9wZXJ0eS1tZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVudGl0eVV0aWxpdGllcyB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciBhbGwga2V5cyBvZiBtZXRhZGF0YSB0aGF0IHNob3VsZCBiZSBzZXQgdG8gdW5kZWZpbmVkIHdoZW4gdGhlIGVudGl0eSBnZXRzIHJlc2V0LlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBNRVRBREFUQV9LRVlTX1RPX1JFU0VUX0tFWTogc3RyaW5nID0gJ21ldGFkYXRhS2V5c1RvUmVzZXQnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIHRoYXQgc2F2ZXMgdGhlIHNpbmdsZSBwcmV2aWV3IGltYWdlIHZhbHVlIG9uIGltYWdlIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IFNJTkdMRV9QUkVWSUVXX0lNQUdFX0tFWTogc3RyaW5nID0gJ3NpbmdsZVByZXZpZXdJbWFnZSc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgbXVsdGkgcHJldmlldyBpbWFnZXMgdmFsdWUgb24gaW1hZ2UgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgTVVMVElfUFJFVklFV19JTUFHRVNfS0VZOiBzdHJpbmcgPSAnbXVsdGlQcmV2aWV3SW1hZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBmaWxlbmFtZXMgdmFsdWUgb24gZmlsZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBGSUxFTkFNRVNfS0VZOiBzdHJpbmcgPSAnZmlsZU5hbWVzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBjb25maXJtIHBhc3N3b3JkIHZhbHVlIG9uIHBhc3N3b3JkIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IENPTkZJUk1fUEFTU1dPUkRfS0VZOiBzdHJpbmcgPSAnY29uZmlybVBhc3N3b3JkJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSB0aW1lIHZhbHVlIG9uIGRhdGUgdGltZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBUSU1FX0tFWTogc3RyaW5nID0gJ3RpbWUnO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydGllcyB0byBvbWl0IHdoZW4gdXBkYXRpbmcgdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIHByb3BlcnRpZXMgd2hpY2ggc2hvdWxkIGJlIGxlZnQgb3V0IGZvciB1cGRhdGluZyBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgdXBkYXRpbmcgYW4gRW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRPbWl0Rm9yVXBkYXRlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICBjb25zdCByZXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YSB8fCBtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnRpZXMgdG8gb21pdCB3aGVuIGNyZWF0aW5nIG5ldyBlbnRpdGllcy5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIHByb3BlcnRpZXMgd2hpY2ggc2hvdWxkIGJlIGxlZnQgb3V0IGZvciBjcmVhdGluZyBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgY3JlYXRpbmcgYSBuZXcgRW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRPbWl0Rm9yQ3JlYXRlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICBjb25zdCByZXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YSB8fCBtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGVudGl0eSB3aXRob3V0IHRoZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgb21pdHRlZCBmb3IgY3JlYXRpb24uXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgd2l0aCBhbGwgaXRzIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVkdWNlZCBlbnRpdHkgb2JqZWN0LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXaXRob3V0T21pdENyZWF0ZVZhbHVlczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IFBhcnRpYWw8RW50aXR5VHlwZT4ge1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLm9taXQoZW50aXR5LCB0aGlzLmdldE9taXRGb3JDcmVhdGUoZW50aXR5KSkgYXMgUGFydGlhbDxFbnRpdHlUeXBlPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBlbnRpdHkgd2l0aG91dCB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIG9taXR0ZWQgZm9yIHVwZGF0aW5nLlxuICAgICAqIFRoaXMgYWxzbyBoYW5kbGVzIG9taXR0aW5nIGtleXMgZm9yIEBvYmplY3Qgb3IgQGFycmF5IHZhbHVlcyBhbmQgcmVtb3ZlcyB2YWx1ZXMgdGhhdCBoYXZlbid0IGJlZW4gY2hhbmdlZCBieSBkZWZhdWx0LlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggYWxsIGl0cyB2YWx1ZXMuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBlbnRpdHkgYmVmb3JlIGFueSBjaGFuZ2VzIHdlcmUgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0gaHR0cCAtIFRoZSBhbmd1bGFyIEh0dHBDbGllbnQuIFVzZWQgdG8gZmV0Y2ggZmlsZXMuXG4gICAgICogQHBhcmFtIGluamVjdG9yIC0gQW4gYW5ndWxhciBlbnZpcm9ubWVudCBpbmplY3Rvci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVkdWNlZCBlbnRpdHkgb2JqZWN0LlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBnZXRXaXRob3V0T21pdFVwZGF0ZVZhbHVlczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZSxcbiAgICAgICAgaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3JcbiAgICApOiBQcm9taXNlPFBhcnRpYWw8RW50aXR5VHlwZT4+IHtcbiAgICAgICAgY29uc3QgcmVzOiBQYXJ0aWFsPEVudGl0eVR5cGU+ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMua2V5c09mKGVudGl0eSwgaW5qZWN0b3IsIGZhbHNlLCB0cnVlKSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgY29uc3QgdHlwZTogRGVjb3JhdG9yVHlwZXMgfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5VHlwZShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuaXNFcXVhbChlbnRpdHlba2V5XSwgZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0sIG1ldGFkYXRhLCB0eXBlLCBodHRwKSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk9CSkVDVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc1trZXldIGFzIG9iamVjdCkgPSBMb2Rhc2hVdGlsaXRpZXMub21pdChlbnRpdHlba2V5XSBhcyBhbnksIHRoaXMuZ2V0T21pdEZvckNyZWF0ZShlbnRpdHlba2V5XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzW2tleV0gYXMgb2JqZWN0W10pID0gKGVudGl0eVtrZXldIGFzIG9iamVjdFtdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodmFsdWUgPT4gTG9kYXNoVXRpbGl0aWVzLm9taXQodmFsdWUsIHRoaXMuZ2V0T21pdEZvckNyZWF0ZSh2YWx1ZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBlbnRpdHlba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWxsIGRlZmF1bHQgdmFsdWVzIG9uIHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBvbi5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0RGVmYXVsdFZhbHVlczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YT8uZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLXVuc2FmZS1hc3NpZ25tZW50LCB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgIGVudGl0eVtrZXldID0gbWV0YWRhdGEuZGVmYXVsdCgpIGFzIGFueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHByb3BlcnRpZXMgb24gdGhlIGdpdmVuIGVudGl0eSB3aGljaCBhcmUgZmlsZXMuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gY2hlY2sgZm9yIGZpbGUgcHJvcGVydGllcy5cbiAgICAgKiBAcGFyYW0gb21pdCAtIFdoZXRoZXIgdG8gbGVhdmUgb3V0IHZhbHVlcyB0aGF0IGFyZSBvbWl0dGVkIGZvciBjcmVhdGUgb3IgZGVsZXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSBrZXlzIG9mIGFsbCBmaWxlIHByb3BlcnRpZXMgb24gdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RmlsZVByb3BlcnRpZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBvbWl0PzogJ2NyZWF0ZScgfCAndXBkYXRlJ1xuICAgICk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IERlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVCB8fCB0eXBlID09PSBEZWNvcmF0b3JUeXBlcy5GSUxFX0lNQUdFKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpIGFzIFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj47XG4gICAgICAgICAgICAgICAgaWYgKCEobWV0YWRhdGEub21pdEZvckNyZWF0ZSAmJiBvbWl0ID09PSAnY3JlYXRlJykgJiYgIShtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlICYmIG9taXQgPT09ICd1cGRhdGUnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIGluY2x1ZGVkIGluIGFuIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggdGhlIHByb3BlcnR5IHRvIGdldCB0aGUgbWV0YWRhdGEgZnJvbS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkgb24gdGhlIGdpdmVuIEVudGl0eSB0byBnZXQgdGhlIG1ldGFkYXRhIGZyb20uXG4gICAgICogQHBhcmFtIHR5cGUgLSBGb3Igc2VjdXJlIFR5cGluZywgZGVmaW5lcyB0aGUgcmV0dXJuZWQgUHJvcGVydHlDb25maWcuXG4gICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICAgKiBAdGhyb3dzIFdoZW4gbm8gbWV0YWRhdGEgY2FuIGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldFByb3BlcnR5TWV0YWRhdGE8XG4gICAgICAgIEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPixcbiAgICAgICAgVCBleHRlbmRzIERlY29yYXRvclR5cGVzLFxuICAgICAgICBDdXN0b21NZXRhZGF0YVR5cGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgID4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXk6IGtleW9mIEVudGl0eVR5cGUsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bnVzZWRJbXBvcnRzL25vLXVudXNlZC12YXJzXG4gICAgICAgIHR5cGU/OiBUXG4gICAgKTogRGVjb3JhdG9yVHlwZTxULCBDdXN0b21NZXRhZGF0YVR5cGU+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGE6IHVua25vd24gPSBSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKCdtZXRhZGF0YScsIGVudGl0eSwgcHJvcGVydHlLZXkpO1xuICAgICAgICAvLyBpZiAobWV0YWRhdGEgPT0gbnVsbCkge1xuICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBtZXRhZGF0YSBmb3IgcHJvcGVydHkgJHtTdHJpbmcocHJvcGVydHlLZXkpfSBvbiB0aGUgZW50aXR5ICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5KX1gKTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGEgYXMgRGVjb3JhdG9yVHlwZTxULCBDdXN0b21NZXRhZGF0YVR5cGU+IHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5LW1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggdGhlIHByb3BlcnR5IHRvIGdldCB0aGUgdHlwZSBmcm9tLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBvbiB0aGUgZ2l2ZW4gRW50aXR5IHRvIGdldCB0aGUgdHlwZSBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YS5cbiAgICAgKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgbm8gbWV0YWRhdGEgY2FuIGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldFByb3BlcnR5VHlwZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsIHByb3BlcnR5S2V5OiBrZXlvZiBFbnRpdHlUeXBlXG4gICAgKTogRGVjb3JhdG9yVHlwZXMgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YSgndHlwZScsIGVudGl0eSwgcHJvcGVydHlLZXkpIGFzIERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWxsIHByb3BlcnR5IHZhbHVlcyBiYXNlZCBvbiBhIGdpdmVuIGVudGl0eSBkYXRhLW9iamVjdC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBuZWVkcyB0byBiZSBjb25zdHJ1Y3RlZCAoaWYgY2FsbGVkIGluc2lkZSBhbiBFbnRpdHkgY29uc3RydWN0b3IgaXRzIHVzdWFsbHkgdGhpcykuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBkYXRhIG9iamVjdCB0byBnZXQgdGhlIHByb3BlcnR5IHZhbHVlcyBmcm9tLlxuICAgICAqIEBhbGlhcyBuZXdcbiAgICAgKiBAYWxpYXMgYnVpbGRcbiAgICAgKiBAYWxpYXMgY29uc3RydWN0XG4gICAgICovXG4gICAgc3RhdGljIG5ldzxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KHRhcmdldDogRW50aXR5VHlwZSwgZW50aXR5PzogRW50aXR5VHlwZSk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eVR5cGUodGFyZ2V0LCBrZXkpO1xuICAgICAgICAgICAgbGV0IHZhbHVlOiB1bmtub3duID0gZW50aXR5ID8gUmVmbGVjdFV0aWxpdGllcy5nZXQoZW50aXR5LCBrZXkpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5PQkpFQ1Q6XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmplY3RNZXRhZGF0YTogRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPGFueT5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEodGFyZ2V0LCBrZXksIERlY29yYXRvclR5cGVzLk9CSkVDVCkgYXMgRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPGFueT47XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IG9iamVjdE1ldGFkYXRhLkVudGl0eUNsYXNzKHZhbHVlIGFzIG9iamVjdCB8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0QXJyYXk6IEVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZCA9IHZhbHVlIGFzIEVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzQXJyYXk6IEVudGl0eVR5cGVbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheU1ldGFkYXRhOiBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsPGFueT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YSh0YXJnZXQsIGtleSwgRGVjb3JhdG9yVHlwZXMuQVJSQVkpIGFzIEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55PjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVdpdGhNZXRhZGF0YTogRW50aXR5VHlwZSA9IG5ldyBhcnJheU1ldGFkYXRhLkVudGl0eUNsYXNzKGl0ZW0pIGFzIEVudGl0eVR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzQXJyYXkucHVzaChpdGVtV2l0aE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc0FycmF5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbWVtYmVyLW9yZGVyaW5nLCBqc2RvYy9yZXF1aXJlLWpzZG9jLCB0eXBlc2NyaXB0L3R5cGVkZWZcbiAgICBzdGF0aWMgY29uc3RydWN0ID0gdGhpcy5uZXc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbWVtYmVyLW9yZGVyaW5nLCBqc2RvYy9yZXF1aXJlLWpzZG9jLCB0eXBlc2NyaXB0L3R5cGVkZWZcbiAgICBzdGF0aWMgYnVpbGQgPSB0aGlzLm5ldztcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBlbnRpdHkgaXMgXCJkaXJ0eVwiIChpZiBpdHMgdmFsdWVzIGhhdmUgY2hhbmdlZCkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgYWZ0ZXIgYWxsIGNoYW5nZXMuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBlbnRpdHkgYmVmb3JlIHRoZSBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBodHRwIC0gVGhlIGFuZ3VsYXIgSHR0cENsaWVudC4gVXNlZCB0byBmZXRjaCBmaWxlcy5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZW50aXR5IGlzIGRpcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0RpcnR5PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlLFxuICAgICAgICBodHRwOiBIdHRwQ2xpZW50XG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghKGVudGl0eVByaW9yQ2hhbmdlcyBhcyBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpZmZlcmVuY2VzOiBEaWZmZXJlbmNlPEVudGl0eVR5cGU+W10gPSBhd2FpdCB0aGlzLmdldERpZmZlcmVuY2VzQmV0d2VlbkVudGl0aWVzKGVudGl0eSwgZW50aXR5UHJpb3JDaGFuZ2VzLCBodHRwKTtcbiAgICAgICAgcmV0dXJuIGRpZmZlcmVuY2VzLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gZW50aXRpZXMuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgYXMgaXMuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBlbnRpdHkgYmVmb3JlIGFueSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLlxuICAgICAqIEBwYXJhbSBodHRwIC0gVGhlIGFuZ3VsYXIgaHR0cCBjbGllbnQsIGlzIG5lZWRlZCB0byBjaGVjayBpZiBmaWxlcyBhcmUgZXF1YWwuXG4gICAgICogQHJldHVybnMgVGhlIGRpZmZlcmVuY2VzIGFzIGFuIGFycmF5IGNvbnNpc3Rpbmcgb2Yga2V5LCBiZWZvcmUgYW5kIGFmdGVyLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBnZXREaWZmZXJlbmNlc0JldHdlZW5FbnRpdGllczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZSxcbiAgICAgICAgaHR0cDogSHR0cENsaWVudFxuICAgICk6IFByb21pc2U8RGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdPiB7XG4gICAgICAgIGNvbnN0IHJlczogRGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eSkge1xuICAgICAgICAgICAgY29uc3QgdHlwZTogRGVjb3JhdG9yVHlwZXMgfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5VHlwZShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuaXNFcXVhbChlbnRpdHlba2V5XSwgZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0sIG1ldGFkYXRhLCB0eXBlLCBodHRwKSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZTogZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0sXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyOiBlbnRpdHlba2V5XVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gc2V0IGJsb2IgZmlsZSBkYXRhIHNvIHRoYXQgaXQgaXMgb25seSByZXF1ZXN0ZWQgb25jZS5cbiAgICAgICAgICAgICAgICBlbnRpdHlQcmlvckNoYW5nZXNba2V5XSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAoZW50aXR5W2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHR3byBnaXZlbiB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAqIEl0IHVzZXMgdGhlIGlzRXF1YWwgbWV0aG9kIGZyb20gTG9kYXNoVXRpbGl0aWVzIGFuZCBleHRlbmRzIGl0IHdpdGggZnVuY3Rpb25hbGl0eSByZWdhcmRpbmcgRGF0ZXMuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlUHJpb3JDaGFuZ2VzIC0gVGhlIHZhbHVlIGJlZm9yZSBhbnkgY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBUaGUgbWV0YWRhdGEgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBodHRwIC0gVGhlIGFuZ3VsYXIgSHR0cENsaWVudC4gVXNlZCB0byBmZXRjaCBmaWxlcy5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgaXNFcXVhbChcbiAgICAgICAgdmFsdWU6IHVua25vd24sXG4gICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLFxuICAgICAgICBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgdHlwZTogRGVjb3JhdG9yVHlwZXMgfCB1bmRlZmluZWQsXG4gICAgICAgIGh0dHA6IEh0dHBDbGllbnRcbiAgICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEVfUkFOR0U6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNFcXVhbERhdGVSYW5nZShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICAobWV0YWRhdGEgYXMgRGF0ZVJhbmdlRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsKS5maWx0ZXJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxEYXRlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEVfVElNRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsRGF0ZVRpbWUodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURTpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9USU1FOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxBcnJheURhdGUodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9SQU5HRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsQXJyYXlEYXRlUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhIGFzIERhdGVSYW5nZUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpLmZpbHRlclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19DSElQUzpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0FVVE9DT01QTEVURV9DSElQUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsQXJyYXlTdHJpbmcodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRTpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuRklMRV9ERUZBVUxUOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxGaWxlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcywgKG1ldGFkYXRhIGFzIERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpLm11bHRpcGxlLCBodHRwKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQ1VTVE9NOlxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxDdXN0b20odmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzLCBtZXRhZGF0YSBhcyBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnksIGFueSwgYW55LCBhbnk+KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsQXJyYXlTdHJpbmcodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duKTogYm9vbGVhbiB8IFByb21pc2VMaWtlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IHN0cmluZ0FycmF5OiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWUgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoc3RyaW5nQXJyYXkpIHtcbiAgICAgICAgICAgIHN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXkuc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdHJpbmdBcnJheVByaW9yQ2hhbmdlczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHN0cmluZ0FycmF5UHJpb3JDaGFuZ2VzKSB7XG4gICAgICAgICAgICBzdHJpbmdBcnJheVByaW9yQ2hhbmdlcyA9IHN0cmluZ0FycmF5UHJpb3JDaGFuZ2VzLnNvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoc3RyaW5nQXJyYXksIHN0cmluZ0FycmF5UHJpb3JDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsQXJyYXlEYXRlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgbmV3VmFsdWU6IERhdGVbXSB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWUgYXMgRGF0ZVtdIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlLm1hcCh2ID0+IG5ldyBEYXRlKHYpKS5zb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld1ZhbHVlUHJpb3JDaGFuZ2VzOiBEYXRlW10gfCB1bmRlZmluZWQgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGVbXSB8IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChuZXdWYWx1ZVByaW9yQ2hhbmdlcykge1xuICAgICAgICAgICAgbmV3VmFsdWVQcmlvckNoYW5nZXMgPSBuZXdWYWx1ZVByaW9yQ2hhbmdlcy5tYXAodiA9PiBuZXcgRGF0ZSh2KSkuc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChuZXdWYWx1ZSwgbmV3VmFsdWVQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxBcnJheURhdGVSYW5nZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sIGZpbHRlcj86IERhdGVGaWx0ZXJGbjxEYXRlPik6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgZGF0ZVJhbmdlczogRGF0ZVJhbmdlW10gfCB1bmRlZmluZWQgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlIGFzIERhdGVSYW5nZVtdIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKGRhdGVSYW5nZXMpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZXMgPSBkYXRlUmFuZ2VzLnNvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlczogRGF0ZVJhbmdlW10gfCB1bmRlZmluZWQgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGVSYW5nZVtdIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKGRhdGVSYW5nZXNQcmlvckNoYW5nZXMpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZXNQcmlvckNoYW5nZXMgPSBkYXRlUmFuZ2VzUHJpb3JDaGFuZ2VzLnNvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVJhbmdlcz8ubGVuZ3RoICE9PSBkYXRlUmFuZ2VzUHJpb3JDaGFuZ2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVJhbmdlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGF0ZVJhbmdlcz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNFcXVhbERhdGVSYW5nZShkYXRlUmFuZ2VzPy5baV0sIGRhdGVSYW5nZXNQcmlvckNoYW5nZXM/LltpXSwgZmlsdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxEYXRlVGltZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlIGFzIERhdGUpO1xuICAgICAgICBjb25zdCBkYXRlUHJpb3JDaGFuZ2VzOiBEYXRlID0gbmV3IERhdGUodmFsdWVQcmlvckNoYW5nZXMgYXMgRGF0ZSk7XG4gICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChkYXRlLCBkYXRlUHJpb3JDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsRGF0ZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlIGFzIERhdGUpO1xuICAgICAgICBjb25zdCBkYXRlUHJpb3JDaGFuZ2VzOiBEYXRlID0gbmV3IERhdGUodmFsdWVQcmlvckNoYW5nZXMgYXMgRGF0ZSk7XG4gICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICAgIGRhdGVQcmlvckNoYW5nZXMuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChkYXRlLCBkYXRlUHJpb3JDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsRGF0ZVJhbmdlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93biwgZmlsdGVyPzogRGF0ZUZpbHRlckZuPERhdGU+KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZTogUGFydGlhbDxEYXRlUmFuZ2U+IHwgdW5kZWZpbmVkID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZSkgYXMgUGFydGlhbDxEYXRlUmFuZ2U+IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlPy5zdGFydCkge1xuICAgICAgICAgICAgZGF0ZVJhbmdlLnN0YXJ0ID0gbmV3IERhdGUoZGF0ZVJhbmdlLnN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVJhbmdlPy5lbmQpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZS5lbmQgPSBuZXcgRGF0ZShkYXRlUmFuZ2UuZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVJhbmdlPy5zdGFydCAmJiBkYXRlUmFuZ2UuZW5kKSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2UudmFsdWVzID0gRGF0ZVV0aWxpdGllcy5nZXREYXRlc0JldHdlZW4oXG4gICAgICAgICAgICAgICAgZGF0ZVJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgICAgIGRhdGVSYW5nZS5lbmQsXG4gICAgICAgICAgICAgICAgZmlsdGVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdHlsaXN0aWMvbWF4LWxlblxuICAgICAgICBjb25zdCBkYXRlUmFuZ2VQcmlvckNoYW5nZXM6IFBhcnRpYWw8RGF0ZVJhbmdlPiB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWVQcmlvckNoYW5nZXMpIGFzIFBhcnRpYWw8RGF0ZVJhbmdlPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRhdGVSYW5nZVByaW9yQ2hhbmdlcz8uc3RhcnQpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5zdGFydCA9IG5ldyBEYXRlKGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5zdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGVSYW5nZVByaW9yQ2hhbmdlcz8uZW5kKSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2VQcmlvckNoYW5nZXMuZW5kID0gbmV3IERhdGUoZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLmVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGVSYW5nZVByaW9yQ2hhbmdlcz8uc3RhcnQgJiYgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLmVuZCkge1xuICAgICAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnZhbHVlcyA9IERhdGVVdGlsaXRpZXMuZ2V0RGF0ZXNCZXR3ZWVuKFxuICAgICAgICAgICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5zdGFydCxcbiAgICAgICAgICAgICAgICBkYXRlUmFuZ2VQcmlvckNoYW5nZXMuZW5kLFxuICAgICAgICAgICAgICAgIGZpbHRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoZGF0ZVJhbmdlLCBkYXRlUmFuZ2VQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEZpbmQgYSB3YXkgdG8gdXNlIGJsb2JzIHdpdGggamVzdFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyL2NvZ25pdGl2ZS1jb21wbGV4aXR5XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgaXNFcXVhbEZpbGUodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLCBtdWx0aXBsZTogYm9vbGVhbiwgaHR0cDogSHR0cENsaWVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVQcmlvckNoYW5nZXMgPT0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVByaW9yQ2hhbmdlcyA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWxlczogRmlsZURhdGFbXSA9IG11bHRpcGxlID8gKHZhbHVlIGFzIEZpbGVEYXRhW10pLnNvcnQoKSA6IFt2YWx1ZSBhcyBGaWxlRGF0YV0uc29ydCgpO1xuICAgICAgICBjb25zdCBmaWxlc1ByaW9yQ2hhbmdlczogRmlsZURhdGFbXSA9IG11bHRpcGxlID8gKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIEZpbGVEYXRhW10pLnNvcnQoKSA6IFt2YWx1ZVByaW9yQ2hhbmdlcyBhcyBGaWxlRGF0YV0uc29ydCgpO1xuICAgICAgICBpZiAoZmlsZXMubGVuZ3RoICE9PSBmaWxlc1ByaW9yQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGNoZWNrcyB0aGlzIGJlZm9yZSBhY3R1YWxseSBnZXR0aW5nIGFueSBmaWxlcyBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgICAgICAgIGlmICghTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoTG9kYXNoVXRpbGl0aWVzLm9taXQoZmlsZXNbaV0sICdmaWxlJyksIExvZGFzaFV0aWxpdGllcy5vbWl0KGZpbGVzUHJpb3JDaGFuZ2VzW2ldLCAnZmlsZScpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlc1ByaW9yQ2hhbmdlc1tpXS5maWxlICYmICFmaWxlc1tpXS5maWxlKSB7XG4gICAgICAgICAgICAgICAgZmlsZXNbaV0gPSBhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKGZpbGVzW2ldLCBodHRwKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpbGVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmZpbGUgJiYgIWZpbGVzUHJpb3JDaGFuZ2VzW2ldLmZpbGUpIHtcbiAgICAgICAgICAgICAgICBmaWxlc1ByaW9yQ2hhbmdlc1tpXSA9IGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEoZmlsZXNQcmlvckNoYW5nZXNbaV0sIGh0dHApO1xuICAgICAgICAgICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzID0gZmlsZXNQcmlvckNoYW5nZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUxvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGF3YWl0IGZpbGVzW2ldLmZpbGU/LnRleHQoKSwgYXdhaXQgZmlsZXNQcmlvckNoYW5nZXNbaV0uZmlsZT8udGV4dCgpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsQ3VzdG9tKFxuICAgICAgICB2YWx1ZTogdW5rbm93bixcbiAgICAgICAgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBtZXRhZGF0YTogQ3VzdG9tRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55LCBhbnksIGFueSwgYW55PlxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbWV0YWRhdGEuaXNFcXVhbCh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMsIG1ldGFkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIGZ1bmN0aW9uIGZvciBzb3J0aW5nIGVudGl0eSBrZXlzIGJ5IHRoZWlyIG9yZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSBhIC0gRmlyc3Qga2V5IG9mIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gYiAtIFNlY29uZCBrZXkgb2YgZW50aXR5LlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBDdXJyZW50IGVudGl0eSAodXNlZCB0byBnZXQgbWV0YWRhdGEgb2YgZW50aXR5IGtleXMpLlxuICAgICAqIEByZXR1cm5zIDAgaWYgYm90aCB2YWx1ZXMgaGF2ZSB0aGUgc2FtZSBvcmRlciwgYSBuZWdhdGl2ZSB2YWx1ZSBpZiAnYScgY29tZXMgYmVmb3JlICdiJywgYSBwb3NpdGl2ZSB2YWx1ZSBpZiAnYScgY29tZXMgYmVoaW5kICdiJy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY29tcGFyZU9yZGVyPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGE6IGtleW9mIEVudGl0eVR5cGUsXG4gICAgICAgIGI6IGtleW9mIEVudGl0eVR5cGUsXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZVxuICAgICk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhQTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGEpO1xuICAgICAgICBjb25zdCBtZXRhZGF0YUI6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBiKTtcblxuICAgICAgICBpZiAoIW1ldGFkYXRhQSB8fCAhbWV0YWRhdGFCKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRhZGF0YUEucG9zaXRpb24ub3JkZXIgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGFCLnBvc2l0aW9uLm9yZGVyID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWV0YWRhdGFCLnBvc2l0aW9uLm9yZGVyID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRhZGF0YUEucG9zaXRpb24ub3JkZXIgLSBtZXRhZGF0YUIucG9zaXRpb24ub3JkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYm9vdHN0cmFwIGNvbHVtbiBjbGFzc2VzIGZvciBcImxnXCIsIFwibWRcIiBhbmQgXCJzbVwiLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBFbnRpdHkgdG8gZ2V0IHRoZSBib290c3RyYXAgY29sdW1uIHZhbHVlcyBvZiB0aGUga2V5LlxuICAgICAqIEBwYXJhbSBrZXkgLSBLZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldCBib290c3RyYXAgY29sdW1uIHZhbHVlcyBmcm9tLlxuICAgICAqIEByZXR1cm5zIEJvb3RzdHJhcCBjb2x1bW4gY2xhc3Nlcy5cbiAgICAgKiBAdGhyb3dzIFdoZW4gbm8gbWV0YWRhdGEgZm9yIHRoZSBnaXZlbiBrZXkgd2FzIGZvdW5kLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXaWR0aENsYXNzZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUsIGtleToga2V5b2YgRW50aXR5VHlwZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgaWYgKCFtZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IG1ldGFkYXRhIGZvciBwcm9wZXJ0eSBcIiR7a2V5LnRvU3RyaW5nKCl9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYGNvbC1sZy0ke21ldGFkYXRhLmRlZmF1bHRXaWR0aHNbMF19IGNvbC1tZC0ke21ldGFkYXRhLmRlZmF1bHRXaWR0aHNbMV19IGNvbC1zbS0ke21ldGFkYXRhLmRlZmF1bHRXaWR0aHNbMl19YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgYWxsIGNoYW5nZXMgb24gYW4gZW50aXR5LlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIHJlc2V0LlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgZW50aXR5IGJlZm9yZSBhbnkgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzZXRDaGFuZ2VzT25FbnRpdHk8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUsIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZSk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHlQcmlvckNoYW5nZXMpIHtcbiAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuc2V0KGVudGl0eSwga2V5LCBSZWZsZWN0VXRpbGl0aWVzLmdldChlbnRpdHlQcmlvckNoYW5nZXMsIGtleSkpO1xuICAgICAgICAgICAgaWYgKFJlZmxlY3RVdGlsaXRpZXMuaGFzTWV0YWRhdGEodGhpcy5NRVRBREFUQV9LRVlTX1RPX1JFU0VUX0tFWSwgZW50aXR5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIChSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKHRoaXMuTUVUQURBVEFfS0VZU19UT19SRVNFVF9LRVksIGVudGl0eSwga2V5KSBhcyBzdHJpbmdbXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFJlZmxlY3RVdGlsaXRpZXMuaGFzTWV0YWRhdGEoaywgZW50aXR5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0VXRpbGl0aWVzLmRlZmluZU1ldGFkYXRhKGssIHVuZGVmaW5lZCwgZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RW50aXR5Um93czxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIHRhYjogbnVtYmVyLFxuICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogYm9vbGVhbixcbiAgICAgICAgaGlkZU9taXRGb3JFZGl0OiBib29sZWFuLFxuICAgICAgICBhZGRpdGlvbmFsT21pdFZhbHVlczogKGtleW9mIEVudGl0eVR5cGUpW10sXG4gICAgICAgIGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yXG4gICAgKTogRW50aXR5Um93PEVudGl0eVR5cGU+W10ge1xuICAgICAgICBjb25zdCByZXM6IEVudGl0eVJvdzxFbnRpdHlUeXBlPltdID0gW107XG5cbiAgICAgICAgY29uc3Qga2V5czogKGtleW9mIEVudGl0eVR5cGUpW10gPSB0aGlzLmtleXNPZihlbnRpdHksIGluamVjdG9yLCBoaWRlT21pdEZvckNyZWF0ZSwgaGlkZU9taXRGb3JFZGl0KVxuICAgICAgICAgICAgLmZpbHRlcihrID0+ICFhZGRpdGlvbmFsT21pdFZhbHVlcy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mUm93czogbnVtYmVyID0gdGhpcy5nZXROdW1iZXJPZlJvd3M8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5LCB0YWIpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDw9IG51bWJlck9mUm93czsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3c6IEVudGl0eVJvdzxFbnRpdHlUeXBlPiA9IHtcbiAgICAgICAgICAgICAgICByb3c6IGksXG4gICAgICAgICAgICAgICAga2V5czogdGhpcy5nZXRLZXlzRm9yUm93PEVudGl0eVR5cGU+KGtleXMsIGVudGl0eSwgaSwgdGFiKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcy5wdXNoKHJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nZXRLZXlzRm9yUm93PEVudGl0eVR5cGU+KGtleXMsIGVudGl0eSwgLTEsIHRhYikubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0Um93OiBFbnRpdHlSb3c8RW50aXR5VHlwZT4gPSB7XG4gICAgICAgICAgICAgICAgcm93OiBudW1iZXJPZlJvd3MgKyAxLFxuICAgICAgICAgICAgICAgIGtleXM6IHRoaXMuZ2V0S2V5c0ZvclJvdzxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIC0xLCB0YWIpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzLnB1c2gobGFzdFJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRhYnMgdGhhdCBhcmUgdXNlZCB0byBkaXNwbGF5IHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSByb3dzIGZyb20uXG4gICAgICogQHBhcmFtIGluamVjdG9yIC0gQW4gYW5ndWxhciBlbnZpcm9ubWVudCBpbmplY3Rvci5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JDcmVhdGUgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JDcmVhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JFZGl0IC0gV2hldGhlciBvciBub3Qga2V5cyB3aXRoIHRoZSBtZXRhZGF0YSBvbWl0Rm9yVXBkYXRlIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxPbWl0S2V5cyAtIEFkZGl0aW9uYWwgb21pdCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgVGhlIHNvcnRlZCBUYWJzIGNvbnRhaW5pbmcgdGhlIHJvd3MgYW5kIHRoZSBrZXlzIHRvIGRpc3BsYXkgaW4gdGhhdCByb3cuXG4gICAgICovXG4gICAgc3RhdGljIGdldEVudGl0eVRhYnM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgaGlkZU9taXRGb3JDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgaGlkZU9taXRGb3JFZGl0OiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIGFkZGl0aW9uYWxPbWl0S2V5czogKGtleW9mIEVudGl0eVR5cGUpW10gPSBbXVxuICAgICk6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdIHtcbiAgICAgICAgY29uc3QgcmVzOiBFbnRpdHlUYWI8RW50aXR5VHlwZT5bXSA9IFtdO1xuICAgICAgICBjb25zdCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IHRoaXMua2V5c09mKGVudGl0eSwgaW5qZWN0b3IsIGhpZGVPbWl0Rm9yQ3JlYXRlLCBoaWRlT21pdEZvckVkaXQpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gIWFkZGl0aW9uYWxPbWl0S2V5cy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mVGFiczogbnVtYmVyID0gdGhpcy5nZXROdW1iZXJPZlRhYnM8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5KTtcblxuICAgICAgICBjb25zdCBmaXJzdFRhYlJvd3M6IEVudGl0eVJvdzxFbnRpdHlUeXBlPltdID0gdGhpcy5nZXRFbnRpdHlSb3dzPEVudGl0eVR5cGU+KFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgLTEsXG4gICAgICAgICAgICBoaWRlT21pdEZvckNyZWF0ZSxcbiAgICAgICAgICAgIGhpZGVPbWl0Rm9yRWRpdCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxPbWl0S2V5cyxcbiAgICAgICAgICAgIGluamVjdG9yXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmaXJzdFRhYlJvd3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFRhYjogRW50aXR5VGFiPEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgIHRhYk5hbWU6IHRoaXMuZ2V0Rmlyc3RUYWJOYW1lKGVudGl0eSksXG4gICAgICAgICAgICAgICAgdGFiOiAtMSxcbiAgICAgICAgICAgICAgICByb3dzOiBmaXJzdFRhYlJvd3NcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXMucHVzaChmaXJzdFRhYik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAyOyBpIDw9IG51bWJlck9mVGFiczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3dzOiBFbnRpdHlSb3c8RW50aXR5VHlwZT5bXSA9IHRoaXMuZ2V0RW50aXR5Um93czxFbnRpdHlUeXBlPihcbiAgICAgICAgICAgICAgICBlbnRpdHksIGksIGhpZGVPbWl0Rm9yQ3JlYXRlLCBoaWRlT21pdEZvckVkaXQsIGFkZGl0aW9uYWxPbWl0S2V5cywgaW5qZWN0b3JcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWI6IEVudGl0eVRhYjxFbnRpdHlUeXBlPiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGFiTmFtZTogdGhpcy5nZXRUYWJOYW1lKGVudGl0eSwgaSksXG4gICAgICAgICAgICAgICAgICAgIHRhYjogaSxcbiAgICAgICAgICAgICAgICAgICAgcm93czogcm93c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmVzLnB1c2godGFiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0S2V5c0ZvclJvdzxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICByb3c6IG51bWJlcixcbiAgICAgICAgdGFiOiBudW1iZXJcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIHJldHVybiBrZXlzXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgayk/LnBvc2l0aW9uLnJvdyA9PT0gcm93KVxuICAgICAgICAgICAgLmZpbHRlcihrID0+IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspPy5wb3NpdGlvbi50YWIgPT09IHRhYilcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiB0aGlzLmNvbXBhcmVPcmRlcihhLCBiLCBlbnRpdHkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXROdW1iZXJPZlJvd3M8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAga2V5czogKGtleW9mIEVudGl0eVR5cGUpW10sXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgdGFiOiBudW1iZXJcbiAgICApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKT8ucG9zaXRpb24udGFiID09PSB0YWIpXG4gICAgICAgICAgICAubWFwKGsgPT4gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgayk/LnBvc2l0aW9uLnJvdykgYXMgbnVtYmVyW10pXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSA+IGIgPyAtMSA6IDEpWzBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldE51bWJlck9mVGFiczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdLCBlbnRpdHk6IEVudGl0eVR5cGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKSAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAubWFwKGsgPT4gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgayk/LnBvc2l0aW9uLnRhYikgYXMgbnVtYmVyW10pXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSA+IGIgPyAtMSA6IDEpWzBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldFRhYk5hbWU8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUsIHRhYjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZWRUYWJOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBSZWZsZWN0VXRpbGl0aWVzLm93bktleXMoZW50aXR5KVxuICAgICAgICAgICAgLm1hcChrID0+IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspKVxuICAgICAgICAgICAgLmZpbmQobSA9PiBtPy5wb3NpdGlvbi50YWIgPT09IHRhYiAmJiBtLnBvc2l0aW9uLnRhYk5hbWUpPy5wb3NpdGlvbi50YWJOYW1lO1xuICAgICAgICByZXR1cm4gcHJvdmlkZWRUYWJOYW1lID8/IGBUYWIgJHt0YWJ9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGaXJzdFRhYk5hbWU8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwcm92aWRlZFRhYk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IFJlZmxlY3RVdGlsaXRpZXMub3duS2V5cyhlbnRpdHkpXG4gICAgICAgICAgICAubWFwKGsgPT4gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykpXG4gICAgICAgICAgICAuZmluZChtID0+IG0/LnBvc2l0aW9uLnRhYk5hbWUgJiYgbS5wb3NpdGlvbi50YWIgPT09IC0xKT8ucG9zaXRpb24udGFiTmFtZTtcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVkVGFiTmFtZSA/PyAnVGFiIDEnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGtleXMgb2YgdGhlIHByb3ZpZGVkIGVudGl0eSBjb3JyZWN0bHkgdHlwZWQuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSBrZXlzIG9mLlxuICAgICAqIEBwYXJhbSBpbmplY3RvciAtIEFuIGFuZ3VsYXIgZW52aXJvbm1lbnQgaW5qZWN0b3IuXG4gICAgICogQHBhcmFtIGhpZGVPbWl0Rm9yQ3JlYXRlIC0gV2hldGhlciBvciBub3Qga2V5cyB3aXRoIHRoZSBtZXRhZGF0YSBvbWl0Rm9yQ3JlYXRlIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuXG4gICAgICogQHBhcmFtIGhpZGVPbWl0Rm9yRWRpdCAtIFdoZXRoZXIgb3Igbm90IGtleXMgd2l0aCB0aGUgbWV0YWRhdGEgb21pdEZvclVwZGF0ZSBzaG91bGQgYmUgZmlsdGVyZWQgb3V0LlxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGtleXMgb2YgdGhlIGVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMga2V5c09mPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIGhpZGVPbWl0Rm9yRWRpdDogYm9vbGVhbiA9IGZhbHNlXG4gICAgKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICBsZXQga2V5czogKGtleW9mIEVudGl0eVR5cGUpW10gPSBSZWZsZWN0VXRpbGl0aWVzLm93bktleXMoZW50aXR5KTtcbiAgICAgICAgY29uc3QgZG9udERpc3BsYXlLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IHRoaXMuZ2V0RG9udERpc3BsYXlLZXlzKGVudGl0eSwgaW5qZWN0b3IpO1xuICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoayA9PiAhZG9udERpc3BsYXlLZXlzLmluY2x1ZGVzKGspKTtcbiAgICAgICAgaWYgKGhpZGVPbWl0Rm9yQ3JlYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBvbWl0Rm9yQ3JlYXRlS2V5czogKGtleW9mIEVudGl0eVR5cGUpW10gPSB0aGlzLmdldE9taXRGb3JDcmVhdGUoZW50aXR5KTtcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFvbWl0Rm9yQ3JlYXRlS2V5cy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhpZGVPbWl0Rm9yRWRpdCkge1xuICAgICAgICAgICAgY29uc3Qgb21pdEZvclVwZGF0ZUtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gdGhpcy5nZXRPbWl0Rm9yVXBkYXRlKGVudGl0eSk7XG4gICAgICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoayA9PiAhb21pdEZvclVwZGF0ZUtleXMuaW5jbHVkZXMoaykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldERvbnREaXNwbGF5S2V5czxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yXG4gICAgKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICBjb25zdCByZXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvc3RyaWN0LWJvb2xlYW4tZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGlmIChydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+ICFtZXRhZGF0YT8uZGlzcGxheShlbnRpdHkpKSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG59XG5cbi8qKlxuICogQSByb3cgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gZGlzcGxheSBhbiBlbnRpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5Um93PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4ge1xuICAgIC8qKlxuICAgICAqIFRoZSByb3cgaW4gd2hpY2ggdGhpcyBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgICAqL1xuICAgIHJvdzogbnVtYmVyLFxuICAgIC8qKlxuICAgICAqIFRoZSBrZXlzIG9mIHRoZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoYXQgcm93LlxuICAgICAqL1xuICAgIGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdXG59XG5cbi8qKlxuICogQSB0YWIgdGhhdCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkaXNwbGF5IGFuIGVudGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlUYWI8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiB7XG4gICAgLyoqXG4gICAgICogVGhlIHRhYiBpbiB3aGljaCB0aGUgcm93cyBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgICAqL1xuICAgIHRhYjogbnVtYmVyLFxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIHRvIGRpc3BsYXkgaW5zaWRlIHRoZSB0YWIuXG4gICAgICovXG4gICAgdGFiTmFtZTogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIFRoZSByb3dzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbnNpZGUgdGhpcyB0YWIsLlxuICAgICAqL1xuICAgIHJvd3M6IEVudGl0eVJvdzxFbnRpdHlUeXBlPltdXG59Il19
596
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBdUIscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUdqRCxPQUFPLEVBQWlCLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBUXhGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQW9CdEU7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGVBQWU7SUFFakM7O09BRUc7SUFDSCxNQUFNLENBQVUsMEJBQTBCLEdBQVcscUJBQXFCLENBQUM7SUFFM0U7O09BRUc7SUFDSCxNQUFNLENBQVUsd0JBQXdCLEdBQVcsb0JBQW9CLENBQUM7SUFFeEU7O09BRUc7SUFDSCxNQUFNLENBQVUsd0JBQXdCLEdBQVcsb0JBQW9CLENBQUM7SUFFeEU7O09BRUc7SUFDSCxNQUFNLENBQVUsYUFBYSxHQUFXLFdBQVcsQ0FBQztJQUVwRDs7T0FFRztJQUNILE1BQU0sQ0FBVSxvQkFBb0IsR0FBVyxpQkFBaUIsQ0FBQztJQUVqRTs7T0FFRztJQUNILE1BQU0sQ0FBVSxRQUFRLEdBQVcsTUFBTSxDQUFDO0lBRTFDOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQWdELE1BQWtCO1FBQ3JGLE1BQU0sR0FBRyxHQUF5QixFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN2QixNQUFNLFFBQVEs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O1lBQ2xCLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEVudmlyb25tZW50SW5qZWN0b3IsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZUZpbHRlckZuIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5cbmltcG9ydCB7IERhdGVVdGlsaXRpZXMgfSBmcm9tICcuL2RhdGUudXRpbGl0aWVzJztcbmltcG9ydCB7IEZpbGVVdGlsaXRpZXMgfSBmcm9tICcuL2ZpbGUudXRpbGl0aWVzJztcbmltcG9ydCB7IEJhc2VFbnRpdHlUeXBlIH0gZnJvbSAnLi4vY2xhc3Nlcy9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlQXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvYXJyYXkvYXJyYXktZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRGVjb3JhdG9yVHlwZSwgRGVjb3JhdG9yVHlwZXMgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2Jhc2UvZGVjb3JhdG9yLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvYmFzZS9wcm9wZXJ0eS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvY3VzdG9tL2N1c3RvbS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2RhdGUvZGF0ZS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2UgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2RhdGUvZGF0ZS1kZWNvcmF0b3IuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9maWxlL2ZpbGUtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRmlsZURhdGEgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2ZpbGUvZmlsZS1kZWNvcmF0b3IuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL29iamVjdC9vYmplY3QtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgTG9kYXNoVXRpbGl0aWVzIH0gZnJvbSAnLi4vZW5jYXBzdWxhdGlvbi9sb2Rhc2gudXRpbGl0aWVzJztcbmltcG9ydCB7IFJlZmxlY3RVdGlsaXRpZXMgfSBmcm9tICcuLi9lbmNhcHN1bGF0aW9uL3JlZmxlY3QudXRpbGl0aWVzJztcblxuLyoqXG4gKiBTaG93cyBpbmZvcm1hdGlvbiBhYm91dCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBlbnRpdGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWZmZXJlbmNlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgd2hlcmUgdGhlIHR3byBlbnRpdGllcyBoYXZlIGRpZmZlcmVudCB2YWx1ZXMuXG4gICAgICovXG4gICAga2V5OiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBiZWZvcmUgYW55IGNoYW5nZXMuXG4gICAgICovXG4gICAgYmVmb3JlOiB1bmtub3duLFxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZhbHVlIGFmdGVyIGNoYW5nZXMuXG4gICAgICovXG4gICAgYWZ0ZXI6IHVua25vd25cbn1cblxuLyoqXG4gKiBDb250YWlucyBIZWxwZXJNZXRob2RzIGFyb3VuZCBoYW5kbGluZyBFbnRpdGllcyBhbmQgdGhlaXIgcHJvcGVydHktbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbnRpdHlVdGlsaXRpZXMge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgYWxsIGtleXMgb2YgbWV0YWRhdGEgdGhhdCBzaG91bGQgYmUgc2V0IHRvIHVuZGVmaW5lZCB3aGVuIHRoZSBlbnRpdHkgZ2V0cyByZXNldC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgTUVUQURBVEFfS0VZU19UT19SRVNFVF9LRVk6IHN0cmluZyA9ICdtZXRhZGF0YUtleXNUb1Jlc2V0JztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBzaW5nbGUgcHJldmlldyBpbWFnZSB2YWx1ZSBvbiBpbWFnZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBTSU5HTEVfUFJFVklFV19JTUFHRV9LRVk6IHN0cmluZyA9ICdzaW5nbGVQcmV2aWV3SW1hZ2UnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIHRoYXQgc2F2ZXMgdGhlIG11bHRpIHByZXZpZXcgaW1hZ2VzIHZhbHVlIG9uIGltYWdlIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IE1VTFRJX1BSRVZJRVdfSU1BR0VTX0tFWTogc3RyaW5nID0gJ211bHRpUHJldmlld0ltYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgZmlsZW5hbWVzIHZhbHVlIG9uIGZpbGUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgRklMRU5BTUVTX0tFWTogc3RyaW5nID0gJ2ZpbGVOYW1lcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgY29uZmlybSBwYXNzd29yZCB2YWx1ZSBvbiBwYXNzd29yZCBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBDT05GSVJNX1BBU1NXT1JEX0tFWTogc3RyaW5nID0gJ2NvbmZpcm1QYXNzd29yZCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgdGltZSB2YWx1ZSBvbiBkYXRlIHRpbWUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgVElNRV9LRVk6IHN0cmluZyA9ICd0aW1lJztcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnRpZXMgdG8gb21pdCB3aGVuIHVwZGF0aW5nIHRoZSBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgdXBkYXRpbmcgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyB3aGljaCBzaG91bGQgYmUgbGVmdCBvdXQgZm9yIHVwZGF0aW5nIGFuIEVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T21pdEZvclVwZGF0ZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICghbWV0YWRhdGEgfHwgbWV0YWRhdGEub21pdEZvclVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIHRvIG9taXQgd2hlbiBjcmVhdGluZyBuZXcgZW50aXRpZXMuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgY3JlYXRpbmcgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyB3aGljaCBzaG91bGQgYmUgbGVmdCBvdXQgZm9yIGNyZWF0aW5nIGEgbmV3IEVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T21pdEZvckNyZWF0ZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICghbWV0YWRhdGEgfHwgbWV0YWRhdGEub21pdEZvckNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBlbnRpdHkgd2l0aG91dCB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIG9taXR0ZWQgZm9yIGNyZWF0aW9uLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggYWxsIGl0cyB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgVGhlIHJlZHVjZWQgZW50aXR5IG9iamVjdC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0V2l0aG91dE9taXRDcmVhdGVWYWx1ZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUpOiBQYXJ0aWFsPEVudGl0eVR5cGU+IHtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5vbWl0KGVudGl0eSwgdGhpcy5nZXRPbWl0Rm9yQ3JlYXRlKGVudGl0eSkpIGFzIFBhcnRpYWw8RW50aXR5VHlwZT47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gZW50aXR5IHdpdGhvdXQgdGhlIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBvbWl0dGVkIGZvciB1cGRhdGluZy5cbiAgICAgKiBUaGlzIGFsc28gaGFuZGxlcyBvbWl0dGluZyBrZXlzIGZvciBAb2JqZWN0IG9yIEBhcnJheSB2YWx1ZXMgYW5kIHJlbW92ZXMgdmFsdWVzIHRoYXQgaGF2ZW4ndCBiZWVuIGNoYW5nZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB3aXRoIGFsbCBpdHMgdmFsdWVzLlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgZW50aXR5IGJlZm9yZSBhbnkgY2hhbmdlcyB3ZXJlIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIGh0dHAgLSBUaGUgYW5ndWxhciBIdHRwQ2xpZW50LiBVc2VkIHRvIGZldGNoIGZpbGVzLlxuICAgICAqIEBwYXJhbSBpbmplY3RvciAtIEFuIGFuZ3VsYXIgZW52aXJvbm1lbnQgaW5qZWN0b3IuXG4gICAgICogQHJldHVybnMgVGhlIHJlZHVjZWQgZW50aXR5IG9iamVjdC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZ2V0V2l0aG91dE9taXRVcGRhdGVWYWx1ZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGUsXG4gICAgICAgIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgIGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yXG4gICAgKTogUHJvbWlzZTxQYXJ0aWFsPEVudGl0eVR5cGU+PiB7XG4gICAgICAgIGNvbnN0IHJlczogUGFydGlhbDxFbnRpdHlUeXBlPiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmtleXNPZihlbnRpdHksIGluamVjdG9yLCBmYWxzZSwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmlzRXF1YWwoZW50aXR5W2tleV0sIGVudGl0eVByaW9yQ2hhbmdlc1trZXldLCBtZXRhZGF0YSwgdHlwZSwgaHR0cCkpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5PQkpFQ1Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNba2V5XSBhcyBvYmplY3QpID0gTG9kYXNoVXRpbGl0aWVzLm9taXQoZW50aXR5W2tleV0gYXMgYW55LCB0aGlzLmdldE9taXRGb3JDcmVhdGUoZW50aXR5W2tleV0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZOlxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc1trZXldIGFzIG9iamVjdFtdKSA9IChlbnRpdHlba2V5XSBhcyBvYmplY3RbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHZhbHVlID0+IExvZGFzaFV0aWxpdGllcy5vbWl0KHZhbHVlLCB0aGlzLmdldE9taXRGb3JDcmVhdGUodmFsdWUpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1trZXldID0gZW50aXR5W2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGFsbCBkZWZhdWx0IHZhbHVlcyBvbiB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgb24uXG4gICAgICovXG4gICAgc3RhdGljIHNldERlZmF1bHRWYWx1ZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGE/LmRlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby11bnNhZmUtYXNzaWdubWVudCwgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICBlbnRpdHlba2V5XSA9IG1ldGFkYXRhLmRlZmF1bHQoKSBhcyBhbnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBwcm9wZXJ0aWVzIG9uIHRoZSBnaXZlbiBlbnRpdHkgd2hpY2ggYXJlIGZpbGVzLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGNoZWNrIGZvciBmaWxlIHByb3BlcnRpZXMuXG4gICAgICogQHBhcmFtIG9taXQgLSBXaGV0aGVyIHRvIGxlYXZlIG91dCB2YWx1ZXMgdGhhdCBhcmUgb21pdHRlZCBmb3IgY3JlYXRlIG9yIGRlbGV0ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUga2V5cyBvZiBhbGwgZmlsZSBwcm9wZXJ0aWVzIG9uIHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldEZpbGVQcm9wZXJ0aWVzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgb21pdD86ICdjcmVhdGUnIHwgJ3VwZGF0ZSdcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGNvbnN0IHJlczogKGtleW9mIEVudGl0eVR5cGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlUeXBlKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQgfHwgdHlwZSA9PT0gRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdHlsaXN0aWMvbWF4LWxlblxuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+ID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KSBhcyBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+O1xuICAgICAgICAgICAgICAgIGlmICghKG1ldGFkYXRhLm9taXRGb3JDcmVhdGUgJiYgb21pdCA9PT0gJ2NyZWF0ZScpICYmICEobWV0YWRhdGEub21pdEZvclVwZGF0ZSAmJiBvbWl0ID09PSAndXBkYXRlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBpbmNsdWRlZCBpbiBhbiBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB3aXRoIHRoZSBwcm9wZXJ0eSB0byBnZXQgdGhlIG1ldGFkYXRhIGZyb20uXG4gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBFbnRpdHkgdG8gZ2V0IHRoZSBtZXRhZGF0YSBmcm9tLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gRm9yIHNlY3VyZSBUeXBpbmcsIGRlZmluZXMgdGhlIHJldHVybmVkIFByb3BlcnR5Q29uZmlnLlxuICAgICAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHRocm93cyBXaGVuIG5vIG1ldGFkYXRhIGNhbiBiZSBmb3VuZCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQcm9wZXJ0eU1ldGFkYXRhPFxuICAgICAgICBFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4sXG4gICAgICAgIFQgZXh0ZW5kcyBEZWNvcmF0b3JUeXBlcyxcbiAgICAgICAgQ3VzdG9tTWV0YWRhdGFUeXBlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICA+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIHByb3BlcnR5S2V5OiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW51c2VkSW1wb3J0cy9uby11bnVzZWQtdmFyc1xuICAgICAgICB0eXBlPzogVFxuICAgICk6IERlY29yYXRvclR5cGU8VCwgQ3VzdG9tTWV0YWRhdGFUeXBlPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiB1bmtub3duID0gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YSgnbWV0YWRhdGEnLCBlbnRpdHksIHByb3BlcnR5S2V5KTtcbiAgICAgICAgLy8gaWYgKG1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgbWV0YWRhdGEgZm9yIHByb3BlcnR5ICR7U3RyaW5nKHByb3BlcnR5S2V5KX0gb24gdGhlIGVudGl0eSAke0pTT04uc3RyaW5naWZ5KGVudGl0eSl9YCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhIGFzIERlY29yYXRvclR5cGU8VCwgQ3VzdG9tTWV0YWRhdGFUeXBlPiB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS1tZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB3aXRoIHRoZSBwcm9wZXJ0eSB0byBnZXQgdGhlIHR5cGUgZnJvbS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkgb24gdGhlIGdpdmVuIEVudGl0eSB0byBnZXQgdGhlIHR5cGUgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEuXG4gICAgICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIG5vIG1ldGFkYXRhIGNhbiBiZSBmb3VuZCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQcm9wZXJ0eVR5cGU8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLCBwcm9wZXJ0eUtleToga2V5b2YgRW50aXR5VHlwZVxuICAgICk6IERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEoJ3R5cGUnLCBlbnRpdHksIHByb3BlcnR5S2V5KSBhcyBEZWNvcmF0b3JUeXBlcyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGFsbCBwcm9wZXJ0eSB2YWx1ZXMgYmFzZWQgb24gYSBnaXZlbiBlbnRpdHkgZGF0YS1vYmplY3QuXG4gICAgICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUgY29uc3RydWN0ZWQgKGlmIGNhbGxlZCBpbnNpZGUgYW4gRW50aXR5IGNvbnN0cnVjdG9yIGl0cyB1c3VhbGx5IHRoaXMpLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZGF0YSBvYmplY3QgdG8gZ2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZXMgZnJvbS5cbiAgICAgKiBAYWxpYXMgbmV3XG4gICAgICogQGFsaWFzIGJ1aWxkXG4gICAgICogQGFsaWFzIGNvbnN0cnVjdFxuICAgICAqL1xuICAgIHN0YXRpYyBuZXc8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+Pih0YXJnZXQ6IEVudGl0eVR5cGUsIGVudGl0eT86IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlUeXBlKHRhcmdldCwga2V5KTtcbiAgICAgICAgICAgIGxldCB2YWx1ZTogdW5rbm93biA9IGVudGl0eSA/IFJlZmxlY3RVdGlsaXRpZXMuZ2V0KGVudGl0eSwga2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuT0JKRUNUOlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0TWV0YWRhdGE6IERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKHRhcmdldCwga2V5LCBEZWNvcmF0b3JUeXBlcy5PQkpFQ1QpIGFzIERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnk+O1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBvYmplY3RNZXRhZGF0YS5FbnRpdHlDbGFzcyh2YWx1ZSBhcyBvYmplY3QgfCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dEFycmF5OiBFbnRpdHlUeXBlW10gfCB1bmRlZmluZWQgPSB2YWx1ZSBhcyBFbnRpdHlUeXBlW10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc0FycmF5OiBFbnRpdHlUeXBlW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXlNZXRhZGF0YTogRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEodGFyZ2V0LCBrZXksIERlY29yYXRvclR5cGVzLkFSUkFZKSBhcyBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsPGFueT47XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXRBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1XaXRoTWV0YWRhdGE6IEVudGl0eVR5cGUgPSBuZXcgYXJyYXlNZXRhZGF0YS5FbnRpdHlDbGFzcyhpdGVtKSBhcyBFbnRpdHlUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0FycmF5LnB1c2goaXRlbVdpdGhNZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXNBcnJheTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWZsZWN0VXRpbGl0aWVzLnNldCh0YXJnZXQsIGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L21lbWJlci1vcmRlcmluZywganNkb2MvcmVxdWlyZS1qc2RvYywgdHlwZXNjcmlwdC90eXBlZGVmXG4gICAgc3RhdGljIGNvbnN0cnVjdCA9IHRoaXMubmV3O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L21lbWJlci1vcmRlcmluZywganNkb2MvcmVxdWlyZS1qc2RvYywgdHlwZXNjcmlwdC90eXBlZGVmXG4gICAgc3RhdGljIGJ1aWxkID0gdGhpcy5uZXc7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gZW50aXR5IGlzIFwiZGlydHlcIiAoaWYgaXRzIHZhbHVlcyBoYXZlIGNoYW5nZWQpLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IGFmdGVyIGFsbCBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgZW50aXR5IGJlZm9yZSB0aGUgY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0gaHR0cCAtIFRoZSBhbmd1bGFyIEh0dHBDbGllbnQuIFVzZWQgdG8gZmV0Y2ggZmlsZXMuXG4gICAgICogQHBhcmFtIGluamVjdG9yIC0gQW4gYW5ndWxhciBlbnZpcm9ubWVudCBpbmplY3Rvci5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZW50aXR5IGlzIGRpcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0RpcnR5PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlLFxuICAgICAgICBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICBpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvclxuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoIShlbnRpdHlQcmlvckNoYW5nZXMgYXMgRW50aXR5VHlwZSB8IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaWZmZXJlbmNlczogRGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdID0gYXdhaXQgdGhpcy5nZXREaWZmZXJlbmNlc0JldHdlZW5FbnRpdGllcyhlbnRpdHksIGVudGl0eVByaW9yQ2hhbmdlcywgaHR0cCwgaW5qZWN0b3IpO1xuICAgICAgICByZXR1cm4gISFkaWZmZXJlbmNlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIGVudGl0aWVzLiBPbmx5IGNoZWNrcyBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBkZWNvcmF0ZWQuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgYXMgaXMuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBlbnRpdHkgYmVmb3JlIGFueSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLlxuICAgICAqIEBwYXJhbSBodHRwIC0gVGhlIGFuZ3VsYXIgaHR0cCBjbGllbnQsIGlzIG5lZWRlZCB0byBjaGVjayBpZiBmaWxlcyBhcmUgZXF1YWwuXG4gICAgICogQHBhcmFtIGluamVjdG9yIC0gQW4gYW5ndWxhciBlbnZpcm9ubWVudCBpbmplY3Rvci5cbiAgICAgKiBAcmV0dXJucyBUaGUgZGlmZmVyZW5jZXMgYXMgYW4gYXJyYXkgY29uc2lzdGluZyBvZiBrZXksIGJlZm9yZSBhbmQgYWZ0ZXIuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGdldERpZmZlcmVuY2VzQmV0d2VlbkVudGl0aWVzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlLFxuICAgICAgICBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICBpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvclxuICAgICk6IFByb21pc2U8RGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdPiB7XG4gICAgICAgIGNvbnN0IHJlczogRGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdID0gW107XG4gICAgICAgIC8vIHZhbHVlcyB0aGF0IGFyZSBub3QgZGVjb3JhdGVkIGNhbiBiZSBpZ25vcmVkLCBhcyB0aGV5IGFyZSBub3QgdHJhbnNmZXJyZWQgdmlhIGh0dHAuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMua2V5c09mKGVudGl0eSwgaW5qZWN0b3IpKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlUeXBlKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICghYXdhaXQgdGhpcy5pc0VxdWFsKGVudGl0eVtrZXldLCBlbnRpdHlQcmlvckNoYW5nZXNba2V5XSwgbWV0YWRhdGEsIHR5cGUsIGh0dHApKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlOiBlbnRpdHlQcmlvckNoYW5nZXNba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6IGVudGl0eVtrZXldXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBzZXQgYmxvYiBmaWxlIGRhdGEgc28gdGhhdCBpdCBpcyBvbmx5IHJlcXVlc3RlZCBvbmNlLlxuICAgICAgICAgICAgICAgIGVudGl0eVByaW9yQ2hhbmdlc1trZXldID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcChlbnRpdHlba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdHdvIGdpdmVuIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICogSXQgdXNlcyB0aGUgaXNFcXVhbCBtZXRob2QgZnJvbSBMb2Rhc2hVdGlsaXRpZXMgYW5kIGV4dGVuZHMgaXQgd2l0aCBmdW5jdGlvbmFsaXR5IHJlZ2FyZGluZyBEYXRlcy5cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gdmFsdWVQcmlvckNoYW5nZXMgLSBUaGUgdmFsdWUgYmVmb3JlIGFueSBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSAtIFRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIGh0dHAgLSBUaGUgYW5ndWxhciBIdHRwQ2xpZW50LiBVc2VkIHRvIGZldGNoIGZpbGVzLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0VxdWFsKFxuICAgICAgICB2YWx1ZTogdW5rbm93bixcbiAgICAgICAgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sXG4gICAgICAgIG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgICB0eXBlOiBEZWNvcmF0b3JUeXBlcyB8IHVuZGVmaW5lZCxcbiAgICAgICAgaHR0cDogSHR0cENsaWVudFxuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoKHZhbHVlID09IHVuZGVmaW5lZCAmJiB2YWx1ZVByaW9yQ2hhbmdlcyA9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB8fCB0aGlzLmRpZmZlcmVuY2VJc1VuZGVmaW5lZEFuZEVtcHR5QXJyYXkodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKVxuICAgICAgICAgICAgfHwgdGhpcy5kaWZmZXJlbmNlSXNVbmRlZmluZWRBbmRFbXB0eVN0cmluZyh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEVfUkFOR0U6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNFcXVhbERhdGVSYW5nZShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICAobWV0YWRhdGEgYXMgRGF0ZVJhbmdlRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsKS5maWx0ZXJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxEYXRlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEVfVElNRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsRGF0ZVRpbWUodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURTpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9USU1FOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxBcnJheURhdGUodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9SQU5HRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsQXJyYXlEYXRlUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhIGFzIERhdGVSYW5nZUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpLmZpbHRlclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19DSElQUzpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0FVVE9DT01QTEVURV9DSElQUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsQXJyYXlTdHJpbmcodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRTpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuRklMRV9ERUZBVUxUOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxGaWxlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcywgKG1ldGFkYXRhIGFzIERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpLm11bHRpcGxlLCBodHRwKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQ1VTVE9NOlxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxDdXN0b20odmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzLCBtZXRhZGF0YSBhcyBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnksIGFueSwgYW55LCBhbnk+KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBkaWZmZXJlbmNlSXNVbmRlZmluZWRBbmRFbXB0eVN0cmluZyh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZVByaW9yQ2hhbmdlcyA9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhdmFsdWUubGVuZ3RoKVxuICAgICAgICAgICAgfHwgKHZhbHVlID09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWVQcmlvckNoYW5nZXMgPT09ICdzdHJpbmcnICYmICF2YWx1ZVByaW9yQ2hhbmdlcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGRpZmZlcmVuY2VJc1VuZGVmaW5lZEFuZEVtcHR5QXJyYXkodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodmFsdWVQcmlvckNoYW5nZXMgPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpXG4gICAgICAgICAgICB8fCAodmFsdWUgPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkodmFsdWVQcmlvckNoYW5nZXMpICYmICF2YWx1ZVByaW9yQ2hhbmdlcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxBcnJheVN0cmluZyh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHwgUHJvbWlzZUxpa2U8Ym9vbGVhbj4ge1xuICAgICAgICBsZXQgc3RyaW5nQXJyYXk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChzdHJpbmdBcnJheSkge1xuICAgICAgICAgICAgc3RyaW5nQXJyYXkgPSBzdHJpbmdBcnJheS5zb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0cmluZ0FycmF5UHJpb3JDaGFuZ2VzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWVQcmlvckNoYW5nZXMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoc3RyaW5nQXJyYXlQcmlvckNoYW5nZXMpIHtcbiAgICAgICAgICAgIHN0cmluZ0FycmF5UHJpb3JDaGFuZ2VzID0gc3RyaW5nQXJyYXlQcmlvckNoYW5nZXMuc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChzdHJpbmdBcnJheSwgc3RyaW5nQXJyYXlQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxBcnJheURhdGUodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBuZXdWYWx1ZTogRGF0ZVtdIHwgdW5kZWZpbmVkID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZSBhcyBEYXRlW10gfCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUubWFwKHYgPT4gbmV3IERhdGUodikpLnNvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3VmFsdWVQcmlvckNoYW5nZXM6IERhdGVbXSB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWVQcmlvckNoYW5nZXMgYXMgRGF0ZVtdIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKG5ld1ZhbHVlUHJpb3JDaGFuZ2VzKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZVByaW9yQ2hhbmdlcyA9IG5ld1ZhbHVlUHJpb3JDaGFuZ2VzLm1hcCh2ID0+IG5ldyBEYXRlKHYpKS5zb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKG5ld1ZhbHVlLCBuZXdWYWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbEFycmF5RGF0ZVJhbmdlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93biwgZmlsdGVyPzogRGF0ZUZpbHRlckZuPERhdGU+KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBkYXRlUmFuZ2VzOiBEYXRlUmFuZ2VbXSB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWUgYXMgRGF0ZVJhbmdlW10gfCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlcykge1xuICAgICAgICAgICAgZGF0ZVJhbmdlcyA9IGRhdGVSYW5nZXMuc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkYXRlUmFuZ2VzUHJpb3JDaGFuZ2VzOiBEYXRlUmFuZ2VbXSB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWVQcmlvckNoYW5nZXMgYXMgRGF0ZVJhbmdlW10gfCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlcykge1xuICAgICAgICAgICAgZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlcyA9IGRhdGVSYW5nZXNQcmlvckNoYW5nZXMuc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlUmFuZ2VzPy5sZW5ndGggIT09IGRhdGVSYW5nZXNQcmlvckNoYW5nZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlUmFuZ2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkYXRlUmFuZ2VzPy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0VxdWFsRGF0ZVJhbmdlKGRhdGVSYW5nZXM/LltpXSwgZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlcz8uW2ldLCBmaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbERhdGVUaW1lKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVQcmlvckNoYW5nZXM6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGRhdGUsIGRhdGVQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxEYXRlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVQcmlvckNoYW5nZXM6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlKTtcbiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgZGF0ZVByaW9yQ2hhbmdlcy5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGRhdGUsIGRhdGVQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxEYXRlUmFuZ2UodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLCBmaWx0ZXI/OiBEYXRlRmlsdGVyRm48RGF0ZT4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlOiBQYXJ0aWFsPERhdGVSYW5nZT4gfCB1bmRlZmluZWQgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlKSBhcyBQYXJ0aWFsPERhdGVSYW5nZT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChkYXRlUmFuZ2U/LnN0YXJ0KSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2Uuc3RhcnQgPSBuZXcgRGF0ZShkYXRlUmFuZ2Uuc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlUmFuZ2U/LmVuZCkge1xuICAgICAgICAgICAgZGF0ZVJhbmdlLmVuZCA9IG5ldyBEYXRlKGRhdGVSYW5nZS5lbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlUmFuZ2U/LnN0YXJ0ICYmIGRhdGVSYW5nZS5lbmQpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZS52YWx1ZXMgPSBEYXRlVXRpbGl0aWVzLmdldERhdGVzQmV0d2VlbihcbiAgICAgICAgICAgICAgICBkYXRlUmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgICAgICAgZGF0ZVJhbmdlLmVuZCxcbiAgICAgICAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZVByaW9yQ2hhbmdlczogUGFydGlhbDxEYXRlUmFuZ2U+IHwgdW5kZWZpbmVkID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZVByaW9yQ2hhbmdlcykgYXMgUGFydGlhbDxEYXRlUmFuZ2U+IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzPy5zdGFydCkge1xuICAgICAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnN0YXJ0ID0gbmV3IERhdGUoZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzPy5lbmQpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5lbmQgPSBuZXcgRGF0ZShkYXRlUmFuZ2VQcmlvckNoYW5nZXMuZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzPy5zdGFydCAmJiBkYXRlUmFuZ2VQcmlvckNoYW5nZXMuZW5kKSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2VQcmlvckNoYW5nZXMudmFsdWVzID0gRGF0ZVV0aWxpdGllcy5nZXREYXRlc0JldHdlZW4oXG4gICAgICAgICAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnN0YXJ0LFxuICAgICAgICAgICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5lbmQsXG4gICAgICAgICAgICAgICAgZmlsdGVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChkYXRlUmFuZ2UsIGRhdGVSYW5nZVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogRmluZCBhIHdheSB0byB1c2UgYmxvYnMgd2l0aCBqZXN0XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXIvY29nbml0aXZlLWNvbXBsZXhpdHlcbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBpc0VxdWFsRmlsZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sIG11bHRpcGxlOiBib29sZWFuLCBodHRwOiBIdHRwQ2xpZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVByaW9yQ2hhbmdlcyA9PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlUHJpb3JDaGFuZ2VzID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbGVzOiBGaWxlRGF0YVtdID0gbXVsdGlwbGUgPyAodmFsdWUgYXMgRmlsZURhdGFbXSkuc29ydCgpIDogW3ZhbHVlIGFzIEZpbGVEYXRhXS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IGZpbGVzUHJpb3JDaGFuZ2VzOiBGaWxlRGF0YVtdID0gbXVsdGlwbGUgPyAodmFsdWVQcmlvckNoYW5nZXMgYXMgRmlsZURhdGFbXSkuc29ydCgpIDogW3ZhbHVlUHJpb3JDaGFuZ2VzIGFzIEZpbGVEYXRhXS5zb3J0KCk7XG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggIT09IGZpbGVzUHJpb3JDaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gY2hlY2tzIHRoaXMgYmVmb3JlIGFjdHVhbGx5IGdldHRpbmcgYW55IGZpbGVzIGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zLlxuICAgICAgICAgICAgaWYgKCFMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChMb2Rhc2hVdGlsaXRpZXMub21pdChmaWxlc1tpXSwgJ2ZpbGUnKSwgTG9kYXNoVXRpbGl0aWVzLm9taXQoZmlsZXNQcmlvckNoYW5nZXNbaV0sICdmaWxlJykpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGVzUHJpb3JDaGFuZ2VzW2ldLmZpbGUgJiYgIWZpbGVzW2ldLmZpbGUpIHtcbiAgICAgICAgICAgICAgICBmaWxlc1tpXSA9IGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEoZmlsZXNbaV0sIGh0dHApO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZmlsZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZXNbaV0uZmlsZSAmJiAhZmlsZXNQcmlvckNoYW5nZXNbaV0uZmlsZSkge1xuICAgICAgICAgICAgICAgIGZpbGVzUHJpb3JDaGFuZ2VzW2ldID0gYXdhaXQgRmlsZVV0aWxpdGllcy5nZXRGaWxlRGF0YShmaWxlc1ByaW9yQ2hhbmdlc1tpXSwgaHR0cCk7XG4gICAgICAgICAgICAgICAgdmFsdWVQcmlvckNoYW5nZXMgPSBmaWxlc1ByaW9yQ2hhbmdlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoYXdhaXQgZmlsZXNbaV0uZmlsZT8udGV4dCgpLCBhd2FpdCBmaWxlc1ByaW9yQ2hhbmdlc1tpXS5maWxlPy50ZXh0KCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxDdXN0b20oXG4gICAgICAgIHZhbHVlOiB1bmtub3duLFxuICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bixcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIG1ldGFkYXRhOiBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnksIGFueSwgYW55LCBhbnk+XG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtZXRhZGF0YS5pc0VxdWFsKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcywgbWV0YWRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmUgZnVuY3Rpb24gZm9yIHNvcnRpbmcgZW50aXR5IGtleXMgYnkgdGhlaXIgb3JkZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIGEgLSBGaXJzdCBrZXkgb2YgZW50aXR5LlxuICAgICAqIEBwYXJhbSBiIC0gU2Vjb25kIGtleSBvZiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEN1cnJlbnQgZW50aXR5ICh1c2VkIHRvIGdldCBtZXRhZGF0YSBvZiBlbnRpdHkga2V5cykuXG4gICAgICogQHJldHVybnMgMCBpZiBib3RoIHZhbHVlcyBoYXZlIHRoZSBzYW1lIG9yZGVyLCBhIG5lZ2F0aXZlIHZhbHVlIGlmICdhJyBjb21lcyBiZWZvcmUgJ2InLCBhIHBvc2l0aXZlIHZhbHVlIGlmICdhJyBjb21lcyBiZWhpbmQgJ2InLlxuICAgICAqL1xuICAgIHN0YXRpYyBjb21wYXJlT3JkZXI8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgYToga2V5b2YgRW50aXR5VHlwZSxcbiAgICAgICAgYjoga2V5b2YgRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlXG4gICAgKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFBOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgYSk7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhQjogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGIpO1xuXG4gICAgICAgIGlmICghbWV0YWRhdGFBIHx8ICFtZXRhZGF0YUIpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGFkYXRhQS5wb3NpdGlvbi5vcmRlciA9PT0gLTEpIHtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YUIucG9zaXRpb24ub3JkZXIgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXRhZGF0YUIucG9zaXRpb24ub3JkZXIgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhQS5wb3NpdGlvbi5vcmRlciAtIG1ldGFkYXRhQi5wb3NpdGlvbi5vcmRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBib290c3RyYXAgY29sdW1uIGNsYXNzZXMgZm9yIFwibGdcIiwgXCJtZFwiIGFuZCBcInNtXCIuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEVudGl0eSB0byBnZXQgdGhlIGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIG9mIHRoZSBrZXkuXG4gICAgICogQHBhcmFtIGtleSAtIEtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0IGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIGZyb20uXG4gICAgICogQHJldHVybnMgQm9vdHN0cmFwIGNvbHVtbiBjbGFzc2VzLlxuICAgICAqIEB0aHJvd3MgV2hlbiBubyBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGtleSB3YXMgZm91bmQuXG4gICAgICovXG4gICAgc3RhdGljIGdldFdpZHRoQ2xhc3NlczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwga2V5OiBrZXlvZiBFbnRpdHlUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICBpZiAoIW1ldGFkYXRhKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgbWV0YWRhdGEgZm9yIHByb3BlcnR5IFwiJHtrZXkudG9TdHJpbmcoKX1cImApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgY29sLWxnLSR7bWV0YWRhdGEuZGVmYXVsdFdpZHRoc1swXX0gY29sLW1kLSR7bWV0YWRhdGEuZGVmYXVsdFdpZHRoc1sxXX0gY29sLXNtLSR7bWV0YWRhdGEuZGVmYXVsdFdpZHRoc1syXX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyBhbGwgY2hhbmdlcyBvbiBhbiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gcmVzZXQuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBlbnRpdHkgYmVmb3JlIGFueSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZXNldENoYW5nZXNPbkVudGl0eTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eVByaW9yQ2hhbmdlcykge1xuICAgICAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5zZXQoZW50aXR5LCBrZXksIFJlZmxlY3RVdGlsaXRpZXMuZ2V0KGVudGl0eVByaW9yQ2hhbmdlcywga2V5KSk7XG4gICAgICAgICAgICBpZiAoUmVmbGVjdFV0aWxpdGllcy5oYXNNZXRhZGF0YSh0aGlzLk1FVEFEQVRBX0tFWVNfVE9fUkVTRVRfS0VZLCBlbnRpdHksIGtleSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgKFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEodGhpcy5NRVRBREFUQV9LRVlTX1RPX1JFU0VUX0tFWSwgZW50aXR5LCBrZXkpIGFzIHN0cmluZ1tdKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUmVmbGVjdFV0aWxpdGllcy5oYXNNZXRhZGF0YShrLCBlbnRpdHksIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuZGVmaW5lTWV0YWRhdGEoaywgdW5kZWZpbmVkLCBlbnRpdHksIGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRFbnRpdHlSb3dzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgdGFiOiBudW1iZXIsXG4gICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlOiBib29sZWFuLFxuICAgICAgICBoaWRlT21pdEZvckVkaXQ6IGJvb2xlYW4sXG4gICAgICAgIGFkZGl0aW9uYWxPbWl0VmFsdWVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSxcbiAgICAgICAgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3JcbiAgICApOiBFbnRpdHlSb3c8RW50aXR5VHlwZT5bXSB7XG4gICAgICAgIGNvbnN0IHJlczogRW50aXR5Um93PEVudGl0eVR5cGU+W10gPSBbXTtcblxuICAgICAgICBjb25zdCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IHRoaXMua2V5c09mKGVudGl0eSwgaW5qZWN0b3IsIGhpZGVPbWl0Rm9yQ3JlYXRlLCBoaWRlT21pdEZvckVkaXQpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gIWFkZGl0aW9uYWxPbWl0VmFsdWVzLmluY2x1ZGVzKGspKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZSb3dzOiBudW1iZXIgPSB0aGlzLmdldE51bWJlck9mUm93czxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIHRhYik7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gbnVtYmVyT2ZSb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdzogRW50aXR5Um93PEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgIHJvdzogaSxcbiAgICAgICAgICAgICAgICBrZXlzOiB0aGlzLmdldEtleXNGb3JSb3c8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5LCBpLCB0YWIpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzLnB1c2gocm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdldEtleXNGb3JSb3c8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5LCAtMSwgdGFiKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RSb3c6IEVudGl0eVJvdzxFbnRpdHlUeXBlPiA9IHtcbiAgICAgICAgICAgICAgICByb3c6IG51bWJlck9mUm93cyArIDEsXG4gICAgICAgICAgICAgICAga2V5czogdGhpcy5nZXRLZXlzRm9yUm93PEVudGl0eVR5cGU+KGtleXMsIGVudGl0eSwgLTEsIHRhYilcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXMucHVzaChsYXN0Um93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdGFicyB0aGF0IGFyZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIHJvd3MgZnJvbS5cbiAgICAgKiBAcGFyYW0gaW5qZWN0b3IgLSBBbiBhbmd1bGFyIGVudmlyb25tZW50IGluamVjdG9yLlxuICAgICAqIEBwYXJhbSBoaWRlT21pdEZvckNyZWF0ZSAtIFdoZXRoZXIgb3Igbm90IGtleXMgd2l0aCB0aGUgbWV0YWRhdGEgb21pdEZvckNyZWF0ZSBzaG91bGQgYmUgZmlsdGVyZWQgb3V0LlxuICAgICAqIEBwYXJhbSBoaWRlT21pdEZvckVkaXQgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JVcGRhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gYWRkaXRpb25hbE9taXRLZXlzIC0gQWRkaXRpb25hbCBvbWl0IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgc29ydGVkIFRhYnMgY29udGFpbmluZyB0aGUgcm93cyBhbmQgdGhlIGtleXMgdG8gZGlzcGxheSBpbiB0aGF0IHJvdy5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RW50aXR5VGFiczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgICAgICBoaWRlT21pdEZvckVkaXQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgYWRkaXRpb25hbE9taXRLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdXG4gICAgKTogRW50aXR5VGFiPEVudGl0eVR5cGU+W10ge1xuICAgICAgICBjb25zdCByZXM6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdID0gW107XG4gICAgICAgIGNvbnN0IGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gdGhpcy5rZXlzT2YoZW50aXR5LCBpbmplY3RvciwgaGlkZU9taXRGb3JDcmVhdGUsIGhpZGVPbWl0Rm9yRWRpdClcbiAgICAgICAgICAgIC5maWx0ZXIoayA9PiAhYWRkaXRpb25hbE9taXRLZXlzLmluY2x1ZGVzKGspKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZUYWJzOiBudW1iZXIgPSB0aGlzLmdldE51bWJlck9mVGFiczxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHkpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0VGFiUm93czogRW50aXR5Um93PEVudGl0eVR5cGU+W10gPSB0aGlzLmdldEVudGl0eVJvd3M8RW50aXR5VHlwZT4oXG4gICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlLFxuICAgICAgICAgICAgaGlkZU9taXRGb3JFZGl0LFxuICAgICAgICAgICAgYWRkaXRpb25hbE9taXRLZXlzLFxuICAgICAgICAgICAgaW5qZWN0b3JcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZpcnN0VGFiUm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0VGFiOiBFbnRpdHlUYWI8RW50aXR5VHlwZT4gPSB7XG4gICAgICAgICAgICAgICAgdGFiTmFtZTogdGhpcy5nZXRGaXJzdFRhYk5hbWUoZW50aXR5KSxcbiAgICAgICAgICAgICAgICB0YWI6IC0xLFxuICAgICAgICAgICAgICAgIHJvd3M6IGZpcnN0VGFiUm93c1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcy5wdXNoKGZpcnN0VGFiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDI7IGkgPD0gbnVtYmVyT2ZUYWJzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd3M6IEVudGl0eVJvdzxFbnRpdHlUeXBlPltdID0gdGhpcy5nZXRFbnRpdHlSb3dzPEVudGl0eVR5cGU+KFxuICAgICAgICAgICAgICAgIGVudGl0eSwgaSwgaGlkZU9taXRGb3JDcmVhdGUsIGhpZGVPbWl0Rm9yRWRpdCwgYWRkaXRpb25hbE9taXRLZXlzLCBpbmplY3RvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChyb3dzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYjogRW50aXR5VGFiPEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgICAgICB0YWJOYW1lOiB0aGlzLmdldFRhYk5hbWUoZW50aXR5LCBpKSxcbiAgICAgICAgICAgICAgICAgICAgdGFiOiBpLFxuICAgICAgICAgICAgICAgICAgICByb3dzOiByb3dzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh0YWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRLZXlzRm9yUm93PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdLFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIHJvdzogbnVtYmVyLFxuICAgICAgICB0YWI6IG51bWJlclxuICAgICk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgcmV0dXJuIGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKT8ucG9zaXRpb24ucm93ID09PSByb3cpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgayk/LnBvc2l0aW9uLnRhYiA9PT0gdGFiKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHRoaXMuY29tcGFyZU9yZGVyKGEsIGIsIGVudGl0eSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldE51bWJlck9mUm93czxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICB0YWI6IG51bWJlclxuICAgICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoa2V5c1xuICAgICAgICAgICAgLmZpbHRlcihrID0+IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspPy5wb3NpdGlvbi50YWIgPT09IHRhYilcbiAgICAgICAgICAgIC5tYXAoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKT8ucG9zaXRpb24ucm93KSBhcyBudW1iZXJbXSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhID4gYiA/IC0xIDogMSlbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0TnVtYmVyT2ZUYWJzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oa2V5czogKGtleW9mIEVudGl0eVR5cGUpW10sIGVudGl0eTogRW50aXR5VHlwZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoa2V5c1xuICAgICAgICAgICAgLmZpbHRlcihrID0+IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgIC5tYXAoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKT8ucG9zaXRpb24udGFiKSBhcyBudW1iZXJbXSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhID4gYiA/IC0xIDogMSlbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGFiTmFtZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwgdGFiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwcm92aWRlZFRhYk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IFJlZmxlY3RVdGlsaXRpZXMub3duS2V5cyhlbnRpdHkpXG4gICAgICAgICAgICAubWFwKGsgPT4gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykpXG4gICAgICAgICAgICAuZmluZChtID0+IG0/LnBvc2l0aW9uLnRhYiA9PT0gdGFiICYmIG0ucG9zaXRpb24udGFiTmFtZSk/LnBvc2l0aW9uLnRhYk5hbWU7XG4gICAgICAgIHJldHVybiBwcm92aWRlZFRhYk5hbWUgPz8gYFRhYiAke3RhYn1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldEZpcnN0VGFiTmFtZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVkVGFiTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gUmVmbGVjdFV0aWxpdGllcy5vd25LZXlzKGVudGl0eSlcbiAgICAgICAgICAgIC5tYXAoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKSlcbiAgICAgICAgICAgIC5maW5kKG0gPT4gbT8ucG9zaXRpb24udGFiTmFtZSAmJiBtLnBvc2l0aW9uLnRhYiA9PT0gLTEpPy5wb3NpdGlvbi50YWJOYW1lO1xuICAgICAgICByZXR1cm4gcHJvdmlkZWRUYWJOYW1lID8/ICdUYWIgMSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUga2V5cyBvZiB0aGUgcHJvdmlkZWQgZW50aXR5IGNvcnJlY3RseSB0eXBlZC5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIGtleXMgb2YuXG4gICAgICogQHBhcmFtIGluamVjdG9yIC0gQW4gYW5ndWxhciBlbnZpcm9ubWVudCBpbmplY3Rvci5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JDcmVhdGUgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JDcmVhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JFZGl0IC0gV2hldGhlciBvciBub3Qga2V5cyB3aXRoIHRoZSBtZXRhZGF0YSBvbWl0Rm9yVXBkYXRlIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2Yga2V5cyBvZiB0aGUgZW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlzT2Y8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgaGlkZU9taXRGb3JDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgaGlkZU9taXRGb3JFZGl0OiBib29sZWFuID0gZmFsc2VcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGxldCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFJlZmxlY3RVdGlsaXRpZXMub3duS2V5cyhlbnRpdHkpO1xuICAgICAgICBjb25zdCBkb250RGlzcGxheUtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gdGhpcy5nZXREb250RGlzcGxheUtleXMoZW50aXR5LCBpbmplY3Rvcik7XG4gICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFkb250RGlzcGxheUtleXMuaW5jbHVkZXMoaykpO1xuICAgICAgICBpZiAoaGlkZU9taXRGb3JDcmVhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9taXRGb3JDcmVhdGVLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IHRoaXMuZ2V0T21pdEZvckNyZWF0ZShlbnRpdHkpO1xuICAgICAgICAgICAga2V5cyA9IGtleXMuZmlsdGVyKGsgPT4gIW9taXRGb3JDcmVhdGVLZXlzLmluY2x1ZGVzKGspKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGlkZU9taXRGb3JFZGl0KSB7XG4gICAgICAgICAgICBjb25zdCBvbWl0Rm9yVXBkYXRlS2V5czogKGtleW9mIEVudGl0eVR5cGUpW10gPSB0aGlzLmdldE9taXRGb3JVcGRhdGUoZW50aXR5KTtcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFvbWl0Rm9yVXBkYXRlS2V5cy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RG9udERpc3BsYXlLZXlzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3JcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGNvbnN0IHJlczogKGtleW9mIEVudGl0eVR5cGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9zdHJpY3QtYm9vbGVhbi1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWYgKHJ1bkluSW5qZWN0aW9uQ29udGV4dChpbmplY3RvciwgKCkgPT4gIW1ldGFkYXRhPy5kaXNwbGF5KGVudGl0eSkpKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIHJvdyB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkaXNwbGF5IGFuIGVudGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlSb3c8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdyBpbiB3aGljaCB0aGlzIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgcm93OiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogVGhlIGtleXMgb2YgdGhlIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhhdCByb3cuXG4gICAgICovXG4gICAga2V5czogKGtleW9mIEVudGl0eVR5cGUpW11cbn1cblxuLyoqXG4gKiBBIHRhYiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRpc3BsYXkgYW4gZW50aXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVRhYjxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGFiIGluIHdoaWNoIHRoZSByb3dzIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgdGFiOiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgdG8gZGlzcGxheSBpbnNpZGUgdGhlIHRhYi5cbiAgICAgKi9cbiAgICB0YWJOYW1lOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIHJvd3MgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluc2lkZSB0aGlzIHRhYiwuXG4gICAgICovXG4gICAgcm93czogRW50aXR5Um93PEVudGl0eVR5cGU+W11cbn0iXX0=