ad-custom-lib
Version:
This is an UI custom library based on Adminlte library with purpose for personal use, if you need a full template of Primeng please visit https://github.com/mledour/angular-admin-lte
560 lines • 40.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectorRef, Component, ContentChild, ContentChildren, EventEmitter, Input, NgZone, Output, QueryList, Renderer2, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
import { removeListeners, removeSubscriptions } from '../helpers';
import { AccordionToggleDirective } from './accordion.directive';
/*
*
*/
var AccordionHeaderComponent = /** @class */ (function () {
function AccordionHeaderComponent() {
}
AccordionHeaderComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion-header',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>'
}] }
];
AccordionHeaderComponent.propDecorators = {
templateRef: [{ type: ViewChild, args: ['templateRef', { static: true },] }]
};
return AccordionHeaderComponent;
}());
export { AccordionHeaderComponent };
if (false) {
/** @type {?} */
AccordionHeaderComponent.prototype.templateRef;
}
/*
*
*/
var AccordionContentComponent = /** @class */ (function () {
function AccordionContentComponent() {
}
AccordionContentComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion-content',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>'
}] }
];
AccordionContentComponent.propDecorators = {
templateRef: [{ type: ViewChild, args: ['templateRef', { static: true },] }]
};
return AccordionContentComponent;
}());
export { AccordionContentComponent };
if (false) {
/** @type {?} */
AccordionContentComponent.prototype.templateRef;
}
/*
*
*/
var AccordionComponent = /** @class */ (function () {
function AccordionComponent() {
this.contentStyleClass = 'box-body';
this.headerStyleClass = 'box-header with-border';
}
/**
* @method ngOnInit
*/
/**
* \@method ngOnInit
* @return {?}
*/
AccordionComponent.prototype.ngOnInit = /**
* \@method ngOnInit
* @return {?}
*/
function () {
this.headerStyleColor = this.headerColor;
if (!this.header && !this.accordionHeaderComponent) {
throw new Error('Attribute "header" OR Component "mk-+accordion-header" is required for component "mk-+accordion"');
}
if (this.accordionContentComponent) {
this.contentTemplateRef = this.accordionContentComponent.templateRef;
}
else {
this.contentTemplateRef = this.templateRef;
}
};
AccordionComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>'
}] }
];
AccordionComponent.propDecorators = {
borderColor: [{ type: Input }],
contentColor: [{ type: Input }],
contentStyleClass: [{ type: Input }],
header: [{ type: Input }],
headerColor: [{ type: Input }],
headerColorHover: [{ type: Input }],
headerStyleClass: [{ type: Input }],
accordionHeaderComponent: [{ type: ContentChild, args: [AccordionHeaderComponent, { static: true },] }],
accordionContentComponent: [{ type: ContentChild, args: [AccordionContentComponent, { static: true },] }],
templateRef: [{ type: ViewChild, args: ['templateRef', { static: true },] }]
};
return AccordionComponent;
}());
export { AccordionComponent };
if (false) {
/** @type {?} */
AccordionComponent.prototype.contentTemplateRef;
/** @type {?} */
AccordionComponent.prototype.headerStyleColor;
/** @type {?} */
AccordionComponent.prototype.isCollapsing;
/** @type {?} */
AccordionComponent.prototype.isCollapsed;
/** @type {?} */
AccordionComponent.prototype.index;
/** @type {?} */
AccordionComponent.prototype.borderColor;
/** @type {?} */
AccordionComponent.prototype.contentColor;
/** @type {?} */
AccordionComponent.prototype.contentStyleClass;
/** @type {?} */
AccordionComponent.prototype.header;
/** @type {?} */
AccordionComponent.prototype.headerColor;
/** @type {?} */
AccordionComponent.prototype.headerColorHover;
/** @type {?} */
AccordionComponent.prototype.headerStyleClass;
/** @type {?} */
AccordionComponent.prototype.accordionHeaderComponent;
/** @type {?} */
AccordionComponent.prototype.accordionContentComponent;
/** @type {?} */
AccordionComponent.prototype.templateRef;
}
/*
*
*/
var AccordionGroupComponent = /** @class */ (function () {
/**
* @method constructor
* @param changeDetectorRef [description]
* @param ngZone [description]
* @param renderer2 [description]
*/
function AccordionGroupComponent(changeDetectorRef, ngZone, renderer2) {
this.changeDetectorRef = changeDetectorRef;
this.ngZone = ngZone;
this.renderer2 = renderer2;
this.activeIndex = [0];
// @TODO change types for listeners to all files
this.listeners = [];
// @TODO change types for subscriptions to all files
this.subscriptions = [];
this.styleClass = 'box-group';
this.onCollapseStart = new EventEmitter();
this.onCollapseDone = new EventEmitter();
}
Object.defineProperty(AccordionGroupComponent.prototype, "_activeIndex", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.activeIndex = value instanceof Array ? value : [value];
},
enumerable: true,
configurable: true
});
/**
* [headerMouseLeave description]
* @method headerMouseLeave
* @param accordion [description]
*/
/**
* [headerMouseLeave description]
* \@method headerMouseLeave
* @param {?} accordion [description]
* @return {?}
*/
AccordionGroupComponent.headerMouseLeave = /**
* [headerMouseLeave description]
* \@method headerMouseLeave
* @param {?} accordion [description]
* @return {?}
*/
function (accordion) {
accordion.headerStyleColor = accordion.headerColor;
};
/**
* [headerMouseEnter description]
* @method headerMouseEnter
* @param accordion [description]
*/
/**
* [headerMouseEnter description]
* \@method headerMouseEnter
* @param {?} accordion [description]
* @return {?}
*/
AccordionGroupComponent.headerMouseEnter = /**
* [headerMouseEnter description]
* \@method headerMouseEnter
* @param {?} accordion [description]
* @return {?}
*/
function (accordion) {
if (accordion.headerColorHover) {
accordion.headerStyleColor = accordion.headerColorHover;
}
};
/**
* @method ngAfterViewInit
*/
/**
* \@method ngAfterViewInit
* @return {?}
*/
AccordionGroupComponent.prototype.ngAfterContentInit = /**
* \@method ngAfterViewInit
* @return {?}
*/
function () {
var _this = this;
this.setAccordionsIndex();
this.updateAccordionIsCollapsed();
this.subscriptions.push(this.accordionComponents.changes.subscribe((/**
* @return {?}
*/
function () {
_this.setAccordionsIndex();
})));
};
/**
* @method ngAfterViewInit
*/
/**
* \@method ngAfterViewInit
* @return {?}
*/
AccordionGroupComponent.prototype.ngAfterViewInit = /**
* \@method ngAfterViewInit
* @return {?}
*/
function () {
var _this = this;
this.setAccordionsToggle();
this.subscriptions.push(this.accordionToggleDirectives.changes.subscribe((/**
* @return {?}
*/
function () {
_this.setAccordionsToggle();
})));
};
/**
* [ngOnChanges description]
* @method ngOnChanges
* @param changes [description]
* @return [description]
*/
/**
* [ngOnChanges description]
* \@method ngOnChanges
* @param {?} changes [description]
* @return {?} [description]
*/
AccordionGroupComponent.prototype.ngOnChanges = /**
* [ngOnChanges description]
* \@method ngOnChanges
* @param {?} changes [description]
* @return {?} [description]
*/
function (changes) {
if (changes._activeIndex.firstChange === false) {
this.updateAccordionIsCollapsed();
}
};
/**
* @method ngOnDestroy
*/
/**
* \@method ngOnDestroy
* @return {?}
*/
AccordionGroupComponent.prototype.ngOnDestroy = /**
* \@method ngOnDestroy
* @return {?}
*/
function () {
removeListeners(this.listeners);
removeSubscriptions(this.subscriptions);
};
/**
* [toggleAccordion description]
* @method toggleAccordion
* @param event [description]
* @param toggleIndex [description]
*/
/**
* [toggleAccordion description]
* \@method toggleAccordion
* @param {?} event [description]
* @param {?} toggleIndex [description]
* @return {?}
*/
AccordionGroupComponent.prototype.toggleAccordion = /**
* [toggleAccordion description]
* \@method toggleAccordion
* @param {?} event [description]
* @param {?} toggleIndex [description]
* @return {?}
*/
function (event, toggleIndex) {
event.preventDefault();
/** @type {?} */
var indexOf = this.activeIndex['indexOf'](toggleIndex);
if (indexOf === -1) {
if (this.isMultiple) {
this.activeIndex.push(toggleIndex);
}
else {
this.activeIndex = [toggleIndex];
}
}
else {
if (this.isMultiple) {
this.activeIndex.splice(indexOf, 1);
}
else {
this.activeIndex = [];
}
}
this.updateAccordionIsCollapsed();
};
/**
* [collapseStart description]
* @method collapseStart
* @param event [description]
* @param accordion [description]
*/
/**
* [collapseStart description]
* \@method collapseStart
* @param {?} event [description]
* @param {?} accordion [description]
* @return {?}
*/
AccordionGroupComponent.prototype.collapseStart = /**
* [collapseStart description]
* \@method collapseStart
* @param {?} event [description]
* @param {?} accordion [description]
* @return {?}
*/
function (event, accordion) {
accordion.isCollapsing = true;
this.onCollapseStart.emit({ animationEvent: event, index: accordion.index });
};
/**
* [collapseDone description]
* @method collapseDone
* @param event [description]
* @param accordion [description]
*/
/**
* [collapseDone description]
* \@method collapseDone
* @param {?} event [description]
* @param {?} accordion [description]
* @return {?}
*/
AccordionGroupComponent.prototype.collapseDone = /**
* [collapseDone description]
* \@method collapseDone
* @param {?} event [description]
* @param {?} accordion [description]
* @return {?}
*/
function (event, accordion) {
accordion.isCollapsing = false;
this.onCollapseDone.emit({ animationEvent: event, index: accordion.index });
};
/**
* [setAccordionsIndex description]
* @method setAccordionsIndex
*/
/**
* [setAccordionsIndex description]
* \@method setAccordionsIndex
* @private
* @return {?}
*/
AccordionGroupComponent.prototype.setAccordionsIndex = /**
* [setAccordionsIndex description]
* \@method setAccordionsIndex
* @private
* @return {?}
*/
function () {
this.accordionComponents.forEach((/**
* @param {?} accordion
* @param {?} index
* @return {?}
*/
function (accordion, index) {
accordion.index = index;
}));
};
/**
* [setAccordionsToggle description]
* @method setAccordionsToggle
*/
/**
* [setAccordionsToggle description]
* \@method setAccordionsToggle
* @private
* @return {?}
*/
AccordionGroupComponent.prototype.setAccordionsToggle = /**
* [setAccordionsToggle description]
* \@method setAccordionsToggle
* @private
* @return {?}
*/
function () {
var _this = this;
this.listeners = removeListeners(this.listeners);
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.accordionToggleDirectives.forEach((/**
* @param {?} accordionToggle
* @return {?}
*/
function (accordionToggle) {
_this.listeners.push(_this.renderer2.listen(accordionToggle.elementRef.nativeElement, 'click', (/**
* @param {?} event
* @return {?}
*/
function (event) {
_this.toggleAccordion(event, accordionToggle.accordionComponent.index);
_this.changeDetectorRef.detectChanges();
})));
_this.listeners.push(_this.renderer2.listen(accordionToggle.elementRef.nativeElement, 'mouseenter', (/**
* @return {?}
*/
function () {
AccordionGroupComponent.headerMouseEnter(accordionToggle.accordionComponent);
_this.changeDetectorRef.detectChanges();
})));
_this.listeners.push(_this.renderer2.listen(accordionToggle.elementRef.nativeElement, 'mouseleave', (/**
* @return {?}
*/
function () {
AccordionGroupComponent.headerMouseLeave(accordionToggle.accordionComponent);
_this.changeDetectorRef.detectChanges();
})));
}));
}));
};
/**
* [updateAccordionIsCollapsed description]
* @method updateAccordionIsCollapsed
*/
/**
* [updateAccordionIsCollapsed description]
* \@method updateAccordionIsCollapsed
* @private
* @return {?}
*/
AccordionGroupComponent.prototype.updateAccordionIsCollapsed = /**
* [updateAccordionIsCollapsed description]
* \@method updateAccordionIsCollapsed
* @private
* @return {?}
*/
function () {
var _this = this;
this.accordionComponents.forEach((/**
* @param {?} accordion
* @param {?} index
* @return {?}
*/
function (accordion, index) {
accordion.isCollapsed = _this.activeIndex.indexOf(index) === -1;
}));
};
AccordionGroupComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-accordion-group',
template: "<div [ngClass]=\"styleClass\">\r\n <div *ngFor=\"let accordion of accordionComponents\" class=\"panel box\" [mkColor]=\"accordion.borderColor\"\r\n mkColorProperty=\"border-top-color\" mkColorPrefix=\"box\">\r\n <div [ngClass]=\"accordion.headerStyleClass\"\r\n [class.no-border]=\"accordion.isCollapsed && !accordion.isCollapsing\">\r\n <h4 class=\"box-title\">\r\n <a [mkAccordionToggle]=\"accordion\" href=\"#\" [mkFontColor]=\"accordion.headerStyleColor\"\r\n [class.collapsed]=\"accordion.isCollapsed\">\r\n {{accordion.header}}\r\n <ng-template *ngIf=\"!accordion.header\"\r\n [ngTemplateOutlet]=\"accordion.accordionHeaderComponent?.templateRef\"></ng-template>\r\n </a>\r\n </h4>\r\n </div>\r\n <div class=\"panel-collapse\" [mkCollapseAnimation]=\"accordion.isCollapsed\"\r\n (mkCollapseAnimation.start)=\"collapseStart($event, accordion)\"\r\n (mkCollapseAnimation.done)=\"collapseDone($event, accordion)\">\r\n <div [ngClass]=\"accordion.contentStyleClass\" [mkFontColor]=\"accordion.contentColor\">\r\n <ng-template [ngTemplateOutlet]=\"accordion.contentTemplateRef\"></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>"
}] }
];
/** @nocollapse */
AccordionGroupComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef },
{ type: NgZone },
{ type: Renderer2 }
]; };
AccordionGroupComponent.propDecorators = {
_activeIndex: [{ type: Input, args: ['activeIndex',] }],
isMultiple: [{ type: Input }],
styleClass: [{ type: Input }],
onCollapseStart: [{ type: Output }],
onCollapseDone: [{ type: Output }],
accordionComponents: [{ type: ContentChildren, args: [AccordionComponent,] }],
accordionToggleDirectives: [{ type: ViewChildren, args: [AccordionToggleDirective,] }]
};
return AccordionGroupComponent;
}());
export { AccordionGroupComponent };
if (false) {
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.activeIndex;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.listeners;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.subscriptions;
/** @type {?} */
AccordionGroupComponent.prototype.isMultiple;
/** @type {?} */
AccordionGroupComponent.prototype.styleClass;
/** @type {?} */
AccordionGroupComponent.prototype.onCollapseStart;
/** @type {?} */
AccordionGroupComponent.prototype.onCollapseDone;
/** @type {?} */
AccordionGroupComponent.prototype.accordionComponents;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.accordionToggleDirectives;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.changeDetectorRef;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.ngZone;
/**
* @type {?}
* @private
*/
AccordionGroupComponent.prototype.renderer2;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FkLWN1c3RvbS1saWIvIiwic291cmNlcyI6WyJsaWIvYWNjb3JkaW9uL2FjY29yZGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUVBLE9BQU8sRUFDOEIsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQzVGLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFnQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFDeEUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQ3RELE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7QUFLakU7SUFBQTtJQU1BLENBQUM7O2dCQU5BLFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUscUJBQXFCO29CQUMvQixRQUFRLEVBQUUsbUVBQW1FO2lCQUNoRjs7OzhCQUVJLFNBQVMsU0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOztJQUM5QywrQkFBQztDQUFBLEFBTkQsSUFNQztTQUZZLHdCQUF3Qjs7O0lBQ2pDLCtDQUFpRjs7Ozs7QUFPckY7SUFBQTtJQU1BLENBQUM7O2dCQU5BLFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxRQUFRLEVBQUUsbUVBQW1FO2lCQUNoRjs7OzhCQUVJLFNBQVMsU0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOztJQUM5QyxnQ0FBQztDQUFBLEFBTkQsSUFNQztTQUZZLHlCQUF5Qjs7O0lBQ2xDLGdEQUFpRjs7Ozs7QUFPckY7SUFBQTtRQWFvQixzQkFBaUIsR0FBRyxVQUFVLENBQUM7UUFJL0IscUJBQWdCLEdBQUcsd0JBQXdCLENB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Q0FBQztvQkFDN0UsS0FBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMzQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxFQUFDLENBQUM7UUFDUCxDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7O09BR0c7Ozs7Ozs7SUFDSyw0REFBMEI7Ozs7OztJQUFsQztRQUFBLGlCQUlDO1FBSEcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU87Ozs7O1FBQUMsVUFBQyxTQUE2QixFQUFFLEtBQWE7WUFDMUUsU0FBUyxDQUFDLFdBQVcsR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7O2dCQS9MSixTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsZzNDQUF5QztpQkFDNUM7Ozs7Z0JBckZvQyxpQkFBaUI7Z0JBQzdCLE1BQU07Z0JBQW1ELFNBQVM7OzsrQkE2RnRGLEtBQUssU0FBQyxhQUFhOzZCQUduQixLQUFLOzZCQUNMLEtBQUs7a0NBRUwsTUFBTTtpQ0FDTixNQUFNO3NDQUVOLGVBQWUsU0FBQyxrQkFBa0I7NENBRWxDLFlBQVksU0FBQyx3QkFBd0I7O0lBeUsxQyw4QkFBQztDQUFBLEFBaE1ELElBZ01DO1NBNUxZLHVCQUF1Qjs7Ozs7O0lBQ2hDLDhDQUErQjs7Ozs7SUFFL0IsNENBQXdDOzs7OztJQUV4QyxnREFBZ0Q7O0lBTWhELDZDQUFvQzs7SUFDcEMsNkNBQXlDOztJQUV6QyxrREFBc0Q7O0lBQ3RELGlEQUFxRDs7SUFFckQsc0RBQStGOzs7OztJQUUvRiw0REFBK0c7Ozs7O0lBUzNHLG9EQUE0Qzs7Ozs7SUFDNUMseUNBQXNCOzs7OztJQUN0Qiw0Q0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIENvbnRlbnRDaGlsZHJlbixcclxuICAgIEV2ZW50RW1pdHRlciwgSW5wdXQsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFJlbmRlcmVyMixcclxuICAgIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgQW5pbWF0aW9uRXZlbnQgfSBmcm9tICcuLi9hbmltYXRpb25zL2FuaW1hdGlvbnMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgcmVtb3ZlTGlzdGVuZXJzLCByZW1vdmVTdWJzY3JpcHRpb25zIH0gZnJvbSAnLi4vaGVscGVycyc7XHJcbmltcG9ydCB7IEFjY29yZGlvblRvZ2dsZURpcmVjdGl2ZSB9IGZyb20gJy4vYWNjb3JkaW9uLmRpcmVjdGl2ZSc7XHJcblxyXG4vKlxyXG4gKlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ21rLWFjY29yZGlvbi1oZWFkZXInLFxyXG4gICAgdGVtcGxhdGU6ICc8bmctdGVtcGxhdGUgI3RlbXBsYXRlUmVmPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPidcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjY29yZGlvbkhlYWRlckNvbXBvbmVudCB7XHJcbiAgICBAVmlld0NoaWxkKCd0ZW1wbGF0ZVJlZicsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcclxufVxyXG5cclxuXHJcbi8qXHJcbiAqXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbWstYWNjb3JkaW9uLWNvbnRlbnQnLFxyXG4gICAgdGVtcGxhdGU6ICc8bmctdGVtcGxhdGUgI3RlbXBsYXRlUmVmPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPidcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjY29yZGlvbkNvbnRlbnRDb21wb25lbnQge1xyXG4gICAgQFZpZXdDaGlsZCgndGVtcGxhdGVSZWYnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XHJcbn1cclxuXHJcblxyXG4vKlxyXG4gKlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ21rLWFjY29yZGlvbicsXHJcbiAgICB0ZW1wbGF0ZTogJzxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVSZWY+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvbmctdGVtcGxhdGU+J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQWNjb3JkaW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgIHB1YmxpYyBjb250ZW50VGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPEFjY29yZGlvbkNvbnRlbnRDb21wb25lbnQ+O1xyXG4gICAgcHVibGljIGhlYWRlclN0eWxlQ29sb3I6IHN0cmluZztcclxuICAgIHB1YmxpYyBpc0NvbGxhcHNpbmc6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgaXNDb2xsYXBzZWQ6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgaW5kZXg6IG51bWJlcjtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgYm9yZGVyQ29sb3I6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjb250ZW50Q29sb3I6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjb250ZW50U3R5bGVDbGFzcyA9ICdib3gtYm9keSc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVhZGVyOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVhZGVyQ29sb3I6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWFkZXJDb2xvckhvdmVyOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVhZGVyU3R5bGVDbGFzcyA9ICdib3gtaGVhZGVyIHdpdGgtYm9yZGVyJztcclxuXHJcbiAgICBAQ29udGVudENoaWxkKEFjY29yZGlvbkhlYWRlckNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIGFjY29yZGlvbkhlYWRlckNvbXBvbmVudDogQWNjb3JkaW9uSGVhZGVyQ29tcG9uZW50O1xyXG4gICAgQENvbnRlbnRDaGlsZChBY2NvcmRpb25Db250ZW50Q29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgYWNjb3JkaW9uQ29udGVudENvbXBvbmVudDogQWNjb3JkaW9uQ29udGVudENvbXBvbmVudDtcclxuXHJcbiAgICBAVmlld0NoaWxkKCd0ZW1wbGF0ZVJlZicsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBtZXRob2QgbmdPbkluaXRcclxuICAgICAqL1xyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJTdHlsZUNvbG9yID0gdGhpcy5oZWFkZXJDb2xvcjtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWRlciAmJiAhdGhpcy5hY2NvcmRpb25IZWFkZXJDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRyaWJ1dGUgXCJoZWFkZXJcIiBPUiBDb21wb25lbnQgXCJtay0rYWNjb3JkaW9uLWhlYWRlclwiIGlzIHJlcXVpcmVkIGZvciBjb21wb25lbnQgXCJtay0rYWNjb3JkaW9uXCInKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFjY29yZGlvbkNvbnRlbnRDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZW50VGVtcGxhdGVSZWYgPSB0aGlzLmFjY29yZGlvbkNvbnRlbnRDb21wb25lbnQudGVtcGxhdGVSZWY7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZW50VGVtcGxhdGVSZWYgPSB0aGlzLnRlbXBsYXRlUmVmO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qXHJcbiAqXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbWstYWNjb3JkaW9uLWdyb3VwJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9hY2NvcmRpb24uY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY2NvcmRpb25Hcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICAgIHByaXZhdGUgYWN0aXZlSW5kZXg6IGFueSA9IFswXTtcclxuICAgIC8vIEBUT0RPIGNoYW5nZSB0eXBlcyBmb3IgbGlzdGVuZXJzIHRvIGFsbCBmaWxlc1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcnM6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xyXG4gICAgLy8gQFRPRE8gY2hhbmdlIHR5cGVzIGZvciBzdWJzY3JpcHRpb25zIHRvIGFsbCBmaWxlc1xyXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XHJcblxyXG5cclxuICAgIEBJbnB1dCgnYWN0aXZlSW5kZXgnKSBzZXQgX2FjdGl2ZUluZGV4KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IHZhbHVlIGluc3RhbmNlb2YgQXJyYXkgPyB2YWx1ZSA6IFt2YWx1ZV07XHJcbiAgICB9XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNNdWx0aXBsZTogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzdHlsZUNsYXNzID0gJ2JveC1ncm91cCc7XHJcblxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkNvbGxhcHNlU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uQ29sbGFwc2VEb25lID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oQWNjb3JkaW9uQ29tcG9uZW50KSBwdWJsaWMgYWNjb3JkaW9uQ29tcG9uZW50czogUXVlcnlMaXN0PEFjY29yZGlvbkNvbXBvbmVudD47XHJcblxyXG4gICAgQFZpZXdDaGlsZHJlbihBY2NvcmRpb25Ub2dnbGVEaXJlY3RpdmUpIHByaXZhdGUgYWNjb3JkaW9uVG9nZ2xlRGlyZWN0aXZlczogUXVlcnlMaXN0PEFjY29yZGlvblRvZ2dsZURpcmVjdGl2ZT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbWV0aG9kIGNvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0gY2hhbmdlRGV0ZWN0b3JSZWYgW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIG5nWm9uZSAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSByZW5kZXJlcjIgICAgICAgICBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXHJcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjI6IFJlbmRlcmVyMlxyXG4gICAgKSB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtoZWFkZXJNb3VzZUxlYXZlIGRlc2NyaXB0aW9uXVxyXG4gICAgICogQG1ldGhvZCBoZWFkZXJNb3VzZUxlYXZlXHJcbiAgICAgKiBAcGFyYW0gYWNjb3JkaW9uIFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBoZWFkZXJNb3VzZUxlYXZlKGFjY29yZGlvbjogQWNjb3JkaW9uQ29tcG9uZW50KTogdm9pZCB7XHJcbiAgICAgICAgYWNjb3JkaW9uLmhlYWRlclN0eWxlQ29sb3IgPSBhY2NvcmRpb24uaGVhZGVyQ29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbaGVhZGVyTW91c2VFbnRlciBkZXNjcmlwdGlvbl1cclxuICAgICAqIEBtZXRob2QgaGVhZGVyTW91c2VFbnRlclxyXG4gICAgICogQHBhcmFtIGFjY29yZGlvbiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaGVhZGVyTW91c2VFbnRlcihhY2NvcmRpb246IEFjY29yZGlvbkNvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChhY2NvcmRpb24uaGVhZGVyQ29sb3JIb3Zlcikge1xyXG4gICAgICAgICAgICBhY2NvcmRpb24uaGVhZGVyU3R5bGVDb2xvciA9IGFjY29yZGlvbi5oZWFkZXJDb2xvckhvdmVyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBtZXRob2QgbmdBZnRlclZpZXdJbml0XHJcbiAgICAgKi9cclxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgICAgICB0aGlzLnNldEFjY29yZGlvbnNJbmRleCgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQWNjb3JkaW9uSXNDb2xsYXBzZWQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5hY2NvcmRpb25Db21wb25lbnRzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY2NvcmRpb25zSW5kZXgoKTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbWV0aG9kIG5nQWZ0ZXJWaWV3SW5pdFxyXG4gICAgICovXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRBY2NvcmRpb25zVG9nZ2xlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMuYWNjb3JkaW9uVG9nZ2xlRGlyZWN0aXZlcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWNjb3JkaW9uc1RvZ2dsZSgpO1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtuZ09uQ2hhbmdlcyBkZXNjcmlwdGlvbl1cclxuICAgICAqIEBtZXRob2QgbmdPbkNoYW5nZXNcclxuICAgICAqIEBwYXJhbSBjaGFuZ2VzIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEByZXR1cm4gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMuX2FjdGl2ZUluZGV4LmZpcnN0Q2hhbmdlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjY29yZGlvbklzQ29sbGFwc2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQG1ldGhvZCBuZ09uRGVzdHJveVxyXG4gICAgICovXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICByZW1vdmVMaXN0ZW5lcnModGhpcy5saXN0ZW5lcnMpO1xyXG4gICAgICAgIHJlbW92ZVN1YnNjcmlwdGlvbnModGhpcy5zdWJzY3JpcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFt0b2dnbGVBY2NvcmRpb24gZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAbWV0aG9kIHRvZ2dsZUFjY29yZGlvblxyXG4gICAgICogQHBhcmFtIGV2ZW50ICAgICAgIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB0b2dnbGVJbmRleCBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b2dnbGVBY2NvcmRpb24oZXZlbnQ6IEV2ZW50LCB0b2dnbGVJbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5kZXhPZiA9IHRoaXMuYWN0aXZlSW5kZXhbJ2luZGV4T2YnXSh0b2dnbGVJbmRleCk7XHJcbiAgICAgICAgaWYgKGluZGV4T2YgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXgucHVzaCh0b2dnbGVJbmRleCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gW3RvZ2dsZUluZGV4XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXguc3BsaWNlKGluZGV4T2YsIDEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlQWNjb3JkaW9uSXNDb2xsYXBzZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtjb2xsYXBzZVN0YXJ0IGRlc2NyaXB0aW9uXVxyXG4gICAgICogQG1ldGhvZCBjb2xsYXBzZVN0YXJ0XHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIGFjY29yZGlvbiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb2xsYXBzZVN0YXJ0KGV2ZW50OiBBbmltYXRpb25FdmVudCwgYWNjb3JkaW9uOiBBY2NvcmRpb25Db21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgICBhY2NvcmRpb24uaXNDb2xsYXBzaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm9uQ29sbGFwc2VTdGFydC5lbWl0KHsgYW5pbWF0aW9uRXZlbnQ6IGV2ZW50LCBpbmRleDogYWNjb3JkaW9uLmluZGV4IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2NvbGxhcHNlRG9uZSBkZXNjcmlwdGlvbl1cclxuICAgICAqIEBtZXRob2QgY29sbGFwc2VEb25lXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIGFjY29yZGlvbiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb2xsYXBzZURvbmUoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50LCBhY2NvcmRpb246IEFjY29yZGlvbkNvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICAgIGFjY29yZGlvbi5pc0NvbGxhcHNpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9uQ29sbGFwc2VEb25lLmVtaXQoeyBhbmltYXRpb25FdmVudDogZXZlbnQsIGluZGV4OiBhY2NvcmRpb24uaW5kZXggfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbc2V0QWNjb3JkaW9uc0luZGV4IGRlc2NyaXB0aW9uXVxyXG4gICAgICogQG1ldGhvZCBzZXRBY2NvcmRpb25zSW5kZXhcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRBY2NvcmRpb25zSW5kZXgoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hY2NvcmRpb25Db21wb25lbnRzLmZvckVhY2goKGFjY29yZGlvbjogQWNjb3JkaW9uQ29tcG9uZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIGFjY29yZGlvbi5pbmRleCA9IGluZGV4O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW3NldEFjY29yZGlvbnNUb2dnbGUgZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAbWV0aG9kIHNldEFjY29yZGlvbnNUb2dnbGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRBY2NvcmRpb25zVG9nZ2xlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gcmVtb3ZlTGlzdGVuZXJzKHRoaXMubGlzdGVuZXJzKTtcclxuXHJcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFjY29yZGlvblRvZ2dsZURpcmVjdGl2ZXMuZm9yRWFjaCgoYWNjb3JkaW9uVG9nZ2xlOiBBY2NvcmRpb25Ub2dnbGVEaXJlY3RpdmUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2godGhpcy5yZW5kZXJlcjIubGlzdGVuKGFjY29yZGlvblRvZ2dsZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQWNjb3JkaW9uKGV2ZW50LCBhY2NvcmRpb25Ub2dnbGUuYWNjb3JkaW9uQ29tcG9uZW50LmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2godGhpcy5yZW5kZXJlcjIubGlzdGVuKGFjY29yZGlvblRvZ2dsZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWVudGVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIEFjY29yZGlvbkdyb3VwQ29tcG9uZW50LmhlYWRlck1vdXNlRW50ZXIoYWNjb3JkaW9uVG9nZ2xlLmFjY29yZGlvbkNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHRoaXMucmVuZGVyZXIyLmxpc3RlbihhY2NvcmRpb25Ub2dnbGUuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBBY2NvcmRpb25Hcm91cENvbXBvbmVudC5oZWFkZXJNb3VzZUxlYXZlKGFjY29yZGlvblRvZ2dsZS5hY2NvcmRpb25Db21wb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFt1cGRhdGVBY2NvcmRpb25Jc0NvbGxhcHNlZCBkZXNjcmlwdGlvbl1cclxuICAgICAqIEBtZXRob2QgdXBkYXRlQWNjb3JkaW9uSXNDb2xsYXBzZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVBY2NvcmRpb25Jc0NvbGxhcHNlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjY29yZGlvbkNvbXBvbmVudHMuZm9yRWFjaCgoYWNjb3JkaW9uOiBBY2NvcmRpb25Db21wb25lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgYWNjb3JkaW9uLmlzQ29sbGFwc2VkID0gdGhpcy5hY3RpdmVJbmRleC5pbmRleE9mKGluZGV4KSA9PT0gLTE7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIl19