@energycap/components 0.39.16-ECAP-23123-Help-Popover-On-Controls.20240513-1533 → 0.39.16-ECAP-23123-Help-Popover-On-Controls.20240514-1134

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.
@@ -234,10 +234,10 @@ export class FormGroupComponent {
234
234
  }
235
235
  }
236
236
  FormGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FormGroupComponent, deps: [{ token: i1.ValidationMessageService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
237
- FormGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FormGroupComponent, selector: "ec-form-group", inputs: { id: "id", label: "label", formGroup: "formGroup", labelPosition: "labelPosition", overrideValidationError: "overrideValidationError", hideValidationMessage: "hideValidationMessage", helpPopover: "helpPopover", helpPopoverPosition: "helpPopoverPosition" }, host: { properties: { "attr.id": "this.attrId" } }, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.ec-untouched]=\"formGroup?.untouched\">\r\n <ng-container *ngIf=\"label && !helpPopover\">\r\n <ng-container *ngTemplateOutlet=\"sharedLabel\"></ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"label && helpPopover\"\r\n class=\"d-flex align-items-center\">\r\n <ng-container *ngTemplateOutlet=\"sharedLabel\"></ng-container>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n class=\"my-n2 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </div>\r\n\r\n <ng-template #sharedLabel>\r\n <label ngPreserveWhitespaces>\r\n <span *ngIf=\"label\" id=\"{{id}}_label\">{{label | translate}}</span>\r\n <span\r\n *ngIf=\"!hideValidationMessage && validationErrors && formGroup?.touched && formGroup?.invalid\">{{validationErrors\r\n | translate}}</span>\r\n </label>\r\n </ng-template>\r\n\r\n <ng-content></ng-content>\r\n</div>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.control.ec-untouched ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control.ec-untouched ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control.ec-untouched ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control.ec-untouched ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control-label-left{display:flex}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
237
+ FormGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FormGroupComponent, selector: "ec-form-group", inputs: { id: "id", label: "label", formGroup: "formGroup", labelPosition: "labelPosition", overrideValidationError: "overrideValidationError", hideValidationMessage: "hideValidationMessage", helpPopover: "helpPopover", helpPopoverPosition: "helpPopoverPosition" }, host: { properties: { "attr.id": "this.attrId" } }, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.ec-untouched]=\"formGroup?.untouched\">\r\n\r\n <label *ngIf=\"label\">\r\n <span id=\"{{id}}_label\">{{label | translate}}</span>\r\n <span *ngIf=\"!hideValidationMessage && validationErrors && formGroup?.touched && formGroup?.invalid\">&nbsp;{{validationErrors | translate}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n2 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\r\n <ng-content></ng-content>\r\n</div>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.control.ec-untouched ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control.ec-untouched ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control.ec-untouched ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control.ec-untouched ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control-label-left{display:flex}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
238
238
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FormGroupComponent, decorators: [{
239
239
  type: Component,
240
- args: [{ selector: 'ec-form-group', template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.ec-untouched]=\"formGroup?.untouched\">\r\n <ng-container *ngIf=\"label && !helpPopover\">\r\n <ng-container *ngTemplateOutlet=\"sharedLabel\"></ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"label && helpPopover\"\r\n class=\"d-flex align-items-center\">\r\n <ng-container *ngTemplateOutlet=\"sharedLabel\"></ng-container>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n class=\"my-n2 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </div>\r\n\r\n <ng-template #sharedLabel>\r\n <label ngPreserveWhitespaces>\r\n <span *ngIf=\"label\" id=\"{{id}}_label\">{{label | translate}}</span>\r\n <span\r\n *ngIf=\"!hideValidationMessage && validationErrors && formGroup?.touched && formGroup?.invalid\">{{validationErrors\r\n | translate}}</span>\r\n </label>\r\n </ng-template>\r\n\r\n <ng-content></ng-content>\r\n</div>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.control.ec-untouched ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control.ec-untouched ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control.ec-untouched ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control.ec-untouched ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control-label-left{display:flex}\n"] }]
240
+ args: [{ selector: 'ec-form-group', template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.ec-untouched]=\"formGroup?.untouched\">\r\n\r\n <label *ngIf=\"label\">\r\n <span id=\"{{id}}_label\">{{label | translate}}</span>\r\n <span *ngIf=\"!hideValidationMessage && validationErrors && formGroup?.touched && formGroup?.invalid\">&nbsp;{{validationErrors | translate}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n2 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\r\n <ng-content></ng-content>\r\n</div>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.control.ec-untouched ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control.ec-untouched ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control.ec-untouched ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control.ec-untouched ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control-label-left{display:flex}\n"] }]
241
241
  }], ctorParameters: function () { return [{ type: i1.ValidationMessageService }, { type: i2.TranslateService }]; }, propDecorators: { id: [{
242
242
  type: Input
243
243
  }], attrId: [{
@@ -258,4 +258,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
258
258
  }], helpPopoverPosition: [{
259
259
  type: Input
260
260
  }] } });
261
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvZm9ybS1ncm91cC9mb3JtLWdyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9mb3JtLWdyb3VwL2Zvcm0tZ3JvdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBbUIsa0JBQWtCLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0gsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNuQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBTTNDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLENBQUMsRUFBdUMsRUFBRSxnQkFBK0IsT0FBTyxFQUFFLFdBQW9CLEVBQVEsRUFBRTtJQUM5SixJQUFJLGlCQUFpQixHQUE0QixFQUFFLENBQUM7SUFFcEQsbUVBQW1FO0lBQ25FLHNDQUFzQztJQUN0QyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDbEQsSUFBSSxZQUFZLEdBQVEsZUFBZSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFN0UsSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSyxFQUFFLEVBQUU7WUFDaEQsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFR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QkFDNUUsSUFBSSxRQUFRLEVBQUU7b0JBQ1osSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzdDO2FBQ0Y7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztTQUM1QjtJQUNILENBQUM7OytHQXpKVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixtWENySS9CLHNrQ0EwQk07MkZEMkdPLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxlQUFlOzhJQVNULEVBQUU7c0JBQWpCLEtBQUs7Z0JBS3lCLE1BQU07c0JBQXBDLFdBQVc7dUJBQUMsU0FBUztnQkFLTixLQUFLO3NCQUFwQixLQUFLO2dCQVNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBS1UsYUFBYTtzQkFBNUIsS0FBSztnQkFNVSx1QkFBdUI7c0JBQXRDLEtBQUs7Z0JBSVUscUJBQXFCO3NCQUFwQyxLQUFLO2dCQUtVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBS1csbUJBQW1CO3NCQUFsQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBIb3N0QmluZGluZyB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAsIFVudHlwZWRGb3JtQXJyYXksIEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvdmFsaWRhdGlvbi1tZXNzYWdlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ29udHJvbExhYmVsUG9zaXRpb24gfSBmcm9tIFwiLi4vZm9ybS1jb250cm9sLWJhc2VcIjtcclxuaW1wb3J0IHsgUG9wb3ZlckNvbnRlbnRQb3NpdGlvbiB9IGZyb20gXCIuLi9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50XCI7XHJcblxyXG5cclxuLyoqIEZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBmb3JtIGNvbnRyb2xzIGFuZFxyXG4gKiAgZW5zdXJlIHRoZXkgY29udGFpbiB1bmlxdWUgdmFsdWVzLiAgSWYgYW55IGFyZSBkdXBsaWNhdGVkIGFsbCBvZmZlbmRpbmdcclxuICogIGZvcm0gY29udHJvbHMgd2lsbCBiZSBtYXJrZWQgYXMgaW52YWxpZFxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWVQcm9wZXJ0eSAtIHRoZSBzdWItcHJvcGVydHkgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBieSBlYWNoIGZvcm0gY29udHJvbFxyXG4gKiAgICAgICAgaXQgaXMgZGVyZWZlcmVuY2VkIGFzIGZvcm1Hcm91cC5jb250cm9sLnZhbHVlW3ZhbHVlUHJvcGVydHldLlxyXG4gKiAgICAgICAgZGVmYXVsdHMgdG8gXCJ2YWx1ZVwiLCB3aGljaCBtYXRjaGVzIHRoZSBmb3JtIGNvbnRyb2xzIHVzZWQgdG8gYmFjayBjb21ib2JveGVzXHJcbiAqICAgICAgICBpZiBleHBsaWNpdGx5IG51bGwsIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB2YWx1ZSBpcyBub3QgYSBjb21wbGV4IG9iamVjdCBhbmQganVzdCBleHRyYWN0c1xyXG4gKiAgICAgICAgZm9ybUdyb3VwLmNvbnRyb2wudmFsdWVcclxuICovXHJcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUZvcm1Hcm91cFZhbHVlc0FyZVVuaXF1ZSA9IChmZzogVW50eXBlZEZvcm1Hcm91cCB8IFVudHlwZWRGb3JtQXJyYXksIHZhbHVlUHJvcGVydHk6IHN0cmluZyB8IG51bGwgPSBcInZhbHVlXCIsIHN1YlByb3BlcnR5Pzogc3RyaW5nKTogdm9pZCA9PiB7XHJcbiAgbGV0IGZvcm1Db250cm9sVmFsdWVzOiB7W2tleTogc3RyaW5nXTogbnVtYmVyfSA9IHt9O1xyXG5cclxuICAvLyBGaXJzdCBnZXQgYWxsIG9mIHRoZSB2YWx1ZXMgYW5kIGlmIHRoZXkgaGF2ZSBiZWVuIGZvdW5kIGFscmVhZHksXHJcbiAgLy8gaW5jcmVtZW50IHRoZSBudW1iZXIgb2YgdGltZXMgZm91bmRcclxuICBmb3JFYWNoRm9ybUNvbnRyb2woZmcsIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgIGxldCBjb250cm9sVmFsdWU6IGFueSA9IGdldENvbnRyb2xWYWx1ZShjb250cm9sLCB2YWx1ZVByb3BlcnR5LCBzdWJQcm9wZXJ0eSk7XHJcblxyXG4gICAgaWYgKGNvbnRyb2xWYWx1ZSAhPT0gbnVsbCAmJiBjb250cm9sVmFsdWUgIT09ICcnKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgY29udHJvbFZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2xWYWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmb3JtQ29udHJvbFZhbHVlcy5oYXNPd25Qcm9wZXJ0eShjb250cm9sVmFsdWUpKSB7XHJcbiAgICAgICAgZm9ybUNvbnRyb2xWYWx1ZXNbY29udHJvbFZhbHVlXSA9IGZvcm1Db250cm9sVmFsdWVzW2NvbnRyb2xWYWx1ZV0gKyAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvcm1Db250cm9sVmFsdWVzW2NvbnRyb2xWYWx1ZV0gPSAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIC8vIE5vdyBnbyBiYWNrIG92ZXIgdGhlIGNvbnRyb2xzIGFuZCBpZiB0aGVpciB2YWx1ZSB3YXMgZm91bmQgbW9yZSB0aGFuIG9uY2UgZmxhZyB0aGVtIGFzIGludmFsaWRcclxuICBmb3JFYWNoRm9ybUNvbnRyb2woZmcsIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgIGxldCBjb250cm9sVmFsdWU6IGFueSA9IGdldENvbnRyb2xWYWx1ZShjb250cm9sLCB2YWx1ZVByb3BlcnR5LCBzdWJQcm9wZXJ0eSk7XHJcblxyXG4gICAgLy8gSWYgdGhlIGNvbnRyb2wgdmFsdWUgaXMgbnVsbCB3ZSB3aWxsIGxldCBhbnkgcmVxdWlyZWQgdmFsaWRhdG9ycyBoYW5kbGUgdGhlbVxyXG4gICAgaWYgKGNvbnRyb2xWYWx1ZSAhPT0gbnVsbCAmJiBjb250cm9sVmFsdWUgIT09ICcnKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgY29udHJvbFZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2xWYWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmb3JtQ29udHJvbFZhbHVlc1tjb250cm9sVmFsdWVdID4gMSkge1xyXG4gICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5hc3NpZ24oeyBub3RVbmlxdWU6IHRydWUgfSwgY29udHJvbC5lcnJvcnMpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBHZXQgYSBjb3B5IG9mIHRoZSBleGlzdGluZyBmb3JtIGNvbnRyb2wgZXJyb3JzLCBpZiBhbnlcclxuICAgICAgICBsZXQgZXJyb3JzID0gY2xvbmVEZWVwKGNvbnRyb2wuZXJyb3JzKTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGVycm9ycyBhbmQgcHJldmlvdXNseSBoYWQgdGhlIG5vdFVuaXF1ZSBlcnJvciB3ZSB3YW50IHRvIHJlbW92ZVxyXG4gICAgICAgIC8vIHRoYXQgcHJvcGVydHlcclxuICAgICAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5oYXNPd25Qcm9wZXJ0eShcIm5vdFVuaXF1ZVwiKSkge1xyXG4gICAgICAgICAgZGVsZXRlIGVycm9ycy5ub3RVbmlxdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGF0IHdhcyB0aGUgb25seSBlcnJvciBpbiB0aGUgb2JqZWN0LCBzZXQgdG8gbnVsbCBzbyB2YWxpZGF0aW9uIHBhc3Nlc1xyXG4gICAgICAgIGlmIChlcnJvcnMgJiYgT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIGVycm9ycyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250cm9sLnNldEVycm9ycyhlcnJvcnMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcbn07XHJcblxyXG4vKipcclxuICogRnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGZvciBjb250cm9scyBhbmQgaW52b2tlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZXkgYXJlIGZvdW5kLlxyXG4gKiBSZWN1cnNpdmVseSBjYWxscyBpdHNlbGYgd2hlbiBpdCBlbmNvdW50ZXJzIHN1YiBmb3JtIGdyb3VwcyBhbmQgaXRlcmF0ZXMgb3ZlciBmb3JtIGFycmF5cy5cclxuICogQHBhcmFtIGNcclxuICogQHBhcmFtIGNhbGxiYWNrXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZm9yRWFjaEZvcm1Db250cm9sID0gKGM6IEFic3RyYWN0Q29udHJvbCwgY2FsbGJhY2s6IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHZvaWQpOiB2b2lkID0+IHtcclxuICBsZXQgY29udHJvbHM6IEFic3RyYWN0Q29udHJvbFtdID0gW107XHJcblxyXG4gIC8vIE5vcm1hbGl6ZSB0byBhbiBhcnJheSBmb3IgZWFzZSBvZiBwcm9jZXNzaW5nXHJcbiAgaWYgKGMgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcclxuICAgIGNvbnRyb2xzLnB1c2goYyk7XHJcbiAgfSBlbHNlIGlmIChjIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xyXG4gICAgZm9yICh2YXIga2V5IGluIGMuY29udHJvbHMpIHtcclxuICAgICAgY29udHJvbHMucHVzaChjLmNvbnRyb2xzW2tleV0pO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoYyBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQXJyYXkpIHtcclxuICAgIGNvbnRyb2xzID0gYy5jb250cm9scztcclxuICB9XHJcblxyXG4gIGNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XHJcbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQXJyYXkpIHtcclxuICAgICAgY29udHJvbC5jb250cm9scy5mb3JFYWNoKGN0cmwgPT4ge1xyXG4gICAgICAgIGlmIChjdHJsIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCB8fCBjdHJsIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgZm9yRWFjaEZvcm1Db250cm9sKGN0cmwsIGNhbGxiYWNrKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY2FsbGJhY2soY3RybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtR3JvdXApIHtcclxuICAgICAgZm9yRWFjaEZvcm1Db250cm9sKGNvbnRyb2wsY2FsbGJhY2spO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2FsbGJhY2soY29udHJvbCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn07XHJcblxyXG4vKipcclxuICogRnVuY3Rpb24gdG8gcmV0dXJuIHRoZSB2YWx1ZSBpZiBpdCBpcyBlbmFibGVkIGFuZCBzZXRcclxuICogQHBhcmFtIGNvbnRyb2xcclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXRDb250cm9sVmFsdWUgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCB2YWx1ZVByb3BlcnR5OiBzdHJpbmcgfCBudWxsID0gXCJ2YWx1ZVwiLCBzdWJQcm9wZXJ0eT86IHN0cmluZyk6IGFueSB8IG51bGwgPT4ge1xyXG4gIGlmIChjb250cm9sLmVuYWJsZWQgJiYgKGNvbnRyb2wudmFsdWUgIT09IG51bGwgJiYgY29udHJvbC52YWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xyXG4gICAgaWYgKHZhbHVlUHJvcGVydHkgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIGNvbnRyb2wudmFsdWU7XHJcbiAgICB9IGVsc2UgaWYgKHN1YlByb3BlcnR5KSB7XHJcbiAgICAgIHJldHVybiBjb250cm9sLnZhbHVlW3ZhbHVlUHJvcGVydHldW3N1YlByb3BlcnR5XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBjb250cm9sLnZhbHVlW3ZhbHVlUHJvcGVydHldO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZWMtZm9ybS1ncm91cCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Zvcm0tZ3JvdXAuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUdyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgLyoqXHJcbiAgICogSWRcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgaWQ/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEJpbmQgaWQgdG8gaG9zdCBlbGVtZW50XHJcbiAgICovXHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJykgcHVibGljIGF0dHJJZD86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGZvcm0gY29udHJvbCBsYWJlbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBsYWJlbDogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFVJLW9yaWVudGVkIGZvcm0gbW9kZWwgdGhhdCByZXRhaW5zIHRoZSBzdGF0ZXMgYW5kIHZhbHVlcyBvZiB0aGUgSFRNTCBjb250cm9scyBvbiBzY3JlZW4uXHJcbiAgICogQ2FuIGJlIGEge0BsaW5rIEZvcm1Db250cm9sfSBvciBhIHtAbGluayBGb3JtR3JvdXB9XHJcbiAgICpcclxuICAgKiBAdHlwZSB7Rm9ybUdyb3VwfVxyXG4gICAqIEBtZW1iZXJvZiBGb3JtQ29udHJvbEJhc2VcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZm9ybUdyb3VwPzogVW50eXBlZEZvcm1Hcm91cDtcclxuXHJcbiAgLyoqXHJcbiAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGZvcm0gY29udHJvbCBsYWJlbCAodG9wfGJvdHRvbXxsZWZ0KVxyXG4gICAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGxhYmVsUG9zaXRpb24/OiBDb250cm9sTGFiZWxQb3NpdGlvbiA9IFwidG9wXCI7XHJcblxyXG5cclxuICAvKipBbiBvcHRpb25hbCBzdHJpbmcgdG8gc2hvdyBpZiBhbnkgb2YgdGhlIHVuZGVybHlpbmcgY29udHJvbHMgaGFzIGFuIGVycm9yLiBJZiBmYWxzeSwgb25lIG9mIHRoZVxyXG4gICAqIGVycm9ycyBmcm9tIHRoZSB1bmRlcmx5aW5nIGNvbnRyb2xzIHdpbGwgYmUgdXNlZC5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgb3ZlcnJpZGVWYWxpZGF0aW9uRXJyb3I/OiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAvKipBbiBvcHRpb25hbCBmbGFnIHRvIGhpZGUgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGhpZGVWYWxpZGF0aW9uTWVzc2FnZT86Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBDb25kaXRpb25hbGx5IHNob3cgYSBoZWxwIHBvcG92ZXIgbmV4dCB0byB0aGUgY29udHJvbHMgbGFiZWwuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGhlbHBQb3BvdmVyPzogc3RyaW5nO1xyXG5cclxuICAgLyoqXHJcbiAgICogV2hlbiBhIGhlbHAgcG9wb3ZlciBpcyBwcmVzZW50LCBhbGxvd3MgdGhlIHBvcG92ZXIgdG8gYmUgcG9zaXRpb25lZCBpbiBkaWZmZXJlbnQgbG9jYXRpb25zLlxyXG4gICAqL1xyXG4gICBASW5wdXQoKSBwdWJsaWMgaGVscFBvcG92ZXJQb3NpdGlvbj86IFBvcG92ZXJDb250ZW50UG9zaXRpb24gPSAndG9wLWxlZnQnO1xyXG4gICBcclxuICAvKipcclxuICAgKiBBbGwgY3VycmVudCB2YWxpZGF0aW9uIGVycm9yc1xyXG4gICAqXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKiBAbWVtYmVyb2YgRm9ybUNvbnRyb2xCYXNlXHJcbiAgICovXHJcbiAgcHVibGljIHZhbGlkYXRpb25FcnJvcnM6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIHB1YmxpYyBhbGxDb250cm9sc1RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBjb21wb25lbnREZXN0cm95ZWQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlOiBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBzdWJzY3JpYmUgdG8gc3RhdHVzQ2hhbmdlcyBPYnNlcnZhYmxlIHRvIHRha2UgYW55IGVycm9ycyBhbmQgdHJhbnNsYXRlIHRoZW1cclxuICAgIGlmICh0aGlzLmZvcm1Hcm91cCkge1xyXG4gICAgICB0aGlzLmZvcm1Hcm91cC5zdGF0dXNDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlVmFsaWRhdGlvbk1lc3NhZ2VzKHRoaXMuZ2V0RXJyb3JzKHRoaXMuZm9ybUdyb3VwISkpXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyAocmUpc2V0IHZhbGlkYXRpb24gbWVzc2FnZXNcclxuICAgICAgdGhpcy50cmFuc2xhdGVWYWxpZGF0aW9uTWVzc2FnZXModGhpcy5nZXRFcnJvcnModGhpcy5mb3JtR3JvdXApKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pZCkge1xyXG4gICAgICB0aGlzLmF0dHJJZCA9IHRoaXMuaWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBbmd1bGFyIG9uRGVzdHJveSBsaWZlY3lsZSBob29rLlxyXG4gICAqIFVuc3Vic2NyaWJlIGZyb20gYW55IG9ic2VydmFibGVzXHJcbiAgICpcclxuICAgKiBAc2VlIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9saWZlY3ljbGUtaG9va3NcclxuICAgKiBAbWVtYmVyb2YgRm9ybUNvbnRyb2xCYXNlXHJcbiAgICovXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb21wb25lbnREZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgdGhpcy5jb21wb25lbnREZXN0cm95ZWQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RXJyb3JzKGZvcm1Hcm91cDogVW50eXBlZEZvcm1Hcm91cCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcclxuICAgIGZvcm1Hcm91cC5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHJcbiAgICBsZXQgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZXQgYWxsVG91Y2hlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgY29udHJvbEZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZm9yRWFjaEZvcm1Db250cm9sKGZvcm1Hcm91cCwgKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICBlcnJvcnMgPSB0aGlzLmFzc2lnbkVycm9ycyhjb250cm9sLCBlcnJvcnMpO1xyXG4gICAgICBpZiAoY29udHJvbC51bnRvdWNoZWQpIHtcclxuICAgICAgICBhbGxUb3VjaGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgY29udHJvbEZvdW5kID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChmb3JtR3JvdXAuZXJyb3JzKSB7XHJcbiAgICAgIGVycm9ycyA9IE9iamVjdC5hc3NpZ24oZXJyb3JzIHx8IHt9LCBmb3JtR3JvdXAuZXJyb3JzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWxsVG91Y2hlZCAmJiBjb250cm9sRm91bmQpIHtcclxuICAgICAgZm9ybUdyb3VwLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZXJyb3JzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3NpZ25FcnJvcnMoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xyXG4gICAgaWYgKGNvbnRyb2wuZXJyb3JzKSB7XHJcbiAgICAgIGVycm9ycyA9IE9iamVjdC5hc3NpZ24oZXJyb3JzIHx8IHt9LCBjb250cm9sLmVycm9ycyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGVycm9yc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnVuY3Rpb24gdGhhdCBzdWJzY3JpYmVzIHRvIHRoZSBmb3JtR3JvdXAncyB2YWx1ZUNoYW5nZXMgT2JzZXJ2YWJsZVxyXG4gICAqIHRvIHRha2UgYW55IGVycm9zIGFuZCB0cmFuc2xhdGUgdGhlbVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHsqfSBbZGF0YV1cclxuICAgKiBAcmV0dXJuc1xyXG4gICAqIEBtZW1iZXJvZiBGb3JtQ29udHJvbEJhc2VcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHRyYW5zbGF0ZVZhbGlkYXRpb25NZXNzYWdlcyhlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsKSB7XHJcbiAgICBpZiAoZXJyb3JzKSB7XHJcbiAgICAgIGlmKHRoaXMub3ZlcnJpZGVWYWxpZGF0aW9uRXJyb3Ipe1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycyA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMub3ZlcnJpZGVWYWxpZGF0aW9uRXJyb3IpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBtZXNzYWdlcyA9IGF3YWl0IHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLmdldEVycm9yTWVzc2FnZXMoZXJyb3JzKTtcclxuICAgICAgICBpZiAobWVzc2FnZXMpIHtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycyA9IG1lc3NhZ2VzLmpvaW4oJzsgJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPSAnJztcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRyb2wgY29udHJvbC1sYWJlbC17e2xhYmVsUG9zaXRpb259fVwiXHJcbiAgICAgW2NsYXNzLmVjLXVudG91Y2hlZF09XCJmb3JtR3JvdXA/LnVudG91Y2hlZFwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYWJlbCAmJiAhaGVscFBvcG92ZXJcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaGFyZWRMYWJlbFwiPjwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwibGFiZWwgJiYgaGVscFBvcG92ZXJcIlxyXG4gICAgICAgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hhcmVkTGFiZWxcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDxlYy1oZWxwLXBvcG92ZXIgaWQ9XCJ7e2lkfX1faGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm15LW4yIG14LW4xXCJcclxuICAgICAgICAgICAgICAgICAgICAgdGV4dD1cInt7aGVscFBvcG92ZXIgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb3NpdGlvbj1cInt7aGVscFBvcG92ZXJQb3NpdGlvbn19XCI+XHJcbiAgICA8L2VjLWhlbHAtcG9wb3Zlcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNzaGFyZWRMYWJlbD5cclxuICAgIDxsYWJlbCBuZ1ByZXNlcnZlV2hpdGVzcGFjZXM+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwibGFiZWxcIiBpZD1cInt7aWR9fV9sYWJlbFwiPnt7bGFiZWwgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPHNwYW5cclxuICAgICAgICAgICAgKm5nSWY9XCIhaGlkZVZhbGlkYXRpb25NZXNzYWdlICYmIHZhbGlkYXRpb25FcnJvcnMgJiYgZm9ybUdyb3VwPy50b3VjaGVkICYmIGZvcm1Hcm91cD8uaW52YWxpZFwiPnt7dmFsaWRhdGlvbkVycm9yc1xyXG4gICAgICAgIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuPC9kaXY+Il19
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvZm9ybS1ncm91cC9mb3JtLWdyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9mb3JtLWdyb3VwL2Zvcm0tZ3JvdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBbUIsa0JBQWtCLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0gsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNuQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBTTNDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLENBQUMsRUFBdUMsRUFBRSxnQkFBK0IsT0FBTyxFQUFFLFdBQW9CLEVBQVEsRUFBRTtJQUM5SixJQUFJLGlCQUFpQixHQUE0QixFQUFFLENBQUM7SUFFcEQsbUVBQW1FO0lBQ25FLHNDQUFzQztJQUN0QyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDbEQsSUFBSSxZQUFZLEdBQVEsZUFBZSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFN0UsSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSyxFQUFFLEVBQUU7WUFDaEQsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFR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QkFDNUUsSUFBSSxRQUFRLEVBQUU7b0JBQ1osSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzdDO2FBQ0Y7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztTQUM1QjtJQUNILENBQUM7OytHQXpKVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixtWENySS9CLDh0QkFlTTsyRkRzSE8sa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGVBQWU7OElBU1QsRUFBRTtzQkFBakIsS0FBSztnQkFLeUIsTUFBTTtzQkFBcEMsV0FBVzt1QkFBQyxTQUFTO2dCQUtOLEtBQUs7c0JBQXBCLEtBQUs7Z0JBU1UsU0FBUztzQkFBeEIsS0FBSztnQkFLVSxhQUFhO3NCQUE1QixLQUFLO2dCQU1VLHVCQUF1QjtzQkFBdEMsS0FBSztnQkFJVSxxQkFBcUI7c0JBQXBDLEtBQUs7Z0JBS1UsV0FBVztzQkFBMUIsS0FBSztnQkFLVyxtQkFBbUI7c0JBQWxDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEhvc3RCaW5kaW5nIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1BcnJheSwgQWJzdHJhY3RDb250cm9sLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS92YWxpZGF0aW9uLW1lc3NhZ2Uuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBDb250cm9sTGFiZWxQb3NpdGlvbiB9IGZyb20gXCIuLi9mb3JtLWNvbnRyb2wtYmFzZVwiO1xyXG5pbXBvcnQgeyBQb3BvdmVyQ29udGVudFBvc2l0aW9uIH0gZnJvbSBcIi4uL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnRcIjtcclxuXHJcblxyXG4vKiogRnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGZvcm0gY29udHJvbHMgYW5kXHJcbiAqICBlbnN1cmUgdGhleSBjb250YWluIHVuaXF1ZSB2YWx1ZXMuICBJZiBhbnkgYXJlIGR1cGxpY2F0ZWQgYWxsIG9mZmVuZGluZ1xyXG4gKiAgZm9ybSBjb250cm9scyB3aWxsIGJlIG1hcmtlZCBhcyBpbnZhbGlkXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZVByb3BlcnR5IC0gdGhlIHN1Yi1wcm9wZXJ0eSBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IGVhY2ggZm9ybSBjb250cm9sXHJcbiAqICAgICAgICBpdCBpcyBkZXJlZmVyZW5jZWQgYXMgZm9ybUdyb3VwLmNvbnRyb2wudmFsdWVbdmFsdWVQcm9wZXJ0eV0uXHJcbiAqICAgICAgICBkZWZhdWx0cyB0byBcInZhbHVlXCIsIHdoaWNoIG1hdGNoZXMgdGhlIGZvcm0gY29udHJvbHMgdXNlZCB0byBiYWNrIGNvbWJvYm94ZXNcclxuICogICAgICAgIGlmIGV4cGxpY2l0bHkgbnVsbCwgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHZhbHVlIGlzIG5vdCBhIGNvbXBsZXggb2JqZWN0IGFuZCBqdXN0IGV4dHJhY3RzXHJcbiAqICAgICAgICBmb3JtR3JvdXAuY29udHJvbC52YWx1ZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRm9ybUdyb3VwVmFsdWVzQXJlVW5pcXVlID0gKGZnOiBVbnR5cGVkRm9ybUdyb3VwIHwgVW50eXBlZEZvcm1BcnJheSwgdmFsdWVQcm9wZXJ0eTogc3RyaW5nIHwgbnVsbCA9IFwidmFsdWVcIiwgc3ViUHJvcGVydHk/OiBzdHJpbmcpOiB2b2lkID0+IHtcclxuICBsZXQgZm9ybUNvbnRyb2xWYWx1ZXM6IHtba2V5OiBzdHJpbmddOiBudW1iZXJ9ID0ge307XHJcblxyXG4gIC8vIEZpcnN0IGdldCBhbGwgb2YgdGhlIHZhbHVlcyBhbmQgaWYgdGhleSBoYXZlIGJlZW4gZm91bmQgYWxyZWFkeSxcclxuICAvLyBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiB0aW1lcyBmb3VuZFxyXG4gIGZvckVhY2hGb3JtQ29udHJvbChmZywgKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgbGV0IGNvbnRyb2xWYWx1ZTogYW55ID0gZ2V0Q29udHJvbFZhbHVlKGNvbnRyb2wsIHZhbHVlUHJvcGVydHksIHN1YlByb3BlcnR5KTtcclxuXHJcbiAgICBpZiAoY29udHJvbFZhbHVlICE9PSBudWxsICYmIGNvbnRyb2xWYWx1ZSAhPT0gJycpIHtcclxuICAgICAgaWYgKHR5cGVvZiBjb250cm9sVmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZvcm1Db250cm9sVmFsdWVzLmhhc093blByb3BlcnR5KGNvbnRyb2xWYWx1ZSkpIHtcclxuICAgICAgICBmb3JtQ29udHJvbFZhbHVlc1tjb250cm9sVmFsdWVdID0gZm9ybUNvbnRyb2xWYWx1ZXNbY29udHJvbFZhbHVlXSArIDE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm9ybUNvbnRyb2xWYWx1ZXNbY29udHJvbFZhbHVlXSA9IDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgLy8gTm93IGdvIGJhY2sgb3ZlciB0aGUgY29udHJvbHMgYW5kIGlmIHRoZWlyIHZhbHVlIHdhcyBmb3VuZCBtb3JlIHRoYW4gb25jZSBmbGFnIHRoZW0gYXMgaW52YWxpZFxyXG4gIGZvckVhY2hGb3JtQ29udHJvbChmZywgKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgbGV0IGNvbnRyb2xWYWx1ZTogYW55ID0gZ2V0Q29udHJvbFZhbHVlKGNvbnRyb2wsIHZhbHVlUHJvcGVydHksIHN1YlByb3BlcnR5KTtcclxuXHJcbiAgICAvLyBJZiB0aGUgY29udHJvbCB2YWx1ZSBpcyBudWxsIHdlIHdpbGwgbGV0IGFueSByZXF1aXJlZCB2YWxpZGF0b3JzIGhhbmRsZSB0aGVtXHJcbiAgICBpZiAoY29udHJvbFZhbHVlICE9PSBudWxsICYmIGNvbnRyb2xWYWx1ZSAhPT0gJycpIHtcclxuICAgICAgaWYgKHR5cGVvZiBjb250cm9sVmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZvcm1Db250cm9sVmFsdWVzW2NvbnRyb2xWYWx1ZV0gPiAxKSB7XHJcbiAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoT2JqZWN0LmFzc2lnbih7IG5vdFVuaXF1ZTogdHJ1ZSB9LCBjb250cm9sLmVycm9ycykpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEdldCBhIGNvcHkgb2YgdGhlIGV4aXN0aW5nIGZvcm0gY29udHJvbCBlcnJvcnMsIGlmIGFueVxyXG4gICAgICAgIGxldCBlcnJvcnMgPSBjbG9uZURlZXAoY29udHJvbC5lcnJvcnMpO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgZXJyb3JzIGFuZCBwcmV2aW91c2x5IGhhZCB0aGUgbm90VW5pcXVlIGVycm9yIHdlIHdhbnQgdG8gcmVtb3ZlXHJcbiAgICAgICAgLy8gdGhhdCBwcm9wZXJ0eVxyXG4gICAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmhhc093blByb3BlcnR5KFwibm90VW5pcXVlXCIpKSB7XHJcbiAgICAgICAgICBkZWxldGUgZXJyb3JzLm5vdFVuaXF1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoYXQgd2FzIHRoZSBvbmx5IGVycm9yIGluIHRoZSBvYmplY3QsIHNldCB0byBudWxsIHNvIHZhbGlkYXRpb24gcGFzc2VzXHJcbiAgICAgICAgaWYgKGVycm9ycyAmJiBPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgZXJyb3JzID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKGVycm9ycyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBGdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgZm9yIGNvbnRyb2xzIGFuZCBpbnZva2UgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhleSBhcmUgZm91bmQuXHJcbiAqIFJlY3Vyc2l2ZWx5IGNhbGxzIGl0c2VsZiB3aGVuIGl0IGVuY291bnRlcnMgc3ViIGZvcm0gZ3JvdXBzIGFuZCBpdGVyYXRlcyBvdmVyIGZvcm0gYXJyYXlzLlxyXG4gKiBAcGFyYW0gY1xyXG4gKiBAcGFyYW0gY2FsbGJhY2tcclxuICovXHJcbmV4cG9ydCBjb25zdCBmb3JFYWNoRm9ybUNvbnRyb2wgPSAoYzogQWJzdHJhY3RDb250cm9sLCBjYWxsYmFjazogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gdm9pZCk6IHZvaWQgPT4ge1xyXG4gIGxldCBjb250cm9sczogQWJzdHJhY3RDb250cm9sW10gPSBbXTtcclxuXHJcbiAgLy8gTm9ybWFsaXplIHRvIGFuIGFycmF5IGZvciBlYXNlIG9mIHByb2Nlc3NpbmdcclxuICBpZiAoYyBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQ29udHJvbCkge1xyXG4gICAgY29udHJvbHMucHVzaChjKTtcclxuICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUdyb3VwKSB7XHJcbiAgICBmb3IgKHZhciBrZXkgaW4gYy5jb250cm9scykge1xyXG4gICAgICBjb250cm9scy5wdXNoKGMuY29udHJvbHNba2V5XSk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChjIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xyXG4gICAgY29udHJvbHMgPSBjLmNvbnRyb2xzO1xyXG4gIH1cclxuXHJcbiAgY29udHJvbHMuZm9yRWFjaChjb250cm9sID0+IHtcclxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xyXG4gICAgICBjb250cm9sLmNvbnRyb2xzLmZvckVhY2goY3RybCA9PiB7XHJcbiAgICAgICAgaWYgKGN0cmwgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUdyb3VwIHx8IGN0cmwgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUFycmF5KSB7XHJcbiAgICAgICAgICBmb3JFYWNoRm9ybUNvbnRyb2woY3RybCwgY2FsbGJhY2spO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjYWxsYmFjayhjdHJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xyXG4gICAgICBmb3JFYWNoRm9ybUNvbnRyb2woY29udHJvbCxjYWxsYmFjayk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjYWxsYmFjayhjb250cm9sKTtcclxuICAgIH1cclxuICB9KTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBGdW5jdGlvbiB0byByZXR1cm4gdGhlIHZhbHVlIGlmIGl0IGlzIGVuYWJsZWQgYW5kIHNldFxyXG4gKiBAcGFyYW0gY29udHJvbFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldENvbnRyb2xWYWx1ZSA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHZhbHVlUHJvcGVydHk6IHN0cmluZyB8IG51bGwgPSBcInZhbHVlXCIsIHN1YlByb3BlcnR5Pzogc3RyaW5nKTogYW55IHwgbnVsbCA9PiB7XHJcbiAgaWYgKGNvbnRyb2wuZW5hYmxlZCAmJiAoY29udHJvbC52YWx1ZSAhPT0gbnVsbCAmJiBjb250cm9sLnZhbHVlICE9PSB1bmRlZmluZWQpKSB7XHJcbiAgICBpZiAodmFsdWVQcm9wZXJ0eSA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gY29udHJvbC52YWx1ZTtcclxuICAgIH0gZWxzZSBpZiAoc3ViUHJvcGVydHkpIHtcclxuICAgICAgcmV0dXJuIGNvbnRyb2wudmFsdWVbdmFsdWVQcm9wZXJ0eV1bc3ViUHJvcGVydHldO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGNvbnRyb2wudmFsdWVbdmFsdWVQcm9wZXJ0eV07XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdlYy1mb3JtLWdyb3VwJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1ncm91cC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS1ncm91cC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAvKipcclxuICAgKiBJZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBpZD86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogQmluZCBpZCB0byBob3N0IGVsZW1lbnRcclxuICAgKi9cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKSBwdWJsaWMgYXR0cklkPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZm9ybSBjb250cm9sIGxhYmVsXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogVUktb3JpZW50ZWQgZm9ybSBtb2RlbCB0aGF0IHJldGFpbnMgdGhlIHN0YXRlcyBhbmQgdmFsdWVzIG9mIHRoZSBIVE1MIGNvbnRyb2xzIG9uIHNjcmVlbi5cclxuICAgKiBDYW4gYmUgYSB7QGxpbmsgRm9ybUNvbnRyb2x9IG9yIGEge0BsaW5rIEZvcm1Hcm91cH1cclxuICAgKlxyXG4gICAqIEB0eXBlIHtGb3JtR3JvdXB9XHJcbiAgICogQG1lbWJlcm9mIEZvcm1Db250cm9sQmFzZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmb3JtR3JvdXA/OiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICAvKipcclxuICAgICAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgZm9ybSBjb250cm9sIGxhYmVsICh0b3B8Ym90dG9tfGxlZnQpXHJcbiAgICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgbGFiZWxQb3NpdGlvbj86IENvbnRyb2xMYWJlbFBvc2l0aW9uID0gXCJ0b3BcIjtcclxuXHJcblxyXG4gIC8qKkFuIG9wdGlvbmFsIHN0cmluZyB0byBzaG93IGlmIGFueSBvZiB0aGUgdW5kZXJseWluZyBjb250cm9scyBoYXMgYW4gZXJyb3IuIElmIGZhbHN5LCBvbmUgb2YgdGhlXHJcbiAgICogZXJyb3JzIGZyb20gdGhlIHVuZGVybHlpbmcgY29udHJvbHMgd2lsbCBiZSB1c2VkLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBvdmVycmlkZVZhbGlkYXRpb25FcnJvcj86IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIC8qKkFuIG9wdGlvbmFsIGZsYWcgdG8gaGlkZSB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgaGlkZVZhbGlkYXRpb25NZXNzYWdlPzpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbmRpdGlvbmFsbHkgc2hvdyBhIGhlbHAgcG9wb3ZlciBuZXh0IHRvIHRoZSBjb250cm9scyBsYWJlbC5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgaGVscFBvcG92ZXI/OiBzdHJpbmc7XHJcblxyXG4gICAvKipcclxuICAgKiBXaGVuIGEgaGVscCBwb3BvdmVyIGlzIHByZXNlbnQsIGFsbG93cyB0aGUgcG9wb3ZlciB0byBiZSBwb3NpdGlvbmVkIGluIGRpZmZlcmVudCBsb2NhdGlvbnMuXHJcbiAgICovXHJcbiAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwUG9wb3ZlclBvc2l0aW9uPzogUG9wb3ZlckNvbnRlbnRQb3NpdGlvbiA9ICd0b3AtbGVmdCc7XHJcbiAgIFxyXG4gIC8qKlxyXG4gICAqIEFsbCBjdXJyZW50IHZhbGlkYXRpb24gZXJyb3JzXHJcbiAgICpcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqIEBtZW1iZXJvZiBGb3JtQ29udHJvbEJhc2VcclxuICAgKi9cclxuICBwdWJsaWMgdmFsaWRhdGlvbkVycm9yczogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgcHVibGljIGFsbENvbnRyb2xzVG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGNvbXBvbmVudERlc3Ryb3llZDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCB2YWxpZGF0aW9uTWVzc2FnZVNlcnZpY2U6IFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIC8vIHN1YnNjcmliZSB0byBzdGF0dXNDaGFuZ2VzIE9ic2VydmFibGUgdG8gdGFrZSBhbnkgZXJyb3JzIGFuZCB0cmFuc2xhdGUgdGhlbVxyXG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwKSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnN0YXR1c0NoYW5nZXNcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50cmFuc2xhdGVWYWxpZGF0aW9uTWVzc2FnZXModGhpcy5nZXRFcnJvcnModGhpcy5mb3JtR3JvdXAhKSlcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIC8vIChyZSlzZXQgdmFsaWRhdGlvbiBtZXNzYWdlc1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVZhbGlkYXRpb25NZXNzYWdlcyh0aGlzLmdldEVycm9ycyh0aGlzLmZvcm1Hcm91cCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlkKSB7XHJcbiAgICAgIHRoaXMuYXR0cklkID0gdGhpcy5pZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFuZ3VsYXIgb25EZXN0cm95IGxpZmVjeWxlIGhvb2suXHJcbiAgICogVW5zdWJzY3JpYmUgZnJvbSBhbnkgb2JzZXJ2YWJsZXNcclxuICAgKlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc1xyXG4gICAqIEBtZW1iZXJvZiBGb3JtQ29udHJvbEJhc2VcclxuICAgKi9cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbXBvbmVudERlc3Ryb3llZC5uZXh0KCk7XHJcbiAgICB0aGlzLmNvbXBvbmVudERlc3Ryb3llZC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRFcnJvcnMoZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xyXG4gICAgZm9ybUdyb3VwLm1hcmtBc1VudG91Y2hlZCgpO1xyXG5cclxuICAgIGxldCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBhbGxUb3VjaGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBjb250cm9sRm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBmb3JFYWNoRm9ybUNvbnRyb2woZm9ybUdyb3VwLCAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIGVycm9ycyA9IHRoaXMuYXNzaWduRXJyb3JzKGNvbnRyb2wsIGVycm9ycyk7XHJcbiAgICAgIGlmIChjb250cm9sLnVudG91Y2hlZCkge1xyXG4gICAgICAgIGFsbFRvdWNoZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBjb250cm9sRm91bmQgPSB0cnVlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGZvcm1Hcm91cC5lcnJvcnMpIHtcclxuICAgICAgZXJyb3JzID0gT2JqZWN0LmFzc2lnbihlcnJvcnMgfHwge30sIGZvcm1Hcm91cC5lcnJvcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhbGxUb3VjaGVkICYmIGNvbnRyb2xGb3VuZCkge1xyXG4gICAgICBmb3JtR3JvdXAubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBlcnJvcnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzc2lnbkVycm9ycyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGVycm9yczogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XHJcbiAgICBpZiAoY29udHJvbC5lcnJvcnMpIHtcclxuICAgICAgZXJyb3JzID0gT2JqZWN0LmFzc2lnbihlcnJvcnMgfHwge30sIGNvbnRyb2wuZXJyb3JzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZXJyb3JzXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0aGF0IHN1YnNjcmliZXMgdG8gdGhlIGZvcm1Hcm91cCdzIHZhbHVlQ2hhbmdlcyBPYnNlcnZhYmxlXHJcbiAgICogdG8gdGFrZSBhbnkgZXJyb3MgYW5kIHRyYW5zbGF0ZSB0aGVtXHJcbiAgICpcclxuICAgKiBAcGFyYW0geyp9IFtkYXRhXVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICogQG1lbWJlcm9mIEZvcm1Db250cm9sQmFzZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgdHJhbnNsYXRlVmFsaWRhdGlvbk1lc3NhZ2VzKGVycm9yczogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwpIHtcclxuICAgIGlmIChlcnJvcnMpIHtcclxuICAgICAgaWYodGhpcy5vdmVycmlkZVZhbGlkYXRpb25FcnJvcil7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5vdmVycmlkZVZhbGlkYXRpb25FcnJvcik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2VzID0gYXdhaXQgdGhpcy52YWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UuZ2V0RXJyb3JNZXNzYWdlcyhlcnJvcnMpO1xyXG4gICAgICAgIGlmIChtZXNzYWdlcykge1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzID0gbWVzc2FnZXMuam9pbignOyAnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycyA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY29udHJvbCBjb250cm9sLWxhYmVsLXt7bGFiZWxQb3NpdGlvbn19XCJcclxuICAgICBbY2xhc3MuZWMtdW50b3VjaGVkXT1cImZvcm1Hcm91cD8udW50b3VjaGVkXCI+XHJcblxyXG4gIDxsYWJlbCAqbmdJZj1cImxhYmVsXCI+XHJcbiAgICA8c3BhbiBpZD1cInt7aWR9fV9sYWJlbFwiPnt7bGFiZWwgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgIDxzcGFuICpuZ0lmPVwiIWhpZGVWYWxpZGF0aW9uTWVzc2FnZSAmJiB2YWxpZGF0aW9uRXJyb3JzICYmIGZvcm1Hcm91cD8udG91Y2hlZCAmJiBmb3JtR3JvdXA/LmludmFsaWRcIj4mbmJzcDt7e3ZhbGlkYXRpb25FcnJvcnMgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgIDxlYy1oZWxwLXBvcG92ZXIgaWQ9XCJ7e2lkfX1faGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImhlbHBQb3BvdmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWlubGluZS1ibG9jayBteS1uMiBteC1uMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJ7e2hlbHBQb3BvdmVyIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICBjb250ZW50UG9zaXRpb249XCJ7e2hlbHBQb3BvdmVyUG9zaXRpb259fVwiPlxyXG4gICAgPC9lYy1oZWxwLXBvcG92ZXI+XHJcbiAgPC9sYWJlbD5cclxuXHJcbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG48L2Rpdj4iXX0=
@@ -340,10 +340,10 @@ export class NumericboxComponent extends FormControlBase {
340
340
  }
341
341
  }
342
342
  NumericboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NumericboxComponent, deps: [{ token: i1.ValidationMessageService }, { token: i2.FormGroupHelper }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
343
- NumericboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: NumericboxComponent, selector: "ec-numericbox", inputs: { placeholder: "placeholder", decimals: "decimals", showPrecision: "showPrecision", maxPrecisionDigits: "maxPrecisionDigits", max: "max", min: "min", leftUnits: "leftUnits", rightUnits: "rightUnits", autoUpdateFormModel: "autoUpdateFormModel" }, viewQueries: [{ propertyName: "textboxEl", first: true, predicate: TextboxComponent, descendants: true, read: ElementRef, static: true }, { propertyName: "textboxInput", first: true, predicate: ["textbox"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.invalid]=\"formModel?.invalid && (formModel?.touched)\">\r\n <ng-container *ngIf=\"label && !helpPopover\">\r\n <ng-container *ngTemplateOutlet=\"sharedLabel\"></ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"label && helpPopover\"\r\n class=\"d-flex align-items-center\">\r\n <ng-container *ngTemplateOutlet=\"sharedLabel\"></ng-container>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n class=\"my-n2 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </div>\r\n\r\n <ng-template #sharedLabel>\r\n <label ngPreserveWhitespaces>\r\n <span *ngIf=\"label\">{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length && formModel?.touched && formModel?.invalid\">{{validationErrors\r\n |\r\n translate}}</span>\r\n </label>\r\n </ng-template>\r\n\r\n <!-- Setting the maxlength to 13 to combat the user from entering too large of a number\r\n for javascript to support. If the user enters all 13 characters as numbers and we have showPrecision set, adding the\r\n decimal and the empty zero characters will get them in a situation where to edit it they must remove characters\r\n as we would push them past the limit -->\r\n <ec-textbox [id]=\"id\"\r\n #textbox\r\n class=\"control-input mb-0\"\r\n [placeholder]=\"placeholder\"\r\n [maxlength]=\"maxPrecisionDigits ? maxPrecisionDigits + 3 : 13\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n [tooltip]=\"tooltip\"\r\n (focusout)=\"onFocusOut()\">\r\n </ec-textbox>\r\n</div>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}ec-textbox ::ng-deep .input-wrapper{position:relative}ec-textbox ::ng-deep input{text-align:right}ec-textbox ::ng-deep input:required.is-empty:not(:disabled)~.units-left{left:1.25rem}ec-textbox ::ng-deep input.ng-invalid.ng-touched~.units-left{left:1.25rem}ec-textbox ::ng-deep .control:not(.is-readonly) input:disabled~.units{color:var(--ec-form-control-color-disabled);opacity:.65}ec-textbox ::ng-deep .units{display:block;position:absolute;top:0;height:2rem;line-height:1.25rem;padding:.375rem .25rem;z-index:2}ec-textbox ::ng-deep .units.units-right{right:0;padding-right:.5rem}ec-textbox ::ng-deep .units.units-left{left:0;padding-left:.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}.control.invalid ec-textbox ::ng-deep input.ng-invalid:focus,.control.invalid ec-textbox ::ng-deep input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.units-left,.control.invalid ec-textbox ::ng-deep input.ng-valid~.units-left{left:1.25rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-required,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-required{display:none}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i5.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
343
+ NumericboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: NumericboxComponent, selector: "ec-numericbox", inputs: { placeholder: "placeholder", decimals: "decimals", showPrecision: "showPrecision", maxPrecisionDigits: "maxPrecisionDigits", max: "max", min: "min", leftUnits: "leftUnits", rightUnits: "rightUnits", autoUpdateFormModel: "autoUpdateFormModel" }, viewQueries: [{ propertyName: "textboxEl", first: true, predicate: TextboxComponent, descendants: true, read: ElementRef, static: true }, { propertyName: "textboxInput", first: true, predicate: ["textbox"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.invalid]=\"formModel?.invalid && (formModel?.touched)\">\r\n\r\n <label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length && formModel?.touched && formModel?.invalid\">&nbsp;{{validationErrors | translate}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n2 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\r\n <!-- Setting the maxlength to 13 to combat the user from entering too large of a number\r\n for javascript to support. If the user enters all 13 characters as numbers and we have showPrecision set, adding the\r\n decimal and the empty zero characters will get them in a situation where to edit it they must remove characters\r\n as we would push them past the limit -->\r\n <ec-textbox [id]=\"id\"\r\n #textbox\r\n class=\"control-input mb-0\"\r\n [placeholder]=\"placeholder\"\r\n [maxlength]=\"maxPrecisionDigits ? maxPrecisionDigits + 3 : 13\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n [tooltip]=\"tooltip\"\r\n (focusout)=\"onFocusOut()\">\r\n </ec-textbox>\r\n</div>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}ec-textbox ::ng-deep .input-wrapper{position:relative}ec-textbox ::ng-deep input{text-align:right}ec-textbox ::ng-deep input:required.is-empty:not(:disabled)~.units-left{left:1.25rem}ec-textbox ::ng-deep input.ng-invalid.ng-touched~.units-left{left:1.25rem}ec-textbox ::ng-deep .control:not(.is-readonly) input:disabled~.units{color:var(--ec-form-control-color-disabled);opacity:.65}ec-textbox ::ng-deep .units{display:block;position:absolute;top:0;height:2rem;line-height:1.25rem;padding:.375rem .25rem;z-index:2}ec-textbox ::ng-deep .units.units-right{right:0;padding-right:.5rem}ec-textbox ::ng-deep .units.units-left{left:0;padding-left:.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}.control.invalid ec-textbox ::ng-deep input.ng-invalid:focus,.control.invalid ec-textbox ::ng-deep input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.units-left,.control.invalid ec-textbox ::ng-deep input.ng-valid~.units-left{left:1.25rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-required,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-required{display:none}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i5.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
344
344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NumericboxComponent, decorators: [{
345
345
  type: Component,
346
- args: [{ selector: 'ec-numericbox', template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.invalid]=\"formModel?.invalid && (formModel?.touched)\">\r\n <ng-container *ngIf=\"label && !helpPopover\">\r\n <ng-container *ngTemplateOutlet=\"sharedLabel\"></ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"label && helpPopover\"\r\n class=\"d-flex align-items-center\">\r\n <ng-container *ngTemplateOutlet=\"sharedLabel\"></ng-container>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n class=\"my-n2 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </div>\r\n\r\n <ng-template #sharedLabel>\r\n <label ngPreserveWhitespaces>\r\n <span *ngIf=\"label\">{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length && formModel?.touched && formModel?.invalid\">{{validationErrors\r\n |\r\n translate}}</span>\r\n </label>\r\n </ng-template>\r\n\r\n <!-- Setting the maxlength to 13 to combat the user from entering too large of a number\r\n for javascript to support. If the user enters all 13 characters as numbers and we have showPrecision set, adding the\r\n decimal and the empty zero characters will get them in a situation where to edit it they must remove characters\r\n as we would push them past the limit -->\r\n <ec-textbox [id]=\"id\"\r\n #textbox\r\n class=\"control-input mb-0\"\r\n [placeholder]=\"placeholder\"\r\n [maxlength]=\"maxPrecisionDigits ? maxPrecisionDigits + 3 : 13\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n [tooltip]=\"tooltip\"\r\n (focusout)=\"onFocusOut()\">\r\n </ec-textbox>\r\n</div>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}ec-textbox ::ng-deep .input-wrapper{position:relative}ec-textbox ::ng-deep input{text-align:right}ec-textbox ::ng-deep input:required.is-empty:not(:disabled)~.units-left{left:1.25rem}ec-textbox ::ng-deep input.ng-invalid.ng-touched~.units-left{left:1.25rem}ec-textbox ::ng-deep .control:not(.is-readonly) input:disabled~.units{color:var(--ec-form-control-color-disabled);opacity:.65}ec-textbox ::ng-deep .units{display:block;position:absolute;top:0;height:2rem;line-height:1.25rem;padding:.375rem .25rem;z-index:2}ec-textbox ::ng-deep .units.units-right{right:0;padding-right:.5rem}ec-textbox ::ng-deep .units.units-left{left:0;padding-left:.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}.control.invalid ec-textbox ::ng-deep input.ng-invalid:focus,.control.invalid ec-textbox ::ng-deep input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.units-left,.control.invalid ec-textbox ::ng-deep input.ng-valid~.units-left{left:1.25rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-required,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-required{display:none}\n"] }]
346
+ args: [{ selector: 'ec-numericbox', template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.invalid]=\"formModel?.invalid && (formModel?.touched)\">\r\n\r\n <label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length && formModel?.touched && formModel?.invalid\">&nbsp;{{validationErrors | translate}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n2 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\r\n <!-- Setting the maxlength to 13 to combat the user from entering too large of a number\r\n for javascript to support. If the user enters all 13 characters as numbers and we have showPrecision set, adding the\r\n decimal and the empty zero characters will get them in a situation where to edit it they must remove characters\r\n as we would push them past the limit -->\r\n <ec-textbox [id]=\"id\"\r\n #textbox\r\n class=\"control-input mb-0\"\r\n [placeholder]=\"placeholder\"\r\n [maxlength]=\"maxPrecisionDigits ? maxPrecisionDigits + 3 : 13\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n [tooltip]=\"tooltip\"\r\n (focusout)=\"onFocusOut()\">\r\n </ec-textbox>\r\n</div>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}ec-textbox ::ng-deep .input-wrapper{position:relative}ec-textbox ::ng-deep input{text-align:right}ec-textbox ::ng-deep input:required.is-empty:not(:disabled)~.units-left{left:1.25rem}ec-textbox ::ng-deep input.ng-invalid.ng-touched~.units-left{left:1.25rem}ec-textbox ::ng-deep .control:not(.is-readonly) input:disabled~.units{color:var(--ec-form-control-color-disabled);opacity:.65}ec-textbox ::ng-deep .units{display:block;position:absolute;top:0;height:2rem;line-height:1.25rem;padding:.375rem .25rem;z-index:2}ec-textbox ::ng-deep .units.units-right{right:0;padding-right:.5rem}ec-textbox ::ng-deep .units.units-left{left:0;padding-left:.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}.control.invalid ec-textbox ::ng-deep input.ng-invalid:focus,.control.invalid ec-textbox ::ng-deep input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.units-left,.control.invalid ec-textbox ::ng-deep input.ng-valid~.units-left{left:1.25rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-required,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-required{display:none}\n"] }]
347
347
  }], ctorParameters: function () { return [{ type: i1.ValidationMessageService }, { type: i2.FormGroupHelper }, { type: i0.Renderer2 }]; }, propDecorators: { placeholder: [{
348
348
  type: Input
349
349
  }], decimals: [{
@@ -369,4 +369,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
369
369
  type: ViewChild,
370
370
  args: ['textbox', { static: true }]
371
371
  }] } });
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpY2JveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbnVtZXJpY2JveC9udW1lcmljYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9udW1lcmljYm94L251bWVyaWNib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBMEQsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pLLE9BQU8sRUFBbUIsa0JBQWtCLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7QUFHaEU7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUF1QixFQUFFLEdBQXVCLEVBQUUsUUFBNEIsRUFBRSxrQkFBc0MsRUFBZSxFQUFFO0lBQ3hLLE9BQU8sQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDaEMsSUFBSSxRQUFRLEdBQVksS0FBSyxDQUFDO1FBRTlCLCtFQUErRTtRQUMvRSwwREFBMEQ7UUFDMUQsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFO1lBRXZDLElBQUksY0FB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VCxXQUFXO3NCQUExQixLQUFLO2dCQU1VLFFBQVE7c0JBQXZCLEtBQUs7Z0JBT1UsYUFBYTtzQkFBNUIsS0FBSztnQkFTVSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBVVUsR0FBRztzQkFBbEIsS0FBSztnQkFVVSxHQUFHO3NCQUFsQixLQUFLO2dCQU1VLFNBQVM7c0JBQXhCLEtBQUs7Z0JBTVUsVUFBVTtzQkFBekIsS0FBSztnQkFNVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBS21FLFNBQVM7c0JBQWpGLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBc0JmLFlBQVk7c0JBQTNELFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS92YWxpZGF0aW9uLW1lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IGdldERlY2ltYWxQYXR0ZXJuLCBpbnRlZ2VyUGF0dGVybiB9IGZyb20gJy4uLy4uL2NvcmUvdmFsaWRhdGlvbi1wYXR0ZXJucyc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cEhlbHBlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtLWdyb3VwLmhlbHBlcic7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sQmFzZSB9IGZyb20gXCIuLi9mb3JtLWNvbnRyb2wtYmFzZVwiO1xyXG5pbXBvcnQgeyBUZXh0Ym94Q29tcG9uZW50IH0gZnJvbSAnLi4vdGV4dGJveC90ZXh0Ym94LmNvbXBvbmVudCc7XHJcblxyXG5cclxuLyoqXHJcbiAqIEN1c3RvbSB2YWxpZGF0b3IgdG8gY2hlY2sgdGhhdCBtaW4vbWF4IGFuZCBwYXR0ZXJuIHZhbGlkYXRpb24gaXMgbWV0IG9uIHRoZSBudW1lcmljYm94XHJcbiAqIGNvbXBvbmVudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG51bWVyaWNib3hWYWxpZGF0aW9uID0gKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkLCBtYXg6IG51bWJlciB8IHVuZGVmaW5lZCwgZGVjaW1hbHM6IG51bWJlciB8IHVuZGVmaW5lZCwgbWF4UHJlY2lzaW9uRGlnaXRzOiBudW1iZXIgfCB1bmRlZmluZWQpOiBWYWxpZGF0b3JGbiA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICAgIGxldCBoYXNFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgY29udHJvbCBpcyBlbXB0eSB3ZSB3b24ndCBhdHRlbXB0IHRvIHZhbGlkYXRlLCBpZiB0aGVyZSBpcyBhIHJlcXVpcmVkXHJcbiAgICAgICAgLy8gdmFsaWRhdG9yIHdlIHdpbGwgbmV2ZXIgZ2V0IGhlcmUgdW50aWwgdGhlcmUgaXMgYSB2YWx1ZVxyXG4gICAgICAgIGlmIChjb250cm9sLnZhbHVlICYmIGNvbnRyb2wudmFsdWUgIT09IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBudW1lcmljUGF0dGVybjogUmVnRXhwO1xyXG4gICAgICAgICAgICBpZiAoZGVjaW1hbHMgJiYgZGVjaW1hbHMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBudW1lcmljUGF0dGVybiA9IGdldERlY2ltYWxQYXR0ZXJuKGRlY2ltYWxzKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhQcmVjaXNpb25EaWdpdHMpIHtcclxuICAgICAgICAgICAgICAgIC8vIFN0aWxsIG5lZWQgdG8gY2hlY2sgZm9yIGEgdmFsaWQgbnVtYmVyIGZvcm1hdHRpbmcgd2hlbiBpbiBtYXggcHJlY2lzaW9uIG1vZGVcclxuICAgICAgICAgICAgICAgIG51bWVyaWNQYXR0ZXJuID0gZ2V0RGVjaW1hbFBhdHRlcm4obWF4UHJlY2lzaW9uRGlnaXRzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIEFsbG93IGFuIG9wdGlvbmFsIG5lZ2F0aXZlIHNpZ24gYW5kIGFueSBudW1iZXIgb2YgZGlnaXRzIDAtOVxyXG4gICAgICAgICAgICAgICAgbnVtZXJpY1BhdHRlcm4gPSBpbnRlZ2VyUGF0dGVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFudW1lcmljUGF0dGVybi50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4UHJlY2lzaW9uRGlnaXRzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIHRvIGEgbnVtYmVyIHRoZW4gYmFjayB0byBzdHJpbmcgcmVtb3ZlcyB0cmFpbGluZyB6ZXJvcywgYW5kIHRoZSByZWdleCByZXBsYWNlIHJlbW92ZXNcclxuICAgICAgICAgICAgICAgIC8vIGFueSBuZWdhdGl2ZSBzaWducywgbGVhZGluZyB6ZXJvcyBvciBkZWNpbWFsIHBvaW50cyBmcm9tIHRoZSBudW1iZXIuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBOdW1iZXIoY29udHJvbC52YWx1ZSkudG9TdHJpbmcoKS5yZXBsYWNlKC9eLT8vLCAnJykucmVwbGFjZSgvKF4wXFwuKXwoXFwuKS8sICcnKTtcclxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdmFsLmxlbmd0aCA+IG1heFByZWNpc2lvbkRpZ2l0cztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gV2Ugbm93IGtub3cgd2UgaGF2ZSBhIHZhbGlkIG51bWJlciwgc28gd2UgY2FuIGNhc3QgdGhlc2UgdG8gbnVtYmVyc1xyXG4gICAgICAgICAgICAvLyBmb3IgcHJvcGVyIHJhbmdlIHZhbGlkYXRpb25cclxuICAgICAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIE51bWJlcihjb250cm9sLnZhbHVlKSA8IG1pbikge1xyXG4gICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyKGNvbnRyb2wudmFsdWUpID4gbWF4KSB7XHJcbiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChoYXNFcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgbnVtZXJpY2JveDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBtaW46IG1pbixcclxuICAgICAgICAgICAgICAgICAgICBtYXg6IG1heCxcclxuICAgICAgICAgICAgICAgICAgICBkZWNpbWFsczogZGVjaW1hbHMsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4UHJlY2lzaW9uRGlnaXRzOiBtYXhQcmVjaXNpb25EaWdpdHNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VjLW51bWVyaWNib3gnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL251bWVyaWNib3guY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbnVtZXJpY2JveC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTnVtZXJpY2JveENvbXBvbmVudCBleHRlbmRzIEZvcm1Db250cm9sQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdGV4dGJveCBpbnB1dCdzIHBsYWNlaG9sZGVyXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBudW1iZXIgb2YgZGVjaW1hbHMgYWxsb3dlZC4gIElmIG5vdCBzdXBwbGllZCB0aGUgaW5wdXQgdmFsdWUgd2lsbCBiZSB2YWxpZGF0ZWQgYXMgYVxyXG4gICAgICogd2hvbGUgbnVtYmVyXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkZWNpbWFscz86IG51bWJlcjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IHRyYWlsaW5nIHplcm9zIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LlxyXG4gICAgICogRG8gbm90IHVzZSB3aXRoIG1heFByZWNpc2lvbkRpZ2l0cy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dQcmVjaXNpb24/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1heGltdW0gdG90YWwgZGlnaXRzIGEgbnVtYmVyIGNhbiBoYXZlIGxlZnQgb3IgcmlnaHQgb2YgdGhlIGRlY2ltYWwgcG9pbnQuXHJcbiAgICAgKiBEdWUgdG8gbGltaXRhdGlvbnMgd2l0aCBob3cgSlMgaGFuZGxlcyBudW1iZXJzLCB0aGUgbWF4IHZhbHVlIGZvciB0aGlzIGlzIDE1LlxyXG4gICAgICogTnVtYmVycyBsb25nZXIgdGhhbiAxNSBkaWdpdHMgbWF5IGNhdXNlIHJvdW5kaW5nIGVycm9ycy5cclxuICAgICAqIERvIG5vdCB1c2Ugd2l0aCBzaG93UHJlY2lzaW9uID0gdHJ1ZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4UHJlY2lzaW9uRGlnaXRzPzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXhpbXVtIHZhbHVlIGFsbG93ZWQgaW4gdGhlIGlucHV0XHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpcyBmb3IgYWRkaW5nIHRoZSBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBicm93c2VyIGZ1bmN0aW9uYWxpdHlcclxuICAgICAqIGZyb20gdGhlIGlucHV0LiAgSWYgeW91IG5lZWQgdGhlIGZvcm0gdG8gYmUgdmFsaWRhdGVkIGJlZm9yZSBzdWJtaXNzaW9uLCBhcHBseSB0aGVcclxuICAgICAqIG1heCB2YWxpZGF0b3IgdG8gdGhlIGZvcm0gY29ucm9sLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4PzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtaW5pbXVtIHZhbHVlIGFsbG93ZWQgaW4gdGhlIGlucHV0XHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpcyBmb3IgYWRkaW5nIHRoZSBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBicm93c2VyIGZ1bmN0aW9uYWxpdHlcclxuICAgICAqIGZyb20gdGhlIGlucHV0LiAgSWYgeW91IG5lZWQgdGhlIGZvcm0gdG8gYmUgdmFsaWRhdGVkIGJlZm9yZSBzdWJtaXNzaW9uLCBhcHBseSB0aGVcclxuICAgICAqIG1pbiB2YWxpZGF0b3IgdG8gdGhlIGZvcm0gY29ucm9sLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluPzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbnB1dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbGVmdFVuaXRzPzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaW5wdXRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHJpZ2h0VW5pdHM/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBzZXQgdG8gdHJ1ZSB0aGlzIHdpbGwgdXBkYXRlIHRoZSBmb3JtIG1vZGVsIGFmdGVyIGEgZGVib3VuY2UgYXMgdGhlIHVzZXJcclxuICAgICAqIGludGVyYWN0cyB3aXRoIHRoZSBjb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGF1dG9VcGRhdGVGb3JtTW9kZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSB0ZXh0Ym94IGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChUZXh0Ym94Q29tcG9uZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHRleHRib3hFbCE6IEVsZW1lbnRSZWY7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGludGVybmFsIGZvcm0gbW9kZWwgd2UgdXNlIHRvIGRpc3BsYXkgdGhlIHZhbHVlIHdpdGggZm9ybWF0dGluZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdGV4dGJveEZvcm1Nb2RlbCE6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuXHJcbiAgICAvKiogRmxhZyB0byB0ZWxsIHRoZSBwYWdlIHdlIGZpbmFsbHkgY29tcHV0ZWQgYSBncmVhdGVyIHRoYW4gemVyb1xyXG4gICAgICogIHdpZHRoIGZvciB1bml0cyAoaWYgYXBwbGljYWJsZSlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1bml0c1dpZHRoQ2FsY3VsYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBGbGFnIHVzZWQgdG8gZmlsdGVyIHRoZSBmb3JtIG1vZGVscyB2YWx1ZSBjaGFuZ2VzIHN1YnNjcmlwdGlvblxyXG4gICAgICogIHRvIHByZXZlbnQgdGhlIHRleHRib3ggbW9kZWwgZnJvbSBiZWluZyBmb3JtYXR0ZWQgYXMgdGhlIGZvcm0gbW9kZWwgaXMgdXBkYXRlZFxyXG4gICAgICogIHByb2dyYW1tYXRpY2FsbHkgd2hlbiB0aGUgdGV4dGJveCBtb2RlbCB1cGRhdGVzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXV0b1VwZGF0aW5nRm9ybU1vZGVsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICogUmVmZXJlbmNlIHRvIHRoZSB0ZXh0Ym94IGlucHV0IGNvbnRyb2xcclxuICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ3RleHRib3gnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHRleHRib3hJbnB1dCE6IFRleHRib3hDb21wb25lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJvdGVjdGVkIHZhbGlkYXRpb25NZXNzYWdlU2VydmljZTogVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBmb3JtR3JvdXBIZWxwZXI6IEZvcm1Hcm91cEhlbHBlcixcclxuICAgICAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMlxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIodmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLCBmb3JtR3JvdXBIZWxwZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW5ndWxhciBBZnRlclZpZXdJbml0IGxpZmUtY3ljbGUgaG9va1xyXG4gICAgICogU3Vic2NyaWJlIHRvIHRleHRib3ggbW9kZWwgdmFsdWUgY2hhbmdlcyBpZiB0aGUgaG9zdGluZ1xyXG4gICAgICogcGFnZSBoYXMgb3B0ZWQgaW4gZm9yIHRoaXMgY29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1VwZGF0ZUZvcm1Nb2RlbCkge1xyXG4gICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcclxuICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZCksXHJcbiAgICAgICAgICAgICAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtTW9kZWxWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW5ndWxhciBvbkNoYW5nZXMgbGlmZS1jeWNsZSBob29rXHJcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzIHwgTGlmZS1jeWNsZSBob29rc31cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICAvLyBJZiBlaXRoZXIgdW5pdHMgY2hhbmdlIGFmdGVyIHdlJ3ZlIGNhbGN1bGF0ZWQsXHJcbiAgICAgICAgLy8gcmVzZXQgdGhlIGZsYWcgc28gd2UgY2FuIHJlYWN0IGFuZCByZWRyYXdcclxuICAgICAgICBpZiAoY2hhbmdlcy5yaWdodFVuaXRzIHx8IGNoYW5nZXMubGVmdFVuaXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5pdHNXaWR0aENhbGN1bGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuZ3VsYXIgb25Jbml0IGxpZmVjeWNsZSBob29rXHJcbiAgICAgKiBJZiB1bml0cyBpcyBkZWZpbmVkLCBzZXQgdGhlIHBvc2l0aW9uIGFuZCBsaXN0ZW4gZm9yIHN0YXR1cyBjaGFuZ2VzIHNvIHdlXHJcbiAgICAgKiBjYW4gdXBkYXRlIHRoZSBwb3NpdGlvbmluZyBvZiB0aGUgdW5pdHMgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdGV4dGJveCBmb3JtIG1vZGVsIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBmb3JtIG1vZGVsIGFuZCBzeW5jaHJvbml6ZVxyXG4gICAgICAgIC8vIGRpc2FibGVkIHN0YXRlXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiB0aGlzLmZvcm1Nb2RlbC52YWx1ZSwgZGlzYWJsZWQ6IHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkIH0pO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGZvcm0gbW9kZWwncyBlcnJvcnMgd2hlbiB0aGUgdGV4dGJveCBmb3JtIG1vZGVsIHN0YXR1cyBjaGFuZ2VzXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnN0YXR1c0NoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtTW9kZWwuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lcnJvcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLy8gU3luY2hyb25pemUgZGlzYWJsZWQgc3RhdGUgYmV0d2VlbiBmb3JtIG1vZGVsIGFuZCBpbnRlcm5hbCB0ZXh0Ym94IGZvcm0gbW9kZWxcclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC5zdGF0dXNDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lbmFibGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGV4dGJveCB2YWxpZGF0b3JzXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbGlkYXRvcnModGhpcy5nZXRWYWxpZGF0b3JzKCkpO1xyXG5cclxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgdGV4dGJveCBpcyBzZXQgdXAgd2Ugd2lsbCBzZXQgaXQncyB2YWx1ZSB0byB3aGF0ZXZlciB0aGVcclxuICAgICAgICAvLyBmb3JtIG1vZGVsIGhhZCB3aGVuIHdlIGluaXRpYWxpemVkXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKHRoaXMuZm9ybWF0RGlzcGxheU51bWJlcih0aGlzLmZvcm1Nb2RlbC52YWx1ZSkpO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgZm9ybSBtb2RlbCdzIHZhbHVlIGNoYW5nZXMgcHJvZ3JhbW1hdGljYWxseSB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGVcclxuICAgICAgICAvLyB0ZXh0Ym94IGZvcm0gbW9kZWxcclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaWx0ZXIgb3V0IHdoZW4gd2UgYXJlIHVwZGF0aW5nIGl0IHByb2dyYW1tYXRpY2FsbHkgaWYgdGhlXHJcbiAgICAgICAgICAgIC8vIGhvc3RpbmcgcGFnZSBoYXMgb3B0ZWQgaW50byB0aGUgYXV0byB1cGRhdGluZyBpbnB1dFxyXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuYXV0b1VwZGF0aW5nRm9ybU1vZGVsKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdERpc3BsYXlOdW1iZXIodmFsdWUpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSB0ZXh0Ym94IHN0YXR1cyBjaGFuZ2VzIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBsZWZ0IHVuaXRzIHBvc2l0aW9uIGJlY2F1c2VcclxuICAgICAgICAvLyB3ZSB3YW50IHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGludmFsaWQgaWNvblxyXG4gICAgICAgIGlmICh0aGlzLmxlZnRVbml0cykge1xyXG4gICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFVuaXRzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbmd1bGFyIGFmdGVyVmlld0NoZWNrZWQgbGlmZWN5Y2xlIGhvb2tcclxuICAgICAqIFNob3cgdGhlIHVuaXRzIGVsZW1lbnQgaWYgdW5pdHMgaXMgZGVmaW5lZC4gUnVucyBhZnRlciBldmVyeSBuZ09uQ2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICgodGhpcy5sZWZ0VW5pdHMgfHwgdGhpcy5yaWdodFVuaXRzKSAmJiAhdGhpcy51bml0c1dpZHRoQ2FsY3VsYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dVbml0cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRoYXQgYnVpbGRzIGFuZCByZXR1cm5zIGEgVmFsaWRhdG9yRm4gYXJyYXkgdG8gc2V0IG9uIHRoZSBmb3JtIGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRWYWxpZGF0b3JzKCk6IFZhbGlkYXRvckZuW10ge1xyXG4gICAgICAgIGxldCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChudW1lcmljYm94VmFsaWRhdGlvbih0aGlzLm1pbiwgdGhpcy5tYXgsIHRoaXMuZGVjaW1hbHMsIHRoaXMubWF4UHJlY2lzaW9uRGlnaXRzKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB2YWxpZGF0b3JzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgb3V0IGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBUZXh0Ym94IGNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25Gb2N1c091dCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1Nb2RlbFZhbHVlKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGdW5jdGlvbiB0byBzZXQgZm9jdXMgb24gYW4gaW5wdXQgcHJvZ3JhbWF0aWNhbGx5IGFmdGVyIHRoZSBwYWdlXHJcbiAgICAqIGhhZCBiZWVuIHJlbmRlcmVkLiAgVGhlIGhpZ2hsaWdodCB0ZXh0IGZsYWcgd2lsbCBzZWxlY3QgdGhlIHRleHRcclxuICAgICogd2l0aGluIHRoZSBpbnB1dCBpZiBwYXNzZWQgaW4gYW5kIHRydWVcclxuICAgICovXHJcbiAgICBwdWJsaWMgc2V0Rm9jdXMoaGlnaGxpZ2h0VGV4dD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRleHRib3hJbnB1dC5zZXRGb2N1cyhoaWdobGlnaHRUZXh0KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIHRoZSB0ZXh0Ym94IG1vZGVsIHVwZGF0ZXMgd2UgbmVlZCB0byBhZGQgc29tZSBkaXNwbGF5IGZvcm1hdHRpbmcgZm9yXHJcbiAgICAgKiBkaXNwbGF5IGluIHRoZSB0ZXh0Ym94IGFuZCBjYXN0IHRoZSB0ZXh0Ym94IG1vZGVsIHRvIGEgbnVtYmVyLiBBdm9pZCB1cGRhdGluZ1xyXG4gICAgICogdGhlIGZvcm0gbW9kZWwgd2hlbiB0aGUgdmFsdWUgZG9lc24ndCBjaGFuZ2UgYmVjYXVzZSBsaXN0ZW5lcnMgd2lsbCBmaXJlIGZvciBubyByZWFzb25cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVGb3JtTW9kZWxWYWx1ZShpc0ZvY3VzT3V0PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9VcGRhdGVGb3JtTW9kZWwpIHtcclxuICAgICAgICAgICAgLy8gTWFrZSBpdCBzbyB2YWx1ZSBjaGFuZ2VzIG9uIHRoZSBmb3JtIG1vZGVsIGRvIG5vdCBnZXQgdHJpZ2dlcmVkXHJcbiAgICAgICAgICAgIC8vIGFzIHdlIGNoYW5nZSBpdCBwcm9ncmFtbWF0aWNhbGx5LiAgV2UgZG8gbm90IHdhbnQgdGhlIHRleHRib3hcclxuICAgICAgICAgICAgLy8gbW9kZWwgdG8gYmUgdXBkYXRlZCB3aGlsZSB0aGUgdXNlciBpcyBpbiB0aGUgaW5wdXRcclxuICAgICAgICAgICAgdGhpcy5hdXRvVXBkYXRpbmdGb3JtTW9kZWwgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWxpZCB8fCB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG91dCB3aXRoIG51bGwgZm9yIHRoZSBudW1iZXIsIGlmIHRoZSB0ZXh0Ym94IHZhbHVlIGlzIG5vdCBhIG51bWJlclxyXG4gICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBjbGVhciBpdCBvdXQgb24gZm9jdXMgb3V0XHJcbiAgICAgICAgICAgICAgICBsZXQgbnVtYmVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRleHRib3ggbW9kZWwgaXMgYSBudW1iZXIgYmVmb3JlIHRyeWluZyB0byB1cGRhdGUgdGhlXHJcbiAgICAgICAgICAgICAgICAvLyBmb3JtIG1vZGVsIHZhbHVlIHdpdGggaXRcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgJiYgIWlzTmFOKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBPdXIgdmFsdWUgaXMgYSBsZWdpdCBudW1iZXIsIG9uIGZvY3VzIG91dCB3ZSB3aWxsIGZvcm1hdCBpdCBpZiBuZWVkZWRcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSBOdW1iZXIodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBpZiBub3QgZG9uJ3Qgc2V0IHRoZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHRvIGF2b2lkIGV4dHJhIGxpc3RlbmVyIGNhbGxzXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybU1vZGVsLnZhbHVlICE9PSBudW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0VmFsdWUobnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRleHRib3ggbW9kZWwgaXMgbm90IGEgbnVtYmVyLCBjaGVjayB0byBzZWUgaWYgb3VyIGZvcm0gbW9kZWwgaGFzIGEgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaWYgc28gY2xlYXIgaXQgb3V0XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybU1vZGVsLnZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gV2Ugb25seSB3aWxsIHVwZGF0ZSB0aGUgdGV4dGJveCBmb3JtIG1vZGVsIHdpdGggZm9ybWF0dGluZyBpZiBuZWVkZWRcclxuICAgICAgICAgICAgICAgIC8vIG9uIEZvY3VzIG91dC4gIFRoaXMgd29ya3Mgd2VsbCBmb3IgdGhlIHVzZXIgd2hldGhlciB0aGUgYXV0byB1cGRhdGVcclxuICAgICAgICAgICAgICAgIC8vIGlzIG9wdGVkIGluIG9yIG5vdFxyXG4gICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNPdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUodGhpcy5mb3JtYXREaXNwbGF5TnVtYmVyKG51bWJlcikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgLy8gTm90aGluZyB0byBkaXNwbGF5LCBqdXN0IGVuc3VyaW5nIHdlIHJlc2V0IG91ciBmbGFnIHRoYXQgZmlsdGVyc1xyXG4gICAgICAgICAgICAvLyB0aGUgZm9ybSBtb2RlbCB2YWx1ZSBjaGFuZ2VzXHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvVXBkYXRpbmdGb3JtTW9kZWwgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0IGEgbnVtYmVyIHZhbHVlIHRvIHRoZSBmb3JtbWF0ZWQgZGlzcGxheSBzdHJpbmcuIElmIHRoZXJlIGlzIG5vIHZhbHVlXHJcbiAgICAgKiByZXR1cm4gbnVsbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZvcm1hdERpc3BsYXlOdW1iZXIodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBpZiAodmFsdWUgfHwgdmFsdWUgPT09IDApIHtcclxuICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBjYWxsaW5nIHRvRml4ZWQgaWYgdGhlIHZhbHVlIGlzbid0IGEgbnVtYmVyLiAgVGhpcyBpcyBwb3NzaWJsZVxyXG4gICAgICAgICAgICAvLyBpZiBwYXRjaGluZyBhIHZhbHVlIGZyb20gb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50IGFzIHlvdSBkb24ndCBoYXZlXHJcbiAgICAgICAgICAgIC8vIHR5cGUgY2hlY2tpbmcgdGhlcmVcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1ByZWNpc2lvbiAmJiB0aGlzLmRlY2ltYWxzICYmICFpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0ZpeGVkKHRoaXMuZGVjaW1hbHMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQb3NpdGlvbiB0aGUgdW5pdHMgZWxlbWVudCBhbmQgc2V0IHRoZSBwYWRkaW5nIGluIHRoZSB0ZXh0Ym94IGlucHV0IGJhc2VkXHJcbiAgICAgKiBvbiB0aGUgd2lkdGggb2YgdGhlIHVuaXRzIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwb3NpdGlvblJpZ2h0VW5pdHMoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1yaWdodCcpO1xyXG4gICAgICAgIGxldCBpbnB1dEVsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG5cclxuICAgICAgICBpZiAodW5pdHNFbCAmJiBpbnB1dEVsKSB7XHJcbiAgICAgICAgICAgIGxldCB1bml0c1dpZHRoID0gdW5pdHNFbC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIGlmICh1bml0c1dpZHRoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51bml0c1dpZHRoQ2FsY3VsYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBwYWRkaW5nID0gdW5pdHNXaWR0aDtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpbnB1dEVsLCAncGFkZGluZy1yaWdodCcsIHBhZGRpbmcgKyAncHgnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgcG9zaXRpb25MZWZ0VW5pdHMoKSB7XHJcbiAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1sZWZ0Jyk7XHJcbiAgICAgICAgbGV0IGlucHV0RWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcblxyXG4gICAgICAgIGlmICh1bml0c0VsICYmIGlucHV0RWwpIHtcclxuICAgICAgICAgICAgbGV0IHVuaXRzV2lkdGggPSB1bml0c0VsLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHVuaXRzV2lkdGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuaXRzV2lkdGhDYWxjdWxhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHBhZGRpbmcgPSB1bml0c1dpZHRoO1xyXG4gICAgICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gZ2V0Q29tcHV0ZWRTdHlsZSh1bml0c0VsKS5sZWZ0O1xyXG4gICAgICAgICAgICBpZiAobGVmdFBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nICs9IHBhcnNlSW50KGxlZnRQb3NpdGlvbi5yZXBsYWNlKCdweCcsICcnKSwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpbnB1dEVsLCAncGFkZGluZy1sZWZ0JywgcGFkZGluZyArICdweCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhbmQgYXBwZW5kIHRoZSB1bml0cyBlbGVtZW50IHRvIHRoZSB0ZXh0Ym94IGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzaG93VW5pdHMoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGlucHV0V3JhcHBlciA9IHRoaXMudGV4dGJveEVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LXdyYXBwZXInKTtcclxuXHJcbiAgICAgICAgaWYgKGlucHV0V3JhcHBlcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0VW5pdHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bml0c0VsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudW5pdHMtbGVmdCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVuaXRzRWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHVuaXRzRWwsICdpbm5lckhUTUwnLCB0aGlzLmxlZnRVbml0cyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoaW5wdXRXcmFwcGVyLCB0aGlzLm1ha2VVbml0RWxlbWVudCgnbGVmdCcsIHRoaXMubGVmdFVuaXRzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFVuaXRzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0VW5pdHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bml0c0VsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudW5pdHMtcmlnaHQnKTtcclxuICAgICAgICAgICAgICAgIGlmICh1bml0c0VsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh1bml0c0VsLCAnaW5uZXJIVE1MJywgdGhpcy5yaWdodFVuaXRzKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChpbnB1dFdyYXBwZXIsIHRoaXMubWFrZVVuaXRFbGVtZW50KCdyaWdodCcsIHRoaXMucmlnaHRVbml0cykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvblJpZ2h0VW5pdHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1ha2VVbml0RWxlbWVudChzaWRlOiAnbGVmdCcgfCAncmlnaHQnLCB0ZXh0OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGxldCB1bml0c0VsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodW5pdHNFbCwgJ2NsYXNzJywgYHVuaXRzIHVuaXRzLSR7c2lkZX1gKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh1bml0c0VsLCAnaWQnLCBgJHt0aGlzLmlkfV91bml0c2ApO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHVuaXRzRWwsICdzdHlsZScsICdwb2ludGVyLWV2ZW50czogbm9uZScpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodW5pdHNFbCwgJ2lubmVySFRNTCcsIHRleHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdW5pdHNFbDtcclxuICAgIH1cclxufSIsIjxkaXYgY2xhc3M9XCJjb250cm9sIGNvbnRyb2wtbGFiZWwte3tsYWJlbFBvc2l0aW9ufX1cIlxyXG4gICAgIFtjbGFzcy5pbnZhbGlkXT1cImZvcm1Nb2RlbD8uaW52YWxpZCAmJiAoZm9ybU1vZGVsPy50b3VjaGVkKVwiPlxyXG4gICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxhYmVsICYmICFoZWxwUG9wb3ZlclwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaGFyZWRMYWJlbFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgPGRpdiAqbmdJZj1cImxhYmVsICYmIGhlbHBQb3BvdmVyXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNoYXJlZExhYmVsXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPGVjLWhlbHAtcG9wb3ZlciBpZD1cInt7aWR9fV9oZWxwUG9wb3ZlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm15LW4yIG14LW4xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJ7e2hlbHBQb3BvdmVyIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFBvc2l0aW9uPVwie3toZWxwUG9wb3ZlclBvc2l0aW9ufX1cIj5cclxuICAgICAgICAgICAgICA8L2VjLWhlbHAtcG9wb3Zlcj5cclxuICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hhcmVkTGFiZWw+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIG5nUHJlc2VydmVXaGl0ZXNwYWNlcz5cclxuICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJsYWJlbFwiPnt7bGFiZWwgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCAmJiBmb3JtTW9kZWw/LnRvdWNoZWQgJiYgZm9ybU1vZGVsPy5pbnZhbGlkXCI+e3t2YWxpZGF0aW9uRXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICA8IS0tIFNldHRpbmcgdGhlIG1heGxlbmd0aCB0byAxMyB0byBjb21iYXQgdGhlIHVzZXIgZnJvbSBlbnRlcmluZyB0b28gbGFyZ2Ugb2YgYSBudW1iZXJcclxuICAgICAgICAgZm9yIGphdmFzY3JpcHQgdG8gc3VwcG9ydC4gIElmIHRoZSB1c2VyIGVudGVycyBhbGwgMTMgY2hhcmFjdGVycyBhcyBudW1iZXJzIGFuZCB3ZSBoYXZlIHNob3dQcmVjaXNpb24gc2V0LCBhZGRpbmcgdGhlXHJcbiAgICAgICAgIGRlY2ltYWwgYW5kIHRoZSBlbXB0eSB6ZXJvIGNoYXJhY3RlcnMgd2lsbCBnZXQgdGhlbSBpbiBhIHNpdHVhdGlvbiB3aGVyZSB0byBlZGl0IGl0IHRoZXkgbXVzdCByZW1vdmUgY2hhcmFjdGVyc1xyXG4gICAgICAgICBhcyB3ZSB3b3VsZCBwdXNoIHRoZW0gcGFzdCB0aGUgbGltaXQgLS0+XHJcbiAgICAgICA8ZWMtdGV4dGJveCBbaWRdPVwiaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgI3RleHRib3hcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udHJvbC1pbnB1dCBtYi0wXCJcclxuICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIm1heFByZWNpc2lvbkRpZ2l0cyA/IG1heFByZWNpc2lvbkRpZ2l0cyArIDMgOiAxM1wiXHJcbiAgICAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXHJcbiAgICAgICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cInRleHRib3hGb3JtTW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwidG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCI+XHJcbiAgICAgICA8L2VjLXRleHRib3g+XHJcbjwvZGl2PiJdfQ==
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpY2JveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbnVtZXJpY2JveC9udW1lcmljYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9udW1lcmljYm94L251bWVyaWNib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBMEQsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pLLE9BQU8sRUFBbUIsa0JBQWtCLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7QUFHaEU7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUF1QixFQUFFLEdBQXVCLEVBQUUsUUFBNEIsRUFBRSxrQkFBc0MsRUFBZSxFQUFFO0lBQ3hLLE9BQU8sQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDaEMsSUFBSSxRQUFRLEdBQVksS0FBSyxDQUFDO1FBRTlCLCtFQUErRTtRQUMvRSwwREFBMEQ7UUFDMUQsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFO1lBRXZDLElBQUksY0FB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VCxXQUFXO3NCQUExQixLQUFLO2dCQU1VLFFBQVE7c0JBQXZCLEtBQUs7Z0JBT1UsYUFBYTtzQkFBNUIsS0FBSztnQkFTVSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBVVUsR0FBRztzQkFBbEIsS0FBSztnQkFVVSxHQUFHO3NCQUFsQixLQUFLO2dCQU1VLFNBQVM7c0JBQXhCLEtBQUs7Z0JBTVUsVUFBVTtzQkFBekIsS0FBSztnQkFNVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBS21FLFNBQVM7c0JBQWpGLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBc0JmLFlBQVk7c0JBQTNELFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS92YWxpZGF0aW9uLW1lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IGdldERlY2ltYWxQYXR0ZXJuLCBpbnRlZ2VyUGF0dGVybiB9IGZyb20gJy4uLy4uL2NvcmUvdmFsaWRhdGlvbi1wYXR0ZXJucyc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cEhlbHBlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtLWdyb3VwLmhlbHBlcic7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sQmFzZSB9IGZyb20gXCIuLi9mb3JtLWNvbnRyb2wtYmFzZVwiO1xyXG5pbXBvcnQgeyBUZXh0Ym94Q29tcG9uZW50IH0gZnJvbSAnLi4vdGV4dGJveC90ZXh0Ym94LmNvbXBvbmVudCc7XHJcblxyXG5cclxuLyoqXHJcbiAqIEN1c3RvbSB2YWxpZGF0b3IgdG8gY2hlY2sgdGhhdCBtaW4vbWF4IGFuZCBwYXR0ZXJuIHZhbGlkYXRpb24gaXMgbWV0IG9uIHRoZSBudW1lcmljYm94XHJcbiAqIGNvbXBvbmVudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG51bWVyaWNib3hWYWxpZGF0aW9uID0gKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkLCBtYXg6IG51bWJlciB8IHVuZGVmaW5lZCwgZGVjaW1hbHM6IG51bWJlciB8IHVuZGVmaW5lZCwgbWF4UHJlY2lzaW9uRGlnaXRzOiBudW1iZXIgfCB1bmRlZmluZWQpOiBWYWxpZGF0b3JGbiA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICAgIGxldCBoYXNFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgY29udHJvbCBpcyBlbXB0eSB3ZSB3b24ndCBhdHRlbXB0IHRvIHZhbGlkYXRlLCBpZiB0aGVyZSBpcyBhIHJlcXVpcmVkXHJcbiAgICAgICAgLy8gdmFsaWRhdG9yIHdlIHdpbGwgbmV2ZXIgZ2V0IGhlcmUgdW50aWwgdGhlcmUgaXMgYSB2YWx1ZVxyXG4gICAgICAgIGlmIChjb250cm9sLnZhbHVlICYmIGNvbnRyb2wudmFsdWUgIT09IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBudW1lcmljUGF0dGVybjogUmVnRXhwO1xyXG4gICAgICAgICAgICBpZiAoZGVjaW1hbHMgJiYgZGVjaW1hbHMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBudW1lcmljUGF0dGVybiA9IGdldERlY2ltYWxQYXR0ZXJuKGRlY2ltYWxzKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhQcmVjaXNpb25EaWdpdHMpIHtcclxuICAgICAgICAgICAgICAgIC8vIFN0aWxsIG5lZWQgdG8gY2hlY2sgZm9yIGEgdmFsaWQgbnVtYmVyIGZvcm1hdHRpbmcgd2hlbiBpbiBtYXggcHJlY2lzaW9uIG1vZGVcclxuICAgICAgICAgICAgICAgIG51bWVyaWNQYXR0ZXJuID0gZ2V0RGVjaW1hbFBhdHRlcm4obWF4UHJlY2lzaW9uRGlnaXRzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIEFsbG93IGFuIG9wdGlvbmFsIG5lZ2F0aXZlIHNpZ24gYW5kIGFueSBudW1iZXIgb2YgZGlnaXRzIDAtOVxyXG4gICAgICAgICAgICAgICAgbnVtZXJpY1BhdHRlcm4gPSBpbnRlZ2VyUGF0dGVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFudW1lcmljUGF0dGVybi50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4UHJlY2lzaW9uRGlnaXRzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIHRvIGEgbnVtYmVyIHRoZW4gYmFjayB0byBzdHJpbmcgcmVtb3ZlcyB0cmFpbGluZyB6ZXJvcywgYW5kIHRoZSByZWdleCByZXBsYWNlIHJlbW92ZXNcclxuICAgICAgICAgICAgICAgIC8vIGFueSBuZWdhdGl2ZSBzaWducywgbGVhZGluZyB6ZXJvcyBvciBkZWNpbWFsIHBvaW50cyBmcm9tIHRoZSBudW1iZXIuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBOdW1iZXIoY29udHJvbC52YWx1ZSkudG9TdHJpbmcoKS5yZXBsYWNlKC9eLT8vLCAnJykucmVwbGFjZSgvKF4wXFwuKXwoXFwuKS8sICcnKTtcclxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdmFsLmxlbmd0aCA+IG1heFByZWNpc2lvbkRpZ2l0cztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gV2Ugbm93IGtub3cgd2UgaGF2ZSBhIHZhbGlkIG51bWJlciwgc28gd2UgY2FuIGNhc3QgdGhlc2UgdG8gbnVtYmVyc1xyXG4gICAgICAgICAgICAvLyBmb3IgcHJvcGVyIHJhbmdlIHZhbGlkYXRpb25cclxuICAgICAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIE51bWJlcihjb250cm9sLnZhbHVlKSA8IG1pbikge1xyXG4gICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyKGNvbnRyb2wudmFsdWUpID4gbWF4KSB7XHJcbiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChoYXNFcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgbnVtZXJpY2JveDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBtaW46IG1pbixcclxuICAgICAgICAgICAgICAgICAgICBtYXg6IG1heCxcclxuICAgICAgICAgICAgICAgICAgICBkZWNpbWFsczogZGVjaW1hbHMsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4UHJlY2lzaW9uRGlnaXRzOiBtYXhQcmVjaXNpb25EaWdpdHNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VjLW51bWVyaWNib3gnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL251bWVyaWNib3guY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbnVtZXJpY2JveC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTnVtZXJpY2JveENvbXBvbmVudCBleHRlbmRzIEZvcm1Db250cm9sQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdGV4dGJveCBpbnB1dCdzIHBsYWNlaG9sZGVyXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBudW1iZXIgb2YgZGVjaW1hbHMgYWxsb3dlZC4gIElmIG5vdCBzdXBwbGllZCB0aGUgaW5wdXQgdmFsdWUgd2lsbCBiZSB2YWxpZGF0ZWQgYXMgYVxyXG4gICAgICogd2hvbGUgbnVtYmVyXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkZWNpbWFscz86IG51bWJlcjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IHRyYWlsaW5nIHplcm9zIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LlxyXG4gICAgICogRG8gbm90IHVzZSB3aXRoIG1heFByZWNpc2lvbkRpZ2l0cy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dQcmVjaXNpb24/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1heGltdW0gdG90YWwgZGlnaXRzIGEgbnVtYmVyIGNhbiBoYXZlIGxlZnQgb3IgcmlnaHQgb2YgdGhlIGRlY2ltYWwgcG9pbnQuXHJcbiAgICAgKiBEdWUgdG8gbGltaXRhdGlvbnMgd2l0aCBob3cgSlMgaGFuZGxlcyBudW1iZXJzLCB0aGUgbWF4IHZhbHVlIGZvciB0aGlzIGlzIDE1LlxyXG4gICAgICogTnVtYmVycyBsb25nZXIgdGhhbiAxNSBkaWdpdHMgbWF5IGNhdXNlIHJvdW5kaW5nIGVycm9ycy5cclxuICAgICAqIERvIG5vdCB1c2Ugd2l0aCBzaG93UHJlY2lzaW9uID0gdHJ1ZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4UHJlY2lzaW9uRGlnaXRzPzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXhpbXVtIHZhbHVlIGFsbG93ZWQgaW4gdGhlIGlucHV0XHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpcyBmb3IgYWRkaW5nIHRoZSBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBicm93c2VyIGZ1bmN0aW9uYWxpdHlcclxuICAgICAqIGZyb20gdGhlIGlucHV0LiAgSWYgeW91IG5lZWQgdGhlIGZvcm0gdG8gYmUgdmFsaWRhdGVkIGJlZm9yZSBzdWJtaXNzaW9uLCBhcHBseSB0aGVcclxuICAgICAqIG1heCB2YWxpZGF0b3IgdG8gdGhlIGZvcm0gY29ucm9sLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4PzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtaW5pbXVtIHZhbHVlIGFsbG93ZWQgaW4gdGhlIGlucHV0XHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpcyBmb3IgYWRkaW5nIHRoZSBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBicm93c2VyIGZ1bmN0aW9uYWxpdHlcclxuICAgICAqIGZyb20gdGhlIGlucHV0LiAgSWYgeW91IG5lZWQgdGhlIGZvcm0gdG8gYmUgdmFsaWRhdGVkIGJlZm9yZSBzdWJtaXNzaW9uLCBhcHBseSB0aGVcclxuICAgICAqIG1pbiB2YWxpZGF0b3IgdG8gdGhlIGZvcm0gY29ucm9sLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluPzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbnB1dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbGVmdFVuaXRzPzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaW5wdXRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHJpZ2h0VW5pdHM/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBzZXQgdG8gdHJ1ZSB0aGlzIHdpbGwgdXBkYXRlIHRoZSBmb3JtIG1vZGVsIGFmdGVyIGEgZGVib3VuY2UgYXMgdGhlIHVzZXJcclxuICAgICAqIGludGVyYWN0cyB3aXRoIHRoZSBjb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGF1dG9VcGRhdGVGb3JtTW9kZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSB0ZXh0Ym94IGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChUZXh0Ym94Q29tcG9uZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHRleHRib3hFbCE6IEVsZW1lbnRSZWY7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGludGVybmFsIGZvcm0gbW9kZWwgd2UgdXNlIHRvIGRpc3BsYXkgdGhlIHZhbHVlIHdpdGggZm9ybWF0dGluZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdGV4dGJveEZvcm1Nb2RlbCE6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuXHJcbiAgICAvKiogRmxhZyB0byB0ZWxsIHRoZSBwYWdlIHdlIGZpbmFsbHkgY29tcHV0ZWQgYSBncmVhdGVyIHRoYW4gemVyb1xyXG4gICAgICogIHdpZHRoIGZvciB1bml0cyAoaWYgYXBwbGljYWJsZSlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1bml0c1dpZHRoQ2FsY3VsYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBGbGFnIHVzZWQgdG8gZmlsdGVyIHRoZSBmb3JtIG1vZGVscyB2YWx1ZSBjaGFuZ2VzIHN1YnNjcmlwdGlvblxyXG4gICAgICogIHRvIHByZXZlbnQgdGhlIHRleHRib3ggbW9kZWwgZnJvbSBiZWluZyBmb3JtYXR0ZWQgYXMgdGhlIGZvcm0gbW9kZWwgaXMgdXBkYXRlZFxyXG4gICAgICogIHByb2dyYW1tYXRpY2FsbHkgd2hlbiB0aGUgdGV4dGJveCBtb2RlbCB1cGRhdGVzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXV0b1VwZGF0aW5nRm9ybU1vZGVsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICogUmVmZXJlbmNlIHRvIHRoZSB0ZXh0Ym94IGlucHV0IGNvbnRyb2xcclxuICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ3RleHRib3gnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHRleHRib3hJbnB1dCE6IFRleHRib3hDb21wb25lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJvdGVjdGVkIHZhbGlkYXRpb25NZXNzYWdlU2VydmljZTogVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBmb3JtR3JvdXBIZWxwZXI6IEZvcm1Hcm91cEhlbHBlcixcclxuICAgICAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMlxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIodmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLCBmb3JtR3JvdXBIZWxwZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW5ndWxhciBBZnRlclZpZXdJbml0IGxpZmUtY3ljbGUgaG9va1xyXG4gICAgICogU3Vic2NyaWJlIHRvIHRleHRib3ggbW9kZWwgdmFsdWUgY2hhbmdlcyBpZiB0aGUgaG9zdGluZ1xyXG4gICAgICogcGFnZSBoYXMgb3B0ZWQgaW4gZm9yIHRoaXMgY29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1VwZGF0ZUZvcm1Nb2RlbCkge1xyXG4gICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcclxuICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZCksXHJcbiAgICAgICAgICAgICAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtTW9kZWxWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW5ndWxhciBvbkNoYW5nZXMgbGlmZS1jeWNsZSBob29rXHJcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzIHwgTGlmZS1jeWNsZSBob29rc31cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICAvLyBJZiBlaXRoZXIgdW5pdHMgY2hhbmdlIGFmdGVyIHdlJ3ZlIGNhbGN1bGF0ZWQsXHJcbiAgICAgICAgLy8gcmVzZXQgdGhlIGZsYWcgc28gd2UgY2FuIHJlYWN0IGFuZCByZWRyYXdcclxuICAgICAgICBpZiAoY2hhbmdlcy5yaWdodFVuaXRzIHx8IGNoYW5nZXMubGVmdFVuaXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5pdHNXaWR0aENhbGN1bGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuZ3VsYXIgb25Jbml0IGxpZmVjeWNsZSBob29rXHJcbiAgICAgKiBJZiB1bml0cyBpcyBkZWZpbmVkLCBzZXQgdGhlIHBvc2l0aW9uIGFuZCBsaXN0ZW4gZm9yIHN0YXR1cyBjaGFuZ2VzIHNvIHdlXHJcbiAgICAgKiBjYW4gdXBkYXRlIHRoZSBwb3NpdGlvbmluZyBvZiB0aGUgdW5pdHMgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdGV4dGJveCBmb3JtIG1vZGVsIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBmb3JtIG1vZGVsIGFuZCBzeW5jaHJvbml6ZVxyXG4gICAgICAgIC8vIGRpc2FibGVkIHN0YXRlXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiB0aGlzLmZvcm1Nb2RlbC52YWx1ZSwgZGlzYWJsZWQ6IHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkIH0pO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGZvcm0gbW9kZWwncyBlcnJvcnMgd2hlbiB0aGUgdGV4dGJveCBmb3JtIG1vZGVsIHN0YXR1cyBjaGFuZ2VzXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnN0YXR1c0NoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtTW9kZWwuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lcnJvcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLy8gU3luY2hyb25pemUgZGlzYWJsZWQgc3RhdGUgYmV0d2VlbiBmb3JtIG1vZGVsIGFuZCBpbnRlcm5hbCB0ZXh0Ym94IGZvcm0gbW9kZWxcclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC5zdGF0dXNDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lbmFibGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGV4dGJveCB2YWxpZGF0b3JzXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbGlkYXRvcnModGhpcy5nZXRWYWxpZGF0b3JzKCkpO1xyXG5cclxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgdGV4dGJveCBpcyBzZXQgdXAgd2Ugd2lsbCBzZXQgaXQncyB2YWx1ZSB0byB3aGF0ZXZlciB0aGVcclxuICAgICAgICAvLyBmb3JtIG1vZGVsIGhhZCB3aGVuIHdlIGluaXRpYWxpemVkXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKHRoaXMuZm9ybWF0RGlzcGxheU51bWJlcih0aGlzLmZvcm1Nb2RlbC52YWx1ZSkpO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgZm9ybSBtb2RlbCdzIHZhbHVlIGNoYW5nZXMgcHJvZ3JhbW1hdGljYWxseSB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGVcclxuICAgICAgICAvLyB0ZXh0Ym94IGZvcm0gbW9kZWxcclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaWx0ZXIgb3V0IHdoZW4gd2UgYXJlIHVwZGF0aW5nIGl0IHByb2dyYW1tYXRpY2FsbHkgaWYgdGhlXHJcbiAgICAgICAgICAgIC8vIGhvc3RpbmcgcGFnZSBoYXMgb3B0ZWQgaW50byB0aGUgYXV0byB1cGRhdGluZyBpbnB1dFxyXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuYXV0b1VwZGF0aW5nRm9ybU1vZGVsKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdERpc3BsYXlOdW1iZXIodmFsdWUpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSB0ZXh0Ym94IHN0YXR1cyBjaGFuZ2VzIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBsZWZ0IHVuaXRzIHBvc2l0aW9uIGJlY2F1c2VcclxuICAgICAgICAvLyB3ZSB3YW50IHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGludmFsaWQgaWNvblxyXG4gICAgICAgIGlmICh0aGlzLmxlZnRVbml0cykge1xyXG4gICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFVuaXRzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbmd1bGFyIGFmdGVyVmlld0NoZWNrZWQgbGlmZWN5Y2xlIGhvb2tcclxuICAgICAqIFNob3cgdGhlIHVuaXRzIGVsZW1lbnQgaWYgdW5pdHMgaXMgZGVmaW5lZC4gUnVucyBhZnRlciBldmVyeSBuZ09uQ2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICgodGhpcy5sZWZ0VW5pdHMgfHwgdGhpcy5yaWdodFVuaXRzKSAmJiAhdGhpcy51bml0c1dpZHRoQ2FsY3VsYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dVbml0cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRoYXQgYnVpbGRzIGFuZCByZXR1cm5zIGEgVmFsaWRhdG9yRm4gYXJyYXkgdG8gc2V0IG9uIHRoZSBmb3JtIGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRWYWxpZGF0b3JzKCk6IFZhbGlkYXRvckZuW10ge1xyXG4gICAgICAgIGxldCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChudW1lcmljYm94VmFsaWRhdGlvbih0aGlzLm1pbiwgdGhpcy5tYXgsIHRoaXMuZGVjaW1hbHMsIHRoaXMubWF4UHJlY2lzaW9uRGlnaXRzKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB2YWxpZGF0b3JzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgb3V0IGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBUZXh0Ym94IGNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25Gb2N1c091dCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1Nb2RlbFZhbHVlKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGdW5jdGlvbiB0byBzZXQgZm9jdXMgb24gYW4gaW5wdXQgcHJvZ3JhbWF0aWNhbGx5IGFmdGVyIHRoZSBwYWdlXHJcbiAgICAqIGhhZCBiZWVuIHJlbmRlcmVkLiAgVGhlIGhpZ2hsaWdodCB0ZXh0IGZsYWcgd2lsbCBzZWxlY3QgdGhlIHRleHRcclxuICAgICogd2l0aGluIHRoZSBpbnB1dCBpZiBwYXNzZWQgaW4gYW5kIHRydWVcclxuICAgICovXHJcbiAgICBwdWJsaWMgc2V0Rm9jdXMoaGlnaGxpZ2h0VGV4dD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRleHRib3hJbnB1dC5zZXRGb2N1cyhoaWdobGlnaHRUZXh0KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIHRoZSB0ZXh0Ym94IG1vZGVsIHVwZGF0ZXMgd2UgbmVlZCB0byBhZGQgc29tZSBkaXNwbGF5IGZvcm1hdHRpbmcgZm9yXHJcbiAgICAgKiBkaXNwbGF5IGluIHRoZSB0ZXh0Ym94IGFuZCBjYXN0IHRoZSB0ZXh0Ym94IG1vZGVsIHRvIGEgbnVtYmVyLiBBdm9pZCB1cGRhdGluZ1xyXG4gICAgICogdGhlIGZvcm0gbW9kZWwgd2hlbiB0aGUgdmFsdWUgZG9lc24ndCBjaGFuZ2UgYmVjYXVzZSBsaXN0ZW5lcnMgd2lsbCBmaXJlIGZvciBubyByZWFzb25cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVGb3JtTW9kZWxWYWx1ZShpc0ZvY3VzT3V0PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9VcGRhdGVGb3JtTW9kZWwpIHtcclxuICAgICAgICAgICAgLy8gTWFrZSBpdCBzbyB2YWx1ZSBjaGFuZ2VzIG9uIHRoZSBmb3JtIG1vZGVsIGRvIG5vdCBnZXQgdHJpZ2dlcmVkXHJcbiAgICAgICAgICAgIC8vIGFzIHdlIGNoYW5nZSBpdCBwcm9ncmFtbWF0aWNhbGx5LiAgV2UgZG8gbm90IHdhbnQgdGhlIHRleHRib3hcclxuICAgICAgICAgICAgLy8gbW9kZWwgdG8gYmUgdXBkYXRlZCB3aGlsZSB0aGUgdXNlciBpcyBpbiB0aGUgaW5wdXRcclxuICAgICAgICAgICAgdGhpcy5hdXRvVXBkYXRpbmdGb3JtTW9kZWwgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWxpZCB8fCB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG91dCB3aXRoIG51bGwgZm9yIHRoZSBudW1iZXIsIGlmIHRoZSB0ZXh0Ym94IHZhbHVlIGlzIG5vdCBhIG51bWJlclxyXG4gICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBjbGVhciBpdCBvdXQgb24gZm9jdXMgb3V0XHJcbiAgICAgICAgICAgICAgICBsZXQgbnVtYmVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRleHRib3ggbW9kZWwgaXMgYSBudW1iZXIgYmVmb3JlIHRyeWluZyB0byB1cGRhdGUgdGhlXHJcbiAgICAgICAgICAgICAgICAvLyBmb3JtIG1vZGVsIHZhbHVlIHdpdGggaXRcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgJiYgIWlzTmFOKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBPdXIgdmFsdWUgaXMgYSBsZWdpdCBudW1iZXIsIG9uIGZvY3VzIG91dCB3ZSB3aWxsIGZvcm1hdCBpdCBpZiBuZWVkZWRcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSBOdW1iZXIodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBpZiBub3QgZG9uJ3Qgc2V0IHRoZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHRvIGF2b2lkIGV4dHJhIGxpc3RlbmVyIGNhbGxzXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybU1vZGVsLnZhbHVlICE9PSBudW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0VmFsdWUobnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRleHRib3ggbW9kZWwgaXMgbm90IGEgbnVtYmVyLCBjaGVjayB0byBzZWUgaWYgb3VyIGZvcm0gbW9kZWwgaGFzIGEgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaWYgc28gY2xlYXIgaXQgb3V0XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybU1vZGVsLnZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gV2Ugb25seSB3aWxsIHVwZGF0ZSB0aGUgdGV4dGJveCBmb3JtIG1vZGVsIHdpdGggZm9ybWF0dGluZyBpZiBuZWVkZWRcclxuICAgICAgICAgICAgICAgIC8vIG9uIEZvY3VzIG91dC4gIFRoaXMgd29ya3Mgd2VsbCBmb3IgdGhlIHVzZXIgd2hldGhlciB0aGUgYXV0byB1cGRhdGVcclxuICAgICAgICAgICAgICAgIC8vIGlzIG9wdGVkIGluIG9yIG5vdFxyXG4gICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNPdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUodGhpcy5mb3JtYXREaXNwbGF5TnVtYmVyKG51bWJlcikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgLy8gTm90aGluZyB0byBkaXNwbGF5LCBqdXN0IGVuc3VyaW5nIHdlIHJlc2V0IG91ciBmbGFnIHRoYXQgZmlsdGVyc1xyXG4gICAgICAgICAgICAvLyB0aGUgZm9ybSBtb2RlbCB2YWx1ZSBjaGFuZ2VzXHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvVXBkYXRpbmdGb3JtTW9kZWwgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0IGEgbnVtYmVyIHZhbHVlIHRvIHRoZSBmb3JtbWF0ZWQgZGlzcGxheSBzdHJpbmcuIElmIHRoZXJlIGlzIG5vIHZhbHVlXHJcbiAgICAgKiByZXR1cm4gbnVsbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZvcm1hdERpc3BsYXlOdW1iZXIodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBpZiAodmFsdWUgfHwgdmFsdWUgPT09IDApIHtcclxuICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBjYWxsaW5nIHRvRml4ZWQgaWYgdGhlIHZhbHVlIGlzbid0IGEgbnVtYmVyLiAgVGhpcyBpcyBwb3NzaWJsZVxyXG4gICAgICAgICAgICAvLyBpZiBwYXRjaGluZyBhIHZhbHVlIGZyb20gb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50IGFzIHlvdSBkb24ndCBoYXZlXHJcbiAgICAgICAgICAgIC8vIHR5cGUgY2hlY2tpbmcgdGhlcmVcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1ByZWNpc2lvbiAmJiB0aGlzLmRlY2ltYWxzICYmICFpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0ZpeGVkKHRoaXMuZGVjaW1hbHMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQb3NpdGlvbiB0aGUgdW5pdHMgZWxlbWVudCBhbmQgc2V0IHRoZSBwYWRkaW5nIGluIHRoZSB0ZXh0Ym94IGlucHV0IGJhc2VkXHJcbiAgICAgKiBvbiB0aGUgd2lkdGggb2YgdGhlIHVuaXRzIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwb3NpdGlvblJpZ2h0VW5pdHMoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1yaWdodCcpO1xyXG4gICAgICAgIGxldCBpbnB1dEVsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG5cclxuICAgICAgICBpZiAodW5pdHNFbCAmJiBpbnB1dEVsKSB7XHJcbiAgICAgICAgICAgIGxldCB1bml0c1dpZHRoID0gdW5pdHNFbC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIGlmICh1bml0c1dpZHRoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51bml0c1dpZHRoQ2FsY3VsYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBwYWRkaW5nID0gdW5pdHNXaWR0aDtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpbnB1dEVsLCAncGFkZGluZy1yaWdodCcsIHBhZGRpbmcgKyAncHgnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgcG9zaXRpb25MZWZ0VW5pdHMoKSB7XHJcbiAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1sZWZ0Jyk7XHJcbiAgICAgICAgbGV0IGlucHV0RWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcblxyXG4gICAgICAgIGlmICh1bml0c0VsICYmIGlucHV0RWwpIHtcclxuICAgICAgICAgICAgbGV0IHVuaXRzV2lkdGggPSB1bml0c0VsLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHVuaXRzV2lkdGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuaXRzV2lkdGhDYWxjdWxhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHBhZGRpbmcgPSB1bml0c1dpZHRoO1xyXG4gICAgICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gZ2V0Q29tcHV0ZWRTdHlsZSh1bml0c0VsKS5sZWZ0O1xyXG4gICAgICAgICAgICBpZiAobGVmdFBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nICs9IHBhcnNlSW50KGxlZnRQb3NpdGlvbi5yZXBsYWNlKCdweCcsICcnKSwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpbnB1dEVsLCAncGFkZGluZy1sZWZ0JywgcGFkZGluZyArICdweCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhbmQgYXBwZW5kIHRoZSB1bml0cyBlbGVtZW50IHRvIHRoZSB0ZXh0Ym94IGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzaG93VW5pdHMoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGlucHV0V3JhcHBlciA9IHRoaXMudGV4dGJveEVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LXdyYXBwZXInKTtcclxuXHJcbiAgICAgICAgaWYgKGlucHV0V3JhcHBlcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0VW5pdHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bml0c0VsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudW5pdHMtbGVmdCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVuaXRzRWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHVuaXRzRWwsICdpbm5lckhUTUwnLCB0aGlzLmxlZnRVbml0cyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoaW5wdXRXcmFwcGVyLCB0aGlzLm1ha2VVbml0RWxlbWVudCgnbGVmdCcsIHRoaXMubGVmdFVuaXRzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFVuaXRzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0VW5pdHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bml0c0VsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudW5pdHMtcmlnaHQnKTtcclxuICAgICAgICAgICAgICAgIGlmICh1bml0c0VsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh1bml0c0VsLCAnaW5uZXJIVE1MJywgdGhpcy5yaWdodFVuaXRzKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChpbnB1dFdyYXBwZXIsIHRoaXMubWFrZVVuaXRFbGVtZW50KCdyaWdodCcsIHRoaXMucmlnaHRVbml0cykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvblJpZ2h0VW5pdHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1ha2VVbml0RWxlbWVudChzaWRlOiAnbGVmdCcgfCAncmlnaHQnLCB0ZXh0OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGxldCB1bml0c0VsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodW5pdHNFbCwgJ2NsYXNzJywgYHVuaXRzIHVuaXRzLSR7c2lkZX1gKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh1bml0c0VsLCAnaWQnLCBgJHt0aGlzLmlkfV91bml0c2ApO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHVuaXRzRWwsICdzdHlsZScsICdwb2ludGVyLWV2ZW50czogbm9uZScpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodW5pdHNFbCwgJ2lubmVySFRNTCcsIHRleHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdW5pdHNFbDtcclxuICAgIH1cclxufSIsIjxkaXYgY2xhc3M9XCJjb250cm9sIGNvbnRyb2wtbGFiZWwte3tsYWJlbFBvc2l0aW9ufX1cIlxyXG4gICAgIFtjbGFzcy5pbnZhbGlkXT1cImZvcm1Nb2RlbD8uaW52YWxpZCAmJiAoZm9ybU1vZGVsPy50b3VjaGVkKVwiPlxyXG5cclxuICAgICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3tsYWJlbCB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidmFsaWRhdGlvbkVycm9ycy5sZW5ndGggJiYgZm9ybU1vZGVsPy50b3VjaGVkICYmIGZvcm1Nb2RlbD8uaW52YWxpZFwiPiZuYnNwO3t7dmFsaWRhdGlvbkVycm9ycyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxlYy1oZWxwLXBvcG92ZXIgaWQ9XCJ7e2lkfX1faGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoZWxwUG9wb3ZlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtaW5saW5lLWJsb2NrIG15LW4yIG14LW4xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJ7e2hlbHBQb3BvdmVyIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFBvc2l0aW9uPVwie3toZWxwUG9wb3ZlclBvc2l0aW9ufX1cIj5cclxuICAgICAgICAgICAgICA8L2VjLWhlbHAtcG9wb3Zlcj5cclxuICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgPCEtLSBTZXR0aW5nIHRoZSBtYXhsZW5ndGggdG8gMTMgdG8gY29tYmF0IHRoZSB1c2VyIGZyb20gZW50ZXJpbmcgdG9vIGxhcmdlIG9mIGEgbnVtYmVyXHJcbiAgICAgICAgIGZvciBqYXZhc2NyaXB0IHRvIHN1cHBvcnQuICBJZiB0aGUgdXNlciBlbnRlcnMgYWxsIDEzIGNoYXJhY3RlcnMgYXMgbnVtYmVycyBhbmQgd2UgaGF2ZSBzaG93UHJlY2lzaW9uIHNldCwgYWRkaW5nIHRoZVxyXG4gICAgICAgICBkZWNpbWFsIGFuZCB0aGUgZW1wdHkgemVybyBjaGFyYWN0ZXJzIHdpbGwgZ2V0IHRoZW0gaW4gYSBzaXR1YXRpb24gd2hlcmUgdG8gZWRpdCBpdCB0aGV5IG11c3QgcmVtb3ZlIGNoYXJhY3RlcnNcclxuICAgICAgICAgYXMgd2Ugd291bGQgcHVzaCB0aGVtIHBhc3QgdGhlIGxpbWl0IC0tPlxyXG4gICAgICAgPGVjLXRleHRib3ggW2lkXT1cImlkXCJcclxuICAgICAgICAgICAgICAgICAgICN0ZXh0Ym94XHJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtaW5wdXQgbWItMFwiXHJcbiAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtYXhQcmVjaXNpb25EaWdpdHMgPyBtYXhQcmVjaXNpb25EaWdpdHMgKyAzIDogMTNcIlxyXG4gICAgICAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgW2Zvcm1Nb2RlbF09XCJ0ZXh0Ym94Rm9ybU1vZGVsXCJcclxuICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cInRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoKVwiPlxyXG4gICAgICAgPC9lYy10ZXh0Ym94PlxyXG48L2Rpdj4iXX0=