ngx-material-entity 0.1.2 → 0.1.5

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 (183) hide show
  1. package/README.md +533 -326
  2. package/capsulation/lodash.utilities.d.ts +62 -0
  3. package/capsulation/reflect.utilities.d.ts +56 -0
  4. package/classes/base.builder.d.ts +36 -0
  5. package/classes/date.utilities.d.ts +70 -0
  6. package/classes/entity.model.d.ts +19 -0
  7. package/classes/entity.service.d.ts +108 -0
  8. package/classes/entity.utilities.d.ts +180 -0
  9. package/classes/file.utilities.d.ts +52 -0
  10. package/components/confirm-dialog/confirm-dialog-data.builder.d.ts +10 -11
  11. package/components/confirm-dialog/confirm-dialog-data.d.ts +4 -0
  12. package/components/confirm-dialog/confirm-dialog.component.d.ts +11 -0
  13. package/components/input/add-array-item-dialog-data.builder.d.ts +21 -0
  14. package/components/input/{array-table/add-array-item-dialog/add-array-item-dialog-data.d.ts → add-array-item-dialog-data.d.ts} +6 -3
  15. package/components/input/array/array-date-input/array-date-input.component.d.ts +22 -0
  16. package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +30 -0
  17. package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +32 -0
  18. package/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.d.ts +58 -0
  19. package/components/input/array/array-string-chips-input/array-string-chips-input.component.d.ts +51 -0
  20. package/components/input/array/array-table.class.d.ts +48 -0
  21. package/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.d.ts +17 -0
  22. package/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.d.ts +17 -0
  23. package/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.d.ts +17 -0
  24. package/components/input/date/date-input/date-input.component.d.ts +21 -0
  25. package/components/input/date/date-range-input/date-range-input.component.d.ts +27 -0
  26. package/components/input/date/date-time-input/date-time-input.component.d.ts +38 -0
  27. package/components/input/file/file-default-input/file-default-input.component.d.ts +21 -0
  28. package/components/input/file/file-image-input/file-image-input.component.d.ts +30 -0
  29. package/components/input/file/file-input/dragDrop.directive.d.ts +32 -0
  30. package/components/input/file/file-input/file-input.component.d.ts +32 -0
  31. package/components/input/input.component.d.ts +108 -39
  32. package/components/input/input.module.d.ts +37 -13
  33. package/components/input/number/number-dropdown-input/number-dropdown-input.component.d.ts +17 -0
  34. package/components/input/number/number-input/number-input.component.d.ts +17 -0
  35. package/components/input/string/string-autocomplete-input/string-autocomplete-input.component.d.ts +25 -0
  36. package/components/input/string/string-dropdown-input/string-dropdown-input.component.d.ts +17 -0
  37. package/components/input/string/string-input/string-input.component.d.ts +17 -0
  38. package/components/input/string/string-textbox-input/string-textbox-input.component.d.ts +17 -0
  39. package/components/table/create-dialog/create-dialog-data.builder.d.ts +9 -8
  40. package/components/table/create-dialog/create-entity-dialog-data.builder.d.ts +12 -6
  41. package/components/table/create-dialog/create-entity-dialog-data.d.ts +3 -3
  42. package/components/table/create-dialog/create-entity-dialog.component.d.ts +23 -7
  43. package/components/table/edit-dialog/edit-dialog-data.builder.d.ts +11 -13
  44. package/components/table/edit-dialog/edit-entity-dialog-data.d.ts +3 -3
  45. package/components/table/edit-dialog/edit-entity-dialog.builder.d.ts +12 -6
  46. package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +25 -7
  47. package/components/table/table-data.builder.d.ts +25 -14
  48. package/components/table/table-data.d.ts +22 -10
  49. package/components/table/table.component.d.ts +48 -2
  50. package/components/table/table.module.d.ts +3 -1
  51. package/decorators/array/array-decorator-internal.data.d.ts +85 -9
  52. package/decorators/array/array-decorator.data.d.ts +200 -25
  53. package/decorators/array/array.decorator.d.ts +4 -4
  54. package/decorators/base/base-property.decorator.d.ts +2 -3
  55. package/decorators/base/decorator-types.enum.d.ts +13 -4
  56. package/decorators/base/dropdown-value.interface.d.ts +14 -0
  57. package/decorators/base/property-decorator-internal.data.d.ts +16 -3
  58. package/decorators/base/property-decorator.data.d.ts +26 -5
  59. package/decorators/boolean/boolean-decorator-internal.data.d.ts +9 -0
  60. package/decorators/boolean/boolean-decorator.data.d.ts +9 -0
  61. package/decorators/boolean/boolean.decorator.d.ts +1 -1
  62. package/decorators/date/date-decorator-internal.data.d.ts +44 -0
  63. package/decorators/date/date-decorator.data.d.ts +129 -0
  64. package/decorators/date/date.decorator.d.ts +8 -0
  65. package/decorators/file/file-decorator-internal.data.d.ts +92 -0
  66. package/decorators/file/file-decorator.data.d.ts +92 -0
  67. package/decorators/file/file.decorator.d.ts +9 -0
  68. package/decorators/number/number-decorator-internal.data.d.ts +8 -4
  69. package/decorators/number/number-decorator.data.d.ts +8 -4
  70. package/decorators/number/number.decorator.d.ts +2 -2
  71. package/decorators/object/object-decorator-internal.data.d.ts +6 -3
  72. package/decorators/object/object-decorator.data.d.ts +8 -5
  73. package/decorators/object/object.decorator.d.ts +3 -3
  74. package/decorators/string/string-decorator-internal.data.d.ts +14 -4
  75. package/decorators/string/string-decorator.data.d.ts +14 -4
  76. package/decorators/string/string.decorator.d.ts +1 -1
  77. package/esm2020/capsulation/lodash.utilities.mjs +75 -0
  78. package/esm2020/capsulation/reflect.utilities.mjs +69 -0
  79. package/esm2020/classes/base.builder.mjs +42 -0
  80. package/esm2020/classes/date.utilities.mjs +158 -0
  81. package/esm2020/classes/entity.model.mjs +19 -0
  82. package/esm2020/classes/entity.service.mjs +180 -0
  83. package/esm2020/classes/entity.utilities.mjs +669 -0
  84. package/esm2020/classes/file.utilities.mjs +123 -0
  85. package/esm2020/components/confirm-dialog/confirm-dialog-data.builder.mjs +17 -50
  86. package/esm2020/components/confirm-dialog/confirm-dialog-data.mjs +1 -1
  87. package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +15 -4
  88. package/esm2020/components/get-validation-error-message.function.mjs +5 -1
  89. package/esm2020/components/input/add-array-item-dialog-data.builder.mjs +30 -0
  90. package/esm2020/components/input/add-array-item-dialog-data.mjs +2 -0
  91. package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +44 -0
  92. package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +68 -0
  93. package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +65 -0
  94. package/esm2020/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +131 -0
  95. package/esm2020/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +116 -0
  96. package/esm2020/components/input/array/array-table.class.mjs +92 -0
  97. package/esm2020/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +38 -0
  98. package/esm2020/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +35 -0
  99. package/esm2020/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +38 -0
  100. package/esm2020/components/input/date/date-input/date-input.component.mjs +38 -0
  101. package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +63 -0
  102. package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +74 -0
  103. package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +39 -0
  104. package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +95 -0
  105. package/esm2020/components/input/file/file-input/dragDrop.directive.mjs +64 -0
  106. package/esm2020/components/input/file/file-input/file-input.component.mjs +152 -0
  107. package/esm2020/components/input/input.component.mjs +207 -110
  108. package/esm2020/components/input/input.module.mjs +87 -10
  109. package/esm2020/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +36 -0
  110. package/esm2020/components/input/number/number-input/number-input.component.mjs +34 -0
  111. package/esm2020/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +52 -0
  112. package/esm2020/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +36 -0
  113. package/esm2020/components/input/string/string-input/string-input.component.mjs +34 -0
  114. package/esm2020/components/input/string/string-textbox-input/string-textbox-input.component.mjs +35 -0
  115. package/esm2020/components/table/create-dialog/create-dialog-data.builder.mjs +18 -40
  116. package/esm2020/components/table/create-dialog/create-entity-dialog-data.builder.mjs +15 -7
  117. package/esm2020/components/table/create-dialog/create-entity-dialog-data.mjs +1 -1
  118. package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +36 -22
  119. package/esm2020/components/table/create-dialog/create-entity-dialog.module.mjs +20 -4
  120. package/esm2020/components/table/edit-dialog/edit-dialog-data.builder.mjs +23 -63
  121. package/esm2020/components/table/edit-dialog/edit-entity-dialog-data.mjs +1 -1
  122. package/esm2020/components/table/edit-dialog/edit-entity-dialog.builder.mjs +15 -7
  123. package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +50 -31
  124. package/esm2020/components/table/table-data.builder.mjs +31 -15
  125. package/esm2020/components/table/table-data.mjs +1 -1
  126. package/esm2020/components/table/table.component.mjs +77 -32
  127. package/esm2020/components/table/table.module.mjs +12 -4
  128. package/esm2020/decorators/array/array-decorator-internal.data.mjs +111 -12
  129. package/esm2020/decorators/array/array-decorator.data.mjs +2 -2
  130. package/esm2020/decorators/array/array.decorator.mjs +9 -3
  131. package/esm2020/decorators/base/base-property.decorator.mjs +4 -3
  132. package/esm2020/decorators/base/decorator-types.enum.mjs +9 -1
  133. package/esm2020/decorators/base/dropdown-value.interface.mjs +2 -0
  134. package/esm2020/decorators/base/property-decorator-internal.data.mjs +33 -10
  135. package/esm2020/decorators/base/property-decorator.data.mjs +1 -1
  136. package/esm2020/decorators/boolean/boolean-decorator-internal.data.mjs +12 -1
  137. package/esm2020/decorators/boolean/boolean-decorator.data.mjs +1 -1
  138. package/esm2020/decorators/boolean/boolean.decorator.mjs +2 -2
  139. package/esm2020/decorators/date/date-decorator-internal.data.mjs +48 -0
  140. package/esm2020/decorators/date/date-decorator.data.mjs +7 -0
  141. package/esm2020/decorators/date/date.decorator.mjs +21 -0
  142. package/esm2020/decorators/file/file-decorator-internal.data.mjs +98 -0
  143. package/esm2020/decorators/file/file-decorator.data.mjs +7 -0
  144. package/esm2020/decorators/file/file.decorator.mjs +22 -0
  145. package/esm2020/decorators/number/number-decorator-internal.data.mjs +7 -1
  146. package/esm2020/decorators/number/number-decorator.data.mjs +1 -1
  147. package/esm2020/decorators/number/number.decorator.mjs +3 -3
  148. package/esm2020/decorators/object/object-decorator-internal.data.mjs +5 -2
  149. package/esm2020/decorators/object/object-decorator.data.mjs +1 -1
  150. package/esm2020/decorators/object/object.decorator.mjs +2 -2
  151. package/esm2020/decorators/string/string-decorator-internal.data.mjs +13 -1
  152. package/esm2020/decorators/string/string-decorator.data.mjs +1 -1
  153. package/esm2020/decorators/string/string.decorator.mjs +2 -2
  154. package/esm2020/mocks/placeholder-data.png.mjs +3 -0
  155. package/esm2020/public-api.mjs +12 -5
  156. package/fesm2015/ngx-material-entity.mjs +3271 -894
  157. package/fesm2015/ngx-material-entity.mjs.map +1 -1
  158. package/fesm2020/ngx-material-entity.mjs +3140 -829
  159. package/fesm2020/ngx-material-entity.mjs.map +1 -1
  160. package/mocks/placeholder-data.png.d.ts +1 -0
  161. package/package.json +7 -1
  162. package/public-api.d.ts +12 -5
  163. package/classes/entity-model.class.d.ts +0 -9
  164. package/classes/entity-service.class.d.ts +0 -66
  165. package/classes/entity-utilities.class.d.ts +0 -112
  166. package/components/input/array-table/add-array-item-dialog/add-array-item-dialog-data.builder.d.ts +0 -17
  167. package/components/input/array-table/add-array-item-dialog/add-array-item-dialog.component.d.ts +0 -22
  168. package/components/input/array-table/add-array-item-dialog/add-array-item-dialog.module.d.ts +0 -12
  169. package/components/input/array-table/array-table.component.d.ts +0 -34
  170. package/components/input/array-table/array-table.module.d.ts +0 -19
  171. package/components/input/internal-input/internal-input.component.d.ts +0 -54
  172. package/components/input/internal-input/internal-input.module.d.ts +0 -16
  173. package/esm2020/classes/entity-model.class.mjs +0 -19
  174. package/esm2020/classes/entity-service.class.mjs +0 -76
  175. package/esm2020/classes/entity-utilities.class.mjs +0 -329
  176. package/esm2020/components/input/array-table/add-array-item-dialog/add-array-item-dialog-data.builder.mjs +0 -33
  177. package/esm2020/components/input/array-table/add-array-item-dialog/add-array-item-dialog-data.mjs +0 -2
  178. package/esm2020/components/input/array-table/add-array-item-dialog/add-array-item-dialog.component.mjs +0 -45
  179. package/esm2020/components/input/array-table/add-array-item-dialog/add-array-item-dialog.module.mjs +0 -22
  180. package/esm2020/components/input/array-table/array-table.component.mjs +0 -119
  181. package/esm2020/components/input/array-table/array-table.module.mjs +0 -66
  182. package/esm2020/components/input/internal-input/internal-input.component.mjs +0 -70
  183. package/esm2020/components/input/internal-input/internal-input.module.mjs +0 -54
@@ -1,28 +1,65 @@
1
- import { Component, Input } from '@angular/core';
2
- import { EntityUtilities } from '../../classes/entity-utilities.class';
1
+ import { Component, EventEmitter, Input, Output, TemplateRef, ViewChild } from '@angular/core';
2
+ import { EntityUtilities } from '../../classes/entity.utilities';
3
3
  import { DecoratorTypes } from '../../decorators/base/decorator-types.enum';
4
4
  import { getValidationErrorMessage } from '../get-validation-error-message.function';
5
- import { cloneDeep } from 'lodash';
5
+ import { MatTableDataSource } from '@angular/material/table';
6
+ import { SelectionModel } from '@angular/cdk/collections';
7
+ import { AddArrayItemDialogDataBuilder } from './add-array-item-dialog-data.builder';
8
+ import { MatDialog } from '@angular/material/dialog';
9
+ import { DateUtilities } from '../../classes/date.utilities';
10
+ import { LodashUtilities } from '../../capsulation/lodash.utilities';
11
+ import { NgxMatEntityConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';
6
12
  import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/material/form-field";
8
- import * as i2 from "@angular/material/autocomplete";
9
- import * as i3 from "@angular/material/core";
10
- import * as i4 from "@angular/material/select";
11
- import * as i5 from "@angular/material/checkbox";
12
- import * as i6 from "@angular/material/slide-toggle";
13
- import * as i7 from "./array-table/array-table.component";
14
- import * as i8 from "@angular/material/chips";
15
- import * as i9 from "@angular/material/icon";
16
- import * as i10 from "@angular/common";
17
- import * as i11 from "@angular/material/input";
18
- import * as i12 from "@angular/forms";
19
- import * as i13 from "@angular/cdk/text-field";
13
+ import * as i1 from "@angular/material/dialog";
14
+ import * as i2 from "./string/string-input/string-input.component";
15
+ import * as i3 from "./string/string-textbox-input/string-textbox-input.component";
16
+ import * as i4 from "./string/string-autocomplete-input/string-autocomplete-input.component";
17
+ import * as i5 from "./string/string-dropdown-input/string-dropdown-input.component";
18
+ import * as i6 from "./boolean/boolean-checkbox-input/boolean-checkbox-input.component";
19
+ import * as i7 from "./boolean/boolean-toggle-input/boolean-toggle-input.component";
20
+ import * as i8 from "./boolean/boolean-dropdown-input/boolean-dropdown-input.component";
21
+ import * as i9 from "./number/number-input/number-input.component";
22
+ import * as i10 from "./number/number-dropdown-input/number-dropdown-input.component";
23
+ import * as i11 from "@angular/material/button";
24
+ import * as i12 from "@angular/material/table";
25
+ import * as i13 from "@angular/material/checkbox";
26
+ import * as i14 from "./array/array-date-input/array-date-input.component";
27
+ import * as i15 from "./array/array-date-time-input/array-date-time-input.component";
28
+ import * as i16 from "./array/array-date-range-input/array-date-range-input.component";
29
+ import * as i17 from "./array/array-string-chips-input/array-string-chips-input.component";
30
+ import * as i18 from "./array/array-string-autocomplete-chips/array-string-autocomplete-chips.component";
31
+ import * as i19 from "./date/date-input/date-input.component";
32
+ import * as i20 from "./date/date-range-input/date-range-input.component";
33
+ import * as i21 from "./date/date-time-input/date-time-input.component";
34
+ import * as i22 from "./file/file-default-input/file-default-input.component";
35
+ import * as i23 from "./file/file-image-input/file-image-input.component";
36
+ import * as i24 from "@angular/common";
37
+ import * as i25 from "@angular/forms";
38
+ /**
39
+ * The default input component. It gets the metadata of the property from the given @Input "entity" and @Input "propertyKey"
40
+ * and displays the input field accordingly.
41
+ *
42
+ * You can also define a method that generates error-messages and if the input should be hidden when its metadata says
43
+ * that it should be omitted for creating or updating.
44
+ * The last part being mostly relevant if you want to use this component inside an ngFor.
45
+ */
20
46
  export class NgxMatEntityInputComponent {
21
- constructor() {
22
- this.chipsInput = '';
47
+ constructor(dialog) {
48
+ this.dialog = dialog;
49
+ this.inputChangeEvent = new EventEmitter();
50
+ this.selection = new SelectionModel(true, []);
51
+ this.isArrayItemValid = false;
52
+ this.isDialogArrayItemValid = false;
23
53
  this.DecoratorTypes = DecoratorTypes;
24
- this.getWidth = EntityUtilities.getWidth;
54
+ this.EntityUtilities = EntityUtilities;
55
+ this.DateUtilities = DateUtilities;
25
56
  }
57
+ /**
58
+ * This is needed for the inputs to work inside an ngFor.
59
+ *
60
+ * @param index - The index of the element in the ngFor.
61
+ * @returns The index.
62
+ */
26
63
  trackByFn(index) {
27
64
  return index;
28
65
  }
@@ -30,118 +67,173 @@ export class NgxMatEntityInputComponent {
30
67
  if (!this.entity) {
31
68
  throw new Error('Missing required Input data "entity"');
32
69
  }
33
- if (!this.propertyKey) {
70
+ this.internalEntity = this.entity;
71
+ if (this.propertyKey == null) {
34
72
  throw new Error('Missing required Input data "propertyKey"');
35
73
  }
74
+ this.internalPropertyKey = this.propertyKey;
75
+ this.internalGetValidationErrorMessage = this.getValidationErrorMessage ?? getValidationErrorMessage;
36
76
  this.type = EntityUtilities.getPropertyType(this.entity, this.propertyKey);
37
77
  this.metadata = EntityUtilities.getPropertyMetadata(this.entity, this.propertyKey, this.type);
38
- this.metadataDefaultString = this.metadata;
39
- this.metadataTextboxString = this.metadata;
40
- this.metadataAutocompleteString = this.metadata;
41
- this.autocompleteStrings = this.metadataAutocompleteString.autocompleteValues;
42
- this.filteredAutocompleteStrings = cloneDeep(this.autocompleteStrings);
43
- this.metadataDropdownString = this.metadata;
44
- this.metadataDropdownBoolean = this.metadata;
45
- this.metadataDefaultNumber = this.metadata;
46
- this.metadataDropdownNumber = this.metadata;
47
- this.metadataDefaultObject = this.metadata;
48
- this.objectProperty = this.entity[this.propertyKey];
78
+ if (this.type === DecoratorTypes.OBJECT) {
79
+ this.initObjectInput();
80
+ }
81
+ if (this.type === DecoratorTypes.ARRAY) {
82
+ this.initEntityArray();
83
+ }
84
+ }
85
+ initEntityArray() {
49
86
  this.metadataEntityArray = this.metadata;
50
- if (this.metadataEntityArray.EntityClass) {
51
- if (!this.entity[this.propertyKey]) {
52
- this.entity[this.propertyKey] = [];
53
- }
54
- this.entityArrayValues = this.entity[this.propertyKey];
55
- if (this.metadataEntityArray.createInline === undefined) {
56
- this.metadataEntityArray.createInline = true;
57
- }
58
- if (!this.metadataEntityArray.createInline && !this.metadataEntityArray.createDialogData) {
59
- this.metadataEntityArray.createDialogData = {
60
- title: 'Add'
61
- };
62
- }
87
+ if (this.internalEntity[this.internalPropertyKey] == null) {
88
+ this.internalEntity[this.internalPropertyKey] = [];
63
89
  }
64
- this.metadataStringChipsArray = this.metadata;
65
- if (this.metadataStringChipsArray.itemType
66
- && this.entity[this.propertyKey]?.length) {
67
- this.stringChipsArrayValues = this.entity[this.propertyKey];
90
+ this.entityArrayValues = this.internalEntity[this.internalPropertyKey];
91
+ if (!this.metadataEntityArray.createInline && !this.metadataEntityArray.createDialogData) {
92
+ this.metadataEntityArray.createDialogData = {
93
+ title: 'Add'
94
+ };
68
95
  }
69
- this.metadataAutocompleteStringChipsArray = this.metadata;
70
- if (!this.getValidationErrorMessage) {
71
- this.getValidationErrorMessage = getValidationErrorMessage;
96
+ const givenDisplayColumns = this.metadataEntityArray.displayColumns.map((v) => v.displayName);
97
+ if (givenDisplayColumns.find(s => s === 'select')) {
98
+ throw new Error(`The name "select" for a display column is reserved.
99
+ Please choose a different name.`);
72
100
  }
101
+ this.displayedColumns = ['select'].concat(givenDisplayColumns);
102
+ this.dataSource = new MatTableDataSource();
103
+ this.dataSource.data = this.entityArrayValues;
104
+ this.arrayItem = new this.metadataEntityArray.EntityClass();
105
+ this.arrayItemInlineRows = EntityUtilities.getEntityRows(this.arrayItem, this.hideOmitForCreate ?? true, this.hideOmitForEdit);
106
+ this.arrayItemPriorChanges = LodashUtilities.cloneDeep(this.arrayItem);
107
+ this.dialogInputData = {
108
+ entity: this.arrayItem,
109
+ createDialogData: this.metadataEntityArray.createDialogData,
110
+ getValidationErrorMessage: this.getValidationErrorMessage
111
+ };
112
+ this.dialogData = new AddArrayItemDialogDataBuilder(this.dialogInputData).getResult();
113
+ this.arrayItemDialogRows = EntityUtilities.getEntityRows(this.dialogData.entity, true);
73
114
  }
74
- getObjectProperties() {
75
- const res = [];
76
- for (const property in this.objectProperty) {
77
- const metadata = EntityUtilities.getPropertyMetadata(this.objectProperty, property, EntityUtilities.getPropertyType(this.objectProperty, property));
78
- if (!(this.hideOmitForCreate && metadata.omitForCreate)
79
- && !(this.hideOmitForEdit && metadata.omitForUpdate)) {
80
- res.push(property);
81
- }
82
- }
83
- return res.sort((a, b) => EntityUtilities.compareOrder(a, b, this.objectProperty));
115
+ initObjectInput() {
116
+ this.metadataDefaultObject = this.metadata;
117
+ this.objectProperty = this.internalEntity[this.internalPropertyKey];
118
+ this.objectPropertyRows = EntityUtilities.getEntityRows(this.objectProperty, this.hideOmitForCreate, this.hideOmitForEdit);
84
119
  }
85
- addStringChipArrayValue(event) {
86
- const value = (event.value || '').trim();
87
- if (value) {
88
- if (this.metadataStringChipsArray.minLength && value.length < this.metadataStringChipsArray.minLength) {
89
- return;
90
- }
91
- if (this.metadataStringChipsArray.maxLength && value.length > this.metadataStringChipsArray.maxLength) {
92
- return;
93
- }
94
- if (this.metadataStringChipsArray.regex && !value.match(this.metadataStringChipsArray.regex)) {
120
+ /**
121
+ * Checks if the arrayItem is valid.
122
+ */
123
+ checkIsArrayItemValid() {
124
+ this.isArrayItemValid = EntityUtilities.isEntityValid(this.arrayItem, 'create');
125
+ }
126
+ /**
127
+ * Checks if the arrayItem inside the dialog is valid.
128
+ */
129
+ checkIsDialogArrayItemValid() {
130
+ this.isDialogArrayItemValid = EntityUtilities.isEntityValid(this.dialogData.entity, 'create');
131
+ }
132
+ /**
133
+ * Emits that a the value has been changed.
134
+ */
135
+ emitChange() {
136
+ this.inputChangeEvent.emit();
137
+ }
138
+ /**
139
+ * Tries to add an item to the entity array.
140
+ * Does this either inline if the "createInline"-metadata is set to true
141
+ * or in a separate dialog if it is set to false.
142
+ */
143
+ addEntity() {
144
+ if (this.metadataEntityArray.createInline) {
145
+ if (!this.metadataEntityArray.allowDuplicates
146
+ && this.entityArrayValues.find(async (v) => await EntityUtilities.isEqual(this.arrayItem, v, this.metadata, this.metadataEntityArray.itemType))) {
147
+ this.dialog.open(NgxMatEntityConfirmDialogComponent, {
148
+ data: this.metadataEntityArray.duplicatesErrorDialog,
149
+ autoFocus: false,
150
+ restoreFocus: false
151
+ });
95
152
  return;
96
153
  }
97
- if (!this.stringChipsArrayValues) {
98
- if (!this.entity[this.propertyKey]) {
99
- this.entity[this.propertyKey] = [];
100
- }
101
- this.stringChipsArrayValues = this.entity[this.propertyKey];
102
- }
103
- this.stringChipsArrayValues.push(value);
154
+ this.entityArrayValues.push(LodashUtilities.cloneDeep(this.arrayItem));
155
+ this.dataSource.data = this.entityArrayValues;
156
+ EntityUtilities.resetChangesOnEntity(this.arrayItem, this.arrayItemPriorChanges);
157
+ this.emitChange();
104
158
  }
105
- event.chipInput.clear();
106
- }
107
- removeStringChipArrayValue(value) {
108
- this.stringChipsArrayValues.splice(this.stringChipsArrayValues.indexOf(value), 1);
109
- if (!this.stringChipsArrayValues.length) {
110
- this.entity[this.propertyKey] = undefined;
111
- this.stringChipsArrayValues = this.entity[this.propertyKey];
159
+ else {
160
+ this.addArrayItemDialogRef = this.dialog.open(this.addArrayItemDialog, {
161
+ data: this.dialogData,
162
+ autoFocus: false,
163
+ restoreFocus: false
164
+ });
112
165
  }
113
166
  }
114
- selected(event, chipsInput) {
115
- const value = (event.option.viewValue || '').trim();
116
- if (this.metadataStringChipsArray.minLength && value.length < this.metadataStringChipsArray.minLength) {
117
- return;
118
- }
119
- if (this.metadataStringChipsArray.maxLength && value.length > this.metadataStringChipsArray.maxLength) {
120
- return;
121
- }
122
- if (this.metadataStringChipsArray.regex && !value.match(this.metadataStringChipsArray.regex)) {
123
- return;
167
+ /**
168
+ * Adds the array item defined in the dialog.
169
+ */
170
+ addArrayItem() {
171
+ this.addArrayItemDialogRef.close();
172
+ this.entityArrayValues.push(LodashUtilities.cloneDeep(this.arrayItem));
173
+ this.dataSource.data = this.entityArrayValues;
174
+ EntityUtilities.resetChangesOnEntity(this.arrayItem, this.arrayItemPriorChanges);
175
+ this.emitChange();
176
+ }
177
+ /**
178
+ * Cancels adding the array item defined in the dialog.
179
+ */
180
+ cancelAddArrayItem() {
181
+ this.addArrayItemDialogRef.close();
182
+ EntityUtilities.resetChangesOnEntity(this.arrayItem, this.arrayItemPriorChanges);
183
+ this.emitChange();
184
+ }
185
+ /**
186
+ * Removes all selected entries from the entity array.
187
+ *
188
+ * @param selection - The selection containing the items to remove.
189
+ * @param values - The values of the dataSource.
190
+ * @param dataSource - The dataSource.
191
+ */
192
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
193
+ remove(selection, values, dataSource) {
194
+ selection.selected.forEach(s => {
195
+ values.splice(values.indexOf(s), 1);
196
+ });
197
+ dataSource.data = values;
198
+ selection.clear();
199
+ this.emitChange();
200
+ }
201
+ /**
202
+ * Toggles all array-items in the table.
203
+ *
204
+ * @param selection - The selection to toggle.
205
+ * @param dataSource - The dataSource of the selection.
206
+ */
207
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
208
+ masterToggle(selection, dataSource) {
209
+ if (this.isAllSelected(selection, dataSource)) {
210
+ selection.clear();
124
211
  }
125
- if (!this.stringChipsArrayValues) {
126
- if (!this.entity[this.propertyKey]) {
127
- this.entity[this.propertyKey] = [];
128
- }
129
- this.stringChipsArrayValues = this.entity[this.propertyKey];
212
+ else {
213
+ dataSource.data.forEach(row => selection.select(row));
130
214
  }
131
- this.stringChipsArrayValues.push(value);
132
- chipsInput.value = '';
133
215
  }
134
- filterAutocompleteStrings(input) {
135
- const filterValue = input.toLowerCase();
136
- this.filteredAutocompleteStrings = this.autocompleteStrings.filter(s => s.toLowerCase().includes(filterValue));
216
+ /**
217
+ * Checks if all array-items in the table have been selected.
218
+ * This is needed to display the "masterToggle"-checkbox correctly.
219
+ *
220
+ * @param selection - The selection to check.
221
+ * @param dataSource - The dataSource of the selection.
222
+ * @returns Whether or not all array-items in the table have been selected.
223
+ */
224
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
225
+ isAllSelected(selection, dataSource) {
226
+ const numSelected = selection.selected.length;
227
+ const numRows = dataSource.data.length;
228
+ return numSelected === numRows;
137
229
  }
138
230
  }
139
- NgxMatEntityInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
140
- NgxMatEntityInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: { entity: "entity", propertyKey: "propertyKey", getValidationErrorMessage: "getValidationErrorMessage", hideOmitForCreate: "hideOmitForCreate", hideOmitForEdit: "hideOmitForEdit" }, ngImport: i0, template: "<div [ngSwitch]=\"type\" *ngIf=\"!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)\">\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.STRING\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required\"\n [pattern]=\"metadataDefaultString.regex ? metadataDefaultString.regex : '[\\\\s\\\\S]*'\"\n [minlength]=\"metadataDefaultString.minLength ? metadataDefaultString.minLength : null\"\n [maxlength]=\"metadataDefaultString.maxLength ? metadataDefaultString.maxLength : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <textarea\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"10\"\n [required]=\"metadata.required\"\n [minlength]=\"metadataTextboxString.minLength ? metadataTextboxString.minLength : null\"\n [maxlength]=\"metadataTextboxString.maxLength ? metadataTextboxString.maxLength : null\"\n >\n </textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [matAutocomplete]=\"auto\"\n (keyup)=\"filterAutocompleteStrings(entity[propertyKey])\"\n [required]=\"metadata.required\"\n [minlength]=\"metadataAutocompleteString.minLength ? metadataAutocompleteString.minLength : null\"\n [maxlength]=\"metadataAutocompleteString.maxLength ? metadataAutocompleteString.maxLength : null\"\n [pattern]=\"metadataAutocompleteString.regex ? metadataAutocompleteString.regex : '[\\\\s\\\\S]*'\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let value of filteredAutocompleteStrings\" [value]=\"value\">\n {{value}}\n </mat-option>\n </mat-autocomplete>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required\">\n <mat-option *ngFor=\"let value of metadataDropdownString.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <mat-form-field>\n <mat-checkbox [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required\">\n {{metadata.displayName}}\n </mat-checkbox>\n <!-- hidden input is needed so that the checkbox can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <mat-form-field>\n <mat-slide-toggle [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required\">\n {{metadata.displayName}}\n </mat-slide-toggle>\n <!-- hidden input is needed so that the toggle can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required\">\n <mat-option [value]=\"undefined\">-</mat-option>\n <mat-option [value]=\"true\">{{metadataDropdownBoolean.dropdownTrue}}</mat-option>\n <mat-option [value]=\"false\">{{metadataDropdownBoolean.dropdownFalse}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required\"\n [min]=\"metadataDefaultNumber.min ? metadataDefaultNumber.min : null\"\n [max]=\"metadataDefaultNumber.max ? metadataDefaultNumber.max : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required\">\n <mat-option *ngFor=\"let value of metadataDropdownNumber.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <div class=\"row\">\n <!--\n displays another ngx-material-entity with the:\n object as the entity,\n the current key in the loop received by the keyvalue direction as the propertyKey\n and the getValidationErrorMessage of the current component\n -->\n <ngx-mat-entity-input\n *ngFor=\"let key of getObjectProperties(); let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n class=\"col-lg-{{getWidth(objectProperty, key, 'lg')}} col-md-{{getWidth(objectProperty, key, 'md')}} col-sm-{{getWidth(objectProperty, key, 'sm')}}\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY\">\n <ngx-mat-entity-array-table\n [arrayItems]=\"entityArrayValues\"\n [metadata]=\"metadataEntityArray\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [omit]=\"hideOmitForCreate ? 'create' : 'update'\"\n >\n </ngx-mat-entity-array-table>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_CHIPS\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-list #chipList\n [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\"\n [required]=\"metadata.required\"\n >\n <mat-chip *ngFor=\"let value of stringChipsArrayValues\" (removed)=\"removeStringChipArrayValue(value)\">\n {{value}}\n <button matChipRemove *ngIf=\"metadataStringChipsArray.deleteHtml\" [innerHtml]=\"metadataStringChipsArray.deleteHtml\">\n </button>\n <button matChipRemove *ngIf=\"!metadataStringChipsArray.deleteHtml\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input matInput\n [matChipInputFor]=\"chipList\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addStringChipArrayValue($event)\"\n [(ngModel)]=\"chipsInput\" [name]=\"propertyKey.toString()\" #chipsModel=\"ngModel\"\n [minlength]='metadataStringChipsArray.minLength ? metadataStringChipsArray.minLength : null'\n [maxlength]='metadataStringChipsArray.maxLength ? metadataStringChipsArray.maxLength : null'\n [pattern]=\"metadataStringChipsArray.regex ? metadataStringChipsArray.regex : '[\\\\s\\\\S]*'\"\n >\n <mat-error *ngIf=\"chipsModel.errors\">{{getValidationErrorMessage(chipsModel)}}</mat-error>\n </mat-chip-list>\n <mat-error *ngIf=\"!chipsModel.errors\">{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-list #chipList\n [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\"\n [required]=\"metadata.required\"\n >\n <mat-chip *ngFor=\"let value of stringChipsArrayValues\" (removed)=\"removeStringChipArrayValue(value)\">\n {{value}}\n <button matChipRemove *ngIf=\"metadataStringChipsArray.deleteHtml\" [innerHtml]=\"metadataStringChipsArray.deleteHtml\">\n </button>\n <button matChipRemove *ngIf=\"!metadataStringChipsArray.deleteHtml\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input matInput\n [matChipInputFor]=\"chipList\"\n [matAutocomplete]=\"auto\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addStringChipArrayValue($event)\"\n (keyup)=\"filterAutocompleteStrings(chipsInput)\"\n [(ngModel)]=\"chipsInput\" [name]=\"propertyKey.toString()\" #chipsModel=\"ngModel\"\n #chipsElement\n [minlength]='metadataStringChipsArray.minLength ? metadataStringChipsArray.minLength : null'\n [maxlength]='metadataStringChipsArray.maxLength ? metadataStringChipsArray.maxLength : null'\n [pattern]=\"metadataStringChipsArray.regex ? metadataStringChipsArray.regex : '[\\\\s\\\\S]*'\"\n >\n <mat-error *ngIf=\"chipsModel.errors\">{{getValidationErrorMessage(chipsModel)}}</mat-error>\n </mat-chip-list>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event, chipsElement)\">\n <mat-option *ngFor=\"let value of filteredAutocompleteStrings\" [value]=\"value\">\n {{value}}\n </mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"!chipsModel.errors\">{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}}is not known.</div>\n</div>", styles: ["mat-form-field{width:100%}\n"], components: [{ type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i4.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: ["entity", "propertyKey", "getValidationErrorMessage", "hideOmitForCreate", "hideOmitForEdit"] }, { type: i7.NgxMatEntityArrayTableComponent, selector: "ngx-mat-entity-array-table", inputs: ["arrayItems", "metadata", "getValidationErrorMessage", "omit"] }, { type: i8.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i10.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i1.MatLabel, selector: "mat-label" }, { type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i12.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i12.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i12.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { type: i12.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i1.MatError, selector: "mat-error", inputs: ["id"] }, { type: i13.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { type: i2.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.MatCheckboxRequiredValidator, selector: "mat-checkbox[required][formControlName], mat-checkbox[required][formControl], mat-checkbox[required][ngModel]" }, { type: i6.MatSlideToggleRequiredValidator, selector: "mat-slide-toggle[required][formControlName], mat-slide-toggle[required][formControl], mat-slide-toggle[required][ngModel]" }, { type: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i12.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i12.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { type: i8.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i8.MatChipRemove, selector: "[matChipRemove]" }, { type: i8.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i10.NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
231
+ NgxMatEntityInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityInputComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
232
+ NgxMatEntityInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: { entity: "entity", propertyKey: "propertyKey", getValidationErrorMessage: "getValidationErrorMessage", hideOmitForCreate: "hideOmitForCreate", hideOmitForEdit: "hideOmitForEdit" }, outputs: { inputChangeEvent: "inputChangeEvent" }, viewQueries: [{ propertyName: "addArrayItemDialog", first: true, predicate: ["addArrayItemDialog"], descendants: true }], ngImport: i0, template: "<div [ngSwitch]=\"type\" *ngIf=\"!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)\">\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.STRING\">\n <string-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></string-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <string-textbox-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></string-textbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <string-autocomplete-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></string-autocomplete-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <string-dropdown-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></string-dropdown-input>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <boolean-checkbox-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></boolean-checkbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <boolean-toggle-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></boolean-toggle-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <boolean-dropdown-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></boolean-dropdown-input>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <number-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></number-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <number-dropdown-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></number-dropdown-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <div class=\"row\" *ngFor=\"let row of objectPropertyRows\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n class=\"col-lg-{{EntityUtilities.getWidth(objectProperty, key, 'lg')}} col-md-{{EntityUtilities.getWidth(objectProperty, key, 'md')}} col-sm-{{EntityUtilities.getWidth(objectProperty, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div class=\"entityArray\" *ngSwitchCase=\"DecoratorTypes.ARRAY\">\n <div class=\"mat-elevation-z8\" style=\"border-radius: 5px;padding: 15px;margin-bottom: 15px;margin-top: 15px;\">\n <div style=\"padding-bottom: 10px\">\n <b>{{metadataEntityArray.displayName}}</b>\n </div>\n <div *ngIf=\"metadataEntityArray.createInline\">\n <div class=\"row\" *ngFor=\"let row of arrayItemInlineRows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n \n <div class=\"buttons\">\n <button mat-raised-button\n [disabled]=\"metadataEntityArray.createInline && !isArrayItemValid\"\n (click)=\"addEntity()\">\n {{metadataEntityArray.addButtonLabel}}\n </button>\n <button mat-raised-button\n [disabled]=\"!selection.selected.length\"\n (click)=\"remove(selection, entityArrayValues, dataSource)\">\n {{metadataEntityArray.removeButtonLabel}}\n </button>\n </div>\n \n <mat-table [dataSource]=\"dataSource\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox [disabled]=\"!dataSource.data.length\" (change)=\"$event ? masterToggle(selection, dataSource) : null\" [checked]=\"selection.hasValue() && isAllSelected(selection, dataSource)\" [indeterminate]=\"selection.hasValue() && !isAllSelected(selection, dataSource)\"></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let module\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(module) : null\" [checked]=\"selection.isSelected(module)\"></mat-checkbox>\n </mat-cell>\n </ng-container>\n \n <ng-container *ngFor=\"let dCol of metadataEntityArray.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell class=\"entity\" *matCellDef=\"let entity\">\n {{dCol.value(entity)}}\n </mat-cell>\n </ng-container>\n \n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n </mat-table>\n \n <div class=\"array-error\" *ngIf=\"metadataEntityArray.required && !dataSource.data.length\">\n {{metadataEntityArray.missingErrorMessage}}\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE\">\n <array-date-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></array-date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_TIME\">\n <array-date-time-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></array-date-time-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_RANGE\">\n <array-date-range-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></array-date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_CHIPS\">\n <array-string-chips-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></array-string-chips-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS\">\n <array-string-autocomplete-chips (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></array-string-autocomplete-chips>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Dates-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.DATE\">\n <date-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_RANGE\">\n <date-range-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_TIME\">\n <date-time-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></date-time-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Files-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.FILE_DEFAULT\">\n <file-default-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></file-default-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.FILE_IMAGE\">\n <file-image-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></file-image-input>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}} is not known.</div>\n</div>\n\n<!--------------------------------------------------------->\n<!--------------------Add Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #addArrayItemDialog>\n <h2 mat-dialog-title>{{dialogData.createDialogData.title}}</h2>\n\n <mat-dialog-content>\n <form #form=\"ngForm\" class=\"row\">\n <div class=\"row\" *ngFor=\"let row of arrayItemDialogRows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"dialogData.entity\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"dialogData.getValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(dialogData.entity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(dialogData.entity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(dialogData.entity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsDialogArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </form>\n </mat-dialog-content>\n\n <mat-dialog-actions>\n <button mat-raised-button (click)=\"addArrayItem()\" [disabled]=\"!isDialogArrayItemValid\">\n {{dialogData.createDialogData.createButtonLabel}}\n </button>\n <button mat-raised-button (click)=\"cancelAddArrayItem()\" class=\"cancel-button\">\n {{dialogData.createDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n\n</ng-template>", styles: ["mat-form-field{width:100%}.entityArray .buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px}.entityArray mat-table{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:25px}.entityArray .mat-column-select{flex:0 0 75px}.entityArray .array-error{display:flex;align-items:center;justify-content:center;margin-top:-25.8px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:25.8px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}\n"], components: [{ type: i2.StringInputComponent, selector: "string-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i3.StringTextboxInputComponent, selector: "string-textbox-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i4.StringAutocompleteInputComponent, selector: "string-autocomplete-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i5.StringDropdownInputComponent, selector: "string-dropdown-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i6.BooleanCheckboxInputComponent, selector: "boolean-checkbox-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i7.BooleanToggleInputComponent, selector: "boolean-toggle-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i8.BooleanDropdownInputComponent, selector: "boolean-dropdown-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i9.NumberInputComponent, selector: "number-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i10.NumberDropdownInputComponent, selector: "number-dropdown-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: ["entity", "propertyKey", "getValidationErrorMessage", "hideOmitForCreate", "hideOmitForEdit"], outputs: ["inputChangeEvent"] }, { type: i11.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i14.ArrayDateInputComponent, selector: "array-date-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i15.ArrayDateTimeInputComponent, selector: "array-date-time-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i16.ArrayDateRangeInputComponent, selector: "array-date-range-input", inputs: ["entity", "key", "metadata", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i17.ArrayStringChipsInputComponent, selector: "array-string-chips-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i18.ArrayStringAutocompleteChipsComponent, selector: "array-string-autocomplete-chips", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i19.DateInputComponent, selector: "date-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i20.DateRangeInputComponent, selector: "date-range-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i21.DateTimeInputComponent, selector: "date-time-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i22.FileDefaultInputComponent, selector: "file-default-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }, { type: i23.FileImageInputComponent, selector: "file-image-input", inputs: ["entity", "key", "getValidationErrorMessage"], outputs: ["inputChangeEvent"] }], directives: [{ type: i24.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i24.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i24.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i24.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i12.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i12.MatCellDef, selector: "[matCellDef]" }, { type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i12.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i12.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { type: i24.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i25.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i25.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i25.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }] });
141
233
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityInputComponent, decorators: [{
142
234
  type: Component,
143
- args: [{ selector: 'ngx-mat-entity-input', template: "<div [ngSwitch]=\"type\" *ngIf=\"!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)\">\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.STRING\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required\"\n [pattern]=\"metadataDefaultString.regex ? metadataDefaultString.regex : '[\\\\s\\\\S]*'\"\n [minlength]=\"metadataDefaultString.minLength ? metadataDefaultString.minLength : null\"\n [maxlength]=\"metadataDefaultString.maxLength ? metadataDefaultString.maxLength : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <textarea\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"10\"\n [required]=\"metadata.required\"\n [minlength]=\"metadataTextboxString.minLength ? metadataTextboxString.minLength : null\"\n [maxlength]=\"metadataTextboxString.maxLength ? metadataTextboxString.maxLength : null\"\n >\n </textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [matAutocomplete]=\"auto\"\n (keyup)=\"filterAutocompleteStrings(entity[propertyKey])\"\n [required]=\"metadata.required\"\n [minlength]=\"metadataAutocompleteString.minLength ? metadataAutocompleteString.minLength : null\"\n [maxlength]=\"metadataAutocompleteString.maxLength ? metadataAutocompleteString.maxLength : null\"\n [pattern]=\"metadataAutocompleteString.regex ? metadataAutocompleteString.regex : '[\\\\s\\\\S]*'\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let value of filteredAutocompleteStrings\" [value]=\"value\">\n {{value}}\n </mat-option>\n </mat-autocomplete>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required\">\n <mat-option *ngFor=\"let value of metadataDropdownString.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <mat-form-field>\n <mat-checkbox [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required\">\n {{metadata.displayName}}\n </mat-checkbox>\n <!-- hidden input is needed so that the checkbox can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <mat-form-field>\n <mat-slide-toggle [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required\">\n {{metadata.displayName}}\n </mat-slide-toggle>\n <!-- hidden input is needed so that the toggle can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required\">\n <mat-option [value]=\"undefined\">-</mat-option>\n <mat-option [value]=\"true\">{{metadataDropdownBoolean.dropdownTrue}}</mat-option>\n <mat-option [value]=\"false\">{{metadataDropdownBoolean.dropdownFalse}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required\"\n [min]=\"metadataDefaultNumber.min ? metadataDefaultNumber.min : null\"\n [max]=\"metadataDefaultNumber.max ? metadataDefaultNumber.max : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required\">\n <mat-option *ngFor=\"let value of metadataDropdownNumber.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <div class=\"row\">\n <!--\n displays another ngx-material-entity with the:\n object as the entity,\n the current key in the loop received by the keyvalue direction as the propertyKey\n and the getValidationErrorMessage of the current component\n -->\n <ngx-mat-entity-input\n *ngFor=\"let key of getObjectProperties(); let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n class=\"col-lg-{{getWidth(objectProperty, key, 'lg')}} col-md-{{getWidth(objectProperty, key, 'md')}} col-sm-{{getWidth(objectProperty, key, 'sm')}}\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY\">\n <ngx-mat-entity-array-table\n [arrayItems]=\"entityArrayValues\"\n [metadata]=\"metadataEntityArray\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [omit]=\"hideOmitForCreate ? 'create' : 'update'\"\n >\n </ngx-mat-entity-array-table>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_CHIPS\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-list #chipList\n [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\"\n [required]=\"metadata.required\"\n >\n <mat-chip *ngFor=\"let value of stringChipsArrayValues\" (removed)=\"removeStringChipArrayValue(value)\">\n {{value}}\n <button matChipRemove *ngIf=\"metadataStringChipsArray.deleteHtml\" [innerHtml]=\"metadataStringChipsArray.deleteHtml\">\n </button>\n <button matChipRemove *ngIf=\"!metadataStringChipsArray.deleteHtml\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input matInput\n [matChipInputFor]=\"chipList\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addStringChipArrayValue($event)\"\n [(ngModel)]=\"chipsInput\" [name]=\"propertyKey.toString()\" #chipsModel=\"ngModel\"\n [minlength]='metadataStringChipsArray.minLength ? metadataStringChipsArray.minLength : null'\n [maxlength]='metadataStringChipsArray.maxLength ? metadataStringChipsArray.maxLength : null'\n [pattern]=\"metadataStringChipsArray.regex ? metadataStringChipsArray.regex : '[\\\\s\\\\S]*'\"\n >\n <mat-error *ngIf=\"chipsModel.errors\">{{getValidationErrorMessage(chipsModel)}}</mat-error>\n </mat-chip-list>\n <mat-error *ngIf=\"!chipsModel.errors\">{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-list #chipList\n [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\"\n [required]=\"metadata.required\"\n >\n <mat-chip *ngFor=\"let value of stringChipsArrayValues\" (removed)=\"removeStringChipArrayValue(value)\">\n {{value}}\n <button matChipRemove *ngIf=\"metadataStringChipsArray.deleteHtml\" [innerHtml]=\"metadataStringChipsArray.deleteHtml\">\n </button>\n <button matChipRemove *ngIf=\"!metadataStringChipsArray.deleteHtml\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input matInput\n [matChipInputFor]=\"chipList\"\n [matAutocomplete]=\"auto\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addStringChipArrayValue($event)\"\n (keyup)=\"filterAutocompleteStrings(chipsInput)\"\n [(ngModel)]=\"chipsInput\" [name]=\"propertyKey.toString()\" #chipsModel=\"ngModel\"\n #chipsElement\n [minlength]='metadataStringChipsArray.minLength ? metadataStringChipsArray.minLength : null'\n [maxlength]='metadataStringChipsArray.maxLength ? metadataStringChipsArray.maxLength : null'\n [pattern]=\"metadataStringChipsArray.regex ? metadataStringChipsArray.regex : '[\\\\s\\\\S]*'\"\n >\n <mat-error *ngIf=\"chipsModel.errors\">{{getValidationErrorMessage(chipsModel)}}</mat-error>\n </mat-chip-list>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event, chipsElement)\">\n <mat-option *ngFor=\"let value of filteredAutocompleteStrings\" [value]=\"value\">\n {{value}}\n </mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"!chipsModel.errors\">{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}}is not known.</div>\n</div>", styles: ["mat-form-field{width:100%}\n"] }]
144
- }], ctorParameters: function () { return []; }, propDecorators: { entity: [{
235
+ args: [{ selector: 'ngx-mat-entity-input', template: "<div [ngSwitch]=\"type\" *ngIf=\"!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)\">\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.STRING\">\n <string-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></string-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <string-textbox-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></string-textbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <string-autocomplete-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></string-autocomplete-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <string-dropdown-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></string-dropdown-input>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <boolean-checkbox-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></boolean-checkbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <boolean-toggle-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></boolean-toggle-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <boolean-dropdown-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></boolean-dropdown-input>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <number-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></number-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <number-dropdown-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></number-dropdown-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <div class=\"row\" *ngFor=\"let row of objectPropertyRows\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n class=\"col-lg-{{EntityUtilities.getWidth(objectProperty, key, 'lg')}} col-md-{{EntityUtilities.getWidth(objectProperty, key, 'md')}} col-sm-{{EntityUtilities.getWidth(objectProperty, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div class=\"entityArray\" *ngSwitchCase=\"DecoratorTypes.ARRAY\">\n <div class=\"mat-elevation-z8\" style=\"border-radius: 5px;padding: 15px;margin-bottom: 15px;margin-top: 15px;\">\n <div style=\"padding-bottom: 10px\">\n <b>{{metadataEntityArray.displayName}}</b>\n </div>\n <div *ngIf=\"metadataEntityArray.createInline\">\n <div class=\"row\" *ngFor=\"let row of arrayItemInlineRows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n \n <div class=\"buttons\">\n <button mat-raised-button\n [disabled]=\"metadataEntityArray.createInline && !isArrayItemValid\"\n (click)=\"addEntity()\">\n {{metadataEntityArray.addButtonLabel}}\n </button>\n <button mat-raised-button\n [disabled]=\"!selection.selected.length\"\n (click)=\"remove(selection, entityArrayValues, dataSource)\">\n {{metadataEntityArray.removeButtonLabel}}\n </button>\n </div>\n \n <mat-table [dataSource]=\"dataSource\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox [disabled]=\"!dataSource.data.length\" (change)=\"$event ? masterToggle(selection, dataSource) : null\" [checked]=\"selection.hasValue() && isAllSelected(selection, dataSource)\" [indeterminate]=\"selection.hasValue() && !isAllSelected(selection, dataSource)\"></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let module\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(module) : null\" [checked]=\"selection.isSelected(module)\"></mat-checkbox>\n </mat-cell>\n </ng-container>\n \n <ng-container *ngFor=\"let dCol of metadataEntityArray.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell class=\"entity\" *matCellDef=\"let entity\">\n {{dCol.value(entity)}}\n </mat-cell>\n </ng-container>\n \n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n </mat-table>\n \n <div class=\"array-error\" *ngIf=\"metadataEntityArray.required && !dataSource.data.length\">\n {{metadataEntityArray.missingErrorMessage}}\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE\">\n <array-date-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></array-date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_TIME\">\n <array-date-time-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></array-date-time-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_RANGE\">\n <array-date-range-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></array-date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_CHIPS\">\n <array-string-chips-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></array-string-chips-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS\">\n <array-string-autocomplete-chips (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></array-string-autocomplete-chips>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Dates-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.DATE\">\n <date-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_RANGE\">\n <date-range-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_TIME\">\n <date-time-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></date-time-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Files-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.FILE_DEFAULT\">\n <file-default-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></file-default-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.FILE_IMAGE\">\n <file-image-input (inputChangeEvent)=\"emitChange()\" [entity]=\"internalEntity\" [key]=\"internalPropertyKey\" [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"></file-image-input>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}} is not known.</div>\n</div>\n\n<!--------------------------------------------------------->\n<!--------------------Add Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #addArrayItemDialog>\n <h2 mat-dialog-title>{{dialogData.createDialogData.title}}</h2>\n\n <mat-dialog-content>\n <form #form=\"ngForm\" class=\"row\">\n <div class=\"row\" *ngFor=\"let row of arrayItemDialogRows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"dialogData.entity\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"dialogData.getValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(dialogData.entity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(dialogData.entity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(dialogData.entity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsDialogArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </form>\n </mat-dialog-content>\n\n <mat-dialog-actions>\n <button mat-raised-button (click)=\"addArrayItem()\" [disabled]=\"!isDialogArrayItemValid\">\n {{dialogData.createDialogData.createButtonLabel}}\n </button>\n <button mat-raised-button (click)=\"cancelAddArrayItem()\" class=\"cancel-button\">\n {{dialogData.createDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n\n</ng-template>", styles: ["mat-form-field{width:100%}.entityArray .buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px}.entityArray mat-table{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:25px}.entityArray .mat-column-select{flex:0 0 75px}.entityArray .array-error{display:flex;align-items:center;justify-content:center;margin-top:-25.8px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:25.8px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}\n"] }]
236
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }]; }, propDecorators: { entity: [{
145
237
  type: Input
146
238
  }], propertyKey: [{
147
239
  type: Input
@@ -151,5 +243,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
151
243
  type: Input
152
244
  }], hideOmitForEdit: [{
153
245
  type: Input
246
+ }], inputChangeEvent: [{
247
+ type: Output
248
+ }], addArrayItemDialog: [{
249
+ type: ViewChild,
250
+ args: ['addArrayItemDialog']
154
251
  }] } });
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9pbnB1dC9pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2lucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHckYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBYW5DLE1BQU0sT0FBTywwQkFBMEI7SUFpRW5DO1FBUkEsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUlmLG1CQUFjLEdBQUcsY0FBYyxDQUFDO1FBRXpDLGFBQVEsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDO0lBRXJCLENBQUM7SUFFaEIsU0FBUyxDQUFDLEtBQWM7UUFDcEIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUMzRDtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztTQUNoRTtRQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLGVBQWUs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QUNJLHNCQUFzQjswRUFVaEMsTUFBTTtzQkFETCxLQUFLO2dCQU9OLFdBQVc7c0JBRFYsS0FBSztnQkFPTix5QkFBeUI7c0JBRHhCLEtBQUs7Z0JBUU4saUJBQWlCO3NCQURoQixLQUFLO2dCQVFOLGVBQWU7c0JBRGQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZW50aXR5LXV0aWxpdGllcy5jbGFzcyc7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2VudGl0eS1tb2RlbC5jbGFzcyc7XG5pbXBvcnQgeyBEZWNvcmF0b3JUeXBlcyB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvYmFzZS9kZWNvcmF0b3ItdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vZ2V0LXZhbGlkYXRpb24tZXJyb3ItbWVzc2FnZS5mdW5jdGlvbic7XG5pbXBvcnQgeyBNYXRDaGlwSW5wdXRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVN0cmluZ0NoaXBzQXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgU3RyaW5nQ2hpcHNBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9hcnJheS9hcnJheS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEcm9wZG93bkJvb2xlYW5EZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvYm9vbGVhbi9ib29sZWFuLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERlZmF1bHROdW1iZXJEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgRHJvcGRvd25OdW1iZXJEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvbnVtYmVyL251bWJlci1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL29iamVjdC9vYmplY3QtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgQXV0b2NvbXBsZXRlU3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIERlZmF1bHRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgRHJvcGRvd25TdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgVGV4dGJveFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9zdHJpbmcvc3RyaW5nLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2Jhc2UvcHJvcGVydHktZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1tYXQtZW50aXR5LWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2lucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmd4TWF0RW50aXR5SW5wdXRDb21wb25lbnQ8RW50aXR5VHlwZSBleHRlbmRzIEVudGl0eT4gaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbnRpdHkgb24gd2hpY2ggdGhlIHByb3BlcnR5IGV4aXN0cy4gVXNlZCBpbiBjb25qdWN0aW9uIHdpdGggdGhlIFwicHJvcGVydHlLZXlcIlxuICAgICAqIHRvIGRldGVybWluZSB0aGUgcHJvcGVydHkgZm9yIHdoaWNoIHRoZSBpbnB1dCBzaG91bGQgYmUgZ2VuZXJhdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZW50aXR5ITogRW50aXR5VHlwZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBnZW5lcmF0ZSB0aGUgaW5wdXQgZm9yLiBVc2VkIGluIGNvbmp1Y3Rpb24gd2l0aCB0aGUgXCJlbnRpdHlcIi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHByb3BlcnR5S2V5IToga2V5b2YgRW50aXR5VHlwZTtcblxuICAgIC8qKlxuICAgICAqIChvcHRpb25hbCkgQSBjdXN0b20gZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIGVycm9yLW1lc3NhZ2UgZm9yIGludmFsaWQgaW5wdXRzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSE6IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBoaWRlIGEgdmFsdWUgaWYgaXQgaXMgb21pdHRlZCBmb3IgY3JlYXRpb24uXG4gICAgICogSXMgdXNlZCBpbnRlcm5hbGx5IGZvciB0aGUgb2JqZWN0IHByb3BlcnR5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlkZU9taXRGb3JDcmVhdGU/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBoaWRlIGEgdmFsdWUgaWYgaXQgaXMgb21pdHRlZCBmb3IgZWRpdGluZy5cbiAgICAgKiBJcyB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBoaWRlT21pdEZvckVkaXQ/OiBib29sZWFuO1xuXG4gICAgdHlwZSE6IERlY29yYXRvclR5cGVzO1xuXG4gICAgbWV0YWRhdGEhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuXG4gICAgbWV0YWRhdGFEZWZhdWx0U3RyaW5nITogRGVmYXVsdFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgIG1ldGFkYXRhVGV4dGJveFN0cmluZyE6IFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICBtZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZyE6IEF1dG9jb21wbGV0ZVN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgIGF1dG9jb21wbGV0ZVN0cmluZ3MhOiBzdHJpbmdbXTtcbiAgICBmaWx0ZXJlZEF1dG9jb21wbGV0ZVN0cmluZ3MhOiBzdHJpbmdbXTtcbiAgICBtZXRhZGF0YURyb3Bkb3duU3RyaW5nITogRHJvcGRvd25TdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcblxuICAgIG1ldGFkYXRhRHJvcGRvd25Cb29sZWFuITogRHJvcGRvd25Cb29sZWFuRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG5cbiAgICBtZXRhZGF0YURlZmF1bHROdW1iZXIhOiBEZWZhdWx0TnVtYmVyRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgbWV0YWRhdGFEcm9wZG93bk51bWJlciE6IERyb3Bkb3duTnVtYmVyRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG5cbiAgICBtZXRhZGF0YURlZmF1bHRPYmplY3QhOiBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT47XG4gICAgb2JqZWN0UHJvcGVydHkhOiBFbnRpdHk7XG5cbiAgICBtZXRhZGF0YUVudGl0eUFycmF5ITogRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHk+O1xuICAgIGVudGl0eUFycmF5VmFsdWVzITogRW50aXR5W107XG4gICAgbWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5ITogU3RyaW5nQ2hpcHNBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgIHN0cmluZ0NoaXBzQXJyYXlWYWx1ZXMhOiBzdHJpbmdbXTtcbiAgICBjaGlwc0lucHV0OiBzdHJpbmcgPSAnJztcblxuICAgIG1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nQ2hpcHNBcnJheSE6IEF1dG9jb21wbGV0ZVN0cmluZ0NoaXBzQXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcblxuICAgIHJlYWRvbmx5IERlY29yYXRvclR5cGVzID0gRGVjb3JhdG9yVHlwZXM7XG5cbiAgICBnZXRXaWR0aCA9IEVudGl0eVV0aWxpdGllcy5nZXRXaWR0aDtcblxuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHRyYWNrQnlGbihpbmRleDogdW5rbm93bik6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbnRpdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBJbnB1dCBkYXRhIFwiZW50aXR5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBJbnB1dCBkYXRhIFwicHJvcGVydHlLZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHlwZSA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUodGhpcy5lbnRpdHksIHRoaXMucHJvcGVydHlLZXkpO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEodGhpcy5lbnRpdHksIHRoaXMucHJvcGVydHlLZXksIHRoaXMudHlwZSk7XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YURlZmF1bHRTdHJpbmcgPSB0aGlzLm1ldGFkYXRhIGFzIERlZmF1bHRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgdGhpcy5tZXRhZGF0YVRleHRib3hTdHJpbmcgPSB0aGlzLm1ldGFkYXRhIGFzIFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcblxuICAgICAgICB0aGlzLm1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nID0gdGhpcy5tZXRhZGF0YSBhcyBBdXRvY29tcGxldGVTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJpbmdzID0gdGhpcy5tZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZy5hdXRvY29tcGxldGVWYWx1ZXM7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRBdXRvY29tcGxldGVTdHJpbmdzID0gY2xvbmVEZWVwKHRoaXMuYXV0b2NvbXBsZXRlU3RyaW5ncyk7XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YURyb3Bkb3duU3RyaW5nID0gdGhpcy5tZXRhZGF0YSBhcyBEcm9wZG93blN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuXG4gICAgICAgIHRoaXMubWV0YWRhdGFEcm9wZG93bkJvb2xlYW4gPSB0aGlzLm1ldGFkYXRhIGFzIERyb3Bkb3duQm9vbGVhbkRlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuXG4gICAgICAgIHRoaXMubWV0YWRhdGFEZWZhdWx0TnVtYmVyID0gdGhpcy5tZXRhZGF0YSBhcyBEZWZhdWx0TnVtYmVyRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgICAgIHRoaXMubWV0YWRhdGFEcm9wZG93bk51bWJlciA9IHRoaXMubWV0YWRhdGEgYXMgRHJvcGRvd25OdW1iZXJEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcblxuICAgICAgICB0aGlzLm1ldGFkYXRhRGVmYXVsdE9iamVjdCA9IHRoaXMubWV0YWRhdGEgYXMgRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgICAgICB0aGlzLm9iamVjdFByb3BlcnR5ID0gdGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgdW5rbm93biBhcyBFbnRpdHlUeXBlO1xuXG4gICAgICAgIHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheSA9IHRoaXMubWV0YWRhdGEgYXMgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHk+O1xuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LkVudGl0eUNsYXNzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldKSB7XG4gICAgICAgICAgICAgICAgKHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIHVua25vd24gYXMgRW50aXR5W10pID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVudGl0eUFycmF5VmFsdWVzID0gdGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgdW5rbm93biBhcyBFbnRpdHlbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZUlubGluZSAmJiAhdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZURpYWxvZ0RhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlRGlhbG9nRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdBZGQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkgPSB0aGlzLm1ldGFkYXRhIGFzIFN0cmluZ0NoaXBzQXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkuaXRlbVR5cGVcbiAgICAgICAgICAgICYmICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duIGFzIHN0cmluZ1tdKT8ubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zdHJpbmdDaGlwc0FycmF5VmFsdWVzID0gKHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIHVua25vd24gYXMgc3RyaW5nW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZ0NoaXBzQXJyYXkgPSB0aGlzLm1ldGFkYXRhIGFzIEF1dG9jb21wbGV0ZVN0cmluZ0NoaXBzQXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcblxuICAgICAgICBpZiAoIXRoaXMuZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5nZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlID0gZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE9iamVjdFByb3BlcnRpZXMoKTogKGtleW9mIEVudGl0eSlbXSB7XG4gICAgICAgIGNvbnN0IHJlczogKGtleW9mIEVudGl0eSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMub2JqZWN0UHJvcGVydHkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoXG4gICAgICAgICAgICAgICAgdGhpcy5vYmplY3RQcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSBhcyBrZXlvZiBFbnRpdHksXG4gICAgICAgICAgICAgICAgRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5VHlwZSh0aGlzLm9iamVjdFByb3BlcnR5LCBwcm9wZXJ0eSBhcyBrZXlvZiBFbnRpdHkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICEodGhpcy5oaWRlT21pdEZvckNyZWF0ZSAmJiBtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlKVxuICAgICAgICAgICAgICAgICYmICEodGhpcy5oaWRlT21pdEZvckVkaXQgJiYgbWV0YWRhdGEub21pdEZvclVwZGF0ZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHByb3BlcnR5IGFzIGtleW9mIEVudGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcy5zb3J0KChhLCBiKSA9PiBFbnRpdHlVdGlsaXRpZXMuY29tcGFyZU9yZGVyKGEsIGIsIHRoaXMub2JqZWN0UHJvcGVydHkpKTtcbiAgICB9XG5cbiAgICBhZGRTdHJpbmdDaGlwQXJyYXlWYWx1ZShldmVudDogTWF0Q2hpcElucHV0RXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWluTGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA8IHRoaXMubWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5Lm1pbkxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5tYXhMZW5ndGggJiYgdmFsdWUubGVuZ3RoID4gdGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5LnJlZ2V4ICAmJiAhdmFsdWUubWF0Y2godGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkucmVnZXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnN0cmluZ0NoaXBzQXJyYXlWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIHVua25vd24gYXMgc3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIHVua25vd24gYXMgc3RyaW5nW10pID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3RyaW5nQ2hpcHNBcnJheVZhbHVlcyA9IHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIHVua25vd24gYXMgc3RyaW5nW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0cmluZ0NoaXBzQXJyYXlWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQuY2hpcElucHV0IS5jbGVhcigpO1xuICAgIH1cblxuICAgIHJlbW92ZVN0cmluZ0NoaXBBcnJheVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdHJpbmdDaGlwc0FycmF5VmFsdWVzLnNwbGljZSh0aGlzLnN0cmluZ0NoaXBzQXJyYXlWYWx1ZXMuaW5kZXhPZih2YWx1ZSksIDEpO1xuICAgICAgICBpZiAoIXRoaXMuc3RyaW5nQ2hpcHNBcnJheVZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duKSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc3RyaW5nQ2hpcHNBcnJheVZhbHVlcyA9IHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIHVua25vd24gYXMgc3RyaW5nW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgY2hpcHNJbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChldmVudC5vcHRpb24udmlld1ZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5taW5MZW5ndGggJiYgdmFsdWUubGVuZ3RoIDwgdGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWluTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5Lm1heExlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiB0aGlzLm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkucmVnZXggICYmICF2YWx1ZS5tYXRjaCh0aGlzLm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5yZWdleCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc3RyaW5nQ2hpcHNBcnJheVZhbHVlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgKHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIHVua25vd24gYXMgc3RyaW5nW10pID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0cmluZ0NoaXBzQXJyYXlWYWx1ZXMgPSB0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duIGFzIHN0cmluZ1tdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyaW5nQ2hpcHNBcnJheVZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgY2hpcHNJbnB1dC52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGZpbHRlckF1dG9jb21wbGV0ZVN0cmluZ3MoaW5wdXQ6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSAoaW5wdXQgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB0aGlzLmZpbHRlcmVkQXV0b2NvbXBsZXRlU3RyaW5ncyA9IHRoaXMuYXV0b2NvbXBsZXRlU3RyaW5ncy5maWx0ZXIocyA9PiBzLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKTtcbiAgICB9XG59IiwiPGRpdiBbbmdTd2l0Y2hdPVwidHlwZVwiICpuZ0lmPVwiIShoaWRlT21pdEZvckNyZWF0ZSAmJiBtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlKSAmJiAhKGhpZGVPbWl0Rm9yRWRpdCAmJiBtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlKVwiPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLVN0cmluZ3MtLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLlNUUklOR1wiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cInByb3BlcnR5S2V5LnRvU3RyaW5nKClcIlxuICAgICAgICAgICAgICAgICNtb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJtZXRhZGF0YS5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwibWV0YWRhdGFEZWZhdWx0U3RyaW5nLnJlZ2V4ID8gbWV0YWRhdGFEZWZhdWx0U3RyaW5nLnJlZ2V4IDogJ1tcXFxcc1xcXFxTXSonXCJcbiAgICAgICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1ldGFkYXRhRGVmYXVsdFN0cmluZy5taW5MZW5ndGggPyBtZXRhZGF0YURlZmF1bHRTdHJpbmcubWluTGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtZXRhZGF0YURlZmF1bHRTdHJpbmcubWF4TGVuZ3RoID8gbWV0YWRhdGFEZWZhdWx0U3RyaW5nLm1heExlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5TVFJJTkdfVEVYVEJPWFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cInByb3BlcnR5S2V5LnRvU3RyaW5nKClcIlxuICAgICAgICAgICAgICAgICNtb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAgICAgICBjZGtBdXRvc2l6ZU1pblJvd3M9XCIxMFwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1ldGFkYXRhVGV4dGJveFN0cmluZy5taW5MZW5ndGggPyBtZXRhZGF0YVRleHRib3hTdHJpbmcubWluTGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtZXRhZGF0YVRleHRib3hTdHJpbmcubWF4TGVuZ3RoID8gbWV0YWRhdGFUZXh0Ym94U3RyaW5nLm1heExlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5TVFJJTkdfQVVUT0NPTVBMRVRFXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZW50aXR5W3Byb3BlcnR5S2V5XVwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiXG4gICAgICAgICAgICAgICAgI21vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiZmlsdGVyQXV0b2NvbXBsZXRlU3RyaW5ncyhlbnRpdHlbcHJvcGVydHlLZXldKVwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLm1pbkxlbmd0aCA/IG1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLm1pbkxlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgICAgIFttYXhsZW5ndGhdPVwibWV0YWRhdGFBdXRvY29tcGxldGVTdHJpbmcubWF4TGVuZ3RoID8gbWV0YWRhdGFBdXRvY29tcGxldGVTdHJpbmcubWF4TGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwibWV0YWRhdGFBdXRvY29tcGxldGVTdHJpbmcucmVnZXggPyBtZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZy5yZWdleCA6ICdbXFxcXHNcXFxcU10qJ1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgZmlsdGVyZWRBdXRvY29tcGxldGVTdHJpbmdzXCIgW3ZhbHVlXT1cInZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7dmFsdWV9fVxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5TVFJJTkdfRFJPUERPV05cIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e21ldGFkYXRhLmRpc3BsYXlOYW1lfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwiZW50aXR5W3Byb3BlcnR5S2V5XVwiIFtuYW1lXT1cInByb3BlcnR5S2V5LnRvU3RyaW5nKClcIiAjbW9kZWw9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHZhbHVlIG9mIG1ldGFkYXRhRHJvcGRvd25TdHJpbmcuZHJvcGRvd25WYWx1ZXNcIiBbdmFsdWVdPVwidmFsdWUudmFsdWVcIj57e3ZhbHVlLmRpc3BsYXlOYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tQm9vbGVhbnMtLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9DSEVDS0JPWFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94IFsobmdNb2RlbCldPVwiZW50aXR5W3Byb3BlcnR5S2V5XVwiIFtuYW1lXT1cInByb3BlcnR5S2V5LnRvU3RyaW5nKClcIiAjbW9kZWw9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIGlucHV0IGlzIG5lZWRlZCBzbyB0aGF0IHRoZSBjaGVja2JveCBjYW4gYmUgdXNlZCBpbnNpZGUgYSBtYXQtZm9ybS1maWVsZCAtLT5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBoaWRkZW4+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5CT09MRUFOX1RPR0dMRVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIiBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCIgI21vZGVsPVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJtZXRhZGF0YS5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgIHt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fVxuICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICAgICAgPCEtLSBoaWRkZW4gaW5wdXQgaXMgbmVlZGVkIHNvIHRoYXQgdGhlIHRvZ2dsZSBjYW4gYmUgdXNlZCBpbnNpZGUgYSBtYXQtZm9ybS1maWVsZCAtLT5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBoaWRkZW4+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5CT09MRUFOX0RST1BET1dOXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIiBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCIgI21vZGVsPVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJtZXRhZGF0YS5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ1bmRlZmluZWRcIj4tPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ0cnVlXCI+e3ttZXRhZGF0YURyb3Bkb3duQm9vbGVhbi5kcm9wZG93blRydWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiZmFsc2VcIj57e21ldGFkYXRhRHJvcGRvd25Cb29sZWFuLmRyb3Bkb3duRmFsc2V9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tTnVtYmVycy0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5OVU1CRVJcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e21ldGFkYXRhLmRpc3BsYXlOYW1lfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlbnRpdHlbcHJvcGVydHlLZXldXCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCJcbiAgICAgICAgICAgICAgICAjbW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIFttaW5dPVwibWV0YWRhdGFEZWZhdWx0TnVtYmVyLm1pbiA/IG1ldGFkYXRhRGVmYXVsdE51bWJlci5taW4gOiBudWxsXCJcbiAgICAgICAgICAgICAgICBbbWF4XT1cIm1ldGFkYXRhRGVmYXVsdE51bWJlci5tYXggPyBtZXRhZGF0YURlZmF1bHROdW1iZXIubWF4IDogbnVsbFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPG1hdC1lcnJvcj57e2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UobW9kZWwpfX08L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLk5VTUJFUl9EUk9QRE9XTlwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJlbnRpdHlbcHJvcGVydHlLZXldXCIgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiICNtb2RlbD1cIm5nTW9kZWxcIiBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgbWV0YWRhdGFEcm9wZG93bk51bWJlci5kcm9wZG93blZhbHVlc1wiIFt2YWx1ZV09XCJ2YWx1ZS52YWx1ZVwiPnt7dmFsdWUuZGlzcGxheU5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLU9iamVjdC0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5PQkpFQ1RcIj5cbiAgICAgICAgPGI+e3ttZXRhZGF0YURlZmF1bHRPYmplY3QuZGlzcGxheU5hbWV9fTwvYj5cbiAgICAgICAgPCEtLSBpdGVyYXRlcyBvdmVyIHRoZSBvYmplY3QgcHJvcGVydGllcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgICAgIGRpc3BsYXlzIGFub3RoZXIgbmd4LW1hdGVyaWFsLWVudGl0eSB3aXRoIHRoZTpcbiAgICAgICAgICAgICAgICBvYmplY3QgYXMgdGhlIGVudGl0eSxcbiAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBrZXkgaW4gdGhlIGxvb3AgcmVjZWl2ZWQgYnkgdGhlIGtleXZhbHVlIGRpcmVjdGlvbiBhcyB0aGUgcHJvcGVydHlLZXlcbiAgICAgICAgICAgICAgICBhbmQgdGhlIGdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2Ugb2YgdGhlIGN1cnJlbnQgY29tcG9uZW50XG4gICAgICAgICAgICAtLT5cbiAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBrZXkgb2YgZ2V0T2JqZWN0UHJvcGVydGllcygpOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIlxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwib2JqZWN0UHJvcGVydHlcIlxuICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJoaWRlT21pdEZvckNyZWF0ZVwiXG4gICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yRWRpdF09XCJoaWRlT21pdEZvckVkaXRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWxnLXt7Z2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ2xnJyl9fSBjb2wtbWQte3tnZXRXaWR0aChvYmplY3RQcm9wZXJ0eSwga2V5LCAnbWQnKX19IGNvbC1zbS17e2dldFdpZHRoKG9iamVjdFByb3BlcnR5LCBrZXksICdzbScpfX1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9uZ3gtbWF0LWVudGl0eS1pbnB1dD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLUFycmF5LS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5BUlJBWVwiPlxuICAgICAgICA8bmd4LW1hdC1lbnRpdHktYXJyYXktdGFibGVcbiAgICAgICAgICAgIFthcnJheUl0ZW1zXT1cImVudGl0eUFycmF5VmFsdWVzXCJcbiAgICAgICAgICAgIFttZXRhZGF0YV09XCJtZXRhZGF0YUVudGl0eUFycmF5XCJcbiAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW29taXRdPVwiaGlkZU9taXRGb3JDcmVhdGUgPyAnY3JlYXRlJyA6ICd1cGRhdGUnXCJcbiAgICAgICAgPlxuICAgICAgICA8L25neC1tYXQtZW50aXR5LWFycmF5LXRhYmxlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0NISVBTXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCAjY2hpcExpc3RcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIiBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCIgI21vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWNoaXAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIHN0cmluZ0NoaXBzQXJyYXlWYWx1ZXNcIiAocmVtb3ZlZCk9XCJyZW1vdmVTdHJpbmdDaGlwQXJyYXlWYWx1ZSh2YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAge3t2YWx1ZX19XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0Q2hpcFJlbW92ZSAqbmdJZj1cIm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5kZWxldGVIdG1sXCIgW2lubmVySHRtbF09XCJtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkuZGVsZXRlSHRtbFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlICpuZ0lmPVwiIW1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5kZWxldGVIdG1sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGRTdHJpbmdDaGlwQXJyYXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjaGlwc0lucHV0XCIgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiICNjaGlwc01vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgIFttaW5sZW5ndGhdPSdtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWluTGVuZ3RoID8gbWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5Lm1pbkxlbmd0aCA6IG51bGwnXG4gICAgICAgICAgICAgICAgICAgIFttYXhsZW5ndGhdPSdtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWF4TGVuZ3RoID8gbWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5Lm1heExlbmd0aCA6IG51bGwnXG4gICAgICAgICAgICAgICAgICAgIFtwYXR0ZXJuXT1cIm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5yZWdleCA/IG1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5yZWdleCA6ICdbXFxcXHNcXFxcU10qJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJjaGlwc01vZGVsLmVycm9yc1wiPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShjaGlwc01vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiIWNoaXBzTW9kZWwuZXJyb3JzXCI+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQVVUT0NPTVBMRVRFX0NISVBTXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCAjY2hpcExpc3RcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIiBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCIgI21vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWNoaXAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIHN0cmluZ0NoaXBzQXJyYXlWYWx1ZXNcIiAocmVtb3ZlZCk9XCJyZW1vdmVTdHJpbmdDaGlwQXJyYXlWYWx1ZSh2YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAge3t2YWx1ZX19XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0Q2hpcFJlbW92ZSAqbmdJZj1cIm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5kZWxldGVIdG1sXCIgW2lubmVySHRtbF09XCJtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkuZGVsZXRlSHRtbFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlICpuZ0lmPVwiIW1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5kZWxldGVIdG1sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGRTdHJpbmdDaGlwQXJyYXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlckF1dG9jb21wbGV0ZVN0cmluZ3MoY2hpcHNJbnB1dClcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNoaXBzSW5wdXRcIiBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCIgI2NoaXBzTW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgI2NoaXBzRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBbbWlubGVuZ3RoXT0nbWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5Lm1pbkxlbmd0aCA/IG1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5taW5MZW5ndGggOiBudWxsJ1xuICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT0nbWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5Lm1heExlbmd0aCA/IG1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5tYXhMZW5ndGggOiBudWxsJ1xuICAgICAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkucmVnZXggPyBtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkucmVnZXggOiAnW1xcXFxzXFxcXFNdKidcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiY2hpcHNNb2RlbC5lcnJvcnNcIj57e2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UoY2hpcHNNb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtY2hpcC1saXN0PlxuICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwic2VsZWN0ZWQoJGV2ZW50LCBjaGlwc0VsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHZhbHVlIG9mIGZpbHRlcmVkQXV0b2NvbXBsZXRlU3RyaW5nc1wiIFt2YWx1ZV09XCJ2YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAge3t2YWx1ZX19XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cIiFjaGlwc01vZGVsLmVycm9yc1wiPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdTd2l0Y2hEZWZhdWx0PkVSUk9SOiBUaGUgdHlwZSB7e3R5cGV9fWlzIG5vdCBrbm93bi48L2Rpdj5cbjwvZGl2PiJdfQ==
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9pbnB1dC9pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2lucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RyxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBSXJGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsNkJBQTZCLEVBQWtDLE1BQU0sc0NBQXNDLENBQUM7QUFFckgsT0FBTyxFQUFFLFNBQVMsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHaEc7Ozs7Ozs7R0FPRztBQU1ILE1BQU0sT0FBTywwQkFBMEI7SUF1RW5DLFlBQ3FCLE1BQWlCO1FBQWpCLFdBQU0sR0FBTixNQUFN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QjtnR0FVaEMsTUFBTTtzQkFETCxLQUFLO2dCQVFOLFdBQVc7c0JBRFYsS0FBSztnQkFRTix5QkFBeUI7c0JBRHhCLEtBQUs7Z0JBU04saUJBQWlCO3NCQURoQixLQUFLO2dCQVFOLGVBQWU7c0JBRGQsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsTUFBTTtnQkFJUCxrQkFBa0I7c0JBRGpCLFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEVudGl0eVJvdywgRW50aXR5VXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9lbnRpdHkudXRpbGl0aWVzJztcbmltcG9ydCB7IERlY29yYXRvclR5cGVzIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9iYXNlL2RlY29yYXRvci10eXBlcy5lbnVtJztcbmltcG9ydCB7IGdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9nZXQtdmFsaWRhdGlvbi1lcnJvci1tZXNzYWdlLmZ1bmN0aW9uJztcbmltcG9ydCB7IEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2FycmF5L2FycmF5LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvb2JqZWN0L29iamVjdC1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9iYXNlL3Byb3BlcnR5LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IEFkZEFycmF5SXRlbURpYWxvZ0RhdGFCdWlsZGVyLCBBZGRBcnJheUl0ZW1EaWFsb2dEYXRhSW50ZXJuYWwgfSBmcm9tICcuL2FkZC1hcnJheS1pdGVtLWRpYWxvZy1kYXRhLmJ1aWxkZXInO1xuaW1wb3J0IHsgQWRkQXJyYXlJdGVtRGlhbG9nRGF0YSB9IGZyb20gJy4vYWRkLWFycmF5LWl0ZW0tZGlhbG9nLWRhdGEnO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRGF0ZVV0aWxpdGllcyB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZGF0ZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgTG9kYXNoVXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vY2Fwc3VsYXRpb24vbG9kYXNoLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybS1kaWFsb2cvY29uZmlybS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IEJhc2VFbnRpdHlUeXBlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9lbnRpdHkubW9kZWwnO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGlucHV0IGNvbXBvbmVudC4gSXQgZ2V0cyB0aGUgbWV0YWRhdGEgb2YgdGhlIHByb3BlcnR5IGZyb20gdGhlIGdpdmVuIEBJbnB1dCBcImVudGl0eVwiIGFuZCBASW5wdXQgXCJwcm9wZXJ0eUtleVwiXG4gKiBhbmQgZGlzcGxheXMgdGhlIGlucHV0IGZpZWxkIGFjY29yZGluZ2x5LlxuICpcbiAqIFlvdSBjYW4gYWxzbyBkZWZpbmUgYSBtZXRob2QgdGhhdCBnZW5lcmF0ZXMgZXJyb3ItbWVzc2FnZXMgYW5kIGlmIHRoZSBpbnB1dCBzaG91bGQgYmUgaGlkZGVuIHdoZW4gaXRzIG1ldGFkYXRhIHNheXNcbiAqIHRoYXQgaXQgc2hvdWxkIGJlIG9taXR0ZWQgZm9yIGNyZWF0aW5nIG9yIHVwZGF0aW5nLlxuICogVGhlIGxhc3QgcGFydCBiZWluZyBtb3N0bHkgcmVsZXZhbnQgaWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgY29tcG9uZW50IGluc2lkZSBhbiBuZ0Zvci5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3gtbWF0LWVudGl0eS1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbnB1dC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5neE1hdEVudGl0eUlucHV0Q29tcG9uZW50PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4gaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbnRpdHkgb24gd2hpY2ggdGhlIHByb3BlcnR5IGV4aXN0cy4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBcInByb3BlcnR5S2V5XCJcbiAgICAgKiB0byBkZXRlcm1pbmUgdGhlIHByb3BlcnR5IGZvciB3aGljaCB0aGUgaW5wdXQgc2hvdWxkIGJlIGdlbmVyYXRlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGVudGl0eT86IEVudGl0eVR5cGU7XG4gICAgaW50ZXJuYWxFbnRpdHkhOiBFbnRpdHlUeXBlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdlbmVyYXRlIHRoZSBpbnB1dCBmb3IuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgXCJlbnRpdHlcIi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHByb3BlcnR5S2V5Pzoga2V5b2YgRW50aXR5VHlwZTtcbiAgICBpbnRlcm5hbFByb3BlcnR5S2V5IToga2V5b2YgRW50aXR5VHlwZTtcblxuICAgIC8qKlxuICAgICAqIChvcHRpb25hbCkgQSBjdXN0b20gZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIGVycm9yLW1lc3NhZ2UgZm9yIGludmFsaWQgaW5wdXRzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZT86IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nO1xuICAgIGludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSE6IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBoaWRlIGEgdmFsdWUgaWYgaXQgaXMgb21pdHRlZCBmb3IgY3JlYXRpb24uXG4gICAgICogSXMgdXNlZCBpbnRlcm5hbGx5IGZvciB0aGUgb2JqZWN0IHByb3BlcnR5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlkZU9taXRGb3JDcmVhdGU/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBoaWRlIGEgdmFsdWUgaWYgaXQgaXMgb21pdHRlZCBmb3IgZWRpdGluZy5cbiAgICAgKiBJcyB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBoaWRlT21pdEZvckVkaXQ/OiBib29sZWFuO1xuXG4gICAgQE91dHB1dCgpXG4gICAgaW5wdXRDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIEBWaWV3Q2hpbGQoJ2FkZEFycmF5SXRlbURpYWxvZycpXG4gICAgYWRkQXJyYXlJdGVtRGlhbG9nITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gICAgYWRkQXJyYXlJdGVtRGlhbG9nUmVmITogTWF0RGlhbG9nUmVmPHVua25vd24+O1xuXG4gICAgdHlwZSE6IERlY29yYXRvclR5cGVzO1xuICAgIG1ldGFkYXRhITogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcblxuICAgIG1ldGFkYXRhRGVmYXVsdE9iamVjdCE6IERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICBvYmplY3RQcm9wZXJ0eSE6IEVudGl0eVR5cGU7XG4gICAgb2JqZWN0UHJvcGVydHlSb3dzITogRW50aXR5Um93PEVudGl0eVR5cGU+W107XG5cbiAgICBtZXRhZGF0YUVudGl0eUFycmF5ITogRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICBlbnRpdHlBcnJheVZhbHVlcyE6IEVudGl0eVR5cGVbXTtcbiAgICBhcnJheUl0ZW0hOiBFbnRpdHlUeXBlO1xuICAgIHByaXZhdGUgYXJyYXlJdGVtUHJpb3JDaGFuZ2VzITogRW50aXR5VHlwZTtcbiAgICBhcnJheUl0ZW1JbmxpbmVSb3dzITogRW50aXR5Um93PEVudGl0eVR5cGU+W107XG4gICAgZGF0YVNvdXJjZSE6IE1hdFRhYmxlRGF0YVNvdXJjZTxFbnRpdHlUeXBlPjtcbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbk1vZGVsPEVudGl0eVR5cGU+ID0gbmV3IFNlbGVjdGlvbk1vZGVsPEVudGl0eVR5cGU+KHRydWUsIFtdKTtcbiAgICBkaXNwbGF5ZWRDb2x1bW5zITogc3RyaW5nW107XG4gICAgaXNBcnJheUl0ZW1WYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZGlhbG9nSW5wdXREYXRhITogQWRkQXJyYXlJdGVtRGlhbG9nRGF0YTxFbnRpdHlUeXBlPjtcbiAgICBkaWFsb2dEYXRhITogQWRkQXJyYXlJdGVtRGlhbG9nRGF0YUludGVybmFsPEVudGl0eVR5cGU+O1xuICAgIGFycmF5SXRlbURpYWxvZ1Jvd3MhOiBFbnRpdHlSb3c8RW50aXR5VHlwZT5bXTtcbiAgICBpc0RpYWxvZ0FycmF5SXRlbVZhbGlkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICByZWFkb25seSBEZWNvcmF0b3JUeXBlcyA9IERlY29yYXRvclR5cGVzO1xuXG4gICAgRW50aXR5VXRpbGl0aWVzID0gRW50aXR5VXRpbGl0aWVzO1xuICAgIERhdGVVdGlsaXRpZXMgPSBEYXRlVXRpbGl0aWVzO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nOiBNYXREaWFsb2dcbiAgICApIHt9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIGlucHV0cyB0byB3b3JrIGluc2lkZSBhbiBuZ0Zvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgbmdGb3IuXG4gICAgICogQHJldHVybnMgVGhlIGluZGV4LlxuICAgICAqL1xuICAgIHRyYWNrQnlGbihpbmRleDogdW5rbm93bik6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbnRpdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBJbnB1dCBkYXRhIFwiZW50aXR5XCInKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludGVybmFsRW50aXR5ID0gdGhpcy5lbnRpdHk7XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcGVydHlLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIElucHV0IGRhdGEgXCJwcm9wZXJ0eUtleVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnRlcm5hbFByb3BlcnR5S2V5ID0gdGhpcy5wcm9wZXJ0eUtleTtcblxuICAgICAgICB0aGlzLmludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSA9IHRoaXMuZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSA/PyBnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlO1xuXG4gICAgICAgIHRoaXMudHlwZSA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUodGhpcy5lbnRpdHksIHRoaXMucHJvcGVydHlLZXkpO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEodGhpcy5lbnRpdHksIHRoaXMucHJvcGVydHlLZXksIHRoaXMudHlwZSk7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gRGVjb3JhdG9yVHlwZXMuT0JKRUNUKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRPYmplY3RJbnB1dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IERlY29yYXRvclR5cGVzLkFSUkFZKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRFbnRpdHlBcnJheSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RW50aXR5QXJyYXkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheSA9IHRoaXMubWV0YWRhdGEgYXMgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxFbnRpdHlbdGhpcy5pbnRlcm5hbFByb3BlcnR5S2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAodGhpcy5pbnRlcm5hbEVudGl0eVt0aGlzLmludGVybmFsUHJvcGVydHlLZXldIGFzIEVudGl0eVR5cGVbXSkgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVudGl0eUFycmF5VmFsdWVzID0gdGhpcy5pbnRlcm5hbEVudGl0eVt0aGlzLmludGVybmFsUHJvcGVydHlLZXldIGFzIEVudGl0eVR5cGVbXTtcbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lICYmICF0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlRGlhbG9nRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZURpYWxvZ0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdBZGQnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdpdmVuRGlzcGxheUNvbHVtbnM6IHN0cmluZ1tdID0gdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmRpc3BsYXlDb2x1bW5zLm1hcCgodikgPT4gdi5kaXNwbGF5TmFtZSk7XG4gICAgICAgIGlmIChnaXZlbkRpc3BsYXlDb2x1bW5zLmZpbmQocyA9PiBzID09PSAnc2VsZWN0JykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgVGhlIG5hbWUgXCJzZWxlY3RcIiBmb3IgYSBkaXNwbGF5IGNvbHVtbiBpcyByZXNlcnZlZC5cbiAgICAgICAgICAgICAgICBQbGVhc2UgY2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSBbJ3NlbGVjdCddLmNvbmNhdChnaXZlbkRpc3BsYXlDb2x1bW5zKTtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSgpO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZW50aXR5QXJyYXlWYWx1ZXM7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtID0gbmV3IHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5FbnRpdHlDbGFzcygpO1xuICAgICAgICB0aGlzLmFycmF5SXRlbUlubGluZVJvd3MgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5Um93cyhcbiAgICAgICAgICAgIHRoaXMuYXJyYXlJdGVtLFxuICAgICAgICAgICAgdGhpcy5oaWRlT21pdEZvckNyZWF0ZSA/PyB0cnVlLFxuICAgICAgICAgICAgdGhpcy5oaWRlT21pdEZvckVkaXRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hcnJheUl0ZW1QcmlvckNoYW5nZXMgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMuYXJyYXlJdGVtKTtcblxuICAgICAgICB0aGlzLmRpYWxvZ0lucHV0RGF0YSA9IHtcbiAgICAgICAgICAgIGVudGl0eTogdGhpcy5hcnJheUl0ZW0sXG4gICAgICAgICAgICBjcmVhdGVEaWFsb2dEYXRhOiB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlRGlhbG9nRGF0YSxcbiAgICAgICAgICAgIGdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2U6IHRoaXMuZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRpYWxvZ0RhdGEgPSBuZXcgQWRkQXJyYXlJdGVtRGlhbG9nRGF0YUJ1aWxkZXIodGhpcy5kaWFsb2dJbnB1dERhdGEpLmdldFJlc3VsdCgpO1xuICAgICAgICB0aGlzLmFycmF5SXRlbURpYWxvZ1Jvd3MgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5Um93cyh0aGlzLmRpYWxvZ0RhdGEuZW50aXR5LCB0cnVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRPYmplY3RJbnB1dCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YURlZmF1bHRPYmplY3QgPSB0aGlzLm1ldGFkYXRhIGFzIERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICAgICAgdGhpcy5vYmplY3RQcm9wZXJ0eSA9IHRoaXMuaW50ZXJuYWxFbnRpdHlbdGhpcy5pbnRlcm5hbFByb3BlcnR5S2V5XSBhcyBFbnRpdHlUeXBlO1xuICAgICAgICB0aGlzLm9iamVjdFByb3BlcnR5Um93cyA9IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlSb3dzKHRoaXMub2JqZWN0UHJvcGVydHksIHRoaXMuaGlkZU9taXRGb3JDcmVhdGUsIHRoaXMuaGlkZU9taXRGb3JFZGl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGFycmF5SXRlbSBpcyB2YWxpZC5cbiAgICAgKi9cbiAgICBjaGVja0lzQXJyYXlJdGVtVmFsaWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNBcnJheUl0ZW1WYWxpZCA9IEVudGl0eVV0aWxpdGllcy5pc0VudGl0eVZhbGlkKHRoaXMuYXJyYXlJdGVtLCAnY3JlYXRlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBhcnJheUl0ZW0gaW5zaWRlIHRoZSBkaWFsb2cgaXMgdmFsaWQuXG4gICAgICovXG4gICAgY2hlY2tJc0RpYWxvZ0FycmF5SXRlbVZhbGlkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRGlhbG9nQXJyYXlJdGVtVmFsaWQgPSBFbnRpdHlVdGlsaXRpZXMuaXNFbnRpdHlWYWxpZCh0aGlzLmRpYWxvZ0RhdGEuZW50aXR5LCAnY3JlYXRlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgdGhhdCBhIHRoZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgICAqL1xuICAgIGVtaXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2VFdmVudC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gYWRkIGFuIGl0ZW0gdG8gdGhlIGVudGl0eSBhcnJheS5cbiAgICAgKiBEb2VzIHRoaXMgZWl0aGVyIGlubGluZSBpZiB0aGUgXCJjcmVhdGVJbmxpbmVcIi1tZXRhZGF0YSBpcyBzZXQgdG8gdHJ1ZVxuICAgICAqIG9yIGluIGEgc2VwYXJhdGUgZGlhbG9nIGlmIGl0IGlzIHNldCB0byBmYWxzZS5cbiAgICAgKi9cbiAgICBhZGRFbnRpdHkoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5hbGxvd0R1cGxpY2F0ZXNcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmVudGl0eUFycmF5VmFsdWVzLmZpbmQoYXN5bmMgdiA9PlxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbCh0aGlzLmFycmF5SXRlbSwgdiwgdGhpcy5tZXRhZGF0YSwgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5Lml0ZW1UeXBlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuZHVwbGljYXRlc0Vycm9yRGlhbG9nLFxuICAgICAgICAgICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbnRpdHlBcnJheVZhbHVlcy5wdXNoKExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5hcnJheUl0ZW0pKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5lbnRpdHlBcnJheVZhbHVlcztcbiAgICAgICAgICAgIEVudGl0eVV0aWxpdGllcy5yZXNldENoYW5nZXNPbkVudGl0eSh0aGlzLmFycmF5SXRlbSwgdGhpcy5hcnJheUl0ZW1QcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZEFycmF5SXRlbURpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBcnJheUl0ZW1EaWFsb2csXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLmRpYWxvZ0RhdGEsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYXJyYXkgaXRlbSBkZWZpbmVkIGluIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgYWRkQXJyYXlJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZEFycmF5SXRlbURpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgICB0aGlzLmVudGl0eUFycmF5VmFsdWVzLnB1c2goTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSkpO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZW50aXR5QXJyYXlWYWx1ZXM7XG4gICAgICAgIEVudGl0eVV0aWxpdGllcy5yZXNldENoYW5nZXNPbkVudGl0eSh0aGlzLmFycmF5SXRlbSwgdGhpcy5hcnJheUl0ZW1QcmlvckNoYW5nZXMpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGFkZGluZyB0aGUgYXJyYXkgaXRlbSBkZWZpbmVkIGluIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgY2FuY2VsQWRkQXJyYXlJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZEFycmF5SXRlbURpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgICBFbnRpdHlVdGlsaXRpZXMucmVzZXRDaGFuZ2VzT25FbnRpdHkodGhpcy5hcnJheUl0ZW0sIHRoaXMuYXJyYXlJdGVtUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgZW50cmllcyBmcm9tIHRoZSBlbnRpdHkgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIC0gVGhlIHNlbGVjdGlvbiBjb250YWluaW5nIHRoZSBpdGVtcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHZhbHVlcyAtIFRoZSB2YWx1ZXMgb2YgdGhlIGRhdGFTb3VyY2UuXG4gICAgICogQHBhcmFtIGRhdGFTb3VyY2UgLSBUaGUgZGF0YVNvdXJjZS5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJlbW92ZShzZWxlY3Rpb246IFNlbGVjdGlvbk1vZGVsPGFueT4sIHZhbHVlczogYW55W10sIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KTogdm9pZCB7XG4gICAgICAgIHNlbGVjdGlvbi5zZWxlY3RlZC5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgdmFsdWVzLnNwbGljZSh2YWx1ZXMuaW5kZXhPZihzKSwgMSk7XG4gICAgICAgIH0pO1xuICAgICAgICBkYXRhU291cmNlLmRhdGEgPSB2YWx1ZXM7XG4gICAgICAgIHNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIGFsbCBhcnJheS1pdGVtcyBpbiB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIC0gVGhlIHNlbGVjdGlvbiB0byB0b2dnbGUuXG4gICAgICogQHBhcmFtIGRhdGFTb3VyY2UgLSBUaGUgZGF0YVNvdXJjZSBvZiB0aGUgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbWFzdGVyVG9nZ2xlKHNlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8YW55PiwgZGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPGFueT4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZChzZWxlY3Rpb24sIGRhdGFTb3VyY2UpKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFTb3VyY2UuZGF0YS5mb3JFYWNoKHJvdyA9PiBzZWxlY3Rpb24uc2VsZWN0KHJvdykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFsbCBhcnJheS1pdGVtcyBpbiB0aGUgdGFibGUgaGF2ZSBiZWVuIHNlbGVjdGVkLlxuICAgICAqIFRoaXMgaXMgbmVlZGVkIHRvIGRpc3BsYXkgdGhlIFwibWFzdGVyVG9nZ2xlXCItY2hlY2tib3ggY29ycmVjdGx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbiAtIFRoZSBzZWxlY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHBhcmFtIGRhdGFTb3VyY2UgLSBUaGUgZGF0YVNvdXJjZSBvZiB0aGUgc2VsZWN0aW9uLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IGFsbCBhcnJheS1pdGVtcyBpbiB0aGUgdGFibGUgaGF2ZSBiZWVuIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaXNBbGxTZWxlY3RlZChzZWxlY3Rpb246IFNlbGVjdGlvbk1vZGVsPGFueT4sIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG51bVNlbGVjdGVkID0gc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbnVtUm93cyA9IGRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcbiAgICB9XG59IiwiPGRpdiBbbmdTd2l0Y2hdPVwidHlwZVwiICpuZ0lmPVwiIShoaWRlT21pdEZvckNyZWF0ZSAmJiBtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlKSAmJiAhKGhpZGVPbWl0Rm9yRWRpdCAmJiBtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlKVwiPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLVN0cmluZ3MtLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLlNUUklOR1wiPlxuICAgICAgICA8c3RyaW5nLWlucHV0IChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIiBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIiBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIj48L3N0cmluZy1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5TVFJJTkdfVEVYVEJPWFwiPlxuICAgICAgICA8c3RyaW5nLXRleHRib3gtaW5wdXQgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCIgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiPjwvc3RyaW5nLXRleHRib3gtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuU1RSSU5HX0FVVE9DT01QTEVURVwiPlxuICAgICAgICA8c3RyaW5nLWF1dG9jb21wbGV0ZS1pbnB1dCAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIiBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCIgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCIgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCI+PC9zdHJpbmctYXV0b2NvbXBsZXRlLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLlNUUklOR19EUk9QRE9XTlwiPlxuICAgICAgICA8c3RyaW5nLWRyb3Bkb3duLWlucHV0IChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIiBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIiBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIj48L3N0cmluZy1kcm9wZG93bi1pbnB1dD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLUJvb2xlYW5zLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkJPT0xFQU5fQ0hFQ0tCT1hcIj5cbiAgICAgICAgPGJvb2xlYW4tY2hlY2tib3gtaW5wdXQgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCIgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiPjwvYm9vbGVhbi1jaGVja2JveC1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5CT09MRUFOX1RPR0dMRVwiPlxuICAgICAgICA8Ym9vbGVhbi10b2dnbGUtaW5wdXQgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCIgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiPjwvYm9vbGVhbi10b2dnbGUtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9EUk9QRE9XTlwiPlxuICAgICAgICA8Ym9vbGVhbi1kcm9wZG93bi1pbnB1dCAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIiBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCIgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCIgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCI+PC9ib29sZWFuLWRyb3Bkb3duLWlucHV0PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLU51bWJlcnMtLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuTlVNQkVSXCI+XG4gICAgICAgIDxudW1iZXItaW5wdXQgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCIgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiPjwvbnVtYmVyLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLk5VTUJFUl9EUk9QRE9XTlwiPlxuICAgICAgICA8bnVtYmVyLWRyb3Bkb3duLWlucHV0IChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIiBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIiBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIj48L251bWJlci1kcm9wZG93bi1pbnB1dD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tT2JqZWN0LS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLk9CSkVDVFwiPlxuICAgICAgICA8Yj57e21ldGFkYXRhRGVmYXVsdE9iamVjdC5kaXNwbGF5TmFtZX19PC9iPlxuICAgICAgICA8IS0tIGl0ZXJhdGVzIG92ZXIgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBvYmplY3RQcm9wZXJ0eVJvd3NcIj5cbiAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dCAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIlxuICAgICAgICAgICAgICAgIFtlbnRpdHldPVwib2JqZWN0UHJvcGVydHlcIlxuICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cImhpZGVPbWl0Rm9yQ3JlYXRlXCJcbiAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JFZGl0XT1cImhpZGVPbWl0Rm9yRWRpdFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ2xnJyl9fSBjb2wtbWQte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS1BcnJheS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiBjbGFzcz1cImVudGl0eUFycmF5XCIgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkFSUkFZXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXo4XCIgc3R5bGU9XCJib3JkZXItcmFkaXVzOiA1cHg7cGFkZGluZzogMTVweDttYXJnaW4tYm90dG9tOiAxNXB4O21hcmdpbi10b3A6IDE1cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZy1ib3R0b206IDEwcHhcIj5cbiAgICAgICAgICAgICAgICA8Yj57e21ldGFkYXRhRW50aXR5QXJyYXkuZGlzcGxheU5hbWV9fTwvYj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2YgYXJyYXlJdGVtSW5saW5lUm93c1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBrZXkgb2Ygcm93LmtleXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cImFycmF5SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHlLZXldPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1sZy17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ2xnJyl9fSBjb2wtbWQte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnc20nKX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImNoZWNrSXNBcnJheUl0ZW1WYWxpZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWV0YWRhdGFFbnRpdHlBcnJheS5jcmVhdGVJbmxpbmUgJiYgIWlzQXJyYXlJdGVtVmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkRW50aXR5KClcIj5cbiAgICAgICAgICAgICAgICAgICAge3ttZXRhZGF0YUVudGl0eUFycmF5LmFkZEJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmUoc2VsZWN0aW9uLCBlbnRpdHlBcnJheVZhbHVlcywgZGF0YVNvdXJjZSlcIj5cbiAgICAgICAgICAgICAgICAgICAge3ttZXRhZGF0YUVudGl0eUFycmF5LnJlbW92ZUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgICAgIDxtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gc2VsZWN0IENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbZGlzYWJsZWRdPVwiIWRhdGFTb3VyY2UuZGF0YS5sZW5ndGhcIiAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclRvZ2dsZShzZWxlY3Rpb24sIGRhdGFTb3VyY2UpIDogbnVsbFwiIFtjaGVja2VkXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIGlzQWxsU2VsZWN0ZWQoc2VsZWN0aW9uLCBkYXRhU291cmNlKVwiIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFpc0FsbFNlbGVjdGVkKHNlbGVjdGlvbiwgZGF0YVNvdXJjZSlcIj48L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBtb2R1bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShtb2R1bGUpIDogbnVsbFwiIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKG1vZHVsZSlcIj48L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgbWV0YWRhdGFFbnRpdHlBcnJheS5kaXNwbGF5Q29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5kaXNwbGF5TmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tkQ29sLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2VsbCBjbGFzcz1cImVudGl0eVwiICptYXRDZWxsRGVmPVwibGV0IGVudGl0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tkQ29sLnZhbHVlKGVudGl0eSl9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC9tYXQtaGVhZGVyLXJvdz5cbiAgICAgICAgICAgICAgICA8bWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvbWF0LXJvdz5cbiAgICAgICAgICAgIDwvbWF0LXRhYmxlPlxuICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJheS1lcnJvclwiICpuZ0lmPVwibWV0YWRhdGFFbnRpdHlBcnJheS5yZXF1aXJlZCAmJiAhZGF0YVNvdXJjZS5kYXRhLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFFbnRpdHlBcnJheS5taXNzaW5nRXJyb3JNZXNzYWdlfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVcIj5cbiAgICAgICAgPGFycmF5LWRhdGUtaW5wdXQgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCIgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiPjwvYXJyYXktZGF0ZS1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFX1RJTUVcIj5cbiAgICAgICAgPGFycmF5LWRhdGUtdGltZS1pbnB1dCAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIiBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCIgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCIgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCI+PC9hcnJheS1kYXRlLXRpbWUtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9SQU5HRVwiPlxuICAgICAgICA8YXJyYXktZGF0ZS1yYW5nZS1pbnB1dCAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIiBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCIgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCIgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCI+PC9hcnJheS1kYXRlLXJhbmdlLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19DSElQU1wiPlxuICAgICAgICA8YXJyYXktc3RyaW5nLWNoaXBzLWlucHV0IChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIiBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIiBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIj48L2FycmF5LXN0cmluZy1jaGlwcy1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQVVUT0NPTVBMRVRFX0NISVBTXCI+XG4gICAgICAgIDxhcnJheS1zdHJpbmctYXV0b2NvbXBsZXRlLWNoaXBzIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIiBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIiBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIj48L2FycmF5LXN0cmluZy1hdXRvY29tcGxldGUtY2hpcHM+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLURhdGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5EQVRFXCI+XG4gICAgICAgIDxkYXRlLWlucHV0IChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIiBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIiBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIj48L2RhdGUtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuREFURV9SQU5HRVwiPlxuICAgICAgICA8ZGF0ZS1yYW5nZS1pbnB1dCAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIiBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCIgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCIgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCI+PC9kYXRlLXJhbmdlLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkRBVEVfVElNRVwiPlxuICAgICAgICA8ZGF0ZS10aW1lLWlucHV0IChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIiBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIiBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIj48L2RhdGUtdGltZS1pbnB1dD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tRmlsZXMtLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVFwiPlxuICAgICAgICA8ZmlsZS1kZWZhdWx0LWlucHV0IChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIiBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIiBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIj48L2ZpbGUtZGVmYXVsdC1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5GSUxFX0lNQUdFXCI+XG4gICAgICAgIDxmaWxlLWltYWdlLWlucHV0IChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIiBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIiBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIj48L2ZpbGUtaW1hZ2UtaW5wdXQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQ+RVJST1I6IFRoZSB0eXBlIHt7dHlwZX19IGlzIG5vdCBrbm93bi48L2Rpdj5cbjwvZGl2PlxuXG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS1BZGQgQXJyYXkgSXRlbSBEaWFsb2ctLS0tLS0tLS0tLS0tLS0tPlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48bmctdGVtcGxhdGUgI2FkZEFycmF5SXRlbURpYWxvZz5cbiAgICA8aDIgbWF0LWRpYWxvZy10aXRsZT57e2RpYWxvZ0RhdGEuY3JlYXRlRGlhbG9nRGF0YS50aXRsZX19PC9oMj5cblxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgICAgIDxmb3JtICNmb3JtPVwibmdGb3JtXCIgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIGFycmF5SXRlbURpYWxvZ1Jvd3NcIj5cbiAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5c1wiXG4gICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZGlhbG9nRGF0YS5lbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHlLZXldPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJkaWFsb2dEYXRhLmdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1sZy17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChkaWFsb2dEYXRhLmVudGl0eSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChkaWFsb2dEYXRhLmVudGl0eSwga2V5LCAnbWQnKX19IGNvbC1zbS17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChkaWFsb2dEYXRhLmVudGl0eSwga2V5LCAnc20nKX19XCJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tJc0RpYWxvZ0FycmF5SXRlbVZhbGlkKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cblxuICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cImFkZEFycmF5SXRlbSgpXCIgW2Rpc2FibGVkXT1cIiFpc0RpYWxvZ0FycmF5SXRlbVZhbGlkXCI+XG4gICAgICAgICAgICB7e2RpYWxvZ0RhdGEuY3JlYXRlRGlhbG9nRGF0YS5jcmVhdGVCdXR0b25MYWJlbH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJjYW5jZWxBZGRBcnJheUl0ZW0oKVwiIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiPlxuICAgICAgICAgICAge3tkaWFsb2dEYXRhLmNyZWF0ZURpYWxvZ0RhdGEuY2FuY2VsQnV0dG9uTGFiZWx9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cblxuPC9uZy10ZW1wbGF0ZT4iXX0=