lamb-web-lib
Version:
LambWebLib. Es un proyecto angular de tipo Librería. que contiene una Suit de componentes reutilizables para el proyecto [Lamb Financial](https://lamb.upeu.edu.pe).
222 lines • 23 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Lamb Team. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { EventEmitter, Component, Input, Output, ViewChildren, ElementRef, QueryList, } from '@angular/core';
import { LambMenuItem } from './menu-item';
import { LambMenuService } from './menu.service';
import { takeWhile } from 'rxjs/operators';
import { getElementHeight } from './helpers';
/**
* @param {?} item
* @return {?}
*/
function sumSubmenuHeight(item) {
return item.expanded ?
(item.subMenuHeight || 0) + item.children.filter(c => c.children).reduce((acc, c) => acc + sumSubmenuHeight(c), 0)
: 0;
}
export class LambMenuItemComponent {
/**
* @param {?} lambMenuService
*/
constructor(lambMenuService) {
this.lambMenuService = lambMenuService;
this.lambMenuItem = (/** @type {?} */ (null));
this.hoverItem = new EventEmitter();
this.toggleSubMenu = new EventEmitter();
this.selectItem = new EventEmitter();
this.itemClick = new EventEmitter();
this.alive = true;
this.maxHeight = 0;
}
// @Input() lambMenuItemm = <LambMenuItem>null;
/**
* @param {?} lambMenuItem
* @return {?}
*/
set lambMenuItemm(lambMenuItem) {
if (lambMenuItem) {
lambMenuItem.icon = (lambMenuItem.icon &&
(lambMenuItem.icon !== 'icmn-books') &&
(lambMenuItem.icon !== 'icmb-books') &&
lambMenuItem.icon)
|| this.randonIcon();
lambMenuItem.link = (lambMenuItem.link && !lambMenuItem.url
&& !(lambMenuItem.children && lambMenuItem.children.length)
&& !lambMenuItem.group && !lambMenuItem.hidden) && '/' + lambMenuItem.link;
// setTimeout(() => {
this.lambMenuItem = lambMenuItem;
// }, 0)
}
}
/**
* @return {?}
*/
ngAfterViewInit() {
// this.lambMenuItem.children.length
this.subMenu.changes
.pipe(takeWhile(() => this.alive))
.subscribe(() => {
this.updateSubmenuHeight();
this.updateMaxHeight();
});
this.lambMenuService.onSubmenuToggle$()
.pipe(takeWhile(() => this.alive))
.subscribe(() => {
this.updateMaxHeight();
});
this.updateSubmenuHeight();
this.updateMaxHeight();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.alive = false;
}
/**
* @return {?}
*/
get icons() {
return [
'fa fa-adn',
'fa fa-code',
'fa fa-bullhorn',
'fa fa-ambulance',
'fa fa-android',
'fa fa-angellist',
'fa fa-apple',
'fa fa-at',
'fa fa-chrome',
'fa fa-child',
];
}
/**
* @return {?}
*/
randonIcon() {
return this.icons[Math.floor(Math.random() * this.icons.length)];
}
/**
* @return {?}
*/
updateSubmenuHeight() {
this.lambMenuItem.subMenuHeight = this.subMenu.reduce((acc, c) => acc + getElementHeight(c.nativeElement), 0);
}
/**
* @return {?}
*/
updateMaxHeight() {
setTimeout(() => {
this.maxHeight = sumSubmenuHeight(this.lambMenuItem);
}, 0);
}
/**
* @param {?} item
* @return {?}
*/
onHoverItem(item) {
this.hoverItem.emit(item);
}
/**
* @param {?} item
* @return {?}
*/
onToggleSubMenu(item) {
this.toggleSubMenu.emit(item);
}
/**
* @param {?} item
* @return {?}
*/
onItemClick(item) {
this.itemClick.emit(item);
}
/**
* @param {?} item
* @return {?}
*/
onSelectItem(item) {
this.selectItem.emit(item);
}
}
LambMenuItemComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: '[lambMenuItem]',
template: `<span *ngIf="lambMenuItem.group && !lambMenuItem.hidden">
<i class="lamb-menu-icon {{ lambMenuItem.icon }}" *ngIf="lambMenuItem.icon"></i>
{{ lambMenuItem.title }} 1
</span>
<a *ngIf="lambMenuItem.link && !lambMenuItem.url
&& !(lambMenuItem.children && lambMenuItem.children.length) && !lambMenuItem.group && !lambMenuItem.hidden" [routerLink]="lambMenuItem.link"
[fragment]="lambMenuItem.fragment" [attr.target]="lambMenuItem.target" [attr.title]="lambMenuItem.title" [class.active]="lambMenuItem.selected"
(mouseenter)="onHoverItem(lambMenuItem)">
<i class="lamb-menu-icon {{ lambMenuItem.icon }}" *ngIf="lambMenuItem.icon"></i>
<span class="lamb-menu-title">{{ lambMenuItem.title }}</span>
</a>
<a *ngIf="lambMenuItem.url && !(lambMenuItem.children && lambMenuItem.children.length)
&& !lambMenuItem.link && !lambMenuItem.group && !lambMenuItem.hidden" [attr.href]="lambMenuItem.url" [attr.target]="lambMenuItem.target"
[attr.title]="lambMenuItem.title" [class.active]="lambMenuItem.selected" (mouseenter)="onHoverItem(lambMenuItem)" (click)="onSelectItem(lambMenuItem)">
<i class="lamb-menu-icon {{ lambMenuItem.icon }}" *ngIf="lambMenuItem.icon"></i>
<span class="lamb-menu-title">{{ lambMenuItem.title }}</span>
</a>
<a *ngIf="!(lambMenuItem.children && lambMenuItem.children.length) && !lambMenuItem.link
&& !lambMenuItem.url && !lambMenuItem.group && !lambMenuItem.hidden" [attr.target]="lambMenuItem.target" [attr.title]="lambMenuItem.title"
[class.active]="lambMenuItem.selected" (mouseenter)="onHoverItem(lambMenuItem)" (click)="$event.preventDefault(); onItemClick(lambMenuItem);">
<i class="lamb-menu-icon {{ lambMenuItem.icon }}" *ngIf="lambMenuItem.icon"></i>
<span class="lamb-menu-title">{{ lambMenuItem.title }}</span>
</a>
<a *ngIf="(lambMenuItem.children && lambMenuItem.children.length) && !lambMenuItem.hidden" (click)="$event.preventDefault(); onToggleSubMenu(lambMenuItem);"
[attr.target]="lambMenuItem.target" [attr.title]="lambMenuItem.title" [class.active]="lambMenuItem.selected" (mouseenter)="onHoverItem(lambMenuItem)"
href="#">
<i class="lamb-menu-icon {{ lambMenuItem.icon }}" *ngIf="lambMenuItem.icon"></i>
<span class="lamb-menu-title">{{ lambMenuItem.title }}</span>
<!-- <i class="ion chevron" [class.ion-chevron-up]="!lambMenuItem.expanded" [class.ion-chevron-down]="lambMenuItem.expanded"></i> -->
<i class="fa chevron" [class.fa-chevron-up]="!lambMenuItem.expanded" [class.fa-chevron-down]="lambMenuItem.expanded"></i>
</a>
<ul *ngIf="(lambMenuItem.children && lambMenuItem.children.length) && !lambMenuItem.hidden" [class.collapsed]="!(lambMenuItem.children && lambMenuItem.expanded)"
[class.expanded]="lambMenuItem.expanded" class="lamb-menu-items" [style.max-height.px]="maxHeight">
<li lambMenuItem *ngFor="let item of lambMenuItem.children" [lambMenuItemm]="item" [class.lamb-menu-group]="item.group" (hoverItem)="onHoverItem($event)"
(toggleSubMenu)="onToggleSubMenu($event)" (selectItem)="onSelectItem($event)" (itemClick)="onItemClick($event)" class="lamb-menu-item"></li>
</ul>`,
},] },
];
LambMenuItemComponent.ctorParameters = () => [
{ type: LambMenuService }
];
LambMenuItemComponent.propDecorators = {
lambMenuItemm: [{ type: Input }],
hoverItem: [{ type: Output }],
toggleSubMenu: [{ type: Output }],
selectItem: [{ type: Output }],
itemClick: [{ type: Output }],
subMenu: [{ type: ViewChildren, args: [LambMenuItemComponent, { read: ElementRef },] }]
};
if (false) {
/** @type {?} */
LambMenuItemComponent.prototype.lambMenuItem;
/** @type {?} */
LambMenuItemComponent.prototype.hoverItem;
/** @type {?} */
LambMenuItemComponent.prototype.toggleSubMenu;
/** @type {?} */
LambMenuItemComponent.prototype.selectItem;
/** @type {?} */
LambMenuItemComponent.prototype.itemClick;
/** @type {?} */
LambMenuItemComponent.prototype.alive;
/** @type {?} */
LambMenuItemComponent.prototype.subMenu;
/** @type {?} */
LambMenuItemComponent.prototype.maxHeight;
/** @type {?} */
LambMenuItemComponent.prototype.lambMenuService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2xhbWItd2ViLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL21lbnUvbWVudS1pdGVtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFPQSxPQUFPLEVBQ0wsWUFBWSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFpQixZQUFZLEVBQ25FLFVBQVUsRUFBRSxTQUFTLEdBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7O0FBRzdDLDBCQUEwQixJQUFrQjtJQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xILENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUixDQUFDO0FBMENELE1BQU07Ozs7SUErQkosWUFBb0IsZUFBZ0M7UUFBaEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBOUI3QyxpQkFBWSxHQUFHLG1CQUFjLElBQUksRUFBQSxDQUFDO1FBb0IvQixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNwQyxrQkFB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LENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7Ozs7SUFFTSxXQUFXLENBQUMsSUFBa0I7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQzs7Ozs7SUFFTSxlQUFlLENBQUMsSUFBa0I7UUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQzs7Ozs7SUFFTSxXQUFXLENBQUMsSUFBa0I7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQzs7Ozs7SUFFTSxZQUFZLENBQUMsSUFBa0I7UUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQzs7O1lBM0lGLFNBQVMsU0FBQzs7Z0JBRVQsUUFBUSxFQUFFLGdCQUFnQjtnQkFDMUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQW1DTjthQUNMOzs7WUFsRFEsZUFBZTs7OzRCQXNEckIsS0FBSzt3QkFrQkwsTUFBTTs0QkFDTixNQUFNO3lCQUNOLE1BQU07d0JBQ04sTUFBTTtzQkFJTixZQUFZLFNBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFOzs7O0lBM0J6RCw2Q0FBeUM7O0lBb0J6QywwQ0FBOEM7O0lBQzlDLDhDQUFrRDs7SUFDbEQsMkNBQStDOztJQUMvQywwQ0FBOEM7O0lBRTlDLHNDQUFxQjs7SUFFckIsd0NBQTBGOztJQUMxRiwwQ0FBYzs7SUFFRixnREFBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBMYW1iIFRlYW0uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtcclxuICBFdmVudEVtaXR0ZXIsIENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgQWZ0ZXJWaWV3SW5pdCwgVmlld0NoaWxkcmVuLFxyXG4gIEVsZW1lbnRSZWYsIFF1ZXJ5TGlzdCwgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMYW1iTWVudUl0ZW0gfSBmcm9tICcuL21lbnUtaXRlbSc7XHJcbmltcG9ydCB7IExhbWJNZW51U2VydmljZSB9IGZyb20gJy4vbWVudS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgdGFrZVdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBnZXRFbGVtZW50SGVpZ2h0IH0gZnJvbSAnLi9oZWxwZXJzJztcclxuXHJcblxyXG5mdW5jdGlvbiBzdW1TdWJtZW51SGVpZ2h0KGl0ZW06IExhbWJNZW51SXRlbSkge1xyXG4gIHJldHVybiBpdGVtLmV4cGFuZGVkID9cclxuICAgIChpdGVtLnN1Yk1lbnVIZWlnaHQgfHwgMCkgKyBpdGVtLmNoaWxkcmVuLmZpbHRlcihjID0+IGMuY2hpbGRyZW4pLnJlZHVjZSgoYWNjLCBjKSA9PiBhY2MgKyBzdW1TdWJtZW51SGVpZ2h0KGMpLCAwKVxyXG4gICAgOiAwO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdbbGFtYk1lbnVJdGVtXScsXHJcbiAgdGVtcGxhdGU6IGA8c3BhbiAqbmdJZj1cImxhbWJNZW51SXRlbS5ncm91cCAmJiAhbGFtYk1lbnVJdGVtLmhpZGRlblwiPlxyXG4gICAgPGkgY2xhc3M9XCJsYW1iLW1lbnUtaWNvbiB7eyBsYW1iTWVudUl0ZW0uaWNvbiB9fVwiICpuZ0lmPVwibGFtYk1lbnVJdGVtLmljb25cIj48L2k+XHJcbiAgICB7eyBsYW1iTWVudUl0ZW0udGl0bGUgfX0gMVxyXG48L3NwYW4+XHJcbjxhICpuZ0lmPVwibGFtYk1lbnVJdGVtLmxpbmsgJiYgIWxhbWJNZW51SXRlbS51cmxcclxuICAmJiAhKGxhbWJNZW51SXRlbS5jaGlsZHJlbiAmJiBsYW1iTWVudUl0ZW0uY2hpbGRyZW4ubGVuZ3RoKSAmJiAhbGFtYk1lbnVJdGVtLmdyb3VwICYmICFsYW1iTWVudUl0ZW0uaGlkZGVuXCIgW3JvdXRlckxpbmtdPVwibGFtYk1lbnVJdGVtLmxpbmtcIlxyXG4gICAgW2ZyYWdtZW50XT1cImxhbWJNZW51SXRlbS5mcmFnbWVudFwiIFthdHRyLnRhcmdldF09XCJsYW1iTWVudUl0ZW0udGFyZ2V0XCIgW2F0dHIudGl0bGVdPVwibGFtYk1lbnVJdGVtLnRpdGxlXCIgW2NsYXNzLmFjdGl2ZV09XCJsYW1iTWVudUl0ZW0uc2VsZWN0ZWRcIlxyXG4gICAgKG1vdXNlZW50ZXIpPVwib25Ib3Zlckl0ZW0obGFtYk1lbnVJdGVtKVwiPlxyXG4gICAgPGkgY2xhc3M9XCJsYW1iLW1lbnUtaWNvbiB7eyBsYW1iTWVudUl0ZW0uaWNvbiB9fVwiICpuZ0lmPVwibGFtYk1lbnVJdGVtLmljb25cIj48L2k+XHJcbiAgICA8c3BhbiBjbGFzcz1cImxhbWItbWVudS10aXRsZVwiPnt7IGxhbWJNZW51SXRlbS50aXRsZSB9fTwvc3Bhbj5cclxuPC9hPlxyXG48YSAqbmdJZj1cImxhbWJNZW51SXRlbS51cmwgJiYgIShsYW1iTWVudUl0ZW0uY2hpbGRyZW4gJiYgbGFtYk1lbnVJdGVtLmNoaWxkcmVuLmxlbmd0aClcclxuICAmJiAhbGFtYk1lbnVJdGVtLmxpbmsgJiYgIWxhbWJNZW51SXRlbS5ncm91cCAmJiAhbGFtYk1lbnVJdGVtLmhpZGRlblwiIFthdHRyLmhyZWZdPVwibGFtYk1lbnVJdGVtLnVybFwiIFthdHRyLnRhcmdldF09XCJsYW1iTWVudUl0ZW0udGFyZ2V0XCJcclxuICAgIFthdHRyLnRpdGxlXT1cImxhbWJNZW51SXRlbS50aXRsZVwiIFtjbGFzcy5hY3RpdmVdPVwibGFtYk1lbnVJdGVtLnNlbGVjdGVkXCIgKG1vdXNlZW50ZXIpPVwib25Ib3Zlckl0ZW0obGFtYk1lbnVJdGVtKVwiIChjbGljayk9XCJvblNlbGVjdEl0ZW0obGFtYk1lbnVJdGVtKVwiPlxyXG4gICAgPGkgY2xhc3M9XCJsYW1iLW1lbnUtaWNvbiB7eyBsYW1iTWVudUl0ZW0uaWNvbiB9fVwiICpuZ0lmPVwibGFtYk1lbnVJdGVtLmljb25cIj48L2k+XHJcbiAgICA8c3BhbiBjbGFzcz1cImxhbWItbWVudS10aXRsZVwiPnt7IGxhbWJNZW51SXRlbS50aXRsZSB9fTwvc3Bhbj5cclxuPC9hPlxyXG48YSAqbmdJZj1cIiEobGFtYk1lbnVJdGVtLmNoaWxkcmVuICYmIGxhbWJNZW51SXRlbS5jaGlsZHJlbi5sZW5ndGgpICYmICFsYW1iTWVudUl0ZW0ubGlua1xyXG4gICYmICFsYW1iTWVudUl0ZW0udXJsICYmICFsYW1iTWVudUl0ZW0uZ3JvdXAgJiYgIWxhbWJNZW51SXRlbS5oaWRkZW5cIiBbYXR0ci50YXJnZXRdPVwibGFtYk1lbnVJdGVtLnRhcmdldFwiIFthdHRyLnRpdGxlXT1cImxhbWJNZW51SXRlbS50aXRsZVwiXHJcbiAgICBbY2xhc3MuYWN0aXZlXT1cImxhbWJNZW51SXRlbS5zZWxlY3RlZFwiIChtb3VzZWVudGVyKT1cIm9uSG92ZXJJdGVtKGxhbWJNZW51SXRlbSlcIiAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IG9uSXRlbUNsaWNrKGxhbWJNZW51SXRlbSk7XCI+XHJcbiAgICA8aSBjbGFzcz1cImxhbWItbWVudS1pY29uIHt7IGxhbWJNZW51SXRlbS5pY29uIH19XCIgKm5nSWY9XCJsYW1iTWVudUl0ZW0uaWNvblwiPjwvaT5cclxuICAgIDxzcGFuIGNsYXNzPVwibGFtYi1tZW51LXRpdGxlXCI+e3sgbGFtYk1lbnVJdGVtLnRpdGxlIH19PC9zcGFuPlxyXG48L2E+XHJcbjxhICpuZ0lmPVwiKGxhbWJNZW51SXRlbS5jaGlsZHJlbiAmJiBsYW1iTWVudUl0ZW0uY2hpbGRyZW4ubGVuZ3RoKSAmJiAhbGFtYk1lbnVJdGVtLmhpZGRlblwiIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgb25Ub2dnbGVTdWJNZW51KGxhbWJNZW51SXRlbSk7XCJcclxuICAgIFthdHRyLnRhcmdldF09XCJsYW1iTWVudUl0ZW0udGFyZ2V0XCIgW2F0dHIudGl0bGVdPVwibGFtYk1lbnVJdGVtLnRpdGxlXCIgW2NsYXNzLmFjdGl2ZV09XCJsYW1iTWVudUl0ZW0uc2VsZWN0ZWRcIiAobW91c2VlbnRlcik9XCJvbkhvdmVySXRlbShsYW1iTWVudUl0ZW0pXCJcclxuICAgIGhyZWY9XCIjXCI+XHJcbiAgICA8aSBjbGFzcz1cImxhbWItbWVudS1pY29uIHt7IGxhbWJNZW51SXRlbS5pY29uIH19XCIgKm5nSWY9XCJsYW1iTWVudUl0ZW0uaWNvblwiPjwvaT5cclxuICAgIDxzcGFuIGNsYXNzPVwibGFtYi1tZW51LXRpdGxlXCI+e3sgbGFtYk1lbnVJdGVtLnRpdGxlIH19PC9zcGFuPlxyXG4gICAgPCEtLSA8aSBjbGFzcz1cImlvbiBjaGV2cm9uXCIgW2NsYXNzLmlvbi1jaGV2cm9uLXVwXT1cIiFsYW1iTWVudUl0ZW0uZXhwYW5kZWRcIiBbY2xhc3MuaW9uLWNoZXZyb24tZG93bl09XCJsYW1iTWVudUl0ZW0uZXhwYW5kZWRcIj48L2k+IC0tPlxyXG4gICAgPGkgY2xhc3M9XCJmYSBjaGV2cm9uXCIgW2NsYXNzLmZhLWNoZXZyb24tdXBdPVwiIWxhbWJNZW51SXRlbS5leHBhbmRlZFwiIFtjbGFzcy5mYS1jaGV2cm9uLWRvd25dPVwibGFtYk1lbnVJdGVtLmV4cGFuZGVkXCI+PC9pPlxyXG48L2E+XHJcbjx1bCAqbmdJZj1cIihsYW1iTWVudUl0ZW0uY2hpbGRyZW4gJiYgbGFtYk1lbnVJdGVtLmNoaWxkcmVuLmxlbmd0aCkgJiYgIWxhbWJNZW51SXRlbS5oaWRkZW5cIiBbY2xhc3MuY29sbGFwc2VkXT1cIiEobGFtYk1lbnVJdGVtLmNoaWxkcmVuICYmIGxhbWJNZW51SXRlbS5leHBhbmRlZClcIlxyXG4gICAgW2NsYXNzLmV4cGFuZGVkXT1cImxhbWJNZW51SXRlbS5leHBhbmRlZFwiIGNsYXNzPVwibGFtYi1tZW51LWl0ZW1zXCIgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwibWF4SGVpZ2h0XCI+XHJcbiAgICA8bGkgbGFtYk1lbnVJdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxhbWJNZW51SXRlbS5jaGlsZHJlblwiIFtsYW1iTWVudUl0ZW1tXT1cIml0ZW1cIiBbY2xhc3MubGFtYi1tZW51LWdyb3VwXT1cIml0ZW0uZ3JvdXBcIiAoaG92ZXJJdGVtKT1cIm9uSG92ZXJJdGVtKCRldmVudClcIlxyXG4gICAgICAgICh0b2dnbGVTdWJNZW51KT1cIm9uVG9nZ2xlU3ViTWVudSgkZXZlbnQpXCIgKHNlbGVjdEl0ZW0pPVwib25TZWxlY3RJdGVtKCRldmVudClcIiAoaXRlbUNsaWNrKT1cIm9uSXRlbUNsaWNrKCRldmVudClcIiBjbGFzcz1cImxhbWItbWVudS1pdGVtXCI+PC9saT5cclxuPC91bD5gLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGFtYk1lbnVJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBwdWJsaWMgbGFtYk1lbnVJdGVtID0gPExhbWJNZW51SXRlbT5udWxsO1xyXG4gIC8vIEBJbnB1dCgpIGxhbWJNZW51SXRlbW0gPSA8TGFtYk1lbnVJdGVtPm51bGw7XHJcbiAgQElucHV0KClcclxuICBzZXQgbGFtYk1lbnVJdGVtbShsYW1iTWVudUl0ZW06IExhbWJNZW51SXRlbSkge1xyXG4gICAgaWYgKGxhbWJNZW51SXRlbSkge1xyXG4gICAgICBsYW1iTWVudUl0ZW0uaWNvbiA9IChsYW1iTWVudUl0ZW0uaWNvbiAmJlxyXG4gICAgICAgIChsYW1iTWVudUl0ZW0uaWNvbiAhPT0gJ2ljbW4tYm9va3MnKSAmJlxyXG4gICAgICAgIChsYW1iTWVudUl0ZW0uaWNvbiAhPT0gJ2ljbWItYm9va3MnKSAmJlxyXG4gICAgICAgIGxhbWJNZW51SXRlbS5pY29uKVxyXG4gICAgICAgIHx8IHRoaXMucmFuZG9uSWNvbigpO1xyXG4gICAgICBsYW1iTWVudUl0ZW0ubGluayA9IChsYW1iTWVudUl0ZW0ubGluayAmJiAhbGFtYk1lbnVJdGVtLnVybFxyXG4gICAgICAgICYmICEobGFtYk1lbnVJdGVtLmNoaWxkcmVuICYmIGxhbWJNZW51SXRlbS5jaGlsZHJlbi5sZW5ndGgpXHJcbiAgICAgICAgJiYgIWxhbWJNZW51SXRlbS5ncm91cCAmJiAhbGFtYk1lbnVJdGVtLmhpZGRlbikgJiYgJy8nICsgbGFtYk1lbnVJdGVtLmxpbms7XHJcblxyXG4gICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5sYW1iTWVudUl0ZW0gPSBsYW1iTWVudUl0ZW07XHJcbiAgICAgIC8vIH0sIDApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgaG92ZXJJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHRvZ2dsZVN1Yk1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2VsZWN0SXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBhbGl2ZSA9IHRydWU7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oTGFtYk1lbnVJdGVtQ29tcG9uZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgc3ViTWVudTogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG4gIG1heEhlaWdodCA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbGFtYk1lbnVTZXJ2aWNlOiBMYW1iTWVudVNlcnZpY2UpIHsgfVxyXG5cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgLy8gdGhpcy5sYW1iTWVudUl0ZW0uY2hpbGRyZW4ubGVuZ3RoXHJcbiAgICB0aGlzLnN1Yk1lbnUuY2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU3VibWVudUhlaWdodCgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTWF4SGVpZ2h0KCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMubGFtYk1lbnVTZXJ2aWNlLm9uU3VibWVudVRvZ2dsZSQoKVxyXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlTWF4SGVpZ2h0KCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMudXBkYXRlU3VibWVudUhlaWdodCgpO1xyXG4gICAgdGhpcy51cGRhdGVNYXhIZWlnaHQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldCBpY29ucygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdmYSBmYS1hZG4nLFxyXG4gICAgICAnZmEgZmEtY29kZScsXHJcbiAgICAgICdmYSBmYS1idWxsaG9ybicsXHJcbiAgICAgICdmYSBmYS1hbWJ1bGFuY2UnLFxyXG4gICAgICAnZmEgZmEtYW5kcm9pZCcsXHJcbiAgICAgICdmYSBmYS1hbmdlbGxpc3QnLFxyXG4gICAgICAnZmEgZmEtYXBwbGUnLFxyXG4gICAgICAnZmEgZmEtYXQnLFxyXG4gICAgICAnZmEgZmEtY2hyb21lJyxcclxuICAgICAgJ2ZhIGZhLWNoaWxkJyxcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJhbmRvbkljb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pY29uc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLmljb25zLmxlbmd0aCldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTdWJtZW51SGVpZ2h0KCkge1xyXG4gICAgdGhpcy5sYW1iTWVudUl0ZW0uc3ViTWVudUhlaWdodCA9IHRoaXMuc3ViTWVudS5yZWR1Y2UoKGFjYywgYykgPT4gYWNjICsgZ2V0RWxlbWVudEhlaWdodChjLm5hdGl2ZUVsZW1lbnQpLCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTWF4SGVpZ2h0KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubWF4SGVpZ2h0ID0gc3VtU3VibWVudUhlaWdodCh0aGlzLmxhbWJNZW51SXRlbSk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkhvdmVySXRlbShpdGVtOiBMYW1iTWVudUl0ZW0pIHtcclxuICAgIHRoaXMuaG92ZXJJdGVtLmVtaXQoaXRlbSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Ub2dnbGVTdWJNZW51KGl0ZW06IExhbWJNZW51SXRlbSkge1xyXG4gICAgdGhpcy50b2dnbGVTdWJNZW51LmVtaXQoaXRlbSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25JdGVtQ2xpY2soaXRlbTogTGFtYk1lbnVJdGVtKSB7XHJcbiAgICB0aGlzLml0ZW1DbGljay5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uU2VsZWN0SXRlbShpdGVtOiBMYW1iTWVudUl0ZW0pIHtcclxuICAgIHRoaXMuc2VsZWN0SXRlbS5lbWl0KGl0ZW0pO1xyXG4gIH1cclxufVxyXG4iXX0=