UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

298 lines 22.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { map, delay } from 'rxjs/operators'; import { Component, Input, Output, EventEmitter, ContentChildren, QueryList, HostBinding, ChangeDetectorRef, } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { convertToBoolProperty } from '../helpers'; /* * Specific tab container. * * ```ts * <nb-tab tabTitle="Users" * badgeText="99+" * badgeStatus="danger"> * <p>List of <strong>users</strong>.</p> * </nb-tab> ``` */ export class NbTabComponent { constructor() { this.activeValue = false; this.responsiveValue = false; this.init = false; } /* * Show only icons when width is smaller than `tabs-icon-only-max-width` * @type {boolean} */ /** * @param {?} val * @return {?} */ set responsive(val) { this.responsiveValue = convertToBoolProperty(val); } /** * @return {?} */ get responsive() { return this.responsiveValue; } /* * Specifies active tab * @returns {boolean} */ /** * @return {?} */ get active() { return this.activeValue; } /** * @param {?} val * @return {?} */ set active(val) { this.activeValue = convertToBoolProperty(val); if (this.activeValue) { this.init = true; } } /* * Lazy load content before tab selection * TODO: rename, as lazy is by default, and this is more `instant load` * @param {boolean} val */ /** * @param {?} val * @return {?} */ set lazyLoad(val) { this.init = convertToBoolProperty(val); } } NbTabComponent.decorators = [ { type: Component, args: [{ selector: 'nb-tab', template: ` <ng-container *ngIf="init"> <ng-content></ng-content> </ng-container> ` }] } ]; NbTabComponent.propDecorators = { tabTitle: [{ type: Input }], tabIcon: [{ type: Input }], responsive: [{ type: Input }], route: [{ type: Input }], activeValue: [{ type: HostBinding, args: ['class.content-active',] }], active: [{ type: Input }], lazyLoad: [{ type: Input }], badgeText: [{ type: Input }], badgeStatus: [{ type: Input }], badgePosition: [{ type: Input }] }; if (false) { /** @type {?} */ NbTabComponent.prototype.tabTitle; /** @type {?} */ NbTabComponent.prototype.tabIcon; /** @type {?} */ NbTabComponent.prototype.route; /** @type {?} */ NbTabComponent.prototype.activeValue; /** @type {?} */ NbTabComponent.prototype.responsiveValue; /** @type {?} */ NbTabComponent.prototype.badgeText; /** @type {?} */ NbTabComponent.prototype.badgeStatus; /** @type {?} */ NbTabComponent.prototype.badgePosition; /** @type {?} */ NbTabComponent.prototype.init; } // TODO: Combine tabset with route-tabset, so that we can: // - have similar interface // - easy to migrate from one to another // - can mix them both (route/content tab) /* * * Dynamic tabset component. * @stacked-example(Showcase, tabset/tabset-showcase.component) * * Basic tabset example * * ```html * <nb-tabset> * <nb-tab tabTitle="Simple Tab #1"> * Tab content 1 * </nb-tab> * <nb-tab tabTitle="Simple Tab #2"> * Tab content 2 * </nb-tab> * </nb-tabset> * ``` * * ### Installation * * Import `NbTabsetModule` to your feature module. * ```ts * @NgModule({ * imports: [ * // ... * NbTabsetModule, * ], * }) * export class PageModule { } * ``` * ### Usage * * It is also possible to set a badge to a particular tab: * @stacked-example(Tab With Badge, tabset/tabset-badge.component) * * and we can set it to full a width of a parent component * @stacked-example(Full Width, tabset/tabset-width.component) * * `tabIcon` should be used to add an icon to the tab. Icon can also be combined with title. * `responsive` tab property if set allows you to hide the title on smaller screens * (`tabs-icon-only-max-width` property) for better responsive behaviour. You can open the following example and make * your screen smaller - titles will be hidden in the last tabset in the list: * * @stacked-example(Icon, tabset/tabset-icon.component) * * @styles * * tabs-font-family: * tabs-font-size: * tabs-content-font-family: * tabs-content-font-size: * tabs-active-bg: * tabs-active-font-weight: * tabs-padding: * tabs-content-padding: * tabs-header-bg: * tabs-separator: * tabs-fg: * tabs-fg-text: * tabs-fg-heading: * tabs-bg: * tabs-selected: * tabs-icon-only-max-width * */ export class NbTabsetComponent { /** * @param {?} route * @param {?} changeDetectorRef */ constructor(route, changeDetectorRef) { this.route = route; this.changeDetectorRef = changeDetectorRef; this.fullWidthValue = false; /* * Emits when tab is selected * @type EventEmitter<any> */ this.changeTab = new EventEmitter(); } /* * Take full width of a parent * @param {boolean} val */ /** * @param {?} val * @return {?} */ set fullWidth(val) { this.fullWidthValue = convertToBoolProperty(val); } // TODO: refactoring this component, avoid change detection loop /** * @return {?} */ ngAfterContentInit() { this.route.params .pipe(map((params) => this.tabs.find((tab) => this.routeParam ? tab.route === params[this.routeParam] : tab.active)), delay(0)) .subscribe((activeTab) => { this.selectTab(activeTab || this.tabs.first); this.changeDetectorRef.markForCheck(); }); } // TODO: navigate to routeParam /** * @param {?} selectedTab * @return {?} */ selectTab(selectedTab) { this.tabs.forEach(tab => tab.active = tab === selectedTab); this.changeTab.emit(selectedTab); } } NbTabsetComponent.decorators = [ { type: Component, args: [{ selector: 'nb-tabset', template: ` <ul class="tabset"> <li *ngFor="let tab of tabs" (click)="selectTab(tab)" [class.responsive]="tab.responsive" [class.active]="tab.active" class="tab"> <a href (click)="$event.preventDefault()"> <i *ngIf="tab.tabIcon" [class]="tab.tabIcon"></i> <span *ngIf="tab.tabTitle">{{ tab.tabTitle }}</span> </a> <nb-badge *ngIf="tab.badgeText" [text]="tab.badgeText" [status]="tab.badgeStatus" [position]="tab.badgePosition"> </nb-badge> </li> </ul> <ng-content select="nb-tab"></ng-content> `, styles: [":host{display:block}:host.full-width .tabset{justify-content:space-around}:host /deep/ nb-tab{flex:1;-ms-flex:1 1 auto;overflow:auto;display:none}:host /deep/ nb-tab.content-active{display:block}:host .tabset{display:flex;flex-direction:row;list-style-type:none;margin:0}:host .tabset .tab{cursor:pointer;margin-bottom:-1px;text-align:center;position:relative}:host .tabset .tab.active a::before{display:block}:host .tabset .tab a{display:flex;position:relative;text-decoration:none}:host .tabset .tab a::before{display:none;position:absolute;content:'';width:100%;height:6px;border-radius:3px;bottom:-2px;left:0}:host .tabset .tab a i{font-size:1.5rem;vertical-align:middle}[dir=ltr] :host .tabset .tab a i+span{margin-left:.5rem}[dir=rtl] :host .tabset .tab a i+span{margin-right:.5rem}"] }] } ]; /** @nocollapse */ NbTabsetComponent.ctorParameters = () => [ { type: ActivatedRoute }, { type: ChangeDetectorRef } ]; NbTabsetComponent.propDecorators = { tabs: [{ type: ContentChildren, args: [NbTabComponent,] }], fullWidthValue: [{ type: HostBinding, args: ['class.full-width',] }], fullWidth: [{ type: Input }], routeParam: [{ type: Input }], changeTab: [{ type: Output }] }; if (false) { /** @type {?} */ NbTabsetComponent.prototype.tabs; /** @type {?} */ NbTabsetComponent.prototype.fullWidthValue; /** @type {?} */ NbTabsetComponent.prototype.routeParam; /** @type {?} */ NbTabsetComponent.prototype.changeTab; /** * @type {?} * @private */ NbTabsetComponent.prototype.route; /** * @type {?} * @private */ NbTabsetComponent.prototype.changeDetectorRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3RhYnNldC90YWJzZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUVULFdBQVcsRUFDWCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7O0FBcUJuRCxNQUFNLE9BQU8sY0FBYztJQVIzQjtRQXNDRSxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUU3QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQWlEakMsU0FBSSxHQUFZLEtBQUssQ0FBQztJQUN4QixDQUFDOzs7Ozs7Ozs7SUFoRUMsSUFDSSxVQUFVLENBQUMsR0FBWTtRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Ozs7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQzs7Ozs7Ozs7SUFhRCxJQUNJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQzs7Ozs7SUFDRCxJQUFJLE1BQU0sQ0FBQyxHQUFZO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxJQUFJLEdB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KlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgQWt2ZW8uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgbWFwLCBkZWxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7IGNvbnZlcnRUb0Jvb2xQcm9wZXJ0eSB9IGZyb20gJy4uL2hlbHBlcnMnO1xyXG5cclxuLypcclxuICogU3BlY2lmaWMgdGFiIGNvbnRhaW5lci5cclxuICpcclxuICogYGBgdHNcclxuICogPG5iLXRhYiB0YWJUaXRsZT1cIlVzZXJzXCJcclxuICogICBiYWRnZVRleHQ9XCI5OStcIlxyXG4gKiAgIGJhZGdlU3RhdHVzPVwiZGFuZ2VyXCI+XHJcbiAqICAgPHA+TGlzdCBvZiA8c3Ryb25nPnVzZXJzPC9zdHJvbmc+LjwvcD5cclxuICogPC9uYi10YWI+XHJcbiBgYGBcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmItdGFiJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImluaXRcIj5cclxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5iVGFiQ29tcG9uZW50IHtcclxuXHJcbiAgLypcclxuICAgKiBUYWIgdGl0bGVcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRhYlRpdGxlOiBzdHJpbmc7XHJcblxyXG4gIC8qXHJcbiAgICogVGFiIGljb25cclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRhYkljb246IHN0cmluZztcclxuXHJcbiAgLypcclxuICAgKiBTaG93IG9ubHkgaWNvbnMgd2hlbiB3aWR0aCBpcyBzbWFsbGVyIHRoYW4gYHRhYnMtaWNvbi1vbmx5LW1heC13aWR0aGBcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCByZXNwb25zaXZlKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5yZXNwb25zaXZlVmFsdWUgPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICB9XHJcblxyXG4gIGdldCByZXNwb25zaXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2l2ZVZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgcm91dGU6IHN0cmluZztcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jb250ZW50LWFjdGl2ZScpXHJcbiAgYWN0aXZlVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcmVzcG9uc2l2ZVZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qXHJcbiAgICogU3BlY2lmaWVzIGFjdGl2ZSB0YWJcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGdldCBhY3RpdmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVWYWx1ZTtcclxuICB9XHJcbiAgc2V0IGFjdGl2ZSh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuYWN0aXZlVmFsdWUgPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICAgIGlmICh0aGlzLmFjdGl2ZVZhbHVlKSB7XHJcbiAgICAgIHRoaXMuaW5pdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIExhenkgbG9hZCBjb250ZW50IGJlZm9yZSB0YWIgc2VsZWN0aW9uXHJcbiAgICogVE9ETzogcmVuYW1lLCBhcyBsYXp5IGlzIGJ5IGRlZmF1bHQsIGFuZCB0aGlzIGlzIG1vcmUgYGluc3RhbnQgbG9hZGBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGxhenlMb2FkKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pbml0ID0gY29udmVydFRvQm9vbFByb3BlcnR5KHZhbCk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEJhZGdlIHRleHQgdG8gZGlzcGxheVxyXG4gICAqIEB0eXBlIHN0cmluZ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGJhZGdlVGV4dDogc3RyaW5nO1xyXG5cclxuICAvKlxyXG4gICAqIEJhZGdlIHN0YXR1cyAoYWRkcyBzcGVjaWZpYyBzdHlsZXMpOlxyXG4gICAqICdwcmltYXJ5JywgJ2luZm8nLCAnc3VjY2VzcycsICd3YXJuaW5nJywgJ2RhbmdlcidcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsXHJcbiAgICovXHJcbiAgQElucHV0KCkgYmFkZ2VTdGF0dXM6IHN0cmluZztcclxuXHJcbiAgLypcclxuICAgKiBCYWRnZSBwb3NpdGlvbi5cclxuICAgKiBDYW4gYmUgc2V0IHRvIGFueSBjbGFzcyBvciB0byBvbmUgb2YgcHJlZGVmaW5lZCBwb3NpdGlvbnM6XHJcbiAgICogJ3RvcCBsZWZ0JywgJ3RvcCByaWdodCcsICdib3R0b20gbGVmdCcsICdib3R0b20gcmlnaHQnLFxyXG4gICAqICd0b3Agc3RhcnQnLCAndG9wIGVuZCcsICdib3R0b20gc3RhcnQnLCAnYm90dG9tIGVuZCdcclxuICAgKiBAdHlwZSBzdHJpbmdcclxuICAgKi9cclxuICBASW5wdXQoKSBiYWRnZVBvc2l0aW9uOiBzdHJpbmc7XHJcblxyXG4gIGluaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxufVxyXG5cclxuLy8gVE9ETzogQ29tYmluZSB0YWJzZXQgd2l0aCByb3V0ZS10YWJzZXQsIHNvIHRoYXQgd2UgY2FuOlxyXG4vLyAtIGhhdmUgc2ltaWxhciBpbnRlcmZhY2VcclxuLy8gLSBlYXN5IHRvIG1pZ3JhdGUgZnJvbSBvbmUgdG8gYW5vdGhlclxyXG4vLyAtIGNhbiBtaXggdGhlbSBib3RoIChyb3V0ZS9jb250ZW50IHRhYilcclxuLypcclxuICpcclxuICogRHluYW1pYyB0YWJzZXQgY29tcG9uZW50LlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNob3djYXNlLCB0YWJzZXQvdGFic2V0LXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogQmFzaWMgdGFic2V0IGV4YW1wbGVcclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8bmItdGFic2V0PlxyXG4gKiAgPG5iLXRhYiB0YWJUaXRsZT1cIlNpbXBsZSBUYWIgIzFcIj5cclxuICogICAgVGFiIGNvbnRlbnQgMVxyXG4gKiAgPC9uYi10YWI+XHJcbiAqICA8bmItdGFiIHRhYlRpdGxlPVwiU2ltcGxlIFRhYiAjMlwiPlxyXG4gKiAgICBUYWIgY29udGVudCAyXHJcbiAqICA8L25iLXRhYj5cclxuICogPC9uYi10YWJzZXQ+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiAjIyMgSW5zdGFsbGF0aW9uXHJcbiAqXHJcbiAqIEltcG9ydCBgTmJUYWJzZXRNb2R1bGVgIHRvIHlvdXIgZmVhdHVyZSBtb2R1bGUuXHJcbiAqIGBgYHRzXHJcbiAqIEBOZ01vZHVsZSh7XHJcbiAqICAgaW1wb3J0czogW1xyXG4gKiAgIFx0Ly8gLi4uXHJcbiAqICAgICBOYlRhYnNldE1vZHVsZSxcclxuICogICBdLFxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgUGFnZU1vZHVsZSB7IH1cclxuICogYGBgXHJcbiAqICMjIyBVc2FnZVxyXG4gKlxyXG4gKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNldCBhIGJhZGdlIHRvIGEgcGFydGljdWxhciB0YWI6XHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoVGFiIFdpdGggQmFkZ2UsIHRhYnNldC90YWJzZXQtYmFkZ2UuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBhbmQgd2UgY2FuIHNldCBpdCB0byBmdWxsIGEgd2lkdGggb2YgYSBwYXJlbnQgY29tcG9uZW50XHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoRnVsbCBXaWR0aCwgdGFic2V0L3RhYnNldC13aWR0aC5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGB0YWJJY29uYCBzaG91bGQgYmUgdXNlZCB0byBhZGQgYW4gaWNvbiB0byB0aGUgdGFiLiBJY29uIGNhbiBhbHNvIGJlIGNvbWJpbmVkIHdpdGggdGl0bGUuXHJcbiAqIGByZXNwb25zaXZlYCB0YWIgcHJvcGVydHkgaWYgc2V0IGFsbG93cyB5b3UgdG8gaGlkZSB0aGUgdGl0bGUgb24gc21hbGxlciBzY3JlZW5zXHJcbiAqIChgdGFicy1pY29uLW9ubHktbWF4LXdpZHRoYCBwcm9wZXJ0eSkgZm9yIGJldHRlciByZXNwb25zaXZlIGJlaGF2aW91ci4gWW91IGNhbiBvcGVuIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhbmQgbWFrZVxyXG4gKiB5b3VyIHNjcmVlbiBzbWFsbGVyIC0gdGl0bGVzIHdpbGwgYmUgaGlkZGVuIGluIHRoZSBsYXN0IHRhYnNldCBpbiB0aGUgbGlzdDpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShJY29uLCB0YWJzZXQvdGFic2V0LWljb24uY29tcG9uZW50KVxyXG4gKlxyXG4gKiBAc3R5bGVzXHJcbiAqXHJcbiAqIHRhYnMtZm9udC1mYW1pbHk6XHJcbiAqIHRhYnMtZm9udC1zaXplOlxyXG4gKiB0YWJzLWNvbnRlbnQtZm9udC1mYW1pbHk6XHJcbiAqIHRhYnMtY29udGVudC1mb250LXNpemU6XHJcbiAqIHRhYnMtYWN0aXZlLWJnOlxyXG4gKiB0YWJzLWFjdGl2ZS1mb250LXdlaWdodDpcclxuICogdGFicy1wYWRkaW5nOlxyXG4gKiB0YWJzLWNvbnRlbnQtcGFkZGluZzpcclxuICogdGFicy1oZWFkZXItYmc6XHJcbiAqIHRhYnMtc2VwYXJhdG9yOlxyXG4gKiB0YWJzLWZnOlxyXG4gKiB0YWJzLWZnLXRleHQ6XHJcbiAqIHRhYnMtZmctaGVhZGluZzpcclxuICogdGFicy1iZzpcclxuICogdGFicy1zZWxlY3RlZDpcclxuICogdGFicy1pY29uLW9ubHktbWF4LXdpZHRoXHJcbiAqXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25iLXRhYnNldCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFic2V0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDx1bCBjbGFzcz1cInRhYnNldFwiPlxyXG4gICAgICA8bGkgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJzXCJcclxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIodGFiKVwiXHJcbiAgICAgICAgICBbY2xhc3MucmVzcG9uc2l2ZV09XCJ0YWIucmVzcG9uc2l2ZVwiXHJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInRhYi5hY3RpdmVcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0YWJcIj5cclxuICAgICAgICA8YSBocmVmIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxyXG4gICAgICAgICAgPGkgKm5nSWY9XCJ0YWIudGFiSWNvblwiIFtjbGFzc109XCJ0YWIudGFiSWNvblwiPjwvaT5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFiLnRhYlRpdGxlXCI+e3sgdGFiLnRhYlRpdGxlIH19PC9zcGFuPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8bmItYmFkZ2UgKm5nSWY9XCJ0YWIuYmFkZ2VUZXh0XCJcclxuICAgICAgICAgIFt0ZXh0XT1cInRhYi5iYWRnZVRleHRcIlxyXG4gICAgICAgICAgW3N0YXR1c109XCJ0YWIuYmFkZ2VTdGF0dXNcIlxyXG4gICAgICAgICAgW3Bvc2l0aW9uXT1cInRhYi5iYWRnZVBvc2l0aW9uXCI+XHJcbiAgICAgICAgPC9uYi1iYWRnZT5cclxuICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJuYi10YWJcIj48L25nLWNvbnRlbnQ+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5iVGFic2V0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oTmJUYWJDb21wb25lbnQpIHRhYnM6IFF1ZXJ5TGlzdDxOYlRhYkNvbXBvbmVudD47XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZnVsbC13aWR0aCcpXHJcbiAgZnVsbFdpZHRoVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLypcclxuICAgKiBUYWtlIGZ1bGwgd2lkdGggb2YgYSBwYXJlbnRcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGZ1bGxXaWR0aCh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZnVsbFdpZHRoVmFsdWUgPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogSWYgc3BlY2lmaWVkIC0gdGFic2V0IGxpc3RlbnMgdG8gdGhpcyBwYXJhbWV0ZXIgYW5kIHNlbGVjdHMgY29ycmVzcG9uZGluZyB0YWIuXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICBASW5wdXQoKSByb3V0ZVBhcmFtOiBzdHJpbmc7XHJcblxyXG4gIC8qXHJcbiAgICogRW1pdHMgd2hlbiB0YWIgaXMgc2VsZWN0ZWRcclxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8YW55PlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBjaGFuZ2VUYWIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICB9XHJcblxyXG4gIC8vIFRPRE86IHJlZmFjdG9yaW5nIHRoaXMgY29tcG9uZW50LCBhdm9pZCBjaGFuZ2UgZGV0ZWN0aW9uIGxvb3BcclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoXHJcbiAgICAgICAgICAocGFyYW1zOiBhbnkpID0+XHJcbiAgICAgICAgICAgIHRoaXMudGFicy5maW5kKCh0YWIpID0+IHRoaXMucm91dGVQYXJhbSA/IHRhYi5yb3V0ZSA9PT0gcGFyYW1zW3RoaXMucm91dGVQYXJhbV0gOiB0YWIuYWN0aXZlKSxcclxuICAgICAgICApLFxyXG4gICAgICAgIGRlbGF5KDApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKGFjdGl2ZVRhYikgPT4ge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0VGFiKGFjdGl2ZVRhYiB8fCB0aGlzLnRhYnMuZmlyc3QpO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIFRPRE86IG5hdmlnYXRlIHRvIHJvdXRlUGFyYW1cclxuICBzZWxlY3RUYWIoc2VsZWN0ZWRUYWI6IE5iVGFiQ29tcG9uZW50KSB7XHJcbiAgICB0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4gdGFiLmFjdGl2ZSA9IHRhYiA9PT0gc2VsZWN0ZWRUYWIpO1xyXG4gICAgdGhpcy5jaGFuZ2VUYWIuZW1pdChzZWxlY3RlZFRhYik7XHJcbiAgfVxyXG59XHJcbiJdfQ==