UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

398 lines 39.3 kB
/** * Copyright (c) 2025 Visa, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion'; import { ContentChild, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, Input, Output, QueryList } from '@angular/core'; import { BaseInteractiveDirective } from '../_utilities/angular-specific-directives/base-interactive.directive'; import { BadgeDirective } from '../badge/badge.directive'; import { IconToggleComponent } from '../icon-toggle/icon-toggle.component'; import { IconToggleDirective } from '../icon-toggle/icon-toggle.directive'; import { IconComponent } from '../icon/icon.component'; import { ButtonColor, ButtonSize } from './button.constants'; import * as i0 from "@angular/core"; export class ButtonDirective extends BaseInteractiveDirective { get hostId() { return this.id; } get hostType() { return this.type; } /** * Provides custom class&#40;es&#41; for custom styling. * @default .v-button.v-button-&lt;buttonColor&gt;.v-button-&lt;buttonSize&gt; */ get class() { return [ this._class, 'v-button', this.buttonColor !== ButtonColor.PRIMARY ? 'v-button-' + this.buttonColor : '', this.buttonSize !== ButtonSize.MEDIUM ? 'v-button-' + this.buttonSize : '', this.subtle ? 'v-button-subtle' : '', this.destructive ? 'v-button-destructive' : '' ].join(' '); } set class(value) { this._class = value; } get hostClass() { return this.class; } /** * Sets button size. * @default 'medium' / ButtonSize.MEDIUM * @options 'small' | ButtonSize.SMALL | <br> 'medium' | ButtonSize.MEDIUM | <br> 'large' | ButtonSize.LARGE */ get buttonSize() { return this._buttonSize; } set buttonSize(value) { this._buttonSize = value; this._buttonSizeSetByUser = true; } /** * Sets button color scheme. * @default 'primary' / ButtonColor.PRIMARY * @options 'primary' | ButtonSize.PRIMARY | <br> 'secondary' | ButtonSize.SECONDARY | <br> 'tertiary' | ButtonSize.TERTIARY */ get buttonColor() { return this._buttonColor; } set buttonColor(value) { this._buttonColor = value; this._buttonColorSetByUser = true; } /** * Sets button to subtle variant when true. * @default false */ get subtle() { return this._subtle; } set subtle(value) { this._subtle = coerceBooleanProperty(value); } /** * Sets button to destructive variant when true. * @default false */ get destructive() { return this._destructive; } set destructive(value) { this._destructive = coerceBooleanProperty(value); } /** * Disables button when true. * @default false */ get disabled() { return this._disabled; } set disabled(value) { this._disabled = coerceBooleanProperty(value); this.disabledChange.emit(this.disabled); } /** * Aria attribute pointing to id of descriptive element. <br /> * If the button has a badge, the <code>aria-describedby</code> will be set to the badge's id by default. * @default false */ get ariaDescribedby() { return this._ariaDescribedby; } set ariaDescribedby(value) { this._ariaDescribedby = value; } get hostAriaDescribedby() { if (this.ariaDescribedby !== null) { return this.ariaDescribedby; } } constructor(el) { super(el); this._roleSetByUser = false; // prevents parent component from overriding if role if role is given directly by user this._buttonColorSetByUser = false; // prevents parent component from overriding if buttonColor if buttonColor is given directly by user this._buttonSizeSetByUser = false; // prevents parent component from overriding if buttonSize if buttonSize is given directly by user /** * Sets custom type. * @default 'button' */ this.type = 'button'; this._class = ''; this._buttonSize = ButtonSize.MEDIUM; this._buttonColor = ButtonColor.PRIMARY; this._subtle = false; this._destructive = false; this._disabled = false; /** * Emits a boolean value indicating the new disabled state when the disabled state changes. */ this.disabledChange = new EventEmitter(); this._ariaDescribedby = null; this._roleSetByTab = false; this._isInNavOrNested = false; this._ariaSelected = null; this._ariaCurrent = null; this._ariaExpanded = null; this._ariaDisabled = false; this._ariaControls = null; /** Below needed for combobox */ this._inCombobox = false; } // used in accordion service ngAfterContentInit() { if (this.badge) { this.ariaDescribedby = this.badge.id; } } /** * Sets role of button. <br /> * If no custom role is set, role may be set by a parent component (nav, tabs, etc.). * @builtin true */ get role() { return this._role; } set role(value) { this._role = value; this._roleSetByUser = true; } get hostRole() { if (this.role || this.role === null) return this.role; } /** * Aria attribute relaying whether button is selected. <br /> * <code>aria-current</code> and <code>aria-selected</code> should not be used together. * @default null * @builtin true */ get ariaSelected() { return this._ariaSelected; } set ariaSelected(value) { this._ariaSelected = coerceBooleanProperty(value); } get hostAriaSelected() { if (this.ariaSelected !== null && !this._isInNavOrNested) { return this.ariaSelected.toString(); } } /** * Aria attribute relaying whether button is selected. <br /> * <code>aria-current</code> and <code>aria-selected</code> should not be used together. * @default null * @builtin true */ get ariaCurrent() { return this._ariaCurrent; } set ariaCurrent(value) { if (value === 'page') { this._ariaCurrent = value; } else this._ariaCurrent = coerceBooleanProperty(value); } get hostAriaCurrent() { if (this.ariaCurrent !== null) { return this.ariaCurrent.toString(); } } /** * Aria attribute relaying whether button is expanded. * @default null * @builtin true */ get ariaExpanded() { return this._ariaExpanded; } set ariaExpanded(value) { this._ariaExpanded = coerceBooleanProperty(value); } get hostAriaExpanded() { if (this.ariaExpanded !== null) { return this.ariaExpanded.toString(); } } /** * Sets aria disabled state for accessibility purposes. <br /> * When true, indicates that the button is disabled and not interactive. * @default false */ get ariaDisabled() { return this._ariaDisabled; } set ariaDisabled(value) { this._ariaDisabled = coerceBooleanProperty(value); } /** * Aria attribute relaying what element the button controls. * @default null * @default '&lt;accordion-panel-id&gt;' when button is used within Accordion. * @default '&lt;panel-content-id&gt;' when button is used within Panel. * @builtin true */ get ariaControls() { return this._ariaControls; } set ariaControls(value) { this._ariaControls = value; } get hostAriaControls() { if (this.ariaControls !== null) { return this.ariaControls; } } /** * Sets button to combobox toggle button when true. * @default false * @default true when button is used within combobox and no custom value is given. * @builtin true */ get ariaHaspopup() { return this._ariaHaspopup; } set ariaHaspopup(value) { this._ariaHaspopup = coerceBooleanProperty(value); } get hostAriaHaspopup() { if (!this.ariaHaspopup && this._inCombobox) { return 'true'; } else if (this.ariaHaspopup) { return this.ariaHaspopup.toString(); } } /** * Sets button's tabIndex. * @default null * @default -1 when button is used within combobox and no custom value is given. * @builtin true */ get tabindex() { return this._tabindex; } set tabindex(value) { this._tabindex = coerceNumberProperty(value); } get hostTabindex() { if (!this.tabindex && (this._inCombobox || this.ariaDisabled)) { return '-1'; } else if (this.tabindex) { return this.tabindex.toString(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ButtonDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: ButtonDirective, isStandalone: true, selector: "[v-button], [v-button-icon], [v-button-stacked], [v-panel-toggle]", inputs: { id: "id", type: "type", class: "class", buttonSize: "buttonSize", buttonColor: "buttonColor", subtle: "subtle", destructive: "destructive", disabled: "disabled", ariaDescribedby: ["aria-describedby", "ariaDescribedby"], role: "role", ariaSelected: ["aria-selected", "ariaSelected"], ariaCurrent: ["aria-current", "ariaCurrent"], ariaExpanded: ["aria-expanded", "ariaExpanded"], ariaDisabled: ["aria-disabled", "ariaDisabled"], ariaControls: ["aria-controls", "ariaControls"], ariaHaspopup: ["aria-haspopup", "ariaHaspopup"], tabindex: "tabindex" }, outputs: { disabledChange: "disabledChange" }, host: { properties: { "attr.id": "this.hostId", "attr.type": "this.hostType", "class": "this.hostClass", "attr.aria-describedby": "this.hostAriaDescribedby", "attr.role": "this.hostRole", "attr.aria-selected": "this.hostAriaSelected", "attr.aria-current": "this.hostAriaCurrent", "attr.aria-expanded": "this.hostAriaExpanded", "attr.aria-controls": "this.hostAriaControls", "attr.aria-haspopup": "this.hostAriaHaspopup", "attr.tabindex": "this.hostTabindex" } }, queries: [{ propertyName: "badge", first: true, predicate: BadgeDirective, descendants: true }, { propertyName: "toggleIcon", first: true, predicate: IconToggleDirective, descendants: true }, { propertyName: "toggleIconComponent", first: true, predicate: IconToggleComponent, descendants: true }, { propertyName: "icons", predicate: IconComponent }], usesInheritance: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ButtonDirective, decorators: [{ type: Directive, args: [{ standalone: true, // tslint:disable-next-line:directive-selector selector: '[v-button], [v-button-icon], [v-button-stacked], [v-panel-toggle]' }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { badge: [{ type: ContentChild, args: [BadgeDirective] }], id: [{ type: Input }], hostId: [{ type: HostBinding, args: ['attr.id'] }], type: [{ type: Input }], hostType: [{ type: HostBinding, args: ['attr.type'] }], class: [{ type: Input }], hostClass: [{ type: HostBinding, args: ['class'] }], buttonSize: [{ type: Input }], buttonColor: [{ type: Input }], subtle: [{ type: Input }], destructive: [{ type: Input }], disabled: [{ type: Input }], disabledChange: [{ type: Output }], ariaDescribedby: [{ type: Input, args: ['aria-describedby'] }], hostAriaDescribedby: [{ type: HostBinding, args: ['attr.aria-describedby'] }], icons: [{ type: ContentChildren, args: [IconComponent] }], role: [{ type: Input }], hostRole: [{ type: HostBinding, args: ['attr.role'] }], ariaSelected: [{ type: Input, args: ['aria-selected'] }], hostAriaSelected: [{ type: HostBinding, args: ['attr.aria-selected'] }], ariaCurrent: [{ type: Input, args: ['aria-current'] }], hostAriaCurrent: [{ type: HostBinding, args: ['attr.aria-current'] }], ariaExpanded: [{ type: Input, args: ['aria-expanded'] }], hostAriaExpanded: [{ type: HostBinding, args: ['attr.aria-expanded'] }], ariaDisabled: [{ type: Input, args: ['aria-disabled'] }], toggleIcon: [{ type: ContentChild, args: [IconToggleDirective] }], toggleIconComponent: [{ type: ContentChild, args: [IconToggleComponent] }], ariaControls: [{ type: Input, args: ['aria-controls'] }], hostAriaControls: [{ type: HostBinding, args: ['attr.aria-controls'] }], ariaHaspopup: [{ type: Input, args: ['aria-haspopup'] }], hostAriaHaspopup: [{ type: HostBinding, args: ['attr.aria-haspopup'] }], tabindex: [{ type: Input }], hostTabindex: [{ type: HostBinding, args: ['attr.tabindex'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQTZCLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0csT0FBTyxFQUVMLFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFPN0QsTUFBTSxPQUFPLGVBQWdCLFNBQVEsd0JBQXdCO0lBVzNELElBQ0ksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBUUQsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNJLEtBQUs7UUFDUCxPQUFPO1lBQ0wsSUFBSSxDQUFDLE1BQU07WUFDWCxVQUFVO1lBQ1YsSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUMsT0FBTyxDQUFDLENB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S0FBSztnQkFhYSxjQUFjO3NCQUFoQyxNQUFNO2dCQVFILGVBQWU7c0JBRGxCLEtBQUs7dUJBQUMsa0JBQWtCO2dCQVVyQixtQkFBbUI7c0JBRHRCLFdBQVc7dUJBQUMsdUJBQXVCO2dCQWtCSixLQUFLO3NCQUFwQyxlQUFlO3VCQUFDLGFBQWE7Z0JBUzFCLElBQUk7c0JBRFAsS0FBSztnQkFVRixRQUFRO3NCQURYLFdBQVc7dUJBQUMsV0FBVztnQkFZcEIsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBVWxCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBYzdCLFdBQVc7c0JBRGQsS0FBSzt1QkFBQyxjQUFjO2dCQVlqQixlQUFlO3NCQURsQixXQUFXO3VCQUFDLG1CQUFtQjtnQkFhNUIsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBU2xCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBYTdCLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxlQUFlO2dCQVVhLFVBQVU7c0JBQTVDLFlBQVk7dUJBQUMsbUJBQW1CO2dCQUNFLG1CQUFtQjtzQkFBckQsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBVTdCLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxlQUFlO2dCQVVsQixnQkFBZ0I7c0JBRG5CLFdBQVc7dUJBQUMsb0JBQW9CO2dCQWlCN0IsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBU2xCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBZ0I3QixRQUFRO3NCQURYLEtBQUs7Z0JBU0YsWUFBWTtzQkFEZixXQUFXO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMjUgVmlzYSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBOdW1iZXJJbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlSW50ZXJhY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi9fdXRpbGl0aWVzL2FuZ3VsYXItc3BlY2lmaWMtZGlyZWN0aXZlcy9iYXNlLWludGVyYWN0aXZlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBCYWRnZURpcmVjdGl2ZSB9IGZyb20gJy4uL2JhZGdlL2JhZGdlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJY29uVG9nZ2xlQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi10b2dnbGUvaWNvbi10b2dnbGUuY29tcG9uZW50JztcbmltcG9ydCB7IEljb25Ub2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi9pY29uLXRvZ2dsZS9pY29uLXRvZ2dsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uQ29sb3IsIEJ1dHRvblNpemUgfSBmcm9tICcuL2J1dHRvbi5jb25zdGFudHMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1t2LWJ1dHRvbl0sIFt2LWJ1dHRvbi1pY29uXSwgW3YtYnV0dG9uLXN0YWNrZWRdLCBbdi1wYW5lbC10b2dnbGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBCdXR0b25EaXJlY3RpdmUgZXh0ZW5kcyBCYXNlSW50ZXJhY3RpdmVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgQENvbnRlbnRDaGlsZChCYWRnZURpcmVjdGl2ZSkgYmFkZ2U6IEJhZGdlRGlyZWN0aXZlO1xuICBfcm9sZVNldEJ5VXNlciA9IGZhbHNlOyAvLyBwcmV2ZW50cyBwYXJlbnQgY29tcG9uZW50IGZyb20gb3ZlcnJpZGluZyBpZiByb2xlIGlmIHJvbGUgaXMgZ2l2ZW4gZGlyZWN0bHkgYnkgdXNlclxuICBfYnV0dG9uQ29sb3JTZXRCeVVzZXIgPSBmYWxzZTsgLy8gcHJldmVudHMgcGFyZW50IGNvbXBvbmVudCBmcm9tIG92ZXJyaWRpbmcgaWYgYnV0dG9uQ29sb3IgaWYgYnV0dG9uQ29sb3IgaXMgZ2l2ZW4gZGlyZWN0bHkgYnkgdXNlclxuICBfYnV0dG9uU2l6ZVNldEJ5VXNlciA9IGZhbHNlOyAvLyBwcmV2ZW50cyBwYXJlbnQgY29tcG9uZW50IGZyb20gb3ZlcnJpZGluZyBpZiBidXR0b25TaXplIGlmIGJ1dHRvblNpemUgaXMgZ2l2ZW4gZGlyZWN0bHkgYnkgdXNlclxuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSBpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlkOiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gIGdldCBob3N0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSB0eXBlLlxuICAgKiBAZGVmYXVsdCAnYnV0dG9uJ1xuICAgKi9cbiAgQElucHV0KClcbiAgdHlwZTogc3RyaW5nID0gJ2J1dHRvbic7XG4gIEBIb3N0QmluZGluZygnYXR0ci50eXBlJylcbiAgZ2V0IGhvc3RUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjdXN0b20gY2xhc3MmIzQwO2VzJiM0MTsgZm9yIGN1c3RvbSBzdHlsaW5nLlxuICAgKiBAZGVmYXVsdCAudi1idXR0b24udi1idXR0b24tJmx0O2J1dHRvbkNvbG9yJmd0Oy52LWJ1dHRvbi0mbHQ7YnV0dG9uU2l6ZSZndDtcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLl9jbGFzcyxcbiAgICAgICd2LWJ1dHRvbicsXG4gICAgICB0aGlzLmJ1dHRvbkNvbG9yICE9PSBCdXR0b25Db2xvci5QUklNQVJZID8gJ3YtYnV0dG9uLScgKyB0aGlzLmJ1dHRvbkNvbG9yIDogJycsXG4gICAgICB0aGlzLmJ1dHRvblNpemUgIT09IEJ1dHRvblNpemUuTUVESVVNID8gJ3YtYnV0dG9uLScgKyB0aGlzLmJ1dHRvblNpemUgOiAnJyxcbiAgICAgIHRoaXMuc3VidGxlID8gJ3YtYnV0dG9uLXN1YnRsZScgOiAnJyxcbiAgICAgIHRoaXMuZGVzdHJ1Y3RpdmUgPyAndi1idXR0b24tZGVzdHJ1Y3RpdmUnIDogJydcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuICBzZXQgY2xhc3ModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NsYXNzID0gdmFsdWU7XG4gIH1cbiAgX2NsYXNzOiBzdHJpbmcgPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGJ1dHRvbiBzaXplLlxuICAgKiBAZGVmYXVsdCAnbWVkaXVtJyAvIEJ1dHRvblNpemUuTUVESVVNXG4gICAqIEBvcHRpb25zICdzbWFsbCcgfCBCdXR0b25TaXplLlNNQUxMIHwgPGJyPiAnbWVkaXVtJyB8IEJ1dHRvblNpemUuTUVESVVNIHwgPGJyPiAnbGFyZ2UnIHwgQnV0dG9uU2l6ZS5MQVJHRVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGJ1dHRvblNpemUoKTogQnV0dG9uU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2J1dHRvblNpemU7XG4gIH1cbiAgc2V0IGJ1dHRvblNpemUodmFsdWU6IEJ1dHRvblNpemUpIHtcbiAgICB0aGlzLl9idXR0b25TaXplID0gdmFsdWU7XG4gICAgdGhpcy5fYnV0dG9uU2l6ZVNldEJ5VXNlciA9IHRydWU7XG4gIH1cbiAgX2J1dHRvblNpemU6IEJ1dHRvblNpemUgPSBCdXR0b25TaXplLk1FRElVTTtcblxuICAvKipcbiAgICogU2V0cyBidXR0b24gY29sb3Igc2NoZW1lLlxuICAgKiBAZGVmYXVsdCAncHJpbWFyeScgLyBCdXR0b25Db2xvci5QUklNQVJZXG4gICAqIEBvcHRpb25zICdwcmltYXJ5JyB8IEJ1dHRvblNpemUuUFJJTUFSWSB8IDxicj4gJ3NlY29uZGFyeScgfCBCdXR0b25TaXplLlNFQ09OREFSWSB8IDxicj4gJ3RlcnRpYXJ5JyB8IEJ1dHRvblNpemUuVEVSVElBUllcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBidXR0b25Db2xvcigpOiBCdXR0b25Db2xvciB7XG4gICAgcmV0dXJuIHRoaXMuX2J1dHRvbkNvbG9yO1xuICB9XG4gIHNldCBidXR0b25Db2xvcih2YWx1ZTogQnV0dG9uQ29sb3IpIHtcbiAgICB0aGlzLl9idXR0b25Db2xvciA9IHZhbHVlO1xuICAgIHRoaXMuX2J1dHRvbkNvbG9yU2V0QnlVc2VyID0gdHJ1ZTtcbiAgfVxuICBfYnV0dG9uQ29sb3I6IEJ1dHRvbkNvbG9yID0gQnV0dG9uQ29sb3IuUFJJTUFSWTtcblxuICAvKipcbiAgICogU2V0cyBidXR0b24gdG8gc3VidGxlIHZhcmlhbnQgd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHN1YnRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3VidGxlO1xuICB9XG4gIHNldCBzdWJ0bGUodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3N1YnRsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3N1YnRsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIGJ1dHRvbiB0byBkZXN0cnVjdGl2ZSB2YXJpYW50IHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBkZXN0cnVjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJ1Y3RpdmU7XG4gIH1cbiAgc2V0IGRlc3RydWN0aXZlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9kZXN0cnVjdGl2ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2Rlc3RydWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIGJ1dHRvbiB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuZGlzYWJsZWRDaGFuZ2UuZW1pdCh0aGlzLmRpc2FibGVkKTtcbiAgfVxuICBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRW1pdHMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgdGhlIG5ldyBkaXNhYmxlZCBzdGF0ZSB3aGVuIHRoZSBkaXNhYmxlZCBzdGF0ZSBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRpc2FibGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSBwb2ludGluZyB0byBpZCBvZiBkZXNjcmlwdGl2ZSBlbGVtZW50LiA8YnIgLz5cbiAgICogSWYgdGhlIGJ1dHRvbiBoYXMgYSBiYWRnZSwgdGhlIDxjb2RlPmFyaWEtZGVzY3JpYmVkYnk8L2NvZGU+IHdpbGwgYmUgc2V0IHRvIHRoZSBiYWRnZSdzIGlkIGJ5IGRlZmF1bHQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtZGVzY3JpYmVkYnknKVxuICBnZXQgYXJpYURlc2NyaWJlZGJ5KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhRGVzY3JpYmVkYnk7XG4gIH1cbiAgc2V0IGFyaWFEZXNjcmliZWRieSh2YWx1ZSkge1xuICAgIHRoaXMuX2FyaWFEZXNjcmliZWRieSA9IHZhbHVlO1xuICB9XG4gIF9hcmlhRGVzY3JpYmVkYnk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRlc2NyaWJlZGJ5JylcbiAgZ2V0IGhvc3RBcmlhRGVzY3JpYmVkYnkoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYURlc2NyaWJlZGJ5ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhRGVzY3JpYmVkYnk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoZWw6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcihlbCk7XG4gIH0gLy8gdXNlZCBpbiBhY2NvcmRpb24gc2VydmljZVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iYWRnZSkge1xuICAgICAgdGhpcy5hcmlhRGVzY3JpYmVkYnkgPSB0aGlzLmJhZGdlLmlkO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCZWxvdyBpdGVtcyBuZWVkZWQgZm9yIHRhYiAqL1xuICBAQ29udGVudENoaWxkcmVuKEljb25Db21wb25lbnQpIGljb25zOiBRdWVyeUxpc3Q8SWNvbkNvbXBvbmVudD47XG4gIF9yb2xlU2V0QnlUYWI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgX2lzSW5OYXZPck5lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0cyByb2xlIG9mIGJ1dHRvbi4gPGJyIC8+XG4gICAqIElmIG5vIGN1c3RvbSByb2xlIGlzIHNldCwgcm9sZSBtYXkgYmUgc2V0IGJ5IGEgcGFyZW50IGNvbXBvbmVudCAobmF2LCB0YWJzLCBldGMuKS5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHJvbGUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3JvbGU7XG4gIH1cbiAgc2V0IHJvbGUodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl9yb2xlID0gdmFsdWU7XG4gICAgdGhpcy5fcm9sZVNldEJ5VXNlciA9IHRydWU7XG4gIH1cbiAgX3JvbGU6IHN0cmluZyB8IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgZ2V0IGhvc3RSb2xlKCk6IHN0cmluZyB8IHZvaWQgfCBudWxsIHtcbiAgICBpZiAodGhpcy5yb2xlIHx8IHRoaXMucm9sZSA9PT0gbnVsbCkgcmV0dXJuIHRoaXMucm9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSByZWxheWluZyB3aGV0aGVyIGJ1dHRvbiBpcyBzZWxlY3RlZC4gPGJyIC8+XG4gICAqIDxjb2RlPmFyaWEtY3VycmVudDwvY29kZT4gYW5kIDxjb2RlPmFyaWEtc2VsZWN0ZWQ8L2NvZGU+IHNob3VsZCBub3QgYmUgdXNlZCB0b2dldGhlci5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtc2VsZWN0ZWQnKVxuICBnZXQgYXJpYVNlbGVjdGVkKCk6IGJvb2xlYW4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYVNlbGVjdGVkO1xuICB9XG4gIHNldCBhcmlhU2VsZWN0ZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2FyaWFTZWxlY3RlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2FyaWFTZWxlY3RlZDogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXNlbGVjdGVkJylcbiAgZ2V0IGhvc3RBcmlhU2VsZWN0ZWQoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYVNlbGVjdGVkICE9PSBudWxsICYmICF0aGlzLl9pc0luTmF2T3JOZXN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFTZWxlY3RlZC50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSByZWxheWluZyB3aGV0aGVyIGJ1dHRvbiBpcyBzZWxlY3RlZC4gPGJyIC8+XG4gICAqIDxjb2RlPmFyaWEtY3VycmVudDwvY29kZT4gYW5kIDxjb2RlPmFyaWEtc2VsZWN0ZWQ8L2NvZGU+IHNob3VsZCBub3QgYmUgdXNlZCB0b2dldGhlci5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtY3VycmVudCcpXG4gIGdldCBhcmlhQ3VycmVudCgpOiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFDdXJyZW50O1xuICB9XG4gIHNldCBhcmlhQ3VycmVudCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgaWYgKHZhbHVlID09PSAncGFnZScpIHtcbiAgICAgIHRoaXMuX2FyaWFDdXJyZW50ID0gdmFsdWU7XG4gICAgfSBlbHNlIHRoaXMuX2FyaWFDdXJyZW50ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfYXJpYUN1cnJlbnQ6IGJvb2xlYW4gfCBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jdXJyZW50JylcbiAgZ2V0IGhvc3RBcmlhQ3VycmVudCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5hcmlhQ3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYUN1cnJlbnQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXJpYSBhdHRyaWJ1dGUgcmVsYXlpbmcgd2hldGhlciBidXR0b24gaXMgZXhwYW5kZWQuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLWV4cGFuZGVkJylcbiAgZ2V0IGFyaWFFeHBhbmRlZCgpOiBib29sZWFuIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFFeHBhbmRlZDtcbiAgfVxuICBzZXQgYXJpYUV4cGFuZGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9hcmlhRXhwYW5kZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9hcmlhRXhwYW5kZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZXhwYW5kZWQnKVxuICBnZXQgaG9zdEFyaWFFeHBhbmRlZCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5hcmlhRXhwYW5kZWQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFFeHBhbmRlZC50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFyaWEgZGlzYWJsZWQgc3RhdGUgZm9yIGFjY2Vzc2liaWxpdHkgcHVycG9zZXMuIDxiciAvPlxuICAgKiBXaGVuIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBidXR0b24gaXMgZGlzYWJsZWQgYW5kIG5vdCBpbnRlcmFjdGl2ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1kaXNhYmxlZCcpXG4gIGdldCBhcmlhRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFEaXNhYmxlZDtcbiAgfVxuICBzZXQgYXJpYURpc2FibGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9hcmlhRGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9hcmlhRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogQmVsb3cgbmVlZGVkIGZvciBBY2NvcmRpb24gKi9cbiAgQENvbnRlbnRDaGlsZChJY29uVG9nZ2xlRGlyZWN0aXZlKSB0b2dnbGVJY29uOiBJY29uVG9nZ2xlRGlyZWN0aXZlO1xuICBAQ29udGVudENoaWxkKEljb25Ub2dnbGVDb21wb25lbnQpIHRvZ2dsZUljb25Db21wb25lbnQ6IEljb25Ub2dnbGVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFyaWEgYXR0cmlidXRlIHJlbGF5aW5nIHdoYXQgZWxlbWVudCB0aGUgYnV0dG9uIGNvbnRyb2xzLlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqIEBkZWZhdWx0ICcmbHQ7YWNjb3JkaW9uLXBhbmVsLWlkJmd0Oycgd2hlbiBidXR0b24gaXMgdXNlZCB3aXRoaW4gQWNjb3JkaW9uLlxuICAgKiBAZGVmYXVsdCAnJmx0O3BhbmVsLWNvbnRlbnQtaWQmZ3Q7JyB3aGVuIGJ1dHRvbiBpcyB1c2VkIHdpdGhpbiBQYW5lbC5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLWNvbnRyb2xzJylcbiAgZ2V0IGFyaWFDb250cm9scygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYUNvbnRyb2xzO1xuICB9XG4gIHNldCBhcmlhQ29udHJvbHModmFsdWUpIHtcbiAgICB0aGlzLl9hcmlhQ29udHJvbHMgPSB2YWx1ZTtcbiAgfVxuICBfYXJpYUNvbnRyb2xzOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jb250cm9scycpXG4gIGdldCBob3N0QXJpYUNvbnRyb2xzKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmFyaWFDb250cm9scyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYUNvbnRyb2xzO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCZWxvdyBuZWVkZWQgZm9yIGNvbWJvYm94ICovXG4gIF9pbkNvbWJvYm94ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgYnV0dG9uIHRvIGNvbWJvYm94IHRvZ2dsZSBidXR0b24gd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAZGVmYXVsdCB0cnVlIHdoZW4gYnV0dG9uIGlzIHVzZWQgd2l0aGluIGNvbWJvYm94IGFuZCBubyBjdXN0b20gdmFsdWUgaXMgZ2l2ZW4uXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1oYXNwb3B1cCcpXG4gIGdldCBhcmlhSGFzcG9wdXAoKTogYm9vbGVhbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhSGFzcG9wdXA7XG4gIH1cbiAgc2V0IGFyaWFIYXNwb3B1cCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fYXJpYUhhc3BvcHVwID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfYXJpYUhhc3BvcHVwOiBib29sZWFuIHwgbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaGFzcG9wdXAnKVxuICBnZXQgaG9zdEFyaWFIYXNwb3B1cCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXJpYUhhc3BvcHVwICYmIHRoaXMuX2luQ29tYm9ib3gpIHtcbiAgICAgIHJldHVybiAndHJ1ZSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFyaWFIYXNwb3B1cCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYUhhc3BvcHVwLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYnV0dG9uJ3MgdGFiSW5kZXguXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGRlZmF1bHQgLTEgd2hlbiBidXR0b24gaXMgdXNlZCB3aXRoaW4gY29tYm9ib3ggYW5kIG5vIGN1c3RvbSB2YWx1ZSBpcyBnaXZlbi5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHRhYmluZGV4KCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuICBzZXQgdGFiaW5kZXgodmFsdWU6IE51bWJlcklucHV0KSB7XG4gICAgdGhpcy5fdGFiaW5kZXggPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3RhYmluZGV4OiBudW1iZXIgfCBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICBnZXQgaG9zdFRhYmluZGV4KCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJpbmRleCAmJiAodGhpcy5faW5Db21ib2JveCB8fCB0aGlzLmFyaWFEaXNhYmxlZCkpIHtcbiAgICAgIHJldHVybiAnLTEnO1xuICAgIH0gZWxzZSBpZiAodGhpcy50YWJpbmRleCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFiaW5kZXgudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==