igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
334 lines • 23.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ChangeDetectorRef, ElementRef, HostBinding, HostListener, Input, Host, EventEmitter, Output, ContentChild, Inject } from '@angular/core';
import { IgxExpansionPanelIconDirective } from './expansion-panel.directives';
import { IGX_EXPANSION_PANEL_COMPONENT } from './expansion-panel.common';
/** @enum {string} */
const ICON_POSITION = {
LEFT: 'left',
NONE: 'none',
RIGHT: 'right',
};
export { ICON_POSITION };
export class IgxExpansionPanelHeaderComponent {
/**
* @param {?} panel
* @param {?} cdr
* @param {?} elementRef
*/
constructor(panel, cdr, elementRef) {
this.panel = panel;
this.cdr = cdr;
this.elementRef = elementRef;
// properties section
this._iconTemplate = false;
/**
* Sets/gets the `id` of the expansion panel header.
* ```typescript
* let panelHeaderId = this.panel.header.id;
* ```
* \@memberof IgxExpansionPanelComponent
*/
this.id = '';
/**
* Gets/sets the `aria-level` attribute of the header
* Get
* ```typescript
* const currentAriaLevel = this.panel.header.lv;
* ```
* Set
* ```typescript
* this.panel.header.lv = '5';
* ```
* ```html
* <igx-expansion-panel-header [lv]="myCustomLevel"></igx-expansion-panel-header>
* ```
*/
this.lv = '3';
/**
* Gets/sets the `role` attribute of the header
* Get
* ```typescript
* const currentRole = this.panel.header.role;
* ```
* Set
* ```typescript
* this.panel.header.role = '5';
* ```
* ```html
* <igx-expansion-panel-header [role]="'custom'"></igx-expansion-panel-header>
* ```
*/
this.role = 'heading';
/**
* Gets/sets the position of the expansion-panel-header expand/collapse icon
* Accepts `left`, `right` or `none`
* ```typescript
* const currentIconPosition = this.panel.header.iconPosition;
* ```
* Set
* ```typescript
* this.panel.header.iconPosition = 'left';
* ```
* ```html
* <igx-expansion-panel-header [iconPosition]="'right'"></igx-expansion-panel-header>
* ```
*/
this.iconPosition = ICON_POSITION.LEFT;
/**
* Emitted whenever a user interacts with the header host
* ```typescript
* handleInteraction(event: IExpansionPanelEventArgs) {
* ...
* }
* ```
* ```html
* <igx-expansion-panel-header (onInteraction)="handleInteraction($event)">
* ...
* </igx-expansion-panel-header>
* ```
*/
this.onInteraction = new EventEmitter();
/**
* @hidden
*/
this.cssClass = 'igx-expansion-panel__header';
/**
* Gets/sets the whether the header is disabled
* When disabled, the header will not handle user events and will stop their propagation
*
* ```typescript
* const isDisabled = this.panel.header.disabled;
* ```
* Set
* ```typescript
* this.panel.header.disabled = true;
* ```
* ```html
* <igx-expansion-panel-header [disabled]="true">
* ...
* </igx-expansion-panel-header>
* ```
*/
this.disabled = false;
this.id = `${this.panel.id}-header`;
}
/**
* @hidden
* @param {?} val
* @return {?}
*/
set iconTemplate(val) {
this._iconTemplate = (/** @type {?} */ (val));
}
/**
* @hidden
* @return {?}
*/
get iconTemplate() {
return this._iconTemplate;
}
/**
* @hidden
* @return {?}
*/
get controls() {
return this.panel.id;
}
/**
* @hidden
* @return {?}
*/
get isExpanded() {
return !this.panel.collapsed;
}
/**
* @hidden
* @param {?=} evt
* @return {?}
*/
onAction(evt) {
if (this.disabled) {
evt.stopPropagation();
return;
}
this.onInteraction.emit({ event: evt, panel: this.panel });
this.panel.toggle(evt);
evt.preventDefault();
}
/**
* @hidden \@internal
* @param {?} event
* @return {?}
*/
openPanel(event) {
if (event.altKey) {
this.panel.expand(event);
this.onInteraction.emit({ event: event, panel: this.panel });
}
}
/**
* @hidden \@internal
* @param {?} event
* @return {?}
*/
closePanel(event) {
if (event.altKey) {
this.panel.collapse(event);
this.onInteraction.emit({ event: event, panel: this.panel });
}
}
/**
* @hidden
* @return {?}
*/
get iconPositionClass() {
switch (this.iconPosition) {
case (ICON_POSITION.LEFT):
return `igx-expansion-panel__header-icon--start`;
case (ICON_POSITION.RIGHT):
return `igx-expansion-panel__header-icon--end`;
case (ICON_POSITION.NONE):
return `igx-expansion-panel__header-icon--none`;
default:
return '';
}
}
}
IgxExpansionPanelHeaderComponent.decorators = [
{ type: Component, args: [{
selector: 'igx-expansion-panel-header',
template: "<div class=\"igx-expansion-panel__header-inner\" tabindex=\"0\" role=\"button\" [attr.id]=\"id\"\n[attr.aria-disabled]=\"disabled\" [attr.aria-expanded]=\"isExpanded\" [attr.aria-controls]=\"controls\">\n <div class=\"igx-expansion-panel__title-wrapper\">\n <ng-content select=\"igx-expansion-panel-title\"></ng-content>\n <ng-content select=\"igx-expansion-panel-description\"></ng-content>\n </div>\n <ng-content></ng-content>\n <div [class]=\"iconPositionClass\">\n <ng-content *ngIf=\"iconTemplate\" select=\"igx-expansion-panel-icon\"></ng-content>\n <igx-icon *ngIf=\"!iconTemplate\" fontSet=\"material\">\n {{panel.collapsed? 'expand_more':'expand_less'}}\n </igx-icon>\n </div>\n</div>\n"
}] }
];
/** @nocollapse */
IgxExpansionPanelHeaderComponent.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Host }, { type: Inject, args: [IGX_EXPANSION_PANEL_COMPONENT,] }] },
{ type: ChangeDetectorRef },
{ type: ElementRef }
];
IgxExpansionPanelHeaderComponent.propDecorators = {
iconTemplate: [{ type: ContentChild, args: [IgxExpansionPanelIconDirective,] }],
lv: [{ type: HostBinding, args: ['attr.aria-level',] }, { type: Input }],
role: [{ type: HostBinding, args: ['attr.role',] }, { type: Input }],
iconPosition: [{ type: Input }],
onInteraction: [{ type: Output }],
cssClass: [{ type: HostBinding, args: ['class.igx-expansion-panel__header',] }],
isExpanded: [{ type: HostBinding, args: ['class.igx-expansion-panel__header--expanded',] }],
disabled: [{ type: Input }, { type: HostBinding, args: ['class.igx-expansion-panel--disabled',] }],
onAction: [{ type: HostListener, args: ['keydown.Enter', ['$event'],] }, { type: HostListener, args: ['keydown.Space', ['$event'],] }, { type: HostListener, args: ['keydown.Spacebar', ['$event'],] }, { type: HostListener, args: ['click', ['$event'],] }],
openPanel: [{ type: HostListener, args: ['keydown.Alt.ArrowDown', ['$event'],] }],
closePanel: [{ type: HostListener, args: ['keydown.Alt.ArrowUp', ['$event'],] }]
};
if (false) {
/**
* @type {?}
* @private
*/
IgxExpansionPanelHeaderComponent.prototype._iconTemplate;
/**
* Sets/gets the `id` of the expansion panel header.
* ```typescript
* let panelHeaderId = this.panel.header.id;
* ```
* \@memberof IgxExpansionPanelComponent
* @type {?}
*/
IgxExpansionPanelHeaderComponent.prototype.id;
/**
* Gets/sets the `aria-level` attribute of the header
* Get
* ```typescript
* const currentAriaLevel = this.panel.header.lv;
* ```
* Set
* ```typescript
* this.panel.header.lv = '5';
* ```
* ```html
* <igx-expansion-panel-header [lv]="myCustomLevel"></igx-expansion-panel-header>
* ```
* @type {?}
*/
IgxExpansionPanelHeaderComponent.prototype.lv;
/**
* Gets/sets the `role` attribute of the header
* Get
* ```typescript
* const currentRole = this.panel.header.role;
* ```
* Set
* ```typescript
* this.panel.header.role = '5';
* ```
* ```html
* <igx-expansion-panel-header [role]="'custom'"></igx-expansion-panel-header>
* ```
* @type {?}
*/
IgxExpansionPanelHeaderComponent.prototype.role;
/**
* Gets/sets the position of the expansion-panel-header expand/collapse icon
* Accepts `left`, `right` or `none`
* ```typescript
* const currentIconPosition = this.panel.header.iconPosition;
* ```
* Set
* ```typescript
* this.panel.header.iconPosition = 'left';
* ```
* ```html
* <igx-expansion-panel-header [iconPosition]="'right'"></igx-expansion-panel-header>
* ```
* @type {?}
*/
IgxExpansionPanelHeaderComponent.prototype.iconPosition;
/**
* Emitted whenever a user interacts with the header host
* ```typescript
* handleInteraction(event: IExpansionPanelEventArgs) {
* ...
* }
* ```
* ```html
* <igx-expansion-panel-header (onInteraction)="handleInteraction($event)">
* ...
* </igx-expansion-panel-header>
* ```
* @type {?}
*/
IgxExpansionPanelHeaderComponent.prototype.onInteraction;
/**
* @hidden
* @type {?}
*/
IgxExpansionPanelHeaderComponent.prototype.cssClass;
/**
* Gets/sets the whether the header is disabled
* When disabled, the header will not handle user events and will stop their propagation
*
* ```typescript
* const isDisabled = this.panel.header.disabled;
* ```
* Set
* ```typescript
* this.panel.header.disabled = true;
* ```
* ```html
* <igx-expansion-panel-header [disabled]="true">
* ...
* </igx-expansion-panel-header>
* ```
* @type {?}
*/
IgxExpansionPanelHeaderComponent.prototype.disabled;
/** @type {?} */
IgxExpansionPanelHeaderComponent.prototype.panel;
/** @type {?} */
IgxExpansionPanelHeaderComponent.prototype.cdr;
/** @type {?} */
IgxExpansionPanelHeaderComponent.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2V4cGFuc2lvbi1wYW5lbC9leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLElBQUksRUFDSixZQUFZLEVBQ1osTUFBTSxFQUNOLFlBQVksRUFDWixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUUsT0FBTyxFQUE0Qiw2QkFBNkIsRUFBeUIsTUFBTSwwQkFBMEIsQ0FBQzs7O0lBTXRILE1BQU8sTUFBTTtJQUNiLE1BQU8sTUFBTTtJQUNiLE9BQVEsT0FBTzs7O0FBUW5CLE1BQU0sT0FBTyxnQ0FBZ0M7Ozs7OztJQTBJekMsWUFBa0UsS0FBNEIsRUFBUyxHQUFzQixFQUNySCxVQUFzQjtRQURvQyxVQUFLLEdBQUwsS0FBSyxDQUF1QjtRQUFTLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3JILGVBQVUsR0FBVixVQUFVLENBQVk7O1FBekl0QixrQkFBYSxHQUFHLEtBQUssQ0FBQzs7Ozs7Ozs7UUFRdkIsT0FBRSxHQUFHLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O1FBaUNSLE9BQUUsR0FBRyxHQUFHLENBQUM7Ozs7Ozs7Ozs7Ozs7OztRQWtCVCxTQUFJLEdBQUcsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7UUF3QmpCLGlCQUFZLEdBQWtCLGFBQWEsQ0FBQyxJQUFJLENBQUM7Ozs7Ozs7Ozs7Ozs7O1FBZ0JqRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDOzs7O1FBTTVELGFBQVEsR0FBRyw2QkFBNkIs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LFFBQVEsQ0FBQyxjQUN4QyxZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ3hDLFlBQVksU0FBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUMzQyxZQUFZLFNBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO3dCQVlqQyxZQUFZLFNBQUMsdUJBQXVCLEVBQUUsQ0FBQyxRQUFRLENBQUM7eUJBUy9DLFlBQVksU0FBQyxxQkFBcUIsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7Ozs7OztJQXhLaEQseURBQThCOzs7Ozs7Ozs7SUFROUIsOENBQWU7Ozs7Ozs7Ozs7Ozs7Ozs7SUErQmYsOENBRWdCOzs7Ozs7Ozs7Ozs7Ozs7O0lBZ0JoQixnREFFd0I7Ozs7Ozs7Ozs7Ozs7Ozs7SUF1QnhCLHdEQUN3RDs7Ozs7Ozs7Ozs7Ozs7O0lBZXhELHlEQUNvRTs7Ozs7SUFLbkUsb0RBQ2dEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBMkJqRCxvREFFd0I7O0lBRVosaURBQWtGOztJQUFFLCtDQUE2Qjs7SUFDNUgsc0RBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgSG9zdCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgT3V0cHV0LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBJbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hFeHBhbnNpb25QYW5lbEljb25EaXJlY3RpdmUgfSBmcm9tICcuL2V4cGFuc2lvbi1wYW5lbC5kaXJlY3RpdmVzJztcbmltcG9ydCB7IElFeHBhbnNpb25QYW5lbEV2ZW50QXJncywgSUdYX0VYUEFOU0lPTl9QQU5FTF9DT01QT05FTlQsIElneEV4cGFuc2lvblBhbmVsQmFzZSB9IGZyb20gJy4vZXhwYW5zaW9uLXBhbmVsLmNvbW1vbic7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZW51bSBJQ09OX1BPU0lUSU9OIHtcbiAgICBMRUZUID0gJ2xlZnQnLFxuICAgIE5PTkUgPSAnbm9uZScsXG4gICAgUklHSFQgPSAncmlnaHQnXG59XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcicsXG4gICAgdGVtcGxhdGVVcmw6ICdleHBhbnNpb24tcGFuZWwtaGVhZGVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hFeHBhbnNpb25QYW5lbEhlYWRlckNvbXBvbmVudCB7XG4gICAgIC8vIHByb3BlcnRpZXMgc2VjdGlvblxuICAgIHByaXZhdGUgX2ljb25UZW1wbGF0ZSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGlkYCBvZiB0aGUgZXhwYW5zaW9uIHBhbmVsIGhlYWRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHBhbmVsSGVhZGVySWQgPSAgdGhpcy5wYW5lbC5oZWFkZXIuaWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneEV4cGFuc2lvblBhbmVsQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGlkID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hFeHBhbnNpb25QYW5lbEljb25EaXJlY3RpdmUpXG4gICAgcHVibGljIHNldCBpY29uVGVtcGxhdGUodmFsOiBhbnkpIHtcbiAgICAgICAgdGhpcy5faWNvblRlbXBsYXRlID0gPGJvb2xlYW4+dmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGljb25UZW1wbGF0ZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWNvblRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgYGFyaWEtbGV2ZWxgIGF0dHJpYnV0ZSBvZiB0aGUgaGVhZGVyXG4gICAgICogR2V0XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBjdXJyZW50QXJpYUxldmVsID0gdGhpcy5wYW5lbC5oZWFkZXIubHY7XG4gICAgICogYGBgXG4gICAgICogU2V0XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICB0aGlzLnBhbmVsLmhlYWRlci5sdiA9ICc1JztcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciBbbHZdPVwibXlDdXN0b21MZXZlbFwiPjwvaWd4LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbGV2ZWwnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGx2ID0gJzMnO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9zZXRzIHRoZSBgcm9sZWAgYXR0cmlidXRlIG9mIHRoZSBoZWFkZXJcbiAgICAgKiBHZXRcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IGN1cnJlbnRSb2xlID0gdGhpcy5wYW5lbC5oZWFkZXIucm9sZTtcbiAgICAgKiBgYGBcbiAgICAgKiBTZXRcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIHRoaXMucGFuZWwuaGVhZGVyLnJvbGUgPSAnNSc7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIgW3JvbGVdPVwiJ2N1c3RvbSdcIj48L2lneC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb2xlID0gJ2hlYWRpbmcnO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29udHJvbHMgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhbmVsLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGV4cGFuc2lvbi1wYW5lbC1oZWFkZXIgZXhwYW5kL2NvbGxhcHNlIGljb25cbiAgICAgKiBBY2NlcHRzIGBsZWZ0YCwgYHJpZ2h0YCBvciBgbm9uZWBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IGN1cnJlbnRJY29uUG9zaXRpb24gPSB0aGlzLnBhbmVsLmhlYWRlci5pY29uUG9zaXRpb247XG4gICAgICogYGBgXG4gICAgICogU2V0XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICB0aGlzLnBhbmVsLmhlYWRlci5pY29uUG9zaXRpb24gPSAnbGVmdCc7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIgW2ljb25Qb3NpdGlvbl09XCIncmlnaHQnXCI+PC9pZ3gtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpY29uUG9zaXRpb246IElDT05fUE9TSVRJT04gPSBJQ09OX1BPU0lUSU9OLkxFRlQ7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW5ldmVyIGEgdXNlciBpbnRlcmFjdHMgd2l0aCB0aGUgaGVhZGVyIGhvc3RcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGhhbmRsZUludGVyYWN0aW9uKGV2ZW50OiBJRXhwYW5zaW9uUGFuZWxFdmVudEFyZ3MpIHtcbiAgICAgKiAgLi4uXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIChvbkludGVyYWN0aW9uKT1cImhhbmRsZUludGVyYWN0aW9uKCRldmVudClcIj5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICA8L2lneC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkludGVyYWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxJRXhwYW5zaW9uUGFuZWxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWV4cGFuc2lvbi1wYW5lbF9faGVhZGVyJylcbiAgICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1leHBhbnNpb24tcGFuZWxfX2hlYWRlcic7XG5cbiAgICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1leHBhbnNpb24tcGFuZWxfX2hlYWRlci0tZXhwYW5kZWQnKVxuICAgICBwdWJsaWMgZ2V0IGlzRXhwYW5kZWQgKCkge1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLnBhbmVsLmNvbGxhcHNlZDtcbiAgICAgICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgd2hldGhlciB0aGUgaGVhZGVyIGlzIGRpc2FibGVkXG4gICAgICogV2hlbiBkaXNhYmxlZCwgdGhlIGhlYWRlciB3aWxsIG5vdCBoYW5kbGUgdXNlciBldmVudHMgYW5kIHdpbGwgc3RvcCB0aGVpciBwcm9wYWdhdGlvblxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5wYW5lbC5oZWFkZXIuZGlzYWJsZWQ7XG4gICAgICogYGBgXG4gICAgICogU2V0XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICB0aGlzLnBhbmVsLmhlYWRlci5kaXNhYmxlZCA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIgW2Rpc2FibGVkXT1cInRydWVcIj5cbiAgICAgKiAgICAgLi4uXG4gICAgICogIDwvaWd4LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1leHBhbnNpb24tcGFuZWwtLWRpc2FibGVkJylcbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKEBIb3N0KCkgQEluamVjdChJR1hfRVhQQU5TSU9OX1BBTkVMX0NPTVBPTkVOVCkgcHVibGljIHBhbmVsOiBJZ3hFeHBhbnNpb25QYW5lbEJhc2UsIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgICAgICAgdGhpcy5pZCA9IGAke3RoaXMucGFuZWwuaWR9LWhlYWRlcmA7XG4gICAgIH1cblxuICAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uRW50ZXInLCBbJyRldmVudCddKVxuICAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLlNwYWNlJywgWyckZXZlbnQnXSlcbiAgICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5TcGFjZWJhcicsIFsnJGV2ZW50J10pXG4gICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICAgcHVibGljIG9uQWN0aW9uKGV2dD86IEV2ZW50KSB7XG4gICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgfVxuICAgICAgICAgdGhpcy5vbkludGVyYWN0aW9uLmVtaXQoeyBldmVudDogZXZ0LCBwYW5lbDogdGhpcy5wYW5lbCB9KTtcbiAgICAgICAgIHRoaXMucGFuZWwudG9nZ2xlKGV2dCk7XG4gICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5BbHQuQXJyb3dEb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb3BlblBhbmVsKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgIHRoaXMucGFuZWwuZXhwYW5kKGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMub25JbnRlcmFjdGlvbi5lbWl0KHsgZXZlbnQ6IGV2ZW50LCBwYW5lbDogdGhpcy5wYW5lbCB9KTtcbiAgICAgICAgfVxuICAgICB9XG5cbiAgICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uQWx0LkFycm93VXAnLCBbJyRldmVudCddKVxuICAgICBwdWJsaWMgY2xvc2VQYW5lbChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICB0aGlzLnBhbmVsLmNvbGxhcHNlKGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMub25JbnRlcmFjdGlvbi5lbWl0KHsgZXZlbnQ6IGV2ZW50LCBwYW5lbDogdGhpcy5wYW5lbCB9KTtcbiAgICAgICAgfVxuICAgICB9XG5cbiAgICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgICBwdWJsaWMgZ2V0IGljb25Qb3NpdGlvbkNsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5pY29uUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgKElDT05fUE9TSVRJT04uTEVGVCk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBpZ3gtZXhwYW5zaW9uLXBhbmVsX19oZWFkZXItaWNvbi0tc3RhcnRgO1xuICAgICAgICAgICAgY2FzZSAoSUNPTl9QT1NJVElPTi5SSUdIVCk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBpZ3gtZXhwYW5zaW9uLXBhbmVsX19oZWFkZXItaWNvbi0tZW5kYDtcbiAgICAgICAgICAgIGNhc2UgKElDT05fUE9TSVRJT04uTk9ORSk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBpZ3gtZXhwYW5zaW9uLXBhbmVsX19oZWFkZXItaWNvbi0tbm9uZWA7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICB9XG59XG4iXX0=