ngx-carousel-ease
Version:
ngx-carousel-ease is a versatile Angular library providing a feature-rich, simple, and performant carousel component. This library supports infinite and responsive mode, mouse and touch event. Attention has been put to accessibility, performance, and frie
210 lines • 29.8 kB
JavaScript
import { signal } from '@angular/core';
export class CommunSlider {
constructor(carousel, responsive, slideToScroll, LIMIT_AUTO_SLIDE, strechingLimit, autoSlide, animationTimingFn, animationTimingMs, enableMouseDrag, enableTouch, autoPlay, autoPlayInterval, autoPlayAtStart, playDirection, autoplaySlideToScroll, carouselService, cd) {
this.carousel = carousel;
this.responsive = responsive;
this.slideToScroll = slideToScroll;
this.LIMIT_AUTO_SLIDE = LIMIT_AUTO_SLIDE;
this.strechingLimit = strechingLimit;
this.autoSlide = autoSlide;
this.animationTimingFn = animationTimingFn;
this.animationTimingMs = animationTimingMs;
this.enableMouseDrag = enableMouseDrag;
this.enableTouch = enableTouch;
this.autoPlay = autoPlay;
this.autoPlayInterval = autoPlayInterval;
this.autoPlayAtStart = autoPlayAtStart;
this.playDirection = playDirection;
this.autoplaySlideToScroll = autoplaySlideToScroll;
this.carouselService = carouselService;
this.cd = cd;
this.dragging = signal(false);
this.currentSlide = signal(0);
this.lastWindow = 0;
this.currentTranslation = signal(0);
this.previousTranslation = 0;
this.direction = 'right';
this.startX = 0;
this.previousX = 0;
this.currentX = 0;
this.positionChange = 0;
this.prevLimit = 0;
this.nextLimit = 0;
this.fullWidthInf = 0;
this.lastWindowTranslation = 0;
this.totalSlides = 0;
this.DOMLimitReached = false;
this.visibleOffsetCardNotResponsive = 0;
this.invisibleOffsetCardNotResponsive = 0;
this.accumulatedSlide = 0;
this.currentCarouselID = 0;
this.playActive = signal(false);
this.playButtonDisabled = signal(false);
this.directionAutoPlay = (slides) => { };
this.initProperties();
this.updateProperties();
}
initProperties() {
this.slidesContainer = this.carousel.slidesContainer;
this.arrayOfSlides = this.carousel.arrayOfSlides;
this.totalSlides = this.carousel.totalSlides;
this.totalAmountOfSlides = this.totalSlides;
this.nextLimit = Math.floor(this.carousel.slideWidthWithGap);
this.prevLimit = -this.carousel.slideWidthWithGap;
if (this.autoPlayAtStart)
this.launchAutoPlay();
}
launchAutoPlay() {
if (!this.autoPlay)
return;
this.playActive.set(true);
this.autoInterval = window.setInterval(() => {
this.directionAutoPlay(this.autoplaySlideToScroll);
this.cd.markForCheck();
}, this.autoPlayInterval);
}
stopAutoPlay() {
if (!this.autoPlay)
return;
this.playActive.set(false);
clearInterval(this.autoInterval);
}
/**
* Update properties of the slider
* Fired at start and at resizing.
*/
updateProperties() {
this.updateNotResponsive();
this.lastWindow = this.carousel.numberDots() - 1;
this.fullWidthInf = this.totalSlides * this.carousel.slideWidthWithGap;
this.lastWindowTranslation =
this.slidesContainer.clientWidth -
this.carousel.slideToShow * this.carousel.slideWidthWithGap +
this.carousel.gap;
this.lastWindowTranslation += this.responsive
? 0
: -this.visibleOffsetCardNotResponsive - this.carousel.gap;
const maxScrollable = this.carousel.widthSlideContainer -
this.carousel.carouselWidth +
this.carousel.paddingCarousel;
this.carousel.maxScrollableContent.set(maxScrollable);
if (this.carousel.numberDots() === 1) {
// if all slides visible in one window, max scrollable content equals 0
this.carousel.maxScrollableContent.set(0);
}
}
updateNotResponsive() {
if (this.responsive)
return;
// visible part of the offset of the card in px
this.visibleOffsetCardNotResponsive =
this.carousel.carouselWidth -
this.carousel.slideToShow * this.carousel.slideWidthWithGap -
this.carousel.paddingCarousel;
this.invisibleOffsetCardNotResponsive =
this.carousel.slideWidth - this.visibleOffsetCardNotResponsive;
}
/**
* Fired at drag start
* Instantiate property of the starting drag point on the X axis. Used to compute the translation.
* Disabling the transition while applying the transformation because of the attached animation.
*/
dragStart(event) {
if (this.currentEventIsDisabled(event))
return;
clearInterval(this.autoInterval);
this.dragging.set(true);
this.startX =
event instanceof MouseEvent ? event.pageX : event.touches[0].pageX;
// Useful for direction detection
this.previousX = this.startX;
this.slidesContainer.style.transition = 'none';
}
/**
* Checks if current event is allowed by user.
* TouchEvent partially supported on Firefox (and working on Safari despite the MDN docs).
*/
currentEventIsDisabled(event) {
const isMouseEvent = event instanceof MouseEvent;
return ((isMouseEvent && !this.enableMouseDrag) ||
(!isMouseEvent && !this.enableTouch));
}
/**
* Update the direction
* Do not update the direction in case of the same previous position.
*/
setDirection() {
if (this.previousX > this.currentX) {
this.direction = 'right';
}
else if (this.previousX < this.currentX) {
this.direction = 'left';
}
}
/**
* Update the last window translation
* Useful to get the max translation at the end of the slides.
* In not responsive mode, there is possibly a not fully displayed card (card offset).
*/
updateLastWindowTranslation() {
const total = this.totalAmountOfSlides * this.carousel.slideWidthWithGap;
this.lastWindowTranslation =
total - this.carousel.slideToShow * this.carousel.slideWidthWithGap;
this.lastWindowTranslation += this.responsive
? 0
: -this.visibleOffsetCardNotResponsive - this.carousel.gap;
}
/**
* Decrease limit (movement to the left)
* In infinite mode, take full width of a set if on the first slide as new slides are created to the left (a whole set offset).
* Exception: if not responsive (card offset) and finite carousel, the next limit is at the maximum (the end of the carousel)
*/
decreaseLimits(slidesCreatedOnTheLeft = false) {
let translationCorrectionAfterClone = this.prevLimit;
if (slidesCreatedOnTheLeft) {
translationCorrectionAfterClone = this.fullWidthInf;
}
this.prevLimit =
translationCorrectionAfterClone - this.carousel.slideWidthWithGap;
this.nextLimit = this.prevLimit + 2 * this.carousel.slideWidthWithGap;
this.prevLimit = Math.floor(this.prevLimit);
this.nextLimit = Math.floor(this.nextLimit);
}
/**
* Increase limit on basis of previous computed limits (movement to the right)
* Schema: || previous | current || next
* Exception: if not responsive (card offset) and finite carousel, the next limit is at the maximum (the end of the carousel)
*/
increaseLimits() {
this.nextLimit += Math.floor(this.carousel.slideWidthWithGap);
this.prevLimit = Math.floor(this.nextLimit - this.carousel.slideWidthWithGap * 2);
// console.log(this.prevLimit, this.nextLimit);
}
/**
* Change prev and next limit on basis of the provided slide number
* Prev and next limit are always calculated as the following:
* || <= prev | current || <= next
*/
changePrevAndNextLimits(slideNumber) {
const limitInPX = slideNumber * this.carousel.slideWidthWithGap;
this.nextLimit = Math.floor(limitInPX + this.carousel.slideWidthWithGap);
this.prevLimit = Math.floor(this.nextLimit - this.carousel.slideWidthWithGap * 2);
// console.log(this.prevLimit, this.nextLimit);
}
fireSlideChangeEvent(slideHasChanged, slide) {
if (!slideHasChanged)
return;
this.carouselService.emit(slide, this.carousel.carouselElement);
}
applyTransformation(transformation) {
this.slidesContainer.style.transition = `transform ${this.animationTimingMs}ms ${this.animationTimingFn}`;
this.applyTranslation(-transformation);
this.dragging.set(false);
this.previousTranslation = -transformation;
this.currentTranslation.set(-transformation);
}
applyTranslation(transformation) {
this.slidesContainer.style.transform = `translate3d(${transformation}px, 0, 0)`;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbXVuU2xpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY2Fyb3VzZWwvc3JjL2xpYi9jb21tdW5TbGlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJMUQsTUFBTSxPQUFPLFlBQVk7SUE2QnZCLFlBQ1csUUFBa0IsRUFDbEIsVUFBbUIsRUFDbkIsYUFBcUIsRUFDckIsZ0JBQXdCLEVBQ3hCLGNBQXNCLEVBQ3RCLFNBQWtCLEVBQ2xCLGlCQUF5QixFQUN6QixpQkFBeUIsRUFDekIsZUFBd0IsRUFDeEIsV0FBb0IsRUFDcEIsUUFBaUIsRUFDakIsZ0JBQXdCLEVBQ3hCLGVBQXdCLEVBQ3hCLGFBQXFCLEVBQ3JCLHFCQUE2QixFQUMvQixlQUFnQyxFQUNoQyxFQUFxQjtRQWhCbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixlQUFVLEdBQVYsVUFBVSxDQUFTO1FBQ25CLGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQ3JCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBUTtRQUN4QixtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFTO1FBQ2xCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBUTtRQUN6QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVE7UUFDekIsb0JBQWUsR0FBZixlQUFlLENBQVM7UUFDeEIsZ0JBQVcsR0FBWCxXQUFXLENBQVM7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVE7UUFDeEIsb0JBQWUsR0FBZixlQUFlLENBQVM7UUFDeEIsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDckIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFRO1FBQy9CLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQTdDOUIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixpQkFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsdUJBQWtCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLHdCQUFtQixHQUFHLENBQUMsQ0FBQztRQUN4QixjQUFTLEdBQXFCLE9BQU8sQ0FBQztRQUN0QyxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUlkLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLDBCQUFxQixHQUFHLENBQUMsQ0FBQztRQUMxQixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixtQ0FBOEIsR0FBRyxDQUFDLENBQUM7UUFDbkMscUNBQWdDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLHFCQUFnQixHQUFHLENBQUMsQ0FBQztRQUNyQixzQkFBaUIsR0FBRyxDQUFDLENBQUM7UUFFdEIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQix1QkFBa0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsc0JBQWlCLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQztRQXFCekMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUNyRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBRWpELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDN0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFNUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztRQUVsRCxJQUFJLElBQUksQ0FBQyxlQUFlO1lBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUUzQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxQixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQzFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3pCLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztRQUV2RSxJQUFJLENBQUMscUJBQXFCO1lBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVztnQkFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUI7Z0JBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBRXBCLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUMzQyxDQUFDLENBQUMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUU3RCxNQUFNLGFBQWEsR0FDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUI7WUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhO1lBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXRELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyx1RUFBdUU7WUFDdkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU87UUFFNUIsK0NBQStDO1FBQy9DLElBQUksQ0FBQyw4QkFBOEI7WUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQjtnQkFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFFaEMsSUFBSSxDQUFDLGdDQUFnQztZQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLENBQUMsS0FBOEI7UUFDdEMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTztRQUMvQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNO1lBQ1QsS0FBSyxZQUFZLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFckUsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxzQkFBc0IsQ0FBQyxLQUE4QjtRQUNuRCxNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksVUFBVSxDQUFDO1FBRWpELE9BQU8sQ0FDTCxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDdkMsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztRQUMzQixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCwyQkFBMkI7UUFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7UUFFekUsSUFBSSxDQUFDLHFCQUFxQjtZQUN4QixLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztRQUV0RSxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLFVBQVU7WUFDM0MsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsc0JBQXNCLEdBQUcsS0FBSztRQUMzQyxJQUFJLCtCQUErQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFckQsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1lBQzNCLCtCQUErQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdEQsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTO1lBQ1osK0JBQStCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztRQUVwRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7UUFFdEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYztRQUNaLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUNyRCxDQUFDO1FBRUYsK0NBQStDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsdUJBQXVCLENBQUMsV0FBbUI7UUFDekMsTUFBTSxTQUFTLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7UUFDaEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFekUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUNyRCxDQUFDO1FBRUYsK0NBQStDO0lBQ2pELENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxlQUF3QixFQUFFLEtBQWE7UUFDMUQsSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPO1FBRTdCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxjQUFzQjtRQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsYUFBYSxJQUFJLENBQUMsaUJBQWlCLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFMUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsY0FBc0I7UUFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLGVBQWUsY0FBYyxXQUFXLENBQUM7SUFDbEYsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDYXJvdXNlbCB9IGZyb20gJy4vY2Fyb3VzZWwnO1xyXG5pbXBvcnQgeyBDYXJvdXNlbFNlcnZpY2UgfSBmcm9tICcuL2Nhcm91c2VsLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbW11blNsaWRlciB7XHJcbiAgZHJhZ2dpbmcgPSBzaWduYWwoZmFsc2UpO1xyXG4gIGN1cnJlbnRTbGlkZSA9IHNpZ25hbCgwKTtcclxuICBsYXN0V2luZG93ID0gMDtcclxuICBjdXJyZW50VHJhbnNsYXRpb24gPSBzaWduYWwoMCk7XHJcbiAgcHJldmlvdXNUcmFuc2xhdGlvbiA9IDA7XHJcbiAgZGlyZWN0aW9uOiAncmlnaHQnIHwgJ2xlZnQnID0gJ3JpZ2h0JztcclxuICBzdGFydFggPSAwO1xyXG4gIHByZXZpb3VzWCA9IDA7XHJcbiAgY3VycmVudFggPSAwO1xyXG4gIHBvc2l0aW9uQ2hhbmdlID0gMDtcclxuICBwcmV2TGltaXQgPSAwO1xyXG4gIG5leHRMaW1pdCA9IDA7XHJcbiAgc2xpZGVzQ29udGFpbmVyITogSFRNTERpdkVsZW1lbnQ7XHJcbiAgYXJyYXlPZlNsaWRlcyE6IEhUTUxEaXZFbGVtZW50W107XHJcbiAgdG90YWxBbW91bnRPZlNsaWRlcyE6IG51bWJlcjtcclxuICBmdWxsV2lkdGhJbmYgPSAwO1xyXG4gIGxhc3RXaW5kb3dUcmFuc2xhdGlvbiA9IDA7XHJcbiAgdG90YWxTbGlkZXMgPSAwO1xyXG4gIERPTUxpbWl0UmVhY2hlZCA9IGZhbHNlO1xyXG4gIHZpc2libGVPZmZzZXRDYXJkTm90UmVzcG9uc2l2ZSA9IDA7XHJcbiAgaW52aXNpYmxlT2Zmc2V0Q2FyZE5vdFJlc3BvbnNpdmUgPSAwO1xyXG4gIGFjY3VtdWxhdGVkU2xpZGUgPSAwO1xyXG4gIGN1cnJlbnRDYXJvdXNlbElEID0gMDtcclxuICBhdXRvSW50ZXJ2YWwhOiBudW1iZXI7XHJcbiAgcGxheUFjdGl2ZSA9IHNpZ25hbChmYWxzZSk7XHJcbiAgcGxheUJ1dHRvbkRpc2FibGVkID0gc2lnbmFsKGZhbHNlKTtcclxuICBkaXJlY3Rpb25BdXRvUGxheSA9IChzbGlkZXM6IG51bWJlcikgPT4ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcmVhZG9ubHkgY2Fyb3VzZWw6IENhcm91c2VsLFxyXG4gICAgcmVhZG9ubHkgcmVzcG9uc2l2ZTogYm9vbGVhbixcclxuICAgIHJlYWRvbmx5IHNsaWRlVG9TY3JvbGw6IG51bWJlcixcclxuICAgIHJlYWRvbmx5IExJTUlUX0FVVE9fU0xJREU6IG51bWJlcixcclxuICAgIHJlYWRvbmx5IHN0cmVjaGluZ0xpbWl0OiBudW1iZXIsXHJcbiAgICByZWFkb25seSBhdXRvU2xpZGU6IGJvb2xlYW4sXHJcbiAgICByZWFkb25seSBhbmltYXRpb25UaW1pbmdGbjogc3RyaW5nLFxyXG4gICAgcmVhZG9ubHkgYW5pbWF0aW9uVGltaW5nTXM6IG51bWJlcixcclxuICAgIHJlYWRvbmx5IGVuYWJsZU1vdXNlRHJhZzogYm9vbGVhbixcclxuICAgIHJlYWRvbmx5IGVuYWJsZVRvdWNoOiBib29sZWFuLFxyXG4gICAgcmVhZG9ubHkgYXV0b1BsYXk6IGJvb2xlYW4sXHJcbiAgICByZWFkb25seSBhdXRvUGxheUludGVydmFsOiBudW1iZXIsXHJcbiAgICByZWFkb25seSBhdXRvUGxheUF0U3RhcnQ6IGJvb2xlYW4sXHJcbiAgICByZWFkb25seSBwbGF5RGlyZWN0aW9uOiBzdHJpbmcsXHJcbiAgICByZWFkb25seSBhdXRvcGxheVNsaWRlVG9TY3JvbGw6IG51bWJlcixcclxuICAgIHB1YmxpYyBjYXJvdXNlbFNlcnZpY2U6IENhcm91c2VsU2VydmljZSxcclxuICAgIHB1YmxpYyBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHtcclxuICAgIHRoaXMuaW5pdFByb3BlcnRpZXMoKTtcclxuICAgIHRoaXMudXBkYXRlUHJvcGVydGllcygpO1xyXG4gIH1cclxuXHJcbiAgaW5pdFByb3BlcnRpZXMoKSB7XHJcbiAgICB0aGlzLnNsaWRlc0NvbnRhaW5lciA9IHRoaXMuY2Fyb3VzZWwuc2xpZGVzQ29udGFpbmVyO1xyXG4gICAgdGhpcy5hcnJheU9mU2xpZGVzID0gdGhpcy5jYXJvdXNlbC5hcnJheU9mU2xpZGVzO1xyXG5cclxuICAgIHRoaXMudG90YWxTbGlkZXMgPSB0aGlzLmNhcm91c2VsLnRvdGFsU2xpZGVzO1xyXG4gICAgdGhpcy50b3RhbEFtb3VudE9mU2xpZGVzID0gdGhpcy50b3RhbFNsaWRlcztcclxuXHJcbiAgICB0aGlzLm5leHRMaW1pdCA9IE1hdGguZmxvb3IodGhpcy5jYXJvdXNlbC5zbGlkZVdpZHRoV2l0aEdhcCk7XHJcbiAgICB0aGlzLnByZXZMaW1pdCA9IC10aGlzLmNhcm91c2VsLnNsaWRlV2lkdGhXaXRoR2FwO1xyXG5cclxuICAgIGlmICh0aGlzLmF1dG9QbGF5QXRTdGFydCkgdGhpcy5sYXVuY2hBdXRvUGxheSgpO1xyXG4gIH1cclxuXHJcbiAgbGF1bmNoQXV0b1BsYXkoKSB7XHJcbiAgICBpZiAoIXRoaXMuYXV0b1BsYXkpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnBsYXlBY3RpdmUuc2V0KHRydWUpO1xyXG5cclxuICAgIHRoaXMuYXV0b0ludGVydmFsID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy5kaXJlY3Rpb25BdXRvUGxheSh0aGlzLmF1dG9wbGF5U2xpZGVUb1Njcm9sbCk7XHJcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9LCB0aGlzLmF1dG9QbGF5SW50ZXJ2YWwpO1xyXG4gIH1cclxuXHJcbiAgc3RvcEF1dG9QbGF5KCkge1xyXG4gICAgaWYgKCF0aGlzLmF1dG9QbGF5KSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5wbGF5QWN0aXZlLnNldChmYWxzZSk7XHJcbiAgICBjbGVhckludGVydmFsKHRoaXMuYXV0b0ludGVydmFsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBwcm9wZXJ0aWVzIG9mIHRoZSBzbGlkZXJcclxuICAgKiBGaXJlZCBhdCBzdGFydCBhbmQgYXQgcmVzaXppbmcuXHJcbiAgICovXHJcbiAgdXBkYXRlUHJvcGVydGllcygpIHtcclxuICAgIHRoaXMudXBkYXRlTm90UmVzcG9uc2l2ZSgpO1xyXG5cclxuICAgIHRoaXMubGFzdFdpbmRvdyA9IHRoaXMuY2Fyb3VzZWwubnVtYmVyRG90cygpIC0gMTtcclxuICAgIHRoaXMuZnVsbFdpZHRoSW5mID0gdGhpcy50b3RhbFNsaWRlcyAqIHRoaXMuY2Fyb3VzZWwuc2xpZGVXaWR0aFdpdGhHYXA7XHJcblxyXG4gICAgdGhpcy5sYXN0V2luZG93VHJhbnNsYXRpb24gPVxyXG4gICAgICB0aGlzLnNsaWRlc0NvbnRhaW5lci5jbGllbnRXaWR0aCAtXHJcbiAgICAgIHRoaXMuY2Fyb3VzZWwuc2xpZGVUb1Nob3cgKiB0aGlzLmNhcm91c2VsLnNsaWRlV2lkdGhXaXRoR2FwICtcclxuICAgICAgdGhpcy5jYXJvdXNlbC5nYXA7XHJcblxyXG4gICAgdGhpcy5sYXN0V2luZG93VHJhbnNsYXRpb24gKz0gdGhpcy5yZXNwb25zaXZlXHJcbiAgICAgID8gMFxyXG4gICAgICA6IC10aGlzLnZpc2libGVPZmZzZXRDYXJkTm90UmVzcG9uc2l2ZSAtIHRoaXMuY2Fyb3VzZWwuZ2FwO1xyXG5cclxuICAgIGNvbnN0IG1heFNjcm9sbGFibGUgPVxyXG4gICAgICB0aGlzLmNhcm91c2VsLndpZHRoU2xpZGVDb250YWluZXIgLVxyXG4gICAgICB0aGlzLmNhcm91c2VsLmNhcm91c2VsV2lkdGggK1xyXG4gICAgICB0aGlzLmNhcm91c2VsLnBhZGRpbmdDYXJvdXNlbDtcclxuICAgIHRoaXMuY2Fyb3VzZWwubWF4U2Nyb2xsYWJsZUNvbnRlbnQuc2V0KG1heFNjcm9sbGFibGUpO1xyXG5cclxuICAgIGlmICh0aGlzLmNhcm91c2VsLm51bWJlckRvdHMoKSA9PT0gMSkge1xyXG4gICAgICAvLyBpZiBhbGwgc2xpZGVzIHZpc2libGUgaW4gb25lIHdpbmRvdywgbWF4IHNjcm9sbGFibGUgY29udGVudCBlcXVhbHMgMFxyXG4gICAgICB0aGlzLmNhcm91c2VsLm1heFNjcm9sbGFibGVDb250ZW50LnNldCgwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZU5vdFJlc3BvbnNpdmUoKSB7XHJcbiAgICBpZiAodGhpcy5yZXNwb25zaXZlKSByZXR1cm47XHJcblxyXG4gICAgLy8gdmlzaWJsZSBwYXJ0IG9mIHRoZSBvZmZzZXQgb2YgdGhlIGNhcmQgaW4gcHhcclxuICAgIHRoaXMudmlzaWJsZU9mZnNldENhcmROb3RSZXNwb25zaXZlID1cclxuICAgICAgdGhpcy5jYXJvdXNlbC5jYXJvdXNlbFdpZHRoIC1cclxuICAgICAgdGhpcy5jYXJvdXNlbC5zbGlkZVRvU2hvdyAqIHRoaXMuY2Fyb3VzZWwuc2xpZGVXaWR0aFdpdGhHYXAgLVxyXG4gICAgICB0aGlzLmNhcm91c2VsLnBhZGRpbmdDYXJvdXNlbDtcclxuXHJcbiAgICB0aGlzLmludmlzaWJsZU9mZnNldENhcmROb3RSZXNwb25zaXZlID1cclxuICAgICAgdGhpcy5jYXJvdXNlbC5zbGlkZVdpZHRoIC0gdGhpcy52aXNpYmxlT2Zmc2V0Q2FyZE5vdFJlc3BvbnNpdmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaXJlZCBhdCBkcmFnIHN0YXJ0XHJcbiAgICogSW5zdGFudGlhdGUgcHJvcGVydHkgb2YgdGhlIHN0YXJ0aW5nIGRyYWcgcG9pbnQgb24gdGhlIFggYXhpcy4gVXNlZCB0byBjb21wdXRlIHRoZSB0cmFuc2xhdGlvbi5cclxuICAgKiBEaXNhYmxpbmcgdGhlIHRyYW5zaXRpb24gd2hpbGUgYXBwbHlpbmcgdGhlIHRyYW5zZm9ybWF0aW9uIGJlY2F1c2Ugb2YgdGhlIGF0dGFjaGVkIGFuaW1hdGlvbi5cclxuICAgKi9cclxuICBkcmFnU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50RXZlbnRJc0Rpc2FibGVkKGV2ZW50KSkgcmV0dXJuO1xyXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9JbnRlcnZhbCk7XHJcblxyXG4gICAgdGhpcy5kcmFnZ2luZy5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLnN0YXJ0WCA9XHJcbiAgICAgIGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCA/IGV2ZW50LnBhZ2VYIDogZXZlbnQudG91Y2hlc1swXS5wYWdlWDtcclxuXHJcbiAgICAvLyBVc2VmdWwgZm9yIGRpcmVjdGlvbiBkZXRlY3Rpb25cclxuICAgIHRoaXMucHJldmlvdXNYID0gdGhpcy5zdGFydFg7XHJcbiAgICB0aGlzLnNsaWRlc0NvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIGN1cnJlbnQgZXZlbnQgaXMgYWxsb3dlZCBieSB1c2VyLlxyXG4gICAqIFRvdWNoRXZlbnQgcGFydGlhbGx5IHN1cHBvcnRlZCBvbiBGaXJlZm94IChhbmQgd29ya2luZyBvbiBTYWZhcmkgZGVzcGl0ZSB0aGUgTUROIGRvY3MpLlxyXG4gICAqL1xyXG4gIGN1cnJlbnRFdmVudElzRGlzYWJsZWQoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSB7XHJcbiAgICBjb25zdCBpc01vdXNlRXZlbnQgPSBldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnQ7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgKGlzTW91c2VFdmVudCAmJiAhdGhpcy5lbmFibGVNb3VzZURyYWcpIHx8XHJcbiAgICAgICghaXNNb3VzZUV2ZW50ICYmICF0aGlzLmVuYWJsZVRvdWNoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgZGlyZWN0aW9uXHJcbiAgICogRG8gbm90IHVwZGF0ZSB0aGUgZGlyZWN0aW9uIGluIGNhc2Ugb2YgdGhlIHNhbWUgcHJldmlvdXMgcG9zaXRpb24uXHJcbiAgICovXHJcbiAgc2V0RGlyZWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMucHJldmlvdXNYID4gdGhpcy5jdXJyZW50WCkge1xyXG4gICAgICB0aGlzLmRpcmVjdGlvbiA9ICdyaWdodCc7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJldmlvdXNYIDwgdGhpcy5jdXJyZW50WCkge1xyXG4gICAgICB0aGlzLmRpcmVjdGlvbiA9ICdsZWZ0JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbGFzdCB3aW5kb3cgdHJhbnNsYXRpb25cclxuICAgKiBVc2VmdWwgdG8gZ2V0IHRoZSBtYXggdHJhbnNsYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgc2xpZGVzLlxyXG4gICAqIEluIG5vdCByZXNwb25zaXZlIG1vZGUsIHRoZXJlIGlzIHBvc3NpYmx5IGEgbm90IGZ1bGx5IGRpc3BsYXllZCBjYXJkIChjYXJkIG9mZnNldCkuXHJcbiAgICovXHJcbiAgdXBkYXRlTGFzdFdpbmRvd1RyYW5zbGF0aW9uKCkge1xyXG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsQW1vdW50T2ZTbGlkZXMgKiB0aGlzLmNhcm91c2VsLnNsaWRlV2lkdGhXaXRoR2FwO1xyXG5cclxuICAgIHRoaXMubGFzdFdpbmRvd1RyYW5zbGF0aW9uID1cclxuICAgICAgdG90YWwgLSB0aGlzLmNhcm91c2VsLnNsaWRlVG9TaG93ICogdGhpcy5jYXJvdXNlbC5zbGlkZVdpZHRoV2l0aEdhcDtcclxuXHJcbiAgICB0aGlzLmxhc3RXaW5kb3dUcmFuc2xhdGlvbiArPSB0aGlzLnJlc3BvbnNpdmVcclxuICAgICAgPyAwXHJcbiAgICAgIDogLXRoaXMudmlzaWJsZU9mZnNldENhcmROb3RSZXNwb25zaXZlIC0gdGhpcy5jYXJvdXNlbC5nYXA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWNyZWFzZSBsaW1pdCAobW92ZW1lbnQgdG8gdGhlIGxlZnQpXHJcbiAgICogSW4gaW5maW5pdGUgbW9kZSwgdGFrZSBmdWxsIHdpZHRoIG9mIGEgc2V0IGlmIG9uIHRoZSBmaXJzdCBzbGlkZSBhcyBuZXcgc2xpZGVzIGFyZSBjcmVhdGVkIHRvIHRoZSBsZWZ0IChhIHdob2xlIHNldCBvZmZzZXQpLlxyXG4gICAqIEV4Y2VwdGlvbjogaWYgbm90IHJlc3BvbnNpdmUgKGNhcmQgb2Zmc2V0KSBhbmQgZmluaXRlIGNhcm91c2VsLCB0aGUgbmV4dCBsaW1pdCBpcyBhdCB0aGUgbWF4aW11bSAodGhlIGVuZCBvZiB0aGUgY2Fyb3VzZWwpXHJcbiAgICovXHJcbiAgZGVjcmVhc2VMaW1pdHMoc2xpZGVzQ3JlYXRlZE9uVGhlTGVmdCA9IGZhbHNlKSB7XHJcbiAgICBsZXQgdHJhbnNsYXRpb25Db3JyZWN0aW9uQWZ0ZXJDbG9uZSA9IHRoaXMucHJldkxpbWl0O1xyXG5cclxuICAgIGlmIChzbGlkZXNDcmVhdGVkT25UaGVMZWZ0KSB7XHJcbiAgICAgIHRyYW5zbGF0aW9uQ29ycmVjdGlvbkFmdGVyQ2xvbmUgPSB0aGlzLmZ1bGxXaWR0aEluZjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnByZXZMaW1pdCA9XHJcbiAgICAgIHRyYW5zbGF0aW9uQ29ycmVjdGlvbkFmdGVyQ2xvbmUgLSB0aGlzLmNhcm91c2VsLnNsaWRlV2lkdGhXaXRoR2FwO1xyXG5cclxuICAgIHRoaXMubmV4dExpbWl0ID0gdGhpcy5wcmV2TGltaXQgKyAyICogdGhpcy5jYXJvdXNlbC5zbGlkZVdpZHRoV2l0aEdhcDtcclxuXHJcbiAgICB0aGlzLnByZXZMaW1pdCA9IE1hdGguZmxvb3IodGhpcy5wcmV2TGltaXQpO1xyXG4gICAgdGhpcy5uZXh0TGltaXQgPSBNYXRoLmZsb29yKHRoaXMubmV4dExpbWl0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluY3JlYXNlIGxpbWl0IG9uIGJhc2lzIG9mIHByZXZpb3VzIGNvbXB1dGVkIGxpbWl0cyAobW92ZW1lbnQgdG8gdGhlIHJpZ2h0KVxyXG4gICAqIFNjaGVtYTogfHwgcHJldmlvdXMgfCBjdXJyZW50IHx8IG5leHRcclxuICAgKiBFeGNlcHRpb246IGlmIG5vdCByZXNwb25zaXZlIChjYXJkIG9mZnNldCkgYW5kIGZpbml0ZSBjYXJvdXNlbCwgdGhlIG5leHQgbGltaXQgaXMgYXQgdGhlIG1heGltdW0gKHRoZSBlbmQgb2YgdGhlIGNhcm91c2VsKVxyXG4gICAqL1xyXG4gIGluY3JlYXNlTGltaXRzKCkge1xyXG4gICAgdGhpcy5uZXh0TGltaXQgKz0gTWF0aC5mbG9vcih0aGlzLmNhcm91c2VsLnNsaWRlV2lkdGhXaXRoR2FwKTtcclxuICAgIHRoaXMucHJldkxpbWl0ID0gTWF0aC5mbG9vcihcclxuICAgICAgdGhpcy5uZXh0TGltaXQgLSB0aGlzLmNhcm91c2VsLnNsaWRlV2lkdGhXaXRoR2FwICogMlxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnByZXZMaW1pdCwgdGhpcy5uZXh0TGltaXQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlIHByZXYgYW5kIG5leHQgbGltaXQgb24gYmFzaXMgb2YgdGhlIHByb3ZpZGVkIHNsaWRlIG51bWJlclxyXG4gICAqIFByZXYgYW5kIG5leHQgbGltaXQgYXJlIGFsd2F5cyBjYWxjdWxhdGVkIGFzIHRoZSBmb2xsb3dpbmc6XHJcbiAgICogfHwgPD0gcHJldiB8IGN1cnJlbnQgfHwgPD0gbmV4dFxyXG4gICAqL1xyXG4gIGNoYW5nZVByZXZBbmROZXh0TGltaXRzKHNsaWRlTnVtYmVyOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGxpbWl0SW5QWCA9IHNsaWRlTnVtYmVyICogdGhpcy5jYXJvdXNlbC5zbGlkZVdpZHRoV2l0aEdhcDtcclxuICAgIHRoaXMubmV4dExpbWl0ID0gTWF0aC5mbG9vcihsaW1pdEluUFggKyB0aGlzLmNhcm91c2VsLnNsaWRlV2lkdGhXaXRoR2FwKTtcclxuXHJcbiAgICB0aGlzLnByZXZMaW1pdCA9IE1hdGguZmxvb3IoXHJcbiAgICAgIHRoaXMubmV4dExpbWl0IC0gdGhpcy5jYXJvdXNlbC5zbGlkZVdpZHRoV2l0aEdhcCAqIDJcclxuICAgICk7XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5wcmV2TGltaXQsIHRoaXMubmV4dExpbWl0KTtcclxuICB9XHJcblxyXG4gIGZpcmVTbGlkZUNoYW5nZUV2ZW50KHNsaWRlSGFzQ2hhbmdlZDogYm9vbGVhbiwgc2xpZGU6IG51bWJlcikge1xyXG4gICAgaWYgKCFzbGlkZUhhc0NoYW5nZWQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmNhcm91c2VsU2VydmljZS5lbWl0KHNsaWRlLCB0aGlzLmNhcm91c2VsLmNhcm91c2VsRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBhcHBseVRyYW5zZm9ybWF0aW9uKHRyYW5zZm9ybWF0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2xpZGVzQ29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSBgdHJhbnNmb3JtICR7dGhpcy5hbmltYXRpb25UaW1pbmdNc31tcyAke3RoaXMuYW5pbWF0aW9uVGltaW5nRm59YDtcclxuXHJcbiAgICB0aGlzLmFwcGx5VHJhbnNsYXRpb24oLXRyYW5zZm9ybWF0aW9uKTtcclxuXHJcbiAgICB0aGlzLmRyYWdnaW5nLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLnByZXZpb3VzVHJhbnNsYXRpb24gPSAtdHJhbnNmb3JtYXRpb247XHJcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2xhdGlvbi5zZXQoLXRyYW5zZm9ybWF0aW9uKTtcclxuICB9XHJcblxyXG4gIGFwcGx5VHJhbnNsYXRpb24odHJhbnNmb3JtYXRpb246IG51bWJlcikge1xyXG4gICAgdGhpcy5zbGlkZXNDb250YWluZXIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7dHJhbnNmb3JtYXRpb259cHgsIDAsIDApYDtcclxuICB9XHJcbn1cclxuIl19