vcomply-workflow-engine 6.3.1 → 6.3.3

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.
@@ -30,33 +30,67 @@ export class FrequencyDueDateComponent {
30
30
  this.type = this.mode;
31
31
  }
32
32
  }
33
- onValueChange(event, actionType) {
34
- if (!Number.isNaN(Number(event.target.value)) &&
35
- parseInt(event.target.value) > -1) {
36
- this.valueChange.emit({
37
- type: actionType,
38
- value: Number(event.target.value),
39
- pageName: this.pageName,
40
- });
33
+ // Unified event handler for all input events
34
+ onInputEvent(event) {
35
+ const inputId = event.target.id;
36
+ let actionType = '';
37
+ // Determine action type based on input ID
38
+ if (inputId.includes('complete-')) {
39
+ actionType = 'completed';
41
40
  }
42
- else {
43
- if (actionType === 'completed') {
44
- this.completedValue = this.defaultWindow;
45
- }
46
- else if (actionType === 'not completed') {
47
- this.notCompletedValue = this.defaultFailed;
48
- }
49
- else if (actionType === 'deactivated') {
50
- this.deactivateValue = this.defaultDeactivate;
51
- }
41
+ else if (inputId.includes('not-completed-')) {
42
+ actionType = 'not completed';
43
+ }
44
+ else if (inputId.includes('deactivate')) {
45
+ actionType = 'deactivated';
46
+ }
47
+ // Process and validate the input value
48
+ let value = this.processInputValue(event.target.value);
49
+ // Update the input field
50
+ event.target.value = value;
51
+ // Update the corresponding model property
52
+ this.updateModelProperty(actionType, value);
53
+ // Emit the change event
54
+ this.valueChange.emit({
55
+ type: actionType,
56
+ value: value,
57
+ pageName: this.pageName,
58
+ });
59
+ }
60
+ // Process input value: remove leading zeros, ensure positive, handle edge cases
61
+ processInputValue(inputValue) {
62
+ if (inputValue === '' || inputValue === null || inputValue === undefined) {
63
+ return 0;
52
64
  }
65
+ // Convert to number and ensure it's positive
66
+ let value = Math.abs(Number(inputValue));
67
+ // Remove leading zeros by converting to string and back to number
68
+ return Number(value.toString());
69
+ }
70
+ // Update the corresponding model property
71
+ updateModelProperty(actionType, value) {
72
+ switch (actionType) {
73
+ case 'completed':
74
+ this.completedValue = value;
75
+ break;
76
+ case 'not completed':
77
+ this.notCompletedValue = value;
78
+ break;
79
+ case 'deactivated':
80
+ this.deactivateValue = value;
81
+ break;
82
+ }
83
+ }
84
+ // Prevent decimal point entry
85
+ onKeyDown(event) {
86
+ return event.key !== '.';
53
87
  }
54
88
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FrequencyDueDateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
55
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FrequencyDueDateComponent, selector: "app-frequency-due-date", inputs: { mode: "mode", pageType: "pageType", completedRequired: "completedRequired", notCompletedRequired: "notCompletedRequired", completedValue: "completedValue", notCompletedValue: "notCompletedValue", deactivateValue: "deactivateValue", isDeactivated: "isDeactivated", id: "id", pageName: "pageName" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div\n *ngIf=\"['responsibility', 'policy', 'reviewerFrequency'].includes(mode)\"\n class=\"frequency-bottom\"\n>\n <div *ngIf=\"completedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.windowOpen }}\n </div>\n <div\n class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\"\n >\n The {{ pageType }} can be {{ dueDateText?.keys }} on the due date and\n <input\n class=\"countNum\"\n [id]=\"'complete-' + id\"\n type=\"number\"\n [(ngModel)]=\"completedValue\"\n (change)=\"onValueChange($event, 'completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n {{ completedValue < 2 ? \"day\" : \"days\" }}\n <span class=\"vx-fw-500\">before</span> the due date. Where this occurs,\n this will show as the {{ mode === \"reviewerFrequency\" ? \"policy\" : type }} being\n <span class=\"completed-text vx-fw-500\"\n >{{ dueDateText?.keys }} on time</span\n >.\n </div>\n </div>\n\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.extension }}\n </div>\n <div\n class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\"\n >\n The {{ pageType }} can be {{ dueDateText?.keys }}\n <input\n class=\"countNum\"\n type=\"number\"\n [id]=\"'not-completed-' + id\"\n [(ngModel)]=\"notCompletedValue\"\n (change)=\"onValueChange($event, 'not completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }}\n <span class=\"vx-fw-500\">after</span> the due date. Where this occurs, this\n will show as the {{ mode === \"reviewerFrequency\" ? \"policy\" : type }} being\n <span class=\"delay-text vx-fw-500\"\n >{{ dueDateText?.keys }} with delay</span\n >.\n </div>\n </div>\n\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.windowCloses }}\n </div>\n <div\n class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\"\n >\n The {{ pageType }} cannot be {{ dueDateText?.keys }}\n <span class=\"vx-fw-500 vx-label-txt\">{{ notCompletedValue }}</span>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }}\n <span class=\"vx-fw-500\">after</span> the due date. Where this occurs, this\n will show as the {{ type }} being\n <span class=\"notcompleted-text vx-fw-500\"\n >not\n {{\n dueDateText?.keys === \"reviewed\" ? \"completed\" : dueDateText?.keys\n }}</span\n >.\n </div>\n </div>\n\n <div\n *ngIf=\"isDeactivated && mode === 'responsibility'\"\n class=\"frequency-bottom-item vx-mt-5\"\n >\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n AUTOMATIC DEACTIVATE:\n </div>\n <div\n class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\"\n >\n This {{ type }} will be automatically deactivated, if it is not\n {{ dueDateText?.keys }}\n for\n <input\n class=\"countNum\"\n type=\"number\"\n [id]=\"'deactivate' + id\"\n [(ngModel)]=\"deactivateValue\"\n (change)=\"onValueChange($event, 'deactivated')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n consecutive due dates.\n </div>\n </div>\n</div>\n\n<!-- For Policy -->\n<div class=\"frequency-due-date\" *ngIf=\"mode == 'policy' && false\">\n <div *ngIf=\"completedRequired\" class=\"frequency-due-date-row\">\n <p>The policy can be <i class=\"completed\">attested</i></p>\n <input\n [id]=\"'complete-' + id\"\n type=\"number\"\n [(ngModel)]=\"completedValue\"\n (change)=\"onValueChange($event, 'completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n <p>{{ completedValue < 2 ? \"day\" : \"days\" }} before the due date.</p>\n </div>\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-due-date-row\">\n <p>The policy attestation will <i>fail</i></p>\n <input\n type=\"number\"\n [id]=\"'not-completed-' + id\"\n [(ngModel)]=\"notCompletedValue\"\n (change)=\"onValueChange($event, 'not completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n <p>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} after the due date if it is\n not completed.\n </p>\n </div>\n</div>\n<div class=\"frequency-due-date\" *ngIf=\"mode == 'reviewerFrequency' && false\">\n <div *ngIf=\"completedRequired\" class=\"frequency-due-date-row\">\n <p>The policy can be <i class=\"completed\">reviewed</i></p>\n <input\n [id]=\"'complete-' + id\"\n type=\"number\"\n [(ngModel)]=\"completedValue\"\n (change)=\"onValueChange($event, 'completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n <p>{{ completedValue < 2 ? \"day\" : \"days\" }} before the review date.</p>\n </div>\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-due-date-row\">\n <p>The policy review will <i>fail</i></p>\n <input\n type=\"number\"\n [id]=\"'not-completed-' + id\"\n [(ngModel)]=\"notCompletedValue\"\n (change)=\"onValueChange($event, 'not completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n <p>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} after the review date if it\n is not completed.\n </p>\n </div>\n</div>\n", styles: ["@import\"https://cdn.v-comply.com/design-system/css/mixin/mixin.css\";@import\"https://cdn.v-comply.com/design-system/css/header/header.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/button/button.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/popover/popover.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";::ng-deep .frequency-bottom-item-box{border-radius:.25rem;border:1px solid #f1f1f1}::ng-deep .frequency-bottom-item-box input.countNum{-moz-appearance:textfield;border:none;border-bottom:1px solid #DBDBDB;color:#161b2f;display:inline-block;font-size:13px;text-align:center;width:2.75rem;padding:.125rem;margin:0 .5rem;outline:none}::ng-deep .frequency-bottom-item-box input.countNum::-webkit-inner-spin-button,::ng-deep .frequency-bottom-item-box input.countNum::-webkit-outer-spin-button{-webkit-appearance:none}::ng-deep .frequency-bottom-item-box .completed-text{color:#34aa44}::ng-deep .frequency-bottom-item-box .delay-text{color:#f0b819}::ng-deep .frequency-bottom-item-box .notcompleted-text{color:#d93b41}.frequency-due-date{display:block}.frequency-due-date-row{display:flex;border-top:1px solid #f1f1f1;padding:12px 20px;align-items:center}.frequency-due-date p{font-size:13px;color:#747576;width:auto;margin:0;font-weight:400;line-height:20px}.frequency-due-date p i{color:#d93b41;font-style:italic;font-weight:500;padding:0 4px}.frequency-due-date p i.completed{color:#1e5dd3}.frequency-due-date p strong{font-weight:600;font-style:italic}.frequency-due-date input{-moz-appearance:textfield;font-size:14px;color:#161b2f;border:0;border-bottom:2px solid #dcdcdc;display:inline-block;width:36px;text-align:center;padding:4px;margin:0 8px;outline:none}.frequency-due-date input::-webkit-outer-spin-button,.frequency-due-date input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\n"], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
89
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FrequencyDueDateComponent, selector: "app-frequency-due-date", inputs: { mode: "mode", pageType: "pageType", completedRequired: "completedRequired", notCompletedRequired: "notCompletedRequired", completedValue: "completedValue", notCompletedValue: "notCompletedValue", deactivateValue: "deactivateValue", isDeactivated: "isDeactivated", id: "id", pageName: "pageName" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div *ngIf=\"['responsibility', 'policy', 'reviewerFrequency'].includes(mode)\" class=\"frequency-bottom\">\n <div *ngIf=\"completedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.windowOpen }}\n </div>\n <div class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\">\n The {{ pageType }} can be {{ dueDateText?.keys }} on the due date and\n <input class=\"countNum\" [id]=\"'complete-' + id\" type=\"number\" [(ngModel)]=\"completedValue\"\n (input)=\"onInputEvent($event)\" (keydown)=\"onKeyDown($event)\" min=\"0\" />\n {{ completedValue < 2 ? \"day\" : \"days\" }} <span class=\"vx-fw-500\">before</span> the due date. Where this occurs,\n this will show as the {{ mode === \"reviewerFrequency\" ? \"policy\" : type }} being\n <span class=\"completed-text vx-fw-500\">{{ dueDateText?.keys }} on time</span>.\n </div>\n </div>\n\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.extension }}\n </div>\n <div class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\">\n The {{ pageType }} can be {{ dueDateText?.keys }}\n <input class=\"countNum\" type=\"number\" [id]=\"'not-completed-' + id\" [(ngModel)]=\"notCompletedValue\"\n (input)=\"onInputEvent($event)\" (keydown)=\"onKeyDown($event)\" min=\"0\" />\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} <span class=\"vx-fw-500\">after</span> the due date. Where this occurs,\n this\n will show as the {{ mode === \"reviewerFrequency\" ? \"policy\" : type }} being\n <span class=\"delay-text vx-fw-500\">{{ dueDateText?.keys }} with delay</span>.\n </div>\n </div>\n\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.windowCloses }}\n </div>\n <div class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\">\n The {{ pageType }} cannot be {{ dueDateText?.keys }}\n <span class=\"vx-fw-500 vx-label-txt\">{{ notCompletedValue }}</span>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} <span class=\"vx-fw-500\">after</span> the due date. Where this occurs,\n this\n will show as the {{ type }} being\n <span class=\"notcompleted-text vx-fw-500\">not\n {{\n dueDateText?.keys === \"reviewed\" ? \"completed\" : dueDateText?.keys\n }}</span>.\n </div>\n </div>\n\n <div *ngIf=\"isDeactivated && mode === 'responsibility'\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n AUTOMATIC DEACTIVATE:\n </div>\n <div class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\">\n This {{ type }} will be automatically deactivated, if it is not\n {{ dueDateText?.keys }}\n for\n <input class=\"countNum\" type=\"number\" [id]=\"'deactivate' + id\" [(ngModel)]=\"deactivateValue\"\n (input)=\"onInputEvent($event)\" (keydown)=\"onKeyDown($event)\" min=\"0\" />\n consecutive due dates.\n </div>\n </div>\n</div>\n\n<!-- For Policy -->\n<div class=\"frequency-due-date\" *ngIf=\"mode == 'policy' && false\">\n <div *ngIf=\"completedRequired\" class=\"frequency-due-date-row\">\n <p>The policy can be <i class=\"completed\">attested</i></p>\n <input [id]=\"'complete-' + id\" type=\"number\" [(ngModel)]=\"completedValue\" (input)=\"onInputEvent($event)\"\n (keydown)=\"onKeyDown($event)\" min=\"0\" />\n <p>{{ completedValue < 2 ? \"day\" : \"days\" }} before the due date.</p>\n </div>\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-due-date-row\">\n <p>The policy attestation will <i>fail</i></p>\n <input type=\"number\" [id]=\"'not-completed-' + id\" [(ngModel)]=\"notCompletedValue\" (input)=\"onInputEvent($event)\"\n (keydown)=\"onKeyDown($event)\" min=\"0\" />\n <p>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} after the due date if it is not completed. </p>\n </div>\n</div>\n<div class=\"frequency-due-date\" *ngIf=\"mode == 'reviewerFrequency' && false\">\n <div *ngIf=\"completedRequired\" class=\"frequency-due-date-row\">\n <p>The policy can be <i class=\"completed\">reviewed</i></p>\n <input [id]=\"'complete-' + id\" type=\"number\" [(ngModel)]=\"completedValue\" (input)=\"onInputEvent($event)\"\n (keydown)=\"onKeyDown($event)\" min=\"0\" />\n <p>{{ completedValue < 2 ? \"day\" : \"days\" }} before the review date.</p>\n </div>\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-due-date-row\">\n <p>The policy review will <i>fail</i></p>\n <input type=\"number\" [id]=\"'not-completed-' + id\" [(ngModel)]=\"notCompletedValue\" (input)=\"onInputEvent($event)\"\n (keydown)=\"onKeyDown($event)\" min=\"0\" />\n <p>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} after the review date if it is not completed. </p>\n </div>\n</div>", styles: ["@import\"https://cdn.v-comply.com/design-system/css/mixin/mixin.css\";@import\"https://cdn.v-comply.com/design-system/css/header/header.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/button/button.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/popover/popover.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";::ng-deep .frequency-bottom-item-box{border-radius:.25rem;border:1px solid #f1f1f1}::ng-deep .frequency-bottom-item-box input.countNum{-moz-appearance:textfield;border:none;border-bottom:1px solid #DBDBDB;color:#161b2f;display:inline-block;font-size:13px;text-align:center;width:2.75rem;padding:.125rem;margin:0 .5rem;outline:none}::ng-deep .frequency-bottom-item-box input.countNum::-webkit-inner-spin-button,::ng-deep .frequency-bottom-item-box input.countNum::-webkit-outer-spin-button{-webkit-appearance:none}::ng-deep .frequency-bottom-item-box .completed-text{color:#34aa44}::ng-deep .frequency-bottom-item-box .delay-text{color:#f0b819}::ng-deep .frequency-bottom-item-box .notcompleted-text{color:#d93b41}.frequency-due-date{display:block}.frequency-due-date-row{display:flex;border-top:1px solid #f1f1f1;padding:12px 20px;align-items:center}.frequency-due-date p{font-size:13px;color:#747576;width:auto;margin:0;font-weight:400;line-height:20px}.frequency-due-date p i{color:#d93b41;font-style:italic;font-weight:500;padding:0 4px}.frequency-due-date p i.completed{color:#1e5dd3}.frequency-due-date p strong{font-weight:600;font-style:italic}.frequency-due-date input{-moz-appearance:textfield;font-size:14px;color:#161b2f;border:0;border-bottom:2px solid #dcdcdc;display:inline-block;width:36px;text-align:center;padding:4px;margin:0 8px;outline:none}.frequency-due-date input::-webkit-outer-spin-button,.frequency-due-date input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\n"], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
56
90
  }
57
91
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FrequencyDueDateComponent, decorators: [{
58
92
  type: Component,
59
- args: [{ selector: 'app-frequency-due-date', template: "<div\n *ngIf=\"['responsibility', 'policy', 'reviewerFrequency'].includes(mode)\"\n class=\"frequency-bottom\"\n>\n <div *ngIf=\"completedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.windowOpen }}\n </div>\n <div\n class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\"\n >\n The {{ pageType }} can be {{ dueDateText?.keys }} on the due date and\n <input\n class=\"countNum\"\n [id]=\"'complete-' + id\"\n type=\"number\"\n [(ngModel)]=\"completedValue\"\n (change)=\"onValueChange($event, 'completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n {{ completedValue < 2 ? \"day\" : \"days\" }}\n <span class=\"vx-fw-500\">before</span> the due date. Where this occurs,\n this will show as the {{ mode === \"reviewerFrequency\" ? \"policy\" : type }} being\n <span class=\"completed-text vx-fw-500\"\n >{{ dueDateText?.keys }} on time</span\n >.\n </div>\n </div>\n\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.extension }}\n </div>\n <div\n class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\"\n >\n The {{ pageType }} can be {{ dueDateText?.keys }}\n <input\n class=\"countNum\"\n type=\"number\"\n [id]=\"'not-completed-' + id\"\n [(ngModel)]=\"notCompletedValue\"\n (change)=\"onValueChange($event, 'not completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }}\n <span class=\"vx-fw-500\">after</span> the due date. Where this occurs, this\n will show as the {{ mode === \"reviewerFrequency\" ? \"policy\" : type }} being\n <span class=\"delay-text vx-fw-500\"\n >{{ dueDateText?.keys }} with delay</span\n >.\n </div>\n </div>\n\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.windowCloses }}\n </div>\n <div\n class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\"\n >\n The {{ pageType }} cannot be {{ dueDateText?.keys }}\n <span class=\"vx-fw-500 vx-label-txt\">{{ notCompletedValue }}</span>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }}\n <span class=\"vx-fw-500\">after</span> the due date. Where this occurs, this\n will show as the {{ type }} being\n <span class=\"notcompleted-text vx-fw-500\"\n >not\n {{\n dueDateText?.keys === \"reviewed\" ? \"completed\" : dueDateText?.keys\n }}</span\n >.\n </div>\n </div>\n\n <div\n *ngIf=\"isDeactivated && mode === 'responsibility'\"\n class=\"frequency-bottom-item vx-mt-5\"\n >\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n AUTOMATIC DEACTIVATE:\n </div>\n <div\n class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\"\n >\n This {{ type }} will be automatically deactivated, if it is not\n {{ dueDateText?.keys }}\n for\n <input\n class=\"countNum\"\n type=\"number\"\n [id]=\"'deactivate' + id\"\n [(ngModel)]=\"deactivateValue\"\n (change)=\"onValueChange($event, 'deactivated')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n consecutive due dates.\n </div>\n </div>\n</div>\n\n<!-- For Policy -->\n<div class=\"frequency-due-date\" *ngIf=\"mode == 'policy' && false\">\n <div *ngIf=\"completedRequired\" class=\"frequency-due-date-row\">\n <p>The policy can be <i class=\"completed\">attested</i></p>\n <input\n [id]=\"'complete-' + id\"\n type=\"number\"\n [(ngModel)]=\"completedValue\"\n (change)=\"onValueChange($event, 'completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n <p>{{ completedValue < 2 ? \"day\" : \"days\" }} before the due date.</p>\n </div>\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-due-date-row\">\n <p>The policy attestation will <i>fail</i></p>\n <input\n type=\"number\"\n [id]=\"'not-completed-' + id\"\n [(ngModel)]=\"notCompletedValue\"\n (change)=\"onValueChange($event, 'not completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n <p>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} after the due date if it is\n not completed.\n </p>\n </div>\n</div>\n<div class=\"frequency-due-date\" *ngIf=\"mode == 'reviewerFrequency' && false\">\n <div *ngIf=\"completedRequired\" class=\"frequency-due-date-row\">\n <p>The policy can be <i class=\"completed\">reviewed</i></p>\n <input\n [id]=\"'complete-' + id\"\n type=\"number\"\n [(ngModel)]=\"completedValue\"\n (change)=\"onValueChange($event, 'completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n <p>{{ completedValue < 2 ? \"day\" : \"days\" }} before the review date.</p>\n </div>\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-due-date-row\">\n <p>The policy review will <i>fail</i></p>\n <input\n type=\"number\"\n [id]=\"'not-completed-' + id\"\n [(ngModel)]=\"notCompletedValue\"\n (change)=\"onValueChange($event, 'not completed')\"\n onkeydown=\"return event.keyCode !== 190\"\n min=\"0\"\n oninput=\"this.value = Math.abs(this.value)\"\n />\n <p>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} after the review date if it\n is not completed.\n </p>\n </div>\n</div>\n", styles: ["@import\"https://cdn.v-comply.com/design-system/css/mixin/mixin.css\";@import\"https://cdn.v-comply.com/design-system/css/header/header.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/button/button.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/popover/popover.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";::ng-deep .frequency-bottom-item-box{border-radius:.25rem;border:1px solid #f1f1f1}::ng-deep .frequency-bottom-item-box input.countNum{-moz-appearance:textfield;border:none;border-bottom:1px solid #DBDBDB;color:#161b2f;display:inline-block;font-size:13px;text-align:center;width:2.75rem;padding:.125rem;margin:0 .5rem;outline:none}::ng-deep .frequency-bottom-item-box input.countNum::-webkit-inner-spin-button,::ng-deep .frequency-bottom-item-box input.countNum::-webkit-outer-spin-button{-webkit-appearance:none}::ng-deep .frequency-bottom-item-box .completed-text{color:#34aa44}::ng-deep .frequency-bottom-item-box .delay-text{color:#f0b819}::ng-deep .frequency-bottom-item-box .notcompleted-text{color:#d93b41}.frequency-due-date{display:block}.frequency-due-date-row{display:flex;border-top:1px solid #f1f1f1;padding:12px 20px;align-items:center}.frequency-due-date p{font-size:13px;color:#747576;width:auto;margin:0;font-weight:400;line-height:20px}.frequency-due-date p i{color:#d93b41;font-style:italic;font-weight:500;padding:0 4px}.frequency-due-date p i.completed{color:#1e5dd3}.frequency-due-date p strong{font-weight:600;font-style:italic}.frequency-due-date input{-moz-appearance:textfield;font-size:14px;color:#161b2f;border:0;border-bottom:2px solid #dcdcdc;display:inline-block;width:36px;text-align:center;padding:4px;margin:0 8px;outline:none}.frequency-due-date input::-webkit-outer-spin-button,.frequency-due-date input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\n"] }]
93
+ args: [{ selector: 'app-frequency-due-date', template: "<div *ngIf=\"['responsibility', 'policy', 'reviewerFrequency'].includes(mode)\" class=\"frequency-bottom\">\n <div *ngIf=\"completedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.windowOpen }}\n </div>\n <div class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\">\n The {{ pageType }} can be {{ dueDateText?.keys }} on the due date and\n <input class=\"countNum\" [id]=\"'complete-' + id\" type=\"number\" [(ngModel)]=\"completedValue\"\n (input)=\"onInputEvent($event)\" (keydown)=\"onKeyDown($event)\" min=\"0\" />\n {{ completedValue < 2 ? \"day\" : \"days\" }} <span class=\"vx-fw-500\">before</span> the due date. Where this occurs,\n this will show as the {{ mode === \"reviewerFrequency\" ? \"policy\" : type }} being\n <span class=\"completed-text vx-fw-500\">{{ dueDateText?.keys }} on time</span>.\n </div>\n </div>\n\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.extension }}\n </div>\n <div class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\">\n The {{ pageType }} can be {{ dueDateText?.keys }}\n <input class=\"countNum\" type=\"number\" [id]=\"'not-completed-' + id\" [(ngModel)]=\"notCompletedValue\"\n (input)=\"onInputEvent($event)\" (keydown)=\"onKeyDown($event)\" min=\"0\" />\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} <span class=\"vx-fw-500\">after</span> the due date. Where this occurs,\n this\n will show as the {{ mode === \"reviewerFrequency\" ? \"policy\" : type }} being\n <span class=\"delay-text vx-fw-500\">{{ dueDateText?.keys }} with delay</span>.\n </div>\n </div>\n\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n {{ dueDateText.windowCloses }}\n </div>\n <div class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\">\n The {{ pageType }} cannot be {{ dueDateText?.keys }}\n <span class=\"vx-fw-500 vx-label-txt\">{{ notCompletedValue }}</span>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} <span class=\"vx-fw-500\">after</span> the due date. Where this occurs,\n this\n will show as the {{ type }} being\n <span class=\"notcompleted-text vx-fw-500\">not\n {{\n dueDateText?.keys === \"reviewed\" ? \"completed\" : dueDateText?.keys\n }}</span>.\n </div>\n </div>\n\n <div *ngIf=\"isDeactivated && mode === 'responsibility'\" class=\"frequency-bottom-item vx-mt-5\">\n <div class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-tt-uppercase vx-mb-1\">\n AUTOMATIC DEACTIVATE:\n </div>\n <div class=\"frequency-bottom-item-box vx-fs-13 vx-paragraph-txt vx-p-3 vx-pt-4 vx-pb-4 vx-d-block\">\n This {{ type }} will be automatically deactivated, if it is not\n {{ dueDateText?.keys }}\n for\n <input class=\"countNum\" type=\"number\" [id]=\"'deactivate' + id\" [(ngModel)]=\"deactivateValue\"\n (input)=\"onInputEvent($event)\" (keydown)=\"onKeyDown($event)\" min=\"0\" />\n consecutive due dates.\n </div>\n </div>\n</div>\n\n<!-- For Policy -->\n<div class=\"frequency-due-date\" *ngIf=\"mode == 'policy' && false\">\n <div *ngIf=\"completedRequired\" class=\"frequency-due-date-row\">\n <p>The policy can be <i class=\"completed\">attested</i></p>\n <input [id]=\"'complete-' + id\" type=\"number\" [(ngModel)]=\"completedValue\" (input)=\"onInputEvent($event)\"\n (keydown)=\"onKeyDown($event)\" min=\"0\" />\n <p>{{ completedValue < 2 ? \"day\" : \"days\" }} before the due date.</p>\n </div>\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-due-date-row\">\n <p>The policy attestation will <i>fail</i></p>\n <input type=\"number\" [id]=\"'not-completed-' + id\" [(ngModel)]=\"notCompletedValue\" (input)=\"onInputEvent($event)\"\n (keydown)=\"onKeyDown($event)\" min=\"0\" />\n <p>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} after the due date if it is not completed. </p>\n </div>\n</div>\n<div class=\"frequency-due-date\" *ngIf=\"mode == 'reviewerFrequency' && false\">\n <div *ngIf=\"completedRequired\" class=\"frequency-due-date-row\">\n <p>The policy can be <i class=\"completed\">reviewed</i></p>\n <input [id]=\"'complete-' + id\" type=\"number\" [(ngModel)]=\"completedValue\" (input)=\"onInputEvent($event)\"\n (keydown)=\"onKeyDown($event)\" min=\"0\" />\n <p>{{ completedValue < 2 ? \"day\" : \"days\" }} before the review date.</p>\n </div>\n <div *ngIf=\"notCompletedRequired\" class=\"frequency-due-date-row\">\n <p>The policy review will <i>fail</i></p>\n <input type=\"number\" [id]=\"'not-completed-' + id\" [(ngModel)]=\"notCompletedValue\" (input)=\"onInputEvent($event)\"\n (keydown)=\"onKeyDown($event)\" min=\"0\" />\n <p>\n {{ notCompletedValue < 2 ? \"day\" : \"days\" }} after the review date if it is not completed. </p>\n </div>\n</div>", styles: ["@import\"https://cdn.v-comply.com/design-system/css/mixin/mixin.css\";@import\"https://cdn.v-comply.com/design-system/css/header/header.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/button/button.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/popover/popover.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";::ng-deep .frequency-bottom-item-box{border-radius:.25rem;border:1px solid #f1f1f1}::ng-deep .frequency-bottom-item-box input.countNum{-moz-appearance:textfield;border:none;border-bottom:1px solid #DBDBDB;color:#161b2f;display:inline-block;font-size:13px;text-align:center;width:2.75rem;padding:.125rem;margin:0 .5rem;outline:none}::ng-deep .frequency-bottom-item-box input.countNum::-webkit-inner-spin-button,::ng-deep .frequency-bottom-item-box input.countNum::-webkit-outer-spin-button{-webkit-appearance:none}::ng-deep .frequency-bottom-item-box .completed-text{color:#34aa44}::ng-deep .frequency-bottom-item-box .delay-text{color:#f0b819}::ng-deep .frequency-bottom-item-box .notcompleted-text{color:#d93b41}.frequency-due-date{display:block}.frequency-due-date-row{display:flex;border-top:1px solid #f1f1f1;padding:12px 20px;align-items:center}.frequency-due-date p{font-size:13px;color:#747576;width:auto;margin:0;font-weight:400;line-height:20px}.frequency-due-date p i{color:#d93b41;font-style:italic;font-weight:500;padding:0 4px}.frequency-due-date p i.completed{color:#1e5dd3}.frequency-due-date p strong{font-weight:600;font-style:italic}.frequency-due-date input{-moz-appearance:textfield;font-size:14px;color:#161b2f;border:0;border-bottom:2px solid #dcdcdc;display:inline-block;width:36px;text-align:center;padding:4px;margin:0 8px;outline:none}.frequency-due-date input::-webkit-outer-spin-button,.frequency-due-date input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\n"] }]
60
94
  }], ctorParameters: function () { return []; }, propDecorators: { mode: [{
61
95
  type: Input
62
96
  }], pageType: [{
@@ -80,4 +114,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
80
114
  }], valueChange: [{
81
115
  type: Output
82
116
  }] } });
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlcXVlbmN5LWR1ZS1kYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Z4LXdvcmtmbG93LWVuZ2luZS9zcmMvbGliL3NoYXJlZENvbXBvbmVudHMvZnJlcXVlbmN5L2ZyZXF1ZW5jeS1kdWUtZGF0ZS9mcmVxdWVuY3ktZHVlLWRhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdngtd29ya2Zsb3ctZW5naW5lL3NyYy9saWIvc2hhcmVkQ29tcG9uZW50cy9mcmVxdWVuY3kvZnJlcXVlbmN5LWR1ZS1kYXRlL2ZyZXF1ZW5jeS1kdWUtZGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7OztBQU85QyxNQUFNLE9BQU8seUJBQXlCO0lBQ3BDO1FBQ1MsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUVuQixrQkFBYSxHQUFXLENBQUMsQ0FBQztRQUMxQixrQkFBYSxHQUFXLENBQUMsQ0FBQztRQUMxQixzQkFBaUIsR0FBVyxDQUFDLENBQUM7UUFDOUIsU0FBSSxHQUFXLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFaEIsYUFBUSxHQUFnQyxnQkFBZ0IsQ0FBQztRQUN6RCxzQkFBaUIsR0FBRyxJQUFJLENBQUMsQ0FBQywwQkFBMEI7UUFDcEQseUJBQW9CLEdBQUcsSUFBSSxDQUFDLENBQUMsOEJBQThCO1FBQzNELG1CQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1FBQy9DLHNCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtRQUN0RCxvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUNyQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixPQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1AsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUliLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFwQi9DLENBQUM7SUFzQmhCLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLG1CQUFtQixFQUFFO1lBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1NBQ3RCO2FBQU07WUFDTCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQVUsRUFBRSxVQUFlO1FBQ3ZDLElBQ0UsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUNqQztZQUNBLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNwQixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3hCLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLFVBQVUsS0FBSyxXQUFXLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQzthQUMxQztpQkFBTSxJQUFJLFVBQVUsS0FBSyxlQUFlLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2FBQzdDO2lCQUFNLElBQUksVUFBVSxLQUFLLGFBQWEsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7YUFDL0M7U0FDRjtJQUNILENBQUM7K0dBbkRVLHlCQUF5QjttR0FBekIseUJBQXlCLDJaQ1J0Qyx1dE1BMEtBOzs0RkRsS2EseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHdCQUF3QjswRUFNekIsSUFBSTtzQkFBWixLQUFLO2dCQU9HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRleHRJbmZvIH0gZnJvbSAnLi9kdWUtZGF0ZS5jb250YW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWZyZXF1ZW5jeS1kdWUtZGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9mcmVxdWVuY3ktZHVlLWRhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mcmVxdWVuY3ktZHVlLWRhdGUuY29tcG9uZW50Lmxlc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRnJlcXVlbmN5RHVlRGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgQElucHV0KCkgbW9kZSA9ICcnO1xuXG4gIGRlZmF1bHRXaW5kb3c6IG51bWJlciA9IDA7XG4gIGRlZmF1bHRGYWlsZWQ6IG51bWJlciA9IDA7XG4gIGRlZmF1bHREZWFjdGl2YXRlOiBudW1iZXIgPSAwO1xuICB0eXBlOiBzdHJpbmcgPSB0aGlzLm1vZGU7XG5cbiAgQElucHV0KCkgcGFnZVR5cGU6ICdyZXNwb25zaWJpbGl0eScgfCAncG9saWN5JyA9ICdyZXNwb25zaWJpbGl0eSc7XG4gIEBJbnB1dCgpIGNvbXBsZXRlZFJlcXVpcmVkID0gdHJ1ZTsgLy8gd2hlbiBjb21wbGV0ZWQgcmVxdWlyZWRcbiAgQElucHV0KCkgbm90Q29tcGxldGVkUmVxdWlyZWQgPSB0cnVlOyAvLyB3aGVuIG5vdCBjb21wbGV0ZWQgcmVxdWlyZWRcbiAgQElucHV0KCkgY29tcGxldGVkVmFsdWUgPSAyOyAvLyB0YWtlIGlucHV0IGZvciBjb21wbGV0ZWRcbiAgQElucHV0KCkgbm90Q29tcGxldGVkVmFsdWUgPSAyOyAvLyB0YWtlIGlucHV0IGZvciBub3QgY29tcGxldGVkXG4gIEBJbnB1dCgpIGRlYWN0aXZhdGVWYWx1ZSA9IDE1O1xuICBASW5wdXQoKSBpc0RlYWN0aXZhdGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlkID0gMDtcbiAgQElucHV0KCkgcGFnZU5hbWUgPSAnJztcblxuICBkdWVEYXRlVGV4dDogYW55O1xuXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kdWVEYXRlVGV4dCA9IHRleHRJbmZvW3RoaXMubW9kZV07XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3Jldmlld2VyRnJlcXVlbmN5Jykge1xuICAgICAgdGhpcy50eXBlID0gJ3Jldmlldyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHlwZSA9IHRoaXMubW9kZTtcbiAgICB9XG4gIH1cblxuICBvblZhbHVlQ2hhbmdlKGV2ZW50OiBhbnksIGFjdGlvblR5cGU6IGFueSkge1xuICAgIGlmIChcbiAgICAgICFOdW1iZXIuaXNOYU4oTnVtYmVyKGV2ZW50LnRhcmdldC52YWx1ZSkpICYmXG4gICAgICBwYXJzZUludChldmVudC50YXJnZXQudmFsdWUpID4gLTFcbiAgICApIHtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXG4gICAgICAgIHZhbHVlOiBOdW1iZXIoZXZlbnQudGFyZ2V0LnZhbHVlKSxcbiAgICAgICAgcGFnZU5hbWU6IHRoaXMucGFnZU5hbWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFjdGlvblR5cGUgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgICAgIHRoaXMuY29tcGxldGVkVmFsdWUgPSB0aGlzLmRlZmF1bHRXaW5kb3c7XG4gICAgICB9IGVsc2UgaWYgKGFjdGlvblR5cGUgPT09ICdub3QgY29tcGxldGVkJykge1xuICAgICAgICB0aGlzLm5vdENvbXBsZXRlZFZhbHVlID0gdGhpcy5kZWZhdWx0RmFpbGVkO1xuICAgICAgfSBlbHNlIGlmIChhY3Rpb25UeXBlID09PSAnZGVhY3RpdmF0ZWQnKSB7XG4gICAgICAgIHRoaXMuZGVhY3RpdmF0ZVZhbHVlID0gdGhpcy5kZWZhdWx0RGVhY3RpdmF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCJbJ3Jlc3BvbnNpYmlsaXR5JywgJ3BvbGljeScsICdyZXZpZXdlckZyZXF1ZW5jeSddLmluY2x1ZGVzKG1vZGUpXCJcbiAgY2xhc3M9XCJmcmVxdWVuY3ktYm90dG9tXCJcbj5cbiAgPGRpdiAqbmdJZj1cImNvbXBsZXRlZFJlcXVpcmVkXCIgY2xhc3M9XCJmcmVxdWVuY3ktYm90dG9tLWl0ZW0gdngtbXQtNVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ2eC1mcy0xMSB2eC1mdy01MDAgdngtbGFiZWwtdHh0IHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0xXCI+XG4gICAgICB7eyBkdWVEYXRlVGV4dC53aW5kb3dPcGVuIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJmcmVxdWVuY3ktYm90dG9tLWl0ZW0tYm94IHZ4LWZzLTEzIHZ4LXBhcmFncmFwaC10eHQgdngtcC0zIHZ4LXB0LTQgdngtcGItNCB2eC1kLWJsb2NrXCJcbiAgICA+XG4gICAgICBUaGUge3sgcGFnZVR5cGUgfX0gY2FuIGJlIHt7IGR1ZURhdGVUZXh0Py5rZXlzIH19IG9uIHRoZSBkdWUgZGF0ZSBhbmRcbiAgICAgIDxpbnB1dFxuICAgICAgICBjbGFzcz1cImNvdW50TnVtXCJcbiAgICAgICAgW2lkXT1cIidjb21wbGV0ZS0nICsgaWRcIlxuICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJjb21wbGV0ZWRWYWx1ZVwiXG4gICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQsICdjb21wbGV0ZWQnKVwiXG4gICAgICAgIG9ua2V5ZG93bj1cInJldHVybiBldmVudC5rZXlDb2RlICE9PSAxOTBcIlxuICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSBNYXRoLmFicyh0aGlzLnZhbHVlKVwiXG4gICAgICAvPlxuICAgICAge3sgY29tcGxldGVkVmFsdWUgPCAyID8gXCJkYXlcIiA6IFwiZGF5c1wiIH19XG4gICAgICA8c3BhbiBjbGFzcz1cInZ4LWZ3LTUwMFwiPmJlZm9yZTwvc3Bhbj4gdGhlIGR1ZSBkYXRlLiBXaGVyZSB0aGlzIG9jY3VycyxcbiAgICAgIHRoaXMgd2lsbCBzaG93IGFzIHRoZSB7eyBtb2RlID09PSBcInJldmlld2VyRnJlcXVlbmN5XCIgPyBcInBvbGljeVwiIDogdHlwZSB9fSBiZWluZ1xuICAgICAgPHNwYW4gY2xhc3M9XCJjb21wbGV0ZWQtdGV4dCB2eC1mdy01MDBcIlxuICAgICAgICA+e3sgZHVlRGF0ZVRleHQ/LmtleXMgfX0gb24gdGltZTwvc3BhblxuICAgICAgPi5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cIm5vdENvbXBsZXRlZFJlcXVpcmVkXCIgY2xhc3M9XCJmcmVxdWVuY3ktYm90dG9tLWl0ZW0gdngtbXQtNVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ2eC1mcy0xMSB2eC1mdy01MDAgdngtbGFiZWwtdHh0IHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0xXCI+XG4gICAgICB7eyBkdWVEYXRlVGV4dC5leHRlbnNpb24gfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZyZXF1ZW5jeS1ib3R0b20taXRlbS1ib3ggdngtZnMtMTMgdngtcGFyYWdyYXBoLXR4dCB2eC1wLTMgdngtcHQtNCB2eC1wYi00IHZ4LWQtYmxvY2tcIlxuICAgID5cbiAgICAgIFRoZSB7eyBwYWdlVHlwZSB9fSBjYW4gYmUge3sgZHVlRGF0ZVRleHQ/LmtleXMgfX1cbiAgICAgIDxpbnB1dFxuICAgICAgICBjbGFzcz1cImNvdW50TnVtXCJcbiAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgIFtpZF09XCInbm90LWNvbXBsZXRlZC0nICsgaWRcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cIm5vdENvbXBsZXRlZFZhbHVlXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlKCRldmVudCwgJ25vdCBjb21wbGV0ZWQnKVwiXG4gICAgICAgIG9ua2V5ZG93bj1cInJldHVybiBldmVudC5rZXlDb2RlICE9PSAxOTBcIlxuICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSBNYXRoLmFicyh0aGlzLnZhbHVlKVwiXG4gICAgICAvPlxuICAgICAge3sgbm90Q29tcGxldGVkVmFsdWUgPCAyID8gXCJkYXlcIiA6IFwiZGF5c1wiIH19XG4gICAgICA8c3BhbiBjbGFzcz1cInZ4LWZ3LTUwMFwiPmFmdGVyPC9zcGFuPiB0aGUgZHVlIGRhdGUuIFdoZXJlIHRoaXMgb2NjdXJzLCB0aGlzXG4gICAgICB3aWxsIHNob3cgYXMgdGhlIHt7IG1vZGUgPT09IFwicmV2aWV3ZXJGcmVxdWVuY3lcIiA/IFwicG9saWN5XCIgOiB0eXBlIH19IGJlaW5nXG4gICAgICA8c3BhbiBjbGFzcz1cImRlbGF5LXRleHQgdngtZnctNTAwXCJcbiAgICAgICAgPnt7IGR1ZURhdGVUZXh0Py5rZXlzIH19IHdpdGggZGVsYXk8L3NwYW5cbiAgICAgID4uXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJub3RDb21wbGV0ZWRSZXF1aXJlZFwiIGNsYXNzPVwiZnJlcXVlbmN5LWJvdHRvbS1pdGVtIHZ4LW10LTVcIj5cbiAgICA8ZGl2IGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC10dC11cHBlcmNhc2UgdngtbWItMVwiPlxuICAgICAge3sgZHVlRGF0ZVRleHQud2luZG93Q2xvc2VzIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJmcmVxdWVuY3ktYm90dG9tLWl0ZW0tYm94IHZ4LWZzLTEzIHZ4LXBhcmFncmFwaC10eHQgdngtcC0zIHZ4LXB0LTQgdngtcGItNCB2eC1kLWJsb2NrXCJcbiAgICA+XG4gICAgICBUaGUge3sgcGFnZVR5cGUgfX0gY2Fubm90IGJlIHt7IGR1ZURhdGVUZXh0Py5rZXlzIH19XG4gICAgICA8c3BhbiBjbGFzcz1cInZ4LWZ3LTUwMCB2eC1sYWJlbC10eHRcIj57eyBub3RDb21wbGV0ZWRWYWx1ZSB9fTwvc3Bhbj5cbiAgICAgIHt7IG5vdENvbXBsZXRlZFZhbHVlIDwgMiA/IFwiZGF5XCIgOiBcImRheXNcIiB9fVxuICAgICAgPHNwYW4gY2xhc3M9XCJ2eC1mdy01MDBcIj5hZnRlcjwvc3Bhbj4gdGhlIGR1ZSBkYXRlLiBXaGVyZSB0aGlzIG9jY3VycywgdGhpc1xuICAgICAgd2lsbCBzaG93IGFzIHRoZSB7eyB0eXBlIH19IGJlaW5nXG4gICAgICA8c3BhbiBjbGFzcz1cIm5vdGNvbXBsZXRlZC10ZXh0IHZ4LWZ3LTUwMFwiXG4gICAgICAgID5ub3RcbiAgICAgICAge3tcbiAgICAgICAgICBkdWVEYXRlVGV4dD8ua2V5cyA9PT0gXCJyZXZpZXdlZFwiID8gXCJjb21wbGV0ZWRcIiA6IGR1ZURhdGVUZXh0Py5rZXlzXG4gICAgICAgIH19PC9zcGFuXG4gICAgICA+LlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCJpc0RlYWN0aXZhdGVkICYmIG1vZGUgPT09ICdyZXNwb25zaWJpbGl0eSdcIlxuICAgIGNsYXNzPVwiZnJlcXVlbmN5LWJvdHRvbS1pdGVtIHZ4LW10LTVcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cInZ4LWZzLTExIHZ4LWZ3LTUwMCB2eC1sYWJlbC10eHQgdngtdHQtdXBwZXJjYXNlIHZ4LW1iLTFcIj5cbiAgICAgIEFVVE9NQVRJQyBERUFDVElWQVRFOlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZnJlcXVlbmN5LWJvdHRvbS1pdGVtLWJveCB2eC1mcy0xMyB2eC1wYXJhZ3JhcGgtdHh0IHZ4LXAtMyB2eC1wdC00IHZ4LXBiLTQgdngtZC1ibG9ja1wiXG4gICAgPlxuICAgICAgVGhpcyB7eyB0eXBlIH19IHdpbGwgYmUgYXV0b21hdGljYWxseSBkZWFjdGl2YXRlZCwgaWYgaXQgaXMgbm90XG4gICAgICB7eyBkdWVEYXRlVGV4dD8ua2V5cyB9fVxuICAgICAgZm9yXG4gICAgICA8aW5wdXRcbiAgICAgICAgY2xhc3M9XCJjb3VudE51bVwiXG4gICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICBbaWRdPVwiJ2RlYWN0aXZhdGUnICsgaWRcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImRlYWN0aXZhdGVWYWx1ZVwiXG4gICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQsICdkZWFjdGl2YXRlZCcpXCJcbiAgICAgICAgb25rZXlkb3duPVwicmV0dXJuIGV2ZW50LmtleUNvZGUgIT09IDE5MFwiXG4gICAgICAgIG1pbj1cIjBcIlxuICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IE1hdGguYWJzKHRoaXMudmFsdWUpXCJcbiAgICAgIC8+XG4gICAgICBjb25zZWN1dGl2ZSBkdWUgZGF0ZXMuXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gRm9yIFBvbGljeSAtLT5cbjxkaXYgY2xhc3M9XCJmcmVxdWVuY3ktZHVlLWRhdGVcIiAqbmdJZj1cIm1vZGUgPT0gJ3BvbGljeScgJiYgZmFsc2VcIj5cbiAgPGRpdiAqbmdJZj1cImNvbXBsZXRlZFJlcXVpcmVkXCIgY2xhc3M9XCJmcmVxdWVuY3ktZHVlLWRhdGUtcm93XCI+XG4gICAgPHA+VGhlIHBvbGljeSBjYW4gYmUgPGkgY2xhc3M9XCJjb21wbGV0ZWRcIj5hdHRlc3RlZDwvaT48L3A+XG4gICAgPGlucHV0XG4gICAgICBbaWRdPVwiJ2NvbXBsZXRlLScgKyBpZFwiXG4gICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgIFsobmdNb2RlbCldPVwiY29tcGxldGVkVmFsdWVcIlxuICAgICAgKGNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlKCRldmVudCwgJ2NvbXBsZXRlZCcpXCJcbiAgICAgIG9ua2V5ZG93bj1cInJldHVybiBldmVudC5rZXlDb2RlICE9PSAxOTBcIlxuICAgICAgbWluPVwiMFwiXG4gICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IE1hdGguYWJzKHRoaXMudmFsdWUpXCJcbiAgICAvPlxuICAgIDxwPnt7IGNvbXBsZXRlZFZhbHVlIDwgMiA/IFwiZGF5XCIgOiBcImRheXNcIiB9fSBiZWZvcmUgdGhlIGR1ZSBkYXRlLjwvcD5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJub3RDb21wbGV0ZWRSZXF1aXJlZFwiIGNsYXNzPVwiZnJlcXVlbmN5LWR1ZS1kYXRlLXJvd1wiPlxuICAgIDxwPlRoZSBwb2xpY3kgYXR0ZXN0YXRpb24gd2lsbCA8aT5mYWlsPC9pPjwvcD5cbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgW2lkXT1cIidub3QtY29tcGxldGVkLScgKyBpZFwiXG4gICAgICBbKG5nTW9kZWwpXT1cIm5vdENvbXBsZXRlZFZhbHVlXCJcbiAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQsICdub3QgY29tcGxldGVkJylcIlxuICAgICAgb25rZXlkb3duPVwicmV0dXJuIGV2ZW50LmtleUNvZGUgIT09IDE5MFwiXG4gICAgICBtaW49XCIwXCJcbiAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gTWF0aC5hYnModGhpcy52YWx1ZSlcIlxuICAgIC8+XG4gICAgPHA+XG4gICAgICB7eyBub3RDb21wbGV0ZWRWYWx1ZSA8IDIgPyBcImRheVwiIDogXCJkYXlzXCIgfX0gYWZ0ZXIgdGhlIGR1ZSBkYXRlIGlmIGl0IGlzXG4gICAgICBub3QgY29tcGxldGVkLlxuICAgIDwvcD5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmcmVxdWVuY3ktZHVlLWRhdGVcIiAqbmdJZj1cIm1vZGUgPT0gJ3Jldmlld2VyRnJlcXVlbmN5JyAmJiBmYWxzZVwiPlxuICA8ZGl2ICpuZ0lmPVwiY29tcGxldGVkUmVxdWlyZWRcIiBjbGFzcz1cImZyZXF1ZW5jeS1kdWUtZGF0ZS1yb3dcIj5cbiAgICA8cD5UaGUgcG9saWN5IGNhbiBiZSA8aSBjbGFzcz1cImNvbXBsZXRlZFwiPnJldmlld2VkPC9pPjwvcD5cbiAgICA8aW5wdXRcbiAgICAgIFtpZF09XCInY29tcGxldGUtJyArIGlkXCJcbiAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgWyhuZ01vZGVsKV09XCJjb21wbGV0ZWRWYWx1ZVwiXG4gICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2UoJGV2ZW50LCAnY29tcGxldGVkJylcIlxuICAgICAgb25rZXlkb3duPVwicmV0dXJuIGV2ZW50LmtleUNvZGUgIT09IDE5MFwiXG4gICAgICBtaW49XCIwXCJcbiAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gTWF0aC5hYnModGhpcy52YWx1ZSlcIlxuICAgIC8+XG4gICAgPHA+e3sgY29tcGxldGVkVmFsdWUgPCAyID8gXCJkYXlcIiA6IFwiZGF5c1wiIH19IGJlZm9yZSB0aGUgcmV2aWV3IGRhdGUuPC9wPlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIm5vdENvbXBsZXRlZFJlcXVpcmVkXCIgY2xhc3M9XCJmcmVxdWVuY3ktZHVlLWRhdGUtcm93XCI+XG4gICAgPHA+VGhlIHBvbGljeSByZXZpZXcgd2lsbCA8aT5mYWlsPC9pPjwvcD5cbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgW2lkXT1cIidub3QtY29tcGxldGVkLScgKyBpZFwiXG4gICAgICBbKG5nTW9kZWwpXT1cIm5vdENvbXBsZXRlZFZhbHVlXCJcbiAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQsICdub3QgY29tcGxldGVkJylcIlxuICAgICAgb25rZXlkb3duPVwicmV0dXJuIGV2ZW50LmtleUNvZGUgIT09IDE5MFwiXG4gICAgICBtaW49XCIwXCJcbiAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gTWF0aC5hYnModGhpcy52YWx1ZSlcIlxuICAgIC8+XG4gICAgPHA+XG4gICAgICB7eyBub3RDb21wbGV0ZWRWYWx1ZSA8IDIgPyBcImRheVwiIDogXCJkYXlzXCIgfX0gYWZ0ZXIgdGhlIHJldmlldyBkYXRlIGlmIGl0XG4gICAgICBpcyBub3QgY29tcGxldGVkLlxuICAgIDwvcD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlcXVlbmN5LWR1ZS1kYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Z4LXdvcmtmbG93LWVuZ2luZS9zcmMvbGliL3NoYXJlZENvbXBvbmVudHMvZnJlcXVlbmN5L2ZyZXF1ZW5jeS1kdWUtZGF0ZS9mcmVxdWVuY3ktZHVlLWRhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdngtd29ya2Zsb3ctZW5naW5lL3NyYy9saWIvc2hhcmVkQ29tcG9uZW50cy9mcmVxdWVuY3kvZnJlcXVlbmN5LWR1ZS1kYXRlL2ZyZXF1ZW5jeS1kdWUtZGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7OztBQU85QyxNQUFNLE9BQU8seUJBQXlCO0lBQ3BDO1FBQ1MsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUVuQixrQkFBYSxHQUFXLENBQUMsQ0FBQztRQUMxQixrQkFBYSxHQUFXLENBQUMsQ0FBQztRQUMxQixzQkFBaUIsR0FBVyxDQUFDLENBQUM7UUFDOUIsU0FBSSxHQUFXLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFaEIsYUFBUSxHQUFnQyxnQkFBZ0IsQ0FBQztRQUN6RCxzQkFBaUIsR0FBRyxJQUFJLENBQUMsQ0FBQywwQkFBMEI7UUFDcEQseUJBQW9CLEdBQUcsSUFBSSxDQUFDLENBQUMsOEJBQThCO1FBQzNELG1CQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1FBQy9DLHNCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtRQUN0RCxvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUNyQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixPQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1AsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUliLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFwQi9DLENBQUM7SUFzQmhCLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLG1CQUFtQixFQUFFO1lBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1NBQ3RCO2FBQU07WUFDTCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLFlBQVksQ0FBQyxLQUFVO1FBQ3JCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2hDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUVwQiwwQ0FBMEM7UUFDMUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2pDLFVBQVUsR0FBRyxXQUFXLENBQUM7U0FDMUI7YUFBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUM3QyxVQUFVLEdBQUcsZUFBZSxDQUFDO1NBQzlCO2FBQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3pDLFVBQVUsR0FBRyxhQUFhLENBQUM7U0FDNUI7UUFFRCx1Q0FBdUM7UUFDdkMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkQseUJBQXlCO1FBQ3pCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUUzQiwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUU1Qyx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsSUFBSSxFQUFFLFVBQVU7WUFDaEIsS0FBSyxFQUFFLEtBQUs7WUFDWixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDeEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdGQUFnRjtJQUN4RSxpQkFBaUIsQ0FBQyxVQUFlO1FBQ3ZDLElBQUksVUFBVSxLQUFLLEVBQUUsSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDeEUsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUVELDZDQUE2QztRQUM3QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRXpDLGtFQUFrRTtRQUNsRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsMENBQTBDO0lBQ2xDLG1CQUFtQixDQUFDLFVBQWtCLEVBQUUsS0FBYTtRQUMzRCxRQUFRLFVBQVUsRUFBRTtZQUNsQixLQUFLLFdBQVc7Z0JBQ2QsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLE1BQU07WUFDUixLQUFLLGVBQWU7Z0JBQ2xCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7Z0JBQy9CLE1BQU07WUFDUixLQUFLLGFBQWE7Z0JBQ2hCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsOEJBQThCO0lBQzlCLFNBQVMsQ0FBQyxLQUFvQjtRQUM1QixPQUFPLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDO0lBQzNCLENBQUM7K0dBOUZVLHlCQUF5QjttR0FBekIseUJBQXlCLDJaQ1J0QyxzcktBNEZNOzs0RkRwRk8seUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHdCQUF3QjswRUFNekIsSUFBSTtzQkFBWixLQUFLO2dCQU9HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRleHRJbmZvIH0gZnJvbSAnLi9kdWUtZGF0ZS5jb250YW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWZyZXF1ZW5jeS1kdWUtZGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9mcmVxdWVuY3ktZHVlLWRhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mcmVxdWVuY3ktZHVlLWRhdGUuY29tcG9uZW50Lmxlc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRnJlcXVlbmN5RHVlRGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgQElucHV0KCkgbW9kZSA9ICcnO1xuXG4gIGRlZmF1bHRXaW5kb3c6IG51bWJlciA9IDA7XG4gIGRlZmF1bHRGYWlsZWQ6IG51bWJlciA9IDA7XG4gIGRlZmF1bHREZWFjdGl2YXRlOiBudW1iZXIgPSAwO1xuICB0eXBlOiBzdHJpbmcgPSB0aGlzLm1vZGU7XG5cbiAgQElucHV0KCkgcGFnZVR5cGU6ICdyZXNwb25zaWJpbGl0eScgfCAncG9saWN5JyA9ICdyZXNwb25zaWJpbGl0eSc7XG4gIEBJbnB1dCgpIGNvbXBsZXRlZFJlcXVpcmVkID0gdHJ1ZTsgLy8gd2hlbiBjb21wbGV0ZWQgcmVxdWlyZWRcbiAgQElucHV0KCkgbm90Q29tcGxldGVkUmVxdWlyZWQgPSB0cnVlOyAvLyB3aGVuIG5vdCBjb21wbGV0ZWQgcmVxdWlyZWRcbiAgQElucHV0KCkgY29tcGxldGVkVmFsdWUgPSAyOyAvLyB0YWtlIGlucHV0IGZvciBjb21wbGV0ZWRcbiAgQElucHV0KCkgbm90Q29tcGxldGVkVmFsdWUgPSAyOyAvLyB0YWtlIGlucHV0IGZvciBub3QgY29tcGxldGVkXG4gIEBJbnB1dCgpIGRlYWN0aXZhdGVWYWx1ZSA9IDE1O1xuICBASW5wdXQoKSBpc0RlYWN0aXZhdGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlkID0gMDtcbiAgQElucHV0KCkgcGFnZU5hbWUgPSAnJztcblxuICBkdWVEYXRlVGV4dDogYW55O1xuXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kdWVEYXRlVGV4dCA9IHRleHRJbmZvW3RoaXMubW9kZV07XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3Jldmlld2VyRnJlcXVlbmN5Jykge1xuICAgICAgdGhpcy50eXBlID0gJ3Jldmlldyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHlwZSA9IHRoaXMubW9kZTtcbiAgICB9XG4gIH1cblxuICAvLyBVbmlmaWVkIGV2ZW50IGhhbmRsZXIgZm9yIGFsbCBpbnB1dCBldmVudHNcbiAgb25JbnB1dEV2ZW50KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dElkID0gZXZlbnQudGFyZ2V0LmlkO1xuICAgIGxldCBhY3Rpb25UeXBlID0gJyc7XG4gICAgXG4gICAgLy8gRGV0ZXJtaW5lIGFjdGlvbiB0eXBlIGJhc2VkIG9uIGlucHV0IElEXG4gICAgaWYgKGlucHV0SWQuaW5jbHVkZXMoJ2NvbXBsZXRlLScpKSB7XG4gICAgICBhY3Rpb25UeXBlID0gJ2NvbXBsZXRlZCc7XG4gICAgfSBlbHNlIGlmIChpbnB1dElkLmluY2x1ZGVzKCdub3QtY29tcGxldGVkLScpKSB7XG4gICAgICBhY3Rpb25UeXBlID0gJ25vdCBjb21wbGV0ZWQnO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRJZC5pbmNsdWRlcygnZGVhY3RpdmF0ZScpKSB7XG4gICAgICBhY3Rpb25UeXBlID0gJ2RlYWN0aXZhdGVkJztcbiAgICB9XG4gICAgXG4gICAgLy8gUHJvY2VzcyBhbmQgdmFsaWRhdGUgdGhlIGlucHV0IHZhbHVlXG4gICAgbGV0IHZhbHVlID0gdGhpcy5wcm9jZXNzSW5wdXRWYWx1ZShldmVudC50YXJnZXQudmFsdWUpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSB0aGUgaW5wdXQgZmllbGRcbiAgICBldmVudC50YXJnZXQudmFsdWUgPSB2YWx1ZTtcbiAgICBcbiAgICAvLyBVcGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgbW9kZWwgcHJvcGVydHlcbiAgICB0aGlzLnVwZGF0ZU1vZGVsUHJvcGVydHkoYWN0aW9uVHlwZSwgdmFsdWUpO1xuICAgIFxuICAgIC8vIEVtaXQgdGhlIGNoYW5nZSBldmVudFxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh7XG4gICAgICB0eXBlOiBhY3Rpb25UeXBlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgcGFnZU5hbWU6IHRoaXMucGFnZU5hbWUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBQcm9jZXNzIGlucHV0IHZhbHVlOiByZW1vdmUgbGVhZGluZyB6ZXJvcywgZW5zdXJlIHBvc2l0aXZlLCBoYW5kbGUgZWRnZSBjYXNlc1xuICBwcml2YXRlIHByb2Nlc3NJbnB1dFZhbHVlKGlucHV0VmFsdWU6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKGlucHV0VmFsdWUgPT09ICcnIHx8IGlucHV0VmFsdWUgPT09IG51bGwgfHwgaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29udmVydCB0byBudW1iZXIgYW5kIGVuc3VyZSBpdCdzIHBvc2l0aXZlXG4gICAgbGV0IHZhbHVlID0gTWF0aC5hYnMoTnVtYmVyKGlucHV0VmFsdWUpKTtcbiAgICBcbiAgICAvLyBSZW1vdmUgbGVhZGluZyB6ZXJvcyBieSBjb252ZXJ0aW5nIHRvIHN0cmluZyBhbmQgYmFjayB0byBudW1iZXJcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIG1vZGVsIHByb3BlcnR5XG4gIHByaXZhdGUgdXBkYXRlTW9kZWxQcm9wZXJ0eShhY3Rpb25UeXBlOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGFjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgIHRoaXMuY29tcGxldGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub3QgY29tcGxldGVkJzpcbiAgICAgICAgdGhpcy5ub3RDb21wbGV0ZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RlYWN0aXZhdGVkJzpcbiAgICAgICAgdGhpcy5kZWFjdGl2YXRlVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJldmVudCBkZWNpbWFsIHBvaW50IGVudHJ5XG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmVudC5rZXkgIT09ICcuJztcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cIlsncmVzcG9uc2liaWxpdHknLCAncG9saWN5JywgJ3Jldmlld2VyRnJlcXVlbmN5J10uaW5jbHVkZXMobW9kZSlcIiBjbGFzcz1cImZyZXF1ZW5jeS1ib3R0b21cIj5cbiAgPGRpdiAqbmdJZj1cImNvbXBsZXRlZFJlcXVpcmVkXCIgY2xhc3M9XCJmcmVxdWVuY3ktYm90dG9tLWl0ZW0gdngtbXQtNVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ2eC1mcy0xMSB2eC1mdy01MDAgdngtbGFiZWwtdHh0IHZ4LXR0LXVwcGVyY2FzZSB2eC1tYi0xXCI+XG4gICAgICB7eyBkdWVEYXRlVGV4dC53aW5kb3dPcGVuIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZyZXF1ZW5jeS1ib3R0b20taXRlbS1ib3ggdngtZnMtMTMgdngtcGFyYWdyYXBoLXR4dCB2eC1wLTMgdngtcHQtNCB2eC1wYi00IHZ4LWQtYmxvY2tcIj5cbiAgICAgIFRoZSB7eyBwYWdlVHlwZSB9fSBjYW4gYmUge3sgZHVlRGF0ZVRleHQ/LmtleXMgfX0gb24gdGhlIGR1ZSBkYXRlIGFuZFxuICAgICAgPGlucHV0IGNsYXNzPVwiY291bnROdW1cIiBbaWRdPVwiJ2NvbXBsZXRlLScgKyBpZFwiIHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cImNvbXBsZXRlZFZhbHVlXCJcbiAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRFdmVudCgkZXZlbnQpXCIgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIiBtaW49XCIwXCIgLz5cbiAgICAgIHt7IGNvbXBsZXRlZFZhbHVlIDwgMiA/IFwiZGF5XCIgOiBcImRheXNcIiB9fSA8c3BhbiBjbGFzcz1cInZ4LWZ3LTUwMFwiPmJlZm9yZTwvc3Bhbj4gdGhlIGR1ZSBkYXRlLiBXaGVyZSB0aGlzIG9jY3VycyxcbiAgICAgICAgdGhpcyB3aWxsIHNob3cgYXMgdGhlIHt7IG1vZGUgPT09IFwicmV2aWV3ZXJGcmVxdWVuY3lcIiA/IFwicG9saWN5XCIgOiB0eXBlIH19IGJlaW5nXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGxldGVkLXRleHQgdngtZnctNTAwXCI+e3sgZHVlRGF0ZVRleHQ/LmtleXMgfX0gb24gdGltZTwvc3Bhbj4uXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJub3RDb21wbGV0ZWRSZXF1aXJlZFwiIGNsYXNzPVwiZnJlcXVlbmN5LWJvdHRvbS1pdGVtIHZ4LW10LTVcIj5cbiAgICA8ZGl2IGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC10dC11cHBlcmNhc2UgdngtbWItMVwiPlxuICAgICAge3sgZHVlRGF0ZVRleHQuZXh0ZW5zaW9uIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZyZXF1ZW5jeS1ib3R0b20taXRlbS1ib3ggdngtZnMtMTMgdngtcGFyYWdyYXBoLXR4dCB2eC1wLTMgdngtcHQtNCB2eC1wYi00IHZ4LWQtYmxvY2tcIj5cbiAgICAgIFRoZSB7eyBwYWdlVHlwZSB9fSBjYW4gYmUge3sgZHVlRGF0ZVRleHQ/LmtleXMgfX1cbiAgICAgIDxpbnB1dCBjbGFzcz1cImNvdW50TnVtXCIgdHlwZT1cIm51bWJlclwiIFtpZF09XCInbm90LWNvbXBsZXRlZC0nICsgaWRcIiBbKG5nTW9kZWwpXT1cIm5vdENvbXBsZXRlZFZhbHVlXCJcbiAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRFdmVudCgkZXZlbnQpXCIgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIiBtaW49XCIwXCIgLz5cbiAgICAgIHt7IG5vdENvbXBsZXRlZFZhbHVlIDwgMiA/IFwiZGF5XCIgOiBcImRheXNcIiB9fSA8c3BhbiBjbGFzcz1cInZ4LWZ3LTUwMFwiPmFmdGVyPC9zcGFuPiB0aGUgZHVlIGRhdGUuIFdoZXJlIHRoaXMgb2NjdXJzLFxuICAgICAgICB0aGlzXG4gICAgICAgIHdpbGwgc2hvdyBhcyB0aGUge3sgbW9kZSA9PT0gXCJyZXZpZXdlckZyZXF1ZW5jeVwiID8gXCJwb2xpY3lcIiA6IHR5cGUgfX0gYmVpbmdcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxheS10ZXh0IHZ4LWZ3LTUwMFwiPnt7IGR1ZURhdGVUZXh0Py5rZXlzIH19IHdpdGggZGVsYXk8L3NwYW4+LlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwibm90Q29tcGxldGVkUmVxdWlyZWRcIiBjbGFzcz1cImZyZXF1ZW5jeS1ib3R0b20taXRlbSB2eC1tdC01XCI+XG4gICAgPGRpdiBjbGFzcz1cInZ4LWZzLTExIHZ4LWZ3LTUwMCB2eC1sYWJlbC10eHQgdngtdHQtdXBwZXJjYXNlIHZ4LW1iLTFcIj5cbiAgICAgIHt7IGR1ZURhdGVUZXh0LndpbmRvd0Nsb3NlcyB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmcmVxdWVuY3ktYm90dG9tLWl0ZW0tYm94IHZ4LWZzLTEzIHZ4LXBhcmFncmFwaC10eHQgdngtcC0zIHZ4LXB0LTQgdngtcGItNCB2eC1kLWJsb2NrXCI+XG4gICAgICBUaGUge3sgcGFnZVR5cGUgfX0gY2Fubm90IGJlIHt7IGR1ZURhdGVUZXh0Py5rZXlzIH19XG4gICAgICA8c3BhbiBjbGFzcz1cInZ4LWZ3LTUwMCB2eC1sYWJlbC10eHRcIj57eyBub3RDb21wbGV0ZWRWYWx1ZSB9fTwvc3Bhbj5cbiAgICAgIHt7IG5vdENvbXBsZXRlZFZhbHVlIDwgMiA/IFwiZGF5XCIgOiBcImRheXNcIiB9fSA8c3BhbiBjbGFzcz1cInZ4LWZ3LTUwMFwiPmFmdGVyPC9zcGFuPiB0aGUgZHVlIGRhdGUuIFdoZXJlIHRoaXMgb2NjdXJzLFxuICAgICAgICB0aGlzXG4gICAgICAgIHdpbGwgc2hvdyBhcyB0aGUge3sgdHlwZSB9fSBiZWluZ1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5vdGNvbXBsZXRlZC10ZXh0IHZ4LWZ3LTUwMFwiPm5vdFxuICAgICAgICAgIHt7XG4gICAgICAgICAgZHVlRGF0ZVRleHQ/LmtleXMgPT09IFwicmV2aWV3ZWRcIiA/IFwiY29tcGxldGVkXCIgOiBkdWVEYXRlVGV4dD8ua2V5c1xuICAgICAgICAgIH19PC9zcGFuPi5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImlzRGVhY3RpdmF0ZWQgJiYgbW9kZSA9PT0gJ3Jlc3BvbnNpYmlsaXR5J1wiIGNsYXNzPVwiZnJlcXVlbmN5LWJvdHRvbS1pdGVtIHZ4LW10LTVcIj5cbiAgICA8ZGl2IGNsYXNzPVwidngtZnMtMTEgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC10dC11cHBlcmNhc2UgdngtbWItMVwiPlxuICAgICAgQVVUT01BVElDIERFQUNUSVZBVEU6XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZyZXF1ZW5jeS1ib3R0b20taXRlbS1ib3ggdngtZnMtMTMgdngtcGFyYWdyYXBoLXR4dCB2eC1wLTMgdngtcHQtNCB2eC1wYi00IHZ4LWQtYmxvY2tcIj5cbiAgICAgIFRoaXMge3sgdHlwZSB9fSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGVhY3RpdmF0ZWQsIGlmIGl0IGlzIG5vdFxuICAgICAge3sgZHVlRGF0ZVRleHQ/LmtleXMgfX1cbiAgICAgIGZvclxuICAgICAgPGlucHV0IGNsYXNzPVwiY291bnROdW1cIiB0eXBlPVwibnVtYmVyXCIgW2lkXT1cIidkZWFjdGl2YXRlJyArIGlkXCIgWyhuZ01vZGVsKV09XCJkZWFjdGl2YXRlVmFsdWVcIlxuICAgICAgICAoaW5wdXQpPVwib25JbnB1dEV2ZW50KCRldmVudClcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIG1pbj1cIjBcIiAvPlxuICAgICAgY29uc2VjdXRpdmUgZHVlIGRhdGVzLlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIEZvciBQb2xpY3kgLS0+XG48ZGl2IGNsYXNzPVwiZnJlcXVlbmN5LWR1ZS1kYXRlXCIgKm5nSWY9XCJtb2RlID09ICdwb2xpY3knICYmIGZhbHNlXCI+XG4gIDxkaXYgKm5nSWY9XCJjb21wbGV0ZWRSZXF1aXJlZFwiIGNsYXNzPVwiZnJlcXVlbmN5LWR1ZS1kYXRlLXJvd1wiPlxuICAgIDxwPlRoZSBwb2xpY3kgY2FuIGJlIDxpIGNsYXNzPVwiY29tcGxldGVkXCI+YXR0ZXN0ZWQ8L2k+PC9wPlxuICAgIDxpbnB1dCBbaWRdPVwiJ2NvbXBsZXRlLScgKyBpZFwiIHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cImNvbXBsZXRlZFZhbHVlXCIgKGlucHV0KT1cIm9uSW5wdXRFdmVudCgkZXZlbnQpXCJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCIgbWluPVwiMFwiIC8+XG4gICAgPHA+e3sgY29tcGxldGVkVmFsdWUgPCAyID8gXCJkYXlcIiA6IFwiZGF5c1wiIH19IGJlZm9yZSB0aGUgZHVlIGRhdGUuPC9wPlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIm5vdENvbXBsZXRlZFJlcXVpcmVkXCIgY2xhc3M9XCJmcmVxdWVuY3ktZHVlLWRhdGUtcm93XCI+XG4gICAgPHA+VGhlIHBvbGljeSBhdHRlc3RhdGlvbiB3aWxsIDxpPmZhaWw8L2k+PC9wPlxuICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW2lkXT1cIidub3QtY29tcGxldGVkLScgKyBpZFwiIFsobmdNb2RlbCldPVwibm90Q29tcGxldGVkVmFsdWVcIiAoaW5wdXQpPVwib25JbnB1dEV2ZW50KCRldmVudClcIlxuICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIiBtaW49XCIwXCIgLz5cbiAgICA8cD5cbiAgICAgIHt7IG5vdENvbXBsZXRlZFZhbHVlIDwgMiA/IFwiZGF5XCIgOiBcImRheXNcIiB9fSBhZnRlciB0aGUgZHVlIGRhdGUgaWYgaXQgaXMgbm90IGNvbXBsZXRlZC4gPC9wPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZyZXF1ZW5jeS1kdWUtZGF0ZVwiICpuZ0lmPVwibW9kZSA9PSAncmV2aWV3ZXJGcmVxdWVuY3knICYmIGZhbHNlXCI+XG4gIDxkaXYgKm5nSWY9XCJjb21wbGV0ZWRSZXF1aXJlZFwiIGNsYXNzPVwiZnJlcXVlbmN5LWR1ZS1kYXRlLXJvd1wiPlxuICAgIDxwPlRoZSBwb2xpY3kgY2FuIGJlIDxpIGNsYXNzPVwiY29tcGxldGVkXCI+cmV2aWV3ZWQ8L2k+PC9wPlxuICAgIDxpbnB1dCBbaWRdPVwiJ2NvbXBsZXRlLScgKyBpZFwiIHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cImNvbXBsZXRlZFZhbHVlXCIgKGlucHV0KT1cIm9uSW5wdXRFdmVudCgkZXZlbnQpXCJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCIgbWluPVwiMFwiIC8+XG4gICAgPHA+e3sgY29tcGxldGVkVmFsdWUgPCAyID8gXCJkYXlcIiA6IFwiZGF5c1wiIH19IGJlZm9yZSB0aGUgcmV2aWV3IGRhdGUuPC9wPlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIm5vdENvbXBsZXRlZFJlcXVpcmVkXCIgY2xhc3M9XCJmcmVxdWVuY3ktZHVlLWRhdGUtcm93XCI+XG4gICAgPHA+VGhlIHBvbGljeSByZXZpZXcgd2lsbCA8aT5mYWlsPC9pPjwvcD5cbiAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIFtpZF09XCInbm90LWNvbXBsZXRlZC0nICsgaWRcIiBbKG5nTW9kZWwpXT1cIm5vdENvbXBsZXRlZFZhbHVlXCIgKGlucHV0KT1cIm9uSW5wdXRFdmVudCgkZXZlbnQpXCJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCIgbWluPVwiMFwiIC8+XG4gICAgPHA+XG4gICAgICB7eyBub3RDb21wbGV0ZWRWYWx1ZSA8IDIgPyBcImRheVwiIDogXCJkYXlzXCIgfX0gYWZ0ZXIgdGhlIHJldmlldyBkYXRlIGlmIGl0IGlzIG5vdCBjb21wbGV0ZWQuIDwvcD5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=