@taiga-ui/kit
Version:
Taiga UI Angular main components kit
166 lines • 28.4 kB
JavaScript
import { __decorate } from "tslib";
import { AsyncPipe, NgForOf, NgIf, NgTemplateOutlet } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, EventEmitter, inject, Input, Output, TemplateRef, } from '@angular/core';
import { WaIntersectionObserver } from '@ng-web-apis/intersection-observer';
import { EMPTY_QUERY } from '@taiga-ui/cdk/constants';
import { TuiItem } from '@taiga-ui/cdk/directives/item';
import { TuiPan } from '@taiga-ui/cdk/directives/pan';
import { TUI_SWIPE_OPTIONS, TuiSwipe, } from '@taiga-ui/cdk/directives/swipe';
import { TUI_IS_MOBILE } from '@taiga-ui/cdk/tokens';
import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { tuiClamp } from '@taiga-ui/cdk/utils/math';
import { tuiPure } from '@taiga-ui/cdk/utils/miscellaneous';
import { TuiCarouselDirective } from './carousel.directive';
import { TuiCarouselAutoscroll } from './carousel-autoscroll.directive';
import { TuiCarouselScroll } from './carousel-scroll.directive';
import * as i0 from "@angular/core";
import * as i1 from "./carousel.directive";
import * as i2 from "@ng-web-apis/intersection-observer";
class TuiCarouselComponent {
constructor() {
this.el = tuiInjectElement();
this.cdr = inject(ChangeDetectorRef);
this.isMobile = inject(TUI_IS_MOBILE);
this.directive = inject(TuiCarouselDirective);
this.translate = 0;
this.items = EMPTY_QUERY;
this.transitioned = true;
this.index = 0;
this.draggable = false;
this.itemsCount = 1;
this.indexChange = new EventEmitter();
this.shift = new EventEmitter();
}
set indexSetter(index) {
this.index = index;
this.directive.duration = NaN;
}
next() {
if (this.items && this.index === this.items.length - this.itemsCount) {
return;
}
this.updateIndex(this.index + 1);
}
prev() {
this.updateIndex(this.index - 1);
}
get transform() {
return `translateX(${100 * this.x}%)`;
}
getStyle(itemsCount) {
const percent = `${100 / itemsCount}%`;
return {
flexBasis: percent,
minWidth: percent,
maxWidth: percent,
};
}
onTransitioned(transitioned) {
this.transitioned = transitioned;
if (!transitioned) {
this.translate = this.computedTranslate;
}
this.onShift();
}
isDisabled(index) {
return index < this.index || index >= this.index + this.itemsCount;
}
onIntersection({ intersectionRatio }, index) {
if (intersectionRatio && intersectionRatio >= 0.5 && !this.transitioned) {
this.updateIndex(this.index < index ? index - this.itemsCount + 1 : index);
}
}
onScroll(delta) {
if (!this.isMobile) {
if (delta > 0) {
this.next();
}
else {
this.prev();
}
}
}
onPan(x) {
if (!this.computedDraggable) {
return;
}
const min = 1 - this.items.length / this.itemsCount;
this.translate = tuiClamp(x / this.el.clientWidth + this.translate, min, 0);
this.onShift();
}
onSwipe(direction) {
if (direction === 'left') {
this.next();
}
else if (direction === 'right') {
this.prev();
}
}
onAutoscroll() {
this.updateIndex(this.index === this.items.length - 1 ? 0 : this.index + 1);
}
onShift() {
this.shift.emit(Math.abs((this.x % 1) + 0.5) * 2);
}
get x() {
return this.transitioned ? this.computedTranslate : this.translate;
}
get computedTranslate() {
return -this.index / this.itemsCount;
}
get computedDraggable() {
return this.isMobile || this.draggable;
}
updateIndex(index) {
this.index = tuiClamp(index, 0, this.items.length - 1);
this.indexChange.emit(this.index);
this.cdr.markForCheck();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiCarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiCarouselComponent, isStandalone: true, selector: "tui-carousel", inputs: { draggable: "draggable", itemsCount: "itemsCount", indexSetter: ["index", "indexSetter"] }, outputs: { indexChange: "indexChange", shift: "shift" }, host: { listeners: { "touchstart": "onTransitioned(false)", "touchend": "onTransitioned(true)", "mousedown": "onTransitioned(false)", "document:mouseup.zoneless": "onTransitioned(true)" }, properties: { "class._transitioned": "transitioned", "class._draggable": "draggable" } }, providers: [{ provide: TUI_SWIPE_OPTIONS, useValue: { timeout: 200, threshold: 30 } }], queries: [{ propertyName: "items", predicate: TuiItem, read: TemplateRef }], hostDirectives: [{ directive: i1.TuiCarouselDirective, inputs: ["duration", "duration"] }], ngImport: i0, template: "<ng-container *ngIf=\"items.changes | async\" />\n<div\n class=\"t-scroller\"\n (tuiCarouselScroll)=\"onScroll($event)\"\n>\n <div\n waIntersectionObserver\n waIntersectionThreshold=\"0.5\"\n class=\"t-wrapper\"\n >\n <div\n class=\"t-items\"\n [style.transform]=\"transform\"\n (tuiCarouselAutoscroll)=\"onAutoscroll()\"\n (tuiPan)=\"onPan($event[0])\"\n (tuiSwipe)=\"onSwipe($event.direction)\"\n >\n <fieldset\n *ngFor=\"let item of items; let i = index\"\n class=\"t-item\"\n [disabled]=\"isDisabled(i)\"\n [style]=\"getStyle(itemsCount)\"\n (waIntersectionObservee)=\"$event[0] && onIntersection($event[0], i)\"\n >\n <ng-container [ngTemplateOutlet]=\"item\" />\n </fieldset>\n </div>\n </div>\n</div>\n\n<ng-content />\n", styles: [":host{position:relative;display:block;overflow:hidden}:host._draggable{-webkit-user-select:none;user-select:none}:host._draggable:hover{cursor:grab}:host._draggable:active{cursor:grabbing}.t-items{display:flex}:host._transitioned .t-items{transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out}::ng-deep [tuiCarouselButtons] [tuiIconButton]{border-radius:100%}.t-item{display:flex;flex-direction:column;justify-content:center;padding:var(--tui-carousel-padding, 0 1.25rem);flex:1;min-inline-size:100%;max-inline-size:100%;box-sizing:border-box;border:none;margin:0}.t-wrapper{position:sticky;left:0;right:0;min-inline-size:100%;overflow:hidden}.t-scroller{scrollbar-width:none;-ms-overflow-style:none;display:flex;overflow:auto;overscroll-behavior-x:none;touch-action:pan-y}.t-scroller::-webkit-scrollbar,.t-scroller::-webkit-scrollbar-thumb{display:none}.t-scroller:before,.t-scroller:after{content:\"\";display:block;min-inline-size:1rem}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TuiCarouselAutoscroll, selector: "[tuiCarouselAutoscroll]", outputs: ["tuiCarouselAutoscroll"] }, { kind: "directive", type: TuiCarouselScroll, selector: "[tuiCarouselScroll]", outputs: ["tuiCarouselScroll"] }, { kind: "directive", type: TuiPan, selector: "[tuiPan]", outputs: ["tuiPan"] }, { kind: "directive", type: TuiSwipe, selector: "[tuiSwipe]", outputs: ["tuiSwipe"] }, { kind: "directive", type: i2.WaIntersectionObserverDirective, selector: "[waIntersectionObserver]", inputs: ["waIntersectionRootMargin", "waIntersectionThreshold"], exportAs: ["IntersectionObserver"] }, { kind: "directive", type: i2.WaIntersectionObservee, selector: "[waIntersectionObservee]", outputs: ["waIntersectionObservee"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
__decorate([
tuiPure
], TuiCarouselComponent.prototype, "getStyle", null);
export { TuiCarouselComponent };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiCarouselComponent, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'tui-carousel', imports: [
AsyncPipe,
NgForOf,
NgIf,
NgTemplateOutlet,
TuiCarouselAutoscroll,
TuiCarouselScroll,
TuiPan,
TuiSwipe,
WaIntersectionObserver,
], changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: TUI_SWIPE_OPTIONS, useValue: { timeout: 200, threshold: 30 } }], hostDirectives: [
{
directive: TuiCarouselDirective,
inputs: ['duration'],
},
], host: {
'[class._transitioned]': 'transitioned',
'[class._draggable]': 'draggable',
'(touchstart)': 'onTransitioned(false)',
'(touchend)': 'onTransitioned(true)',
'(mousedown)': 'onTransitioned(false)',
'(document:mouseup.zoneless)': 'onTransitioned(true)',
}, template: "<ng-container *ngIf=\"items.changes | async\" />\n<div\n class=\"t-scroller\"\n (tuiCarouselScroll)=\"onScroll($event)\"\n>\n <div\n waIntersectionObserver\n waIntersectionThreshold=\"0.5\"\n class=\"t-wrapper\"\n >\n <div\n class=\"t-items\"\n [style.transform]=\"transform\"\n (tuiCarouselAutoscroll)=\"onAutoscroll()\"\n (tuiPan)=\"onPan($event[0])\"\n (tuiSwipe)=\"onSwipe($event.direction)\"\n >\n <fieldset\n *ngFor=\"let item of items; let i = index\"\n class=\"t-item\"\n [disabled]=\"isDisabled(i)\"\n [style]=\"getStyle(itemsCount)\"\n (waIntersectionObservee)=\"$event[0] && onIntersection($event[0], i)\"\n >\n <ng-container [ngTemplateOutlet]=\"item\" />\n </fieldset>\n </div>\n </div>\n</div>\n\n<ng-content />\n", styles: [":host{position:relative;display:block;overflow:hidden}:host._draggable{-webkit-user-select:none;user-select:none}:host._draggable:hover{cursor:grab}:host._draggable:active{cursor:grabbing}.t-items{display:flex}:host._transitioned .t-items{transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out}::ng-deep [tuiCarouselButtons] [tuiIconButton]{border-radius:100%}.t-item{display:flex;flex-direction:column;justify-content:center;padding:var(--tui-carousel-padding, 0 1.25rem);flex:1;min-inline-size:100%;max-inline-size:100%;box-sizing:border-box;border:none;margin:0}.t-wrapper{position:sticky;left:0;right:0;min-inline-size:100%;overflow:hidden}.t-scroller{scrollbar-width:none;-ms-overflow-style:none;display:flex;overflow:auto;overscroll-behavior-x:none;touch-action:pan-y}.t-scroller::-webkit-scrollbar,.t-scroller::-webkit-scrollbar-thumb{display:none}.t-scroller:before,.t-scroller:after{content:\"\";display:block;min-inline-size:1rem}\n"] }]
}], propDecorators: { items: [{
type: ContentChildren,
args: [TuiItem, { read: TemplateRef }]
}], draggable: [{
type: Input
}], itemsCount: [{
type: Input
}], indexChange: [{
type: Output
}], shift: [{
type: Output
}], indexSetter: [{
type: Input,
args: ['index']
}], getStyle: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2Fyb3VzZWwvY2Fyb3VzZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2Fyb3VzZWwvY2Fyb3VzZWwudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBRU4sV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDdEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3BELE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsUUFBUSxHQUVYLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFFMUQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDdEUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7Ozs7QUFFOUQsTUFpQ2Esb0JBQW9CO0lBakNqQztRQWtDcUIsT0FBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hDLGFBQVEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakMsY0FBUyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2xELGNBQVMsR0FBRyxDQUFDLENBQUM7UUFHSCxVQUFLLEdBQ3BCLFdBQVcsQ0FBQztRQUVOLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXBCLFVBQUssR0FBRyxDQUFDLENBQUM7UUFHYixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBR2xCLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFHTixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFHekMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7S0FpSHREO0lBL0dHLElBQ1csV0FBVyxDQUFDLEtBQWE7UUFDaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxJQUFJO1FBQ1AsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNsRSxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLElBQUk7UUFDUCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELElBQWMsU0FBUztRQUNuQixPQUFPLGNBQWMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMxQyxDQUFDO0lBR1MsUUFBUSxDQUFDLFVBQWtCO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLFVBQVUsR0FBRyxDQUFDO1FBRXZDLE9BQU87WUFDSCxTQUFTLEVBQUUsT0FBTztZQUNsQixRQUFRLEVBQUUsT0FBTztZQUNqQixRQUFRLEVBQUUsT0FBTztTQUNwQixDQUFDO0lBQ04sQ0FBQztJQUVTLGNBQWMsQ0FBQyxZQUFxQjtRQUMxQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUVqQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVTLFVBQVUsQ0FBQyxLQUFhO1FBQzlCLE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN2RSxDQUFDO0lBRVMsY0FBYyxDQUNwQixFQUFDLGlCQUFpQixFQUE0QixFQUM5QyxLQUFhO1FBRWIsSUFBSSxpQkFBaUIsSUFBSSxpQkFBaUIsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDOUU7SUFDTCxDQUFDO0lBRVMsUUFBUSxDQUFDLEtBQWE7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUNYLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNmO2lCQUFNO2dCQUNILElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNmO1NBQ0o7SUFDTCxDQUFDO0lBRVMsS0FBSyxDQUFDLENBQVM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN6QixPQUFPO1NBQ1Y7UUFFRCxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUVwRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFUyxPQUFPLENBQUMsU0FBNEI7UUFDMUMsSUFBSSxTQUFTLEtBQUssTUFBTSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNmO2FBQU0sSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQzlCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVTLFlBQVk7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFUyxPQUFPO1FBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELElBQVksQ0FBQztRQUNULE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxJQUFZLGlCQUFpQjtRQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFZLGlCQUFpQjtRQUN6QixPQUFPLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QixDQUFDOytHQXpJUSxvQkFBb0I7bUdBQXBCLG9CQUFvQixnZkFoQmxCLENBQUMsRUFBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFDLEVBQUMsQ0FBQyxnREF1QmpFLE9BQU8sUUFBUyxXQUFXLHlIQ3ZFaEQsbzhCQStCQSw4aENESVEsU0FBUyw4Q0FDVCxPQUFPLG1IQUNQLElBQUksNkZBQ0osZ0JBQWdCLG9KQUNoQixxQkFBcUIsd0dBQ3JCLGlCQUFpQixnR0FDakIsTUFBTSwwRUFDTixRQUFROztBQXdFRjtJQURULE9BQU87b0RBU1A7U0ExRFEsb0JBQW9COzRGQUFwQixvQkFBb0I7a0JBakNoQyxTQUFTO2lDQUNNLElBQUksWUFDTixjQUFjLFdBQ2Y7d0JBQ0wsU0FBUzt3QkFDVCxPQUFPO3dCQUNQLElBQUk7d0JBQ0osZ0JBQWdCO3dCQUNoQixxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIsTUFBTTt3QkFDTixRQUFRO3dCQUNSLHNCQUFzQjtxQkFDekIsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUMsRUFBQyxDQUFDLGtCQUNsRTt3QkFDWjs0QkFDSSxTQUFTLEVBQUUsb0JBQW9COzRCQUMvQixNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUM7eUJBQ3ZCO3FCQUNKLFFBQ0s7d0JBQ0YsdUJBQXVCLEVBQUUsY0FBYzt3QkFDdkMsb0JBQW9CLEVBQUUsV0FBVzt3QkFDakMsY0FBYyxFQUFFLHVCQUF1Qjt3QkFDdkMsWUFBWSxFQUFFLHNCQUFzQjt3QkFDcEMsYUFBYSxFQUFFLHVCQUF1Qjt3QkFDdEMsNkJBQTZCLEVBQUUsc0JBQXNCO3FCQUN4RDs4QkFVa0IsS0FBSztzQkFEdkIsZUFBZTt1QkFBQyxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFDO2dCQVN0QyxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsVUFBVTtzQkFEaEIsS0FBSztnQkFJVSxXQUFXO3NCQUQxQixNQUFNO2dCQUlTLEtBQUs7c0JBRHBCLE1BQU07Z0JBSUksV0FBVztzQkFEckIsS0FBSzt1QkFBQyxPQUFPO2dCQXVCSixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBc3luY1BpcGUsIE5nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgdHlwZSBRdWVyeUxpc3QsXG4gICAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXYUludGVyc2VjdGlvbk9ic2VydmVyfSBmcm9tICdAbmctd2ViLWFwaXMvaW50ZXJzZWN0aW9uLW9ic2VydmVyJztcbmltcG9ydCB7RU1QVFlfUVVFUll9IGZyb20gJ0B0YWlnYS11aS9jZGsvY29uc3RhbnRzJztcbmltcG9ydCB7VHVpSXRlbX0gZnJvbSAnQHRhaWdhLXVpL2Nkay9kaXJlY3RpdmVzL2l0ZW0nO1xuaW1wb3J0IHtUdWlQYW59IGZyb20gJ0B0YWlnYS11aS9jZGsvZGlyZWN0aXZlcy9wYW4nO1xuaW1wb3J0IHtcbiAgICBUVUlfU1dJUEVfT1BUSU9OUyxcbiAgICBUdWlTd2lwZSxcbiAgICB0eXBlIFR1aVN3aXBlRGlyZWN0aW9uLFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RpcmVjdGl2ZXMvc3dpcGUnO1xuaW1wb3J0IHtUVUlfSVNfTU9CSUxFfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3Rva2Vucyc7XG5pbXBvcnQge3R1aUluamVjdEVsZW1lbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvZG9tJztcbmltcG9ydCB7dHVpQ2xhbXB9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWF0aCc7XG5pbXBvcnQge3R1aVB1cmV9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5cbmltcG9ydCB7VHVpQ2Fyb3VzZWxEaXJlY3RpdmV9IGZyb20gJy4vY2Fyb3VzZWwuZGlyZWN0aXZlJztcbmltcG9ydCB7VHVpQ2Fyb3VzZWxBdXRvc2Nyb2xsfSBmcm9tICcuL2Nhcm91c2VsLWF1dG9zY3JvbGwuZGlyZWN0aXZlJztcbmltcG9ydCB7VHVpQ2Fyb3VzZWxTY3JvbGx9IGZyb20gJy4vY2Fyb3VzZWwtc2Nyb2xsLmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICd0dWktY2Fyb3VzZWwnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBOZ0Zvck9mLFxuICAgICAgICBOZ0lmLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBUdWlDYXJvdXNlbEF1dG9zY3JvbGwsXG4gICAgICAgIFR1aUNhcm91c2VsU2Nyb2xsLFxuICAgICAgICBUdWlQYW4sXG4gICAgICAgIFR1aVN3aXBlLFxuICAgICAgICBXYUludGVyc2VjdGlvbk9ic2VydmVyLFxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Nhcm91c2VsLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2Nhcm91c2VsLnN0eWxlLmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVFVJX1NXSVBFX09QVElPTlMsIHVzZVZhbHVlOiB7dGltZW91dDogMjAwLCB0aHJlc2hvbGQ6IDMwfX1dLFxuICAgIGhvc3REaXJlY3RpdmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZTogVHVpQ2Fyb3VzZWxEaXJlY3RpdmUsXG4gICAgICAgICAgICBpbnB1dHM6IFsnZHVyYXRpb24nXSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy5fdHJhbnNpdGlvbmVkXSc6ICd0cmFuc2l0aW9uZWQnLFxuICAgICAgICAnW2NsYXNzLl9kcmFnZ2FibGVdJzogJ2RyYWdnYWJsZScsXG4gICAgICAgICcodG91Y2hzdGFydCknOiAnb25UcmFuc2l0aW9uZWQoZmFsc2UpJyxcbiAgICAgICAgJyh0b3VjaGVuZCknOiAnb25UcmFuc2l0aW9uZWQodHJ1ZSknLFxuICAgICAgICAnKG1vdXNlZG93biknOiAnb25UcmFuc2l0aW9uZWQoZmFsc2UpJyxcbiAgICAgICAgJyhkb2N1bWVudDptb3VzZXVwLnpvbmVsZXNzKSc6ICdvblRyYW5zaXRpb25lZCh0cnVlKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpQ2Fyb3VzZWxDb21wb25lbnQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZWwgPSB0dWlJbmplY3RFbGVtZW50KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNNb2JpbGUgPSBpbmplY3QoVFVJX0lTX01PQklMRSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXJlY3RpdmUgPSBpbmplY3QoVHVpQ2Fyb3VzZWxEaXJlY3RpdmUpO1xuICAgIHByaXZhdGUgdHJhbnNsYXRlID0gMDtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oVHVpSXRlbSwge3JlYWQ6IFRlbXBsYXRlUmVmfSlcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+ID1cbiAgICAgICAgRU1QVFlfUVVFUlk7XG5cbiAgICBwcm90ZWN0ZWQgdHJhbnNpdGlvbmVkID0gdHJ1ZTtcblxuICAgIHByb3RlY3RlZCBpbmRleCA9IDA7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkcmFnZ2FibGUgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW1zQ291bnQgPSAxO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IGluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2hpZnQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIEBJbnB1dCgnaW5kZXgnKVxuICAgIHB1YmxpYyBzZXQgaW5kZXhTZXR0ZXIoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlLmR1cmF0aW9uID0gTmFOO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pdGVtcyAmJiB0aGlzLmluZGV4ID09PSB0aGlzLml0ZW1zLmxlbmd0aCAtIHRoaXMuaXRlbXNDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVJbmRleCh0aGlzLmluZGV4ICsgMSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXYoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlSW5kZXgodGhpcy5pbmRleCAtIDEpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgdHJhbnNmb3JtKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlWCgkezEwMCAqIHRoaXMueH0lKWA7XG4gICAgfVxuXG4gICAgQHR1aVB1cmVcbiAgICBwcm90ZWN0ZWQgZ2V0U3R5bGUoaXRlbXNDb3VudDogbnVtYmVyKTogUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPiB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnQgPSBgJHsxMDAgLyBpdGVtc0NvdW50fSVgO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmbGV4QmFzaXM6IHBlcmNlbnQsXG4gICAgICAgICAgICBtaW5XaWR0aDogcGVyY2VudCxcbiAgICAgICAgICAgIG1heFdpZHRoOiBwZXJjZW50LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblRyYW5zaXRpb25lZCh0cmFuc2l0aW9uZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uZWQgPSB0cmFuc2l0aW9uZWQ7XG5cbiAgICAgICAgaWYgKCF0cmFuc2l0aW9uZWQpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlID0gdGhpcy5jb21wdXRlZFRyYW5zbGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub25TaGlmdCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc0Rpc2FibGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGluZGV4IDwgdGhpcy5pbmRleCB8fCBpbmRleCA+PSB0aGlzLmluZGV4ICsgdGhpcy5pdGVtc0NvdW50O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkludGVyc2VjdGlvbihcbiAgICAgICAge2ludGVyc2VjdGlvblJhdGlvfTogSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSxcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKGludGVyc2VjdGlvblJhdGlvICYmIGludGVyc2VjdGlvblJhdGlvID49IDAuNSAmJiAhdGhpcy50cmFuc2l0aW9uZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5kZXgodGhpcy5pbmRleCA8IGluZGV4ID8gaW5kZXggLSB0aGlzLml0ZW1zQ291bnQgKyAxIDogaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uU2Nyb2xsKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVsdGEgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uUGFuKHg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29tcHV0ZWREcmFnZ2FibGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pbiA9IDEgLSB0aGlzLml0ZW1zLmxlbmd0aCAvIHRoaXMuaXRlbXNDb3VudDtcblxuICAgICAgICB0aGlzLnRyYW5zbGF0ZSA9IHR1aUNsYW1wKHggLyB0aGlzLmVsLmNsaWVudFdpZHRoICsgdGhpcy50cmFuc2xhdGUsIG1pbiwgMCk7XG5cbiAgICAgICAgdGhpcy5vblNoaWZ0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uU3dpcGUoZGlyZWN0aW9uOiBUdWlTd2lwZURpcmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgdGhpcy5wcmV2KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25BdXRvc2Nyb2xsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZUluZGV4KHRoaXMuaW5kZXggPT09IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSA/IDAgOiB0aGlzLmluZGV4ICsgMSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uU2hpZnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hpZnQuZW1pdChNYXRoLmFicygodGhpcy54ICUgMSkgKyAwLjUpICogMik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgeCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uZWQgPyB0aGlzLmNvbXB1dGVkVHJhbnNsYXRlIDogdGhpcy50cmFuc2xhdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgY29tcHV0ZWRUcmFuc2xhdGUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIC10aGlzLmluZGV4IC8gdGhpcy5pdGVtc0NvdW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGNvbXB1dGVkRHJhZ2dhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc01vYmlsZSB8fCB0aGlzLmRyYWdnYWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbmRleCA9IHR1aUNsYW1wKGluZGV4LCAwLCB0aGlzLml0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgICB0aGlzLmluZGV4Q2hhbmdlLmVtaXQodGhpcy5pbmRleCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtcy5jaGFuZ2VzIHwgYXN5bmNcIiAvPlxuPGRpdlxuICAgIGNsYXNzPVwidC1zY3JvbGxlclwiXG4gICAgKHR1aUNhcm91c2VsU2Nyb2xsKT1cIm9uU2Nyb2xsKCRldmVudClcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgd2FJbnRlcnNlY3Rpb25PYnNlcnZlclxuICAgICAgICB3YUludGVyc2VjdGlvblRocmVzaG9sZD1cIjAuNVwiXG4gICAgICAgIGNsYXNzPVwidC13cmFwcGVyXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwidC1pdGVtc1wiXG4gICAgICAgICAgICBbc3R5bGUudHJhbnNmb3JtXT1cInRyYW5zZm9ybVwiXG4gICAgICAgICAgICAodHVpQ2Fyb3VzZWxBdXRvc2Nyb2xsKT1cIm9uQXV0b3Njcm9sbCgpXCJcbiAgICAgICAgICAgICh0dWlQYW4pPVwib25QYW4oJGV2ZW50WzBdKVwiXG4gICAgICAgICAgICAodHVpU3dpcGUpPVwib25Td2lwZSgkZXZlbnQuZGlyZWN0aW9uKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxmaWVsZHNldFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInQtaXRlbVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoaSlcIlxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJnZXRTdHlsZShpdGVtc0NvdW50KVwiXG4gICAgICAgICAgICAgICAgKHdhSW50ZXJzZWN0aW9uT2JzZXJ2ZWUpPVwiJGV2ZW50WzBdICYmIG9uSW50ZXJzZWN0aW9uKCRldmVudFswXSwgaSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVwiIC8+XG4gICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctY29udGVudCAvPlxuIl19