@nova-ui/bits
Version:
SolarWinds Nova Framework
237 lines • 43.3 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, Renderer2, ViewChild, ViewContainerRef, ViewEncapsulation, } from "@angular/core";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import { CHECKBOX_KEYDOWN_EVENT, DOCUMENT_CLICK_EVENT, } from "../../constants/event.constants";
import { KEYBOARD_CODE } from "../../constants/keycode.constants";
import { EventBusService } from "../../services/event-bus.service";
import { NuiFormFieldControl } from "../form-field/public-api";
import * as i0 from "@angular/core";
import * as i1 from "../../services/event-bus.service";
import * as i2 from "@angular/common";
/**
* <nui-checkbox> provides the same functionality as a native
* <input type="checkbox"> enhanced with NUI styling.
* <example-url>./../examples/index.html#/checkbox</example-url>
*/
export class CheckboxComponent {
/**
* Input to set aria label text
*/
get ariaLabel() {
return this._ariaLabel;
}
// changing the value with regular @Input doesn't trigger change detection
// so we need to do that manually in the setter
set ariaLabel(value) {
if (value !== this._ariaLabel) {
this._ariaLabel = value;
this.changeDetector.markForCheck();
}
}
/**
* Sets "checked" attribute for inner input element of nui-checkbox
*/
get checked() {
return this._checked;
}
set checked(val) {
if (this._checked !== val) {
this.changeDetector.markForCheck();
}
this._checked = val;
}
/**
* Used for disabling of nui-checkbox
*/
get disabled() {
return this._disabled;
}
set disabled(val) {
if (this._disabled !== val) {
this.changeDetector.markForCheck();
}
this._disabled = val;
}
constructor(changeDetector, eventBusService, renderer) {
this.changeDetector = changeDetector;
this.eventBusService = eventBusService;
this.renderer = renderer;
/** Users ca specify the 'aria-labelledby' which will be set to the input element */
this.ariaLabelledby = null;
/**
* Sets "title" attribute for nui-checkbox label
*/
this.title = "";
/**
* Event that is fired when nui-checkbox is toggled
*/
this.valueChange = new EventEmitter();
this._ariaLabel = "Checkbox";
this.keysAction = [KEYBOARD_CODE.SPACE, KEYBOARD_CODE.ENTER].map(String);
}
ngAfterViewInit() {
this.rendererListener = this.renderer.listen(this.checkboxLabel.nativeElement, "keydown", (event) => {
this.eventBusService
.getStream(CHECKBOX_KEYDOWN_EVENT)
.next(event);
});
this.sub = this.eventBusService
.getStream(CHECKBOX_KEYDOWN_EVENT)
.subscribe((event) => {
if (event.target === this.checkboxLabel.nativeElement) {
if (this.keysAction.includes(event.code)) {
event.stopPropagation();
event.preventDefault();
if (!this.disabled) {
this.handleKeyboardActions();
}
}
}
});
}
getAriaChecked() {
if (this.checked) {
return "true";
}
return this.indeterminate ? "mixed" : "false";
}
/**
* Used for changing of css style when nui-checkbox is hovered
*/
hoverHandler() {
this.hovered = !this.hovered;
}
/**
* nui-checkbox check/uncheck state handler
* @param event Changed nui-checkbox component
*/
changeHandler(event) {
this.valueChange.emit(event);
const checked = !!event.target?.checked;
this.onChange(checked);
this.onTouched();
this.writeValue(checked);
}
onClick(event) {
event.stopPropagation();
this.eventBusService.getStream(DOCUMENT_CLICK_EVENT).next(event);
}
onChange(value) { }
onTouched() { }
writeValue(value) {
this.checked = value;
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
ngOnDestroy() {
if (this.rendererListener) {
this.rendererListener();
}
if (this.sub) {
this.sub.unsubscribe();
}
}
handleKeyboardActions() {
if (this.indeterminate) {
this.inputViewContainer.element.nativeElement.checked = true;
this.indeterminate = false;
}
else {
this.inputViewContainer.element.nativeElement.checked =
!this.inputViewContainer.element.nativeElement.checked;
}
this.inputViewContainer.element.nativeElement.dispatchEvent(new Event("change"));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CheckboxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.EventBusService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CheckboxComponent, selector: "nui-checkbox", inputs: { ariaLabel: "ariaLabel", ariaLabelledby: "ariaLabelledby", ariaDescribedby: "ariaDescribedby", name: "name", title: "title", value: "value", hovered: "hovered", checked: "checked", required: "required", hint: "hint", disabled: "disabled", indeterminate: "indeterminate" }, outputs: { valueChange: "valueChange" }, host: { properties: { "class.nui-checkbox--hovered": "hovered", "class.nui-checkbox--checked": "checked" } }, providers: [
{
provide: NuiFormFieldControl,
useExisting: forwardRef(() => CheckboxComponent),
multi: true,
},
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CheckboxComponent),
multi: true,
},
], viewQueries: [{ propertyName: "inputViewContainer", first: true, predicate: ["inputViewContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "checkboxContent", first: true, predicate: ["checkboxContent"], descendants: true }, { propertyName: "checkboxLabel", first: true, predicate: ["checkboxLabel"], descendants: true }], ngImport: i0, template: "<div class=\"nui-checkbox\">\n <label\n class=\"nui-checkbox__label\"\n #checkboxLabel\n role=\"checkbox\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n [attr.aria-checked]=\"getAriaChecked()\"\n [attr.aria-describedby]=\"ariaDescribedby\"\n [attr.tabindex]=\"!disabled ? 0 : -1\"\n [title]=\"title\"\n [class.nui-checkbox__translucent]=\"disabled\"\n (mouseenter)=\"hoverHandler()\"\n (mouseleave)=\"hoverHandler()\"\n >\n <div class=\"nui-checkbox__content\">\n <input\n #inputViewContainer\n class=\"nui-checkbox__input\"\n type=\"checkbox\"\n [attr.name]=\"name\"\n [value]=\"value\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [indeterminate]=\"indeterminate\"\n (click)=\"onClick($event)\"\n (change)=\"changeHandler($event)\"\n />\n <div class=\"nui-checkbox__mark\">\n <i class=\"nui-checkbox__glyph\"></i>\n </div>\n <div #checkboxContent class=\"nui-checkbox__transclude\">\n <ng-content></ng-content>\n </div>\n </div>\n <div class=\"nui-help-hint\" *ngIf=\"hint\">{{ hint }}</div>\n </label>\n</div>\n", styles: [".nui-checkbox-group-inline>.nui-checkbox-group{display:inline-flex}.nui-checkbox-group-inline>.nui-checkbox-group nui-checkbox{margin-left:15px}.nui-checkbox-group-inline>.nui-checkbox-group nui-checkbox:first-child{margin-left:0}.nui-checkbox-group-inline>.nui-checkbox-group nui-checkbox .nui-checkbox_label{max-width:450px}.nui .nui-checkbox__content{align-items:center;display:inline-flex;flex-wrap:nowrap;justify-content:flex-start}.nui .nui-checkbox.nui-checkbox--has-action .nui-checkbox__mark:after{display:none}.nui .nui-checkbox__label{cursor:pointer;margin:0;position:relative;line-height:0;font-weight:400;border-radius:3px;width:fit-content;min-width:30px;min-height:30px;padding:7px}.nui .nui-checkbox__label:hover{background-color:var(--nui-color-bg-transparent-hover,rgba(17, 17, 17, .05))}.nui .nui-checkbox__label:focus{outline:0;box-shadow:inset 0 0 0 2px #00c4d280;background-color:var(--nui-color-bg-transparent-hover,rgba(17, 17, 17, .05))}.nui .nui-checkbox__translucent{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3));cursor:default}.nui .nui-checkbox__translucent:hover{background-color:transparent}.nui .nui-checkbox__translucent:focus{outline:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:var(--transparent,transparent)}.nui .nui-checkbox__mark{border:solid 2px;background:no-repeat 0 center;border-color:var(--nui-color-active,#0079aa);background-color:var(--nui-color-bg-content,#fff);background-size:16px;border-radius:3px;min-width:16px;width:16px;height:16px;transition:background-color .3s,border-color .3s}.nui .nui-checkbox__glyph{width:100%;height:100%;background-size:12px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMjAgMjAiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjAgMjA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS54dWktY2hlY2tib3gtZ2x5cGh7ZmlsbDpub25lO3N0cm9rZTojRkZGRkZGO3N0cm9rZS13aWR0aDozO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1saW5lY2FwOnJvdW5kO30KPC9zdHlsZT4KPHBvbHlsaW5lIGNsYXNzPSJ4dWktY2hlY2tib3gtZ2x5cGgiIHBvaW50cz0iMTcsNCA4LDE1IDMsOSAiLz4KPC9zdmc+);display:none}.nui .nui-checkbox__input{display:none;width:1px;height:1px;position:absolute}.nui .nui-checkbox__input:indeterminate+.nui-checkbox__mark>.nui-checkbox__glyph{display:block;border:solid 2px;border-color:var(--nui-color-bg-content,#fff);background:var(--nui-color-active,#0079aa)}.nui .nui-checkbox__input:indeterminate:disabled+.nui-checkbox__mark>.nui-checkbox__glyph{background-color:var(--nui-color-disabled,#b3b3b3);opacity:1}.nui .nui-checkbox__input:disabled+.nui-checkbox__mark{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;color:var(--nui-color-disabled,#b3b3b3);background-color:var(--nui-color-bg-content,#fff);border-color:var(--nui-color-disabled,#b3b3b3);cursor:default}.nui .nui-checkbox__input:disabled+.nui-checkbox__mark>.nui-checkbox__glyph{opacity:.7}.nui .nui-checkbox__input:checked:disabled+.nui-checkbox__mark{background-color:var(--nui-color-disabled,#b3b3b3);border-color:var(--nui-color-disabled,#b3b3b3)}.nui .nui-checkbox__input:checked:disabled+.nui-checkbox__mark>.nui-checkbox__glyph{background-color:var(--nui-color-disabled,#b3b3b3)}.nui .nui-checkbox__transclude{line-height:18px;min-width:0;margin:-1px 0 -1px 7px}.nui .nui-checkbox__transclude:empty{margin:0}.nui .nui-checkbox .nui-help-hint{line-height:18px;margin-left:23px;padding:0}.nui .nui-checkbox--checked .nui-checkbox__mark{background-color:var(--nui-color-active,#0079aa);border-color:var(--nui-color-active,#0079aa)}.nui .nui-checkbox--checked .nui-checkbox__mark>.nui-checkbox__glyph{display:block}.nui .nui-checkbox--justified .nui-checkbox,.nui .nui-checkbox--justified .nui-checkbox__label,.nui .nui-checkbox--justified .nui-checkbox__content,.nui .nui-checkbox--justified .nui-checkbox__transclude{width:100%}.nui-menu-item__default .nui-checkbox__label{padding:0;min-height:unset}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CheckboxComponent, decorators: [{
type: Component,
args: [{ selector: "nui-checkbox", changeDetection: ChangeDetectionStrategy.OnPush, providers: [
{
provide: NuiFormFieldControl,
useExisting: forwardRef(() => CheckboxComponent),
multi: true,
},
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CheckboxComponent),
multi: true,
},
], encapsulation: ViewEncapsulation.None, host: {
"[class.nui-checkbox--hovered]": "hovered",
"[class.nui-checkbox--checked]": "checked",
}, template: "<div class=\"nui-checkbox\">\n <label\n class=\"nui-checkbox__label\"\n #checkboxLabel\n role=\"checkbox\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n [attr.aria-checked]=\"getAriaChecked()\"\n [attr.aria-describedby]=\"ariaDescribedby\"\n [attr.tabindex]=\"!disabled ? 0 : -1\"\n [title]=\"title\"\n [class.nui-checkbox__translucent]=\"disabled\"\n (mouseenter)=\"hoverHandler()\"\n (mouseleave)=\"hoverHandler()\"\n >\n <div class=\"nui-checkbox__content\">\n <input\n #inputViewContainer\n class=\"nui-checkbox__input\"\n type=\"checkbox\"\n [attr.name]=\"name\"\n [value]=\"value\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [indeterminate]=\"indeterminate\"\n (click)=\"onClick($event)\"\n (change)=\"changeHandler($event)\"\n />\n <div class=\"nui-checkbox__mark\">\n <i class=\"nui-checkbox__glyph\"></i>\n </div>\n <div #checkboxContent class=\"nui-checkbox__transclude\">\n <ng-content></ng-content>\n </div>\n </div>\n <div class=\"nui-help-hint\" *ngIf=\"hint\">{{ hint }}</div>\n </label>\n</div>\n", styles: [".nui-checkbox-group-inline>.nui-checkbox-group{display:inline-flex}.nui-checkbox-group-inline>.nui-checkbox-group nui-checkbox{margin-left:15px}.nui-checkbox-group-inline>.nui-checkbox-group nui-checkbox:first-child{margin-left:0}.nui-checkbox-group-inline>.nui-checkbox-group nui-checkbox .nui-checkbox_label{max-width:450px}.nui .nui-checkbox__content{align-items:center;display:inline-flex;flex-wrap:nowrap;justify-content:flex-start}.nui .nui-checkbox.nui-checkbox--has-action .nui-checkbox__mark:after{display:none}.nui .nui-checkbox__label{cursor:pointer;margin:0;position:relative;line-height:0;font-weight:400;border-radius:3px;width:fit-content;min-width:30px;min-height:30px;padding:7px}.nui .nui-checkbox__label:hover{background-color:var(--nui-color-bg-transparent-hover,rgba(17, 17, 17, .05))}.nui .nui-checkbox__label:focus{outline:0;box-shadow:inset 0 0 0 2px #00c4d280;background-color:var(--nui-color-bg-transparent-hover,rgba(17, 17, 17, .05))}.nui .nui-checkbox__translucent{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3));cursor:default}.nui .nui-checkbox__translucent:hover{background-color:transparent}.nui .nui-checkbox__translucent:focus{outline:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:var(--transparent,transparent)}.nui .nui-checkbox__mark{border:solid 2px;background:no-repeat 0 center;border-color:var(--nui-color-active,#0079aa);background-color:var(--nui-color-bg-content,#fff);background-size:16px;border-radius:3px;min-width:16px;width:16px;height:16px;transition:background-color .3s,border-color .3s}.nui .nui-checkbox__glyph{width:100%;height:100%;background-size:12px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMjAgMjAiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjAgMjA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS54dWktY2hlY2tib3gtZ2x5cGh7ZmlsbDpub25lO3N0cm9rZTojRkZGRkZGO3N0cm9rZS13aWR0aDozO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1saW5lY2FwOnJvdW5kO30KPC9zdHlsZT4KPHBvbHlsaW5lIGNsYXNzPSJ4dWktY2hlY2tib3gtZ2x5cGgiIHBvaW50cz0iMTcsNCA4LDE1IDMsOSAiLz4KPC9zdmc+);display:none}.nui .nui-checkbox__input{display:none;width:1px;height:1px;position:absolute}.nui .nui-checkbox__input:indeterminate+.nui-checkbox__mark>.nui-checkbox__glyph{display:block;border:solid 2px;border-color:var(--nui-color-bg-content,#fff);background:var(--nui-color-active,#0079aa)}.nui .nui-checkbox__input:indeterminate:disabled+.nui-checkbox__mark>.nui-checkbox__glyph{background-color:var(--nui-color-disabled,#b3b3b3);opacity:1}.nui .nui-checkbox__input:disabled+.nui-checkbox__mark{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;color:var(--nui-color-disabled,#b3b3b3);background-color:var(--nui-color-bg-content,#fff);border-color:var(--nui-color-disabled,#b3b3b3);cursor:default}.nui .nui-checkbox__input:disabled+.nui-checkbox__mark>.nui-checkbox__glyph{opacity:.7}.nui .nui-checkbox__input:checked:disabled+.nui-checkbox__mark{background-color:var(--nui-color-disabled,#b3b3b3);border-color:var(--nui-color-disabled,#b3b3b3)}.nui .nui-checkbox__input:checked:disabled+.nui-checkbox__mark>.nui-checkbox__glyph{background-color:var(--nui-color-disabled,#b3b3b3)}.nui .nui-checkbox__transclude{line-height:18px;min-width:0;margin:-1px 0 -1px 7px}.nui .nui-checkbox__transclude:empty{margin:0}.nui .nui-checkbox .nui-help-hint{line-height:18px;margin-left:23px;padding:0}.nui .nui-checkbox--checked .nui-checkbox__mark{background-color:var(--nui-color-active,#0079aa);border-color:var(--nui-color-active,#0079aa)}.nui .nui-checkbox--checked .nui-checkbox__mark>.nui-checkbox__glyph{display:block}.nui .nui-checkbox--justified .nui-checkbox,.nui .nui-checkbox--justified .nui-checkbox__label,.nui .nui-checkbox--justified .nui-checkbox__content,.nui .nui-checkbox--justified .nui-checkbox__transclude{width:100%}.nui-menu-item__default .nui-checkbox__label{padding:0;min-height:unset}\n"] }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.EventBusService }, { type: i0.Renderer2 }], propDecorators: { ariaLabel: [{
type: Input
}], ariaLabelledby: [{
type: Input
}], ariaDescribedby: [{
type: Input
}], name: [{
type: Input
}], title: [{
type: Input
}], value: [{
type: Input
}], valueChange: [{
type: Output
}], hovered: [{
type: Input
}], checked: [{
type: Input
}], required: [{
type: Input
}], hint: [{
type: Input
}], disabled: [{
type: Input
}], indeterminate: [{
type: Input
}], inputViewContainer: [{
type: ViewChild,
args: ["inputViewContainer", { read: ViewContainerRef }]
}], checkboxContent: [{
type: ViewChild,
args: ["checkboxContent"]
}], checkboxLabel: [{
type: ViewChild,
args: ["checkboxLabel"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULGdCQUFnQixFQUNoQixpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXpFLE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIsb0JBQW9CLEdBQ3ZCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQTJCL0Q7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFVMUI7O09BRUc7SUFDSCxJQUFv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Q0ksT0FBTyxFQUFFLG1CQUFtQjs0QkFDNUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUM7NEJBQ2hELEtBQUssRUFBRSxJQUFJO3lCQUNkO3dCQUNEOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSixpQkFHYyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNGLCtCQUErQixFQUFFLFNBQVM7d0JBQzFDLCtCQUErQixFQUFFLFNBQVM7cUJBQzdDOzRJQXFCbUIsU0FBUztzQkFBNUIsS0FBSztnQkFjRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBS1UsSUFBSTtzQkFBbkIsS0FBSztnQkFLVSxLQUFLO3NCQUFwQixLQUFLO2dCQUtVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBS1csV0FBVztzQkFBM0IsTUFBTTtnQkFLUyxPQUFPO3NCQUF0QixLQUFLO2dCQU1LLE9BQU87c0JBRGpCLEtBQUs7Z0JBY1UsUUFBUTtzQkFBdkIsS0FBSztnQkFLVSxJQUFJO3NCQUFuQixLQUFLO2dCQU1LLFFBQVE7c0JBRGxCLEtBQUs7Z0JBY1UsYUFBYTtzQkFBNUIsS0FBSztnQkFNQyxrQkFBa0I7c0JBRHhCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSXBELGVBQWU7c0JBRHJCLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUdyQixhQUFhO3NCQURuQixTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBDaGVja2JveENoYW5nZUV2ZW50LCBJQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tIFwiLi9wdWJsaWMtYXBpXCI7XG5pbXBvcnQge1xuICAgIENIRUNLQk9YX0tFWURPV05fRVZFTlQsXG4gICAgRE9DVU1FTlRfQ0xJQ0tfRVZFTlQsXG59IGZyb20gXCIuLi8uLi9jb25zdGFudHMvZXZlbnQuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBLRVlCT0FSRF9DT0RFIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy9rZXljb2RlLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgRXZlbnRCdXNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2V2ZW50LWJ1cy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBOdWlGb3JtRmllbGRDb250cm9sIH0gZnJvbSBcIi4uL2Zvcm0tZmllbGQvcHVibGljLWFwaVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJudWktY2hlY2tib3hcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2NoZWNrYm94LmNvbXBvbmVudC5odG1sXCIsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE51aUZvcm1GaWVsZENvbnRyb2wsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaGVja2JveENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaGVja2JveENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIHN0eWxlVXJsczogW1wiLi9jaGVja2JveC5jb21wb25lbnQubGVzc1wiXSxcbiAgICAvLyBUT0RPOiB0dXJuIG9uIHRoZSB2aWV3IGVudmFwc3VsYXRpb24gaW4gdGhlIHNjb3BlIG9mIE5VSS01ODIzXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7XG4gICAgICAgIFwiW2NsYXNzLm51aS1jaGVja2JveC0taG92ZXJlZF1cIjogXCJob3ZlcmVkXCIsXG4gICAgICAgIFwiW2NsYXNzLm51aS1jaGVja2JveC0tY2hlY2tlZF1cIjogXCJjaGVja2VkXCIsXG4gICAgfSxcbn0pXG5cbi8qKlxuICogPG51aS1jaGVja2JveD4gcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBhIG5hdGl2ZVxuICogPGlucHV0IHR5cGU9XCJjaGVja2JveFwiPiBlbmhhbmNlZCB3aXRoIE5VSSBzdHlsaW5nLlxuICogPGV4YW1wbGUtdXJsPi4vLi4vZXhhbXBsZXMvaW5kZXguaHRtbCMvY2hlY2tib3g8L2V4YW1wbGUtdXJsPlxuICovXG5leHBvcnQgY2xhc3MgQ2hlY2tib3hDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzXG4gICAgICAgIEFmdGVyVmlld0luaXQsXG4gICAgICAgIElDaGVja2JveENvbXBvbmVudCxcbiAgICAgICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgICAgIE9uRGVzdHJveVxue1xuICAgIHByaXZhdGUgX2NoZWNrZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJbnB1dCB0byBzZXQgYXJpYSBsYWJlbCB0ZXh0XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGdldCBhcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FyaWFMYWJlbDtcbiAgICB9XG5cbiAgICAvLyBjaGFuZ2luZyB0aGUgdmFsdWUgd2l0aCByZWd1bGFyIEBJbnB1dCBkb2Vzbid0IHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgIC8vIHNvIHdlIG5lZWQgdG8gZG8gdGhhdCBtYW51YWxseSBpbiB0aGUgc2V0dGVyXG4gICAgcHVibGljIHNldCBhcmlhTGFiZWwodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMuX2FyaWFMYWJlbCkge1xuICAgICAgICAgICAgdGhpcy5fYXJpYUxhYmVsID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFVzZXJzIGNhIHNwZWNpZnkgdGhlICdhcmlhLWxhYmVsbGVkYnknIHdoaWNoIHdpbGwgYmUgc2V0IHRvIHRoZSBpbnB1dCBlbGVtZW50ICovXG4gICAgQElucHV0KCkgYXJpYUxhYmVsbGVkYnk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIFRoZSAnYXJpYS1kZXNjcmliZWRieScgYXR0cmlidXRlIGlzIHJlYWQgYWZ0ZXIgdGhlIGVsZW1lbnQncyBsYWJlbCBhbmQgZmllbGQgdHlwZS4gKi9cbiAgICBASW5wdXQoKSBhcmlhRGVzY3JpYmVkYnk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNldHMgXCJuYW1lXCIgYXR0cmlidXRlIGZvciBpbm5lciBpbnB1dCBlbGVtZW50IG9mIG51aS1jaGVja2JveFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIFwidGl0bGVcIiBhdHRyaWJ1dGUgZm9yIG51aS1jaGVja2JveCBsYWJlbFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyB0aXRsZSA9IFwiXCI7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIFwidmFsdWVcIiBhdHRyaWJ1dGUgZm9yIGlubmVyIGlucHV0IGVsZW1lbnQgb2YgbnVpLWNoZWNrYm94XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHZhbHVlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gbnVpLWNoZWNrYm94IGlzIHRvZ2dsZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGVja2JveENoYW5nZUV2ZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgY2hhbmdpbmcgbnVpLWNoZWNrYm94IGNvbXBvbmVudCBzdHlsZXMgd2hlbiBjb21wb25lbnQgaXMgaG92ZXJlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBob3ZlcmVkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBcImNoZWNrZWRcIiBhdHRyaWJ1dGUgZm9yIGlubmVyIGlucHV0IGVsZW1lbnQgb2YgbnVpLWNoZWNrYm94XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja2VkO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGNoZWNrZWQodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9jaGVja2VkICE9PSB2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hlY2tlZCA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIFwicmVxdWlyZWRcIiBhdHRyaWJ1dGUgZm9yIGlubmVyIGlucHV0IGVsZW1lbnQgb2YgbnVpLWNoZWNrYm94XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHJlcXVpcmVkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBudWktY2hlY2tib3ggaGludCB0aGF0IGlzIGRpc3BsYXllZCBiZWxvdyBsYWJlbFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoaW50OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBkaXNhYmxpbmcgb2YgbnVpLWNoZWNrYm94XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9kaXNhYmxlZCAhPT0gdmFsKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIHNldHRpbmcgb2YgbnVpLWNoZWNrYm94IGluZGV0ZXJtaW5hdGUgc3RhdGVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaW5kZXRlcm1pbmF0ZTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFJlZmVyZW5jZSB0byB0aGUgaW5uZXIgaW5wdXQgY2hlY2tib3ggaHRtbCBlbGVtZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZChcImlucHV0Vmlld0NvbnRhaW5lclwiLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgICBwdWJsaWMgaW5wdXRWaWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgQFZpZXdDaGlsZChcImNoZWNrYm94Q29udGVudFwiKVxuICAgIHB1YmxpYyBjaGVja2JveENvbnRlbnQ6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZChcImNoZWNrYm94TGFiZWxcIilcbiAgICBwdWJsaWMgY2hlY2tib3hMYWJlbDogRWxlbWVudFJlZjtcblxuICAgIHByaXZhdGUgcmVuZGVyZXJMaXN0ZW5lcjogRnVuY3Rpb247XG4gICAgcHJpdmF0ZSBzdWI6IFN1YnNjcmlwdGlvbjtcblxuICAgIHByaXZhdGUgX2FyaWFMYWJlbDogc3RyaW5nID0gXCJDaGVja2JveFwiO1xuXG4gICAgcHJpdmF0ZSBrZXlzQWN0aW9uID0gW0tFWUJPQVJEX0NPREUuU1BBQ0UsIEtFWUJPQVJEX0NPREUuRU5URVJdLm1hcChTdHJpbmcpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIGV2ZW50QnVzU2VydmljZTogRXZlbnRCdXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihcbiAgICAgICAgICAgIHRoaXMuY2hlY2tib3hMYWJlbC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgXCJrZXlkb3duXCIsXG4gICAgICAgICAgICAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50QnVzU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyZWFtKENIRUNLQk9YX0tFWURPV05fRVZFTlQpXG4gICAgICAgICAgICAgICAgICAgIC5uZXh0KGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnN1YiA9IHRoaXMuZXZlbnRCdXNTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0U3RyZWFtKENIRUNLQk9YX0tFWURPV05fRVZFTlQpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuY2hlY2tib3hMYWJlbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmtleXNBY3Rpb24uaW5jbHVkZXMoZXZlbnQuY29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlS2V5Ym9hcmRBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QXJpYUNoZWNrZWQoKTogXCJ0cnVlXCIgfCBcImZhbHNlXCIgfCBcIm1peGVkXCIge1xuICAgICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbmRldGVybWluYXRlID8gXCJtaXhlZFwiIDogXCJmYWxzZVwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGNoYW5naW5nIG9mIGNzcyBzdHlsZSB3aGVuIG51aS1jaGVja2JveCBpcyBob3ZlcmVkXG4gICAgICovXG4gICAgcHVibGljIGhvdmVySGFuZGxlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3ZlcmVkID0gIXRoaXMuaG92ZXJlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBudWktY2hlY2tib3ggY2hlY2svdW5jaGVjayBzdGF0ZSBoYW5kbGVyXG4gICAgICogQHBhcmFtIGV2ZW50IENoYW5nZWQgbnVpLWNoZWNrYm94IGNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBjaGFuZ2VIYW5kbGVyKGV2ZW50OiBDaGVja2JveENoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChldmVudCk7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQgPSAhIWV2ZW50LnRhcmdldD8uY2hlY2tlZDtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShjaGVja2VkKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKGNoZWNrZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmV2ZW50QnVzU2VydmljZS5nZXRTdHJlYW0oRE9DVU1FTlRfQ0xJQ0tfRVZFTlQpLm5leHQoZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7fVxuXG4gICAgcHVibGljIG9uVG91Y2hlZCgpOiB2b2lkIHt9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJlckxpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdWIpIHtcbiAgICAgICAgICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUtleWJvYXJkQWN0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFZpZXdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Vmlld0NvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hlY2tlZCA9XG4gICAgICAgICAgICAgICAgIXRoaXMuaW5wdXRWaWV3Q29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGVja2VkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5wdXRWaWV3Q29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEV2ZW50KFwiY2hhbmdlXCIpXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm51aS1jaGVja2JveFwiPlxuICAgIDxsYWJlbFxuICAgICAgICBjbGFzcz1cIm51aS1jaGVja2JveF9fbGFiZWxcIlxuICAgICAgICAjY2hlY2tib3hMYWJlbFxuICAgICAgICByb2xlPVwiY2hlY2tib3hcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCB8fCBudWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZGJ5XCJcbiAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImdldEFyaWFDaGVja2VkKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImFyaWFEZXNjcmliZWRieVwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cIiFkaXNhYmxlZCA/IDAgOiAtMVwiXG4gICAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICAgIFtjbGFzcy5udWktY2hlY2tib3hfX3RyYW5zbHVjZW50XT1cImRpc2FibGVkXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiaG92ZXJIYW5kbGVyKClcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlckhhbmRsZXIoKVwiXG4gICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibnVpLWNoZWNrYm94X19jb250ZW50XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAjaW5wdXRWaWV3Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJudWktY2hlY2tib3hfX2lucHV0XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJjaGVja2VkXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJudWktY2hlY2tib3hfX21hcmtcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm51aS1jaGVja2JveF9fZ2x5cGhcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgI2NoZWNrYm94Q29udGVudCBjbGFzcz1cIm51aS1jaGVja2JveF9fdHJhbnNjbHVkZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm51aS1oZWxwLWhpbnRcIiAqbmdJZj1cImhpbnRcIj57eyBoaW50IH19PC9kaXY+XG4gICAgPC9sYWJlbD5cbjwvZGl2PlxuIl19