UNPKG

ngsl-carousel

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.2.4.

329 lines (319 loc) 29.4 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/animations'), require('@angular/common')) : typeof define === 'function' && define.amd ? define('ngsl-carousel', ['exports', '@angular/core', '@angular/animations', '@angular/common'], factory) : (factory((global['ngsl-carousel'] = {}),global.ng.core,global.ng.animations,global.ng.common)); }(this, (function (exports,core,animations,common) { 'use strict'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var NgslCarouselItemDirective = /** @class */ (function () { function NgslCarouselItemDirective(tpl) { this.tpl = tpl; } NgslCarouselItemDirective.decorators = [ { type: core.Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '[ngslCarouselItem]' },] } ]; /** @nocollapse */ NgslCarouselItemDirective.ctorParameters = function () { return [ { type: core.TemplateRef } ]; }; return NgslCarouselItemDirective; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var NgslCarouselDotDirective = /** @class */ (function () { function NgslCarouselDotDirective(tpl) { this.tpl = tpl; this.isVisible = true; } NgslCarouselDotDirective.decorators = [ { type: core.Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '[ngslCarouselDot]' },] } ]; /** @nocollapse */ NgslCarouselDotDirective.ctorParameters = function () { return [ { type: core.TemplateRef } ]; }; return NgslCarouselDotDirective; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var CarouselItemElement = /** @class */ (function () { function CarouselItemElement() { } CarouselItemElement.decorators = [ { type: core.Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '.ngsl-carousel-item-directive' },] } ]; return CarouselItemElement; }()); var CarouselDotElement = /** @class */ (function () { function CarouselDotElement() { } CarouselDotElement.decorators = [ { type: core.Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '.ngsl-carousel-dot-directive' },] } ]; return CarouselDotElement; }()); var NgslCarouselComponent = /** @class */ (function () { function NgslCarouselComponent(builder) { this.builder = builder; /* carousel end dot */ /* Input props start*/ this.timing = 450; this.rewindTiming = 900; this.arrows = true; this.dots = true; this.infinity = true; this.dynamicTiming = false; this.autoplay = true; this.perView = 1; this.action = null; this.currentSlide = 0; this.prevSlide = null; this.nextSlide = null; this.trackWidth = {}; } /** * @param {?} offset * @return {?} */ NgslCarouselComponent.prototype.buildAnimation = /** * @param {?} offset * @return {?} */ function (offset) { /** @type {?} */ var duration = this.action === 'REWIND' ? this.rewindTiming : this.timing; return this.builder.build([ animations.animate(duration + "ms cubic-bezier(0.165, 0.840, 0.440, 1.000)", animations.style({ transform: "translateX(" + offset + "%)" })) ]); }; /** * @param {?} action * @return {?} */ NgslCarouselComponent.prototype.changeSlide = /** * @param {?} action * @return {?} */ function (action) { this.setSlidesIndex(); /** @type {?} */ var itemW = (100 / this.items.length) / this.perView; /** @type {?} */ var offset = (itemW * this.currentSlide) * this.perView; /** @type {?} */ var myAnimation = this.buildAnimation(-offset); this.player = myAnimation.create(this.carousel.nativeElement); this.player.play(); // console.log(`changeSlide action: ${action}, is current slide: `, this.currentSlide + 1); }; /** * @param {?} index * @return {?} */ NgslCarouselComponent.prototype.goToSlide = /** * @param {?} index * @return {?} */ function (index) { if (this.dynamicTiming) { // В разработке, тестовая опция this.timing = this.timing + (55 * (index - this.currentSlide)); } this.currentSlide = index; this.changeSlide('go to slide'); }; /** * @return {?} */ NgslCarouselComponent.prototype.next = /** * @return {?} */ function () { /** @type {?} */ var countSlides = this.items.length; if (this.currentSlide + 1 === countSlides && this.infinity) { this.currentSlide = 0; this.action = 'REWIND'; this.changeSlide('rewind to first slide'); return; } if (this.currentSlide + 1 === countSlides && !this.infinity) { return; } this.currentSlide++; this.action = 'NEXT_SLIDE'; this.changeSlide('next slide'); }; /** * @return {?} */ NgslCarouselComponent.prototype.prev = /** * @return {?} */ function () { /** @type {?} */ var countSlides = this.items.length; if (this.currentSlide === 0 && this.infinity) { this.currentSlide = countSlides - 1; this.action = 'REWIND'; this.changeSlide('rewind to last slide'); return; } if (this.currentSlide === 0 && !this.infinity) { return; } this.currentSlide--; this.action = 'PREV_SLIDE'; this.changeSlide('prev slide'); }; /** * @return {?} */ NgslCarouselComponent.prototype.setSlidesIndex = /** * @return {?} */ function () { this.prevSlide = this.currentSlide === 0 ? this.items.length - 1 : this.currentSlide - 1; this.nextSlide = this.currentSlide === this.items.length - 1 ? 0 : this.currentSlide + 1; }; /** * @return {?} */ NgslCarouselComponent.prototype.removeDotsInDomElements = /** * @return {?} */ function () { /** @type {?} */ var position = this.perView > 1 ? this.dotsList.length - this.perView : null; this.dotsList.toArray().forEach(function (dot, i) { if (i > position) { dot.isVisible = false; } }); }; /** * @return {?} */ NgslCarouselComponent.prototype.setInitValues = /** * @return {?} */ function () { this.setSlidesIndex(); if (this.perView > 1) { this.removeDotsInDomElements(); } this.trackWidth = { width: (100 * this.items.length) / this.perView + "%" }; }; /** * @return {?} */ NgslCarouselComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { this.setInitValues(); }; NgslCarouselComponent.decorators = [ { type: core.Component, args: [{ // tslint:disable-next-line:component-selector selector: 'ngsl-carousel', exportAs: 'ngsl-carousel', template: "<div class=\"ngsl-carousel\">\n <div *ngIf=\"dots\" class=\"dots\" #dotsTrack>\n <div *ngFor=\"let item of dotsList; let i = index\"\n class=\"ngsl-carousel-dot-directive dot\"\n (click)=\"goToSlide(i)\"\n [class.is-current-item]=\"currentSlide === i\">\n <ng-container *ngIf=\"item.isVisible\" [ngTemplateOutlet]=\"item.tpl\"></ng-container>\n </div>\n </div>\n <div class=\"slide\">\n <div class=\"content\">\n <div *ngIf=\"arrows\" class=\"slide-arrows\">\n <input type=\"button\" (click)=\"prev()\" class=\"prev\" [class.is-disabled]=\"currentSlide === 0\" />\n <input type=\"button\" (click)=\"next()\" class=\"next\" [class.is-disabled]=\"currentSlide === items.length - 1\" />\n </div>\n <div class=\"slide-track\" #track [ngStyle]=\"trackWidth\">\n <div *ngFor=\"let item of items\" class=\"ngsl-carousel-item-directive\">\n <ng-container [ngTemplateOutlet]=\"item.tpl\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".ngsl-carousel{overflow:hidden;position:relative}.ngsl-carousel .dots{position:absolute;top:30px;right:40px;font-size:0;z-index:10}.ngsl-carousel .dots .dot{display:inline-block;vertical-align:middle;width:10px;height:10px;border-radius:100%;background-color:#768692;box-sizing:border-box;cursor:pointer}.ngsl-carousel .dots .dot+.dot{margin-left:10px}.ngsl-carousel .dots .dot.is-current-item{width:22px;height:22px;position:relative;border:1px solid #fff;background-color:transparent}.ngsl-carousel .dots .dot.is-current-item:after{content:\"\";position:absolute;left:50%;top:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);width:10px;height:10px;border-radius:100%;background-color:#fff}.slide-track{display:flex;flex-direction:row;flex-wrap:nowrap;height:100%}.ngsl-carousel-item-directive{width:100%;height:100%}.slide-arrows input[type=button]{z-index:10;position:absolute;left:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);width:40px;height:40px;background-color:#768692;opacity:.7;border:0;cursor:pointer;background-repeat:no-repeat;background-position:center}.slide-arrows input[type=button]:hover{opacity:.9}.slide-arrows input[type=button].is-disabled{background-color:#c4bcb7}.slide-arrows input[type=button].is-disabled:hover{opacity:.7}.slide-arrows input[type=button]:focus{outline:0}.slide-arrows input[type=button].prev{-webkit-transform:translateY(-50%) rotate(-180deg);transform:translateY(-50%) rotate(-180deg)}.slide-arrows input[type=button].next{left:auto;right:0}"] }] } ]; /** @nocollapse */ NgslCarouselComponent.ctorParameters = function () { return [ { type: animations.AnimationBuilder } ]; }; NgslCarouselComponent.propDecorators = { items: [{ type: core.ContentChildren, args: [NgslCarouselItemDirective,] }], itemsElements: [{ type: core.ViewChildren, args: [CarouselItemElement, { read: core.ElementRef },] }], carousel: [{ type: core.ViewChild, args: ['track',] }], dotsList: [{ type: core.ContentChildren, args: [NgslCarouselDotDirective,] }], dotElements: [{ type: core.ViewChildren, args: [CarouselDotElement, { read: core.ElementRef },] }], dotTrack: [{ type: core.ViewChild, args: ['dotTrack',] }], timing: [{ type: core.Input }], rewindTiming: [{ type: core.Input }], arrows: [{ type: core.Input }], dots: [{ type: core.Input }], infinity: [{ type: core.Input }], dynamicTiming: [{ type: core.Input }], autoplay: [{ type: core.Input }], perView: [{ type: core.Input }] }; return NgslCarouselComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var NgslCarouselModule = /** @class */ (function () { function NgslCarouselModule() { } NgslCarouselModule.decorators = [ { type: core.NgModule, args: [{ imports: [ common.CommonModule ], declarations: [ NgslCarouselComponent, NgslCarouselItemDirective, NgslCarouselDotDirective, CarouselItemElement, CarouselDotElement ], exports: [ NgslCarouselComponent, NgslCarouselItemDirective, NgslCarouselDotDirective, CarouselItemElement, CarouselDotElement ] },] } ]; return NgslCarouselModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ exports.NgslCarouselModule = NgslCarouselModule; exports.ɵe = NgslCarouselDotDirective; exports.ɵd = NgslCarouselItemDirective; exports.ɵb = CarouselDotElement; exports.ɵa = CarouselItemElement; exports.ɵc = NgslCarouselComponent; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdzbC1jYXJvdXNlbC51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL25nc2wtY2Fyb3VzZWwvc3JjL2FwcC9uZ3NsLWNhcm91c2VsL25nc2wtY2Fyb3VzZWwtaXRlbS5kaXJlY3RpdmUudHMiLCJuZzovL25nc2wtY2Fyb3VzZWwvc3JjL2FwcC9uZ3NsLWNhcm91c2VsL25nc2wtY2Fyb3VzZWwtZG90LmRpcmVjdGl2ZS50cyIsIm5nOi8vbmdzbC1jYXJvdXNlbC9zcmMvYXBwL25nc2wtY2Fyb3VzZWwvbmdzbC1jYXJvdXNlbC5jb21wb25lbnQudHMiLCJuZzovL25nc2wtY2Fyb3VzZWwvc3JjL2FwcC9uZ3NsLWNhcm91c2VsL25nc2wtY2Fyb3VzZWwubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbbmdzbENhcm91c2VsSXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHBsOiBUZW1wbGF0ZVJlZjxhbnk+KSB7fVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tuZ3NsQ2Fyb3VzZWxEb3RdJ1xufSlcbmV4cG9ydCBjbGFzcyBOZ3NsQ2Fyb3VzZWxEb3REaXJlY3RpdmUge1xuICBpc1Zpc2libGUgPSB0cnVlO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHBsOiBUZW1wbGF0ZVJlZjxhbnk+KSB7fVxufVxuIiwiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL25nc2wtY2Fyb3VzZWwtaXRlbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTmdzbENhcm91c2VsRG90RGlyZWN0aXZlIH0gZnJvbSAnLi9uZ3NsLWNhcm91c2VsLWRvdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgYW5pbWF0ZSxcbiAgQW5pbWF0aW9uQnVpbGRlcixcbiAgQW5pbWF0aW9uRmFjdG9yeSxcbiAgQW5pbWF0aW9uUGxheWVyLFxuICBzdHlsZVxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuQERpcmVjdGl2ZSh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICcubmdzbC1jYXJvdXNlbC1pdGVtLWRpcmVjdGl2ZSdcbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIENhcm91c2VsSXRlbUVsZW1lbnQge31cbkBEaXJlY3RpdmUoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnLm5nc2wtY2Fyb3VzZWwtZG90LWRpcmVjdGl2ZSdcbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIENhcm91c2VsRG90RWxlbWVudCB7fVxuXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ25nc2wtY2Fyb3VzZWwnLFxuICBleHBvcnRBczogJ25nc2wtY2Fyb3VzZWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmdzbC1jYXJvdXNlbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25nc2wtY2Fyb3VzZWwuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3NsQ2Fyb3VzZWxDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgLyogY2Fyb3VzZWwgc3RhcnQgaXRlbSAqL1xuICBAQ29udGVudENoaWxkcmVuKE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmUpIGl0ZW1zOiBRdWVyeUxpc3Q8TmdzbENhcm91c2VsSXRlbURpcmVjdGl2ZT47XG4gIEBWaWV3Q2hpbGRyZW4oQ2Fyb3VzZWxJdGVtRWxlbWVudCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgaXRlbXNFbGVtZW50czogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkKCd0cmFjaycpIHByaXZhdGUgY2Fyb3VzZWw6IEVsZW1lbnRSZWY7XG4gIC8qIGNhcm91c2VsIGVuZCBpdGVtICovXG5cbiAgLyogY2Fyb3VzZWwgc3RhcnQgZG90ICovXG4gIEBDb250ZW50Q2hpbGRyZW4oTmdzbENhcm91c2VsRG90RGlyZWN0aXZlKSBkb3RzTGlzdDogUXVlcnlMaXN0PE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZT47XG4gIEBWaWV3Q2hpbGRyZW4oQ2Fyb3VzZWxEb3RFbGVtZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgcHJpdmF0ZSBkb3RFbGVtZW50czogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkKCdkb3RUcmFjaycpIHByaXZhdGUgZG90VHJhY2s6IEVsZW1lbnRSZWY7XG4gIC8qIGNhcm91c2VsIGVuZCBkb3QgKi9cblxuICAvKiBJbnB1dCBwcm9wcyBzdGFydCovXG4gIEBJbnB1dCgpIHRpbWluZyA9IDQ1MDtcbiAgQElucHV0KCkgcmV3aW5kVGltaW5nID0gOTAwO1xuICBASW5wdXQoKSBhcnJvd3MgPSB0cnVlO1xuICBASW5wdXQoKSBkb3RzID0gdHJ1ZTtcbiAgQElucHV0KCkgaW5maW5pdHkgPSB0cnVlO1xuICBASW5wdXQoKSBkeW5hbWljVGltaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGF1dG9wbGF5ID0gdHJ1ZTtcbiAgQElucHV0KCkgcGVyVmlldyA9IDE7XG4gIC8qIElucHV0IHByb3BzIGVuZCovXG4gIHByaXZhdGUgcGxheWVyOiBBbmltYXRpb25QbGF5ZXI7XG4gIHByaXZhdGUgYWN0aW9uID0gbnVsbDtcbiAgY3VycmVudFNsaWRlID0gMDtcbiAgcHJldlNsaWRlID0gbnVsbDtcbiAgbmV4dFNsaWRlID0gbnVsbDtcbiAgdHJhY2tXaWR0aCA9IHt9O1xuXG4gIHByaXZhdGUgYnVpbGRBbmltYXRpb24ob2Zmc2V0KSB7XG4gICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmFjdGlvbiA9PT0gJ1JFV0lORCcgPyB0aGlzLnJld2luZFRpbWluZyA6IHRoaXMudGltaW5nO1xuICAgIHJldHVybiB0aGlzLmJ1aWxkZXIuYnVpbGQoW1xuICAgICAgYW5pbWF0ZShgJHtkdXJhdGlvbn1tcyBjdWJpYy1iZXppZXIoMC4xNjUsIDAuODQwLCAwLjQ0MCwgMS4wMDApYCwgc3R5bGUoeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGVYKCR7b2Zmc2V0fSUpYCB9KSlcbiAgICBdKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hhbmdlU2xpZGUoYWN0aW9uKSB7XG4gICAgdGhpcy5zZXRTbGlkZXNJbmRleCgpO1xuICAgIGNvbnN0IGl0ZW1XID0gKDEwMCAvIHRoaXMuaXRlbXMubGVuZ3RoKSAvIHRoaXMucGVyVmlldztcbiAgICBjb25zdCBvZmZzZXQgPSAoaXRlbVcgKiB0aGlzLmN1cnJlbnRTbGlkZSkgKiB0aGlzLnBlclZpZXc7XG4gICAgY29uc3QgbXlBbmltYXRpb246IEFuaW1hdGlvbkZhY3RvcnkgPSB0aGlzLmJ1aWxkQW5pbWF0aW9uKC1vZmZzZXQpO1xuICAgIHRoaXMucGxheWVyID0gbXlBbmltYXRpb24uY3JlYXRlKHRoaXMuY2Fyb3VzZWwubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy5wbGF5ZXIucGxheSgpO1xuICAgIC8vIGNvbnNvbGUubG9nKGBjaGFuZ2VTbGlkZSBhY3Rpb246ICR7YWN0aW9ufSwgaXMgY3VycmVudCBzbGlkZTogYCwgdGhpcy5jdXJyZW50U2xpZGUgKyAxKTtcbiAgfVxuXG4gIGdvVG9TbGlkZShpbmRleCkge1xuICAgIGlmICh0aGlzLmR5bmFtaWNUaW1pbmcpIHtcbiAgICAgIC8vIMOQwpIgw5HCgMOQwrDDkMK3w5HCgMOQwrDDkMKxw5DCvsORwoLDkMK6w5DCtSwgw5HCgsOQwrXDkcKBw5HCgsOQwr7DkMKyw5DCsMORwo8gw5DCvsOQwr/DkcKGw5DCuMORwo9cbiAgICAgIHRoaXMudGltaW5nID0gdGhpcy50aW1pbmcgKyAoNTUgKiAoaW5kZXggLSB0aGlzLmN1cnJlbnRTbGlkZSkpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRTbGlkZSA9IGluZGV4O1xuICAgIHRoaXMuY2hhbmdlU2xpZGUoJ2dvIHRvIHNsaWRlJyk7XG4gIH1cblxuICBuZXh0KCkge1xuICAgIGNvbnN0IGNvdW50U2xpZGVzID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgaWYgKHRoaXMuY3VycmVudFNsaWRlICsgMSA9PT0gY291bnRTbGlkZXMgJiYgdGhpcy5pbmZpbml0eSkge1xuICAgICAgdGhpcy5jdXJyZW50U2xpZGUgPSAwO1xuICAgICAgdGhpcy5hY3Rpb24gPSAnUkVXSU5EJztcbiAgICAgIHRoaXMuY2hhbmdlU2xpZGUoJ3Jld2luZCB0byBmaXJzdCBzbGlkZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50U2xpZGUgKyAxID09PSBjb3VudFNsaWRlcyAmJiAhdGhpcy5pbmZpbml0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFNsaWRlKys7XG4gICAgdGhpcy5hY3Rpb24gPSAnTkVYVF9TTElERSc7XG4gICAgdGhpcy5jaGFuZ2VTbGlkZSgnbmV4dCBzbGlkZScpO1xuICB9XG5cbiAgcHJldigpIHtcbiAgICBjb25zdCBjb3VudFNsaWRlcyA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgIGlmICh0aGlzLmN1cnJlbnRTbGlkZSA9PT0gMCAmJiB0aGlzLmluZmluaXR5KSB7XG4gICAgICB0aGlzLmN1cnJlbnRTbGlkZSA9IGNvdW50U2xpZGVzIC0gMTtcbiAgICAgIHRoaXMuYWN0aW9uID0gJ1JFV0lORCc7XG4gICAgICB0aGlzLmNoYW5nZVNsaWRlKCdyZXdpbmQgdG8gbGFzdCBzbGlkZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50U2xpZGUgPT09IDAgJiYgIXRoaXMuaW5maW5pdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRTbGlkZS0tO1xuICAgIHRoaXMuYWN0aW9uID0gJ1BSRVZfU0xJREUnO1xuICAgIHRoaXMuY2hhbmdlU2xpZGUoJ3ByZXYgc2xpZGUnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U2xpZGVzSW5kZXgoKSB7XG4gICAgdGhpcy5wcmV2U2xpZGUgPSB0aGlzLmN1cnJlbnRTbGlkZSA9PT0gMCA/IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSA6IHRoaXMuY3VycmVudFNsaWRlIC0gMTtcbiAgICB0aGlzLm5leHRTbGlkZSA9IHRoaXMuY3VycmVudFNsaWRlID09PSB0aGlzLml0ZW1zLmxlbmd0aCAtIDEgPyAwIDogdGhpcy5jdXJyZW50U2xpZGUgKyAxO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEb3RzSW5Eb21FbGVtZW50cygpIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucGVyVmlldyA+IDEgPyB0aGlzLmRvdHNMaXN0Lmxlbmd0aCAtIHRoaXMucGVyVmlldyA6IG51bGw7XG4gICAgdGhpcy5kb3RzTGlzdC50b0FycmF5KCkuZm9yRWFjaCgoZG90LCBpKSA9PiB7XG4gICAgICBpZiAoaSA+IHBvc2l0aW9uKSB7IGRvdC5pc1Zpc2libGUgPSBmYWxzZTsgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbml0VmFsdWVzKCkge1xuICAgIHRoaXMuc2V0U2xpZGVzSW5kZXgoKTtcbiAgICBpZiAodGhpcy5wZXJWaWV3ID4gMSkge1xuICAgICAgdGhpcy5yZW1vdmVEb3RzSW5Eb21FbGVtZW50cygpO1xuICAgIH1cbiAgICB0aGlzLnRyYWNrV2lkdGggPSB7XG4gICAgICB3aWR0aDogYCR7KDEwMCAqIHRoaXMuaXRlbXMubGVuZ3RoKSAvIHRoaXMucGVyVmlld30lYFxuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJ1aWxkZXI6IEFuaW1hdGlvbkJ1aWxkZXIpIHt9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuc2V0SW5pdFZhbHVlcygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nc2xDYXJvdXNlbENvbXBvbmVudCwgQ2Fyb3VzZWxJdGVtRWxlbWVudCwgQ2Fyb3VzZWxEb3RFbGVtZW50IH0gZnJvbSAnLi9uZ3NsLWNhcm91c2VsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi9uZ3NsLWNhcm91c2VsLWl0ZW0uZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSB9IGZyb20gJy4vbmdzbC1jYXJvdXNlbC1kb3QuZGlyZWN0aXZlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBOZ3NsQ2Fyb3VzZWxDb21wb25lbnQsXG4gICAgTmdzbENhcm91c2VsSXRlbURpcmVjdGl2ZSxcbiAgICBOZ3NsQ2Fyb3VzZWxEb3REaXJlY3RpdmUsXG4gICAgQ2Fyb3VzZWxJdGVtRWxlbWVudCxcbiAgICBDYXJvdXNlbERvdEVsZW1lbnRcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIE5nc2xDYXJvdXNlbENvbXBvbmVudCxcbiAgICBOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlLFxuICAgIE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSxcbiAgICBDYXJvdXNlbEl0ZW1FbGVtZW50LFxuICAgIENhcm91c2VsRG90RWxlbWVudFxuICBdXG5cbn0pXG5leHBvcnQgY2xhc3MgTmdzbENhcm91c2VsTW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbIkRpcmVjdGl2ZSIsIlRlbXBsYXRlUmVmIiwiYW5pbWF0ZSIsInN0eWxlIiwiQ29tcG9uZW50IiwiQW5pbWF0aW9uQnVpbGRlciIsIkNvbnRlbnRDaGlsZHJlbiIsIlZpZXdDaGlsZHJlbiIsIkVsZW1lbnRSZWYiLCJWaWV3Q2hpbGQiLCJJbnB1dCIsIk5nTW9kdWxlIiwiQ29tbW9uTW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7UUFPRSxtQ0FBbUIsR0FBcUI7WUFBckIsUUFBRyxHQUFILEdBQUcsQ0FBa0I7U0FBSTs7b0JBTDdDQSxjQUFTLFNBQUM7O3dCQUVULFFBQVEsRUFBRSxvQkFBb0I7cUJBQy9COzs7Ozt3QkFMbUJDLGdCQUFXOzs7d0NBQS9COzs7Ozs7O0FDQUE7UUFRRSxrQ0FBbUIsR0FBcUI7WUFBckIsUUFBRyxHQUFILEdBQUcsQ0FBa0I7NkJBRDVCLElBQUk7U0FDNEI7O29CQU43Q0QsY0FBUyxTQUFDOzt3QkFFVCxRQUFRLEVBQUUsbUJBQW1CO3FCQUM5Qjs7Ozs7d0JBTG1CQyxnQkFBVzs7O3VDQUEvQjs7Ozs7OztBQ0FBOzs7O29CQXNCQ0QsY0FBUyxTQUFDOzt3QkFFVCxRQUFRLEVBQUUsK0JBQStCO3FCQUMxQzs7a0NBekJEOzs7Ozs7b0JB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