@mtna/web-form-angular 0.0.1

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 (170) hide show
  1. package/_index.scss +25 -0
  2. package/bundles/mtna-web-form-angular.umd.js +4982 -0
  3. package/bundles/mtna-web-form-angular.umd.js.map +1 -0
  4. package/esm2015/lib/core/animations.js +8 -0
  5. package/esm2015/lib/core/api-config.js +3 -0
  6. package/esm2015/lib/core/index.js +7 -0
  7. package/esm2015/lib/core/pipes/coerce-date-item.pipe.js +23 -0
  8. package/esm2015/lib/core/pipes/coerce-form-group.pipe.js +35 -0
  9. package/esm2015/lib/core/pipes/date-quarter.pipe.js +43 -0
  10. package/esm2015/lib/core/pipes/get-auto-complete.pipe.js +42 -0
  11. package/esm2015/lib/core/pipes/get-available-quarters.pipe.js +29 -0
  12. package/esm2015/lib/core/pipes/get-form-control-error.pipe.js +20 -0
  13. package/esm2015/lib/core/pipes/get-list-icon.pipe.js +53 -0
  14. package/esm2015/lib/core/pipes/get-object-type.pipe.js +17 -0
  15. package/esm2015/lib/core/pipes/get-selected-option.pipe.js +20 -0
  16. package/esm2015/lib/core/pipes/index.js +71 -0
  17. package/esm2015/lib/core/pipes/items-with-value.pipe.js +30 -0
  18. package/esm2015/lib/core/pipes/sanitize-html.pipe.js +23 -0
  19. package/esm2015/lib/core/services/api.service.js +67 -0
  20. package/esm2015/lib/core/services/form-manager.service.js +465 -0
  21. package/esm2015/lib/core/services/index.js +5 -0
  22. package/esm2015/lib/core/services/ng-form.service.js +150 -0
  23. package/esm2015/lib/core/services/ui.service.js +333 -0
  24. package/esm2015/lib/core/utilities/find-form-control.js +29 -0
  25. package/esm2015/lib/core/utilities/find-form-item.js +25 -0
  26. package/esm2015/lib/core/utilities/flatten-steps.js +10 -0
  27. package/esm2015/lib/core/utilities/generate-form-steps.js +25 -0
  28. package/esm2015/lib/core/utilities/index.js +9 -0
  29. package/esm2015/lib/core/utilities/is-form-group.js +6 -0
  30. package/esm2015/lib/core/utilities/serializer-util.js +358 -0
  31. package/esm2015/lib/core/utilities/update-step-status.js +38 -0
  32. package/esm2015/lib/core/validators/index.js +3 -0
  33. package/esm2015/lib/core/validators/instant-validation-result-error-state-matcher.js +23 -0
  34. package/esm2015/lib/core/validators/validation-result-validator.js +19 -0
  35. package/esm2015/lib/file-upload/file-upload.component.js +66 -0
  36. package/esm2015/lib/file-upload/index.js +2 -0
  37. package/esm2015/lib/form/base-form-item.model.js +2 -0
  38. package/esm2015/lib/form/form-disabler.component.js +38 -0
  39. package/esm2015/lib/form/form-item.directive.js +22 -0
  40. package/esm2015/lib/form/form.component.js +250 -0
  41. package/esm2015/lib/form/form.module.js +214 -0
  42. package/esm2015/lib/form/index.js +5 -0
  43. package/esm2015/lib/form/white-list.model.js +11 -0
  44. package/esm2015/lib/form-item-controls/base-form-item-control.directive.js +58 -0
  45. package/esm2015/lib/form-item-controls/base-parent-item-control.directive.js +42 -0
  46. package/esm2015/lib/form-item-controls/base-single-selection-parent.directive.js +53 -0
  47. package/esm2015/lib/form-item-controls/date-range.component.js +84 -0
  48. package/esm2015/lib/form-item-controls/date.component.js +134 -0
  49. package/esm2015/lib/form-item-controls/dropdown.component.js +109 -0
  50. package/esm2015/lib/form-item-controls/index.js +8 -0
  51. package/esm2015/lib/form-item-controls/input.component.js +149 -0
  52. package/esm2015/lib/form-item-controls/year-quarter-range.component.js +75 -0
  53. package/esm2015/lib/form-item-controls/year-quarter.component.js +228 -0
  54. package/esm2015/lib/form-stepper/form-step-group.component.js +95 -0
  55. package/esm2015/lib/form-stepper/form-step-group.pipe.js +20 -0
  56. package/esm2015/lib/form-stepper/form-step.component.js +110 -0
  57. package/esm2015/lib/form-stepper/form-step.util.js +28 -0
  58. package/esm2015/lib/form-stepper/form-stepper.component.js +115 -0
  59. package/esm2015/lib/form-stepper/form-stepper.module.js +53 -0
  60. package/esm2015/lib/form-stepper/index.js +8 -0
  61. package/esm2015/lib/form-stepper/models/base-form-step.model.js +6 -0
  62. package/esm2015/lib/form-stepper/models/form-step-group.model.js +13 -0
  63. package/esm2015/lib/form-stepper/models/form-step.model.js +12 -0
  64. package/esm2015/lib/form-stepper/models/index.js +4 -0
  65. package/esm2015/lib/groups/form-item-dialog-data.model.js +14 -0
  66. package/esm2015/lib/groups/group-components.js +646 -0
  67. package/esm2015/lib/groups/index.js +3 -0
  68. package/esm2015/lib/groups/repeatable-item.component.js +23 -0
  69. package/esm2015/lib/item-header/index.js +2 -0
  70. package/esm2015/lib/item-header/item-header.component.js +108 -0
  71. package/esm2015/lib/static-form-items/index.js +3 -0
  72. package/esm2015/lib/static-form-items/ordered-list-item.js +50 -0
  73. package/esm2015/lib/static-form-items/unordered-list-item.js +52 -0
  74. package/esm2015/lib/step-card/index.js +2 -0
  75. package/esm2015/lib/step-card/step-card.component.js +53 -0
  76. package/esm2015/mtna-web-form-angular.js +5 -0
  77. package/esm2015/public-api.js +10 -0
  78. package/fesm2015/mtna-web-form-angular.js +4614 -0
  79. package/fesm2015/mtna-web-form-angular.js.map +1 -0
  80. package/lib/_index.scss +25 -0
  81. package/lib/core/_all-color.scss +25 -0
  82. package/lib/core/_all-theme.scss +28 -0
  83. package/lib/core/_all-typography.scss +25 -0
  84. package/lib/core/_core-theme.scss +43 -0
  85. package/lib/core/animations.d.ts +2 -0
  86. package/lib/core/api-config.d.ts +5 -0
  87. package/lib/core/index.d.ts +6 -0
  88. package/lib/core/pipes/coerce-date-item.pipe.d.ts +11 -0
  89. package/lib/core/pipes/coerce-form-group.pipe.d.ts +23 -0
  90. package/lib/core/pipes/date-quarter.pipe.d.ts +7 -0
  91. package/lib/core/pipes/get-auto-complete.pipe.d.ts +7 -0
  92. package/lib/core/pipes/get-available-quarters.pipe.d.ts +8 -0
  93. package/lib/core/pipes/get-form-control-error.pipe.d.ts +14 -0
  94. package/lib/core/pipes/get-list-icon.pipe.d.ts +7 -0
  95. package/lib/core/pipes/get-object-type.pipe.d.ts +7 -0
  96. package/lib/core/pipes/get-selected-option.pipe.d.ts +8 -0
  97. package/lib/core/pipes/index.d.ts +28 -0
  98. package/lib/core/pipes/items-with-value.pipe.d.ts +13 -0
  99. package/lib/core/pipes/sanitize-html.pipe.d.ts +10 -0
  100. package/lib/core/services/api.service.d.ts +41 -0
  101. package/lib/core/services/form-manager.service.d.ts +184 -0
  102. package/lib/core/services/index.d.ts +4 -0
  103. package/lib/core/services/ng-form.service.d.ts +76 -0
  104. package/lib/core/services/ui.service.d.ts +123 -0
  105. package/lib/core/utilities/find-form-control.d.ts +11 -0
  106. package/lib/core/utilities/find-form-item.d.ts +10 -0
  107. package/lib/core/utilities/flatten-steps.d.ts +7 -0
  108. package/lib/core/utilities/generate-form-steps.d.ts +3 -0
  109. package/lib/core/utilities/index.d.ts +8 -0
  110. package/lib/core/utilities/is-form-group.d.ts +3 -0
  111. package/lib/core/utilities/serializer-util.d.ts +81 -0
  112. package/lib/core/utilities/update-step-status.d.ts +14 -0
  113. package/lib/core/validators/index.d.ts +2 -0
  114. package/lib/core/validators/instant-validation-result-error-state-matcher.d.ts +13 -0
  115. package/lib/core/validators/validation-result-validator.d.ts +12 -0
  116. package/lib/file-upload/file-upload.component.d.ts +23 -0
  117. package/lib/file-upload/index.d.ts +1 -0
  118. package/lib/form/base-form-item.model.d.ts +15 -0
  119. package/lib/form/form-disabler.component.d.ts +6 -0
  120. package/lib/form/form-item.directive.d.ts +13 -0
  121. package/lib/form/form.component.d.ts +89 -0
  122. package/lib/form/form.module.d.ts +52 -0
  123. package/lib/form/index.d.ts +4 -0
  124. package/lib/form/white-list.model.d.ts +6 -0
  125. package/lib/form-item-controls/_date-item-theme.scss +29 -0
  126. package/lib/form-item-controls/_form-control-theme.scss +28 -0
  127. package/lib/form-item-controls/_year-quarter-item-theme.scss +28 -0
  128. package/lib/form-item-controls/base-form-item-control.directive.d.ts +26 -0
  129. package/lib/form-item-controls/base-parent-item-control.directive.d.ts +19 -0
  130. package/lib/form-item-controls/base-single-selection-parent.directive.d.ts +26 -0
  131. package/lib/form-item-controls/date-range.component.d.ts +12 -0
  132. package/lib/form-item-controls/date.component.d.ts +24 -0
  133. package/lib/form-item-controls/dropdown.component.d.ts +9 -0
  134. package/lib/form-item-controls/index.d.ts +7 -0
  135. package/lib/form-item-controls/input.component.d.ts +14 -0
  136. package/lib/form-item-controls/year-quarter-range.component.d.ts +9 -0
  137. package/lib/form-item-controls/year-quarter.component.d.ts +33 -0
  138. package/lib/form-stepper/_form-step-group-theme.scss +43 -0
  139. package/lib/form-stepper/_form-stepper-theme.scss +72 -0
  140. package/lib/form-stepper/form-step-group.component.d.ts +23 -0
  141. package/lib/form-stepper/form-step-group.pipe.d.ts +11 -0
  142. package/lib/form-stepper/form-step.component.d.ts +27 -0
  143. package/lib/form-stepper/form-step.util.d.ts +27 -0
  144. package/lib/form-stepper/form-stepper.component.d.ts +35 -0
  145. package/lib/form-stepper/form-stepper.module.d.ts +18 -0
  146. package/lib/form-stepper/index.d.ts +7 -0
  147. package/lib/form-stepper/models/base-form-step.model.d.ts +4 -0
  148. package/lib/form-stepper/models/form-step-group.model.d.ts +8 -0
  149. package/lib/form-stepper/models/form-step.model.d.ts +11 -0
  150. package/lib/form-stepper/models/index.d.ts +3 -0
  151. package/lib/groups/_checkbox-theme.scss +62 -0
  152. package/lib/groups/_form-group-theme.scss +32 -0
  153. package/lib/groups/_multiple-choice-theme.scss +65 -0
  154. package/lib/groups/_repeatable-item-theme.scss +28 -0
  155. package/lib/groups/form-item-dialog-data.model.d.ts +13 -0
  156. package/lib/groups/group-components.d.ts +221 -0
  157. package/lib/groups/index.d.ts +2 -0
  158. package/lib/groups/repeatable-item.component.d.ts +5 -0
  159. package/lib/item-header/_item-header-theme.scss +28 -0
  160. package/lib/item-header/index.d.ts +1 -0
  161. package/lib/item-header/item-header.component.d.ts +35 -0
  162. package/lib/static-form-items/index.d.ts +2 -0
  163. package/lib/static-form-items/ordered-list-item.d.ts +11 -0
  164. package/lib/static-form-items/unordered-list-item.d.ts +11 -0
  165. package/lib/step-card/_step-card-theme.scss +42 -0
  166. package/lib/step-card/index.d.ts +1 -0
  167. package/lib/step-card/step-card.component.d.ts +21 -0
  168. package/mtna-web-form-angular.d.ts +5 -0
  169. package/package.json +43 -0
  170. package/public-api.d.ts +9 -0
@@ -0,0 +1,646 @@
1
+ import { animate, state, style, transition, trigger } from '@angular/animations';
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Inject, Injectable, Input, Optional, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
3
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
4
+ import { isKey } from '@mtna/core-ts';
5
+ import { DROPDOWN_ITEM_ID, FORM_ITEM_GROUP_IMPL_ID, isConditionalItem, MtnaWfFormItemChange, PARAGRAPH_ANSWER_ITEM_ID, SECTION_ID, SHORT_ANSWER_ITEM_ID, TEXT_ITEM_ID, TITLE_ITEM_ID, } from '@mtna/web-form-ts';
6
+ import { Subject } from 'rxjs';
7
+ import { takeUntil } from 'rxjs/operators';
8
+ import { COMPLEX_STANDARD, MTNA_WF_EXPAND_COLLAPSE } from '../core/animations';
9
+ import { BaseParentItemControl } from '../form-item-controls/base-parent-item-control.directive';
10
+ import { BaseSingleSelectionParent } from '../form-item-controls/base-single-selection-parent.directive';
11
+ import { MtnaWfFormItemDirective } from '../form/form-item.directive';
12
+ import { MTNA_WF_ITEM_WHITELIST } from '../form/white-list.model';
13
+ import { MtnaWfFormItemDialogData } from './form-item-dialog-data.model';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@angular/material/dialog";
16
+ import * as i2 from "@angular/material/button";
17
+ import * as i3 from "@angular/common";
18
+ import * as i4 from "./form-item-dialog-data.model";
19
+ import * as i5 from "../core/services/ui.service";
20
+ import * as i6 from "@mtna/pojo-social-angular";
21
+ import * as i7 from "@mtna/core-angular";
22
+ import * as i8 from "../core/pipes/get-object-type.pipe";
23
+ import * as i9 from "../step-card/step-card.component";
24
+ import * as i10 from "@angular/material/divider";
25
+ import * as i11 from "../item-header/item-header.component";
26
+ import * as i12 from "@angular/material/list";
27
+ import * as i13 from "@angular/forms";
28
+ import * as i14 from "@angular/flex-layout/extended";
29
+ import * as i15 from "../core/pipes/items-with-value.pipe";
30
+ import * as i16 from "../core/services/form-manager.service";
31
+ import * as i17 from "./repeatable-item.component";
32
+ import * as i18 from "@angular/material/icon";
33
+ import * as i19 from "@angular/material/tooltip";
34
+ import * as i20 from "@angular/material/table";
35
+ import * as i21 from "../form-item-controls/date.component";
36
+ import * as i22 from "../form-item-controls/date-range.component";
37
+ import * as i23 from "../form-item-controls/year-quarter-range.component";
38
+ import * as i24 from "../form-item-controls/dropdown.component";
39
+ import * as i25 from "../file-upload/file-upload.component";
40
+ import * as i26 from "../static-form-items/unordered-list-item";
41
+ import * as i27 from "../static-form-items/ordered-list-item";
42
+ import * as i28 from "../form-item-controls/input.component";
43
+ import * as i29 from "../form/form-item.directive";
44
+ import * as i30 from "../core/pipes/sanitize-html.pipe";
45
+ import * as i31 from "../core/pipes/coerce-date-item.pipe";
46
+ import * as i32 from "@angular/material/radio";
47
+ import * as i33 from "@angular/material/form-field";
48
+ import * as i34 from "../core/pipes/get-form-control-error.pipe";
49
+ import * as i35 from "@angular/material/slide-toggle";
50
+ import * as i36 from "@angular/material/checkbox";
51
+ export class MtnaWfDialogService {
52
+ constructor(dialog) {
53
+ this.dialog = dialog;
54
+ }
55
+ /**
56
+ * Display the acknowledgement the user agreed to for a given option.
57
+ * @param acknowledgementItem The {@link Section} that represents the acknowledgement text to display to the user.
58
+ */
59
+ showAcknowledgement(acknowledgementItem) {
60
+ this.dialog.open(MtnaWfFormItemDialogComponent, {
61
+ closeOnNavigation: true,
62
+ data: new MtnaWfFormItemDialogData(acknowledgementItem.items, acknowledgementItem.title.value || 'Acknowledgement'),
63
+ disableClose: false,
64
+ hasBackdrop: true,
65
+ maxWidth: '500px',
66
+ });
67
+ }
68
+ /**
69
+ * Show some text in a dialog that the user needs to "acknowledge" before they can make a certain selection.
70
+ * @param acknowledgementItem The {@link Section} that represents the text displayed to the user for acknowledgement.
71
+ * @returns Whether the user acknowledges (agrees).
72
+ */
73
+ verifyAcknowledgement(acknowledgementItem) {
74
+ return this.dialog
75
+ .open(MtnaWfAcknowledgeDialogComponent, {
76
+ closeOnNavigation: true,
77
+ data: new MtnaWfFormItemDialogData(acknowledgementItem.items, acknowledgementItem.title.value || 'Acknowledgement'),
78
+ disableClose: true,
79
+ hasBackdrop: true,
80
+ maxWidth: '500px',
81
+ })
82
+ .afterClosed();
83
+ }
84
+ }
85
+ MtnaWfDialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfDialogService, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Injectable });
86
+ MtnaWfDialogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfDialogService, providedIn: 'root' });
87
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfDialogService, decorators: [{
88
+ type: Injectable,
89
+ args: [{ providedIn: 'root' }]
90
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }]; } });
91
+ /*
92
+ * Due to the recursive nature of these form components, we had to combine all the TS into a single file.
93
+ * Perhaps when we refactor this in the future to use dynamic components, this can be avoided.
94
+ * Read more about the errors if they are not in the same file here: https://angular.io/errors/NG3003
95
+ */
96
+ // TODO: refactor, reduce code in here. mixins
97
+ /**
98
+ * A dialog that renders a form item that represents something the user needs to acknowledge.
99
+ */
100
+ export class MtnaWfAcknowledgeDialogComponent {
101
+ constructor(data, dialogRef) {
102
+ this.data = data;
103
+ this.dialogRef = dialogRef;
104
+ }
105
+ }
106
+ MtnaWfAcknowledgeDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfAcknowledgeDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component });
107
+ MtnaWfAcknowledgeDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfAcknowledgeDialogComponent, selector: "mtna-wf-acknowledge-dialog", ngImport: i0, template: "<h2 *ngIf=\"data.title as title\" mat-dialog-title>{{ title }}</h2>\n<mat-dialog-content>\n <mtna-wf-item *ngFor=\"let item of data.formItems\" [item]=\"item\" [readonly]=\"true\"></mtna-wf-item>\n</mat-dialog-content>\n<mat-dialog-actions align=\"end\">\n <button [mat-dialog-close]=\"false\" mat-button>CANCEL</button>\n <button [mat-dialog-close]=\"true\" color=\"accent\" mat-raised-button>ACKNOWLEDGE</button>\n</mat-dialog-actions>\n", components: [{ type: i0.forwardRef(function () { return MtnaWfFormItemComponent; }), selector: "mtna-wf-item", inputs: ["item", "readonly", "control", "parentIds", "step"], outputs: ["focusedSection"] }, { type: i0.forwardRef(function () { return i2.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"] }], directives: [{ type: i0.forwardRef(function () { return i3.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i0.forwardRef(function () { return i1.MatDialogTitle; }), selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i0.forwardRef(function () { return i1.MatDialogContent; }), selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i0.forwardRef(function () { return i3.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i0.forwardRef(function () { return i1.MatDialogActions; }), selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i0.forwardRef(function () { return i1.MatDialogClose; }), selector: "[mat-dialog-close], [matDialogClose]", inputs: ["type", "mat-dialog-close", "aria-label", "matDialogClose"], exportAs: ["matDialogClose"] }] });
108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfAcknowledgeDialogComponent, decorators: [{
109
+ type: Component,
110
+ args: [{
111
+ selector: 'mtna-wf-acknowledge-dialog',
112
+ templateUrl: 'acknowledge-dialog.component.html',
113
+ }]
114
+ }], ctorParameters: function () { return [{ type: i4.MtnaWfFormItemDialogData, decorators: [{
115
+ type: Inject,
116
+ args: [MAT_DIALOG_DATA]
117
+ }] }, { type: i1.MatDialogRef }]; } });
118
+ /**
119
+ * Component that wraps an MtnaForm item.
120
+ *
121
+ * ChangeDetectionStrategy.OnPush was not working as of 9/19/2018.
122
+ * Dynamic components in the ValueItemComponent were not being initialized (ngOnInit was never called).
123
+ *
124
+ * @export
125
+ */
126
+ export class MtnaWfFormItemComponent {
127
+ constructor(_elementRef, uiService) {
128
+ this._elementRef = _elementRef;
129
+ this.uiService = uiService;
130
+ this.visible = true;
131
+ this.readonly = false;
132
+ this.parentIds = new Array();
133
+ this.focusedSection = new EventEmitter();
134
+ this.indicatorStatus = 'INACTIVE';
135
+ }
136
+ get elementId() {
137
+ return this.item ? this.item.instanceId : '';
138
+ }
139
+ ngOnInit() {
140
+ if (isConditionalItem(this.item)) {
141
+ this.visible = !this.item.hideOnDisable || !this.item.disabled;
142
+ }
143
+ this.uiService.registerSelf(this);
144
+ this._elementRef.nativeElement.classList.add(`mtna-wf-${getItemClassSuffix(this.item.itemId)}`);
145
+ }
146
+ }
147
+ MtnaWfFormItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormItemComponent, deps: [{ token: i0.ElementRef }, { token: i5.MtnaWfUIService }], target: i0.ɵɵFactoryTarget.Component });
148
+ MtnaWfFormItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfFormItemComponent, selector: "mtna-wf-item", inputs: { item: "item", readonly: "readonly", control: "control", parentIds: "parentIds", step: "step" }, outputs: { focusedSection: "focusedSection" }, host: { properties: { "@mtnaWfExpandCollapse": "this.visible", "attr.id": "this.elementId" } }, ngImport: i0, template: "<mtna-annotations-indicator\n *ngIf=\"item.annotationEnabled\"\n [annotatableId]=\"item.annotatableId\"\n color=\"primary\"\n [count]=\"annotations$ | async\"\n (status)=\"indicatorStatus = $event\"\n></mtna-annotations-indicator>\n\n<ng-container [ngSwitch]=\"item.itemId | getObjectType\">\n <mtna-wf-section\n *ngSwitchCase=\"'sectionimpl'\"\n [control]=\"$any(control)\"\n [item]=\"$any(item)\"\n [mtnaHighlight]=\"indicatorStatus === 'ACTIVE'\"\n [parentIds]=\"parentIds.concat(item.instanceId)\"\n [readonly]=\"readonly\"\n [step]=\"step\"\n (focused)=\"focusedSection.emit($event)\"\n ></mtna-wf-section>\n\n <mtna-wf-group\n *ngSwitchCase=\"'formitemgroupimpl'\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n [control]=\"$any(control)\"\n [mtnaHighlight]=\"indicatorStatus === 'ACTIVE' && (!!item.descriptiveText || !!item.questionText)\"\n [parentIds]=\"parentIds.concat(item.instanceId)\"\n [readonly]=\"readonly\"\n ></mtna-wf-group>\n\n <mtna-wf-repeatable-item-container\n *ngSwitchCase=\"'repeatableitem'\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n [control]=\"$any(control)\"\n [mtnaHighlight]=\"indicatorStatus === 'ACTIVE' && (!!item.descriptiveText || !!item.questionText)\"\n [parentIds]=\"parentIds.concat(item.instanceId)\"\n [readonly]=\"readonly\"\n ></mtna-wf-repeatable-item-container>\n\n <mtna-wf-value-item\n *ngSwitchDefault\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n [control]=\"control\"\n [mtnaHighlight]=\"indicatorStatus === 'ACTIVE' && (!!item.descriptiveText || !!item.questionText)\"\n [parentIds]=\"parentIds.concat(item.instanceId)\"\n [readonly]=\"readonly\"\n ></mtna-wf-value-item>\n</ng-container>\n", styles: ["mtna-wf-item{display:block;position:relative}mtna-wf-item mtna-annotations-indicator{position:absolute;top:0;right:0;z-index:2}\n"], components: [{ type: i0.forwardRef(function () { return i6.MtnaAnnotationsIndicatorComponent; }), selector: "mtna-annotations-indicator", inputs: ["color", "annotatableId", "annotatableItemName", "count"], outputs: ["status"] }, { type: i0.forwardRef(function () { return MtnaWfFormSectionComponent; }), selector: "mtna-wf-section", inputs: ["indicatorStatus", "item", "readonly", "step", "control", "parentIds"], outputs: ["focused"] }, { type: i0.forwardRef(function () { return MtnaWfFormGroupComponent; }), selector: "mtna-wf-group", inputs: ["control", "indicatorStatus", "item", "parentIds", "readonly"] }, { type: i0.forwardRef(function () { return RepeatableItemContainerComponent; }), selector: "mtna-wf-repeatable-item-container", inputs: ["indicatorStatus", "item", "control", "parentIds", "readonly"] }, { type: i0.forwardRef(function () { return ValueItemComponent; }), selector: "mtna-wf-value-item", inputs: ["control", "inList", "indicatorStatus", "item", "parentIds", "readonly"] }], directives: [{ type: i0.forwardRef(function () { return i3.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i0.forwardRef(function () { return i3.NgSwitch; }), selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i0.forwardRef(function () { return i3.NgSwitchCase; }), selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i0.forwardRef(function () { return i7.MtnaHighlightDirective; }), selector: "[mtnaHighlight]", inputs: ["mtnaHighlight", "mtnaHighlightColor"], exportAs: ["mtnaHighlight"] }, { type: i0.forwardRef(function () { return i3.NgSwitchDefault; }), selector: "[ngSwitchDefault]" }], pipes: { "async": i0.forwardRef(function () { return i3.AsyncPipe; }), "getObjectType": i0.forwardRef(function () { return i8.GetObjectTypePipe; }) }, animations: [MTNA_WF_EXPAND_COLLAPSE], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormItemComponent, decorators: [{
150
+ type: Component,
151
+ args: [{
152
+ selector: 'mtna-wf-item',
153
+ templateUrl: './form-item.component.html',
154
+ styleUrls: ['./form-item.component.scss'],
155
+ changeDetection: ChangeDetectionStrategy.OnPush,
156
+ encapsulation: ViewEncapsulation.None,
157
+ animations: [MTNA_WF_EXPAND_COLLAPSE],
158
+ }]
159
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i5.MtnaWfUIService }]; }, propDecorators: { visible: [{
160
+ type: HostBinding,
161
+ args: ['@mtnaWfExpandCollapse']
162
+ }], elementId: [{
163
+ type: HostBinding,
164
+ args: ['attr.id']
165
+ }], item: [{
166
+ type: Input
167
+ }], readonly: [{
168
+ type: Input
169
+ }], control: [{
170
+ type: Input
171
+ }], parentIds: [{
172
+ type: Input
173
+ }], step: [{
174
+ type: Input
175
+ }], focusedSection: [{
176
+ type: Output
177
+ }] } });
178
+ function getItemClassSuffix(itemId) {
179
+ // FIXME: surely there is a stronger/better way
180
+ switch (itemId) {
181
+ case FORM_ITEM_GROUP_IMPL_ID:
182
+ return 'group';
183
+ case SECTION_ID:
184
+ return 'section';
185
+ case TEXT_ITEM_ID:
186
+ return 'text';
187
+ case TITLE_ITEM_ID:
188
+ return 'title';
189
+ default:
190
+ return 'item';
191
+ }
192
+ }
193
+ /**
194
+ * A dialog that renders a form item.
195
+ */
196
+ export class MtnaWfFormItemDialogComponent {
197
+ constructor(data, dialogRef) {
198
+ this.data = data;
199
+ this.dialogRef = dialogRef;
200
+ }
201
+ }
202
+ MtnaWfFormItemDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormItemDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component });
203
+ MtnaWfFormItemDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfFormItemDialogComponent, selector: "mtna-wf-form-item-dialog", ngImport: i0, template: "<h2 *ngIf=\"data.title as title\" mat-dialog-title>{{ title }}</h2>\n<mat-dialog-content>\n <mtna-wf-item *ngFor=\"let item of data.formItems\" [item]=\"item\" [readonly]=\"true\"></mtna-wf-item>\n</mat-dialog-content>\n<mat-dialog-actions align=\"end\">\n <button mat-button mat-dialog-close>Close</button>\n</mat-dialog-actions>\n", components: [{ type: MtnaWfFormItemComponent, selector: "mtna-wf-item", inputs: ["item", "readonly", "control", "parentIds", "step"], outputs: ["focusedSection"] }, { type: i2.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"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["type", "mat-dialog-close", "aria-label", "matDialogClose"], exportAs: ["matDialogClose"] }] });
204
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormItemDialogComponent, decorators: [{
205
+ type: Component,
206
+ args: [{
207
+ selector: 'mtna-wf-form-item-dialog',
208
+ templateUrl: 'form-item-dialog.component.html',
209
+ }]
210
+ }], ctorParameters: function () { return [{ type: i4.MtnaWfFormItemDialogData, decorators: [{
211
+ type: Inject,
212
+ args: [MAT_DIALOG_DATA]
213
+ }] }, { type: i1.MatDialogRef }]; } });
214
+ export class MtnaWfFormSectionComponent {
215
+ constructor() {
216
+ this.indicatorStatus = 'INACTIVE';
217
+ this.readonly = false;
218
+ this.parentIds = new Array();
219
+ this.focused = new EventEmitter();
220
+ }
221
+ _trackByInstanceId(index, item) {
222
+ return item.instanceId;
223
+ }
224
+ }
225
+ MtnaWfFormSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
226
+ MtnaWfFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfFormSectionComponent, selector: "mtna-wf-section", inputs: { indicatorStatus: "indicatorStatus", item: "item", readonly: "readonly", step: "step", control: "control", parentIds: "parentIds" }, outputs: { focused: "focused" }, ngImport: i0, template: "<mtna-wf-step-card [step]=\"step\" [subtitle]=\"item.descriptiveText\" (focused)=\"focused.emit($event)\">\n <div cardContent>\n <ng-container *ngFor=\"let subItem of item.items; trackBy: _trackByInstanceId\">\n <mat-divider\n *ngIf=\"(subItem.itemId | getObjectType) === 'formitemgroupimpl' && item.items.indexOf(subItem) !== 0\"\n class=\"section-item-divider\"\n [inset]=\"true\"\n ></mat-divider>\n\n <mtna-wf-item\n [item]=\"subItem\"\n [readonly]=\"readonly\"\n [parentIds]=\"parentIds\"\n [control]=\"!!control && !!control.controls ? control.controls[subItem.instanceId] : undefined\"\n (focusedSection)=\"focused.emit($event)\"\n ></mtna-wf-item>\n </ng-container>\n </div>\n</mtna-wf-step-card>\n", styles: [":host{display:block}mat-divider.mat-divider-horizontal.mat-divider-inset.section-item-divider{margin-top:8px;margin-bottom:8px}\n"], components: [{ type: i9.MtnaWfStepCardComponent, selector: "mtna-wf-step-card", inputs: ["color", "step", "subtitle"], outputs: ["focused"] }, { type: i10.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: MtnaWfFormItemComponent, selector: "mtna-wf-item", inputs: ["item", "readonly", "control", "parentIds", "step"], outputs: ["focusedSection"] }], directives: [{ type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "getObjectType": i8.GetObjectTypePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
227
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormSectionComponent, decorators: [{
228
+ type: Component,
229
+ args: [{
230
+ selector: 'mtna-wf-section',
231
+ templateUrl: './form-section.component.html',
232
+ styleUrls: ['./form-section.component.scss'],
233
+ changeDetection: ChangeDetectionStrategy.OnPush,
234
+ }]
235
+ }], propDecorators: { indicatorStatus: [{
236
+ type: Input
237
+ }], item: [{
238
+ type: Input
239
+ }], readonly: [{
240
+ type: Input
241
+ }], step: [{
242
+ type: Input
243
+ }], control: [{
244
+ type: Input
245
+ }], parentIds: [{
246
+ type: Input
247
+ }], focused: [{
248
+ type: Output
249
+ }] } });
250
+ export class MtnaWfFormGroupComponent {
251
+ constructor() {
252
+ this.indicatorStatus = 'INACTIVE';
253
+ this.parentIds = [];
254
+ this.readonly = false;
255
+ this.fullWidth = {
256
+ [PARAGRAPH_ANSWER_ITEM_ID]: true,
257
+ [FORM_ITEM_GROUP_IMPL_ID]: true,
258
+ [TEXT_ITEM_ID]: true,
259
+ [TITLE_ITEM_ID]: true,
260
+ };
261
+ /**
262
+ * If form is readonly & all child items are one of the specified types below,
263
+ * we want to display this group's child items in a mat-list
264
+ */
265
+ this.inList = false;
266
+ }
267
+ get item() {
268
+ return this._item;
269
+ }
270
+ set item(item) {
271
+ this._item = item;
272
+ if (this.item) {
273
+ // A list item can only display a heading line & a small text line
274
+ // Compatible items should be items with short labels/headers & values
275
+ // Items with multiple options, or potential nested items should not be included
276
+ this.inList = this.item.items.every((i) => i.itemId === SHORT_ANSWER_ITEM_ID || i.itemId === DROPDOWN_ITEM_ID);
277
+ }
278
+ }
279
+ _trackByInstanceId(index, section) {
280
+ return section.instanceId;
281
+ }
282
+ }
283
+ MtnaWfFormGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
284
+ MtnaWfFormGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfFormGroupComponent, selector: "mtna-wf-group", inputs: { control: "control", indicatorStatus: "indicatorStatus", item: "item", parentIds: "parentIds", readonly: "readonly" }, ngImport: i0, template: "<ng-container *ngIf=\"item && control\">\n <mtna-wf-item-header\n *ngIf=\"!!item.questionText || !!item.descriptiveText\"\n [descriptiveText]=\"item.descriptiveText\"\n [disabled]=\"control.disabled\"\n [questionText]=\"item.questionText\"\n [required]=\"item.required\"\n ></mtna-wf-item-header>\n <ng-template #fullLayout>\n <div\n class=\"item-group-container\"\n [mtnaHighlight]=\"indicatorStatus === 'ACTIVE' && !item.questionText && !item.descriptiveText\"\n [formGroup]=\"control\"\n [ngClass]=\"item.layout\"\n >\n <mtna-wf-item\n *ngFor=\"let subItem of item.items; trackBy: _trackByInstanceId\"\n [class.row-item]=\"item.layout === 'ROW' && !fullWidth[subItem.itemId]\"\n [ngClass.lt-md]=\"'width-100'\"\n [item]=\"subItem\"\n [control]=\"control.controls[subItem.instanceId]\"\n [parentIds]=\"parentIds\"\n [readonly]=\"readonly\"\n ></mtna-wf-item>\n </div>\n </ng-template>\n\n <!-- When readonly, && all child items should be displayed in a mat-list-->\n <mat-list *ngIf=\"readonly && inList; else fullLayout\" [ngClass]=\"item.layout\">\n <mtna-wf-value-item\n *ngFor=\"let subItem of item.items | mtnaWfItemsWithValue; trackBy: _trackByInstanceId\"\n [class.row-item]=\"item.layout === 'ROW'\"\n [ngClass.lt-md]=\"'width-100'\"\n [item]=\"subItem\"\n [inList]=\"true\"\n [parentIds]=\"parentIds\"\n [readonly]=\"true\"\n ></mtna-wf-value-item>\n </mat-list>\n</ng-container>\n", styles: ["mtna-annotations-indicator+mtna-wf-group .item-group-container{padding-top:24px}mtna-wf-group .mtna-wf-group-header{margin-top:1rem}mtna-wf-group .mtna-wf-group-description{margin-bottom:1rem}mtna-wf-group mat-list mat-list-item [mat-line]{letter-spacing:.5px}mtna-wf-group mtna-wf-multiple-choice-item{display:block}mtna-wf-group .item-group-container>.mtna-wf-group{margin-top:1rem}mtna-wf-group .item-group-container>mtna-wf-item.mtna-wf-title~mtna-wf-item:not(.mtna-wf-title):not(.row-item){padding-left:16px}mtna-wf-group .item-group-container>mtna-wf-item.mtna-wf-title~mtna-wf-item:not(.mtna-wf-title):not(.row-item).width-100{width:calc(100% - 16px)}mtna-wf-group .item-group-container>mtna-wf-item:first-of-type{margin-top:0}mtna-wf-group .item-group-container.ROW>mtna-wf-item{margin-top:0}mtna-wf-group .item-group-container.ROW>*{display:block}mtna-wf-group .item-group-container .row-item{width:calc(50% - 16px);display:inline-block;margin:0 8px}mtna-wf-group .item-group-container .width-100{width:100%}mtna-wf-group .item-group-container .width-100.row-item{width:calc(100% - 16px)}mtna-wf-group mtna-wf-item-header+.item-group-container{padding:.35em .75em .625em}mtna-wf-group mtna-wf-item-header+.item-group-container>mtna-wf-item{margin-top:0}\n"], components: [{ type: i0.forwardRef(function () { return i11.ItemHeaderComponent; }), selector: "mtna-wf-item-header", inputs: ["descriptiveText", "disabled", "hideRequiredMarker", "invalid", "questionText", "required"] }, { type: i0.forwardRef(function () { return MtnaWfFormItemComponent; }), selector: "mtna-wf-item", inputs: ["item", "readonly", "control", "parentIds", "step"], outputs: ["focusedSection"] }, { type: i0.forwardRef(function () { return i12.MatList; }), selector: "mat-list, mat-action-list", inputs: ["disableRipple", "disabled"], exportAs: ["matList"] }, { type: i0.forwardRef(function () { return ValueItemComponent; }), selector: "mtna-wf-value-item", inputs: ["control", "inList", "indicatorStatus", "item", "parentIds", "readonly"] }], directives: [{ type: i0.forwardRef(function () { return i3.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i0.forwardRef(function () { return i7.MtnaHighlightDirective; }), selector: "[mtnaHighlight]", inputs: ["mtnaHighlight", "mtnaHighlightColor"], exportAs: ["mtnaHighlight"] }, { type: i0.forwardRef(function () { return i13.NgControlStatusGroup; }), selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i0.forwardRef(function () { return i13.FormGroupDirective; }), selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i0.forwardRef(function () { return i3.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i0.forwardRef(function () { return i14.DefaultClassDirective; }), selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i0.forwardRef(function () { return i3.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "mtnaWfItemsWithValue": i0.forwardRef(function () { return i15.MtnaWfItemsWithValuePipe; }) }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
285
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormGroupComponent, decorators: [{
286
+ type: Component,
287
+ args: [{
288
+ selector: 'mtna-wf-group',
289
+ templateUrl: './form-group.component.html',
290
+ styleUrls: ['./form-group.component.scss'],
291
+ changeDetection: ChangeDetectionStrategy.OnPush,
292
+ encapsulation: ViewEncapsulation.None,
293
+ }]
294
+ }], propDecorators: { control: [{
295
+ type: Input
296
+ }], indicatorStatus: [{
297
+ type: Input
298
+ }], item: [{
299
+ type: Input
300
+ }], parentIds: [{
301
+ type: Input
302
+ }], readonly: [{
303
+ type: Input
304
+ }] } });
305
+ export class RepeatableItemContainerComponent {
306
+ constructor(manager) {
307
+ this.manager = manager;
308
+ this.indicatorStatus = 'INACTIVE';
309
+ this.parentIds = new Array();
310
+ this.readonly = false;
311
+ }
312
+ addItem() {
313
+ this.manager.changeMtnaFormItem(new MtnaWfFormItemChange(this.item.repeatableTemplateId, this.parentIds, 'ADD'));
314
+ }
315
+ removeItem(item) {
316
+ const conditionChanges = this.manager.generateConditionChangeArray(item, 'REMOVE');
317
+ this.manager.changeMtnaFormItem(new MtnaWfFormItemChange(item.instanceId, this.parentIds, 'REMOVE', conditionChanges));
318
+ }
319
+ }
320
+ RepeatableItemContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RepeatableItemContainerComponent, deps: [{ token: i16.MtnaWfManagerService }], target: i0.ɵɵFactoryTarget.Component });
321
+ RepeatableItemContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RepeatableItemContainerComponent, selector: "mtna-wf-repeatable-item-container", inputs: { indicatorStatus: "indicatorStatus", item: "item", control: "control", parentIds: "parentIds", readonly: "readonly" }, ngImport: i0, template: "<mtna-wf-item-header\n *ngIf=\"!!item.questionText || !!item.descriptiveText\"\n [descriptiveText]=\"item.descriptiveText\"\n [disabled]=\"control?.disabled || false\"\n [questionText]=\"item.questionText\"\n [required]=\"item.required\"\n></mtna-wf-item-header>\n<section [mtnaHighlight]=\"indicatorStatus === 'ACTIVE' && !item.questionText && !item.descriptiveText\">\n <mtna-wf-repeatable-item\n @repeatItemExpandCollapse\n *ngFor=\"let subitem of item.items; let first = first; trackBy: 'instanceId' | mtnaTrackByProperty\"\n >\n <button\n *ngIf=\"!readonly && item.items.length > item.minOccurrences\"\n mat-icon-button\n class=\"item-remove-button\"\n color=\"warn\"\n (click)=\"removeItem(subitem)\"\n matTooltip=\"Remove Item\"\n >\n <mat-icon>remove_circle</mat-icon>\n </button>\n <mtna-wf-item\n [item]=\"subitem\"\n [control]=\"!!control && !!control.controls ? control.controls[subitem.instanceId] : undefined\"\n [readonly]=\"readonly\"\n [parentIds]=\"parentIds\"\n ></mtna-wf-item>\n </mtna-wf-repeatable-item>\n</section>\n<button *ngIf=\"!readonly\" mat-raised-button (click)=\"addItem()\" class=\"new-item-button\" color=\"primary\">\n {{ item.additionalText || 'ADD' | uppercase }}\n</button>\n", styles: ["mtna-wf-repeatable-item-container{display:block}mtna-wf-repeatable-item-container>section>mtna-wf-repeatable-item{position:relative;padding:16px;border-style:dashed;border-width:4px;border-radius:4px;display:inline-block;margin:8px;max-width:100%}mtna-wf-repeatable-item-container>section>mtna-wf-repeatable-item .item-remove-button{position:absolute;top:-22px;left:-22px}mtna-wf-repeatable-item-container>section>mtna-wf-repeatable-item>mtna-wf-item:first-child{margin-top:0}mtna-wf-repeatable-item-container .new-item-button{margin-left:.75em}mtna-wf-repeatable-item-container>section{padding-left:.75em}mtna-wf-repeatable-item-container>section,mtna-wf-repeatable-item-container .new-item-button{margin-top:16px}\n"], components: [{ type: i11.ItemHeaderComponent, selector: "mtna-wf-item-header", inputs: ["descriptiveText", "disabled", "hideRequiredMarker", "invalid", "questionText", "required"] }, { type: i17.RepeatableItemComponent, selector: "mtna-wf-repeatable-item" }, { type: i2.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: i18.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: MtnaWfFormItemComponent, selector: "mtna-wf-item", inputs: ["item", "readonly", "control", "parentIds", "step"], outputs: ["focusedSection"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.MtnaHighlightDirective, selector: "[mtnaHighlight]", inputs: ["mtnaHighlight", "mtnaHighlightColor"], exportAs: ["mtnaHighlight"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i19.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], pipes: { "mtnaTrackByProperty": i7.MtnaTrackByPropertyPipe, "uppercase": i3.UpperCasePipe }, animations: [
322
+ trigger('repeatItemExpandCollapse', [
323
+ state('in', style({ height: '*', margin: '*', opacity: 1 })),
324
+ state('void', style({ height: 0, margin: 0, opacity: 0, visibility: 'hidden' })),
325
+ transition(':enter', [animate(COMPLEX_STANDARD, style({ height: '*', margin: '*', opacity: 1 }))]),
326
+ transition(':leave', animate(COMPLEX_STANDARD)),
327
+ ]),
328
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
329
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RepeatableItemContainerComponent, decorators: [{
330
+ type: Component,
331
+ args: [{
332
+ selector: 'mtna-wf-repeatable-item-container',
333
+ templateUrl: 'repeatable-item-container.component.html',
334
+ styleUrls: [`repeatable-item-container.component.scss`],
335
+ animations: [
336
+ trigger('repeatItemExpandCollapse', [
337
+ state('in', style({ height: '*', margin: '*', opacity: 1 })),
338
+ state('void', style({ height: 0, margin: 0, opacity: 0, visibility: 'hidden' })),
339
+ transition(':enter', [animate(COMPLEX_STANDARD, style({ height: '*', margin: '*', opacity: 1 }))]),
340
+ transition(':leave', animate(COMPLEX_STANDARD)),
341
+ ]),
342
+ ],
343
+ changeDetection: ChangeDetectionStrategy.OnPush,
344
+ encapsulation: ViewEncapsulation.None,
345
+ }]
346
+ }], ctorParameters: function () { return [{ type: i16.MtnaWfManagerService }]; }, propDecorators: { indicatorStatus: [{
347
+ type: Input
348
+ }], item: [{
349
+ type: Input
350
+ }], control: [{
351
+ type: Input
352
+ }], parentIds: [{
353
+ type: Input
354
+ }], readonly: [{
355
+ type: Input
356
+ }] } });
357
+ export class MtnaWfTableFormItemComponent {
358
+ constructor() {
359
+ this.indicatorStatus = 'INACTIVE';
360
+ this.readonly = false;
361
+ this.parentIds = new Array();
362
+ }
363
+ _trackByTableRow(index, row) {
364
+ return row.items
365
+ .filter((i) => !!i)
366
+ .map((item) => item.instanceId)
367
+ .join('');
368
+ }
369
+ }
370
+ MtnaWfTableFormItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfTableFormItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
371
+ MtnaWfTableFormItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfTableFormItemComponent, selector: "mtna-wf-table-item", inputs: { indicatorStatus: "indicatorStatus", item: "item", control: "control", readonly: "readonly", parentIds: "parentIds" }, ngImport: i0, template: "<table mat-table [dataSource]=\"item.tableRows\" [trackBy]=\"_trackByTableRow\">\n <ng-container *ngFor=\"let header of item.headers; let index = index\" [matColumnDef]=\"header\">\n <th mat-header-cell *matHeaderCellDef>{{ header }}</th>\n\n <td mat-cell *matCellDef=\"let rowItem\">\n <mtna-wf-item\n *ngIf=\"!!rowItem.items[index]\"\n [control]=\"!!control && !!control.controls ? control.controls[rowItem.items[index].instanceId] : undefined\"\n [item]=\"rowItem.items[index]\"\n [readonly]=\"readonly\"\n [parentIds]=\"parentIds\"\n ></mtna-wf-item>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"item.headers\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: item.headers\"></tr>\n</table>\n", styles: ["mtna-wf-table-item .mat-table{width:100%}mtna-wf-table-item .mat-table tbody tr td.mat-cell{padding:8px;vertical-align:top}mtna-wf-table-item .mat-table tbody tr td mtna-wf-group>.group{flex-direction:column;place-content:start start;align-items:start;justify-content:start}mtna-wf-table-item .mat-table tbody tr td mtna-wf-group>.group *{margin-top:0;margin-bottom:0}mtna-wf-table-item .mat-table tbody tr td mtna-wf-boolean-item>.mat-slide-toggle{margin-bottom:8px;margin-top:8px}mtna-wf-table-item .mat-table tbody tr td mtna-wf-repeatable-item-container .repeat-item-container:not(:first-of-type){margin-top:8px}mtna-wf-table-item .mat-table tbody tr td mtna-wf-repeatable-item-container .new-item-button{margin:8px 0}\n"], components: [{ type: i20.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: MtnaWfFormItemComponent, selector: "mtna-wf-item", inputs: ["item", "readonly", "control", "parentIds", "step"], outputs: ["focusedSection"] }, { type: i20.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i20.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }], directives: [{ type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i20.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i20.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i20.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i20.MatCellDef, selector: "[matCellDef]" }, { type: i20.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i20.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i20.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
372
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfTableFormItemComponent, decorators: [{
373
+ type: Component,
374
+ args: [{
375
+ selector: 'mtna-wf-table-item',
376
+ templateUrl: 'table-item.component.html',
377
+ styleUrls: ['table-item.component.scss'],
378
+ encapsulation: ViewEncapsulation.None,
379
+ changeDetection: ChangeDetectionStrategy.OnPush,
380
+ }]
381
+ }], propDecorators: { indicatorStatus: [{
382
+ type: Input
383
+ }], item: [{
384
+ type: Input
385
+ }], control: [{
386
+ type: Input
387
+ }], readonly: [{
388
+ type: Input
389
+ }], parentIds: [{
390
+ type: Input
391
+ }] } });
392
+ export class ValueItemComponent {
393
+ constructor(cdf, cfResolver, formManager, logger, whiteList) {
394
+ this.cdf = cdf;
395
+ this.cfResolver = cfResolver;
396
+ this.formManager = formManager;
397
+ this.logger = logger;
398
+ this.whiteList = whiteList;
399
+ this.inList = false;
400
+ this.indicatorStatus = 'INACTIVE';
401
+ this.parentIds = new Array();
402
+ this.readonly = false;
403
+ /** The list of pre-existing(non-dynamic) item types
404
+ * If this item's itemId does not match one of the following, then
405
+ * this item is a dynamic component registered by the client application
406
+ * & requires the ComponentFactory to create the component.
407
+ */
408
+ this.fixedItemTypes = [
409
+ 'booleanitem',
410
+ 'bulletedlistitem',
411
+ 'checkboxitem',
412
+ 'dateitem',
413
+ 'daterangeitem',
414
+ 'decimalansweritem',
415
+ 'documentationitem',
416
+ 'dropdownitem',
417
+ 'fileuploaditem',
418
+ 'multiplechoiceitem',
419
+ 'numberedlistitem',
420
+ 'offsetdaterangeitem',
421
+ 'paragraphansweritem',
422
+ 'shortansweritem',
423
+ 'tableitem',
424
+ 'textitem',
425
+ 'titleitem',
426
+ 'wholenumberansweritem',
427
+ 'yearquarterrangeitem',
428
+ ];
429
+ }
430
+ /**
431
+ * Sets a value on the control for any components that only emit a value &
432
+ * do not directly manipulate their control themselves, i.e. a FileUploadItem
433
+ *
434
+ * @param item the value to be set on the control
435
+ */
436
+ setValue(item) {
437
+ var _a, _b;
438
+ (_a = this.control) === null || _a === void 0 ? void 0 : _a.markAsDirty();
439
+ (_b = this.control) === null || _b === void 0 ? void 0 : _b.setValue(item);
440
+ }
441
+ /**
442
+ * Renders a dynamic component from a relevant type in the FormService (registered)components;
443
+ * ONLY if the item type(using itemId) does not match one of the existing fixedItemTypes
444
+ *
445
+ */
446
+ ngAfterViewInit() {
447
+ var _a, _b;
448
+ // Trim the itemId down to the relevant type
449
+ const newId = this.item.itemId.toLowerCase().split('.');
450
+ const type = newId[newId.length - 1];
451
+ // Check if type is not one of the fixedItemTypes
452
+ if (!this.fixedItemTypes.some((i) => i === type)) {
453
+ // Retrieve a relevant component type
454
+ const component = this.formManager.getDynamicComponent(type);
455
+ // if a type is returned, instantiate the component and set the input values, then mark
456
+ // the value item for changeDetection check
457
+ if (component) {
458
+ const componentFactory = this.cfResolver.resolveComponentFactory(component);
459
+ this.componentRef = (_a = this.itemHost) === null || _a === void 0 ? void 0 : _a.viewContainerRef.createComponent(componentFactory);
460
+ const instance = (_b = this.componentRef) === null || _b === void 0 ? void 0 : _b.instance;
461
+ if (instance) {
462
+ for (const input of componentFactory.inputs) {
463
+ const propName = input.propName;
464
+ // Forcefully assign every input from this to instance
465
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
466
+ instance[propName] = this[propName];
467
+ }
468
+ }
469
+ // Dynamic Component won't fire ngOnInit unless we detectChanges
470
+ this.cdf.detectChanges();
471
+ }
472
+ else if (!this.whiteList || !this.whiteList.itemTypes || !this.whiteList.itemTypes.some((t) => t === type)) {
473
+ this.logger.error(`No Component Found for ${type} - Ensure any dynamic components were registered in the service, or use the MtnaWfItemWhiteList to ignore this item.`);
474
+ }
475
+ }
476
+ }
477
+ ngOnChanges(changes) {
478
+ if (this.componentRef) {
479
+ for (const prop in changes) {
480
+ if (Object.prototype.hasOwnProperty.call(changes, prop)) {
481
+ const change = changes[prop];
482
+ if (!change.firstChange && isKey(this.componentRef.instance, prop)) {
483
+ this.componentRef.instance[prop] = change.currentValue;
484
+ }
485
+ }
486
+ }
487
+ }
488
+ }
489
+ /**
490
+ * Used to destroy the componentRef to a dynamic component, if it was rendered.
491
+ *
492
+ */
493
+ ngOnDestroy() {
494
+ if (this.componentRef) {
495
+ this.componentRef.destroy();
496
+ }
497
+ }
498
+ }
499
+ ValueItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ValueItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ComponentFactoryResolver }, { token: i16.MtnaWfManagerService }, { token: i7.MtnaLogger }, { token: MTNA_WF_ITEM_WHITELIST, optional: true }], target: i0.ɵɵFactoryTarget.Component });
500
+ ValueItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ValueItemComponent, selector: "mtna-wf-value-item", inputs: { control: "control", inList: "inList", indicatorStatus: "indicatorStatus", item: "item", parentIds: "parentIds", readonly: "readonly" }, viewQueries: [{ propertyName: "itemHost", first: true, predicate: MtnaWfFormItemDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container [ngSwitch]=\"item.itemId | getObjectType\">\n <h3 *ngSwitchCase=\"'titleitem'\" class=\"mtna-wf-title-item\" [mtnaHighlight]=\"indicatorStatus === 'ACTIVE'\">{{ item.value }}</h3>\n <p\n *ngSwitchCase=\"'textitem'\"\n [innerHTML]=\"$any(item.value) | mtnaWfSanitizeHtml\"\n class=\"mtna-wf-text-item\"\n [mtnaHighlight]=\"indicatorStatus === 'ACTIVE'\"\n ></p>\n\n <mtna-wf-boolean-item\n *ngSwitchCase=\"'booleanitem'\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n [control]=\"$any(control)\"\n [mtnaHighlight]=\"indicatorStatus === 'ACTIVE'\"\n [parentIds]=\"parentIds\"\n [readonly]=\"readonly\"\n ></mtna-wf-boolean-item>\n\n <mtna-wf-checkbox-item\n *ngSwitchCase=\"'checkboxitem'\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n [control]=\"$any(control)\"\n [parentIds]=\"parentIds\"\n [readonly]=\"readonly\"\n ></mtna-wf-checkbox-item>\n\n <ng-container *ngSwitchCase=\"'dateitem'\">\n <mtna-wf-date-item\n *ngIf=\"item | coerceDateItem as dateItem\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [format]=\"dateItem.format\"\n [item]=\"dateItem\"\n [control]=\"$any(control)\"\n [readonly]=\"readonly\"\n ></mtna-wf-date-item>\n </ng-container>\n\n <mtna-wf-date-range\n *ngSwitchCase=\"'offsetdaterangeitem'\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n [control]=\"$any(control)\"\n [readonly]=\"readonly\"\n ></mtna-wf-date-range>\n\n <mtna-wf-year-quarter-range-item\n *ngSwitchCase=\"'yearquarterrangeitem'\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n [control]=\"$any(control)\"\n [readonly]=\"readonly\"\n ></mtna-wf-year-quarter-range-item>\n\n <mtna-wf-dropdown-item\n *ngSwitchCase=\"'dropdownitem'\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n [inList]=\"inList\"\n [control]=\"$any(control)\"\n [readonly]=\"readonly\"\n ></mtna-wf-dropdown-item>\n\n <mtna-wf-file-upload-item\n *ngSwitchCase=\"'fileuploaditem'\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n [readonly]=\"readonly\"\n (file)=\"setValue($event)\"\n ></mtna-wf-file-upload-item>\n\n <mtna-wf-unordered-list-item\n *ngSwitchCase=\"'bulletedlistitem'\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n ></mtna-wf-unordered-list-item>\n\n <mtna-wf-ordered-list-item\n *ngSwitchCase=\"'numberedlistitem'\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n ></mtna-wf-ordered-list-item>\n\n <mtna-wf-multiple-choice-item\n *ngSwitchCase=\"'multiplechoiceitem'\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n [control]=\"$any(control)\"\n [parentIds]=\"parentIds\"\n [readonly]=\"readonly\"\n ></mtna-wf-multiple-choice-item>\n\n <mtna-wf-input-item\n *ngSwitchCase=\"'shortansweritem'\"\n mtnaWfShortAnswerItem\n [control]=\"$any(control)\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [inList]=\"inList\"\n [item]=\"$any(item)\"\n [readonly]=\"readonly\"\n ></mtna-wf-input-item>\n\n <mtna-wf-input-item\n *ngSwitchCase=\"'paragraphansweritem'\"\n mtnaWfParagraphItem\n [control]=\"$any(control)\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [inList]=\"inList\"\n [item]=\"$any(item)\"\n [readonly]=\"readonly\"\n ></mtna-wf-input-item>\n\n <mtna-wf-table-item\n *ngSwitchCase=\"'tableitem'\"\n [control]=\"$any(control)\"\n [indicatorStatus]=\"indicatorStatus\"\n [item]=\"$any(item)\"\n [readonly]=\"readonly\"\n [parentIds]=\"parentIds\"\n ></mtna-wf-table-item>\n\n <mtna-wf-input-item\n *ngSwitchCase=\"'decimalansweritem'\"\n mtnaWfDecimalItem\n [control]=\"$any(control)\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [inList]=\"inList\"\n [item]=\"$any(item)\"\n [readonly]=\"readonly\"\n ></mtna-wf-input-item>\n\n <mtna-wf-input-item\n *ngSwitchCase=\"'wholenumberansweritem'\"\n mtnaWfWholeNumberItem\n [control]=\"$any(control)\"\n [header]=\"itemHeader\"\n [indicatorStatus]=\"indicatorStatus\"\n [inList]=\"inList\"\n [item]=\"$any(item)\"\n [readonly]=\"readonly\"\n ></mtna-wf-input-item>\n\n <!-- DYNAMIC COMPONENT CONTAINER -->\n <ng-template *ngSwitchDefault formItemHost></ng-template>\n</ng-container>\n\n<ng-template #itemHeader let-hideRequiredMarker>\n <mtna-wf-item-header\n *ngIf=\"!!item.questionText || !!item.descriptiveText\"\n [descriptiveText]=\"item.descriptiveText\"\n [disabled]=\"control?.disabled\"\n [hideRequiredMarker]=\"hideRequiredMarker\"\n [invalid]=\"control?.invalid && (control?.dirty || control?.touched)\"\n [questionText]=\"item.questionText\"\n [required]=\"item.required\"\n ></mtna-wf-item-header>\n</ng-template>\n", components: [{ type: i0.forwardRef(function () { return MtnaWfBooleanComponent; }), selector: "mtna-wf-boolean-item" }, { type: i0.forwardRef(function () { return MtnaWfCheckboxComponent; }), selector: "mtna-wf-checkbox-item", inputs: ["color"] }, { type: i0.forwardRef(function () { return i21.MtnaWfDateComponent; }), selector: "mtna-wf-date-item", inputs: ["format", "rangeLimits"] }, { type: i0.forwardRef(function () { return i22.MtnaWfDateRangeComponent; }), selector: "mtna-wf-date-range" }, { type: i0.forwardRef(function () { return i23.MtnaWfYearQuarterRangeComponent; }), selector: "mtna-wf-year-quarter-range-item" }, { type: i0.forwardRef(function () { return i24.MtnaWfDropdownComponent; }), selector: "mtna-wf-dropdown-item" }, { type: i0.forwardRef(function () { return i25.MtnaWfFileUploadComponent; }), selector: "mtna-wf-file-upload-item", inputs: ["header", "indicatorStatus", "item", "readonly"], outputs: ["file"] }, { type: i0.forwardRef(function () { return i26.MtnaWfUnorderedListItemComponent; }), selector: "mtna-wf-unordered-list-item", inputs: ["header", "indicatorStatus", "item"] }, { type: i0.forwardRef(function () { return i27.MtnaWfOrderedListItemComponent; }), selector: "mtna-wf-ordered-list-item", inputs: ["header", "indicatorStatus", "item"] }, { type: i0.forwardRef(function () { return MtnaWfMultipleChoiceComponent; }), selector: "mtna-wf-multiple-choice-item" }, { type: i0.forwardRef(function () { return i28.MtnaWfInputComponent; }), selector: "mtna-wf-input-item[mtnaWfDecimalItem],\n mtna-wf-input-item[mtnaWfParagraphItem],\n mtna-wf-input-item[mtnaWfShortAnswerItem],\n mtna-wf-input-item[mtnaWfWholeNumberItem]," }, { type: i0.forwardRef(function () { return MtnaWfTableFormItemComponent; }), selector: "mtna-wf-table-item", inputs: ["indicatorStatus", "item", "control", "readonly", "parentIds"] }, { type: i0.forwardRef(function () { return i11.ItemHeaderComponent; }), selector: "mtna-wf-item-header", inputs: ["descriptiveText", "disabled", "hideRequiredMarker", "invalid", "questionText", "required"] }], directives: [{ type: i0.forwardRef(function () { return i3.NgSwitch; }), selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i0.forwardRef(function () { return i3.NgSwitchCase; }), selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i0.forwardRef(function () { return i7.MtnaHighlightDirective; }), selector: "[mtnaHighlight]", inputs: ["mtnaHighlight", "mtnaHighlightColor"], exportAs: ["mtnaHighlight"] }, { type: i0.forwardRef(function () { return i3.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i0.forwardRef(function () { return i3.NgSwitchDefault; }), selector: "[ngSwitchDefault]" }, { type: i0.forwardRef(function () { return i29.MtnaWfFormItemDirective; }), selector: "[formItemHost]" }], pipes: { "getObjectType": i0.forwardRef(function () { return i8.GetObjectTypePipe; }), "mtnaWfSanitizeHtml": i0.forwardRef(function () { return i30.MtnaWfSanitizeHtmlPipe; }), "coerceDateItem": i0.forwardRef(function () { return i31.CoerceDateItemPipe; }) }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
501
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ValueItemComponent, decorators: [{
502
+ type: Component,
503
+ args: [{
504
+ selector: 'mtna-wf-value-item',
505
+ templateUrl: './value-item.component.html',
506
+ changeDetection: ChangeDetectionStrategy.OnPush,
507
+ }]
508
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ComponentFactoryResolver }, { type: i16.MtnaWfManagerService }, { type: i7.MtnaLogger }, { type: undefined, decorators: [{
509
+ type: Optional
510
+ }, {
511
+ type: Inject,
512
+ args: [MTNA_WF_ITEM_WHITELIST]
513
+ }] }]; }, propDecorators: { itemHost: [{
514
+ type: ViewChild,
515
+ args: [MtnaWfFormItemDirective]
516
+ }], control: [{
517
+ type: Input
518
+ }], inList: [{
519
+ type: Input
520
+ }], indicatorStatus: [{
521
+ type: Input
522
+ }], item: [{
523
+ type: Input
524
+ }], parentIds: [{
525
+ type: Input
526
+ }], readonly: [{
527
+ type: Input
528
+ }] } });
529
+ export class MtnaWfMultipleChoiceComponent extends BaseSingleSelectionParent {
530
+ constructor(uiService) {
531
+ super(uiService);
532
+ }
533
+ }
534
+ MtnaWfMultipleChoiceComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfMultipleChoiceComponent, deps: [{ token: i5.MtnaWfUIService }], target: i0.ɵɵFactoryTarget.Component });
535
+ MtnaWfMultipleChoiceComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfMultipleChoiceComponent, selector: "mtna-wf-multiple-choice-item", usesInheritance: true, ngImport: i0, template: "<ng-container *ngTemplateOutlet=\"header\"></ng-container>\n<ng-container *ngIf=\"control\">\n <div class=\"mtna-wf-error-container\">\n <ng-container *ngIf=\"control.invalid && (control.dirty || control.touched)\">\n <mat-error *ngFor=\"let error of control.errors | keyvalue\">\n {{ error | mtnaWfGetControlError : item }}\n </mat-error>\n </ng-container>\n </div>\n <mat-radio-group class=\"control-item-content\" [formControl]=\"control\" (change)=\"selectionChange($event)\">\n <ng-container *ngFor=\"let opt of item.options; trackBy: _trackByOptionId\">\n <mat-radio-button [disableRipple]=\"readonly\" [value]=\"opt.option.id\">{{ opt.option.name }}</mat-radio-button>\n <mtna-wf-item\n *ngIf=\"item.optionItemMap[opt.option.id] as subItem\"\n [item]=\"subItem\"\n [control]=\"!!controlWrapper && !!controlWrapper.controls ? controlWrapper.controls[subItem.instanceId] : undefined\"\n [parentIds]=\"parentIds.concat(opt.option.id)\"\n [readonly]=\"readonly\"\n ></mtna-wf-item>\n </ng-container>\n </mat-radio-group>\n</ng-container>\n", styles: [".mtna-wf-control-item .mat-form-field{width:100%}.mtna-wf-control-item .mtna-wf-error-container{font-size:75%;line-height:1;min-height:1em;margin-top:-.75rem}.mtna-wf-control-item .control-item-content{padding:.35em .75em .625em}.mtna-wf-control-item .mtna-wf-item-header~:not(.mtna-wf-error-container):not(.mat-list){padding-left:.75em}.mtna-wf-control-item .mtna-wf-item-header~:not(.mtna-wf-error-container):not(.mat-list).mat-form-field{width:calc(100% - .75em)}\n", "mtna-wf-multiple-choice-item .mat-radio-group{display:inline-block;max-width:100%;width:100%}mtna-wf-multiple-choice-item .mat-radio-button{display:block;max-width:100%}mtna-wf-multiple-choice-item .mat-radio-button:not(:last-of-type){margin-bottom:4px}mtna-wf-multiple-choice-item .mat-radio-button .mat-radio-label{white-space:normal}mtna-wf-multiple-choice-item .mat-radio-button+mtna-wf-item{padding-left:28px;margin-top:0}mtna-wf-multiple-choice-item.read-only .mat-radio-button .mat-radio-label{cursor:default}\n"], components: [{ type: i32.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { type: MtnaWfFormItemComponent, selector: "mtna-wf-item", inputs: ["item", "readonly", "control", "parentIds", "step"], outputs: ["focusedSection"] }], directives: [{ type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i33.MatError, selector: "mat-error", inputs: ["id"] }, { type: i32.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i13.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], pipes: { "keyvalue": i3.KeyValuePipe, "mtnaWfGetControlError": i34.MtnaGetFormControlErrorPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
536
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfMultipleChoiceComponent, decorators: [{
537
+ type: Component,
538
+ args: [{
539
+ selector: 'mtna-wf-multiple-choice-item',
540
+ templateUrl: 'multiple-choice.component.html',
541
+ styleUrls: [
542
+ `../form-item-controls/form-control.scss`,
543
+ 'multiple-choice.component.scss',
544
+ ],
545
+ encapsulation: ViewEncapsulation.None,
546
+ changeDetection: ChangeDetectionStrategy.OnPush,
547
+ }]
548
+ }], ctorParameters: function () { return [{ type: i5.MtnaWfUIService }]; } });
549
+ export class MtnaWfBooleanComponent extends BaseParentItemControl {
550
+ constructor(uiService) {
551
+ super();
552
+ this.uiService = uiService;
553
+ }
554
+ toggleChange(change) {
555
+ this.uiService.toggleFormItems(this.item.option.enabledItems, this.item.option.disabledItems, change.checked, this.item.instanceId);
556
+ }
557
+ _trackByInstanceId(index, item) {
558
+ return item.value.instanceId;
559
+ }
560
+ }
561
+ MtnaWfBooleanComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfBooleanComponent, deps: [{ token: i5.MtnaWfUIService }], target: i0.ɵɵFactoryTarget.Component });
562
+ MtnaWfBooleanComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfBooleanComponent, selector: "mtna-wf-boolean-item", usesInheritance: true, ngImport: i0, template: "<ng-container *ngTemplateOutlet=\"header\"></ng-container>\n<mat-slide-toggle *ngIf=\"control\" [formControl]=\"control\" (change)=\"toggleChange($event)\">{{ item.option.option.name }}</mat-slide-toggle>\n<ng-container *ngIf=\"!!item.optionItemMap\">\n <mtna-wf-item\n *ngFor=\"let f of item.optionItemMap | keyvalue; trackBy: _trackByInstanceId\"\n [item]=\"f.value\"\n [control]=\"!!controlWrapper && controlWrapper.controls ? controlWrapper.controls[f.value.instanceId] : undefined\"\n [parentIds]=\"parentIds\"\n [readonly]=\"readonly\"\n ></mtna-wf-item>\n <ng-container> </ng-container\n></ng-container>\n", styles: [".mtna-wf-control-item .mat-form-field{width:100%}.mtna-wf-control-item .mtna-wf-error-container{font-size:75%;line-height:1;min-height:1em;margin-top:-.75rem}.mtna-wf-control-item .control-item-content{padding:.35em .75em .625em}.mtna-wf-control-item .mtna-wf-item-header~:not(.mtna-wf-error-container):not(.mat-list){padding-left:.75em}.mtna-wf-control-item .mtna-wf-item-header~:not(.mtna-wf-error-container):not(.mat-list).mat-form-field{width:calc(100% - .75em)}\n", "mtna-annotations-indicator+mtna-wf-value-item>mtna-wf-boolean-item{padding-right:24px}mtna-wf-boolean-item{display:block}mtna-wf-boolean-item .mat-slide-toggle{margin:4px 0}mtna-wf-boolean-item .mat-slide-toggle+mtna-wf-item{margin-top:0}mtna-wf-boolean-item .mat-slide-toggle~mtna-wf-item{padding-left:18px}mtna-wf-boolean-item.read-only .mat-slide-toggle.mat-disabled{opacity:.8}mtna-wf-boolean-item.read-only .mat-slide-toggle .mat-slide-toggle-label,mtna-wf-boolean-item.read-only .mat-slide-toggle .mat-slide-toggle-label .mat-slide-toggle-bar .mat-slide-toggle-thumb-container{cursor:default}mtna-wf-boolean-item .mat-slide-toggle{height:auto;min-height:24px}mtna-wf-boolean-item .mat-slide-toggle>.mat-slide-toggle-label>.mat-slide-toggle-content{white-space:normal}\n"], components: [{ type: i35.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "required", "checked", "aria-describedby"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: MtnaWfFormItemComponent, selector: "mtna-wf-item", inputs: ["item", "readonly", "control", "parentIds", "step"], outputs: ["focusedSection"] }], directives: [{ type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i13.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "keyvalue": i3.KeyValuePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
563
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfBooleanComponent, decorators: [{
564
+ type: Component,
565
+ args: [{
566
+ selector: 'mtna-wf-boolean-item',
567
+ templateUrl: 'boolean.component.html',
568
+ styleUrls: [
569
+ `../form-item-controls/form-control.scss`,
570
+ 'boolean.component.scss',
571
+ ],
572
+ encapsulation: ViewEncapsulation.None,
573
+ changeDetection: ChangeDetectionStrategy.OnPush,
574
+ }]
575
+ }], ctorParameters: function () { return [{ type: i5.MtnaWfUIService }]; } });
576
+ export class MtnaWfCheckboxComponent extends BaseParentItemControl {
577
+ constructor(dialogService, uiService) {
578
+ super();
579
+ this.dialogService = dialogService;
580
+ this.uiService = uiService;
581
+ this.destroyed$ = new Subject();
582
+ }
583
+ handleChange(change, index) {
584
+ var _a;
585
+ const option = this.item.options[index];
586
+ const formControl = (_a = this.control) === null || _a === void 0 ? void 0 : _a.controls[index];
587
+ // If the user is trying to make a selection with something that has an acknowledgement,
588
+ // show the acknowledge dialog first to get their consent.
589
+ // Note: we don't need to show the acknowledgement if the user is unchecking the box.
590
+ if (option.acknowledgement && (formControl === null || formControl === void 0 ? void 0 : formControl.value)) {
591
+ // Revert the checkbox to an unchecked state until they agree to the acknowledgement
592
+ formControl === null || formControl === void 0 ? void 0 : formControl.setValue(false);
593
+ this.dialogService
594
+ .verifyAcknowledgement(option.acknowledgement)
595
+ .pipe(takeUntil(this.destroyed$))
596
+ .subscribe((acknowledged) => {
597
+ if (acknowledged) {
598
+ formControl === null || formControl === void 0 ? void 0 : formControl.setValue(true);
599
+ this.uiService.toggleFormItems(option.enabledItems, option.disabledItems, change.checked, this.item.instanceId);
600
+ }
601
+ });
602
+ }
603
+ else {
604
+ this.uiService.toggleFormItems(option.enabledItems, option.disabledItems, change.checked, this.item.instanceId);
605
+ }
606
+ }
607
+ ngOnDestroy() {
608
+ this.destroyed$.next();
609
+ this.destroyed$.complete();
610
+ }
611
+ /**
612
+ * Display what the user already acknowledged for a given option.
613
+ * @param event the browser event when the button was invoked
614
+ * @param acknowledgementItem The form item that represents the acknowledgement text to display to the user.
615
+ * */
616
+ showAcknowledgement(event, acknowledgementItem) {
617
+ event.stopPropagation();
618
+ event.preventDefault();
619
+ this.dialogService.showAcknowledgement(acknowledgementItem);
620
+ }
621
+ /**
622
+ * Stop a browser event from propagating
623
+ * @param event the event to stop
624
+ */
625
+ stopEventPropagation(event) {
626
+ event.stopPropagation();
627
+ }
628
+ }
629
+ MtnaWfCheckboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfCheckboxComponent, deps: [{ token: MtnaWfDialogService }, { token: i5.MtnaWfUIService }], target: i0.ɵɵFactoryTarget.Component });
630
+ MtnaWfCheckboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfCheckboxComponent, selector: "mtna-wf-checkbox-item", inputs: { color: "color" }, usesInheritance: true, ngImport: i0, template: "<ng-container *ngTemplateOutlet=\"header\"></ng-container>\n<div *ngIf=\"hasItemHeader\" class=\"mtna-wf-error-container\">\n <ng-container *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <mat-error *ngFor=\"let error of control?.errors | keyvalue\">\n {{ error | mtnaWfGetControlError : item }}\n </mat-error>\n </ng-container>\n</div>\n<fieldset\n class=\"control-item-content\"\n [class.single-option]=\"item.options?.length === 1\"\n [mtnaHighlight]=\"indicatorStatus === 'ACTIVE' && !hasItemHeader\"\n>\n <ng-container *ngFor=\"let opt of item.options; let i = index; trackBy: _trackByOptionId\">\n <mat-checkbox\n *ngIf=\"!!control && !!control.controls && !!control.controls[i]\"\n [disableRipple]=\"readonly\"\n [formControl]=\"$any(control.controls[i])\"\n [color]=\"color\"\n (change)=\"handleChange($event, i)\"\n >{{ opt.option.name }}\n <button\n *ngIf=\"opt.acknowledgement && control.controls[i].value\"\n aria-label=\"Acknowledged. Click to view the agreement.\"\n class=\"acknowledge-verification-button\"\n mat-icon-button\n matTooltip=\"Acknowledged. Click to view the agreement.\"\n matTooltipShowDelay=\"800\"\n (click)=\"showAcknowledgement($event, opt.acknowledgement)\"\n (mousedown)=\"stopEventPropagation($event)\"\n (touchstart)=\"stopEventPropagation($event)\"\n >\n <mat-icon>verified</mat-icon>\n </button>\n </mat-checkbox>\n <ng-container *ngIf=\"item.optionItemMap[opt.option.id]\">\n <mtna-wf-item\n *ngIf=\"item.optionItemMap[opt.option.id] as subItem\"\n [item]=\"subItem\"\n [control]=\"!!controlWrapper && controlWrapper.controls ? controlWrapper.controls[subItem.instanceId] : undefined\"\n [readonly]=\"readonly\"\n [parentIds]=\"parentIds.concat(opt.option.id)\"\n ></mtna-wf-item>\n </ng-container>\n </ng-container>\n</fieldset>\n", styles: [".mtna-wf-control-item .mat-form-field{width:100%}.mtna-wf-control-item .mtna-wf-error-container{font-size:75%;line-height:1;min-height:1em;margin-top:-.75rem}.mtna-wf-control-item .control-item-content{padding:.35em .75em .625em}.mtna-wf-control-item .mtna-wf-item-header~:not(.mtna-wf-error-container):not(.mat-list){padding-left:.75em}.mtna-wf-control-item .mtna-wf-item-header~:not(.mtna-wf-error-container):not(.mat-list).mat-form-field{width:calc(100% - .75em)}\n", "mtna-wf-checkbox-item{display:flex;flex-direction:column;position:relative}mtna-wf-checkbox-item .mat-checkbox{display:block}mtna-wf-checkbox-item .mat-checkbox>.mat-checkbox-layout{display:block}mtna-wf-checkbox-item .mat-checkbox>.mat-checkbox-layout>.mat-checkbox-label{white-space:normal}mtna-wf-checkbox-item .mat-checkbox .acknowledge-verification-button{vertical-align:top;width:18px;height:18px;line-height:18px;margin-left:4px}mtna-wf-checkbox-item .mat-checkbox .acknowledge-verification-button .mat-icon{width:18px;height:18px;line-height:18px;font-size:18px}mtna-wf-checkbox-item fieldset{border:none;margin:0}mtna-wf-checkbox-item fieldset.control-item-content.single-option{padding:0}mtna-wf-checkbox-item .mat-checkbox+mtna-wf-item{margin-top:0;padding-left:24px}mtna-wf-checkbox-item.read-only .mat-checkbox{cursor:default}\n"], components: [{ type: i36.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i2.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: i18.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: MtnaWfFormItemComponent, selector: "mtna-wf-item", inputs: ["item", "readonly", "control", "parentIds", "step"], outputs: ["focusedSection"] }], directives: [{ type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i33.MatError, selector: "mat-error", inputs: ["id"] }, { type: i7.MtnaHighlightDirective, selector: "[mtnaHighlight]", inputs: ["mtnaHighlight", "mtnaHighlightColor"], exportAs: ["mtnaHighlight"] }, { type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i13.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i19.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], pipes: { "keyvalue": i3.KeyValuePipe, "mtnaWfGetControlError": i34.MtnaGetFormControlErrorPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
631
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfCheckboxComponent, decorators: [{
632
+ type: Component,
633
+ args: [{
634
+ selector: 'mtna-wf-checkbox-item',
635
+ templateUrl: 'checkbox.component.html',
636
+ styleUrls: [
637
+ `../form-item-controls/form-control.scss`,
638
+ 'checkbox.component.scss',
639
+ ],
640
+ encapsulation: ViewEncapsulation.None,
641
+ changeDetection: ChangeDetectionStrategy.OnPush,
642
+ }]
643
+ }], ctorParameters: function () { return [{ type: MtnaWfDialogService }, { type: i5.MtnaWfUIService }]; }, propDecorators: { color: [{
644
+ type: Input
645
+ }] } });
646
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtY29tcG9uZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9ncm91cHMvZ3JvdXAtY29tcG9uZW50cy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9ncm91cHMvYWNrbm93bGVkZ2UtZGlhbG9nLmNvbXBvbmVudC5odG1sIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2ViLWZvcm0tYW5ndWxhci9zcmMvbGliL2dyb3Vwcy9mb3JtLWl0ZW0uY29tcG9uZW50Lmh0bWwiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ZWItZm9ybS1hbmd1bGFyL3NyYy9saWIvZ3JvdXBzL2Zvcm0taXRlbS1kaWFsb2cuY29tcG9uZW50Lmh0bWwiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ZWItZm9ybS1hbmd1bGFyL3NyYy9saWIvZ3JvdXBzL2Zvcm0tc2VjdGlvbi5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9ncm91cHMvZm9ybS1ncm91cC5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9ncm91cHMvcmVwZWF0YWJsZS1pdGVtLWNvbnRhaW5lci5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9ncm91cHMvdGFibGUtaXRlbS5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9ncm91cHMvdmFsdWUtaXRlbS5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9ncm91cHMvbXVsdGlwbGUtY2hvaWNlLmNvbXBvbmVudC5odG1sIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2ViLWZvcm0tYW5ndWxhci9zcmMvbGliL2dyb3Vwcy9ib29sZWFuLmNvbXBvbmVudC5odG1sIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2ViLWZvcm0tYW5ndWxhci9zcmMvbGliL2dyb3Vwcy9jaGVja2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUlULFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxFQUNOLFVBQVUsRUFDVixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxlQUFlLEVBQTJCLE1BQU0sMEJBQTBCLENBQUM7QUFHcEYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd0QyxPQUFPLEVBR0wsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUd2QixpQkFBaUIsRUFDakIsb0JBQW9CLEVBRXBCLHdCQUF3QixFQUd4QixVQUFVLEVBQ1Ysb0JBQW9CLEVBR3BCLFlBQVksRUFDWixhQUFhLEdBRWQsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQixPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUcvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwREFBMEQsQ0FB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RCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7OztTQUlLO0lBQ0wsbUJBQW1CLENBQUMsS0FBWSxFQUFFLG1CQUE0QjtRQUM1RCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsb0JBQW9CLENBQUMsS0FBWTtRQUMvQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7cUhBdkRVLHVCQUF1QixrQkFLQyxtQkFBbUI7eUdBTDNDLHVCQUF1QixnSFcvZnBDLG04REE4Q0EsK2lFWCtGYSx1QkFBdUI7NEZBa1h2Qix1QkFBdUI7a0JBVm5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsV0FBVyxFQUFFLHlCQUF5QjtvQkFDdEMsU0FBUyxFQUFFO3dCQUNULHlDQUF5Qzt3QkFDekMseUJBQXlCO3FCQUMxQjtvQkFDRCxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzBEQU1vQyxtQkFBbUIsd0RBSjdDLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgQ29tcG9uZW50UmVmLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIEluamVjdGFibGUsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBUaGVtZVBhbGV0dGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGVDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuXG5pbXBvcnQgeyBpc0tleSB9IGZyb20gJ0BtdG5hL2NvcmUtdHMnO1xuaW1wb3J0IHsgQ2FuRGVzdHJveU5vdGlmeSwgTXRuYUxvZ2dlciB9IGZyb20gJ0BtdG5hL2NvcmUtYW5ndWxhcic7XG5pbXBvcnQgeyBBbm5vdGF0aW9uSW5kaWNhdG9yU3RhdHVzLCBJbmRpY2F0b3JTdGF0dXNSZXBlYXRlciB9IGZyb20gJ0BtdG5hL3Bvam8tc29jaWFsLWFuZ3VsYXInO1xuaW1wb3J0IHtcbiAgQm9vbGVhbkl0ZW0sXG4gIENoZWNrYm94SXRlbSxcbiAgRFJPUERPV05fSVRFTV9JRCxcbiAgRk9STV9JVEVNX0dST1VQX0lNUExfSUQsXG4gIEZvcm1JdGVtLFxuICBGb3JtSXRlbUdyb3VwSW1wbCxcbiAgaXNDb25kaXRpb25hbEl0ZW0sXG4gIE10bmFXZkZvcm1JdGVtQ2hhbmdlLFxuICBNdWx0aXBsZUNob2ljZUl0ZW0sXG4gIFBBUkFHUkFQSF9BTlNXRVJfSVRFTV9JRCxcbiAgUmVwZWF0YWJsZUl0ZW0sXG4gIFNlY3Rpb24sXG4gIFNFQ1RJT05fSUQsXG4gIFNIT1JUX0FOU1dFUl9JVEVNX0lELFxuICBUYWJsZUl0ZW0sXG4gIFRhYmxlUm93SXRlbSxcbiAgVEVYVF9JVEVNX0lELFxuICBUSVRMRV9JVEVNX0lELFxuICBWYWx1ZUl0ZW0sXG59IGZyb20gJ0BtdG5hL3dlYi1mb3JtLXRzJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDT01QTEVYX1NUQU5EQVJELCBNVE5BX1dGX0VYUEFORF9DT0xMQVBTRSB9IGZyb20gJy4uL2NvcmUvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBNdG5hV2ZNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uL2NvcmUvc2VydmljZXMvZm9ybS1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTXRuYVdmVUlTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9zZXJ2aWNlcy91aS5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VQYXJlbnRJdGVtQ29udHJvbCB9IGZyb20gJy4uL2Zvcm0taXRlbS1jb250cm9scy9iYXNlLXBhcmVudC1pdGVtLWNvbnRyb2wuZGlyZWN0aXZlJztcbmltcG9ydCB7IEJhc2VTaW5nbGVTZWxlY3Rpb25QYXJlbnQgfSBmcm9tICcuLi9mb3JtLWl0ZW0tY29udHJvbHMvYmFzZS1zaW5nbGUtc2VsZWN0aW9uLXBhcmVudC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTXRuYVdmRm9ybUl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuLi9mb3JtL2Zvcm0taXRlbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRm9ybVN0ZXAgfSBmcm9tICcuLi9mb3JtLXN0ZXBwZXIvbW9kZWxzL2Zvcm0tc3RlcC5tb2RlbCc7XG5pbXBvcnQgeyBNVE5BX1dGX0lURU1fV0hJVEVMSVNULCBNdG5hV2ZJdGVtV2hpdGVMaXN0IH0gZnJvbSAnLi4vZm9ybS93aGl0ZS1saXN0Lm1vZGVsJztcbmltcG9ydCB7IE10bmFXZkZvcm1JdGVtRGlhbG9nRGF0YSB9IGZyb20gJy4vZm9ybS1pdGVtLWRpYWxvZy1kYXRhLm1vZGVsJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBNdG5hV2ZEaWFsb2dTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZykge31cblxuICAvKipcbiAgICogRGlzcGxheSB0aGUgYWNrbm93bGVkZ2VtZW50IHRoZSB1c2VyIGFncmVlZCB0byBmb3IgYSBnaXZlbiBvcHRpb24uXG4gICAqIEBwYXJhbSBhY2tub3dsZWRnZW1lbnRJdGVtIFRoZSB7QGxpbmsgU2VjdGlvbn0gdGhhdCByZXByZXNlbnRzIHRoZSBhY2tub3dsZWRnZW1lbnQgdGV4dCB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgc2hvd0Fja25vd2xlZGdlbWVudChhY2tub3dsZWRnZW1lbnRJdGVtOiBTZWN0aW9uKSB7XG4gICAgdGhpcy5kaWFsb2cub3BlbihNdG5hV2ZGb3JtSXRlbURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgY2xvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICBkYXRhOiBuZXcgTXRuYVdmRm9ybUl0ZW1EaWFsb2dEYXRhKGFja25vd2xlZGdlbWVudEl0ZW0uaXRlbXMsIGFja25vd2xlZGdlbWVudEl0ZW0udGl0bGUudmFsdWUgfHwgJ0Fja25vd2xlZGdlbWVudCcpLFxuICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgbWF4V2lkdGg6ICc1MDBweCcsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBzb21lIHRleHQgaW4gYSBkaWFsb2cgdGhhdCB0aGUgdXNlciBuZWVkcyB0byBcImFja25vd2xlZGdlXCIgYmVmb3JlIHRoZXkgY2FuIG1ha2UgYSBjZXJ0YWluIHNlbGVjdGlvbi5cbiAgICogQHBhcmFtIGFja25vd2xlZGdlbWVudEl0ZW0gVGhlIHtAbGluayBTZWN0aW9ufSB0aGF0IHJlcHJlc2VudHMgdGhlIHRleHQgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGZvciBhY2tub3dsZWRnZW1lbnQuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHVzZXIgYWNrbm93bGVkZ2VzIChhZ3JlZXMpLlxuICAgKi9cbiAgdmVyaWZ5QWNrbm93bGVkZ2VtZW50KGFja25vd2xlZGdlbWVudEl0ZW06IFNlY3Rpb24pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dcbiAgICAgIC5vcGVuKE10bmFXZkFja25vd2xlZGdlRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgIGNsb3NlT25OYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgICBkYXRhOiBuZXcgTXRuYVdmRm9ybUl0ZW1EaWFsb2dEYXRhKGFja25vd2xlZGdlbWVudEl0ZW0uaXRlbXMsIGFja25vd2xlZGdlbWVudEl0ZW0udGl0bGUudmFsdWUgfHwgJ0Fja25vd2xlZGdlbWVudCcpLFxuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICBtYXhXaWR0aDogJzUwMHB4JyxcbiAgICAgIH0pXG4gICAgICAuYWZ0ZXJDbG9zZWQoKTtcbiAgfVxufVxuXG4vKlxuICogRHVlIHRvIHRoZSByZWN1cnNpdmUgbmF0dXJlIG9mIHRoZXNlIGZvcm0gY29tcG9uZW50cywgd2UgaGFkIHRvIGNvbWJpbmUgYWxsIHRoZSBUUyBpbnRvIGEgc2luZ2xlIGZpbGUuXG4gKiBQZXJoYXBzIHdoZW4gd2UgcmVmYWN0b3IgdGhpcyBpbiB0aGUgZnV0dXJlIHRvIHVzZSBkeW5hbWljIGNvbXBvbmVudHMsIHRoaXMgY2FuIGJlIGF2b2lkZWQuXG4gKiBSZWFkIG1vcmUgYWJvdXQgdGhlIGVycm9ycyBpZiB0aGV5IGFyZSBub3QgaW4gdGhlIHNhbWUgZmlsZSBoZXJlOiBodHRwczovL2FuZ3VsYXIuaW8vZXJyb3JzL05HMzAwM1xuICovXG5cbi8vIFRPRE86IHJlZmFjdG9yLCByZWR1Y2UgY29kZSBpbiBoZXJlLiBtaXhpbnNcblxuLyoqXG4gKiBBIGRpYWxvZyB0aGF0IHJlbmRlcnMgYSBmb3JtIGl0ZW0gdGhhdCByZXByZXNlbnRzIHNvbWV0aGluZyB0aGUgdXNlciBuZWVkcyB0byBhY2tub3dsZWRnZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXRuYS13Zi1hY2tub3dsZWRnZS1kaWFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJ2Fja25vd2xlZGdlLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIE10bmFXZkFja25vd2xlZGdlRGlhbG9nQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBNdG5hV2ZGb3JtSXRlbURpYWxvZ0RhdGEsXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE10bmFXZkFja25vd2xlZGdlRGlhbG9nQ29tcG9uZW50LCBib29sZWFuPlxuICApIHt9XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHRoYXQgd3JhcHMgYW4gTXRuYUZvcm0gaXRlbS5cbiAqXG4gKiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2ggd2FzIG5vdCB3b3JraW5nIGFzIG9mIDkvMTkvMjAxOC5cbiAqIER5bmFtaWMgY29tcG9uZW50cyBpbiB0aGUgVmFsdWVJdGVtQ29tcG9uZW50IHdlcmUgbm90IGJlaW5nIGluaXRpYWxpemVkIChuZ09uSW5pdCB3YXMgbmV2ZXIgY2FsbGVkKS5cbiAqXG4gKiBAZXhwb3J0XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ210bmEtd2YtaXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGFuaW1hdGlvbnM6IFtNVE5BX1dGX0VYUEFORF9DT0xMQVBTRV0sXG59KVxuZXhwb3J0IGNsYXNzIE10bmFXZkZvcm1JdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQEhvc3RCaW5kaW5nKCdAbXRuYVdmRXhwYW5kQ29sbGFwc2UnKSB2aXNpYmxlID0gdHJ1ZTtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICBnZXQgZWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbSA/IHRoaXMuaXRlbS5pbnN0YW5jZUlkIDogJyc7XG4gIH1cblxuICBASW5wdXQoKSBpdGVtITogRm9ybUl0ZW07XG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHBhcmVudElkcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIEBJbnB1dCgpIHN0ZXA6IEZvcm1TdGVwIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICBAT3V0cHV0KCkgZm9jdXNlZFNlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1TdGVwPigpO1xuXG4gIGFubm90YXRpb25zJD86IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD47XG4gIGluZGljYXRvclN0YXR1czogQW5ub3RhdGlvbkluZGljYXRvclN0YXR1cyA9ICdJTkFDVElWRSc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSB1aVNlcnZpY2U6IE10bmFXZlVJU2VydmljZSkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoaXNDb25kaXRpb25hbEl0ZW0odGhpcy5pdGVtKSkge1xuICAgICAgdGhpcy52aXNpYmxlID0gIXRoaXMuaXRlbS5oaWRlT25EaXNhYmxlIHx8ICF0aGlzLml0ZW0uZGlzYWJsZWQ7XG4gICAgfVxuICAgIHRoaXMudWlTZXJ2aWNlLnJlZ2lzdGVyU2VsZih0aGlzKTtcblxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGBtdG5hLXdmLSR7Z2V0SXRlbUNsYXNzU3VmZml4KHRoaXMuaXRlbS5pdGVtSWQpfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEl0ZW1DbGFzc1N1ZmZpeChpdGVtSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEZJWE1FOiBzdXJlbHkgdGhlcmUgaXMgYSBzdHJvbmdlci9iZXR0ZXIgd2F5XG4gIHN3aXRjaCAoaXRlbUlkKSB7XG4gICAgY2FzZSBGT1JNX0lURU1fR1JPVVBfSU1QTF9JRDpcbiAgICAgIHJldHVybiAnZ3JvdXAnO1xuICAgIGNhc2UgU0VDVElPTl9JRDpcbiAgICAgIHJldHVybiAnc2VjdGlvbic7XG4gICAgY2FzZSBURVhUX0lURU1fSUQ6XG4gICAgICByZXR1cm4gJ3RleHQnO1xuICAgIGNhc2UgVElUTEVfSVRFTV9JRDpcbiAgICAgIHJldHVybiAndGl0bGUnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ2l0ZW0nO1xuICB9XG59XG5cbi8qKlxuICogQSBkaWFsb2cgdGhhdCByZW5kZXJzIGEgZm9ybSBpdGVtLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdG5hLXdmLWZvcm0taXRlbS1kaWFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJ2Zvcm0taXRlbS1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBNdG5hV2ZGb3JtSXRlbURpYWxvZ0NvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogTXRuYVdmRm9ybUl0ZW1EaWFsb2dEYXRhLFxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxNdG5hV2ZGb3JtSXRlbURpYWxvZ0NvbXBvbmVudD5cbiAgKSB7fVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdG5hLXdmLXNlY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1zZWN0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS1zZWN0aW9uLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNdG5hV2ZGb3JtU2VjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIEluZGljYXRvclN0YXR1c1JlcGVhdGVyIHtcbiAgQElucHV0KCkgaW5kaWNhdG9yU3RhdHVzOiBBbm5vdGF0aW9uSW5kaWNhdG9yU3RhdHVzID0gJ0lOQUNUSVZFJztcbiAgQElucHV0KCkgaXRlbSE6IFNlY3Rpb247XG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN0ZXA6IEZvcm1TdGVwIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgQElucHV0KCkgY29udHJvbDogRm9ybUdyb3VwIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgcGFyZW50SWRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICBAT3V0cHV0KCkgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybVN0ZXA+KCk7XG5cbiAgX3RyYWNrQnlJbnN0YW5jZUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IEZvcm1JdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0uaW5zdGFuY2VJZDtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdG5hLXdmLWdyb3VwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLWdyb3VwLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBNdG5hV2ZGb3JtR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBJbmRpY2F0b3JTdGF0dXNSZXBlYXRlciB7XG4gIEBJbnB1dCgpIGNvbnRyb2w6IEZvcm1Hcm91cCB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGluZGljYXRvclN0YXR1czogQW5ub3RhdGlvbkluZGljYXRvclN0YXR1cyA9ICdJTkFDVElWRSc7XG5cbiAgQElucHV0KClcbiAgZ2V0IGl0ZW0oKTogRm9ybUl0ZW1Hcm91cEltcGwgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbTtcbiAgfVxuXG4gIHNldCBpdGVtKGl0ZW06IEZvcm1JdGVtR3JvdXBJbXBsIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuXG4gICAgaWYgKHRoaXMuaXRlbSkge1xuICAgICAgLy8gQSBsaXN0IGl0ZW0gY2FuIG9ubHkgZGlzcGxheSBhIGhlYWRpbmcgbGluZSAmIGEgc21hbGwgdGV4dCBsaW5lXG4gICAgICAvLyBDb21wYXRpYmxlIGl0ZW1zIHNob3VsZCBiZSBpdGVtcyB3aXRoIHNob3J0IGxhYmVscy9oZWFkZXJzICYgdmFsdWVzXG4gICAgICAvLyBJdGVtcyB3aXRoIG11bHRpcGxlIG9wdGlvbnMsIG9yIHBvdGVudGlhbCBuZXN0ZWQgaXRlbXMgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZFxuICAgICAgdGhpcy5pbkxpc3QgPSB0aGlzLml0ZW0uaXRlbXMuZXZlcnkoKGkpID0+IGkuaXRlbUlkID09PSBTSE9SVF9BTlNXRVJfSVRFTV9JRCB8fCBpLml0ZW1JZCA9PT0gRFJPUERPV05fSVRFTV9JRCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXRlbTogRm9ybUl0ZW1Hcm91cEltcGwgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpIHBhcmVudElkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuXG4gIGZ1bGxXaWR0aDogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHtcbiAgICBbUEFSQUdSQVBIX0FOU1dFUl9JVEVNX0lEXTogdHJ1ZSxcbiAgICBbRk9STV9JVEVNX0dST1VQX0lNUExfSURdOiB0cnVlLFxuICAgIFtURVhUX0lURU1fSURdOiB0cnVlLFxuICAgIFtUSVRMRV9JVEVNX0lEXTogdHJ1ZSxcbiAgfTtcblxuICAvKipcbiAgICogSWYgZm9ybSBpcyByZWFkb25seSAmIGFsbCBjaGlsZCBpdGVtcyBhcmUgb25lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMgYmVsb3csXG4gICAqIHdlIHdhbnQgdG8gZGlzcGxheSB0aGlzIGdyb3VwJ3MgY2hpbGQgaXRlbXMgaW4gYSBtYXQtbGlzdFxuICAgKi9cbiAgaW5MaXN0ID0gZmFsc2U7XG5cbiAgX3RyYWNrQnlJbnN0YW5jZUlkKGluZGV4OiBudW1iZXIsIHNlY3Rpb246IEZvcm1JdGVtKSB7XG4gICAgcmV0dXJuIHNlY3Rpb24uaW5zdGFuY2VJZDtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdG5hLXdmLXJlcGVhdGFibGUtaXRlbS1jb250YWluZXInLFxuICB0ZW1wbGF0ZVVybDogJ3JlcGVhdGFibGUtaXRlbS1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtgcmVwZWF0YWJsZS1pdGVtLWNvbnRhaW5lci5jb21wb25lbnQuc2Nzc2BdLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcigncmVwZWF0SXRlbUV4cGFuZENvbGxhcHNlJywgW1xuICAgICAgc3RhdGUoJ2luJywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgbWFyZ2luOiAnKicsIG9wYWNpdHk6IDEgfSkpLFxuICAgICAgc3RhdGUoJ3ZvaWQnLCBzdHlsZSh7IGhlaWdodDogMCwgbWFyZ2luOiAwLCBvcGFjaXR5OiAwLCB2aXNpYmlsaXR5OiAnaGlkZGVuJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbYW5pbWF0ZShDT01QTEVYX1NUQU5EQVJELCBzdHlsZSh7IGhlaWdodDogJyonLCBtYXJnaW46ICcqJywgb3BhY2l0eTogMSB9KSldKSxcbiAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIGFuaW1hdGUoQ09NUExFWF9TVEFOREFSRCkpLFxuICAgIF0pLFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgUmVwZWF0YWJsZUl0ZW1Db250YWluZXJDb21wb25lbnQgaW1wbGVtZW50cyBJbmRpY2F0b3JTdGF0dXNSZXBlYXRlciB7XG4gIEBJbnB1dCgpIGluZGljYXRvclN0YXR1czogQW5ub3RhdGlvbkluZGljYXRvclN0YXR1cyA9ICdJTkFDVElWRSc7XG4gIEBJbnB1dCgpIGl0ZW0hOiBSZXBlYXRhYmxlSXRlbTtcbiAgQElucHV0KCkgY29udHJvbDogRm9ybUdyb3VwIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgcGFyZW50SWRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1hbmFnZXI6IE10bmFXZk1hbmFnZXJTZXJ2aWNlKSB7fVxuXG4gIGFkZEl0ZW0oKSB7XG4gICAgdGhpcy5tYW5hZ2VyLmNoYW5nZU10bmFGb3JtSXRlbShuZXcgTXRuYVdmRm9ybUl0ZW1DaGFuZ2UodGhpcy5pdGVtLnJlcGVhdGFibGVUZW1wbGF0ZUlkLCB0aGlzLnBhcmVudElkcywgJ0FERCcpKTtcbiAgfVxuXG4gIHJlbW92ZUl0ZW0oaXRlbTogRm9ybUl0ZW0pIHtcbiAgICBjb25zdCBjb25kaXRpb25DaGFuZ2VzID0gdGhpcy5tYW5hZ2VyLmdlbmVyYXRlQ29uZGl0aW9uQ2hhbmdlQXJyYXkoaXRlbSwgJ1JFTU9WRScpO1xuICAgIHRoaXMubWFuYWdlci5jaGFuZ2VNdG5hRm9ybUl0ZW0obmV3IE10bmFXZkZvcm1JdGVtQ2hhbmdlKGl0ZW0uaW5zdGFuY2VJZCwgdGhpcy5wYXJlbnRJZHMsICdSRU1PVkUnLCBjb25kaXRpb25DaGFuZ2VzKSk7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXRuYS13Zi10YWJsZS1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICd0YWJsZS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3RhYmxlLWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE10bmFXZlRhYmxlRm9ybUl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBJbmRpY2F0b3JTdGF0dXNSZXBlYXRlciB7XG4gIEBJbnB1dCgpIGluZGljYXRvclN0YXR1czogQW5ub3RhdGlvbkluZGljYXRvclN0YXR1cyA9ICdJTkFDVElWRSc7XG4gIEBJbnB1dCgpIGl0ZW0hOiBUYWJsZUl0ZW07XG4gIEBJbnB1dCgpIGNvbnRyb2w6IEZvcm1Hcm91cCB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhcmVudElkcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgX3RyYWNrQnlUYWJsZVJvdyhpbmRleDogbnVtYmVyLCByb3c6IFRhYmxlUm93SXRlbSkge1xuICAgIHJldHVybiByb3cuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGkpID0+ICEhaSlcbiAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uaW5zdGFuY2VJZClcbiAgICAgIC5qb2luKCcnKTtcbiAgfVxufVxuXG5pbXBvcnQgdHlwZSB7IEJhc2VGb3JtSXRlbSB9IGZyb20gJy4uL2Zvcm0vYmFzZS1mb3JtLWl0ZW0ubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdG5hLXdmLXZhbHVlLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vdmFsdWUtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBWYWx1ZUl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBJbmRpY2F0b3JTdGF0dXNSZXBlYXRlciwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKiogdGhlIGNvbnRhaW5lciBmb3IgYWRkaW5nIGR5bmFtaWMgZm9ybSBpdGVtcyAqL1xuICBAVmlld0NoaWxkKE10bmFXZkZvcm1JdGVtRGlyZWN0aXZlKSBpdGVtSG9zdDogTXRuYVdmRm9ybUl0ZW1EaXJlY3RpdmUgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGluTGlzdCA9IGZhbHNlO1xuICBASW5wdXQoKSBpbmRpY2F0b3JTdGF0dXM6IEFubm90YXRpb25JbmRpY2F0b3JTdGF0dXMgPSAnSU5BQ1RJVkUnO1xuICBASW5wdXQoKSBpdGVtITogVmFsdWVJdGVtPHVua25vd24+O1xuICBASW5wdXQoKSBwYXJlbnRJZHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuXG4gIC8qKiB0aGUgcmVmZXJlbmNlIHRvIGEgZHluYW1pY2FsbHkgcmVuZGVyZWQgY29tcG9uZW50ICovXG4gIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPEJhc2VGb3JtSXRlbT4gfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgbGlzdCBvZiBwcmUtZXhpc3Rpbmcobm9uLWR5bmFtaWMpIGl0ZW0gdHlwZXNcbiAgICogSWYgdGhpcyBpdGVtJ3MgaXRlbUlkIGRvZXMgbm90IG1hdGNoIG9uZSBvZiB0aGUgZm9sbG93aW5nLCB0aGVuXG4gICAqIHRoaXMgaXRlbSBpcyBhIGR5bmFtaWMgY29tcG9uZW50IHJlZ2lzdGVyZWQgYnkgdGhlIGNsaWVudCBhcHBsaWNhdGlvblxuICAgKiAmIHJlcXVpcmVzIHRoZSBDb21wb25lbnRGYWN0b3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgZml4ZWRJdGVtVHlwZXMgPSBbXG4gICAgJ2Jvb2xlYW5pdGVtJyxcbiAgICAnYnVsbGV0ZWRsaXN0aXRlbScsXG4gICAgJ2NoZWNrYm94aXRlbScsXG4gICAgJ2RhdGVpdGVtJyxcbiAgICAnZGF0ZXJhbmdlaXRlbScsXG4gICAgJ2RlY2ltYWxhbnN3ZXJpdGVtJyxcbiAgICAnZG9jdW1lbnRhdGlvbml0ZW0nLFxuICAgICdkcm9wZG93bml0ZW0nLFxuICAgICdmaWxldXBsb2FkaXRlbScsXG4gICAgJ211bHRpcGxlY2hvaWNlaXRlbScsXG4gICAgJ251bWJlcmVkbGlzdGl0ZW0nLFxuICAgICdvZmZzZXRkYXRlcmFuZ2VpdGVtJyxcbiAgICAncGFyYWdyYXBoYW5zd2VyaXRlbScsXG4gICAgJ3Nob3J0YW5zd2VyaXRlbScsXG4gICAgJ3RhYmxlaXRlbScsXG4gICAgJ3RleHRpdGVtJyxcbiAgICAndGl0bGVpdGVtJyxcbiAgICAnd2hvbGVudW1iZXJhbnN3ZXJpdGVtJyxcbiAgICAneWVhcnF1YXJ0ZXJyYW5nZWl0ZW0nLFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGNmUmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIGZvcm1NYW5hZ2VyOiBNdG5hV2ZNYW5hZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIGxvZ2dlcjogTXRuYUxvZ2dlcixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoTVROQV9XRl9JVEVNX1dISVRFTElTVClcbiAgICBwcml2YXRlIHdoaXRlTGlzdDogTXRuYVdmSXRlbVdoaXRlTGlzdFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFNldHMgYSB2YWx1ZSBvbiB0aGUgY29udHJvbCBmb3IgYW55IGNvbXBvbmVudHMgdGhhdCBvbmx5IGVtaXQgYSB2YWx1ZSAmXG4gICAqIGRvIG5vdCBkaXJlY3RseSBtYW5pcHVsYXRlIHRoZWlyIGNvbnRyb2wgdGhlbXNlbHZlcywgaS5lLiBhIEZpbGVVcGxvYWRJdGVtXG4gICAqXG4gICAqIEBwYXJhbSBpdGVtIHRoZSB2YWx1ZSB0byBiZSBzZXQgb24gdGhlIGNvbnRyb2xcbiAgICovXG4gIHNldFZhbHVlKGl0ZW06IHVua25vd24pIHtcbiAgICB0aGlzLmNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5jb250cm9sPy5zZXRWYWx1ZShpdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgZHluYW1pYyBjb21wb25lbnQgZnJvbSBhIHJlbGV2YW50IHR5cGUgaW4gdGhlIEZvcm1TZXJ2aWNlIChyZWdpc3RlcmVkKWNvbXBvbmVudHM7XG4gICAqIE9OTFkgaWYgdGhlIGl0ZW0gdHlwZSh1c2luZyBpdGVtSWQpIGRvZXMgbm90IG1hdGNoIG9uZSBvZiB0aGUgZXhpc3RpbmcgZml4ZWRJdGVtVHlwZXNcbiAgICpcbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBUcmltIHRoZSBpdGVtSWQgZG93biB0byB0aGUgcmVsZXZhbnQgdHlwZVxuICAgIGNvbnN0IG5ld0lkID0gdGhpcy5pdGVtLml0ZW1JZC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgdHlwZSA9IG5ld0lkW25ld0lkLmxlbmd0aCAtIDFdO1xuICAgIC8vIENoZWNrIGlmIHR5cGUgaXMgbm90IG9uZSBvZiB0aGUgZml4ZWRJdGVtVHlwZXNcbiAgICBpZiAoIXRoaXMuZml4ZWRJdGVtVHlwZXMuc29tZSgoaSkgPT4gaSA9PT0gdHlwZSkpIHtcbiAgICAgIC8vIFJldHJpZXZlIGEgcmVsZXZhbnQgY29tcG9uZW50IHR5cGVcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZm9ybU1hbmFnZXIuZ2V0RHluYW1pY0NvbXBvbmVudCh0eXBlKTtcbiAgICAgIC8vIGlmIGEgdHlwZSBpcyByZXR1cm5lZCwgaW5zdGFudGlhdGUgdGhlIGNvbXBvbmVudCBhbmQgc2V0IHRoZSBpbnB1dCB2YWx1ZXMsIHRoZW4gbWFya1xuICAgICAgLy8gdGhlIHZhbHVlIGl0ZW0gZm9yIGNoYW5nZURldGVjdGlvbiBjaGVja1xuICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5jZlJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5PEJhc2VGb3JtSXRlbT4oY29tcG9uZW50KTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IHRoaXMuaXRlbUhvc3Q/LnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudEZhY3RvcnkpO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50UmVmPy5pbnN0YW5jZTtcbiAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiBjb21wb25lbnRGYWN0b3J5LmlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBpbnB1dC5wcm9wTmFtZTtcbiAgICAgICAgICAgIC8vIEZvcmNlZnVsbHkgYXNzaWduIGV2ZXJ5IGlucHV0IGZyb20gdGhpcyB0byBpbnN0YW5jZVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIGluc3RhbmNlW3Byb3BOYW1lIGFzIGtleW9mIEJhc2VGb3JtSXRlbV0gPSB0aGlzW3Byb3BOYW1lIGFzIGtleW9mIFZhbHVlSXRlbUNvbXBvbmVudF0gYXMgYW55O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIER5bmFtaWMgQ29tcG9uZW50IHdvbid0IGZpcmUgbmdPbkluaXQgdW5sZXNzIHdlIGRldGVjdENoYW5nZXNcbiAgICAgICAgdGhpcy5jZGYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy53aGl0ZUxpc3QgfHwgIXRoaXMud2hpdGVMaXN0Lml0ZW1UeXBlcyB8fCAhdGhpcy53aGl0ZUxpc3QuaXRlbVR5cGVzLnNvbWUoKHQpID0+IHQgPT09IHR5cGUpKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBObyBDb21wb25lbnQgRm91bmQgZm9yICR7dHlwZX0gLSBFbnN1cmUgYW55IGR5bmFtaWMgY29tcG9uZW50cyB3ZXJlIHJlZ2lzdGVyZWQgaW4gdGhlIHNlcnZpY2UsIG9yIHVzZSB0aGUgTXRuYVdmSXRlbVdoaXRlTGlzdCB0byBpZ25vcmUgdGhpcyBpdGVtLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gY2hhbmdlcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNoYW5nZXMsIHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgY2hhbmdlID0gY2hhbmdlc1twcm9wXTtcbiAgICAgICAgICBpZiAoIWNoYW5nZS5maXJzdENoYW5nZSAmJiBpc0tleSh0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZSwgcHJvcCkpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlW3Byb3BdID0gY2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBkZXN0cm95IHRoZSBjb21wb25lbnRSZWYgdG8gYSBkeW5hbWljIGNvbXBvbmVudCwgaWYgaXQgd2FzIHJlbmRlcmVkLlxuICAgKlxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ210bmEtd2YtbXVsdGlwbGUtY2hvaWNlLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJ211bHRpcGxlLWNob2ljZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW1xuICAgIGAuLi9mb3JtLWl0ZW0tY29udHJvbHMvZm9ybS1jb250cm9sLnNjc3NgLCAvLyBGSVhNRTogdGhlc2Ugc3R5bGVzIGFyZSBnZXR0aW5nIGR1cGxpY2F0ZWQgbGlrZSB0aGlzXG4gICAgJ211bHRpcGxlLWNob2ljZS5jb21wb25lbnQuc2NzcycsXG4gIF0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNdG5hV2ZNdWx0aXBsZUNob2ljZUNvbXBvbmVudCBleHRlbmRzIEJhc2VTaW5nbGVTZWxlY3Rpb25QYXJlbnQ8TXVsdGlwbGVDaG9pY2VJdGVtPiB7XG4gIGNvbnN0cnVjdG9yKHVpU2VydmljZTogTXRuYVdmVUlTZXJ2aWNlKSB7XG4gICAgc3VwZXIodWlTZXJ2aWNlKTtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdG5hLXdmLWJvb2xlYW4taXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnYm9vbGVhbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW1xuICAgIGAuLi9mb3JtLWl0ZW0tY29udHJvbHMvZm9ybS1jb250cm9sLnNjc3NgLCAvLyBGSVhNRTogdGhlc2Ugc3R5bGVzIGFyZSBnZXR0aW5nIGR1cGxpY2F0ZWQgbGlrZSB0aGlzXG4gICAgJ2Jvb2xlYW4uY29tcG9uZW50LnNjc3MnLFxuICBdLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTXRuYVdmQm9vbGVhbkNvbXBvbmVudCBleHRlbmRzIEJhc2VQYXJlbnRJdGVtQ29udHJvbDxCb29sZWFuSXRlbSwgRm9ybUNvbnRyb2w+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB1aVNlcnZpY2U6IE10bmFXZlVJU2VydmljZSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICB0b2dnbGVDaGFuZ2UoY2hhbmdlOiBNYXRTbGlkZVRvZ2dsZUNoYW5nZSkge1xuICAgIHRoaXMudWlTZXJ2aWNlLnRvZ2dsZUZvcm1JdGVtcyh0aGlzLml0ZW0ub3B0aW9uLmVuYWJsZWRJdGVtcywgdGhpcy5pdGVtLm9wdGlvbi5kaXNhYmxlZEl0ZW1zLCBjaGFuZ2UuY2hlY2tlZCwgdGhpcy5pdGVtLmluc3RhbmNlSWQpO1xuICB9XG5cbiAgX3RyYWNrQnlJbnN0YW5jZUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBGb3JtSXRlbSB9KSB7XG4gICAgcmV0dXJuIGl0ZW0udmFsdWUuaW5zdGFuY2VJZDtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdG5hLXdmLWNoZWNrYm94LWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJ2NoZWNrYm94LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgYC4uL2Zvcm0taXRlbS1jb250cm9scy9mb3JtLWNvbnRyb2wuc2Nzc2AsIC8vIEZJWE1FOiB0aGVzZSBzdHlsZXMgYXJlIGdldHRpbmcgZHVwbGljYXRlZCBsaWtlIHRoaXNcbiAgICAnY2hlY2tib3guY29tcG9uZW50LnNjc3MnLFxuICBdLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTXRuYVdmQ2hlY2tib3hDb21wb25lbnQgZXh0ZW5kcyBCYXNlUGFyZW50SXRlbUNvbnRyb2w8Q2hlY2tib3hJdGVtLCBGb3JtQXJyYXk+IGltcGxlbWVudHMgQ2FuRGVzdHJveU5vdGlmeSwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgY29sb3I6IFRoZW1lUGFsZXR0ZTtcblxuICBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IE10bmFXZkRpYWxvZ1NlcnZpY2UsIHByaXZhdGUgdWlTZXJ2aWNlOiBNdG5hV2ZVSVNlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgaGFuZGxlQ2hhbmdlKGNoYW5nZTogTWF0Q2hlY2tib3hDaGFuZ2UsIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLml0ZW0ub3B0aW9uc1tpbmRleF07XG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmNvbnRyb2w/LmNvbnRyb2xzW2luZGV4XTtcblxuICAgIC8vIElmIHRoZSB1c2VyIGlzIHRyeWluZyB0byBtYWtlIGEgc2VsZWN0aW9uIHdpdGggc29tZXRoaW5nIHRoYXQgaGFzIGFuIGFja25vd2xlZGdlbWVudCxcbiAgICAvLyBzaG93IHRoZSBhY2tub3dsZWRnZSBkaWFsb2cgZmlyc3QgdG8gZ2V0IHRoZWlyIGNvbnNlbnQuXG4gICAgLy8gTm90ZTogd2UgZG9uJ3QgbmVlZCB0byBzaG93IHRoZSBhY2tub3dsZWRnZW1lbnQgaWYgdGhlIHVzZXIgaXMgdW5jaGVja2luZyB0aGUgYm94LlxuICAgIGlmIChvcHRpb24uYWNrbm93bGVkZ2VtZW50ICYmIGZvcm1Db250cm9sPy52YWx1ZSkge1xuICAgICAgLy8gUmV2ZXJ0IHRoZSBjaGVja2JveCB0byBhbiB1bmNoZWNrZWQgc3RhdGUgdW50aWwgdGhleSBhZ3JlZSB0byB0aGUgYWNrbm93bGVkZ2VtZW50XG4gICAgICBmb3JtQ29udHJvbD8uc2V0VmFsdWUoZmFsc2UpO1xuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlXG4gICAgICAgIC52ZXJpZnlBY2tub3dsZWRnZW1lbnQob3B0aW9uLmFja25vd2xlZGdlbWVudClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGFja25vd2xlZGdlZCkgPT4ge1xuICAgICAgICAgIGlmIChhY2tub3dsZWRnZWQpIHtcbiAgICAgICAgICAgIGZvcm1Db250cm9sPy5zZXRWYWx1ZSh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMudWlTZXJ2aWNlLnRvZ2dsZUZvcm1JdGVtcyhvcHRpb24uZW5hYmxlZEl0ZW1zLCBvcHRpb24uZGlzYWJsZWRJdGVtcywgY2hhbmdlLmNoZWNrZWQsIHRoaXMuaXRlbS5pbnN0YW5jZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVpU2VydmljZS50b2dnbGVGb3JtSXRlbXMob3B0aW9uLmVuYWJsZWRJdGVtcywgb3B0aW9uLmRpc2FibGVkSXRlbXMsIGNoYW5nZS5jaGVja2VkLCB0aGlzLml0ZW0uaW5zdGFuY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHdoYXQgdGhlIHVzZXIgYWxyZWFkeSBhY2tub3dsZWRnZWQgZm9yIGEgZ2l2ZW4gb3B0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGJyb3dzZXIgZXZlbnQgd2hlbiB0aGUgYnV0dG9uIHdhcyBpbnZva2VkXG4gICAqIEBwYXJhbSBhY2tub3dsZWRnZW1lbnRJdGVtIFRoZSBmb3JtIGl0ZW0gdGhhdCByZXByZXNlbnRzIHRoZSBhY2tub3dsZWRnZW1lbnQgdGV4dCB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLlxuICAgKiAqL1xuICBzaG93QWNrbm93bGVkZ2VtZW50KGV2ZW50OiBFdmVudCwgYWNrbm93bGVkZ2VtZW50SXRlbTogU2VjdGlvbikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dBY2tub3dsZWRnZW1lbnQoYWNrbm93bGVkZ2VtZW50SXRlbSk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBhIGJyb3dzZXIgZXZlbnQgZnJvbSBwcm9wYWdhdGluZ1xuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRvIHN0b3BcbiAgICovXG4gIHN0b3BFdmVudFByb3BhZ2F0aW9uKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG59XG4iLCI8aDIgKm5nSWY9XCJkYXRhLnRpdGxlIGFzIHRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT57eyB0aXRsZSB9fTwvaDI+XG48bWF0LWRpYWxvZy1jb250ZW50PlxuICA8bXRuYS13Zi1pdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGEuZm9ybUl0ZW1zXCIgW2l0ZW1dPVwiaXRlbVwiIFtyZWFkb25seV09XCJ0cnVlXCI+PC9tdG5hLXdmLWl0ZW0+XG48L21hdC1kaWFsb2ctY29udGVudD5cbjxtYXQtZGlhbG9nLWFjdGlvbnMgYWxpZ249XCJlbmRcIj5cbiAgPGJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJmYWxzZVwiIG1hdC1idXR0b24+Q0FOQ0VMPC9idXR0b24+XG4gIDxidXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwidHJ1ZVwiIGNvbG9yPVwiYWNjZW50XCIgbWF0LXJhaXNlZC1idXR0b24+QUNLTk9XTEVER0U8L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuIiwiPG10bmEtYW5ub3RhdGlvbnMtaW5kaWNhdG9yXG4gICpuZ0lmPVwiaXRlbS5hbm5vdGF0aW9uRW5hYmxlZFwiXG4gIFthbm5vdGF0YWJsZUlkXT1cIml0ZW0uYW5ub3RhdGFibGVJZFwiXG4gIGNvbG9yPVwicHJpbWFyeVwiXG4gIFtjb3VudF09XCJhbm5vdGF0aW9ucyQgfCBhc3luY1wiXG4gIChzdGF0dXMpPVwiaW5kaWNhdG9yU3RhdHVzID0gJGV2ZW50XCJcbj48L210bmEtYW5ub3RhdGlvbnMtaW5kaWNhdG9yPlxuXG48bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJpdGVtLml0ZW1JZCB8IGdldE9iamVjdFR5cGVcIj5cbiAgPG10bmEtd2Ytc2VjdGlvblxuICAgICpuZ1N3aXRjaENhc2U9XCInc2VjdGlvbmltcGwnXCJcbiAgICBbY29udHJvbF09XCIkYW55KGNvbnRyb2wpXCJcbiAgICBbaXRlbV09XCIkYW55KGl0ZW0pXCJcbiAgICBbbXRuYUhpZ2hsaWdodF09XCJpbmRpY2F0b3JTdGF0dXMgPT09ICdBQ1RJVkUnXCJcbiAgICBbcGFyZW50SWRzXT1cInBhcmVudElkcy5jb25jYXQoaXRlbS5pbnN0YW5jZUlkKVwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbc3RlcF09XCJzdGVwXCJcbiAgICAoZm9jdXNlZCk9XCJmb2N1c2VkU2VjdGlvbi5lbWl0KCRldmVudClcIlxuICA+PC9tdG5hLXdmLXNlY3Rpb24+XG5cbiAgPG10bmEtd2YtZ3JvdXBcbiAgICAqbmdTd2l0Y2hDYXNlPVwiJ2Zvcm1pdGVtZ3JvdXBpbXBsJ1wiXG4gICAgW2luZGljYXRvclN0YXR1c109XCJpbmRpY2F0b3JTdGF0dXNcIlxuICAgIFtpdGVtXT1cIiRhbnkoaXRlbSlcIlxuICAgIFtjb250cm9sXT1cIiRhbnkoY29udHJvbClcIlxuICAgIFttdG5hSGlnaGxpZ2h0XT1cImluZGljYXRvclN0YXR1cyA9PT0gJ0FDVElWRScgJiYgKCEhaXRlbS5kZXNjcmlwdGl2ZVRleHQgfHwgISFpdGVtLnF1ZXN0aW9uVGV4dClcIlxuICAgIFtwYXJlbnRJZHNdPVwicGFyZW50SWRzLmNvbmNhdChpdGVtLmluc3RhbmNlSWQpXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICA+PC9tdG5hLXdmLWdyb3VwPlxuXG4gIDxtdG5hLXdmLXJlcGVhdGFibGUtaXRlbS1jb250YWluZXJcbiAgICAqbmdTd2l0Y2hDYXNlPVwiJ3JlcGVhdGFibGVpdGVtJ1wiXG4gICAgW2luZGljYXRvclN0YXR1c109XCJpbmRpY2F0b3JTdGF0dXNcIlxuICAgIFtpdGVtXT1cIiRhbnkoaXRlbSlcIlxuICAgIFtjb250cm9sXT1cIiRhbnkoY29udHJvbClcIlxuICAgIFttdG5hSGlnaGxpZ2h0XT1cImluZGljYXRvclN0YXR1cyA9PT0gJ0FDVElWRScgJiYgKCEhaXRlbS5kZXNjcmlwdGl2ZVRleHQgfHwgISFpdGVtLnF1ZXN0aW9uVGV4dClcIlxuICAgIFtwYXJlbnRJZHNdPVwicGFyZW50SWRzLmNvbmNhdChpdGVtLmluc3RhbmNlSWQpXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICA+PC9tdG5hLXdmLXJlcGVhdGFibGUtaXRlbS1jb250YWluZXI+XG5cbiAgPG10bmEtd2YtdmFsdWUtaXRlbVxuICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICBbaW5kaWNhdG9yU3RhdHVzXT1cImluZGljYXRvclN0YXR1c1wiXG4gICAgW2l0ZW1dPVwiJGFueShpdGVtKVwiXG4gICAgW2NvbnRyb2xdPVwiY29udHJvbFwiXG4gICAgW210bmFIaWdobGlnaHRdPVwiaW5kaWNhdG9yU3RhdHVzID09PSAnQUNUSVZFJyAmJiAoISFpdGVtLmRlc2NyaXB0aXZlVGV4dCB8fCAhIWl0ZW0ucXVlc3Rpb25UZXh0KVwiXG4gICAgW3BhcmVudElkc109XCJwYXJlbnRJZHMuY29uY2F0KGl0ZW0uaW5zdGFuY2VJZClcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gID48L210bmEtd2YtdmFsdWUtaXRlbT5cbjwvbmctY29udGFpbmVyPlxuIiwiPGgyICpuZ0lmPVwiZGF0YS50aXRsZSBhcyB0aXRsZVwiIG1hdC1kaWFsb2ctdGl0bGU+e3sgdGl0bGUgfX08L2gyPlxuPG1hdC1kaWFsb2ctY29udGVudD5cbiAgPG10bmEtd2YtaXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhLmZvcm1JdGVtc1wiIFtpdGVtXT1cIml0ZW1cIiBbcmVhZG9ubHldPVwidHJ1ZVwiPjwvbXRuYS13Zi1pdGVtPlxuPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG48bWF0LWRpYWxvZy1hY3Rpb25zIGFsaWduPVwiZW5kXCI+XG4gIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlPkNsb3NlPC9idXR0b24+XG48L21hdC1kaWFsb2ctYWN0aW9ucz5cbiIsIjxtdG5hLXdmLXN0ZXAtY2FyZCBbc3RlcF09XCJzdGVwXCIgW3N1YnRpdGxlXT1cIml0ZW0uZGVzY3JpcHRpdmVUZXh0XCIgKGZvY3VzZWQpPVwiZm9jdXNlZC5lbWl0KCRldmVudClcIj5cbiAgPGRpdiBjYXJkQ29udGVudD5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJJdGVtIG9mIGl0ZW0uaXRlbXM7IHRyYWNrQnk6IF90cmFja0J5SW5zdGFuY2VJZFwiPlxuICAgICAgPG1hdC1kaXZpZGVyXG4gICAgICAgICpuZ0lmPVwiKHN1Ykl0ZW0uaXRlbUlkIHwgZ2V0T2JqZWN0VHlwZSkgPT09ICdmb3JtaXRlbWdyb3VwaW1wbCcgJiYgaXRlbS5pdGVtcy5pbmRleE9mKHN1Ykl0ZW0pICE9PSAwXCJcbiAgICAgICAgY2xhc3M9XCJzZWN0aW9uLWl0ZW0tZGl2aWRlclwiXG4gICAgICAgIFtpbnNldF09XCJ0cnVlXCJcbiAgICAgID48L21hdC1kaXZpZGVyPlxuXG4gICAgICA8bXRuYS13Zi1pdGVtXG4gICAgICAgIFtpdGVtXT1cInN1Ykl0ZW1cIlxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICBbcGFyZW50SWRzXT1cInBhcmVudElkc1wiXG4gICAgICAgIFtjb250cm9sXT1cIiEhY29udHJvbCAmJiAhIWNvbnRyb2wuY29udHJvbHMgPyBjb250cm9sLmNvbnRyb2xzW3N1Ykl0ZW0uaW5zdGFuY2VJZF0gOiB1bmRlZmluZWRcIlxuICAgICAgICAoZm9jdXNlZFNlY3Rpb24pPVwiZm9jdXNlZC5lbWl0KCRldmVudClcIlxuICAgICAgPjwvbXRuYS13Zi1pdGVtPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbXRuYS13Zi1zdGVwLWNhcmQ+XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbSAmJiBjb250cm9sXCI+XG4gIDxtdG5hLXdmLWl0ZW0taGVhZGVyXG4gICAgKm5nSWY9XCIhIWl0ZW0ucXVlc3Rpb25UZXh0IHx8ICEhaXRlbS5kZXNjcmlwdGl2ZVRleHRcIlxuICAgIFtkZXNjcmlwdGl2ZVRleHRdPVwiaXRlbS5kZXNjcmlwdGl2ZVRleHRcIlxuICAgIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkXCJcbiAgICBbcXVlc3Rpb25UZXh0XT1cIml0ZW0ucXVlc3Rpb25UZXh0XCJcbiAgICBbcmVxdWlyZWRdPVwiaXRlbS5yZXF1aXJlZFwiXG4gID48L210bmEtd2YtaXRlbS1oZWFkZXI+XG4gIDxuZy10ZW1wbGF0ZSAjZnVsbExheW91dD5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cIml0ZW0tZ3JvdXAtY29udGFpbmVyXCJcbiAgICAgIFttdG5hSGlnaGxpZ2h0XT1cImluZGljYXRvclN0YXR1cyA9PT0gJ0FDVElWRScgJiYgIWl0ZW0ucXVlc3Rpb25UZXh0ICYmICFpdGVtLmRlc2NyaXB0aXZlVGV4dFwiXG4gICAgICBbZm9ybUdyb3VwXT1cImNvbnRyb2xcIlxuICAgICAgW25nQ2xhc3NdPVwiaXRlbS5sYXlvdXRcIlxuICAgID5cbiAgICAgIDxtdG5hLXdmLWl0ZW1cbiAgICAgICAgKm5nRm9yPVwibGV0IHN1Ykl0ZW0gb2YgaXRlbS5pdGVtczsgdHJhY2tCeTogX3RyYWNrQnlJbnN0YW5jZUlkXCJcbiAgICAgICAgW2NsYXNzLnJvdy1pdGVtXT1cIml0ZW0ubGF5b3V0ID09PSAnUk9XJyAmJiAhZnVsbFdpZHRoW3N1Ykl0ZW0uaXRlbUlkXVwiXG4gICAgICAgIFtuZ0NsYXNzLmx0LW1kXT1cIid3aWR0aC0xMDAnXCJcbiAgICAgICAgW2l0ZW1dPVwic3ViSXRlbVwiXG4gICAgICAgIFtjb250cm9sXT1cImNvbnRyb2wuY29udHJvbHNbc3ViSXRlbS5pbnN0YW5jZUlkXVwiXG4gICAgICAgIFtwYXJlbnRJZHNdPVwicGFyZW50SWRzXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgID48L210bmEtd2YtaXRlbT5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8IS0tIFdoZW4gcmVhZG9ubHksICYmIGFsbCBjaGlsZCBpdGVtcyBzaG91bGQgYmUgZGlzcGxheWVkIGluIGEgbWF0LWxpc3QtLT5cbiAgPG1hdC1saXN0ICpuZ0lmPVwicmVhZG9ubHkgJiYgaW5MaXN0OyBlbHNlIGZ1bGxMYXlvdXRcIiBbbmdDbGFzc109XCJpdGVtLmxheW91dFwiPlxuICAgIDxtdG5hLXdmLXZhbHVlLWl0ZW1cbiAgICAgICpuZ0Zvcj1cImxldCBzdWJJdGVtIG9mIGl0ZW0uaXRlbXMgfCBtdG5hV2ZJdGVtc1dpdGhWYWx1ZTsgdHJhY2tCeTogX3RyYWNrQnlJbnN0YW5jZUlkXCJcbiAgICAgIFtjbGFzcy5yb3ctaXRlbV09XCJpdGVtLmxheW91dCA9PT0gJ1JPVydcIlxuICAgICAgW25nQ2xhc3MubHQtbWRdPVwiJ3dpZHRoLTEwMCdcIlxuICAgICAgW2l0ZW1dPVwic3ViSXRlbVwiXG4gICAgICBbaW5MaXN0XT1cInRydWVcIlxuICAgICAgW3BhcmVudElkc109XCJwYXJlbnRJZHNcIlxuICAgICAgW3JlYWRvbmx5XT1cInRydWVcIlxuICAgID48L210bmEtd2YtdmFsdWUtaXRlbT5cbiAgPC9tYXQtbGlzdD5cbjwvbmctY29udGFpbmVyPlxuIiwiPG10bmEtd2YtaXRlbS1oZWFkZXJcbiAgKm5nSWY9XCIhIWl0ZW0ucXVlc3Rpb25UZXh0IHx8ICEhaXRlbS5kZXNjcmlwdGl2ZVRleHRcIlxuICBbZGVzY3JpcHRpdmVUZXh0XT1cIml0ZW0uZGVzY3JpcHRpdmVUZXh0XCJcbiAgW2Rpc2FibGVkXT1cImNvbnRyb2w/LmRpc2FibGVkIHx8IGZhbHNlXCJcbiAgW3F1ZXN0aW9uVGV4dF09XCJpdGVtLnF1ZXN0aW9uVGV4dFwiXG4gIFtyZXF1aXJlZF09XCJpdGVtLnJlcXVpcmVkXCJcbj48L210bmEtd2YtaXRlbS1oZWFkZXI+XG48c2VjdGlvbiBbbXRuYUhpZ2hsaWdodF09XCJpbmRpY2F0b3JTdGF0dXMgPT09ICdBQ1RJVkUnICYmICFpdGVtLnF1ZXN0aW9uVGV4dCAmJiAhaXRlbS5kZXNjcmlwdGl2ZVRleHRcIj5cbiAgPG10bmEtd2YtcmVwZWF0YWJsZS1pdGVtXG4gICAgQHJlcGVhdEl0ZW1FeHBhbmRDb2xsYXBzZVxuICAgICpuZ0Zvcj1cImxldCBzdWJpdGVtIG9mIGl0ZW0uaXRlbXM7IGxldCBmaXJzdCA9IGZpcnN0OyB0cmFja0J5OiAnaW5zdGFuY2VJZCcgfCBtdG5hVHJhY2tCeVByb3BlcnR5XCJcbiAgPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiIXJlYWRvbmx5ICYmIGl0ZW0uaXRlbXMubGVuZ3RoID4gaXRlbS5taW5PY2N1cnJlbmNlc1wiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNsYXNzPVwiaXRlbS1yZW1vdmUtYnV0dG9uXCJcbiAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAoY2xpY2spPVwicmVtb3ZlSXRlbShzdWJpdGVtKVwiXG4gICAgICBtYXRUb29sdGlwPVwiUmVtb3ZlIEl0ZW1cIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5yZW1vdmVfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8bXRuYS13Zi1pdGVtXG4gICAgICBbaXRlbV09XCJzdWJpdGVtXCJcbiAgICAgIFtjb250cm9sXT1cIiEhY29udHJvbCAmJiAhIWNvbnRyb2wuY29udHJvbHMgPyBjb250cm9sLmNvbnRyb2xzW3N1Yml0ZW0uaW5zdGFuY2VJZF0gOiB1bmRlZmluZWRcIlxuICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgIFtwYXJlbnRJZHNdPVwicGFyZW50SWRzXCJcbiAgICA+PC9tdG5hLXdmLWl0ZW0+XG4gIDwvbXRuYS13Zi1yZXBlYXRhYmxlLWl0ZW0+XG48L3NlY3Rpb24+XG48YnV0dG9uICpuZ0lmPVwiIXJlYWRvbmx5XCIgbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cImFkZEl0ZW0oKVwiIGNsYXNzPVwibmV3LWl0ZW0tYnV0dG9uXCIgY29sb3I9XCJwcmltYXJ5XCI+XG4gIHt7IGl0ZW0uYWRkaXRpb25hbFRleHQgfHwgJ0FERCcgfCB1cHBlcmNhc2UgfX1cbjwvYnV0dG9uPlxuIiwiPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJpdGVtLnRhYmxlUm93c1wiIFt0cmFja0J5XT1cIl90cmFja0J5VGFibGVSb3dcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIGl0ZW0uaGVhZGVyczsgbGV0IGluZGV4ID0gaW5kZXhcIiBbbWF0Q29sdW1uRGVmXT1cImhlYWRlclwiPlxuICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+e3sgaGVhZGVyIH19PC90aD5cblxuICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dJdGVtXCI+XG4gICAgICA8bXRuYS13Zi1pdGVtXG4gICAgICAgICpuZ0lmPVwiISFyb3dJdGVtLml0ZW1zW2luZGV4XVwiXG4gICAgICAgIFtjb250cm9sXT1cIiEhY29udHJvbCAmJiAhIWNvbnRyb2wuY29udHJvbHMgPyBjb250cm9sLmNvbnRyb2xzW3Jvd0l0ZW0uaXRlbXNbaW5kZXhdLmluc3RhbmNlSWRdIDogdW5kZWZpbmVkXCJcbiAgICAgICAgW2l0ZW1dPVwicm93SXRlbS5pdGVtc1tpbmRleF1cIlxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICBbcGFyZW50SWRzXT1cInBhcmVudElkc1wiXG4gICAgICA+PC9tdG5hLXdmLWl0ZW0+XG4gICAgPC90ZD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJpdGVtLmhlYWRlcnNcIj48L3RyPlxuICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogaXRlbS5oZWFkZXJzXCI+PC90cj5cbjwvdGFibGU+XG4iLCI8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJpdGVtLml0ZW1JZCB8IGdldE9iamVjdFR5cGVcIj5cbiAgPGgzICpuZ1N3aXRjaENhc2U9XCIndGl0bGVpdGVtJ1wiIGNsYXNzPVwibXRuYS13Zi10aXRsZS1pdGVtXCIgW210bmFIaWdobGlnaHRdPVwiaW5kaWNhdG9yU3RhdHVzID09PSAnQUNUSVZFJ1wiPnt7IGl0ZW0udmFsdWUgfX08L2gzPlxuICA8cFxuICAgICpuZ1N3aXRjaENhc2U9XCIndGV4dGl0ZW0nXCJcbiAgICBbaW5uZXJIVE1MXT1cIiRhbnkoaXRlbS52YWx1ZSkgfCBtdG5hV2ZTYW5pdGl6ZUh0bWxcIlxuICAgIGNsYXNzPVwibXRuYS13Zi10ZXh0LWl0ZW1cIlxuICAgIFttdG5hSGlnaGxpZ2h0XT1cImluZGljYXRvclN0YXR1cyA9PT0gJ0FDVElWRSdcIlxuICA+PC9wPlxuXG4gIDxtdG5hLXdmLWJvb2xlYW4taXRlbVxuICAgICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbml0ZW0nXCJcbiAgICBbaGVhZGVyXT1cIml0ZW1IZWFkZXJcIlxuICAgIFtpbmRpY2F0b3JTdGF0dXNdPVwiaW5kaWNhdG9yU3RhdHVzXCJcbiAgICBbaXRlbV09XCIkYW55KGl0ZW0pXCJcbiAgICBbY29udHJvbF09XCIkYW55KGNvbnRyb2wpXCJcbiAgICBbbXRuYUhpZ2hsaWdodF09XCJpbmRpY2F0b3JTdGF0dXMgPT09ICdBQ1RJVkUnXCJcbiAgICBbcGFyZW50SWRzXT1cInBhcmVudElkc1wiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgPjwvbXRuYS13Zi1ib29sZWFuLWl0ZW0+XG5cbiAgPG10bmEtd2YtY2hlY2tib3gtaXRlbVxuICAgICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3hpdGVtJ1wiXG4gICAgW2hlYWRlcl09XCJpdGVtSGVhZGVyXCJcbiAgICBbaW5kaWNhdG9yU3RhdHVzXT1cImluZGljYXRvclN0YXR1c1wiXG4gICAgW2l0ZW1dPVwiJGFueShpdGVtKVwiXG4gICAgW2NvbnRyb2xdPVwiJGFueShjb250cm9sKVwiXG4gICAgW3BhcmVudElkc109XCJwYXJlbnRJZHNcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gID48L210bmEtd2YtY2hlY2tib3gtaXRlbT5cblxuICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZWl0ZW0nXCI+XG4gICAgPG10bmEtd2YtZGF0ZS1pdGVtXG4gICAgICAqbmdJZj1cIml0ZW0gfCBjb2VyY2VEYXRlSXRlbSBhcyBkYXRlSXRlbVwiXG4gICAgICBbaGVhZGVyXT1cIml0ZW1IZWFkZXJcIlxuICAgICAgW2luZGljYXRvclN0YXR1c109XCJpbmRpY2F0b3JTdGF0dXNcIlxuICAgICAgW2Zvcm1hdF09XCJkYXRlSXRlbS5mb3JtYXRcIlxuICAgICAgW2l0ZW1dPVwiZGF0ZUl0ZW1cIlxuICAgICAgW2NvbnRyb2xdPVwiJGFueShjb250cm9sKVwiXG4gICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgID48L210bmEtd2YtZGF0ZS1pdGVtPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bXRuYS13Zi1kYXRlLXJhbmdlXG4gICAgKm5nU3dpdGNoQ2FzZT1cIidvZmZzZXRkYXRlcmFuZ2VpdGVtJ1wiXG4gICAgW2hlYWRlcl09XCJpdGVtSGVhZGVyXCJcbiAgICBbaW5kaWNhdG9yU3RhdHVzXT1cImluZGljYXRvclN0YXR1c1wiXG4gICAgW2l0ZW1dPVwiJGFueShpdGVtKVwiXG4gICAgW2NvbnRyb2xdPVwiJGFueShjb250cm9sKVwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgPjwvbXRuYS13Zi1kYXRlLXJhbmdlPlxuXG4gIDxtdG5hLXdmLXllYXItcXVhcnRlci1yYW5nZS1pdGVtXG4gICAgKm5nU3dpdGNoQ2FzZT1cIid5ZWFycXVhcnRlcnJhbmdlaXRlbSdcIlxuICAgIFtoZWFkZXJdPVwiaXRlbUhlYWRlclwiXG4gICAgW2luZGljYXRvclN0YXR1c109XCJpbmRpY2F0b3JTdGF0dXNcIlxuICAgIFtpdGVtXT1cIiRhbnkoaXRlbSlcIlxuICAgIFtjb250cm9sXT1cIiRhbnkoY29udHJvbClcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gID48L210bmEtd2YteWVhci1xdWFydGVyLXJhbmdlLWl0ZW0+XG5cbiAgPG10bmEtd2YtZHJvcGRvd24taXRlbVxuICAgICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd25pdGVtJ1wiXG4gICAgW2hlYWRlcl09XCJpdGVtSGVhZGVyXCJcbiAgICBbaW5kaWNhdG9yU3RhdHVzXT1cImluZGljYXRvclN0YXR1c1wiXG4gICAgW2l0ZW1dPVwiJGFueShpdGVtKVwiXG4gICAgW2luTGlzdF09XCJpbkxpc3RcIlxuICAgIFtjb250cm9sXT1cIiRhbnkoY29udHJvbClcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gID48L210bmEtd2YtZHJvcGRvd24taXRlbT5cblxuICA8bXRuYS13Zi1maWxlLXVwbG9hZC1pdGVtXG4gICAgKm5nU3dpdGNoQ2FzZT1cIidmaWxldXBsb2FkaXRlbSdcIlxuICAgIFtoZWFkZXJdPVwiaXRlbUhlYWRlclwiXG4gICAgW2luZGljYXRvclN0YXR1c109XCJpbmRpY2F0b3JTdGF0dXNcIlxuICAgIFtpdGVtXT1cIiRhbnkoaXRlbSlcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgKGZpbGUpPVwic2V0VmFsdWUoJGV2ZW50KVwiXG4gID48L210bmEtd2YtZmlsZS11cGxvYWQtaXRlbT5cblxuICA8bXRuYS13Zi11bm9yZGVyZWQtbGlzdC1pdGVtXG4gICAgKm5nU3dpdGNoQ2FzZT1cIididWxsZXRlZGxpc3RpdGVtJ1wiXG4gICAgW2hlYWRlcl09XCJpdGVtSGVhZGVyXCJcbiAgICBbaW5kaWNhdG9yU3RhdHVzXT1cImluZGljYXRvclN0YXR1c1wiXG4gICAgW2l0ZW1dPVwiJGFueShpdGVtKVwiXG4gID48L210bmEtd2YtdW5vcmRlcmVkLWxpc3QtaXRlbT5cblxuICA8bXRuYS13Zi1vcmRlcmVkLWxpc3QtaXRlbVxuICAgICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyZWRsaXN0aXRlbSdcIlxuICAgIFtoZWFkZXJdPVwiaXRlbUhlYWRlclwiXG4gICAgW2luZGljYXRvclN0YXR1c109XCJpbmRpY2F0b3JTdGF0dXNcIlxuICAgIFtpdGVtXT1cIiRhbnkoaXRlbSlcIlxuICA+PC9tdG5hLXdmLW9yZGVyZWQtbGlzdC1pdGVtPlxuXG4gIDxtdG5hLXdmLW11bHRpcGxlLWNob2ljZS1pdGVtXG4gICAgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aXBsZWNob2ljZWl0ZW0nXCJcbiAgICBbaGVhZGVyXT1cIml0ZW1IZWFkZXJcIlxuICAgIFtpbmRpY2F0b3JTdGF0dXNdPVwiaW5kaWNhdG9yU3RhdHVzXCJcbiAgICBbaXRlbV09XCIkYW55KGl0ZW0pXCJcbiAgICBbY29udHJvbF09XCIkYW55KGNvbnRyb2wpXCJcbiAgICBbcGFyZW50SWRzXT1cInBhcmVudElkc1wiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgPjwvbXRuYS13Zi1tdWx0aXBsZS1jaG9pY2UtaXRlbT5cblxuICA8bXRuYS13Zi1pbnB1dC1pdGVtXG4gICAgKm5nU3dpdGNoQ2FzZT1cIidzaG9ydGFuc3dlcml0ZW0nXCJcbiAgICBtdG5hV2ZTaG9ydEFuc3dlckl0ZW1cbiAgICBbY29udHJvbF09XCIkYW55KGNvbnRyb2wpXCJcbiAgICBbaGVhZGVyXT1cIml0ZW1IZWFkZXJcIlxuICAgIFtpbmRpY2F0b3JTdGF0dXNdPVwiaW5kaWNhdG9yU3RhdHVzXCJcbiAgICBbaW5MaXN0XT1cImluTGlzdFwiXG4gICAgW2l0ZW1dPVwiJGFueShpdGVtKVwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgPjwvbXRuYS13Zi1pbnB1dC1pdGVtPlxuXG4gIDxtdG5hLXdmLWlucHV0LWl0ZW1cbiAgICAqbmdTd2l0Y2hDYXNlPVwiJ3BhcmFncmFwaGFuc3dlcml0ZW0nXCJcbiAgICBtdG5hV2ZQYXJhZ3JhcGhJdGVtXG4gICAgW2NvbnRyb2xdPVwiJGFueShjb250cm9sKVwiXG4gICAgW2hlYWRlcl09XCJpdGVtSGVhZGVyXCJcbiAgICBbaW5kaWNhdG9yU3RhdHVzXT1cImluZGljYXRvclN0YXR1c1wiXG4gICAgW2luTGlzdF09XCJpbkxpc3RcIlxuICAgIFtpdGVtXT1cIiRhbnkoaXRlbSlcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gID48L210bmEtd2YtaW5wdXQtaXRlbT5cblxuICA8bXRuYS13Zi10YWJsZS1pdGVtXG4gICAgKm5nU3dpdGNoQ2FzZT1cIid0YWJsZWl0ZW0nXCJcbiAgICBbY29udHJvbF09XCIkYW55KGNvbnRyb2wpXCJcbiAgICBbaW5kaWNhdG9yU3RhdHVzXT1cImluZGljYXRvclN0YXR1c1wiXG4gICAgW2l0ZW1dPVwiJGFueShpdGVtKVwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbcGFyZW50SWRzXT1cInBhcmVudElkc1wiXG4gID48L210bmEtd2YtdGFibGUtaXRlbT5cblxuICA8bXRuYS13Zi1pbnB1dC1pdGVtXG4gICAgKm5nU3dpdGNoQ2FzZT1cIidkZWNpbWFsYW5zd2VyaXRlbSdcIlxuICAgIG10bmFXZkRlY2ltYWxJdGVtXG4gICAgW2NvbnRyb2xdPVwiJGFueShjb250cm9sKVwiXG4gICAgW2hlYWRlcl09XCJpdGVtSGVhZGVyXCJcbiAgICBbaW5kaWNhdG9yU3RhdHVzXT1cImluZGljYXRvclN0YXR1c1wiXG4gICAgW2luTGlzdF09XCJpbkxpc3RcIlxuICAgIFtpdGVtXT1cIiRhbnkoaXRlbSlcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gID48L210bmEtd2YtaW5wdXQtaXRlbT5cblxuICA8bXRuYS13Zi1pbnB1dC1pdGVtXG4gICAgKm5nU3dpdGNoQ2FzZT1cIid3aG9sZW51bWJlcmFuc3dlcml0ZW0nXCJcbiAgICBtdG5hV2ZXaG9sZU51bWJlckl0ZW1cbiAgICBbY29udHJvbF09XCIkYW55KGNvbnRyb2wpXCJcbiAgICBbaGVhZGVyXT1cIml0ZW1IZWFkZXJcIlxuICAgIFtpbmRpY2F0b3JTdGF0dXNdPVwiaW5kaWNhdG9yU3RhdHVzXCJcbiAgICBbaW5MaXN0XT1cImluTGlzdFwiXG4gICAgW2l0ZW1dPVwiJGFueShpdGVtKVwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgPjwvbXRuYS13Zi1pbnB1dC1pdGVtPlxuXG4gIDwhLS0gRFlOQU1JQyBDT01QT05FTlQgQ09OVEFJTkVSIC0tPlxuICA8bmctdGVtcGxhdGUgKm5nU3dpdGNoRGVmYXVsdCBmb3JtSXRlbUhvc3Q+PC9uZy10ZW1wbGF0ZT5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2l0ZW1IZWFkZXIgbGV0LWhpZGVSZXF1aXJlZE1hcmtlcj5cbiAgPG10bmEtd2YtaXRlbS1oZWFkZXJcbiAgICAqbmdJZj1cIiEhaXRlbS5xdWVzdGlvblRleHQgfHwgISFpdGVtLmRlc2NyaXB0aXZlVGV4dFwiXG4gICAgW2Rlc2NyaXB0aXZlVGV4dF09XCJpdGVtLmRlc2NyaXB0aXZlVGV4dFwiXG4gICAgW2Rpc2FibGVkXT1cImNvbnRyb2w/LmRpc2FibGVkXCJcbiAgICBbaGlkZVJlcXVpcmVkTWFya2VyXT1cImhpZGVSZXF1aXJlZE1hcmtlclwiXG4gICAgW2ludmFsaWRdPVwiY29udHJvbD8uaW52YWxpZCAmJiAoY29udHJvbD8uZGlydHkgfHwgY29udHJvbD8udG91Y2hlZClcIlxuICAgIFtxdWVzdGlvblRleHRdPVwiaXRlbS5xdWVzdGlvblRleHRcIlxuICAgIFtyZXF1aXJlZF09XCJpdGVtLnJlcXVpcmVkXCJcbiAgPjwvbXRuYS13Zi1pdGVtLWhlYWRlcj5cbjwvbmctdGVtcGxhdGU+XG4iLCI8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyXCI+PC9uZy1jb250YWluZXI+XG48bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbFwiPlxuICA8ZGl2IGNsYXNzPVwibXRuYS13Zi1lcnJvci1jb250YWluZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbC5pbnZhbGlkICYmIChjb250cm9sLmRpcnR5IHx8IGNvbnRyb2wudG91Y2hlZClcIj5cbiAgICAgIDxtYXQtZXJyb3IgKm5nRm9yPVwibGV0IGVycm9yIG9mIGNvbnRyb2wuZXJyb3JzIHwga2V5dmFsdWVcIj5cbiAgICAgICAge3sgZXJyb3IgfCBtdG5hV2ZHZXRDb250cm9sRXJyb3IgOiBpdGVtIH19XG4gICAgICA8L21hdC1lcnJvcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxtYXQtcmFkaW8tZ3JvdXAgY2xhc3M9XCJjb250cm9sLWl0ZW0tY29udGVudFwiIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCIgKGNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdCBvZiBpdGVtLm9wdGlvbnM7IHRyYWNrQnk6IF90cmFja0J5T3B0aW9uSWRcIj5cbiAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFtkaXNhYmxlUmlwcGxlXT1cInJlYWRvbmx5XCIgW3ZhbHVlXT1cIm9wdC5vcHRpb24uaWRcIj57eyBvcHQub3B0aW9uLm5hbWUgfX08L21hdC1yYWRpby1idXR0b24+XG4gICAgICA8bXRuYS13Zi1pdGVtXG4gICAgICAgICpuZ0lmPVwiaXRlbS5vcHRpb25JdGVtTWFwW29wdC5vcHRpb24uaWRdIGFzIHN1Ykl0ZW1cIlxuICAgICAgICBbaXRlbV09XCJzdWJJdGVtXCJcbiAgICAgICAgW2NvbnRyb2xdPVwiISFjb250cm9sV3JhcHBlciAmJiAhIWNvbnRyb2xXcmFwcGVyLmNvbnRyb2xzID8gY29udHJvbFdyYXBwZXIuY29udHJvbHNbc3ViSXRlbS5pbnN0YW5jZUlkXSA6IHVuZGVmaW5lZFwiXG4gICAgICAgIFtwYXJlbnRJZHNdPVwicGFyZW50SWRzLmNvbmNhdChvcHQub3B0aW9uLmlkKVwiXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICA+PC9tdG5hLXdmLWl0ZW0+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbWF0LXJhZGlvLWdyb3VwPlxuPC9uZy1jb250YWluZXI+XG4iLCI8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyXCI+PC9uZy1jb250YWluZXI+XG48bWF0LXNsaWRlLXRvZ2dsZSAqbmdJZj1cImNvbnRyb2xcIiBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiIChjaGFuZ2UpPVwidG9nZ2xlQ2hhbmdlKCRldmVudClcIj57eyBpdGVtLm9wdGlvbi5vcHRpb24ubmFtZSB9fTwvbWF0LXNsaWRlLXRvZ2dsZT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhIWl0ZW0ub3B0aW9uSXRlbU1hcFwiPlxuICA8bXRuYS13Zi1pdGVtXG4gICAgKm5nRm9yPVwibGV0IGYgb2YgaXRlbS5vcHRpb25JdGVtTWFwIHwga2V5dmFsdWU7IHRyYWNrQnk6IF90cmFja0J5SW5zdGFuY2VJZFwiXG4gICAgW2l0ZW1dPVwiZi52YWx1ZVwiXG4gICAgW2NvbnRyb2xdPVwiISFjb250cm9sV3JhcHBlciAmJiBjb250cm9sV3JhcHBlci5jb250cm9scyA/IGNvbnRyb2xXcmFwcGVyLmNvbnRyb2xzW2YudmFsdWUuaW5zdGFuY2VJZF0gOiB1bmRlZmluZWRcIlxuICAgIFtwYXJlbnRJZHNdPVwicGFyZW50SWRzXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICA+PC9tdG5hLXdmLWl0ZW0+XG4gIDxuZy1jb250YWluZXI+IDwvbmctY29udGFpbmVyXG4+PC9uZy1jb250YWluZXI+XG4iLCI8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyXCI+PC9uZy1jb250YWluZXI+XG48ZGl2ICpuZ0lmPVwiaGFzSXRlbUhlYWRlclwiIGNsYXNzPVwibXRuYS13Zi1lcnJvci1jb250YWluZXJcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2w/LmludmFsaWQgJiYgKGNvbnRyb2w/LmRpcnR5IHx8IGNvbnRyb2w/LnRvdWNoZWQpXCI+XG4gICAgPG1hdC1lcnJvciAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgY29udHJvbD8uZXJyb3JzIHwga2V5dmFsdWVcIj5cbiAgICAgIHt7IGVycm9yIHwgbXRuYVdmR2V0Q29udHJvbEVycm9yIDogaXRlbSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuPGZpZWxkc2V0XG4gIGNsYXNzPVwiY29udHJvbC1pdGVtLWNvbnRlbnRcIlxuICBbY2xhc3Muc2luZ2xlLW9wdGlvbl09XCJpdGVtLm9wdGlvbnM/Lmxlbmd0aCA9PT0gMVwiXG4gIFttdG5hSGlnaGxpZ2h0XT1cImluZGljYXRvclN0YXR1cyA9PT0gJ0FDVElWRScgJiYgIWhhc0l0ZW1IZWFkZXJcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHQgb2YgaXRlbS5vcHRpb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiBfdHJhY2tCeU9wdGlvbklkXCI+XG4gICAgPG1hdC1jaGVja2JveFxuICAgICAgKm5nSWY9XCIhIWNvbnRyb2wgJiYgISFjb250cm9sLmNvbnRyb2xzICYmICEhY29udHJvbC5jb250cm9sc1tpXVwiXG4gICAgICBbZGlzYWJsZVJpcHBsZV09XCJyZWFkb25seVwiXG4gICAgICBbZm9ybUNvbnRyb2xdPVwiJGFueShjb250cm9sLmNvbnRyb2xzW2ldKVwiXG4gICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgKGNoYW5nZSk9XCJoYW5kbGVDaGFuZ2UoJGV2ZW50LCBpKVwiXG4gICAgICA+e3sgb3B0Lm9wdGlvbi5uYW1lIH19XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwib3B0LmFja25vd2xlZGdlbWVudCAmJiBjb250cm9sLmNvbnRyb2xzW2ldLnZhbHVlXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkFja25vd2xlZGdlZC4gQ2xpY2sgdG8gdmlldyB0aGUgYWdyZWVtZW50LlwiXG4gICAgICAgIGNsYXNzPVwiYWNrbm93bGVkZ2UtdmVyaWZpY2F0aW9uLWJ1dHRvblwiXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBtYXRUb29sdGlwPVwiQWNrbm93bGVkZ2VkLiBDbGljayB0byB2aWV3IHRoZSBhZ3JlZW1lbnQuXCJcbiAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjgwMFwiXG4gICAgICAgIChjbGljayk9XCJzaG93QWNrbm93bGVkZ2VtZW50KCRldmVudCwgb3B0LmFja25vd2xlZGdlbWVudClcIlxuICAgICAgICAobW91c2Vkb3duKT1cInN0b3BFdmVudFByb3BhZ2F0aW9uKCRldmVudClcIlxuICAgICAgICAodG91Y2hzdGFydCk9XCJzdG9wRXZlbnRQcm9wYWdhdGlvbigkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPnZlcmlmaWVkPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWNoZWNrYm94PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm9wdGlvbkl0ZW1NYXBbb3B0Lm9wdGlvbi5pZF1cIj5cbiAgICAgIDxtdG5hLXdmLWl0ZW1cbiAgICAgICAgKm5nSWY9XCJpdGVtLm9wdGlvbkl0ZW1NYXBbb3B0Lm9wdGlvbi5pZF0gYXMgc3ViSXRlbVwiXG4gICAgICAgIFtpdGVtXT1cInN1Ykl0ZW1cIlxuICAgICAgICBbY29udHJvbF09XCIhIWNvbnRyb2xXcmFwcGVyICYmIGNvbnRyb2xXcmFwcGVyLmNvbnRyb2xzID8gY29udHJvbFdyYXBwZXIuY29udHJvbHNbc3ViSXRlbS5pbnN0YW5jZUlkXSA6IHVuZGVmaW5lZFwiXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgIFtwYXJlbnRJZHNdPVwicGFyZW50SWRzLmNvbmNhdChvcHQub3B0aW9uLmlkKVwiXG4gICAgICA+PC9tdG5hLXdmLWl0ZW0+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9maWVsZHNldD5cbiJdfQ==