@coreui/angular
Version:
CoreUI Angular Bootstrap 4 components
617 lines • 42.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Directive, ElementRef, HostBinding, HostListener, Inject, Input, Renderer2 } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { Router } from '@angular/router';
import { Replace } from '../shared';
var NavDropdownDirective = /** @class */ (function () {
function NavDropdownDirective(el) {
this.el = el;
}
/**
* @return {?}
*/
NavDropdownDirective.prototype.toggle = /**
* @return {?}
*/
function () {
this.el.nativeElement.classList.toggle('open');
};
NavDropdownDirective.decorators = [
{ type: Directive, args: [{
selector: '[appNavDropdown]'
},] }
];
/** @nocollapse */
NavDropdownDirective.ctorParameters = function () { return [
{ type: ElementRef }
]; };
return NavDropdownDirective;
}());
export { NavDropdownDirective };
if (false) {
/**
* @type {?}
* @private
*/
NavDropdownDirective.prototype.el;
}
/**
* Allows the dropdown to be toggled via click.
*/
var NavDropdownToggleDirective = /** @class */ (function () {
function NavDropdownToggleDirective(dropdown) {
this.dropdown = dropdown;
}
/**
* @param {?} $event
* @return {?}
*/
NavDropdownToggleDirective.prototype.toggleOpen = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
$event.preventDefault();
this.dropdown.toggle();
};
NavDropdownToggleDirective.decorators = [
{ type: Directive, args: [{
selector: '[appNavDropdownToggle]'
},] }
];
/** @nocollapse */
NavDropdownToggleDirective.ctorParameters = function () { return [
{ type: NavDropdownDirective }
]; };
NavDropdownToggleDirective.propDecorators = {
toggleOpen: [{ type: HostListener, args: ['click', ['$event'],] }]
};
return NavDropdownToggleDirective;
}());
export { NavDropdownToggleDirective };
if (false) {
/**
* @type {?}
* @private
*/
NavDropdownToggleDirective.prototype.dropdown;
}
var LinkAttributesDirective = /** @class */ (function () {
function LinkAttributesDirective(document, renderer, el) {
this.document = document;
this.renderer = renderer;
this.el = el;
}
/**
* @return {?}
*/
LinkAttributesDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
/** @type {?} */
var attribs = this.appLinkAttributes;
for (var attr in attribs) {
if (attr === 'style' && typeof (attribs[attr]) === 'object') {
this.setStyle(attribs[attr]);
}
else if (attr === 'class') {
this.addClass(attribs[attr]);
}
else {
this.setAttrib(attr, attribs[attr]);
}
}
};
/**
* @private
* @param {?} styles
* @return {?}
*/
LinkAttributesDirective.prototype.setStyle = /**
* @private
* @param {?} styles
* @return {?}
*/
function (styles) {
for (var style in styles) {
this.renderer.setStyle(this.el.nativeElement, style, styles[style]);
}
};
/**
* @private
* @param {?} classes
* @return {?}
*/
LinkAttributesDirective.prototype.addClass = /**
* @private
* @param {?} classes
* @return {?}
*/
function (classes) {
var _this = this;
/** @type {?} */
var classArray = Array.isArray(classes) ? classes : classes.split(' ');
classArray.forEach(function (element) {
_this.renderer.addClass(_this.el.nativeElement, element);
});
};
/**
* @private
* @param {?} key
* @param {?} value
* @return {?}
*/
LinkAttributesDirective.prototype.setAttrib = /**
* @private
* @param {?} key
* @param {?} value
* @return {?}
*/
function (key, value) {
/** @type {?} */
var newAttr = this.document.createAttribute(key);
newAttr.value = value;
this.renderer.setAttribute(this.el.nativeElement, key, value);
};
LinkAttributesDirective.decorators = [
{ type: Directive, args: [{
selector: '[appLinkAttributes]'
},] }
];
/** @nocollapse */
LinkAttributesDirective.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: Renderer2 },
{ type: ElementRef }
]; };
LinkAttributesDirective.propDecorators = {
appLinkAttributes: [{ type: Input }]
};
return LinkAttributesDirective;
}());
export { LinkAttributesDirective };
if (false) {
/** @type {?} */
LinkAttributesDirective.prototype.appLinkAttributes;
/**
* @type {?}
* @private
*/
LinkAttributesDirective.prototype.document;
/**
* @type {?}
* @private
*/
LinkAttributesDirective.prototype.renderer;
/**
* @type {?}
* @private
*/
LinkAttributesDirective.prototype.el;
}
var AppSidebarNavComponent = /** @class */ (function () {
function AppSidebarNavComponent() {
this.role = 'nav';
}
/**
* @param {?} item
* @return {?}
*/
AppSidebarNavComponent.prototype.isDivider = /**
* @param {?} item
* @return {?}
*/
function (item) {
return item.divider ? true : false;
};
/**
* @param {?} item
* @return {?}
*/
AppSidebarNavComponent.prototype.isTitle = /**
* @param {?} item
* @return {?}
*/
function (item) {
return item.title ? true : false;
};
/**
* @param {?} changes
* @return {?}
*/
AppSidebarNavComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
this.navItemsArray = JSON.parse(JSON.stringify(this.navItems));
};
AppSidebarNavComponent.decorators = [
{ type: Component, args: [{
selector: 'app-sidebar-nav',
template: "\n <ul class=\"nav\">\n <ng-template ngFor let-navitem [ngForOf]=\"navItems\">\n <li *ngIf=\"isDivider(navitem)\" class=\"nav-divider\"></li>\n <ng-template [ngIf]=\"isTitle(navitem)\">\n <app-sidebar-nav-title [title]='navitem'></app-sidebar-nav-title>\n </ng-template>\n <ng-template [ngIf]=\"!isDivider(navitem)&&!isTitle(navitem)\">\n <app-sidebar-nav-item [item]='navitem'></app-sidebar-nav-item>\n </ng-template>\n </ng-template>\n </ul>"
}] }
];
/** @nocollapse */
AppSidebarNavComponent.ctorParameters = function () { return []; };
AppSidebarNavComponent.propDecorators = {
navItems: [{ type: Input }],
true: [{ type: HostBinding, args: ['class.sidebar-nav',] }],
role: [{ type: HostBinding, args: ['attr.role',] }]
};
return AppSidebarNavComponent;
}());
export { AppSidebarNavComponent };
if (false) {
/** @type {?} */
AppSidebarNavComponent.prototype.navItems;
/** @type {?} */
AppSidebarNavComponent.prototype.true;
/** @type {?} */
AppSidebarNavComponent.prototype.role;
/** @type {?} */
AppSidebarNavComponent.prototype.navItemsArray;
}
var AppSidebarNavItemComponent = /** @class */ (function () {
function AppSidebarNavItemComponent(router, el) {
this.router = router;
this.el = el;
}
/**
* @return {?}
*/
AppSidebarNavItemComponent.prototype.hasClass = /**
* @return {?}
*/
function () {
return this.item.class ? true : false;
};
/**
* @return {?}
*/
AppSidebarNavItemComponent.prototype.isDropdown = /**
* @return {?}
*/
function () {
return this.item.children ? true : false;
};
/**
* @return {?}
*/
AppSidebarNavItemComponent.prototype.thisUrl = /**
* @return {?}
*/
function () {
return this.item.url;
};
/**
* @return {?}
*/
AppSidebarNavItemComponent.prototype.isActive = /**
* @return {?}
*/
function () {
return this.router.isActive(this.thisUrl(), false);
};
/**
* @return {?}
*/
AppSidebarNavItemComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
Replace(this.el);
};
AppSidebarNavItemComponent.decorators = [
{ type: Component, args: [{
selector: 'app-sidebar-nav-item',
template: "\n <li *ngIf=\"!isDropdown(); else dropdown\" [ngClass]=\"hasClass() ? 'nav-item ' + item.class : 'nav-item'\">\n <app-sidebar-nav-link [link]='item'></app-sidebar-nav-link>\n </li>\n <ng-template #dropdown>\n <li [ngClass]=\"hasClass() ? 'nav-item nav-dropdown ' + item.class : 'nav-item nav-dropdown'\"\n [class.open]=\"isActive()\"\n routerLinkActive=\"open\"\n appNavDropdown>\n <app-sidebar-nav-dropdown [link]='item'></app-sidebar-nav-dropdown>\n </li>\n </ng-template>\n "
}] }
];
/** @nocollapse */
AppSidebarNavItemComponent.ctorParameters = function () { return [
{ type: Router },
{ type: ElementRef }
]; };
AppSidebarNavItemComponent.propDecorators = {
item: [{ type: Input }]
};
return AppSidebarNavItemComponent;
}());
export { AppSidebarNavItemComponent };
if (false) {
/** @type {?} */
AppSidebarNavItemComponent.prototype.item;
/**
* @type {?}
* @private
*/
AppSidebarNavItemComponent.prototype.router;
/**
* @type {?}
* @private
*/
AppSidebarNavItemComponent.prototype.el;
}
var AppSidebarNavLinkComponent = /** @class */ (function () {
function AppSidebarNavLinkComponent(document, renderer, router, el) {
this.document = document;
this.renderer = renderer;
this.router = router;
this.el = el;
}
/**
* @return {?}
*/
AppSidebarNavLinkComponent.prototype.getClasses = /**
* @return {?}
*/
function () {
/** @type {?} */
var disabled = this.isDisabled();
/** @type {?} */
var classes = {
'nav-link': true,
'disabled': disabled,
'btn-link': disabled
};
if (this.hasVariant()) {
/** @type {?} */
var variant = "nav-link-" + this.link.variant;
classes[variant] = true;
}
return classes;
};
/**
* @return {?}
*/
AppSidebarNavLinkComponent.prototype.getLinkType = /**
* @return {?}
*/
function () {
return this.isDisabled() ? 'disabled' : this.isExternalLink() ? 'external' : '';
};
/**
* @return {?}
*/
AppSidebarNavLinkComponent.prototype.hasVariant = /**
* @return {?}
*/
function () {
return this.link.variant ? true : false;
};
/**
* @return {?}
*/
AppSidebarNavLinkComponent.prototype.isBadge = /**
* @return {?}
*/
function () {
return this.link.badge ? true : false;
};
/**
* @return {?}
*/
AppSidebarNavLinkComponent.prototype.isDisabled = /**
* @return {?}
*/
function () {
return this.link.attributes && this.link.attributes.disabled ? true : false;
};
/**
* @return {?}
*/
AppSidebarNavLinkComponent.prototype.isExternalLink = /**
* @return {?}
*/
function () {
return this.link.url.substring(0, 4) === 'http' ? true : false;
};
/**
* @return {?}
*/
AppSidebarNavLinkComponent.prototype.isIcon = /**
* @return {?}
*/
function () {
return this.link.icon ? true : false;
};
/**
* @return {?}
*/
AppSidebarNavLinkComponent.prototype.hideMobile = /**
* @return {?}
*/
function () {
if (this.document.body.classList.contains('sidebar-show')) {
this.renderer.removeClass(this.document.body, 'sidebar-show');
}
};
/**
* @return {?}
*/
AppSidebarNavLinkComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
Replace(this.el);
};
AppSidebarNavLinkComponent.decorators = [
{ type: Component, args: [{
selector: 'app-sidebar-nav-link',
template: "\n <ng-container [ngSwitch]=\"getLinkType()\">\n <a *ngSwitchCase=\"'disabled'\"\n [attr.disabled]=\"true\"\n [appLinkAttributes]=\"link.attributes\"\n href=\"\"\n [ngClass]=\"getClasses()\">\n <i *ngIf=\"isIcon()\" class=\"nav-icon {{ link.icon }}\"></i>\n {{ link.name }}\n <span *ngIf=\"isBadge()\" [ngClass]=\"'badge badge-' + link.badge.variant\">{{ link.badge.text }}</span>\n </a>\n <a *ngSwitchCase=\"'external'\" [ngClass]=\"getClasses()\" href=\"{{link.url}}\" [appLinkAttributes]=\"link.attributes\">\n <i *ngIf=\"isIcon()\" class=\"nav-icon {{ link.icon }}\"></i>\n {{ link.name }}\n <span *ngIf=\"isBadge()\" [ngClass]=\"'badge badge-' + link.badge.variant\">{{ link.badge.text }}</span>\n </a>\n <a *ngSwitchDefault\n [ngClass]=\"getClasses()\"\n [appLinkAttributes]=\"link.attributes\"\n routerLinkActive=\"active\"\n [routerLink]=\"[link.url]\"\n (click)=\"hideMobile()\">\n <i *ngIf=\"isIcon()\" class=\"nav-icon {{ link.icon }}\"></i>\n {{ link.name }}\n <span *ngIf=\"isBadge()\" [ngClass]=\"'badge badge-' + link.badge.variant\">{{ link.badge.text }}</span>\n </a>\n </ng-container>\n "
}] }
];
/** @nocollapse */
AppSidebarNavLinkComponent.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: Renderer2 },
{ type: Router },
{ type: ElementRef }
]; };
AppSidebarNavLinkComponent.propDecorators = {
link: [{ type: Input }]
};
return AppSidebarNavLinkComponent;
}());
export { AppSidebarNavLinkComponent };
if (false) {
/** @type {?} */
AppSidebarNavLinkComponent.prototype.link;
/**
* @type {?}
* @private
*/
AppSidebarNavLinkComponent.prototype.document;
/**
* @type {?}
* @private
*/
AppSidebarNavLinkComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
AppSidebarNavLinkComponent.prototype.router;
/**
* @type {?}
* @private
*/
AppSidebarNavLinkComponent.prototype.el;
}
var AppSidebarNavDropdownComponent = /** @class */ (function () {
function AppSidebarNavDropdownComponent(router, el) {
this.router = router;
this.el = el;
}
/**
* @return {?}
*/
AppSidebarNavDropdownComponent.prototype.isBadge = /**
* @return {?}
*/
function () {
return this.link.badge ? true : false;
};
/**
* @return {?}
*/
AppSidebarNavDropdownComponent.prototype.isIcon = /**
* @return {?}
*/
function () {
return this.link.icon ? true : false;
};
/**
* @return {?}
*/
AppSidebarNavDropdownComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
Replace(this.el);
};
AppSidebarNavDropdownComponent.decorators = [
{ type: Component, args: [{
selector: 'app-sidebar-nav-dropdown',
template: "\n <a class=\"nav-link nav-dropdown-toggle\" appNavDropdownToggle>\n <i *ngIf=\"isIcon()\" class=\"nav-icon {{ link.icon }}\"></i>\n {{ link.name }}\n <span *ngIf=\"isBadge()\" [ngClass]=\"'badge badge-' + link.badge.variant\">{{ link.badge.text }}</span>\n </a>\n <ul class=\"nav-dropdown-items\">\n <ng-template ngFor let-child [ngForOf]=\"link.children\">\n <app-sidebar-nav-item [item]='child'></app-sidebar-nav-item>\n </ng-template>\n </ul>\n ",
styles: ['.nav-dropdown-toggle { cursor: pointer; }']
}] }
];
/** @nocollapse */
AppSidebarNavDropdownComponent.ctorParameters = function () { return [
{ type: Router },
{ type: ElementRef }
]; };
AppSidebarNavDropdownComponent.propDecorators = {
link: [{ type: Input }]
};
return AppSidebarNavDropdownComponent;
}());
export { AppSidebarNavDropdownComponent };
if (false) {
/** @type {?} */
AppSidebarNavDropdownComponent.prototype.link;
/**
* @type {?}
* @private
*/
AppSidebarNavDropdownComponent.prototype.router;
/**
* @type {?}
* @private
*/
AppSidebarNavDropdownComponent.prototype.el;
}
var AppSidebarNavTitleComponent = /** @class */ (function () {
function AppSidebarNavTitleComponent(el, renderer) {
this.el = el;
this.renderer = renderer;
}
/**
* @return {?}
*/
AppSidebarNavTitleComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
/** @type {?} */
var nativeElement = this.el.nativeElement;
/** @type {?} */
var li = this.renderer.createElement('li');
/** @type {?} */
var name = this.renderer.createText(this.title.name);
this.renderer.addClass(li, 'nav-title');
if (this.title.class) {
/** @type {?} */
var classes = this.title.class;
this.renderer.addClass(li, classes);
}
if (this.title.wrapper) {
/** @type {?} */
var wrapper = this.renderer.createElement(this.title.wrapper.element);
this.renderer.appendChild(wrapper, name);
this.renderer.appendChild(li, wrapper);
}
else {
this.renderer.appendChild(li, name);
}
this.renderer.appendChild(nativeElement, li);
Replace(this.el);
};
AppSidebarNavTitleComponent.decorators = [
{ type: Component, args: [{
selector: 'app-sidebar-nav-title',
template: ''
}] }
];
/** @nocollapse */
AppSidebarNavTitleComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 }
]; };
AppSidebarNavTitleComponent.propDecorators = {
title: [{ type: Input }]
};
return AppSidebarNavTitleComponent;
}());
export { AppSidebarNavTitleComponent };
if (false) {
/** @type {?} */
AppSidebarNavTitleComponent.prototype.title;
/**
* @type {?}
* @private
*/
AppSidebarNavTitleComponent.prototype.el;
/**
* @type {?}
* @private
*/
AppSidebarNavTitleComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXNpZGViYXItbmF2LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb3JldWkvYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zaWRlYmFyL2FwcC1zaWRlYmFyLW5hdi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUFFLE1BQU0sRUFDcEIsS0FBSyxFQUdMLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEM7SUFLRSw4QkFBb0IsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7SUFBSSxDQUFDOzs7O0lBRXZDLHFDQUFNOzs7SUFBTjtRQUNFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQzs7Z0JBVEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7aUJBQzdCOzs7O2dCQWpCQyxVQUFVOztJQXlCWiwyQkFBQztDQUFBLEFBVkQsSUFVQztTQVBZLG9CQUFvQjs7Ozs7O0lBRW5CLGtDQUFzQjs7Ozs7QUFVcEM7SUFJRSxvQ0FBb0IsUUFBOEI7UUFBOUIsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7SUFBRyxDQUFDOzs7OztJQUd0RCwrQ0FBVTs7OztJQURWLFVBQ1csTUFBVztRQUNwQixNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN6QixDQUFDOztnQkFWRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxF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LElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25CLENBQUM7O2dCQS9CRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7Ozs7Z0JBdlNDLFVBQVU7Z0JBTVYsU0FBUzs7O3dCQW1TUixLQUFLOztJQTJCUixrQ0FBQztDQUFBLEFBaENELElBZ0NDO1NBNUJZLDJCQUEyQjs7O0lBQ3RDLDRDQUFvQjs7Ozs7SUFFUix5Q0FBc0I7Ozs7O0lBQUUsK0NBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSG9zdExpc3RlbmVyLCBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlc1xyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7IFJlcGxhY2UgfSBmcm9tICcuLi9zaGFyZWQnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbYXBwTmF2RHJvcGRvd25dJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTmF2RHJvcGRvd25EaXJlY3RpdmUge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgdG9nZ2xlKCkge1xyXG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ29wZW4nKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4qIEFsbG93cyB0aGUgZHJvcGRvd24gdG8gYmUgdG9nZ2xlZCB2aWEgY2xpY2suXHJcbiovXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2FwcE5hdkRyb3Bkb3duVG9nZ2xlXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIE5hdkRyb3Bkb3duVG9nZ2xlRGlyZWN0aXZlIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRyb3Bkb3duOiBOYXZEcm9wZG93bkRpcmVjdGl2ZSkge31cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxyXG4gIHRvZ2dsZU9wZW4oJGV2ZW50OiBhbnkpIHtcclxuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5kcm9wZG93bi50b2dnbGUoKTtcclxuICB9XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2FwcExpbmtBdHRyaWJ1dGVzXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIExpbmtBdHRyaWJ1dGVzRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBhcHBMaW5rQXR0cmlidXRlczoge1trZXk6IHN0cmluZ106IHN0cmluZyB9O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgY29uc3QgYXR0cmlicyA9IHRoaXMuYXBwTGlua0F0dHJpYnV0ZXM7XHJcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlicykge1xyXG4gICAgICBpZiAoYXR0ciA9PT0gJ3N0eWxlJyAmJiB0eXBlb2YoYXR0cmlic1thdHRyXSkgPT09ICdvYmplY3QnICkge1xyXG4gICAgICAgIHRoaXMuc2V0U3R5bGUoYXR0cmlic1thdHRyXSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoYXR0ciA9PT0gJ2NsYXNzJykge1xyXG4gICAgICAgIHRoaXMuYWRkQ2xhc3MoYXR0cmlic1thdHRyXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZXRBdHRyaWIoYXR0ciwgYXR0cmlic1thdHRyXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U3R5bGUoc3R5bGVzKSB7XHJcbiAgICBmb3IgKGNvbnN0IHN0eWxlIGluIHN0eWxlcykge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgc3R5bGUsIHN0eWxlc1tzdHlsZV0gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkQ2xhc3MoY2xhc3Nlcykge1xyXG4gICAgY29uc3QgY2xhc3NBcnJheSA9IEFycmF5LmlzQXJyYXkoY2xhc3NlcykgPyBjbGFzc2VzIDogY2xhc3Nlcy5zcGxpdCgnICcpO1xyXG4gICAgY2xhc3NBcnJheS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgZWxlbWVudCApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEF0dHJpYihrZXksIHZhbHVlKSB7XHJcbiAgICBjb25zdCBuZXdBdHRyID0gdGhpcy5kb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoa2V5KTtcclxuICAgIG5ld0F0dHIudmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwga2V5LCB2YWx1ZSApO1xyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtc2lkZWJhci1uYXYnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8dWwgY2xhc3M9XCJuYXZcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1uYXZpdGVtIFtuZ0Zvck9mXT1cIm5hdkl0ZW1zXCI+XHJcbiAgICAgICAgPGxpICpuZ0lmPVwiaXNEaXZpZGVyKG5hdml0ZW0pXCIgY2xhc3M9XCJuYXYtZGl2aWRlclwiPjwvbGk+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImlzVGl0bGUobmF2aXRlbSlcIj5cclxuICAgICAgICAgIDxhcHAtc2lkZWJhci1uYXYtdGl0bGUgW3RpdGxlXT0nbmF2aXRlbSc+PC9hcHAtc2lkZWJhci1uYXYtdGl0bGU+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWlzRGl2aWRlcihuYXZpdGVtKSYmIWlzVGl0bGUobmF2aXRlbSlcIj5cclxuICAgICAgICAgIDxhcHAtc2lkZWJhci1uYXYtaXRlbSBbaXRlbV09J25hdml0ZW0nPjwvYXBwLXNpZGViYXItbmF2LWl0ZW0+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvdWw+YFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwU2lkZWJhck5hdkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgbmF2SXRlbXM6IEFycmF5PGFueT47XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2lkZWJhci1uYXYnKSB0cnVlO1xyXG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJykgcm9sZSA9ICduYXYnO1xyXG5cclxuICBwdWJsaWMgbmF2SXRlbXNBcnJheTogQXJyYXk8YW55PjtcclxuXHJcbiAgcHVibGljIGlzRGl2aWRlcihpdGVtKSB7XHJcbiAgICByZXR1cm4gaXRlbS5kaXZpZGVyID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzVGl0bGUoaXRlbSkge1xyXG4gICAgcmV0dXJuIGl0ZW0udGl0bGUgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5uYXZJdGVtc0FycmF5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm5hdkl0ZW1zKSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1zaWRlYmFyLW5hdi1pdGVtJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGxpICpuZ0lmPVwiIWlzRHJvcGRvd24oKTsgZWxzZSBkcm9wZG93blwiIFtuZ0NsYXNzXT1cImhhc0NsYXNzKCkgPyAnbmF2LWl0ZW0gJyArIGl0ZW0uY2xhc3MgOiAnbmF2LWl0ZW0nXCI+XHJcbiAgICAgIDxhcHAtc2lkZWJhci1uYXYtbGluayBbbGlua109J2l0ZW0nPjwvYXBwLXNpZGViYXItbmF2LWxpbms+XHJcbiAgICA8L2xpPlxyXG4gICAgPG5nLXRlbXBsYXRlICNkcm9wZG93bj5cclxuICAgICAgPGxpIFtuZ0NsYXNzXT1cImhhc0NsYXNzKCkgPyAnbmF2LWl0ZW0gbmF2LWRyb3Bkb3duICcgKyBpdGVtLmNsYXNzIDogJ25hdi1pdGVtIG5hdi1kcm9wZG93bidcIlxyXG4gICAgICAgICAgW2NsYXNzLm9wZW5dPVwiaXNBY3RpdmUoKVwiXHJcbiAgICAgICAgICByb3V0ZXJMaW5rQWN0aXZlPVwib3BlblwiXHJcbiAgICAgICAgICBhcHBOYXZEcm9wZG93bj5cclxuICAgICAgICA8YXBwLXNpZGViYXItbmF2LWRyb3Bkb3duIFtsaW5rXT0naXRlbSc+PC9hcHAtc2lkZWJhci1uYXYtZHJvcGRvd24+XHJcbiAgICAgIDwvbGk+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwU2lkZWJhck5hdkl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGl0ZW06IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYgKSB7IH1cclxuXHJcbiAgcHVibGljIGhhc0NsYXNzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbS5jbGFzcyA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0Ryb3Bkb3duKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbS5jaGlsZHJlbiA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0aGlzVXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbS51cmw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNBY3RpdmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3V0ZXIuaXNBY3RpdmUodGhpcy50aGlzVXJsKCksIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgUmVwbGFjZSh0aGlzLmVsKTtcclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXNpZGViYXItbmF2LWxpbmsnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJnZXRMaW5rVHlwZSgpXCI+XHJcbiAgICAgIDxhICpuZ1N3aXRjaENhc2U9XCInZGlzYWJsZWQnXCJcclxuICAgICAgW2F0dHIuZGlzYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgIFthcHBMaW5rQXR0cmlidXRlc109XCJsaW5rLmF0dHJpYnV0ZXNcIlxyXG4gICAgICBocmVmPVwiXCJcclxuICAgICAgW25nQ2xhc3NdPVwiZ2V0Q2xhc3NlcygpXCI+XHJcbiAgICAgICAgPGkgKm5nSWY9XCJpc0ljb24oKVwiIGNsYXNzPVwibmF2LWljb24ge3sgbGluay5pY29uIH19XCI+PC9pPlxyXG4gICAgICAgIHt7IGxpbmsubmFtZSB9fVxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaXNCYWRnZSgpXCIgW25nQ2xhc3NdPVwiJ2JhZGdlIGJhZGdlLScgKyBsaW5rLmJhZGdlLnZhcmlhbnRcIj57eyBsaW5rLmJhZGdlLnRleHQgfX08L3NwYW4+XHJcbiAgICAgIDwvYT5cclxuICAgICAgPGEgKm5nU3dpdGNoQ2FzZT1cIidleHRlcm5hbCdcIiBbbmdDbGFzc109XCJnZXRDbGFzc2VzKClcIiBocmVmPVwie3tsaW5rLnVybH19XCIgW2FwcExpbmtBdHRyaWJ1dGVzXT1cImxpbmsuYXR0cmlidXRlc1wiPlxyXG4gICAgICAgIDxpICpuZ0lmPVwiaXNJY29uKClcIiBjbGFzcz1cIm5hdi1pY29uIHt7IGxpbmsuaWNvbiB9fVwiPjwvaT5cclxuICAgICAgICB7eyBsaW5rLm5hbWUgfX1cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImlzQmFkZ2UoKVwiIFtuZ0NsYXNzXT1cIidiYWRnZSBiYWRnZS0nICsgbGluay5iYWRnZS52YXJpYW50XCI+e3sgbGluay5iYWRnZS50ZXh0IH19PC9zcGFuPlxyXG4gICAgICA8L2E+XHJcbiAgICAgIDxhICpuZ1N3aXRjaERlZmF1bHRcclxuICAgICAgICBbbmdDbGFzc109XCJnZXRDbGFzc2VzKClcIlxyXG4gICAgICAgIFthcHBMaW5rQXR0cmlidXRlc109XCJsaW5rLmF0dHJpYnV0ZXNcIlxyXG4gICAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmVcIlxyXG4gICAgICAgIFtyb3V0ZXJMaW5rXT1cIltsaW5rLnVybF1cIlxyXG4gICAgICAgIChjbGljayk9XCJoaWRlTW9iaWxlKClcIj5cclxuICAgICAgICA8aSAqbmdJZj1cImlzSWNvbigpXCIgY2xhc3M9XCJuYXYtaWNvbiB7eyBsaW5rLmljb24gfX1cIj48L2k+XHJcbiAgICAgICAge3sgbGluay5uYW1lIH19XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0JhZGdlKClcIiBbbmdDbGFzc109XCInYmFkZ2UgYmFkZ2UtJyArIGxpbmsuYmFkZ2UudmFyaWFudFwiPnt7IGxpbmsuYmFkZ2UudGV4dCB9fTwvc3Bhbj5cclxuICAgICAgPC9hPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwU2lkZWJhck5hdkxpbmtDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGxpbms6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnksXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZlxyXG4gICkgeyB9XHJcblxyXG4gIHB1YmxpYyBnZXRDbGFzc2VzKCkge1xyXG4gICAgY29uc3QgZGlzYWJsZWQgPSB0aGlzLmlzRGlzYWJsZWQoKTtcclxuICAgIGNvbnN0IGNsYXNzZXMgPSB7XHJcbiAgICAgICduYXYtbGluayc6IHRydWUsXHJcbiAgICAgICdkaXNhYmxlZCc6IGRpc2FibGVkLFxyXG4gICAgICAnYnRuLWxpbmsnOiBkaXNhYmxlZFxyXG4gICAgfTtcclxuICAgIGlmICh0aGlzLmhhc1ZhcmlhbnQoKSkge1xyXG4gICAgICBjb25zdCB2YXJpYW50ID0gYG5hdi1saW5rLSR7dGhpcy5saW5rLnZhcmlhbnR9YDtcclxuICAgICAgY2xhc3Nlc1t2YXJpYW50XSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xhc3NlcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRMaW5rVHlwZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmlzRGlzYWJsZWQoKSA/ICdkaXNhYmxlZCcgOiB0aGlzLmlzRXh0ZXJuYWxMaW5rKCkgPyAnZXh0ZXJuYWwnIDogJyc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFzVmFyaWFudCgpIHtcclxuICAgIHJldHVybiB0aGlzLmxpbmsudmFyaWFudCA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0JhZGdlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGluay5iYWRnZSA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0Rpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGluay5hdHRyaWJ1dGVzICYmIHRoaXMubGluay5hdHRyaWJ1dGVzLmRpc2FibGVkID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRXh0ZXJuYWxMaW5rKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGluay51cmwuc3Vic3RyaW5nKDAsIDQpID09PSAnaHR0cCcgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNJY29uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGluay5pY29uID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhpZGVNb2JpbGUoKSB7XHJcbiAgICBpZiAodGhpcy5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnc2lkZWJhci1zaG93JykpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmRvY3VtZW50LmJvZHksICdzaWRlYmFyLXNob3cnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgUmVwbGFjZSh0aGlzLmVsKTtcclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXNpZGViYXItbmF2LWRyb3Bkb3duJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGEgY2xhc3M9XCJuYXYtbGluayBuYXYtZHJvcGRvd24tdG9nZ2xlXCIgYXBwTmF2RHJvcGRvd25Ub2dnbGU+XHJcbiAgICAgIDxpICpuZ0lmPVwiaXNJY29uKClcIiBjbGFzcz1cIm5hdi1pY29uIHt7IGxpbmsuaWNvbiB9fVwiPjwvaT5cclxuICAgICAge3sgbGluay5uYW1lIH19XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiaXNCYWRnZSgpXCIgW25nQ2xhc3NdPVwiJ2JhZGdlIGJhZGdlLScgKyBsaW5rLmJhZGdlLnZhcmlhbnRcIj57eyBsaW5rLmJhZGdlLnRleHQgfX08L3NwYW4+XHJcbiAgICA8L2E+XHJcbiAgICA8dWwgY2xhc3M9XCJuYXYtZHJvcGRvd24taXRlbXNcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1jaGlsZCBbbmdGb3JPZl09XCJsaW5rLmNoaWxkcmVuXCI+XHJcbiAgICAgICAgPGFwcC1zaWRlYmFyLW5hdi1pdGVtIFtpdGVtXT0nY2hpbGQnPjwvYXBwLXNpZGViYXItbmF2LWl0ZW0+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3VsPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbJy5uYXYtZHJvcGRvd24tdG9nZ2xlIHsgY3Vyc29yOiBwb2ludGVyOyB9J11cclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcFNpZGViYXJOYXZEcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgbGluazogYW55O1xyXG5cclxuICBwdWJsaWMgaXNCYWRnZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmxpbmsuYmFkZ2UgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNJY29uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGluay5pY29uID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBSZXBsYWNlKHRoaXMuZWwpO1xyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtc2lkZWJhci1uYXYtdGl0bGUnLFxyXG4gIHRlbXBsYXRlOiAnJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwU2lkZWJhck5hdlRpdGxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSB0aXRsZTogYW55O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgbGkgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KHRoaXMudGl0bGUubmFtZSk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhsaSwgJ25hdi10aXRsZScpO1xyXG5cclxuICAgIGlmICggdGhpcy50aXRsZS5jbGFzcyApIHtcclxuICAgICAgY29uc3QgY2xhc3NlcyA9IHRoaXMudGl0bGUuY2xhc3M7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobGksIGNsYXNzZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICggdGhpcy50aXRsZS53cmFwcGVyICkge1xyXG4gICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KHRoaXMudGl0bGUud3JhcHBlci5lbGVtZW50KTtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQod3JhcHBlciwgbmFtZSk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQobGksIHdyYXBwZXIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChsaSwgbmFtZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKG5hdGl2ZUVsZW1lbnQsIGxpKTtcclxuICAgIFJlcGxhY2UodGhpcy5lbCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==