@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
182 lines • 21.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 } from '@angular/cdk/coercion';
import { CommonModule } from '@angular/common';
import { Component, ContentChild, EventEmitter, HostBinding, Input, Output } from '@angular/core';
import { UUIDService } from '../_utilities/services/uuid.service';
import { PanelContentDirective } from '../panel-content/panel-content.directive';
import { PanelToggleDirective } from '../panel-toggle-button/panel-toggle-button.directive';
import * as i0 from "@angular/core";
import * as i1 from "../_utilities/services/uuid.service";
export class PanelComponent {
/**
* Provides custom class(es) for custom styling.
* @default .v-panel
*/
get class() {
return [
this._class,
'v-panel',
this.responsive ? 'v-panel-responsive' : '',
this.expandable || this.toggleButton ? 'v-panel-expandable' : '',
this.skrim ? 'v-panel-skrim' : ''
].join(' ');
}
set class(value) {
this._class = value;
}
get hostClass() {
return this.class;
}
get hostId() {
return this.id;
}
get hostRole() {
if (this.role) {
return this.role;
}
}
/**
* Adds skrim (shadow overlay) to modal variant (responsive="false") when true.
* @default false
*/
get skrim() {
return this._skrim;
}
set skrim(value) {
this._skrim = coerceBooleanProperty(value);
}
/**
* Sets panel to responsive variant when true and places panel on same layer as content around it.
* @default false
*/
get responsive() {
return this._responsive;
}
set responsive(value) {
this._responsive = coerceBooleanProperty(value);
}
/**
* Sets panel to expandable variant when true.
* @default false
* @default true if panel contains a <code>PanelToggleDirective</code>.
*/
get expandable() {
return this._expandable;
}
set expandable(value) {
this._expandable = coerceBooleanProperty(value);
}
/**
* Expands panel by default when true. <br />
* To be used when <code>expandable</code> is true.
* @default false
*/
get expanded() {
return this._expanded;
}
set expanded(value) {
this._expanded = coerceBooleanProperty(value);
this.handleToggle();
this.panelToggled.emit(this.expanded);
}
get hostAriaModal() {
if (!this.responsive) {
return 'true';
}
}
constructor(uuidService) {
this.uuidService = uuidService;
this._class = '';
/**
* Sets custom id.
* @default uuidService.getUUID('v-panel-')
* @builtin true
*/
this.id = this.uuidService.getUUID('v-panel-');
this._skrim = false;
this._responsive = false;
this._expandable = false;
this._expanded = false;
/**
* Emits expanded state when panel is toggled (collapsed and expanded).
*/
this.panelToggled = new EventEmitter();
}
ngAfterContentInit() {
if (!this.responsive && !this.role) {
this.role = 'dialog';
}
if (this.toggleButton && this.toggleButton.button) {
this.toggleButton.button.ariaExpanded = this.expanded;
this.toggleButton._expanded = this.expanded;
this.toggleButton.button.clicked.subscribe(() => {
this.expanded = !this.expanded;
});
if (this.panelContent) {
this.toggleButton.button.ariaControls = this.panelContent.id;
}
}
}
handleToggle() {
if (this.toggleButton && this.toggleButton.button) {
this.toggleButton.button.ariaExpanded = this.expanded;
this.toggleButton._expanded = this.expanded;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PanelComponent, deps: [{ token: i1.UUIDService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PanelComponent, isStandalone: true, selector: "[v-panel]", inputs: { class: "class", id: "id", role: "role", skrim: "skrim", responsive: "responsive", expandable: "expandable", expanded: "expanded" }, outputs: { panelToggled: "panelToggled" }, host: { properties: { "class": "this.hostClass", "attr.id": "this.hostId", "attr.role": "this.hostRole", "attr.aria-modal": "this.hostAriaModal" } }, queries: [{ propertyName: "panelContent", first: true, predicate: PanelContentDirective, descendants: true }, { propertyName: "toggleButton", first: true, predicate: PanelToggleDirective, descendants: 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<ng-content select=\"[v-panel-toggle]\"></ng-content>\n<ng-content></ng-content>", dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PanelComponent, decorators: [{
type: Component,
args: [{ standalone: true, imports: [CommonModule], selector: '[v-panel]', 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<ng-content select=\"[v-panel-toggle]\"></ng-content>\n<ng-content></ng-content>" }]
}], ctorParameters: () => [{ type: i1.UUIDService }], propDecorators: { panelContent: [{
type: ContentChild,
args: [PanelContentDirective]
}], toggleButton: [{
type: ContentChild,
args: [PanelToggleDirective]
}], class: [{
type: Input
}], hostClass: [{
type: HostBinding,
args: ['class']
}], id: [{
type: Input
}], hostId: [{
type: HostBinding,
args: ['attr.id']
}], role: [{
type: Input
}], hostRole: [{
type: HostBinding,
args: ['attr.role']
}], skrim: [{
type: Input
}], responsive: [{
type: Input
}], expandable: [{
type: Input
}], expanded: [{
type: Input
}], panelToggled: [{
type: Output
}], hostAriaModal: [{
type: HostBinding,
args: ['attr.aria-modal']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9ub3ZhLWxpYi9zcmMvbGliL3BhbmVsL3BhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9wYW5lbC9wYW5lbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBb0IsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNEQUFzRCxDQUFDOzs7QUFTNUYsTUFBTSxPQUFPLGNBQWM7SUFJekI7OztPQUdHO0lBQ0gsSUFDSSxLQUFLO1FBQ1AsT0FBTztZQUNMLElBQUksQ0FBQyxNQUFNO1lBQ1gsU0FBUztZQUNULElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ2xDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lB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UTtzQkFEWCxLQUFLO2dCQWNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBR0gsYUFBYTtzQkFEaEIsV0FBVzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVVVJRFNlcnZpY2UgfSBmcm9tICcuLi9fdXRpbGl0aWVzL3NlcnZpY2VzL3V1aWQuc2VydmljZSc7XG5pbXBvcnQgeyBQYW5lbENvbnRlbnREaXJlY3RpdmUgfSBmcm9tICcuLi9wYW5lbC1jb250ZW50L3BhbmVsLWNvbnRlbnQuZGlyZWN0aXZlJztcbmltcG9ydCB7IFBhbmVsVG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vcGFuZWwtdG9nZ2xlLWJ1dHRvbi9wYW5lbC10b2dnbGUtYnV0dG9uLmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1t2LXBhbmVsXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYW5lbC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgQENvbnRlbnRDaGlsZChQYW5lbENvbnRlbnREaXJlY3RpdmUpIHBhbmVsQ29udGVudDogUGFuZWxDb250ZW50RGlyZWN0aXZlO1xuICBAQ29udGVudENoaWxkKFBhbmVsVG9nZ2xlRGlyZWN0aXZlKSB0b2dnbGVCdXR0b246IFBhbmVsVG9nZ2xlRGlyZWN0aXZlO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjdXN0b20gY2xhc3MmIzQwO2VzJiM0MTsgZm9yIGN1c3RvbSBzdHlsaW5nLlxuICAgKiBAZGVmYXVsdCAudi1wYW5lbFxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX2NsYXNzLFxuICAgICAgJ3YtcGFuZWwnLFxuICAgICAgdGhpcy5yZXNwb25zaXZlID8gJ3YtcGFuZWwtcmVzcG9uc2l2ZScgOiAnJyxcbiAgICAgIHRoaXMuZXhwYW5kYWJsZSB8fCB0aGlzLnRvZ2dsZUJ1dHRvbiA/ICd2LXBhbmVsLWV4cGFuZGFibGUnIDogJycsXG4gICAgICB0aGlzLnNrcmltID8gJ3YtcGFuZWwtc2tyaW0nIDogJydcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuICBzZXQgY2xhc3ModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NsYXNzID0gdmFsdWU7XG4gIH1cbiAgX2NsYXNzOiBzdHJpbmcgPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSBpZC5cbiAgICogQGRlZmF1bHQgdXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1wYW5lbC0nKVxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoKVxuICBpZDogc3RyaW5nID0gdGhpcy51dWlkU2VydmljZS5nZXRVVUlEKCd2LXBhbmVsLScpO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICBnZXQgaG9zdElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gcm9sZS5cbiAgICogQGRlZmF1bHQgJ2RpYWxvZycgaWYgcGFuZWwgaXMgbm90IHJlc3BvbnNpdmUuXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHJvbGU6IHN0cmluZyB8IHZvaWQ7XG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgZ2V0IGhvc3RSb2xlKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLnJvbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvbGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgc2tyaW0gKHNoYWRvdyBvdmVybGF5KSB0byBtb2RhbCB2YXJpYW50IChyZXNwb25zaXZlPVwiZmFsc2VcIikgd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHNrcmltKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9za3JpbTtcbiAgfVxuICBzZXQgc2tyaW0odmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3NrcmltID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfc2tyaW06IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyBwYW5lbCB0byByZXNwb25zaXZlIHZhcmlhbnQgd2hlbiB0cnVlIGFuZCBwbGFjZXMgcGFuZWwgb24gc2FtZSBsYXllciBhcyBjb250ZW50IGFyb3VuZCBpdC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByZXNwb25zaXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZXNwb25zaXZlO1xuICB9XG4gIHNldCByZXNwb25zaXZlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9yZXNwb25zaXZlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfcmVzcG9uc2l2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIHBhbmVsIHRvIGV4cGFuZGFibGUgdmFyaWFudCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBkZWZhdWx0IHRydWUgaWYgcGFuZWwgY29udGFpbnMgYSA8Y29kZT5QYW5lbFRvZ2dsZURpcmVjdGl2ZTwvY29kZT4uXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZXhwYW5kYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZTtcbiAgfVxuICBzZXQgZXhwYW5kYWJsZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZXhwYW5kYWJsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2V4cGFuZGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRXhwYW5kcyBwYW5lbCBieSBkZWZhdWx0IHdoZW4gdHJ1ZS4gPGJyIC8+XG4gICAqIFRvIGJlIHVzZWQgd2hlbiA8Y29kZT5leHBhbmRhYmxlPC9jb2RlPiBpcyB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGV4cGFuZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9leHBhbmRlZDtcbiAgfVxuICBzZXQgZXhwYW5kZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2V4cGFuZGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLmhhbmRsZVRvZ2dsZSgpO1xuICAgIHRoaXMucGFuZWxUb2dnbGVkLmVtaXQodGhpcy5leHBhbmRlZCk7XG4gIH1cbiAgX2V4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV4cGFuZGVkIHN0YXRlIHdoZW4gcGFuZWwgaXMgdG9nZ2xlZCAoY29sbGFwc2VkIGFuZCBleHBhbmRlZCkuXG4gICAqL1xuICBAT3V0cHV0KCkgcGFuZWxUb2dnbGVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLW1vZGFsJylcbiAgZ2V0IGhvc3RBcmlhTW9kYWwoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlc3BvbnNpdmUpIHtcbiAgICAgIHJldHVybiAndHJ1ZSc7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB1dWlkU2VydmljZTogVVVJRFNlcnZpY2UpIHt9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXNwb25zaXZlICYmICF0aGlzLnJvbGUpIHtcbiAgICAgIHRoaXMucm9sZSA9ICdkaWFsb2cnO1xuICAgIH1cbiAgICBpZiAodGhpcy50b2dnbGVCdXR0b24gJiYgdGhpcy50b2dnbGVCdXR0b24uYnV0dG9uKSB7XG4gICAgICB0aGlzLnRvZ2dsZUJ1dHRvbi5idXR0b24uYXJpYUV4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICAgIHRoaXMudG9nZ2xlQnV0dG9uLl9leHBhbmRlZCA9IHRoaXMuZXhwYW5kZWQ7XG5cbiAgICAgIHRoaXMudG9nZ2xlQnV0dG9uLmJ1dHRvbi5jbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZXhwYW5kZWQgPSAhdGhpcy5leHBhbmRlZDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5wYW5lbENvbnRlbnQpIHtcbiAgICAgICAgdGhpcy50b2dnbGVCdXR0b24uYnV0dG9uLmFyaWFDb250cm9scyA9IHRoaXMucGFuZWxDb250ZW50LmlkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy50b2dnbGVCdXR0b24gJiYgdGhpcy50b2dnbGVCdXR0b24uYnV0dG9uKSB7XG4gICAgICB0aGlzLnRvZ2dsZUJ1dHRvbi5idXR0b24uYXJpYUV4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICAgIHRoaXMudG9nZ2xlQnV0dG9uLl9leHBhbmRlZCA9IHRoaXMuZXhwYW5kZWQ7XG4gICAgfVxuICB9XG59XG4iLCI8IS0tXG4gKiAgICAgICAgICAgICAgwqkgMjAyNSBWaXNhXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gLS0+XG48bmctY29udGVudCBzZWxlY3Q9XCJbdi1wYW5lbC10b2dnbGVdXCI+PC9uZy1jb250ZW50PlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PiJdfQ==