carbon-components-angular
Version:
Next generation components
246 lines • 21.1 kB
JavaScript
import { Component, Input, Output, EventEmitter, HostBinding, TemplateRef } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
/**
* The `Tab` component is a child of the `Tabs` component.
* It represents one `Tab` item and its content within a panel of other `Tab` items.
*
* `Tab` takes a string or `TemplateRef` for the header, and any content for the body of the tab.
* Disabled states should be handled by the application (ie. switch to the tab, but display some
* indication as to _why_ the tab is disabled).
*
* When the tab is selected the `select` output will be triggered.
* The `select` output will also be triggered for the active tab when the tabs are loaded or updated.
*
*
* Tab with string header:
*
* ```html
* <cds-tab heading='tab1'>
* tab 1 content
* </cds-tab>
* ```
*
* Tab with custom header:
*
* ```html
* <ng-template #tabHeading>
* <svg cdsIcon="facebook"
* size="sm"
* style="margin-right: 7px;">
* </svg>
* Hello Tab 1
* </ng-template>
* <cds-tabs>
* <cds-tab [heading]="tabHeading">
* Tab 1 content <svg cdsIcon="alert" size="lg"></svg>
* </cds-tab>
* <cds-tab heading='Tab2'>
* Tab 2 content
* </cds-tab>
* <cds-tab heading='Tab3'>
* Tab 3 content
* </cds-tab>
* </cds-tabs>
* ```
*/
export class Tab {
constructor() {
this.tabContentClass = true;
this.panelRole = "tabpanel";
this.panelAriaLive = "polite";
/**
* Boolean value reflects if the `Tab` is using a custom template for the heading.
* Default value is false.
*/
this.headingIsTemplate = false;
/**
* Indicates whether the `Tab` is active/selected.
* Determines whether its tab panel content is rendered.
*/
this.active = false;
/**
* Indicates whether or not the `Tab` item is disabled.
*/
this.disabled = false;
/**
* `tabindex` on the tab panel, the parent may set this to `null` when `isNavigation` is `true`.
*/
this.tabIndex = 0;
/**
* Sets the id of the `Tab`. Will be uniquely generated if not provided.
*/
this.id = `n-tab-${Tab.counter++}`;
/**
* Sets the aria-label of the close button when the parent `Tabs` uses `dismissable`.
*/
this.closeButtonAriaLabel = "Press delete to remove tab";
/**
* Icon-only tab: pair with `icon` and `iconLabel`.
*/
this.iconOnly = false;
/**
* **Preview**: Icon-only tabs — show a notification dot on the icon.
*/
this.badgeIndicator = false;
/**
* Icon-only tabs: open the tooltip on first render.
*/
this.isTooltipOpen = false;
/**
* Emits when this tab becomes selected.
*/
this.selected = new EventEmitter();
/**
* Emits when this tab's close button is pressed.
*/
this.tabClose = new EventEmitter();
this._cacheActive = false;
}
get hostId() {
return this.id;
}
get hostAriaLabelledby() {
return `${this.id}-header`;
}
get hostTabIndex() {
return this.tabIndex;
}
/**
* `hidden` + display keep inactive panels out of layout; `null` display when active preserves grid/flex.
*/
get hostHidden() {
return this.active ? null : "";
}
get hostDisplay() {
return this.active ? "block" : "none";
}
/**
* Set to `true` to have `Tab` items cached and not reloaded on tab switching.
*/
set cacheActive(shouldCache) {
this._cacheActive = shouldCache;
}
get cacheActive() {
return this._cacheActive;
}
/**
* Checks for custom heading template on initialization and updates the value
* of the boolean 'headingIsTemplate'.
*/
ngOnInit() {
if (this.heading instanceof TemplateRef) {
this.headingIsTemplate = true;
}
}
/**
* Emit the status of the `Tab`, specifically 'select' and 'selected' properties.
*/
doSelect() {
this.selected.emit();
}
/**
* Returns value indicating whether this `Tab` should be rendered in a tab panel.
*/
shouldRender() {
return this.active || this.cacheActive;
}
isTemplate(value) {
return value instanceof TemplateRef;
}
}
Tab.counter = 0;
Tab.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Tab, deps: [], target: i0.ɵɵFactoryTarget.Component });
Tab.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: Tab, selector: "cds-tab, ibm-tab", inputs: { cacheActive: "cacheActive", heading: "heading", title: "title", context: "context", active: "active", disabled: "disabled", tabIndex: "tabIndex", id: "id", tabContent: "tabContent", templateContext: "templateContext", icon: "icon", secondaryLabel: "secondaryLabel", closeButtonAriaLabel: "closeButtonAriaLabel", iconOnly: "iconOnly", iconLabel: "iconLabel", badgeIndicator: "badgeIndicator", enterDelayMs: "enterDelayMs", leaveDelayMs: "leaveDelayMs", isTooltipOpen: "isTooltipOpen" }, outputs: { selected: "selected", tabClose: "tabClose" }, host: { properties: { "attr.id": "this.hostId", "attr.aria-labelledby": "this.hostAriaLabelledby", "attr.tabindex": "this.hostTabIndex", "attr.hidden": "this.hostHidden", "style.display": "this.hostDisplay", "class.cds--tab-content": "this.tabContentClass", "attr.role": "this.panelRole", "attr.aria-live": "this.panelAriaLive" } }, ngImport: i0, template: `
<ng-container *ngIf="shouldRender()">
<ng-template
*ngIf="isTemplate(tabContent)"
[ngTemplateOutlet]="tabContent"
[ngTemplateOutletContext]="{ $implicit: templateContext }">
</ng-template>
<ng-content></ng-content>
</ng-container>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Tab, decorators: [{
type: Component,
args: [{
selector: "cds-tab, ibm-tab",
template: `
<ng-container *ngIf="shouldRender()">
<ng-template
*ngIf="isTemplate(tabContent)"
[ngTemplateOutlet]="tabContent"
[ngTemplateOutletContext]="{ $implicit: templateContext }">
</ng-template>
<ng-content></ng-content>
</ng-container>
`
}]
}], propDecorators: { hostId: [{
type: HostBinding,
args: ["attr.id"]
}], hostAriaLabelledby: [{
type: HostBinding,
args: ["attr.aria-labelledby"]
}], hostTabIndex: [{
type: HostBinding,
args: ["attr.tabindex"]
}], hostHidden: [{
type: HostBinding,
args: ["attr.hidden"]
}], hostDisplay: [{
type: HostBinding,
args: ["style.display"]
}], cacheActive: [{
type: Input
}], tabContentClass: [{
type: HostBinding,
args: ["class.cds--tab-content"]
}], panelRole: [{
type: HostBinding,
args: ["attr.role"]
}], panelAriaLive: [{
type: HostBinding,
args: ["attr.aria-live"]
}], heading: [{
type: Input
}], title: [{
type: Input
}], context: [{
type: Input
}], active: [{
type: Input
}], disabled: [{
type: Input
}], tabIndex: [{
type: Input
}], id: [{
type: Input
}], tabContent: [{
type: Input
}], templateContext: [{
type: Input
}], icon: [{
type: Input
}], secondaryLabel: [{
type: Input
}], closeButtonAriaLabel: [{
type: Input
}], iconOnly: [{
type: Input
}], iconLabel: [{
type: Input
}], badgeIndicator: [{
type: Input
}], enterDelayMs: [{
type: Input
}], leaveDelayMs: [{
type: Input
}], isTooltipOpen: [{
type: Input
}], selected: [{
type: Output
}], tabClose: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90YWJzL3RhYi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixXQUFXLEVBQ1gsV0FBVyxFQUNYLE1BQU0sZUFBZSxDQUFDOzs7QUFFdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQWNILE1BQU0sT0FBTyxHQUFHO0lBYmhCO1FBMkN3QyxvQkFBZSxHQUFHLElBQUksQ0FBQztRQUNwQyxjQUFTLEdBQUcsVUFBVSxDQUFDO1FBQ2xCLGtCQUFhLEdBQUcsUUFBUSxDQUFDO1FBQ3hEOzs7V0FHRztRQUNJLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQWlCakM7OztXQUdHO1FBQ00sV0FBTSxHQUFHLEtBQUssQ0FBQztRQUN4Qjs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUI7O1dBRUc7UUFDTSxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCOztXQUVHO1FBQ00sT0FBRSxHQUFHLFNBQVMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFtQnZDOztXQUVHO1FBQ00seUJBQW9CLEdBQUcsNEJBQTRCLENBQUM7UUFDN0Q7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBSzFCOztXQUVHO1FBQ00sbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFTaEM7O1dBRUc7UUFDTSxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUMvQjs7V0FFRztRQUNPLGFBQVEsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNsRTs7V0FFRztRQUNPLGFBQVEsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV4RCxpQkFBWSxHQUFHLEtBQUssQ0FBQztLQTZCL0I7SUEzSkEsSUFBNEIsTUFBTTtRQUNq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bXBvbmVudCxcblx0T25Jbml0LFxuXHRJbnB1dCxcblx0T3V0cHV0LFxuXHRFdmVudEVtaXR0ZXIsXG5cdEhvc3RCaW5kaW5nLFxuXHRUZW1wbGF0ZVJlZlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG4vKipcbiogVGhlIGBUYWJgIGNvbXBvbmVudCBpcyBhIGNoaWxkIG9mIHRoZSBgVGFic2AgY29tcG9uZW50LlxuKiBJdCByZXByZXNlbnRzIG9uZSBgVGFiYCBpdGVtIGFuZCBpdHMgY29udGVudCB3aXRoaW4gYSBwYW5lbCBvZiBvdGhlciBgVGFiYCBpdGVtcy5cbipcbiogYFRhYmAgdGFrZXMgYSBzdHJpbmcgb3IgYFRlbXBsYXRlUmVmYCBmb3IgdGhlIGhlYWRlciwgYW5kIGFueSBjb250ZW50IGZvciB0aGUgYm9keSBvZiB0aGUgdGFiLlxuKiBEaXNhYmxlZCBzdGF0ZXMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIChpZS4gc3dpdGNoIHRvIHRoZSB0YWIsIGJ1dCBkaXNwbGF5IHNvbWVcbiogaW5kaWNhdGlvbiBhcyB0byBfd2h5XyB0aGUgdGFiIGlzIGRpc2FibGVkKS5cbipcbiogV2hlbiB0aGUgdGFiIGlzIHNlbGVjdGVkIHRoZSBgc2VsZWN0YCBvdXRwdXQgd2lsbCBiZSB0cmlnZ2VyZWQuXG4qIFRoZSBgc2VsZWN0YCBvdXRwdXQgd2lsbCBhbHNvIGJlIHRyaWdnZXJlZCBmb3IgdGhlIGFjdGl2ZSB0YWIgd2hlbiB0aGUgdGFicyBhcmUgbG9hZGVkIG9yIHVwZGF0ZWQuXG4qXG4qXG4qIFRhYiB3aXRoIHN0cmluZyBoZWFkZXI6XG4gKlxuICogYGBgaHRtbFxuKiA8Y2RzLXRhYiBoZWFkaW5nPSd0YWIxJz5cbiogXHR0YWIgMSBjb250ZW50XG4qIDwvY2RzLXRhYj5cbiogYGBgXG4qXG4qIFRhYiB3aXRoIGN1c3RvbSBoZWFkZXI6XG4qXG4qIGBgYGh0bWxcbiogPG5nLXRlbXBsYXRlICN0YWJIZWFkaW5nPlxuKiBcdDxzdmcgY2RzSWNvbj1cImZhY2Vib29rXCJcbiogXHRcdHNpemU9XCJzbVwiXG4qIFx0XHRzdHlsZT1cIm1hcmdpbi1yaWdodDogN3B4O1wiPlxuKiBcdDwvc3ZnPlxuKiBcdEhlbGxvIFRhYiAxXG4qIDwvbmctdGVtcGxhdGU+XG4qIDxjZHMtdGFicz5cbiogXHQ8Y2RzLXRhYiBbaGVhZGluZ109XCJ0YWJIZWFkaW5nXCI+XG4qIFx0XHRUYWIgMSBjb250ZW50IDxzdmcgY2RzSWNvbj1cImFsZXJ0XCIgc2l6ZT1cImxnXCI+PC9zdmc+XG4qIFx0PC9jZHMtdGFiPlxuKiBcdDxjZHMtdGFiIGhlYWRpbmc9J1RhYjInPlxuKiBcdFx0VGFiIDIgY29udGVudFxuKiBcdDwvY2RzLXRhYj5cbiogXHQ8Y2RzLXRhYiBoZWFkaW5nPSdUYWIzJz5cbiogXHRcdFRhYiAzIGNvbnRlbnRcbiogXHQ8L2Nkcy10YWI+XG4qIDwvY2RzLXRhYnM+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiBcImNkcy10YWIsIGlibS10YWJcIixcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwic2hvdWxkUmVuZGVyKClcIj5cblx0XHRcdDxuZy10ZW1wbGF0ZVxuXHRcdFx0XHQqbmdJZj1cImlzVGVtcGxhdGUodGFiQ29udGVudClcIlxuXHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldF09XCJ0YWJDb250ZW50XCJcblx0XHRcdFx0W25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiB0ZW1wbGF0ZUNvbnRleHQgfVwiPlxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBUYWIgaW1wbGVtZW50cyBPbkluaXQge1xuXHRASG9zdEJpbmRpbmcoXCJhdHRyLmlkXCIpIGdldCBob3N0SWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaWQ7XG5cdH1cblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5hcmlhLWxhYmVsbGVkYnlcIikgZ2V0IGhvc3RBcmlhTGFiZWxsZWRieSgpIHtcblx0XHRyZXR1cm4gYCR7dGhpcy5pZH0taGVhZGVyYDtcblx0fVxuXHRASG9zdEJpbmRpbmcoXCJhdHRyLnRhYmluZGV4XCIpIGdldCBob3N0VGFiSW5kZXgoKSB7XG5cdFx0cmV0dXJuIHRoaXMudGFiSW5kZXg7XG5cdH1cblx0LyoqXG5cdCAqIGBoaWRkZW5gICsgZGlzcGxheSBrZWVwIGluYWN0aXZlIHBhbmVscyBvdXQgb2YgbGF5b3V0OyBgbnVsbGAgZGlzcGxheSB3aGVuIGFjdGl2ZSBwcmVzZXJ2ZXMgZ3JpZC9mbGV4LlxuXHQgKi9cblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5oaWRkZW5cIikgZ2V0IGhvc3RIaWRkZW4oKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWN0aXZlID8gbnVsbCA6IFwiXCI7XG5cdH1cblx0QEhvc3RCaW5kaW5nKFwic3R5bGUuZGlzcGxheVwiKSBnZXQgaG9zdERpc3BsYXkoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWN0aXZlID8gXCJibG9ja1wiIDogXCJub25lXCI7XG5cdH1cblx0LyoqXG5cdCAqIFNldCB0byBgdHJ1ZWAgdG8gaGF2ZSBgVGFiYCBpdGVtcyBjYWNoZWQgYW5kIG5vdCByZWxvYWRlZCBvbiB0YWIgc3dpdGNoaW5nLlxuXHQgKi9cblx0QElucHV0KCkgc2V0IGNhY2hlQWN0aXZlKHNob3VsZENhY2hlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5fY2FjaGVBY3RpdmUgPSBzaG91bGRDYWNoZTtcblx0fVxuXG5cdGdldCBjYWNoZUFjdGl2ZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fY2FjaGVBY3RpdmU7XG5cdH1cblx0cHJpdmF0ZSBzdGF0aWMgY291bnRlciA9IDA7XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tdGFiLWNvbnRlbnRcIikgdGFiQ29udGVudENsYXNzID0gdHJ1ZTtcblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5yb2xlXCIpIHBhbmVsUm9sZSA9IFwidGFicGFuZWxcIjtcblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5hcmlhLWxpdmVcIikgcGFuZWxBcmlhTGl2ZSA9IFwicG9saXRlXCI7XG5cdC8qKlxuXHQgKiBCb29sZWFuIHZhbHVlIHJlZmxlY3RzIGlmIHRoZSBgVGFiYCBpcyB1c2luZyBhIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIGhlYWRpbmcuXG5cdCAqIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UuXG5cdCAqL1xuXHRwdWJsaWMgaGVhZGluZ0lzVGVtcGxhdGUgPSBmYWxzZTtcblxuXHQvKipcblx0ICogVGhlIGBUYWJgJ3MgdGl0bGUgdG8gYmUgZGlzcGxheWVkIG9yIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIGBUYWJgIGhlYWRpbmcuXG5cdCAqL1xuXHRASW5wdXQoKSBoZWFkaW5nOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuXHQvKipcblx0ICogT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIHRoZSBgdGFiSXRlbSdzYCdzIHRpdGxlIGF0dHJpYnV0ZSB3aGljaCBpcyBzZXQgaW4gYFRhYkhlYWRlcnNgLlxuXHQgKiBgdGFiSXRlbWAncyB0aXRsZSBhdHRyaWJ1dGUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gYGhlYWRpbmdgLlxuXHQgKlxuXHQgKiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugc2V0IGBoZWFkaW5nYCB0byBhIGBUZW1wbGF0ZVJlZmAuXG5cdCAqL1xuXHRASW5wdXQoKSB0aXRsZTogc3RyaW5nO1xuXHQvKipcblx0ICogQWxsb3dzIHRoZSB1c2VyIHRvIHBhc3MgZGF0YSB0byB0aGUgY3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgYFRhYmAgaGVhZGluZy5cblx0ICovXG5cdEBJbnB1dCgpIGNvbnRleHQ6IGFueTtcblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBgVGFiYCBpcyBhY3RpdmUvc2VsZWN0ZWQuXG5cdCAqIERldGVybWluZXMgd2hldGhlciBpdHMgdGFiIHBhbmVsIGNvbnRlbnQgaXMgcmVuZGVyZWQuXG5cdCAqL1xuXHRASW5wdXQoKSBhY3RpdmUgPSBmYWxzZTtcblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgYFRhYmAgaXRlbSBpcyBkaXNhYmxlZC5cblx0ICovXG5cdEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIGB0YWJpbmRleGAgb24gdGhlIHRhYiBwYW5lbCwgdGhlIHBhcmVudCBtYXkgc2V0IHRoaXMgdG8gYG51bGxgIHdoZW4gYGlzTmF2aWdhdGlvbmAgaXMgYHRydWVgLlxuXHQgKi9cblx0QElucHV0KCkgdGFiSW5kZXggPSAwO1xuXHQvKipcblx0ICogU2V0cyB0aGUgaWQgb2YgdGhlIGBUYWJgLiBXaWxsIGJlIHVuaXF1ZWx5IGdlbmVyYXRlZCBpZiBub3QgcHJvdmlkZWQuXG5cdCAqL1xuXHRASW5wdXQoKSBpZCA9IGBuLXRhYi0ke1RhYi5jb3VudGVyKyt9YDtcblx0LyoqXG5cdCAqIEFsbG93cyBsaWZlY3ljbGUgaG9va3MgdG8gYmUgY2FsbGVkIG9uIHRoZSByZW5kZXJlZCBjb250ZW50LlxuXHQgKi9cblx0QElucHV0KCkgdGFiQ29udGVudDogVGVtcGxhdGVSZWY8YW55Pjtcblx0LyoqXG5cdCAqIE9wdGlvbmFsIGRhdGEgZm9yIHRlbXBsYXRlcyBwYXNzZWQgYXMgaW1wbGljaXQgY29udGV4dC5cblx0ICovXG5cdEBJbnB1dCgpIHRlbXBsYXRlQ29udGV4dDogYW55O1xuXHQvKipcblx0ICogT3B0aW9uYWwgdGVtcGxhdGUgdGhhdCByZW5kZXJzIGFuIGljb24gaW5zaWRlIHRoZSBgVGFiYCBoZWFkZXIuXG5cdCAqIFVzZWZ1bCBmb3IgcmVuZGVyaW5nIGEgYGNkc0ljb25gIG9yIGFueSBvdGhlciBpY29uIG5leHQgdG8gdGhlIHRhYiBsYWJlbC5cblx0ICovXG5cdEBJbnB1dCgpIGljb246IFRlbXBsYXRlUmVmPGFueT47XG5cdC8qKlxuXHQgKiBPcHRpb25hbCBzZWNvbmRhcnkgbGFiZWwgcmVuZGVyZWQgYmVsb3cgdGhlIHByaW1hcnkgdGFiIGxhYmVsLlxuXHQgKiBPbmx5IGRpc3BsYXllZCB3aGVuIHRoZSBwYXJlbnQgYFRhYnNgIGlzIHVzaW5nIGB0eXBlPVwiY29udGFpbmVkXCJgLlxuXHQgKi9cblx0QElucHV0KCkgc2Vjb25kYXJ5TGFiZWw6IHN0cmluZztcblx0LyoqXG5cdCAqIFNldHMgdGhlIGFyaWEtbGFiZWwgb2YgdGhlIGNsb3NlIGJ1dHRvbiB3aGVuIHRoZSBwYXJlbnQgYFRhYnNgIHVzZXMgYGRpc21pc3NhYmxlYC5cblx0ICovXG5cdEBJbnB1dCgpIGNsb3NlQnV0dG9uQXJpYUxhYmVsID0gXCJQcmVzcyBkZWxldGUgdG8gcmVtb3ZlIHRhYlwiO1xuXHQvKipcblx0ICogSWNvbi1vbmx5IHRhYjogcGFpciB3aXRoIGBpY29uYCBhbmQgYGljb25MYWJlbGAuXG5cdCAqL1xuXHRASW5wdXQoKSBpY29uT25seSA9IGZhbHNlO1xuXHQvKipcblx0ICogSWNvbi1vbmx5IHRhYnM6IGFjY2Vzc2libGUgbmFtZSBhbmQgdG9vbHRpcCB0ZXh0LlxuXHQgKi9cblx0QElucHV0KCkgaWNvbkxhYmVsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiAqKlByZXZpZXcqKjogSWNvbi1vbmx5IHRhYnMg4oCUIHNob3cgYSBub3RpZmljYXRpb24gZG90IG9uIHRoZSBpY29uLlxuXHQgKi9cblx0QElucHV0KCkgYmFkZ2VJbmRpY2F0b3IgPSBmYWxzZTtcblx0LyoqXG5cdCAqIEljb24tb25seSB0YWJzOiB0b29sdGlwIHNob3cgZGVsYXkgKG1zKS5cblx0ICovXG5cdEBJbnB1dCgpIGVudGVyRGVsYXlNczogbnVtYmVyO1xuXHQvKipcblx0ICogSWNvbi1vbmx5IHRhYnM6IHRvb2x0aXAgaGlkZSBkZWxheSAobXMpLlxuXHQgKi9cblx0QElucHV0KCkgbGVhdmVEZWxheU1zOiBudW1iZXI7XG5cdC8qKlxuXHQgKiBJY29uLW9ubHkgdGFiczogb3BlbiB0aGUgdG9vbHRpcCBvbiBmaXJzdCByZW5kZXIuXG5cdCAqL1xuXHRASW5wdXQoKSBpc1Rvb2x0aXBPcGVuID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBFbWl0cyB3aGVuIHRoaXMgdGFiIGJlY29tZXMgc2VsZWN0ZWQuXG5cdCAqL1xuXHRAT3V0cHV0KCkgc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblx0LyoqXG5cdCAqIEVtaXRzIHdoZW4gdGhpcyB0YWIncyBjbG9zZSBidXR0b24gaXMgcHJlc3NlZC5cblx0ICovXG5cdEBPdXRwdXQoKSB0YWJDbG9zZTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG5cdHByb3RlY3RlZCBfY2FjaGVBY3RpdmUgPSBmYWxzZTtcblxuXHQvKipcblx0ICogQ2hlY2tzIGZvciBjdXN0b20gaGVhZGluZyB0ZW1wbGF0ZSBvbiBpbml0aWFsaXphdGlvbiBhbmQgdXBkYXRlcyB0aGUgdmFsdWVcblx0ICogb2YgdGhlIGJvb2xlYW4gJ2hlYWRpbmdJc1RlbXBsYXRlJy5cblx0ICovXG5cdG5nT25Jbml0KCkge1xuXHRcdGlmICh0aGlzLmhlYWRpbmcgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xuXHRcdFx0dGhpcy5oZWFkaW5nSXNUZW1wbGF0ZSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEVtaXQgdGhlIHN0YXR1cyBvZiB0aGUgYFRhYmAsIHNwZWNpZmljYWxseSAnc2VsZWN0JyBhbmQgJ3NlbGVjdGVkJyBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0ZG9TZWxlY3QoKSB7XG5cdFx0dGhpcy5zZWxlY3RlZC5lbWl0KCk7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGBUYWJgIHNob3VsZCBiZSByZW5kZXJlZCBpbiBhIHRhYiBwYW5lbC5cblx0ICovXG5cdHNob3VsZFJlbmRlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5hY3RpdmUgfHwgdGhpcy5jYWNoZUFjdGl2ZTtcblx0fVxuXG5cdHB1YmxpYyBpc1RlbXBsYXRlKHZhbHVlKSB7XG5cdFx0cmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG5cdH1cbn1cbiJdfQ==