UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

157 lines 24.1 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 { Injectable } from '@angular/core'; import { UUIDService } from '../_utilities/services/uuid.service'; import * as i0 from "@angular/core"; import * as i1 from "../_utilities/services/uuid.service"; /** * AccordionService is an internal service used to create accordion behavior and is used within the accordion component. */ export class AccordionService { constructor(uuidService) { this.uuidService = uuidService; /** @ignore */ this.items = []; } /** * The setUpAccordion method sets up the accordion by pairing accordion headings with their respective panels and having them reflect the same expanded state. * @param accordion Accordion to set up. * @returns void */ setUpAccordion(accordion) { this.items = []; // reset items array // provide service with necessary Directives this.accordion = accordion; this.headings = accordion.headings.toArray(); this.panels = accordion.panels.toArray(); // return or warn for edge cases of no or mismatched headings + panels if (this.headings.length === 0 || this.panels.length === 0) return; if (this.headings.length !== this.panels.length) { console.warn(` The number of accordion headings and panels are not equal. Behavior may be off as a result. Please ensure each heading has a matching panel. `); } this.headings.forEach((heading, index) => { // set index at heading level. heading._index = index; /** * Each item requires a controlling button * This will either be an [v-button][v-accordion-heading] or a child button of an accordion-heading */ let buttonHeading = heading.hostButton ? heading.hostButton : heading._buttonHeading ? heading._buttonHeading : undefined; // create array of items with each controlling button and respective panel if (this.panels[index] && buttonHeading) { this.items.push({ heading: heading, button: buttonHeading, panel: this.panels[index] }); this.setUpPanel(index, heading.expanded); this.setUpButton(buttonHeading, index, heading.expanded); } }); } /** * The setUpPanel method configures a panel with index, expanded state, and assigns an id if not provided. * @param index Index of panel to set up. * @param expanded Expanded state of panel's associated accordion item. */ setUpPanel(index, expanded) { // aligns panel index and expanded to associated heading this.panels[index]._index = index; this.panels[index]._expanded = expanded; this.panels[index].id = this.panels[index].id ? this.panels[index].id : this.uuidService.getUUID('v-accordion-panel-'); } /** * The setUpButton method configures a button with id, aria-controls, aria-expanded attributes, and the appropriate toggle icon. * @param buttonHeading Button to set up. * @param index Index of button to set up. * @param expanded Expanded state of button's associated accordion item. */ setUpButton(buttonHeading, index, expanded) { // sets up controlling button's aria properties buttonHeading.id = buttonHeading.id ? buttonHeading.id : this.uuidService.getUUID('v-accordion-button-'); buttonHeading.ariaControls = this.panels[index].id; buttonHeading.ariaExpanded = expanded; if (buttonHeading.toggleIcon) { buttonHeading.toggleIcon.class = [buttonHeading.toggleIcon.class, 'v-accordion-toggle-icon'].join(' '); if (!buttonHeading.toggleIcon._iconSet) { if (!buttonHeading.toggleIcon._expandedSet) buttonHeading.toggleIcon.expandedIcon = 'chevron-down'; if (!buttonHeading.toggleIcon._collapsedSet) buttonHeading.toggleIcon.collapsedIcon = 'chevron-right'; buttonHeading.toggleIcon.icon.icon = expanded ? buttonHeading.toggleIcon.expandedIcon : buttonHeading.toggleIcon.collapsedIcon; } } else if (buttonHeading.toggleIconComponent) { buttonHeading.toggleIconComponent._accordionToggle = true; buttonHeading.toggleIconComponent.rotated = expanded; } } /** * The toggleItem method reverses the current state of the accordion. If collapsed, it expands; if expanded, it collapses. If it was collapsed, the function will expand. If it was expanded, the function will collapse. * @param index Index of accordion item to toggle. */ toggleItem(index) { this.items[index]['heading'].expanded = !this.items[index]['heading'].expanded; } /** * The expandItem method expands the accordion by showing panel content, setting the button’s aria-expanded to true, and changing the toggle icon to expandedIcon. * @param index Index of accordion item to expand. */ expandItem(index) { if (this.items[index]) { this.items[index]['panel']._expanded = true; this.items[index]['button'].ariaExpanded = true; if (this.items[index]['button'].toggleIcon && !this.items[index]['button'].toggleIcon._iconSet) { this.items[index]['button'].toggleIcon.icon.icon = this.items[index]['button'].toggleIcon.expandedIcon; } else if (this.items[index]['button'].toggleIconComponent) { this.items[index]['button'].toggleIconComponent.rotated = true; } } } /** * The collapseItem method collapses the accordion by hiding panel content, setting the button’s aria-expanded to false, and changing the toggle icon to collapsedIcon. * @param index Index of accordion item to collapse. */ collapseItem(index) { if (this.items[index]) { this.items[index]['panel']._expanded = false; this.items[index]['button'].ariaExpanded = false; if (this.items[index]['button'].toggleIcon && !this.items[index]['button'].toggleIcon._iconSet) { this.items[index]['button'].toggleIcon.icon.icon = this.items[index]['button'].toggleIcon.collapsedIcon; } else if (this.items[index]['button'].toggleIconComponent) { this.items[index]['button'].toggleIconComponent.rotated = false; } } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionService, deps: [{ token: i1.UUIDService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.UUIDService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvYWNjb3JkaW9uL2FjY29yZGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlSTtBQUNKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7QUFNbEU7O0dBRUc7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBSTVDLGNBQWM7UUFDZCxVQUFLLEdBQXNHLEVBQUUsQ0FBQztJQUwvRCxDQUFDO0lBV2hEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsU0FBNkI7UUFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7UUFDckMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFekMsc0VBQXNFO1FBQ3RFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQ25FLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDOzs7O09BSVosQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVE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USxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ2xFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzsrR0F4SVUsZ0JBQWdCO21IQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMjUgVmlzYSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVVVJRFNlcnZpY2UgfSBmcm9tICcuLi9fdXRpbGl0aWVzL3NlcnZpY2VzL3V1aWQuc2VydmljZSc7XG5pbXBvcnQgeyBBY2NvcmRpb25IZWFkaW5nRGlyZWN0aXZlIH0gZnJvbSAnLi4vYWNjb3JkaW9uLWhlYWRpbmcvYWNjb3JkaW9uLWhlYWRpbmcuZGlyZWN0aXZlJztcbmltcG9ydCB7IEFjY29yZGlvblBhbmVsRGlyZWN0aXZlIH0gZnJvbSAnLi4vYWNjb3JkaW9uLXBhbmVsL2FjY29yZGlvbi1wYW5lbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQWNjb3JkaW9uRGlyZWN0aXZlIH0gZnJvbSAnLi9hY2NvcmRpb24uZGlyZWN0aXZlJztcblxuLyoqXG4gKiBBY2NvcmRpb25TZXJ2aWNlIGlzIGFuIGludGVybmFsIHNlcnZpY2UgdXNlZCB0byBjcmVhdGUgYWNjb3JkaW9uIGJlaGF2aW9yIGFuZCBpcyB1c2VkIHdpdGhpbiB0aGUgYWNjb3JkaW9uIGNvbXBvbmVudC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFjY29yZGlvblNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHV1aWRTZXJ2aWNlOiBVVUlEU2VydmljZSkge31cblxuICAvKiogQGlnbm9yZSAqL1xuICBhY2NvcmRpb246IEFjY29yZGlvbkRpcmVjdGl2ZTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgaXRlbXM6IHsgaGVhZGluZzogQWNjb3JkaW9uSGVhZGluZ0RpcmVjdGl2ZTsgYnV0dG9uOiBCdXR0b25EaXJlY3RpdmU7IHBhbmVsOiBBY2NvcmRpb25QYW5lbERpcmVjdGl2ZSB9W10gPSBbXTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgaGVhZGluZ3M6IEFjY29yZGlvbkhlYWRpbmdEaXJlY3RpdmVbXTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcGFuZWxzOiBBY2NvcmRpb25QYW5lbERpcmVjdGl2ZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0VXBBY2NvcmRpb24gbWV0aG9kIHNldHMgdXAgdGhlIGFjY29yZGlvbiBieSBwYWlyaW5nIGFjY29yZGlvbiBoZWFkaW5ncyB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgcGFuZWxzIGFuZCBoYXZpbmcgdGhlbSByZWZsZWN0IHRoZSBzYW1lIGV4cGFuZGVkIHN0YXRlLlxuICAgKiBAcGFyYW0gYWNjb3JkaW9uIEFjY29yZGlvbiB0byBzZXQgdXAuXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIHNldFVwQWNjb3JkaW9uKGFjY29yZGlvbjogQWNjb3JkaW9uRGlyZWN0aXZlKSB7XG4gICAgdGhpcy5pdGVtcyA9IFtdOyAvLyByZXNldCBpdGVtcyBhcnJheVxuICAgIC8vIHByb3ZpZGUgc2VydmljZSB3aXRoIG5lY2Vzc2FyeSBEaXJlY3RpdmVzXG4gICAgdGhpcy5hY2NvcmRpb24gPSBhY2NvcmRpb247XG4gICAgdGhpcy5oZWFkaW5ncyA9IGFjY29yZGlvbi5oZWFkaW5ncy50b0FycmF5KCk7XG4gICAgdGhpcy5wYW5lbHMgPSBhY2NvcmRpb24ucGFuZWxzLnRvQXJyYXkoKTtcblxuICAgIC8vIHJldHVybiBvciB3YXJuIGZvciBlZGdlIGNhc2VzIG9mIG5vIG9yIG1pc21hdGNoZWQgaGVhZGluZ3MgKyBwYW5lbHNcbiAgICBpZiAodGhpcy5oZWFkaW5ncy5sZW5ndGggPT09IDAgfHwgdGhpcy5wYW5lbHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaGVhZGluZ3MubGVuZ3RoICE9PSB0aGlzLnBhbmVscy5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUud2FybihgXG4gICAgICAgIFRoZSBudW1iZXIgb2YgYWNjb3JkaW9uIGhlYWRpbmdzIGFuZCBwYW5lbHMgYXJlIG5vdCBlcXVhbC4gXG4gICAgICAgIEJlaGF2aW9yIG1heSBiZSBvZmYgYXMgYSByZXN1bHQuIFxuICAgICAgICBQbGVhc2UgZW5zdXJlIGVhY2ggaGVhZGluZyBoYXMgYSBtYXRjaGluZyBwYW5lbC5cbiAgICAgIGApO1xuICAgIH1cblxuICAgIHRoaXMuaGVhZGluZ3MuZm9yRWFjaCgoaGVhZGluZywgaW5kZXgpID0+IHtcbiAgICAgIC8vIHNldCBpbmRleCBhdCBoZWFkaW5nIGxldmVsLlxuICAgICAgaGVhZGluZy5faW5kZXggPSBpbmRleDtcblxuICAgICAgLyoqXG4gICAgICAgKiBFYWNoIGl0ZW0gcmVxdWlyZXMgYSBjb250cm9sbGluZyBidXR0b25cbiAgICAgICAqIFRoaXMgd2lsbCBlaXRoZXIgYmUgYW4gW3YtYnV0dG9uXVt2LWFjY29yZGlvbi1oZWFkaW5nXSBvciBhIGNoaWxkIGJ1dHRvbiBvZiBhbiBhY2NvcmRpb24taGVhZGluZ1xuICAgICAgICovXG4gICAgICBsZXQgYnV0dG9uSGVhZGluZzogQnV0dG9uRGlyZWN0aXZlIHwgdW5kZWZpbmVkID0gaGVhZGluZy5ob3N0QnV0dG9uXG4gICAgICAgID8gaGVhZGluZy5ob3N0QnV0dG9uXG4gICAgICAgIDogaGVhZGluZy5fYnV0dG9uSGVhZGluZ1xuICAgICAgICAgID8gaGVhZGluZy5fYnV0dG9uSGVhZGluZ1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBjcmVhdGUgYXJyYXkgb2YgaXRlbXMgd2l0aCBlYWNoIGNvbnRyb2xsaW5nIGJ1dHRvbiBhbmQgcmVzcGVjdGl2ZSBwYW5lbFxuICAgICAgaWYgKHRoaXMucGFuZWxzW2luZGV4XSAmJiBidXR0b25IZWFkaW5nKSB7XG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh7IGhlYWRpbmc6IGhlYWRpbmcsIGJ1dHRvbjogYnV0dG9uSGVhZGluZywgcGFuZWw6IHRoaXMucGFuZWxzW2luZGV4XSB9KTtcblxuICAgICAgICB0aGlzLnNldFVwUGFuZWwoaW5kZXgsIGhlYWRpbmcuZXhwYW5kZWQpO1xuICAgICAgICB0aGlzLnNldFVwQnV0dG9uKGJ1dHRvbkhlYWRpbmcsIGluZGV4LCBoZWFkaW5nLmV4cGFuZGVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGXCoHNldFVwUGFuZWzCoG1ldGhvZCBjb25maWd1cmVzIGEgcGFuZWwgd2l0aCBpbmRleCwgZXhwYW5kZWQgc3RhdGUsIGFuZCBhc3NpZ25zIGFuIGlkIGlmIG5vdCBwcm92aWRlZC5cbiAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHBhbmVsIHRvIHNldCB1cC5cbiAgICogQHBhcmFtIGV4cGFuZGVkIEV4cGFuZGVkIHN0YXRlIG9mIHBhbmVsJ3MgYXNzb2NpYXRlZCBhY2NvcmRpb24gaXRlbS5cbiAgICovXG4gIHNldFVwUGFuZWwoaW5kZXg6IG51bWJlciwgZXhwYW5kZWQ6IGJvb2xlYW4pIHtcbiAgICAvLyBhbGlnbnMgcGFuZWwgaW5kZXggYW5kIGV4cGFuZGVkIHRvIGFzc29jaWF0ZWQgaGVhZGluZ1xuICAgIHRoaXMucGFuZWxzW2luZGV4XS5faW5kZXggPSBpbmRleDtcbiAgICB0aGlzLnBhbmVsc1tpbmRleF0uX2V4cGFuZGVkID0gZXhwYW5kZWQ7XG4gICAgdGhpcy5wYW5lbHNbaW5kZXhdLmlkID0gdGhpcy5wYW5lbHNbaW5kZXhdLmlkXG4gICAgICA/IHRoaXMucGFuZWxzW2luZGV4XS5pZFxuICAgICAgOiB0aGlzLnV1aWRTZXJ2aWNlLmdldFVVSUQoJ3YtYWNjb3JkaW9uLXBhbmVsLScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZcKgc2V0VXBCdXR0b27CoG1ldGhvZCBjb25maWd1cmVzIGEgYnV0dG9uIHdpdGggaWQsIGFyaWEtY29udHJvbHMsIGFyaWEtZXhwYW5kZWQgYXR0cmlidXRlcywgYW5kIHRoZSBhcHByb3ByaWF0ZSB0b2dnbGUgaWNvbi5cbiAgICogQHBhcmFtIGJ1dHRvbkhlYWRpbmcgQnV0dG9uIHRvIHNldCB1cC5cbiAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIGJ1dHRvbiB0byBzZXQgdXAuXG4gICAqIEBwYXJhbSBleHBhbmRlZCBFeHBhbmRlZCBzdGF0ZSBvZiBidXR0b24ncyBhc3NvY2lhdGVkIGFjY29yZGlvbiBpdGVtLlxuICAgKi9cbiAgc2V0VXBCdXR0b24oYnV0dG9uSGVhZGluZzogQnV0dG9uRGlyZWN0aXZlLCBpbmRleDogbnVtYmVyLCBleHBhbmRlZDogYm9vbGVhbikge1xuICAgIC8vIHNldHMgdXAgY29udHJvbGxpbmcgYnV0dG9uJ3MgYXJpYSBwcm9wZXJ0aWVzXG4gICAgYnV0dG9uSGVhZGluZy5pZCA9IGJ1dHRvbkhlYWRpbmcuaWQgPyBidXR0b25IZWFkaW5nLmlkIDogdGhpcy51dWlkU2VydmljZS5nZXRVVUlEKCd2LWFjY29yZGlvbi1idXR0b24tJyk7XG4gICAgYnV0dG9uSGVhZGluZy5hcmlhQ29udHJvbHMgPSB0aGlzLnBhbmVsc1tpbmRleF0uaWQ7XG4gICAgYnV0dG9uSGVhZGluZy5hcmlhRXhwYW5kZWQgPSBleHBhbmRlZDtcbiAgICBpZiAoYnV0dG9uSGVhZGluZy50b2dnbGVJY29uKSB7XG4gICAgICBidXR0b25IZWFkaW5nLnRvZ2dsZUljb24uY2xhc3MgPSBbYnV0dG9uSGVhZGluZy50b2dnbGVJY29uLmNsYXNzLCAndi1hY2NvcmRpb24tdG9nZ2xlLWljb24nXS5qb2luKCcgJyk7XG4gICAgICBpZiAoIWJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5faWNvblNldCkge1xuICAgICAgICBpZiAoIWJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5fZXhwYW5kZWRTZXQpIGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5leHBhbmRlZEljb24gPSAnY2hldnJvbi1kb3duJztcbiAgICAgICAgaWYgKCFidXR0b25IZWFkaW5nLnRvZ2dsZUljb24uX2NvbGxhcHNlZFNldCkgYnV0dG9uSGVhZGluZy50b2dnbGVJY29uLmNvbGxhcHNlZEljb24gPSAnY2hldnJvbi1yaWdodCc7XG4gICAgICAgIGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5pY29uLmljb24gPSBleHBhbmRlZFxuICAgICAgICAgID8gYnV0dG9uSGVhZGluZy50b2dnbGVJY29uLmV4cGFuZGVkSWNvblxuICAgICAgICAgIDogYnV0dG9uSGVhZGluZy50b2dnbGVJY29uLmNvbGxhcHNlZEljb247XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChidXR0b25IZWFkaW5nLnRvZ2dsZUljb25Db21wb25lbnQpIHtcbiAgICAgIGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbkNvbXBvbmVudC5fYWNjb3JkaW9uVG9nZ2xlID0gdHJ1ZTtcbiAgICAgIGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbkNvbXBvbmVudC5yb3RhdGVkID0gZXhwYW5kZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZcKgdG9nZ2xlSXRlbcKgbWV0aG9kIHJldmVyc2VzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhY2NvcmRpb24uIElmIGNvbGxhcHNlZCwgaXQgZXhwYW5kczsgaWYgZXhwYW5kZWQsIGl0IGNvbGxhcHNlcy4gSWYgaXQgd2FzIGNvbGxhcHNlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgZXhwYW5kLiBJZiBpdCB3YXMgZXhwYW5kZWQsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbGxhcHNlLlxuICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgYWNjb3JkaW9uIGl0ZW0gdG8gdG9nZ2xlLlxuICAgKi9cbiAgdG9nZ2xlSXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5pdGVtc1tpbmRleF1bJ2hlYWRpbmcnXS5leHBhbmRlZCA9ICF0aGlzLml0ZW1zW2luZGV4XVsnaGVhZGluZyddLmV4cGFuZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBleHBhbmRJdGVtIG1ldGhvZCBleHBhbmRzIHRoZSBhY2NvcmRpb24gYnkgc2hvd2luZyBwYW5lbCBjb250ZW50LCBzZXR0aW5nIHRoZSBidXR0b27igJlzIGFyaWEtZXhwYW5kZWQgdG8gdHJ1ZSwgYW5kIGNoYW5naW5nIHRoZSB0b2dnbGUgaWNvbiB0byBleHBhbmRlZEljb24uXG4gICAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiBhY2NvcmRpb24gaXRlbSB0byBleHBhbmQuXG4gICAqL1xuICBleHBhbmRJdGVtKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5pdGVtc1tpbmRleF0pIHtcbiAgICAgIHRoaXMuaXRlbXNbaW5kZXhdWydwYW5lbCddLl9leHBhbmRlZCA9IHRydWU7XG4gICAgICB0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10uYXJpYUV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10udG9nZ2xlSWNvbiAmJiAhdGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLnRvZ2dsZUljb24uX2ljb25TZXQpIHtcbiAgICAgICAgdGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLnRvZ2dsZUljb24uaWNvbi5pY29uID0gdGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLnRvZ2dsZUljb24uZXhwYW5kZWRJY29uO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10udG9nZ2xlSWNvbkNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10udG9nZ2xlSWNvbkNvbXBvbmVudC5yb3RhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbGxhcHNlSXRlbSBtZXRob2QgY29sbGFwc2VzIHRoZSBhY2NvcmRpb24gYnkgaGlkaW5nIHBhbmVsIGNvbnRlbnQsIHNldHRpbmcgdGhlIGJ1dHRvbuKAmXMgYXJpYS1leHBhbmRlZCB0byBmYWxzZSwgYW5kIGNoYW5naW5nIHRoZSB0b2dnbGUgaWNvbiB0byBjb2xsYXBzZWRJY29uLlxuICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgYWNjb3JkaW9uIGl0ZW0gdG8gY29sbGFwc2UuXG4gICAqL1xuICBjb2xsYXBzZUl0ZW0oaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLml0ZW1zW2luZGV4XSkge1xuICAgICAgdGhpcy5pdGVtc1tpbmRleF1bJ3BhbmVsJ10uX2V4cGFuZGVkID0gZmFsc2U7XG4gICAgICB0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10uYXJpYUV4cGFuZGVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLnRvZ2dsZUljb24gJiYgIXRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uLl9pY29uU2V0KSB7XG4gICAgICAgIHRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uLmljb24uaWNvbiA9IHRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uLmNvbGxhcHNlZEljb247XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uQ29tcG9uZW50LnJvdGF0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==