UNPKG

ngx-slice-kit

Version:

[![npm version](https://badge.fury.io/js/ngx-slice-kit.svg)](https://badge.fury.io/js/ngx-slice-kit)

237 lines 41.3 kB
import { Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core'; import { Subscription } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class SliderComponent { constructor(renderer) { this.renderer = renderer; this.max = 100; this.min = 0; this.step = 1; this.color = 'var(--primary)'; this.disabled = false; this.multiple = false; this.small = false; this.isDrag = false; this.isMultipleDrag = false; this.interValue = 0; this.subscription = new Subscription(); this.changed = new EventEmitter(); this.moved = new EventEmitter(); } grab(prop, event) { this[prop] = true; if (prop === 'isDrag') { this.thumbClickOffset = event.layerX; } if (prop === 'isMultipleDrag') { this.multiThumbClickOffset = event.layerX; } } drop() { this.isDrag = false; this.isMultipleDrag = false; } pointerMove(e) { if (this.isDrag) { this.thumbCoords = this.getCoords(e.clientX - this.thumbClickOffset); if (this.thumbCoords < this.multiThumbCoords + (this.thumbSize / this.trackRects.width * 100)) { return; } this.renderer.setStyle(this.thumb.nativeElement, 'left', this.thumbCoords + '%'); this.setGradient(this.thumbCoords); this.calcValue(this.thumbCoords, this.multiple ? 'max' : null); this.moved.emit(); } if (this.isMultipleDrag) { this.multiThumbCoords = this.getCoords(e.clientX - this.multiThumbClickOffset); if (this.multiThumbCoords + (this.thumbSize / this.trackRects.width * 100) > this.thumbCoords) { return; } this.renderer.setStyle(this.thumbMultiple.nativeElement, 'left', this.multiThumbCoords + '%'); this.setGradient(this.multiThumbCoords, true); this.calcValue(this.multiThumbCoords, 'min'); this.moved.emit(); } } getCoords(mouseX) { this.trackRects = this.track.nativeElement.getBoundingClientRect(); if (mouseX < this.trackRects.left) { mouseX = this.trackRects.left; this.setValue(this.min); } if (mouseX > this.trackRects.right) { mouseX = this.trackRects.right; this.setValue(this.max); } return (mouseX - this.trackRects.left) / this.trackRects.width * 100; } moveThumb(e) { const target = e.target; if (target.classList.contains('sdk-slider__thumb')) { return; } const coords = this.getCoords(e.clientX); if (this.multiple) { const firstThumb = { thumb: this.thumbMultiple, coords: this.multiThumbCoords, position: 'left' }; const secThumb = { thumb: this.thumb, coords: this.thumbCoords, position: 'right' }; if (secThumb.coords <= firstThumb.coords) { [secThumb.coords, firstThumb.coords] = [firstThumb.coords, secThumb.coords]; } const targetThumb = this.selectTargetBlock(coords, firstThumb, secThumb); this.renderer.setStyle(targetThumb.thumb.nativeElement, 'left', coords + '%'); targetThumb.position === 'left' ? this.multiThumbCoords = coords : this.thumbCoords = coords; this.setGradient(coords, targetThumb.position === 'left'); this.calcValue(coords, targetThumb.position === 'left' ? 'min' : 'max'); } else { this.isDrag = true; this.renderer.setStyle(this.thumb.nativeElement, 'left', coords + '%'); this.setGradient(coords); this.calcValue(coords); } this.moved.emit(); } setGradient(thumbCoords, fromLeft) { if (fromLeft) { this.gradientLeftOffset = thumbCoords; } else { this.gradientSize = thumbCoords; } } selectTargetBlock(clickCoords, firstThumb, secThumb) { return Math.abs(clickCoords - firstThumb.coords) < Math.abs(clickCoords - secThumb.coords) ? firstThumb : secThumb; } calcValue(thumbCoords, rangeSide) { const diff = this.max - this.min; this.interValue = Math.round(diff / 100 * thumbCoords); const newValue = this.step * Math.ceil(this.interValue / this.step) + this.min; this.setValue(newValue, rangeSide); } setValue(newValue, rangeSide) { if (this.multiple) { if (rangeSide === 'max') { if (this.value.max !== newValue) { this.value.max = newValue; this.changed.emit(this.value); } } if (rangeSide === 'min') { if (this.value.min !== newValue) { this.value.min = newValue; this.changed.emit(this.value); } } } else { if (this.value !== newValue) { this.value = newValue; this.changed.emit(this.value); } } } setInitialThumbCoords() { this.trackRects = this.track.nativeElement.getBoundingClientRect(); // const padding = this.thumbSize; const diff = this.max - this.min; const valuePercent = this.multiple ? (this.value.max - this.min) * 100 / diff : (this.value - this.min) * 100 / diff; if (this.multiple) { setTimeout(() => { const multipleValuePercent = (this.value.min - this.min) * 100 / diff; this.multiThumbCoords = multipleValuePercent; this.setGradient(multipleValuePercent, true); this.renderer.setStyle(this.thumbMultiple.nativeElement, 'left', multipleValuePercent + '%'); }); } this.thumbCoords = valuePercent; this.setGradient(valuePercent); this.renderer.setStyle(this.thumb.nativeElement, 'left', valuePercent + '%'); } ngOnInit() { this.trackRects = this.track.nativeElement.getBoundingClientRect(); this.thumbSize = this.multiple ? 12 : this.small ? 24 : 32; if (this.min > this.max) { [this.max, this.min] = [this.min, this.max]; } if (!this.multiple) { if (this.value < this.min) { this.value = this.min; } if (this.value > this.max) { this.value = this.max; } } else { if (this.value && this.value.min < this.min) { this.value.min = this.min; } if (this.value && this.value.max > this.max) { this.value.max = this.max; } } this.value = this.value || (this.multiple ? { max: this.max, min: this.min } : this.min); if (this.value && this.value !== this.min) { this.setInitialThumbCoords(); } } ngAfterViewInit() { this.thumbCoords = this.getCoords(this.thumb.nativeElement.getBoundingClientRect().left + this.thumbSize); if (this.multiple) { this.multiThumbCoords = this.getCoords(this.thumbMultiple.nativeElement.getBoundingClientRect().left); } } } SliderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: SliderComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); SliderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: SliderComponent, selector: "sdk-slider", inputs: { max: "max", min: "min", step: "step", color: "color", value: "value", disabled: "disabled", multiple: "multiple", small: "small" }, outputs: { changed: "changed", moved: "moved" }, host: { listeners: { "document:pointerup": "drop()", "document:pointermove": "pointerMove($event)" } }, viewQueries: [{ propertyName: "thumb", first: true, predicate: ["thumb"], descendants: true, static: true }, { propertyName: "addThumb", first: true, predicate: ["addThumb"], descendants: true }, { propertyName: "thumbMultiple", first: true, predicate: ["thumbMultiple"], descendants: true }, { propertyName: "track", first: true, predicate: ["track"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"sdk-slider__wrapper\"\n [class.sdk-slider__wrapper--small]=\"small\"\n [class.sdk-slider__wrapper--multiple]=\"multiple\">\n <div class=\"sdk-slider__track-wrapper\" #track (pointerdown)=\"moveThumb($event)\">\n <div class=\"sdk-slider__thumb-wrapper sdk-slider__thumb-wrapper--multiple\" *ngIf=\"multiple\" #thumbMultiple\n [style.top]=\"'-12px'\">\n <div class=\"sdk-slider__thumb\" [class.sdk-slider__thumb--active]=\"isMultipleDrag\"\n (pointerdown)=\"grab('isMultipleDrag', $event)\"></div>\n </div>\n <div class=\"sdk-slider__thumb-wrapper\" [style.top]=\"multiple ? '-12px' : (-thumbSize/2) + thumbSize/10 + 'px'\"\n #thumb>\n <div class=\"sdk-slider__thumb\" [class.sdk-slider__thumb--active]=\"isDrag\"\n (pointerdown)=\"grab('isDrag', $event)\"></div>\n </div>\n <div class=\"sdk-slider-track__background\"></div>\n <div class=\"sdk-slider-track__fill\"\n [ngStyle]=\"{'background': 'linear-gradient(to right, transparent 0px ' + (gradientLeftOffset || 0) + '%, ' + color + ' 0px ' + gradientSize + '%, transparent ' + gradientSize + 'px)'}\"></div>\n </div>\n <div class=\"sdk-slider-track__padding\" [style.width]=\"thumbSize + 'px'\"></div>\n</div>\n\n", styles: [".sdk-slider__wrapper{width:100%;height:40px;display:flex;align-items:center;position:relative}.sdk-slider__track-wrapper{width:100%;height:8px;border-radius:3px;position:relative;display:flex}.sdk-slider-track__background{height:100%;width:100%;background-color:var(--regular-a20)}.sdk-slider__thumb{width:32px;height:32px;background-color:#fff;box-shadow:0 2px 2px #1a1a1a3d,0 1px 4px #1a1a1a29;left:0;border-radius:100%;cursor:grab;position:relative;z-index:1}.sdk-slider__thumb:active,.sdk-slider__thumb--active{cursor:grabbing}.sdk-slider__wrapper--small .sdk-slider__track-wrapper{height:4px}.sdk-slider__wrapper--small .sdk-slider__thumb{width:24px;height:24px}.sdk-slider-track__fill{background-color:var(--primary);height:100%;width:100%;position:absolute;top:0;border-radius:3px}.sdk-slider__wrapper--multiple .sdk-slider__thumb{width:12px;height:32px;border-radius:3px}.sdk-slider__wrapper--multiple.sdk-slider__wrapper--small .sdk-slider__thumb{height:24px}.sdk-slider__thumb-wrapper{position:absolute}.sdk-slider-track__padding{height:8px;background-color:var(--regular-a20)}.sdk-slider__wrapper--small .sdk-slider-track__padding{height:4px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: SliderComponent, decorators: [{ type: Component, args: [{ selector: 'sdk-slider', template: "<div class=\"sdk-slider__wrapper\"\n [class.sdk-slider__wrapper--small]=\"small\"\n [class.sdk-slider__wrapper--multiple]=\"multiple\">\n <div class=\"sdk-slider__track-wrapper\" #track (pointerdown)=\"moveThumb($event)\">\n <div class=\"sdk-slider__thumb-wrapper sdk-slider__thumb-wrapper--multiple\" *ngIf=\"multiple\" #thumbMultiple\n [style.top]=\"'-12px'\">\n <div class=\"sdk-slider__thumb\" [class.sdk-slider__thumb--active]=\"isMultipleDrag\"\n (pointerdown)=\"grab('isMultipleDrag', $event)\"></div>\n </div>\n <div class=\"sdk-slider__thumb-wrapper\" [style.top]=\"multiple ? '-12px' : (-thumbSize/2) + thumbSize/10 + 'px'\"\n #thumb>\n <div class=\"sdk-slider__thumb\" [class.sdk-slider__thumb--active]=\"isDrag\"\n (pointerdown)=\"grab('isDrag', $event)\"></div>\n </div>\n <div class=\"sdk-slider-track__background\"></div>\n <div class=\"sdk-slider-track__fill\"\n [ngStyle]=\"{'background': 'linear-gradient(to right, transparent 0px ' + (gradientLeftOffset || 0) + '%, ' + color + ' 0px ' + gradientSize + '%, transparent ' + gradientSize + 'px)'}\"></div>\n </div>\n <div class=\"sdk-slider-track__padding\" [style.width]=\"thumbSize + 'px'\"></div>\n</div>\n\n", styles: [".sdk-slider__wrapper{width:100%;height:40px;display:flex;align-items:center;position:relative}.sdk-slider__track-wrapper{width:100%;height:8px;border-radius:3px;position:relative;display:flex}.sdk-slider-track__background{height:100%;width:100%;background-color:var(--regular-a20)}.sdk-slider__thumb{width:32px;height:32px;background-color:#fff;box-shadow:0 2px 2px #1a1a1a3d,0 1px 4px #1a1a1a29;left:0;border-radius:100%;cursor:grab;position:relative;z-index:1}.sdk-slider__thumb:active,.sdk-slider__thumb--active{cursor:grabbing}.sdk-slider__wrapper--small .sdk-slider__track-wrapper{height:4px}.sdk-slider__wrapper--small .sdk-slider__thumb{width:24px;height:24px}.sdk-slider-track__fill{background-color:var(--primary);height:100%;width:100%;position:absolute;top:0;border-radius:3px}.sdk-slider__wrapper--multiple .sdk-slider__thumb{width:12px;height:32px;border-radius:3px}.sdk-slider__wrapper--multiple.sdk-slider__wrapper--small .sdk-slider__thumb{height:24px}.sdk-slider__thumb-wrapper{position:absolute}.sdk-slider-track__padding{height:8px;background-color:var(--regular-a20)}.sdk-slider__wrapper--small .sdk-slider-track__padding{height:4px}\n"] }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { thumb: [{ type: ViewChild, args: ['thumb', { static: true }] }], addThumb: [{ type: ViewChild, args: ['addThumb', { static: false }] }], thumbMultiple: [{ type: ViewChild, args: ['thumbMultiple', { static: false }] }], track: [{ type: ViewChild, args: ['track', { static: true }] }], max: [{ type: Input }], min: [{ type: Input }], step: [{ type: Input }], color: [{ type: Input }], value: [{ type: Input }], disabled: [{ type: Input }], multiple: [{ type: Input }], small: [{ type: Input }], changed: [{ type: Output }], moved: [{ type: Output }], drop: [{ type: HostListener, args: ['document:pointerup'] }], pointerMove: [{ type: HostListener, args: ['document:pointermove', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXNsaWNlLWtpdC9zcmMvbGliL2xheW91dC9zbGlkZXIvc2xpZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXNsaWNlLWtpdC9zcmMvbGliL2xheW91dC9zbGlkZXIvc2xpZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7QUFPbEMsTUFBTSxPQUFPLGVBQWU7SUFrQ3hCLFlBQ1ksUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQTVCZixRQUFHLEdBQVcsR0FBRyxDQUFDO1FBQ2xCLFFBQUcsR0FBVyxDQUFDLENBQUM7UUFDaEIsU0FBSSxHQUFXLENBQUMsQ0FBQztRQUNqQixVQUFLLEdBQVcsZ0JBQWdCLENBQUM7UUFFakMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLFVBQUssR0FBWSxLQUFLLENBQUM7UUFFaEMsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUtoQyxlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBR3ZCLGlCQUFZLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFNdEMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0IsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFLNUMsQ0FBQztJQUVNLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNuQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztTQUN4QztRQUNELElBQUksSUFBSSxLQUFLLGdCQUFnQixFQUFFO1lBQzNCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1NBQzdDO0lBQ0wsQ0FBQztJQUdNLElBQUk7UUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBR00sV0FBVyxDQUFDLENBQWU7UUFDOUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckUsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEVBQUU7Z0JBQzNGLE9BQU87YUFDVjtZQUVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBRWpGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDckI7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDckIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUUvRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDM0YsT0FBTzthQUNWO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUU5RixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3JCO0lBQ0wsQ0FBQztJQUVNLFNBQVMsQ0FBQyxNQUFjO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtZQUMvQixNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0I7UUFFRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUNoQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0I7UUFFRCxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ3pFLENBQUM7SUFFTSxTQUFTLENBQUMsQ0FBYTtRQUMxQixNQUFNLE1BQU0sR0FBZ0IsQ0FBQyxDQUFDLE1BQXFCLENBQUM7UUFFcEQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ2hELE9BQU87U0FDVjtRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE1BQU0sVUFBVSxHQUFHO2dCQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQzdCLFFBQVEsRUFBRSxNQUFNO2FBQ25CLENBQUM7WUFDRixNQUFNLFFBQVEsR0FBRztnQkFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDeEIsUUFBUSxFQUFFLE9BQU87YUFDcEIsQ0FBQztZQUVGLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO2dCQUN0QyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDL0U7WUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzlFLFdBQVcsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztZQUM3RixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNFO2FBQU07WUFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMxQjtRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxXQUFtQixFQUFFLFFBQWtCO1FBQ3RELElBQUksUUFBUSxFQUFFO1lBQ1YsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFdBQVcsQ0FBQztTQUN6QzthQUFNO1lBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7U0FDbkM7SUFDTCxDQUFDO0lBRU0saUJBQWlCLENBQ3BCLFdBQW1CLEVBQ25CLFVBQW1FLEVBQ25FLFFBQWlFO1FBRWpFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDdkgsQ0FBQztJQUVNLFNBQVMsQ0FBQyxXQUFtQixFQUFFLFNBQXlCO1FBQzNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUVqQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQztRQUN2RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUUvRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU0sUUFBUSxDQUFDLFFBQWdCLEVBQUUsU0FBeUI7UUFDdkQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsSUFBSSxTQUFTLEtBQUssS0FBSyxFQUFFO2dCQUNyQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDO29CQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pDO2FBQ0o7WUFDRCxJQUFJLFNBQVMsS0FBSyxLQUFLLEVBQUU7Z0JBQ3JCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO29CQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUM7b0JBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDakM7YUFDSjtTQUNKO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2pDO1NBQ0o7SUFDTCxDQUFDO0lBRU0scUJBQXFCO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuRSxrQ0FBa0M7UUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2pDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUVySCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztnQkFFdEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO2dCQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDakcsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRU0sUUFBUTtRQUNYLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFM0QsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9DO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEIsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQzthQUN6QjtZQUNELElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7YUFDekI7U0FDSjthQUFNO1lBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7YUFDN0I7WUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQzthQUM3QjtTQUNKO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdkYsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUN2QyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUNoQztJQUNMLENBQUM7SUFFTSxlQUFlO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUcsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6RztJQUNMLENBQUM7OzRHQW5QUSxlQUFlO2dHQUFmLGVBQWUsOHRCQ25CNUIsaXpDQXFCQTsyRkRGYSxlQUFlO2tCQUwzQixTQUFTOytCQUNJLFlBQVk7Z0dBTXFCLEtBQUs7c0JBQS9DLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDYSxRQUFRO3NCQUF0RCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBQ2MsYUFBYTtzQkFBaEUsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUNBLEtBQUs7c0JBQS9DLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFFbEIsR0FBRztzQkFBbEIsS0FBSztnQkFDVSxHQUFHO3NCQUFsQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQWlCVyxPQUFPO3NCQUF2QixNQUFNO2dCQUNVLEtBQUs7c0JBQXJCLE1BQU07Z0JBa0JBLElBQUk7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0I7Z0JBTzNCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsc0JBQXNCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2RrLXNsaWRlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NsaWRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2xpZGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcblxuICAgIEBWaWV3Q2hpbGQoJ3RodW1iJywge3N0YXRpYzogdHJ1ZX0pIHB1YmxpYyB0aHVtYjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdhZGRUaHVtYicsIHtzdGF0aWM6IGZhbHNlfSkgcHVibGljIGFkZFRodW1iOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ3RodW1iTXVsdGlwbGUnLCB7c3RhdGljOiBmYWxzZX0pIHB1YmxpYyB0aHVtYk11bHRpcGxlOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ3RyYWNrJywge3N0YXRpYzogdHJ1ZX0pIHB1YmxpYyB0cmFjazogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXg6IG51bWJlciA9IDEwMDtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluOiBudW1iZXIgPSAwO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzdGVwOiBudW1iZXIgPSAxO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjb2xvcjogc3RyaW5nID0gJ3ZhcigtLXByaW1hcnkpJztcbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsdWU6IGFueTtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgc21hbGw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBpc0RyYWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgaXNNdWx0aXBsZURyYWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgdHJhY2tSZWN0czogQ2xpZW50UmVjdDtcbiAgICBwdWJsaWMgdGh1bWJDb29yZHM6IG51bWJlcjtcbiAgICBwdWJsaWMgbXVsdGlUaHVtYkNvb3JkczogbnVtYmVyO1xuXG4gICAgcHVibGljIGludGVyVmFsdWU6IG51bWJlciA9IDA7XG4gICAgcHVibGljIGdyYWRpZW50U2l6ZTogbnVtYmVyO1xuICAgIHB1YmxpYyBncmFkaWVudExlZnRPZmZzZXQ6IG51bWJlcjtcbiAgICBwdWJsaWMgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBwdWJsaWMgdGh1bWJTaXplOiBudW1iZXI7XG4gICAgcHVibGljIHRodW1iQ2xpY2tPZmZzZXQ6IG51bWJlcjtcbiAgICBwdWJsaWMgbXVsdGlUaHVtYkNsaWNrT2Zmc2V0OiBudW1iZXI7XG5cbiAgICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgKSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdyYWIocHJvcCwgZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpc1twcm9wXSA9IHRydWU7XG4gICAgICAgIGlmIChwcm9wID09PSAnaXNEcmFnJykge1xuICAgICAgICAgICAgdGhpcy50aHVtYkNsaWNrT2Zmc2V0ID0gZXZlbnQubGF5ZXJYO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wID09PSAnaXNNdWx0aXBsZURyYWcnKSB7XG4gICAgICAgICAgICB0aGlzLm11bHRpVGh1bWJDbGlja09mZnNldCA9IGV2ZW50LmxheWVyWDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnBvaW50ZXJ1cCcpXG4gICAgcHVibGljIGRyb3AoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNEcmFnID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNNdWx0aXBsZURyYWcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpwb2ludGVybW92ZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIHBvaW50ZXJNb3ZlKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0RyYWcpIHtcbiAgICAgICAgICAgIHRoaXMudGh1bWJDb29yZHMgPSB0aGlzLmdldENvb3JkcyhlLmNsaWVudFggLSB0aGlzLnRodW1iQ2xpY2tPZmZzZXQpO1xuICAgICAgICAgICAgaWYgKHRoaXMudGh1bWJDb29yZHMgPCB0aGlzLm11bHRpVGh1bWJDb29yZHMgKyAodGhpcy50aHVtYlNpemUgLyB0aGlzLnRyYWNrUmVjdHMud2lkdGggKiAxMDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGh1bWIubmF0aXZlRWxlbWVudCwgJ2xlZnQnLCB0aGlzLnRodW1iQ29vcmRzICsgJyUnKTtcblxuICAgICAgICAgICAgdGhpcy5zZXRHcmFkaWVudCh0aGlzLnRodW1iQ29vcmRzKTtcbiAgICAgICAgICAgIHRoaXMuY2FsY1ZhbHVlKHRoaXMudGh1bWJDb29yZHMsIHRoaXMubXVsdGlwbGUgPyAnbWF4JyA6IG51bGwpO1xuICAgICAgICAgICAgdGhpcy5tb3ZlZC5lbWl0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlRHJhZykge1xuICAgICAgICAgICAgdGhpcy5tdWx0aVRodW1iQ29vcmRzID0gdGhpcy5nZXRDb29yZHMoZS5jbGllbnRYIC0gdGhpcy5tdWx0aVRodW1iQ2xpY2tPZmZzZXQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aVRodW1iQ29vcmRzICsgKHRoaXMudGh1bWJTaXplIC8gdGhpcy50cmFja1JlY3RzLndpZHRoICogMTAwKSA+IHRoaXMudGh1bWJDb29yZHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50aHVtYk11bHRpcGxlLm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgdGhpcy5tdWx0aVRodW1iQ29vcmRzICsgJyUnKTtcblxuICAgICAgICAgICAgdGhpcy5zZXRHcmFkaWVudCh0aGlzLm11bHRpVGh1bWJDb29yZHMsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5jYWxjVmFsdWUodGhpcy5tdWx0aVRodW1iQ29vcmRzLCAnbWluJyk7XG4gICAgICAgICAgICB0aGlzLm1vdmVkLmVtaXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb29yZHMobW91c2VYOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB0aGlzLnRyYWNrUmVjdHMgPSB0aGlzLnRyYWNrLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmIChtb3VzZVggPCB0aGlzLnRyYWNrUmVjdHMubGVmdCkge1xuICAgICAgICAgICAgbW91c2VYID0gdGhpcy50cmFja1JlY3RzLmxlZnQ7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMubWluKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb3VzZVggPiB0aGlzLnRyYWNrUmVjdHMucmlnaHQpIHtcbiAgICAgICAgICAgIG1vdXNlWCA9IHRoaXMudHJhY2tSZWN0cy5yaWdodDtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5tYXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChtb3VzZVggLSB0aGlzLnRyYWNrUmVjdHMubGVmdCkgLyB0aGlzLnRyYWNrUmVjdHMud2lkdGggKiAxMDA7XG4gICAgfVxuXG4gICAgcHVibGljIG1vdmVUaHVtYihlOiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhcmdldDogSFRNTEVsZW1lbnQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnc2RrLXNsaWRlcl9fdGh1bWInKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5nZXRDb29yZHMoZS5jbGllbnRYKTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0VGh1bWIgPSB7XG4gICAgICAgICAgICAgICAgdGh1bWI6IHRoaXMudGh1bWJNdWx0aXBsZSxcbiAgICAgICAgICAgICAgICBjb29yZHM6IHRoaXMubXVsdGlUaHVtYkNvb3JkcyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2xlZnQnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgc2VjVGh1bWIgPSB7XG4gICAgICAgICAgICAgICAgdGh1bWI6IHRoaXMudGh1bWIsXG4gICAgICAgICAgICAgICAgY29vcmRzOiB0aGlzLnRodW1iQ29vcmRzLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAncmlnaHQnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoc2VjVGh1bWIuY29vcmRzIDw9IGZpcnN0VGh1bWIuY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgW3NlY1RodW1iLmNvb3JkcywgZmlyc3RUaHVtYi5jb29yZHNdID0gW2ZpcnN0VGh1bWIuY29vcmRzLCBzZWNUaHVtYi5jb29yZHNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRUaHVtYiA9IHRoaXMuc2VsZWN0VGFyZ2V0QmxvY2soY29vcmRzLCBmaXJzdFRodW1iLCBzZWNUaHVtYik7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRhcmdldFRodW1iLnRodW1iLm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgY29vcmRzICsgJyUnKTtcbiAgICAgICAgICAgIHRhcmdldFRodW1iLnBvc2l0aW9uID09PSAnbGVmdCcgPyB0aGlzLm11bHRpVGh1bWJDb29yZHMgPSBjb29yZHMgOiB0aGlzLnRodW1iQ29vcmRzID0gY29vcmRzO1xuICAgICAgICAgICAgdGhpcy5zZXRHcmFkaWVudChjb29yZHMsIHRhcmdldFRodW1iLnBvc2l0aW9uID09PSAnbGVmdCcpO1xuICAgICAgICAgICAgdGhpcy5jYWxjVmFsdWUoY29vcmRzLCB0YXJnZXRUaHVtYi5wb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ21pbicgOiAnbWF4Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzRHJhZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGh1bWIubmF0aXZlRWxlbWVudCwgJ2xlZnQnLCBjb29yZHMgKyAnJScpO1xuICAgICAgICAgICAgdGhpcy5zZXRHcmFkaWVudChjb29yZHMpO1xuICAgICAgICAgICAgdGhpcy5jYWxjVmFsdWUoY29vcmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW92ZWQuZW1pdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRHcmFkaWVudCh0aHVtYkNvb3JkczogbnVtYmVyLCBmcm9tTGVmdD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGZyb21MZWZ0KSB7XG4gICAgICAgICAgICB0aGlzLmdyYWRpZW50TGVmdE9mZnNldCA9IHRodW1iQ29vcmRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmFkaWVudFNpemUgPSB0aHVtYkNvb3JkcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RUYXJnZXRCbG9jayhcbiAgICAgICAgY2xpY2tDb29yZHM6IG51bWJlcixcbiAgICAgICAgZmlyc3RUaHVtYjogeyB0aHVtYjogRWxlbWVudFJlZiwgY29vcmRzOiBudW1iZXIsIHBvc2l0aW9uOiBzdHJpbmcgfSxcbiAgICAgICAgc2VjVGh1bWI6IHsgdGh1bWI6IEVsZW1lbnRSZWYsIGNvb3JkczogbnVtYmVyLCBwb3NpdGlvbjogc3RyaW5nIH1cbiAgICApOiB7IHRodW1iOiBFbGVtZW50UmVmLCBjb29yZHM6IG51bWJlciwgcG9zaXRpb246IHN0cmluZyB9IHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGNsaWNrQ29vcmRzIC0gZmlyc3RUaHVtYi5jb29yZHMpIDwgTWF0aC5hYnMoY2xpY2tDb29yZHMgLSBzZWNUaHVtYi5jb29yZHMpID8gZmlyc3RUaHVtYiA6IHNlY1RodW1iO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYWxjVmFsdWUodGh1bWJDb29yZHM6IG51bWJlciwgcmFuZ2VTaWRlPzogJ21pbicgfCAnbWF4Jyk6IHZvaWQge1xuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5tYXggLSB0aGlzLm1pbjtcblxuICAgICAgICB0aGlzLmludGVyVmFsdWUgPSBNYXRoLnJvdW5kKGRpZmYgLyAxMDAgKiB0aHVtYkNvb3Jkcyk7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5zdGVwICogTWF0aC5jZWlsKHRoaXMuaW50ZXJWYWx1ZSAvIHRoaXMuc3RlcCkgKyB0aGlzLm1pbjtcblxuICAgICAgICB0aGlzLnNldFZhbHVlKG5ld1ZhbHVlLCByYW5nZVNpZGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRWYWx1ZShuZXdWYWx1ZTogbnVtYmVyLCByYW5nZVNpZGU/OiAnbWF4JyB8ICdtaW4nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBpZiAocmFuZ2VTaWRlID09PSAnbWF4Jykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLm1heCAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5tYXggPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJhbmdlU2lkZSA9PT0gJ21pbicpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5taW4gIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUubWluID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRJbml0aWFsVGh1bWJDb29yZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudHJhY2tSZWN0cyA9IHRoaXMudHJhY2submF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgLy8gY29uc3QgcGFkZGluZyA9IHRoaXMudGh1bWJTaXplO1xuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5tYXggLSB0aGlzLm1pbjtcbiAgICAgICAgY29uc3QgdmFsdWVQZXJjZW50ID0gdGhpcy5tdWx0aXBsZSA/ICh0aGlzLnZhbHVlLm1heCAtIHRoaXMubWluKSAqIDEwMCAvIGRpZmYgOiAodGhpcy52YWx1ZSAtIHRoaXMubWluKSAqIDEwMCAvIGRpZmY7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlVmFsdWVQZXJjZW50ID0gKHRoaXMudmFsdWUubWluIC0gdGhpcy5taW4pICogMTAwIC8gZGlmZjtcblxuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlUaHVtYkNvb3JkcyA9IG11bHRpcGxlVmFsdWVQZXJjZW50O1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0R3JhZGllbnQobXVsdGlwbGVWYWx1ZVBlcmNlbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50aHVtYk11bHRpcGxlLm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgbXVsdGlwbGVWYWx1ZVBlcmNlbnQgKyAnJScpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRodW1iQ29vcmRzID0gdmFsdWVQZXJjZW50O1xuICAgICAgICB0aGlzLnNldEdyYWRpZW50KHZhbHVlUGVyY2VudCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50aHVtYi5uYXRpdmVFbGVtZW50LCAnbGVmdCcsIHZhbHVlUGVyY2VudCArICclJyk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyYWNrUmVjdHMgPSB0aGlzLnRyYWNrLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMudGh1bWJTaXplID0gdGhpcy5tdWx0aXBsZSA/IDEyIDogdGhpcy5zbWFsbCA/IDI0IDogMzI7XG5cbiAgICAgICAgaWYgKHRoaXMubWluID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIFt0aGlzLm1heCwgdGhpcy5taW5dID0gW3RoaXMubWluLCB0aGlzLm1heF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlIDwgdGhpcy5taW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5taW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWF4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5taW4gPCB0aGlzLm1pbikge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUubWluID0gdGhpcy5taW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLm1heCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5tYXggPSB0aGlzLm1heDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlIHx8ICh0aGlzLm11bHRpcGxlID8ge21heDogdGhpcy5tYXgsIG1pbjogdGhpcy5taW59IDogdGhpcy5taW4pO1xuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUgIT09IHRoaXMubWluKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxUaHVtYkNvb3JkcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50aHVtYkNvb3JkcyA9IHRoaXMuZ2V0Q29vcmRzKHRoaXMudGh1bWIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy50aHVtYlNpemUpO1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5tdWx0aVRodW1iQ29vcmRzID0gdGhpcy5nZXRDb29yZHModGhpcy50aHVtYk11bHRpcGxlLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2RrLXNsaWRlcl9fd3JhcHBlclwiXG4gICAgIFtjbGFzcy5zZGstc2xpZGVyX193cmFwcGVyLS1zbWFsbF09XCJzbWFsbFwiXG4gICAgIFtjbGFzcy5zZGstc2xpZGVyX193cmFwcGVyLS1tdWx0aXBsZV09XCJtdWx0aXBsZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZGstc2xpZGVyX190cmFjay13cmFwcGVyXCIgI3RyYWNrIChwb2ludGVyZG93bik9XCJtb3ZlVGh1bWIoJGV2ZW50KVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2RrLXNsaWRlcl9fdGh1bWItd3JhcHBlciBzZGstc2xpZGVyX190aHVtYi13cmFwcGVyLS1tdWx0aXBsZVwiICpuZ0lmPVwibXVsdGlwbGVcIiAjdGh1bWJNdWx0aXBsZVxuICAgICAgICAgICAgIFtzdHlsZS50b3BdPVwiJy0xMnB4J1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkay1zbGlkZXJfX3RodW1iXCIgW2NsYXNzLnNkay1zbGlkZXJfX3RodW1iLS1hY3RpdmVdPVwiaXNNdWx0aXBsZURyYWdcIlxuICAgICAgICAgICAgICAgICAocG9pbnRlcmRvd24pPVwiZ3JhYignaXNNdWx0aXBsZURyYWcnLCAkZXZlbnQpXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2RrLXNsaWRlcl9fdGh1bWItd3JhcHBlclwiIFtzdHlsZS50b3BdPVwibXVsdGlwbGUgPyAnLTEycHgnIDogKC10aHVtYlNpemUvMikgKyB0aHVtYlNpemUvMTAgKyAncHgnXCJcbiAgICAgICAgICAgICAjdGh1bWI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RrLXNsaWRlcl9fdGh1bWJcIiBbY2xhc3Muc2RrLXNsaWRlcl9fdGh1bWItLWFjdGl2ZV09XCJpc0RyYWdcIlxuICAgICAgICAgICAgICAgICAocG9pbnRlcmRvd24pPVwiZ3JhYignaXNEcmFnJywgJGV2ZW50KVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNkay1zbGlkZXItdHJhY2tfX2JhY2tncm91bmRcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNkay1zbGlkZXItdHJhY2tfX2ZpbGxcIlxuICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZCc6ICdsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHRyYW5zcGFyZW50IDBweCAnICsgKGdyYWRpZW50TGVmdE9mZnNldCB8fCAwKSArICclLCAnICsgY29sb3IgKyAnIDBweCAnICsgZ3JhZGllbnRTaXplICsgJyUsIHRyYW5zcGFyZW50ICcgKyBncmFkaWVudFNpemUgKyAncHgpJ31cIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2RrLXNsaWRlci10cmFja19fcGFkZGluZ1wiIFtzdHlsZS53aWR0aF09XCJ0aHVtYlNpemUgKyAncHgnXCI+PC9kaXY+XG48L2Rpdj5cblxuIl19