ngx-slick-carousel
Version:
[](https://badge.fury.io/js/ngx-slick-carousel) [](https://travis-ci.com/leo6104/ngx-slick-carousel)
520 lines • 34.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: slick.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { isPlatformBrowser, isPlatformServer } from '@angular/common';
import { Component, Directive, ElementRef, EventEmitter, forwardRef, Host, Inject, Input, NgZone, Output, PLATFORM_ID } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/**
* Slick component
*/
var SlickCarouselComponent = /** @class */ (function () {
/**
* Constructor
*/
function SlickCarouselComponent(el, zone, platformId) {
this.el = el;
this.zone = zone;
this.platformId = platformId;
this.afterChange = new EventEmitter();
this.beforeChange = new EventEmitter();
this.breakpoint = new EventEmitter();
this.destroy = new EventEmitter();
this.init = new EventEmitter();
// access from parent component can be a problem with change detection timing. Please use afterChange output
this.currentIndex = 0;
this.slides = [];
this.initialized = false;
this._removedSlides = [];
this._addedSlides = [];
}
/**
* On component destroy
*/
/**
* On component destroy
* @return {?}
*/
SlickCarouselComponent.prototype.ngOnDestroy = /**
* On component destroy
* @return {?}
*/
function () {
this.unslick();
};
/**
* @return {?}
*/
SlickCarouselComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.ngAfterViewChecked();
};
/**
* On component view checked
*/
/**
* On component view checked
* @return {?}
*/
SlickCarouselComponent.prototype.ngAfterViewChecked = /**
* On component view checked
* @return {?}
*/
function () {
var _this = this;
if (isPlatformServer(this.platformId)) {
return;
}
if (this._addedSlides.length > 0 || this._removedSlides.length > 0) {
/** @type {?} */
var nextSlidesLength = this.slides.length - this._removedSlides.length + this._addedSlides.length;
if (!this.initialized) {
if (nextSlidesLength > 0) {
this.initSlick();
}
// if nextSlidesLength is zere, do nothing
}
else if (nextSlidesLength === 0) { // unslick case
this.unslick();
}
else {
this._addedSlides.forEach((/**
* @param {?} slickItem
* @return {?}
*/
function (slickItem) {
_this.slides.push(slickItem);
_this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.$instance.slick('slickAdd', slickItem.el.nativeElement);
}));
}));
this._addedSlides = [];
this._removedSlides.forEach((/**
* @param {?} slickItem
* @return {?}
*/
function (slickItem) {
/** @type {?} */
var idx = _this.slides.indexOf(slickItem);
_this.slides = _this.slides.filter((/**
* @param {?} s
* @return {?}
*/
function (s) { return s !== slickItem; }));
_this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.$instance.slick('slickRemove', idx);
}));
}));
this._removedSlides = [];
}
}
};
/**
* init slick
*/
/**
* init slick
* @return {?}
*/
SlickCarouselComponent.prototype.initSlick = /**
* init slick
* @return {?}
*/
function () {
var _this = this;
this.slides = this._addedSlides;
this._addedSlides = [];
this._removedSlides = [];
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.$instance = jQuery(_this.el.nativeElement);
_this.$instance.on('init', (/**
* @param {?} event
* @param {?} slick
* @return {?}
*/
function (event, slick) {
_this.zone.run((/**
* @return {?}
*/
function () {
_this.init.emit({ event: event, slick: slick });
}));
}));
_this.$instance.slick(_this.config);
_this.zone.run((/**
* @return {?}
*/
function () {
var _a;
_this.initialized = true;
_this.currentIndex = ((_a = _this.config) === null || _a === void 0 ? void 0 : _a.initialSlide) || 0;
}));
_this.$instance.on('afterChange', (/**
* @param {?} event
* @param {?} slick
* @param {?} currentSlide
* @return {?}
*/
function (event, slick, currentSlide) {
_this.zone.run((/**
* @return {?}
*/
function () {
_this.afterChange.emit({
event: event,
slick: slick,
currentSlide: currentSlide,
first: currentSlide === 0,
last: slick.$slides.length === currentSlide + slick.options.slidesToScroll
});
_this.currentIndex = currentSlide;
}));
}));
_this.$instance.on('beforeChange', (/**
* @param {?} event
* @param {?} slick
* @param {?} currentSlide
* @param {?} nextSlide
* @return {?}
*/
function (event, slick, currentSlide, nextSlide) {
_this.zone.run((/**
* @return {?}
*/
function () {
_this.beforeChange.emit({ event: event, slick: slick, currentSlide: currentSlide, nextSlide: nextSlide });
_this.currentIndex = nextSlide;
}));
}));
_this.$instance.on('breakpoint', (/**
* @param {?} event
* @param {?} slick
* @param {?} breakpoint
* @return {?}
*/
function (event, slick, breakpoint) {
_this.zone.run((/**
* @return {?}
*/
function () {
_this.breakpoint.emit({ event: event, slick: slick, breakpoint: breakpoint });
}));
}));
_this.$instance.on('destroy', (/**
* @param {?} event
* @param {?} slick
* @return {?}
*/
function (event, slick) {
_this.zone.run((/**
* @return {?}
*/
function () {
_this.destroy.emit({ event: event, slick: slick });
_this.initialized = false;
}));
}));
}));
};
/**
* @param {?} slickItem
* @return {?}
*/
SlickCarouselComponent.prototype.addSlide = /**
* @param {?} slickItem
* @return {?}
*/
function (slickItem) {
this._addedSlides.push(slickItem);
};
/**
* @param {?} slickItem
* @return {?}
*/
SlickCarouselComponent.prototype.removeSlide = /**
* @param {?} slickItem
* @return {?}
*/
function (slickItem) {
this._removedSlides.push(slickItem);
};
/**
* Slick Method
*/
/**
* Slick Method
* @param {?} index
* @return {?}
*/
SlickCarouselComponent.prototype.slickGoTo = /**
* Slick Method
* @param {?} index
* @return {?}
*/
function (index) {
var _this = this;
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.$instance.slick('slickGoTo', index);
}));
};
/**
* @return {?}
*/
SlickCarouselComponent.prototype.slickNext = /**
* @return {?}
*/
function () {
var _this = this;
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.$instance.slick('slickNext');
}));
};
/**
* @return {?}
*/
SlickCarouselComponent.prototype.slickPrev = /**
* @return {?}
*/
function () {
var _this = this;
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.$instance.slick('slickPrev');
}));
};
/**
* @return {?}
*/
SlickCarouselComponent.prototype.slickPause = /**
* @return {?}
*/
function () {
var _this = this;
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.$instance.slick('slickPause');
}));
};
/**
* @return {?}
*/
SlickCarouselComponent.prototype.slickPlay = /**
* @return {?}
*/
function () {
var _this = this;
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.$instance.slick('slickPlay');
}));
};
/**
* @return {?}
*/
SlickCarouselComponent.prototype.unslick = /**
* @return {?}
*/
function () {
var _this = this;
if (this.$instance) {
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.$instance.slick('unslick');
}));
this.$instance = undefined;
}
this.initialized = false;
};
/**
* @param {?} changes
* @return {?}
*/
SlickCarouselComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var _this = this;
if (this.initialized) {
/** @type {?} */
var config = changes['config'];
if (config.previousValue !== config.currentValue && config.currentValue !== undefined) {
/** @type {?} */
var refresh_1 = config.currentValue['refresh'];
/** @type {?} */
var newOptions_1 = Object.assign({}, config.currentValue);
delete newOptions_1['refresh'];
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.$instance.slick('slickSetOption', newOptions_1, refresh_1);
}));
}
}
};
SlickCarouselComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-slick-carousel',
exportAs: 'slick-carousel',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return SlickCarouselComponent; })),
multi: true
}],
template: '<ng-content></ng-content>'
}] }
];
/** @nocollapse */
SlickCarouselComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: NgZone },
{ type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
]; };
SlickCarouselComponent.propDecorators = {
config: [{ type: Input }],
afterChange: [{ type: Output }],
beforeChange: [{ type: Output }],
breakpoint: [{ type: Output }],
destroy: [{ type: Output }],
init: [{ type: Output }]
};
return SlickCarouselComponent;
}());
export { SlickCarouselComponent };
if (false) {
/** @type {?} */
SlickCarouselComponent.prototype.config;
/** @type {?} */
SlickCarouselComponent.prototype.afterChange;
/** @type {?} */
SlickCarouselComponent.prototype.beforeChange;
/** @type {?} */
SlickCarouselComponent.prototype.breakpoint;
/** @type {?} */
SlickCarouselComponent.prototype.destroy;
/** @type {?} */
SlickCarouselComponent.prototype.init;
/** @type {?} */
SlickCarouselComponent.prototype.$instance;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype.currentIndex;
/** @type {?} */
SlickCarouselComponent.prototype.slides;
/** @type {?} */
SlickCarouselComponent.prototype.initialized;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype._removedSlides;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype._addedSlides;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype.el;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype.zone;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype.platformId;
}
var SlickItemDirective = /** @class */ (function () {
function SlickItemDirective(el, platformId, carousel) {
this.el = el;
this.platformId = platformId;
this.carousel = carousel;
}
/**
* @return {?}
*/
SlickItemDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (isPlatformBrowser(this.platformId)) {
this.carousel.addSlide(this);
}
};
/**
* @return {?}
*/
SlickItemDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (isPlatformBrowser(this.platformId)) {
this.carousel.removeSlide(this);
}
};
SlickItemDirective.decorators = [
{ type: Directive, args: [{
selector: '[ngxSlickItem]',
},] }
];
/** @nocollapse */
SlickItemDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: SlickCarouselComponent, decorators: [{ type: Host }] }
]; };
return SlickItemDirective;
}());
export { SlickItemDirective };
if (false) {
/** @type {?} */
SlickItemDirective.prototype.el;
/**
* @type {?}
* @private
*/
SlickItemDirective.prototype.platformId;
/**
* @type {?}
* @private
*/
SlickItemDirective.prototype.carousel;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNsaWNrLWNhcm91c2VsLyIsInNvdXJjZXMiOlsic2xpY2suY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEUsT0FBTyxFQUdMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsSUFBSSxFQUNKLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEVBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFPbkQ7SUE2QkU7O09BRUc7SUFDSCxnQ0FBb0IsRUFBYyxFQUNkLElBQVksRUFDUyxVQUFrQjtRQUZ2QyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNTLGVBQVUsR0FBVixVQUFVLENBQVE7UUFyQi9DLGdCQUFXLEdBQWtHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDaEksaUJBQVksR0FBc0YsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNySCxlQUFVLEdBQThELElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0YsWUFBTyxHQUE2QyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3ZFLFNBQUksR0FBNkMsSUFBSSxZQUFZLEVBQUUsQ0FBQzs7UUFLeEUsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFFbEIsV0FBTSxHQUFVLEVBQUUsQ0FBQztRQUNuQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNuQixtQkFBYyxHQUF5QixFQUFFLENBQUM7UUFDMUMsaUJBQVksR0FBeUIsRUFBRSxDQUFDO0lBUWhELENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSCw0Q0FBVzs7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7Ozs7SUFFRCxnREFBZTs7O0lBQWY7UUFDRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0gsbURBQWtCOzs7O0lBQWxCO1FBQUEsaUJBZ0NDO1FBL0JDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3JDLE9BQU87U0FDUjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7Z0JBQzVELGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTtZQUNuRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDckIsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUU7b0JBQ3hCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFDbEI7Z0JBQ0QsMENBQTBDO2FBQzNDO2lCQUFNLElBQUksZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLEVBQUUsZUFBZTtnQkFDbEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2hCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTzs7OztnQkFBQyxVQUFBLFNBQVM7b0JBQ2pDLEtBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM1QixLQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O29CQUFDO3dCQUMxQixLQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDL0QsQ0FBQyxFQUFDLENBQUM7Z0JBQ0wsQ0FBQyxFQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7Z0JBRXZCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTzs7OztnQkFBQyxVQUFBLFNBQVM7O3dCQUM3QixHQUFHLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO29CQUMxQyxLQUFJLENBQUMsTUFBTSxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTs7OztvQkFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsS0FBSyxTQUFTLEVBQWYsQ0FBZSxFQUFDLENBQUM7b0JBQ3ZELEtBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCOzs7b0JBQUM7d0JBQzFCLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDM0MsQ0FBQyxFQUFDLENBQUM7Z0JBQ0wsQ0FBQyxFQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7YUFDMUI7U0FDRjtJQUNILENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSCwwQ0FBUzs7OztJQUFUO1FBQUEsaUJBc0RDO1FBckRDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O1FBQUM7WUFDMUIsS0FBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUUvQyxLQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNOzs7OztZQUFFLFVBQUMsS0FBSyxFQUFFLEtBQUs7Z0JBQ3JDLEtBQUksQ0FBQyxJQUFJLENBQUMsR0FBRzs7O2dCQUFDO29CQUNaLEtBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFBLEVBQUUsS0FBSyxPQUFBLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDLEVBQUMsQ0FBQztZQUNMLENBQUMsRUFBQyxDQUFDO1lBRUgsS0FBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWxDLEtBQUksQ0FBQyxJQUFJLENBQUMsR0FBRzs7O1lBQUM7O2dCQUNaLEtBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUV4QixLQUFJLENBQUMsWUFBWSxHQUFHLE9BQUEsS0FBSSxDQUFDLE1BQU0sMENBQUUsWUFBWSxLQUFJLENBQUMsQ0FBQztZQUNyRCxDQUFDLEVBQUMsQ0FBQztZQUVHLEtBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWE7Ozs7OztZQUFFLFVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFZO2dCQUN4RCxLQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7OztnQkFBQztvQkFDVixLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQzt3QkFDbEIsS0FBSyxPQUFBO3dCQUNMLEtBQUssT0FBQTt3QkFDTCxZQUFZLGNBQUE7d0JBQ1osS0FBSyxFQUFFLFlBQVksS0FBSyxDQUFDO3dCQUN6QixJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYztxQkFDN0UsQ0FBQyxDQUFDO29CQUNILEtBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO2dCQUNyQyxDQUFDLEVBQUMsQ0FBQztZQUNQLENBQUMsRUFBQyxDQUFDO1lBRVQsS0FBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsY0FBYzs7Ozs7OztZQUFFLFVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUztnQkFDdEUsS0FBSSxDQUFDLElBQUksQ0FBQyxHQUFHOzs7Z0JBQUM7b0JBQ1osS0FBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLE9BQUEsRUFBRSxLQUFLLE9BQUEsRUFBRSxZQUFZLGNBQUEsRUFBRSxTQUFTLFdBQUEsRUFBRSxDQUFDLENBQUM7b0JBQ2xFLEtBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO2dCQUNoQyxDQUFDLEVBQUMsQ0FBQztZQUNMLENBQUMsRUFBQyxDQUFDO1lBRUgsS0FBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWTs7Ozs7O1lBQUUsVUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVU7Z0JBQ3ZELEtBQUksQ0FBQyxJQUFJLENBQUMsR0FBRzs7O2dCQUFDO29CQUNaLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFBLEVBQUUsS0FBSyxPQUFBLEVBQUUsVUFBVSxZQUFBLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDLEVBQUMsQ0FBQztZQUNMLENBQUMsRUFBQyxDQUFDO1lBRUgsS0FBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUzs7Ozs7WUFBRSxVQUFDLEtBQUssRUFBRSxLQUFLO2dCQUN4QyxLQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7OztnQkFBQztvQkFDWixLQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssT0FBQSxFQUFFLEtBQUssT0FBQSxFQUFFLENBQUMsQ0FBQztvQkFDcEMsS0FBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBQzNCLENBQUMsRUFBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFDLENBQUM7UUFDTCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRUQseUNBQVE7Ozs7SUFBUixVQUFTLFNBQTZCO1FBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Ozs7O0lBRUQsNENBQVc7Ozs7SUFBWCxVQUFZLFNBQTZCO1FBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ0ksMENBQVM7Ozs7O0lBQWhCLFVBQWlCLEtBQWE7UUFBOUIsaUJBSUM7UUFIQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O1FBQUM7WUFDMUIsS0FBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7OztJQUVNLDBDQUFTOzs7SUFBaEI7UUFBQSxpQkFJQztRQUhDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCOzs7UUFBQztZQUMxQixLQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwQyxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFTSwwQ0FBUzs7O0lBQWhCO1FBQUEsaUJBSUM7UUFIQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O1FBQUM7WUFDMUIsS0FBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7O0lBRU0sMkNBQVU7OztJQUFqQjtRQUFBLGlCQUlDO1FBSEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7OztRQUFDO1lBQzFCLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JDLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7OztJQUVNLDBDQUFTOzs7SUFBaEI7UUFBQSxpQkFJQztRQUhDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCOzs7UUFBQztZQUMxQixLQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwQyxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFTSx3Q0FBTzs7O0lBQWQ7UUFBQSxpQkFRQztRQVBDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O1lBQUM7Z0JBQzFCLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xDLENBQUMsRUFBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7U0FDNUI7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDOzs7OztJQUVELDRDQUFXOzs7O0lBQVgsVUFBWSxPQUFzQjtRQUFsQyxpQkFhQztRQVpDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTs7Z0JBQ2QsTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDaEMsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUU7O29CQUMvRSxTQUFPLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7O29CQUN4QyxZQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQztnQkFDekQsT0FBTyxZQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRTdCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCOzs7Z0JBQUM7b0JBQzFCLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFlBQVUsRUFBRSxTQUFPLENBQUMsQ0FBQztnQkFDOUQsQ0FBQyxFQUFDLENBQUM7YUFDSjtTQUNGO0lBQ0gsQ0FBQzs7Z0JBaE5GLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixTQUFTLEVBQUUsQ0FBQzs0QkFDVixPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVTs7OzRCQUFDLGNBQU0sT0FBQSxzQkFBc0IsRUFBdEIsQ0FBc0IsRUFBQzs0QkFDckQsS0FBSyxFQUFFLElBQUk7eUJBQ1osQ0FBQztvQkFDRixRQUFRLEVBQUUsMkJBQTJCO2lCQUN0Qzs7OztnQkE5QkMsVUFBVTtnQkFNVixNQUFNOzZDQWlETyxNQUFNLFNBQUMsV0FBVzs7O3lCQXRCNUIsS0FBSzs4QkFDTCxNQUFNOytCQUNOLE1BQU07NkJBQ04sTUFBTTswQkFDTixNQUFNO3VCQUNOLE1BQU07O0lBaU1YLDZCQUFDO0NBQUEsQUFsTkQsSUFrTkM7U0F4TVksc0JBQXNCOzs7SUFFL0Isd0NBQXFCOztJQUNyQiw2Q0FBMEk7O0lBQzFJLDhDQUErSDs7SUFDL0gsNENBQXFHOztJQUNyRyx5Q0FBaUY7O0lBQ2pGLHNDQUE4RTs7SUFFaEYsMkNBQXNCOzs7OztJQUd0Qiw4Q0FBeUI7O0lBRXpCLHdDQUEwQjs7SUFDMUIsNkNBQTJCOzs7OztJQUMzQixnREFBa0Q7Ozs7O0lBQ2xELDhDQUFnRDs7Ozs7SUFLcEMsb0NBQXNCOzs7OztJQUN0QixzQ0FBb0I7Ozs7O0lBQ3BCLDRDQUErQzs7QUFrTDdEO0lBSUUsNEJBQW1CLEVBQWMsRUFDUSxVQUFrQixFQUMvQixRQUFnQztRQUZ6QyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ1EsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUMvQixhQUFRLEdBQVIsUUFBUSxDQUF3QjtJQUM1RCxDQUFDOzs7O0lBRUQscUNBQVE7OztJQUFSO1FBQ0UsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7SUFDSCxDQUFDOzs7O0lBRUQsd0NBQVc7OztJQUFYO1FBQ0UsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDOztnQkFuQkYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCOzs7O2dCQTNPQyxVQUFVOzZDQThPRyxNQUFNLFNBQUMsV0FBVztnQkFDTyxzQkFBc0IsdUJBQS9DLElBQUk7O0lBY25CLHlCQUFDO0NBQUEsQUFwQkQsSUFvQkM7U0FqQlksa0JBQWtCOzs7SUFDakIsZ0NBQXFCOzs7OztJQUNyQix3Q0FBK0M7Ozs7O0lBQy9DLHNDQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyLCBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3QsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5kZWNsYXJlIGNvbnN0IGpRdWVyeTogYW55O1xuXG4vKipcbiAqIFNsaWNrIGNvbXBvbmVudFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtc2xpY2stY2Fyb3VzZWwnLFxuICBleHBvcnRBczogJ3NsaWNrLWNhcm91c2VsJyxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNsaWNrQ2Fyb3VzZWxDb21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG4gIH1dLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxufSlcbmV4cG9ydCBjbGFzcyBTbGlja0Nhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQge1xuXG4gICAgQElucHV0KCkgY29uZmlnOiBhbnk7XG4gICAgQE91dHB1dCgpIGFmdGVyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8eyBldmVudDogYW55LCBzbGljazogYW55LCBjdXJyZW50U2xpZGU6IG51bWJlciwgZmlyc3Q6IGJvb2xlYW4sIGxhc3Q6IGJvb2xlYW4gfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGJlZm9yZUNoYW5nZTogRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IGFueSwgc2xpY2s6IGFueSwgY3VycmVudFNsaWRlOiBudW1iZXIsIG5leHRTbGlkZTogbnVtYmVyIH0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBicmVha3BvaW50OiBFdmVudEVtaXR0ZXI8eyBldmVudDogYW55LCBzbGljazogYW55LCBicmVha3BvaW50OiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGRlc3Ryb3k6IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBhbnksIHNsaWNrOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGluaXQ6IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBhbnksIHNsaWNrOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljICRpbnN0YW5jZTogYW55O1xuXG4gIC8vIGFjY2VzcyBmcm9tIHBhcmVudCBjb21wb25lbnQgY2FuIGJlIGEgcHJvYmxlbSB3aXRoIGNoYW5nZSBkZXRlY3Rpb24gdGltaW5nLiBQbGVhc2UgdXNlIGFmdGVyQ2hhbmdlIG91dHB1dFxuICBwcml2YXRlIGN1cnJlbnRJbmRleCA9IDA7XG5cbiAgcHVibGljIHNsaWRlczogYW55W10gPSBbXTtcbiAgcHVibGljIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgX3JlbW92ZWRTbGlkZXM6IFNsaWNrSXRlbURpcmVjdGl2ZVtdID0gW107XG4gIHByaXZhdGUgX2FkZGVkU2xpZGVzOiBTbGlja0l0ZW1EaXJlY3RpdmVbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogc3RyaW5nKSB7XG4gIH1cblxuICAvKipcbiAgICogT24gY29tcG9uZW50IGRlc3Ryb3lcbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudW5zbGljaygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubmdBZnRlclZpZXdDaGVja2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogT24gY29tcG9uZW50IHZpZXcgY2hlY2tlZFxuICAgKi9cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIGlmIChpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2FkZGVkU2xpZGVzLmxlbmd0aCA+IDAgfHwgdGhpcy5fcmVtb3ZlZFNsaWRlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXh0U2xpZGVzTGVuZ3RoID0gdGhpcy5zbGlkZXMubGVuZ3RoIC0gdGhpcy5fcmVtb3ZlZFNsaWRlcy5sZW5ndGggKyB0aGlzLl9hZGRlZFNsaWRlcy5sZW5ndGg7XG4gICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgaWYgKG5leHRTbGlkZXNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5pbml0U2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBuZXh0U2xpZGVzTGVuZ3RoIGlzIHplcmUsIGRvIG5vdGhpbmdcbiAgICAgIH0gZWxzZSBpZiAobmV4dFNsaWRlc0xlbmd0aCA9PT0gMCkgeyAvLyB1bnNsaWNrIGNhc2VcbiAgICAgICAgdGhpcy51bnNsaWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hZGRlZFNsaWRlcy5mb3JFYWNoKHNsaWNrSXRlbSA9PiB7XG4gICAgICAgICAgdGhpcy5zbGlkZXMucHVzaChzbGlja0l0ZW0pO1xuICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygnc2xpY2tBZGQnLCBzbGlja0l0ZW0uZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9hZGRlZFNsaWRlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuX3JlbW92ZWRTbGlkZXMuZm9yRWFjaChzbGlja0l0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuc2xpZGVzLmluZGV4T2Yoc2xpY2tJdGVtKTtcbiAgICAgICAgICB0aGlzLnNsaWRlcyA9IHRoaXMuc2xpZGVzLmZpbHRlcihzID0+IHMgIT09IHNsaWNrSXRlbSk7XG4gICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCdzbGlja1JlbW92ZScsIGlkeCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZW1vdmVkU2xpZGVzID0gW107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGluaXQgc2xpY2tcbiAgICovXG4gIGluaXRTbGljaygpIHtcbiAgICB0aGlzLnNsaWRlcyA9IHRoaXMuX2FkZGVkU2xpZGVzO1xuICAgIHRoaXMuX2FkZGVkU2xpZGVzID0gW107XG4gICAgdGhpcy5fcmVtb3ZlZFNsaWRlcyA9IFtdO1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLiRpbnN0YW5jZSA9IGpRdWVyeSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICB0aGlzLiRpbnN0YW5jZS5vbignaW5pdCcsIChldmVudCwgc2xpY2spID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbml0LmVtaXQoeyBldmVudCwgc2xpY2sgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKHRoaXMuY29uZmlnKTtcblxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5jb25maWc/LmluaXRpYWxTbGlkZSB8fCAwO1xuICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuJGluc3RhbmNlLm9uKCdhZnRlckNoYW5nZScsIChldmVudCwgc2xpY2ssIGN1cnJlbnRTbGlkZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFmdGVyQ2hhbmdlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGljayxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTbGlkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0OiBjdXJyZW50U2xpZGUgPT09IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0OiBzbGljay4kc2xpZGVzLmxlbmd0aCA9PT0gY3VycmVudFNsaWRlICsgc2xpY2sub3B0aW9ucy5zbGlkZXNUb1Njcm9sbFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBjdXJyZW50U2xpZGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgdGhpcy4kaW5zdGFuY2Uub24oJ2JlZm9yZUNoYW5nZScsIChldmVudCwgc2xpY2ssIGN1cnJlbnRTbGlkZSwgbmV4dFNsaWRlKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYmVmb3JlQ2hhbmdlLmVtaXQoeyBldmVudCwgc2xpY2ssIGN1cnJlbnRTbGlkZSwgbmV4dFNsaWRlIH0pO1xuICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gbmV4dFNsaWRlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLiRpbnN0YW5jZS5vbignYnJlYWtwb2ludCcsIChldmVudCwgc2xpY2ssIGJyZWFrcG9pbnQpID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5icmVha3BvaW50LmVtaXQoeyBldmVudCwgc2xpY2ssIGJyZWFrcG9pbnQgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuJGluc3RhbmNlLm9uKCdkZXN0cm95JywgKGV2ZW50LCBzbGljaykgPT4ge1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3kuZW1pdCh7IGV2ZW50LCBzbGljayB9KTtcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRTbGlkZShzbGlja0l0ZW06IFNsaWNrSXRlbURpcmVjdGl2ZSkge1xuICAgIHRoaXMuX2FkZGVkU2xpZGVzLnB1c2goc2xpY2tJdGVtKTtcbiAgfVxuXG4gIHJlbW92ZVNsaWRlKHNsaWNrSXRlbTogU2xpY2tJdGVtRGlyZWN0aXZlKSB7XG4gICAgdGhpcy5fcmVtb3ZlZFNsaWRlcy5wdXNoKHNsaWNrSXRlbSk7XG4gIH1cblxuICAvKipcbiAgICogU2xpY2sgTWV0aG9kXG4gICAqL1xuICBwdWJsaWMgc2xpY2tHb1RvKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrR29UbycsIGluZGV4KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzbGlja05leHQoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCdzbGlja05leHQnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzbGlja1ByZXYoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCdzbGlja1ByZXYnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzbGlja1BhdXNlKCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygnc2xpY2tQYXVzZScpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNsaWNrUGxheSgpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrUGxheScpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVuc2xpY2soKSB7XG4gICAgaWYgKHRoaXMuJGluc3RhbmNlKSB7XG4gICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygndW5zbGljaycpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLiRpbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBjaGFuZ2VzWydjb25maWcnXTtcbiAgICAgIGlmIChjb25maWcucHJldmlvdXNWYWx1ZSAhPT0gY29uZmlnLmN1cnJlbnRWYWx1ZSAmJiBjb25maWcuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmVmcmVzaCA9IGNvbmZpZy5jdXJyZW50VmFsdWVbJ3JlZnJlc2gnXTtcbiAgICAgICAgY29uc3QgbmV3T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZy5jdXJyZW50VmFsdWUpO1xuICAgICAgICBkZWxldGUgbmV3T3B0aW9uc1sncmVmcmVzaCddO1xuXG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrU2V0T3B0aW9uJywgbmV3T3B0aW9ucywgcmVmcmVzaCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuZ3hTbGlja0l0ZW1dJyxcbn0pXG5leHBvcnQgY2xhc3MgU2xpY2tJdGVtRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogc3RyaW5nLFxuICAgICAgICAgICAgICBASG9zdCgpIHByaXZhdGUgY2Fyb3VzZWw6IFNsaWNrQ2Fyb3VzZWxDb21wb25lbnQpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLmNhcm91c2VsLmFkZFNsaWRlKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLmNhcm91c2VsLnJlbW92ZVNsaWRlKHRoaXMpO1xuICAgIH1cbiAgfVxufVxuIl19