@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
296 lines • 34.1 kB
JavaScript
/**
* © 2025 Visa
*
* 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 { CommonModule } from '@angular/common';
import { Component, ContentChild, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output } from '@angular/core';
import { BaseInteractiveDirective } from '../_utilities/angular-specific-directives/base-interactive.directive';
import { UUIDService } from '../_utilities/services/uuid.service';
import { CheckboxDirective } from '../checkbox/checkbox.directive';
import { END_KEY, ENTER_KEY, HOME_KEY, SPACE_KEY } from '../nova-lib.constants';
import { RadioDirective } from '../radio/radio.directive';
import { ToggleControlService } from '../toggle-control/toggle-control.service';
import * as i0 from "@angular/core";
import * as i1 from "../_utilities/services/uuid.service";
import * as i2 from "../toggle-control/toggle-control.service";
import * as i3 from "@angular/common";
export class ListboxItemComponent extends BaseInteractiveDirective {
/**
* Provides custom class(es) for custom styling.
* @default .v-listbox-item
*/
get class() {
return [this._class, 'v-listbox-item', this.highlighted ? 'v-listbox-item-highlighted' : ''].join(' ');
}
set class(value) {
this._class = value;
}
get hostClass() {
return this.class;
}
/**
* Marks item as selected when true.
* @default false
*/
get active() {
return this._active;
}
set active(value) {
const changed = this._active !== coerceBooleanProperty(value);
this._active = coerceBooleanProperty(value);
if (changed)
this.itemChanged.emit(this._active);
}
/**
* Marks item as highlighted when true. Occurs natively with :focus-visible.
* @default false
* @builtin true
*/
get highlighted() {
return this._highlighted;
}
set highlighted(value) {
this._highlighted = coerceBooleanProperty(value);
}
// index of item within listbox, supplied by listbox directive
/** @ignore */
get index() {
return this._index;
}
set index(value) {
this._index = coerceNumberProperty(value);
}
get hostRole() {
if (this._isRoleOptionVariant && !this.role) {
this.role = 'option';
}
return this.role;
}
/**
* Value of listbox item. <br />
* A value <strong>must</strong> be present on every list item if it does not have a child radio or checkbox.
*/
get value() {
return this._value;
}
set value(value) {
this._value = value;
}
get hostValue() {
if (this._isRoleOptionVariant) {
return this.value;
}
}
/**
* Sets list item with <strong>no child radio or checkbox</strong> as disabled. <br />
* If using a child radio or checkbox, set <code>disabled</code> directly on those components.
* @default false
*/
get disabled() {
return this._disabled;
}
set disabled(value) {
this._disabled = coerceBooleanProperty(value);
if (!this._isRoleOptionVariant)
this._disabledEmitter.emit(this.disabled);
}
get hostDisabled() {
return null;
}
get hostAriaDisabled() {
if (this._isRoleOptionVariant) {
return this.disabled ? 'true' : null;
}
}
/**
* Sets list item with <strong>no child radio or checkbox</strong> as invalid. <br />
* If using a child radio or checkbox, set <code>invalid</code> directly on those components.
* @default false
*/
get invalid() {
return this._invalid;
}
set invalid(value) {
this._invalid = coerceBooleanProperty(value);
if (!this._isRoleOptionVariant)
this._invalidEmitter.emit(this.invalid);
}
get hostInvalid() {
if (this._isRoleOptionVariant) {
return this.invalid ? 'invalid' : null;
}
}
get hostId() {
return this.id;
}
get hostAriaSelected() {
if (this._isRoleOptionVariant) {
return this.active;
}
}
handleFocus(event) {
this.onFocus.emit(event);
}
constructor(el, uuidService, toggleControlService) {
super(el);
this.uuidService = uuidService;
this.toggleControlService = toggleControlService;
this._isRoleOptionVariant = false;
this._multi = false;
this._disabledEmitter = new EventEmitter();
this._invalidEmitter = new EventEmitter();
this._class = '';
this._active = false;
this._highlighted = false;
this._disabled = false;
this._invalid = false;
/**
* Sets custom id.
* @default uuidService.getUUID('v-listbox-item-')
* @builtin true
*/
this.id = this.uuidService.getUUID('v-listbox-item-');
/**
* Emits active state of item when toggled.
*/
this.itemChanged = new EventEmitter();
/**
* Emits when this item is focused.
*/
this.onFocus = new EventEmitter();
}
ngAfterContentInit() {
if (!this.radio && !this.checkbox) {
this._isRoleOptionVariant = true;
}
else {
const child = this.radio ? this.radio : this.checkbox ? this.checkbox : null;
if (child) {
// the following is needed to apply the correct classes at the listbox-container level
this.invalid = child.invalid;
this.disabled = child.disabled;
child._disabledEmitter.subscribe(() => {
this.disabled = child.disabled;
});
child._invalidEmitter.subscribe(() => {
this.invalid = child.invalid;
});
}
}
}
onClick(event) {
if (!this._isRoleOptionVariant) {
this.toggleControlService.toggleControl(this.radio || this.checkbox, event);
}
this.selectItem();
}
handleKeyup(event) {
if (!this._isRoleOptionVariant)
return;
if (event.key === ENTER_KEY || event.key === SPACE_KEY) {
event.preventDefault(); // prevent scrolling
this.clicked.emit();
if (!event.shiftKey)
this.selectItem();
}
}
handleKeyDown(event) {
if (!this._isRoleOptionVariant)
return;
if (event.key === ENTER_KEY || event.key === SPACE_KEY || event.key === HOME_KEY || event.key === END_KEY) {
event.preventDefault(); // prevent scrolling
}
}
selectItem() {
if (this._multi) {
this.active = !this.active;
}
else {
this.active = true;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListboxItemComponent, deps: [{ token: i0.ElementRef }, { token: i1.UUIDService }, { token: i2.ToggleControlService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ListboxItemComponent, isStandalone: true, selector: "[v-listbox-item] ", inputs: { class: "class", active: "active", highlighted: "highlighted", index: "index", role: "role", value: "value", disabled: "disabled", invalid: "invalid", id: "id" }, outputs: { itemChanged: "itemChanged", onFocus: "onFocus" }, host: { listeners: { "focus": "handleFocus($event)", "click": "onClick($event)", "keyup": "handleKeyup($event)", "keydown": "handleKeyDown($event)" }, properties: { "class": "this.hostClass", "attr.role": "this.hostRole", "attr.value": "this.hostValue", "attr.disabled": "this.hostDisabled", "attr.aria-disabled": "this.hostAriaDisabled", "attr.invalid": "this.hostInvalid", "attr.id": "this.hostId", "attr.aria-selected": "this.hostAriaSelected" } }, queries: [{ propertyName: "radio", first: true, predicate: RadioDirective, descendants: true }, { propertyName: "checkbox", first: true, predicate: CheckboxDirective, descendants: true }], usesInheritance: true, ngImport: i0, template: "<!--\n * \u00A9 2025 Visa\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<span\n *ngIf=\"_isRoleOptionVariant\"\n [ngClass]=\"{\n 'v-flex-shrink-0': true,\n 'v-checkbox': _multi,\n 'v-radio': !_multi\n }\"\n></span>\n<ng-content></ng-content>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListboxItemComponent, decorators: [{
type: Component,
args: [{ standalone: true, imports: [CommonModule], selector: '[v-listbox-item] ', template: "<!--\n * \u00A9 2025 Visa\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<span\n *ngIf=\"_isRoleOptionVariant\"\n [ngClass]=\"{\n 'v-flex-shrink-0': true,\n 'v-checkbox': _multi,\n 'v-radio': !_multi\n }\"\n></span>\n<ng-content></ng-content>\n" }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.UUIDService }, { type: i2.ToggleControlService }], propDecorators: { radio: [{
type: ContentChild,
args: [RadioDirective]
}], checkbox: [{
type: ContentChild,
args: [CheckboxDirective]
}], class: [{
type: Input
}], hostClass: [{
type: HostBinding,
args: ['class']
}], active: [{
type: Input
}], highlighted: [{
type: Input
}], index: [{
type: Input
}], role: [{
type: Input
}], hostRole: [{
type: HostBinding,
args: ['attr.role']
}], value: [{
type: Input
}], hostValue: [{
type: HostBinding,
args: ['attr.value']
}], disabled: [{
type: Input
}], hostDisabled: [{
type: HostBinding,
args: ['attr.disabled']
}], hostAriaDisabled: [{
type: HostBinding,
args: ['attr.aria-disabled']
}], invalid: [{
type: Input
}], hostInvalid: [{
type: HostBinding,
args: ['attr.invalid']
}], id: [{
type: Input
}], hostId: [{
type: HostBinding,
args: ['attr.id']
}], hostAriaSelected: [{
type: HostBinding,
args: ['attr.aria-selected']
}], itemChanged: [{
type: Output
}], onFocus: [{
type: Output
}], handleFocus: [{
type: HostListener,
args: ['focus', ['$event']]
}], onClick: [{
type: HostListener,
args: ['click', ['$event']]
}], handleKeyup: [{
type: HostListener,
args: ['keyup', ['$event']]
}], handleKeyDown: [{
type: HostListener,
args: ['keydown', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdGJveC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9saXN0Ym94LWl0ZW0vbGlzdGJveC1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9saXN0Ym94LWl0ZW0vbGlzdGJveC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlSTtBQUNKLE9BQU8sRUFBNkIscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDaEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7O0FBT2hGLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSx3QkFBd0I7SUFRaEU7OztPQUdHO0lBQ0gsSUFDSSxLQUFLO1FBQ1AsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdC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QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU2pDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBV2pDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgTnVtYmVySW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlSW50ZXJhY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi9fdXRpbGl0aWVzL2FuZ3VsYXItc3BlY2lmaWMtZGlyZWN0aXZlcy9iYXNlLWludGVyYWN0aXZlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBVVUlEU2VydmljZSB9IGZyb20gJy4uL191dGlsaXRpZXMvc2VydmljZXMvdXVpZC5zZXJ2aWNlJztcbmltcG9ydCB7IENoZWNrYm94RGlyZWN0aXZlIH0gZnJvbSAnLi4vY2hlY2tib3gvY2hlY2tib3guZGlyZWN0aXZlJztcbmltcG9ydCB7IEVORF9LRVksIEVOVEVSX0tFWSwgSE9NRV9LRVksIFNQQUNFX0tFWSB9IGZyb20gJy4uL25vdmEtbGliLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBSYWRpb0RpcmVjdGl2ZSB9IGZyb20gJy4uL3JhZGlvL3JhZGlvLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUb2dnbGVDb250cm9sU2VydmljZSB9IGZyb20gJy4uL3RvZ2dsZS1jb250cm9sL3RvZ2dsZS1jb250cm9sLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBzZWxlY3RvcjogJ1t2LWxpc3Rib3gtaXRlbV0gJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3Rib3gtaXRlbS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTGlzdGJveEl0ZW1Db21wb25lbnQgZXh0ZW5kcyBCYXNlSW50ZXJhY3RpdmVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgQENvbnRlbnRDaGlsZChSYWRpb0RpcmVjdGl2ZSkgcmFkaW86IFJhZGlvRGlyZWN0aXZlO1xuICBAQ29udGVudENoaWxkKENoZWNrYm94RGlyZWN0aXZlKSBjaGVja2JveDogQ2hlY2tib3hEaXJlY3RpdmU7XG4gIF9pc1JvbGVPcHRpb25WYXJpYW50ID0gZmFsc2U7XG4gIF9tdWx0aSA9IGZhbHNlO1xuICBfZGlzYWJsZWRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBfaW52YWxpZEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGN1c3RvbSBjbGFzcyYjNDA7ZXMmIzQxOyBmb3IgY3VzdG9tIHN0eWxpbmcuXG4gICAqIEBkZWZhdWx0IC52LWxpc3Rib3gtaXRlbVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFt0aGlzLl9jbGFzcywgJ3YtbGlzdGJveC1pdGVtJywgdGhpcy5oaWdobGlnaHRlZCA/ICd2LWxpc3Rib3gtaXRlbS1oaWdobGlnaHRlZCcgOiAnJ10uam9pbignICcpO1xuICB9XG4gIHNldCBjbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2xhc3MgPSB2YWx1ZTtcbiAgfVxuICBfY2xhc3M6IHN0cmluZyA9ICcnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIGl0ZW0gYXMgc2VsZWN0ZWQgd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG4gIHNldCBhY3RpdmUodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLl9hY3RpdmUgIT09IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5fYWN0aXZlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAoY2hhbmdlZCkgdGhpcy5pdGVtQ2hhbmdlZC5lbWl0KHRoaXMuX2FjdGl2ZSk7XG4gIH1cbiAgX2FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNYXJrcyBpdGVtIGFzIGhpZ2hsaWdodGVkIHdoZW4gdHJ1ZS4gT2NjdXJzIG5hdGl2ZWx5IHdpdGggOmZvY3VzLXZpc2libGUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBoaWdobGlnaHRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0ZWQ7XG4gIH1cbiAgc2V0IGhpZ2hsaWdodGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9oaWdobGlnaHRlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2hpZ2hsaWdodGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gaW5kZXggb2YgaXRlbSB3aXRoaW4gbGlzdGJveCwgc3VwcGxpZWQgYnkgbGlzdGJveCBkaXJlY3RpdmVcbiAgLyoqIEBpZ25vcmUgKi9cbiAgQElucHV0KClcbiAgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG4gIHNldCBpbmRleCh2YWx1ZTogTnVtYmVySW5wdXQpIHtcbiAgICB0aGlzLl9pbmRleCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gcm9sZS5cbiAgICogQGRlZmF1bHQgJ29wdGlvbicgaWYgbm8gY2hpbGQgcmFkaW8gb3IgY2hlY2tib3ggaXMgcHJlc2VudC5cbiAgICogQGRlZmF1bHQgbm90IHByZXNlbnQgaWYgY2hpbGQgcmFkaW8gb3IgY2hlY2tib3ggaXMgcHJlc2VudC5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgcm9sZTogc3RyaW5nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gIGdldCBob3N0Um9sZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9pc1JvbGVPcHRpb25WYXJpYW50ICYmICF0aGlzLnJvbGUpIHtcbiAgICAgIHRoaXMucm9sZSA9ICdvcHRpb24nO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIGxpc3Rib3ggaXRlbS4gPGJyIC8+XG4gICAqIEEgdmFsdWUgPHN0cm9uZz5tdXN0PC9zdHJvbmc+IGJlIHByZXNlbnQgb24gZXZlcnkgbGlzdCBpdGVtIGlmIGl0IGRvZXMgbm90IGhhdmUgYSBjaGlsZCByYWRpbyBvciBjaGVja2JveC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cbiAgX3ZhbHVlOiBzdHJpbmcgfCBudW1iZXI7XG4gIEBIb3N0QmluZGluZygnYXR0ci52YWx1ZScpXG4gIGdldCBob3N0VmFsdWUoKTogc3RyaW5nIHwgbnVtYmVyIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGxpc3QgaXRlbSB3aXRoIDxzdHJvbmc+bm8gY2hpbGQgcmFkaW8gb3IgY2hlY2tib3g8L3N0cm9uZz4gYXMgZGlzYWJsZWQuIDxiciAvPlxuICAgKiBJZiB1c2luZyBhIGNoaWxkIHJhZGlvIG9yIGNoZWNrYm94LCBzZXQgPGNvZGU+ZGlzYWJsZWQ8L2NvZGU+IGRpcmVjdGx5IG9uIHRob3NlIGNvbXBvbmVudHMuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGlmICghdGhpcy5faXNSb2xlT3B0aW9uVmFyaWFudCkgdGhpcy5fZGlzYWJsZWRFbWl0dGVyLmVtaXQodGhpcy5kaXNhYmxlZCk7XG4gIH1cbiAgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnYXR0ci5kaXNhYmxlZCcpXG4gIGdldCBob3N0RGlzYWJsZWQoKTogbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGlzYWJsZWQnKVxuICBnZXQgaG9zdEFyaWFEaXNhYmxlZCgpOiBzdHJpbmcgfCBudWxsIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkID8gJ3RydWUnIDogbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBsaXN0IGl0ZW0gd2l0aCA8c3Ryb25nPm5vIGNoaWxkIHJhZGlvIG9yIGNoZWNrYm94PC9zdHJvbmc+IGFzIGludmFsaWQuIDxiciAvPlxuICAgKiBJZiB1c2luZyBhIGNoaWxkIHJhZGlvIG9yIGNoZWNrYm94LCBzZXQgPGNvZGU+aW52YWxpZDwvY29kZT4gZGlyZWN0bHkgb24gdGhvc2UgY29tcG9uZW50cy5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZhbGlkO1xuICB9XG4gIHNldCBpbnZhbGlkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9pbnZhbGlkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAoIXRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHRoaXMuX2ludmFsaWRFbWl0dGVyLmVtaXQodGhpcy5pbnZhbGlkKTtcbiAgfVxuICBfaW52YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuaW52YWxpZCcpXG4gIGdldCBob3N0SW52YWxpZCgpOiBzdHJpbmcgfCBudWxsIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyAnaW52YWxpZCcgOiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSBpZC5cbiAgICogQGRlZmF1bHQgdXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1saXN0Ym94LWl0ZW0tJylcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgaWQ6IHN0cmluZyA9IHRoaXMudXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1saXN0Ym94LWl0ZW0tJyk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gIGdldCBob3N0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXNlbGVjdGVkJylcbiAgZ2V0IGhvc3RBcmlhU2VsZWN0ZWQoKTogYm9vbGVhbiB8IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc1JvbGVPcHRpb25WYXJpYW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFjdGl2ZSBzdGF0ZSBvZiBpdGVtIHdoZW4gdG9nZ2xlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBpdGVtQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGlzIGl0ZW0gaXMgZm9jdXNlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBvbkZvY3VzOiBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignZm9jdXMnLCBbJyRldmVudCddKVxuICBoYW5kbGVGb2N1cyhldmVudDogRm9jdXNFdmVudCkge1xuICAgIHRoaXMub25Gb2N1cy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFVVSURTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9nZ2xlQ29udHJvbFNlcnZpY2U6IFRvZ2dsZUNvbnRyb2xTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGVsKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmFkaW8gJiYgIXRoaXMuY2hlY2tib3gpIHtcbiAgICAgIHRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHRoaXMucmFkaW8gPyB0aGlzLnJhZGlvIDogdGhpcy5jaGVja2JveCA/IHRoaXMuY2hlY2tib3ggOiBudWxsO1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgaXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBjb3JyZWN0IGNsYXNzZXMgYXQgdGhlIGxpc3Rib3gtY29udGFpbmVyIGxldmVsXG4gICAgICAgIHRoaXMuaW52YWxpZCA9IGNoaWxkLmludmFsaWQ7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBjaGlsZC5kaXNhYmxlZDtcbiAgICAgICAgY2hpbGQuX2Rpc2FibGVkRW1pdHRlci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSBjaGlsZC5kaXNhYmxlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNoaWxkLl9pbnZhbGlkRW1pdHRlci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW52YWxpZCA9IGNoaWxkLmludmFsaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGljayhldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHtcbiAgICAgIHRoaXMudG9nZ2xlQ29udHJvbFNlcnZpY2UudG9nZ2xlQ29udHJvbCh0aGlzLnJhZGlvIHx8IHRoaXMuY2hlY2tib3gsIGV2ZW50KTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RJdGVtKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXl1cCcsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleXVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9pc1JvbGVPcHRpb25WYXJpYW50KSByZXR1cm47XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gRU5URVJfS0VZIHx8IGV2ZW50LmtleSA9PT0gU1BBQ0VfS0VZKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50IHNjcm9sbGluZ1xuICAgICAgdGhpcy5jbGlja2VkLmVtaXQoKTtcbiAgICAgIGlmICghZXZlbnQuc2hpZnRLZXkpIHRoaXMuc2VsZWN0SXRlbSgpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9pc1JvbGVPcHRpb25WYXJpYW50KSByZXR1cm47XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gRU5URVJfS0VZIHx8IGV2ZW50LmtleSA9PT0gU1BBQ0VfS0VZIHx8IGV2ZW50LmtleSA9PT0gSE9NRV9LRVkgfHwgZXZlbnQua2V5ID09PSBFTkRfS0VZKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50IHNjcm9sbGluZ1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEl0ZW0oKSB7XG4gICAgaWYgKHRoaXMuX211bHRpKSB7XG4gICAgICB0aGlzLmFjdGl2ZSA9ICF0aGlzLmFjdGl2ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLVxuICogICAgICAgICAgICAgIMKpIDIwMjUgVmlzYVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuIC0tPlxuPHNwYW5cbiAgKm5nSWY9XCJfaXNSb2xlT3B0aW9uVmFyaWFudFwiXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAndi1mbGV4LXNocmluay0wJzogdHJ1ZSxcbiAgICAndi1jaGVja2JveCc6IF9tdWx0aSxcbiAgICAndi1yYWRpbyc6ICFfbXVsdGlcbiAgfVwiXG4+PC9zcGFuPlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19