@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
182 lines • 21.2 kB
JavaScript
/**
* 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 } 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 * Copyright (c) 2025 Visa, Inc.\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 * Copyright (c) 2025 Visa, Inc.\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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UTtzQkFEWCxLQUFLO2dCQWNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBR0gsYUFBYTtzQkFEaEIsV0FBVzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMjUgVmlzYSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVVUlEU2VydmljZSB9IGZyb20gJy4uL191dGlsaXRpZXMvc2VydmljZXMvdXVpZC5zZXJ2aWNlJztcbmltcG9ydCB7IFBhbmVsQ29udGVudERpcmVjdGl2ZSB9IGZyb20gJy4uL3BhbmVsLWNvbnRlbnQvcGFuZWwtY29udGVudC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUGFuZWxUb2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi9wYW5lbC10b2dnbGUtYnV0dG9uL3BhbmVsLXRvZ2dsZS1idXR0b24uZGlyZWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnW3YtcGFuZWxdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhbmVsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBQYW5lbENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICBAQ29udGVudENoaWxkKFBhbmVsQ29udGVudERpcmVjdGl2ZSkgcGFuZWxDb250ZW50OiBQYW5lbENvbnRlbnREaXJlY3RpdmU7XG4gIEBDb250ZW50Q2hpbGQoUGFuZWxUb2dnbGVEaXJlY3RpdmUpIHRvZ2dsZUJ1dHRvbjogUGFuZWxUb2dnbGVEaXJlY3RpdmU7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGN1c3RvbSBjbGFzcyYjNDA7ZXMmIzQxOyBmb3IgY3VzdG9tIHN0eWxpbmcuXG4gICAqIEBkZWZhdWx0IC52LXBhbmVsXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5fY2xhc3MsXG4gICAgICAndi1wYW5lbCcsXG4gICAgICB0aGlzLnJlc3BvbnNpdmUgPyAndi1wYW5lbC1yZXNwb25zaXZlJyA6ICcnLFxuICAgICAgdGhpcy5leHBhbmRhYmxlIHx8IHRoaXMudG9nZ2xlQnV0dG9uID8gJ3YtcGFuZWwtZXhwYW5kYWJsZScgOiAnJyxcbiAgICAgIHRoaXMuc2tyaW0gPyAndi1wYW5lbC1za3JpbScgOiAnJ1xuICAgIF0uam9pbignICcpO1xuICB9XG4gIHNldCBjbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2xhc3MgPSB2YWx1ZTtcbiAgfVxuICBfY2xhc3M6IHN0cmluZyA9ICcnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY3VzdG9tIGlkLlxuICAgKiBAZGVmYXVsdCB1dWlkU2VydmljZS5nZXRVVUlEKCd2LXBhbmVsLScpXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGlkOiBzdHJpbmcgPSB0aGlzLnV1aWRTZXJ2aWNlLmdldFVVSUQoJ3YtcGFuZWwtJyk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gIGdldCBob3N0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSByb2xlLlxuICAgKiBAZGVmYXVsdCAnZGlhbG9nJyBpZiBwYW5lbCBpcyBub3QgcmVzcG9uc2l2ZS5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgcm9sZTogc3RyaW5nIHwgdm9pZDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICBnZXQgaG9zdFJvbGUoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMucm9sZSkge1xuICAgICAgcmV0dXJuIHRoaXMucm9sZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBza3JpbSAoc2hhZG93IG92ZXJsYXkpIHRvIG1vZGFsIHZhcmlhbnQgKHJlc3BvbnNpdmU9XCJmYWxzZVwiKSB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgc2tyaW0oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NrcmltO1xuICB9XG4gIHNldCBza3JpbSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fc2tyaW0gPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9za3JpbTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIHBhbmVsIHRvIHJlc3BvbnNpdmUgdmFyaWFudCB3aGVuIHRydWUgYW5kIHBsYWNlcyBwYW5lbCBvbiBzYW1lIGxheWVyIGFzIGNvbnRlbnQgYXJvdW5kIGl0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHJlc3BvbnNpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNpdmU7XG4gIH1cbiAgc2V0IHJlc3BvbnNpdmUodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3Jlc3BvbnNpdmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9yZXNwb25zaXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgcGFuZWwgdG8gZXhwYW5kYWJsZSB2YXJpYW50IHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlZmF1bHQgdHJ1ZSBpZiBwYW5lbCBjb250YWlucyBhIDxjb2RlPlBhbmVsVG9nZ2xlRGlyZWN0aXZlPC9jb2RlPi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBleHBhbmRhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9leHBhbmRhYmxlO1xuICB9XG4gIHNldCBleHBhbmRhYmxlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9leHBhbmRhYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfZXhwYW5kYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBFeHBhbmRzIHBhbmVsIGJ5IGRlZmF1bHQgd2hlbiB0cnVlLiA8YnIgLz5cbiAgICogVG8gYmUgdXNlZCB3aGVuIDxjb2RlPmV4cGFuZGFibGU8L2NvZGU+IGlzIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZXhwYW5kZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2V4cGFuZGVkO1xuICB9XG4gIHNldCBleHBhbmRlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZXhwYW5kZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuaGFuZGxlVG9nZ2xlKCk7XG4gICAgdGhpcy5wYW5lbFRvZ2dsZWQuZW1pdCh0aGlzLmV4cGFuZGVkKTtcbiAgfVxuICBfZXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRW1pdHMgZXhwYW5kZWQgc3RhdGUgd2hlbiBwYW5lbCBpcyB0b2dnbGVkIChjb2xsYXBzZWQgYW5kIGV4cGFuZGVkKS5cbiAgICovXG4gIEBPdXRwdXQoKSBwYW5lbFRvZ2dsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbW9kYWwnKVxuICBnZXQgaG9zdEFyaWFNb2RhbCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVzcG9uc2l2ZSkge1xuICAgICAgcmV0dXJuICd0cnVlJztcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHV1aWRTZXJ2aWNlOiBVVUlEU2VydmljZSkge31cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlc3BvbnNpdmUgJiYgIXRoaXMucm9sZSkge1xuICAgICAgdGhpcy5yb2xlID0gJ2RpYWxvZyc7XG4gICAgfVxuICAgIGlmICh0aGlzLnRvZ2dsZUJ1dHRvbiAmJiB0aGlzLnRvZ2dsZUJ1dHRvbi5idXR0b24pIHtcbiAgICAgIHRoaXMudG9nZ2xlQnV0dG9uLmJ1dHRvbi5hcmlhRXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkO1xuICAgICAgdGhpcy50b2dnbGVCdXR0b24uX2V4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcblxuICAgICAgdGhpcy50b2dnbGVCdXR0b24uYnV0dG9uLmNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLnBhbmVsQ29udGVudCkge1xuICAgICAgICB0aGlzLnRvZ2dsZUJ1dHRvbi5idXR0b24uYXJpYUNvbnRyb2xzID0gdGhpcy5wYW5lbENvbnRlbnQuaWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVG9nZ2xlKCkge1xuICAgIGlmICh0aGlzLnRvZ2dsZUJ1dHRvbiAmJiB0aGlzLnRvZ2dsZUJ1dHRvbi5idXR0b24pIHtcbiAgICAgIHRoaXMudG9nZ2xlQnV0dG9uLmJ1dHRvbi5hcmlhRXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkO1xuICAgICAgdGhpcy50b2dnbGVCdXR0b24uX2V4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICB9XG4gIH1cbn1cbiIsIjwhLS1cbiAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMjUgVmlzYSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuIC0tPlxuPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3YtcGFuZWwtdG9nZ2xlXVwiPjwvbmctY29udGVudD5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD4iXX0=