cocori-ng
Version:
Cocori-ng is an Angular full of great components & utilites based on Material
143 lines • 34.8 kB
JavaScript
import { moveItemInArray } from '@angular/cdk/drag-drop';
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef, } from '@angular/core';
import { InjectComponentService } from 'cocori-ng/src/feature-core';
import { Subject } from 'rxjs';
import { takeUntil, tap } from 'rxjs/operators';
import { CocoringCmsSectionComponent } from '../cocoring-cms-section/cocoring-cms-section.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/flex-layout";
import * as i2 from "../../../core/service/cms.service";
import * as i3 from "cocori-ng/src/feature-core";
import * as i4 from "@angular/common";
import * as i5 from "@angular/cdk/drag-drop";
import * as i6 from "@angular/material/sidenav";
import * as i7 from "@angular/flex-layout/extended";
import * as i8 from "../cocoring-cms-blocks-catalog/cocoring-cms-blocks-catalog.component";
import * as i9 from "../cocoring-toolbar-cms/cocoring-toolbar-cms.component";
// import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';
// import { MediaChange, MediaObserver } from '@angular/flex-layout';
export class CocoringCmsComponent {
constructor(mediaObserver, cdr, cmsService, injectComponentService) {
this.mediaObserver = mediaObserver;
this.cdr = cdr;
this.cmsService = cmsService;
this.injectComponentService = injectComponentService;
this.catalog = [];
this.orientation = 'column';
this._showSaveBtn = false;
this.importSections = [];
this.destroy$ = new Subject();
this.onSaveBtn = new EventEmitter();
this.responsive = 'computer';
this.activeMediaQuery = '';
this.sidenavMode = 'side';
this.isSidenavOpen = false;
this.totalSections = 0;
this.eventSizeScreen();
}
set config(config) {
if (!config) {
throw new Error(`La config du composant CMS n'est pas correcte... config: ${config}`);
}
this.configCms = config;
this.catalog = config.catalog;
this.cmsService.init();
}
set datas(sectionDatas) {
this.importSections = sectionDatas;
}
set showSaveBtn(data) {
this._showSaveBtn = data;
if (data) {
this.onPageSaved();
}
}
ngOnInit() {
this.addSectionEvent();
this.onSectionMoved();
/** on dessine les sections chargées ! */
if (this.importSections.length) {
this.importSections.forEach((section) => {
this.cmsService.addSection(section);
});
}
}
ngOnDestroy() {
this.destroy$.next(undefined);
this.destroy$.complete();
}
onPageSaved() {
this.cmsService.onSaveCmsContent$.pipe(takeUntil(this.destroy$)).subscribe((contentPage) => {
this.onSaveBtn.emit(contentPage);
});
}
eventSizeScreen() {
this.mediaObserver
.asObservable()
.pipe(takeUntil(this.destroy$)).subscribe((change) => {
change.forEach((item) => {
this.activeMediaQuery = item ? `'${item.mqAlias}' = (${item.mediaQuery})` : '';
if (item.mqAlias === 'xs') {
this.sidenavMode = 'over';
}
else {
this.sidenavMode = 'side';
}
});
});
}
toggleSidenavBlocks() {
this.sidenav.toggle();
this.isSidenavOpen = this.sidenav.opened;
this.cmsService.catalogBlocksOpened$.next(this.isSidenavOpen);
}
getPageCMSDatas() {
return this.cmsService.sectionsPageDatas();
}
addSectionEvent() {
this.cmsService.sectionAdded$.pipe(takeUntil(this.destroy$), tap(_ => this.refreshNumberSection()), tap((datas) => {
this.injectComponentService.loadAndAddComponentToContainer(CocoringCmsSectionComponent, this.containerRef, { section: datas.section, apisConfig: this.configCms.wysiwygOptions }, { afterRemoveAnimation: (sectionIndexRemoved) => this.onSectionRemovedAfterAnimation(sectionIndexRemoved) }, datas.index);
})).subscribe();
}
onSectionRemovedAfterAnimation(indexSectionRemoved) {
this.injectComponentService.removeComponentFromViewContainer(indexSectionRemoved, this.containerRef);
this.refreshNumberSection();
}
onSectionMoved() {
this.cmsService.moveSection$.pipe(takeUntil(this.destroy$), tap((values) => {
this.moveSectionContainer({ previousIndex: values.previousIndex, currentIndex: values.currentIndex });
})).subscribe();
}
refreshNumberSection() {
this.totalSections = this.cmsService.sections.length;
this.cdr.detectChanges();
}
dropSection(event) {
this.moveSectionContainer({ previousIndex: event.previousIndex, currentIndex: event.currentIndex });
}
moveSectionContainer(moveIndexes) {
moveItemInArray(this.cmsService.sections, moveIndexes.previousIndex, moveIndexes.currentIndex);
this.injectComponentService.moveComponentFromViewContainer(moveIndexes.currentIndex, moveIndexes.previousIndex, this.containerRef);
}
}
CocoringCmsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CocoringCmsComponent, deps: [{ token: i1.MediaObserver }, { token: i0.ChangeDetectorRef }, { token: i2.CmsService }, { token: i3.InjectComponentService }], target: i0.ɵɵFactoryTarget.Component });
CocoringCmsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.1", type: CocoringCmsComponent, selector: "cocoring-cms", inputs: { config: "config", datas: "datas", showSaveBtn: "showSaveBtn" }, outputs: { onSaveBtn: "onSaveBtn" }, providers: [InjectComponentService], viewQueries: [{ propertyName: "sidenav", first: true, predicate: ["sidenav"], descendants: true }, { propertyName: "containerRef", first: true, predicate: ["ContainerRef"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<div class=\"page\">\r\n <cocoring-toolbar-cms [showSaveBtn]=\"_showSaveBtn\" (toggleSidenav)=\"toggleSidenavBlocks()\"></cocoring-toolbar-cms>\r\n\r\n <div class=\"sidenav-container\">\r\n <mat-sidenav-container class=\"layout-container\" [hasBackdrop]=\"false\" fullscreen>\r\n <mat-sidenav class=\"sidenav-blocks-catalog\" #sidenav [mode]=\"sidenavMode\" position=\"end\" opened=\"false\">\r\n <cocoring-cms-blocks-catalog [catalog]=\"catalog\"></cocoring-cms-blocks-catalog>\r\n </mat-sidenav>\r\n <mat-sidenav-content [ngClass]=\"{'no-margin-right': isSidenavOpen && totalSections}\">\r\n <div class=\"sidenav-content\" [ngClass]=\"{'sidenav-openned': isSidenavOpen}\">\r\n <div *ngIf=\"!totalSections && !isSidenavOpen\" class=\"no-section\" (click)=\"toggleSidenavBlocks()\">\r\n <div>\r\n <h1>Customisez votre page facilement \uD83D\uDC4C </h1>\r\n <p>(cliquez ici pour composer votre page)</p>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isSidenavOpen && !totalSections\" class=\"col-elements\">\r\n <div class=\"texte-preview\">\r\n Aper\u00E7u de votre page\r\n </div>\r\n <div class=\"new-block\">\r\n <h1>Aucune section</h1>\r\n <p>cliquez sur un template pour l'ajouter</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"totalSections\" class=\"container-sections\" [ngClass]=\"{'col-elements': isSidenavOpen}\">\r\n <div class=\"blocks\" cdkDropList (cdkDropListDropped)=\"dropSection($event)\">\r\n <ng-template #ContainerRef></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n </div>\r\n</div>", styles: [":host{display:block;height:100%}.page{display:flex;flex-direction:column;height:100%}.page .sidenav-container{flex:1}.page .sidenav-container .layout-container{top:50px}.resolutions-group{border:0}.resolutions-group .mat-button-toggle-appearance-standard{background-color:transparent;color:#fff;border-left:0}.resolutions-group .mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:#2196f3}.resolutions-group ::ng-deep .mat-button-toggle-label-content{line-height:35px;padding:0 10px}.resolutions-group .material-icons{font-size:20px}.mat-drawer-content{background-color:#ecebeb;transition-property:none!important}.sidenav-content{display:flex;flex-direction:column;height:100%;transition-duration:.4s;transition-timing-function:cubic-bezier(.25,.8,.25,1);transition-property:transform,margin-left,margin-right}.sidenav-blocks-catalog{width:calc(75% - 25px);padding:20px 20px 0}.no-section{align-items:center;display:flex;justify-content:center;height:100%;cursor:pointer;text-align:center}.no-margin-right{margin-right:0!important}.container-sections{height:100%;padding-top:20px}.col-elements{overflow:hidden;background-color:#ecebeb}.col-elements .blocks{height:380%;overflow-y:auto;-webkit-transform:scale(.25);-moz-transform:scale(.25);-ms-transform:scale(.25);-o-transform:scale(.25);transform-origin:25px 25px;transition:transform .25s linear}.col-elements .new-block{display:flex;flex-direction:column;margin:20px;padding:0 5px;height:150px;background:#fff;border:solid 3px #f5f5f5;text-align:center;justify-content:center;position:relative}.col-elements .new-block h1{text-transform:uppercase;font-size:15px;margin-bottom:5px}.col-elements .new-block h1:after{content:\"\";display:block;margin:0 auto;width:20%;border-bottom:1px solid black}.texte-preview{text-transform:uppercase;font-size:18px;text-align:center;padding:10px 5px;margin:30px 22px 0}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "component", type: i6.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i6.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i6.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "directive", type: i7.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i8.CocoringCmsBlocksCatalogComponent, selector: "cocoring-cms-blocks-catalog", inputs: ["catalog"] }, { kind: "component", type: i9.CocoringToolbarCmsComponent, selector: "cocoring-toolbar-cms", inputs: ["showSaveBtn"], outputs: ["toggleSidenav"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CocoringCmsComponent, decorators: [{
type: Component,
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'cocoring-cms', providers: [InjectComponentService], template: "<div class=\"page\">\r\n <cocoring-toolbar-cms [showSaveBtn]=\"_showSaveBtn\" (toggleSidenav)=\"toggleSidenavBlocks()\"></cocoring-toolbar-cms>\r\n\r\n <div class=\"sidenav-container\">\r\n <mat-sidenav-container class=\"layout-container\" [hasBackdrop]=\"false\" fullscreen>\r\n <mat-sidenav class=\"sidenav-blocks-catalog\" #sidenav [mode]=\"sidenavMode\" position=\"end\" opened=\"false\">\r\n <cocoring-cms-blocks-catalog [catalog]=\"catalog\"></cocoring-cms-blocks-catalog>\r\n </mat-sidenav>\r\n <mat-sidenav-content [ngClass]=\"{'no-margin-right': isSidenavOpen && totalSections}\">\r\n <div class=\"sidenav-content\" [ngClass]=\"{'sidenav-openned': isSidenavOpen}\">\r\n <div *ngIf=\"!totalSections && !isSidenavOpen\" class=\"no-section\" (click)=\"toggleSidenavBlocks()\">\r\n <div>\r\n <h1>Customisez votre page facilement \uD83D\uDC4C </h1>\r\n <p>(cliquez ici pour composer votre page)</p>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isSidenavOpen && !totalSections\" class=\"col-elements\">\r\n <div class=\"texte-preview\">\r\n Aper\u00E7u de votre page\r\n </div>\r\n <div class=\"new-block\">\r\n <h1>Aucune section</h1>\r\n <p>cliquez sur un template pour l'ajouter</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"totalSections\" class=\"container-sections\" [ngClass]=\"{'col-elements': isSidenavOpen}\">\r\n <div class=\"blocks\" cdkDropList (cdkDropListDropped)=\"dropSection($event)\">\r\n <ng-template #ContainerRef></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n </div>\r\n</div>", styles: [":host{display:block;height:100%}.page{display:flex;flex-direction:column;height:100%}.page .sidenav-container{flex:1}.page .sidenav-container .layout-container{top:50px}.resolutions-group{border:0}.resolutions-group .mat-button-toggle-appearance-standard{background-color:transparent;color:#fff;border-left:0}.resolutions-group .mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:#2196f3}.resolutions-group ::ng-deep .mat-button-toggle-label-content{line-height:35px;padding:0 10px}.resolutions-group .material-icons{font-size:20px}.mat-drawer-content{background-color:#ecebeb;transition-property:none!important}.sidenav-content{display:flex;flex-direction:column;height:100%;transition-duration:.4s;transition-timing-function:cubic-bezier(.25,.8,.25,1);transition-property:transform,margin-left,margin-right}.sidenav-blocks-catalog{width:calc(75% - 25px);padding:20px 20px 0}.no-section{align-items:center;display:flex;justify-content:center;height:100%;cursor:pointer;text-align:center}.no-margin-right{margin-right:0!important}.container-sections{height:100%;padding-top:20px}.col-elements{overflow:hidden;background-color:#ecebeb}.col-elements .blocks{height:380%;overflow-y:auto;-webkit-transform:scale(.25);-moz-transform:scale(.25);-ms-transform:scale(.25);-o-transform:scale(.25);transform-origin:25px 25px;transition:transform .25s linear}.col-elements .new-block{display:flex;flex-direction:column;margin:20px;padding:0 5px;height:150px;background:#fff;border:solid 3px #f5f5f5;text-align:center;justify-content:center;position:relative}.col-elements .new-block h1{text-transform:uppercase;font-size:15px;margin-bottom:5px}.col-elements .new-block h1:after{content:\"\";display:block;margin:0 auto;width:20%;border-bottom:1px solid black}.texte-preview{text-transform:uppercase;font-size:18px;text-align:center;padding:10px 5px;margin:30px 22px 0}\n"] }]
}], ctorParameters: function () { return [{ type: i1.MediaObserver }, { type: i0.ChangeDetectorRef }, { type: i2.CmsService }, { type: i3.InjectComponentService }]; }, propDecorators: { sidenav: [{
type: ViewChild,
args: ['sidenav']
}], containerRef: [{
type: ViewChild,
args: ['ContainerRef', { static: false, read: ViewContainerRef }]
}], config: [{
type: Input
}], datas: [{
type: Input
}], showSaveBtn: [{
type: Input
}], onSaveBtn: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29jb3JpbmctY21zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvY29yaS1uZy9zcmMvZmVhdHVyZS1jbXMvc2hhcmVkL2NvbXBvbmVudC1jbXMtZWRpdG9yL2NvY29yaW5nLWNtcy9jb2NvcmluZy1jbXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29jb3JpLW5nL3NyYy9mZWF0dXJlLWNtcy9zaGFyZWQvY29tcG9uZW50LWNtcy1lZGl0b3IvY29jb3JpbmctY21zL2NvY29yaW5nLWNtcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFXaEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0RBQXdELENBQUM7Ozs7Ozs7Ozs7O0FBRXJHLHlFQUF5RTtBQUN6RSxxRUFBcUU7QUFRckUsTUFBTSxPQUFPLG9CQUFvQjtJQStDL0IsWUFDVSxhQUE0QixFQUM1QixHQUFzQixFQUN0QixVQUFzQixFQUN0QixzQkFBOEM7UUFIOUMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QiwyQkFBc0IsR0FBdEIsc0JB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b0JBQW9CLHNKQUZwQixDQUFDLHNCQUFzQixDQUFDLHdNQUllLGdCQUFnQiw2QkN6Q3BFLG1sRUFtQ007MkZESU8sb0JBQW9CO2tCQVBoQyxTQUFTO3NDQUNTLHVCQUF1QixDQUFDLE1BQU0sWUFDckMsY0FBYyxhQUdiLENBQUMsc0JBQXNCLENBQUM7a01BR2IsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTO2dCQUNrRCxZQUFZO3NCQUFqRixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQVdoRSxNQUFNO3NCQURULEtBQUs7Z0JBY0YsS0FBSztzQkFEUixLQUFLO2dCQU1GLFdBQVc7c0JBRGQsS0FBSztnQkFTSSxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1lZGlhT2JzZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9mbGV4LWxheW91dCc7XHJcbmltcG9ydCB7IE1hdFNpZGVuYXYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zaWRlbmF2JztcclxuaW1wb3J0IHsgSW5qZWN0Q29tcG9uZW50U2VydmljZSB9IGZyb20gJ2NvY29yaS1uZy9zcmMvZmVhdHVyZS1jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ29uZmlnQ21zTW9kZWwsXHJcbiAgSW5zZXJ0U2VjdGlvbkF0LFxyXG4gIFNlY3Rpb25Nb2RlbCxcclxuICBTZWN0aW9uTW9kZWxDb21tYW5kLFxyXG4gIFNlY3Rpb25Nb3ZlSW5kZXhlcyxcclxufSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVsL2Ntcy5tb2RlbCc7XHJcbmltcG9ydCB7IEJsb2NrIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2Jsb2NrJztcclxuaW1wb3J0IHsgQ21zU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9jbXMuc2VydmljZSc7XHJcbmltcG9ydCB7IENvY29yaW5nQ21zU2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvY29yaW5nLWNtcy1zZWN0aW9uL2NvY29yaW5nLWNtcy1zZWN0aW9uLmNvbXBvbmVudCc7XHJcblxyXG4vLyBpbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcbi8vIGltcG9ydCB7IE1lZGlhQ2hhbmdlLCBNZWRpYU9ic2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvZmxleC1sYXlvdXQnO1xyXG5AQ29tcG9uZW50KHtcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBzZWxlY3RvcjogJ2NvY29yaW5nLWNtcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvY29yaW5nLWNtcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29jb3JpbmctY21zLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbSW5qZWN0Q29tcG9uZW50U2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENvY29yaW5nQ21zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoJ3NpZGVuYXYnKSBzaWRlbmF2OiBNYXRTaWRlbmF2O1xyXG4gIEBWaWV3Q2hpbGQoJ0NvbnRhaW5lclJlZicsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBjb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWY7XHJcblxyXG4gIGNvbmZpZ0NtczogQ29uZmlnQ21zTW9kZWw7XHJcbiAgY2F0YWxvZzogQmxvY2tbXSA9IFtdXHJcbiAgb3JpZW50YXRpb24gPSAnY29sdW1uJ1xyXG4gIF9zaG93U2F2ZUJ0bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGltcG9ydFNlY3Rpb25zOiBTZWN0aW9uTW9kZWxbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgY29uZmlnKGNvbmZpZzogQ29uZmlnQ21zTW9kZWwpIHtcclxuICAgIGlmICghY29uZmlnKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGEgY29uZmlnIGR1IGNvbXBvc2FudCBDTVMgbidlc3QgcGFzIGNvcnJlY3RlLi4uIGNvbmZpZzogJHtjb25maWd9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb25maWdDbXMgPSBjb25maWdcclxuXHJcbiAgICB0aGlzLmNhdGFsb2cgPSBjb25maWcuY2F0YWxvZ1xyXG5cclxuICAgIHRoaXMuY21zU2VydmljZS5pbml0KClcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGRhdGFzKHNlY3Rpb25EYXRhczogU2VjdGlvbk1vZGVsW10pIHtcclxuICAgIHRoaXMuaW1wb3J0U2VjdGlvbnMgPSBzZWN0aW9uRGF0YXNcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNob3dTYXZlQnRuKGRhdGE6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3Nob3dTYXZlQnRuID0gZGF0YVxyXG5cclxuICAgIGlmIChkYXRhKSB7XHJcbiAgICAgIHRoaXMub25QYWdlU2F2ZWQoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIG9uU2F2ZUJ0bjogRXZlbnRFbWl0dGVyPFNlY3Rpb25Nb2RlbFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8U2VjdGlvbk1vZGVsW10+KCk7XHJcblxyXG4gIHJlc3BvbnNpdmU6IHN0cmluZyA9ICdjb21wdXRlcidcclxuICBhY3RpdmVNZWRpYVF1ZXJ5ID0gJyc7XHJcbiAgc2lkZW5hdk1vZGU6IHN0cmluZyA9ICdzaWRlJ1xyXG4gIGlzU2lkZW5hdk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0b3RhbFNlY3Rpb25zOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbWVkaWFPYnNlcnZlcjogTWVkaWFPYnNlcnZlcixcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgY21zU2VydmljZTogQ21zU2VydmljZSxcclxuICAgIHByaXZhdGUgaW5qZWN0Q29tcG9uZW50U2VydmljZTogSW5qZWN0Q29tcG9uZW50U2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMuZXZlbnRTaXplU2NyZWVuKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkU2VjdGlvbkV2ZW50KClcclxuXHJcbiAgICB0aGlzLm9uU2VjdGlvbk1vdmVkKClcclxuXHJcbiAgICAvKiogb24gZGVzc2luZSBsZXMgc2VjdGlvbnMgY2hhcmfDqWVzICEgKi9cclxuICAgIGlmICh0aGlzLmltcG9ydFNlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmltcG9ydFNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb246IFNlY3Rpb25Nb2RlbCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY21zU2VydmljZS5hZGRTZWN0aW9uKHNlY3Rpb24pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblBhZ2VTYXZlZCgpIHtcclxuICAgIHRoaXMuY21zU2VydmljZS5vblNhdmVDbXNDb250ZW50JC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICkuc3Vic2NyaWJlKChjb250ZW50UGFnZTogU2VjdGlvbk1vZGVsW10pID0+IHtcclxuICAgICAgdGhpcy5vblNhdmVCdG4uZW1pdChjb250ZW50UGFnZSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV2ZW50U2l6ZVNjcmVlbigpIHtcclxuICAgIHRoaXMubWVkaWFPYnNlcnZlclxyXG4gICAgICAuYXNPYnNlcnZhYmxlKClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgICkuc3Vic2NyaWJlKChjaGFuZ2UpID0+IHtcclxuICAgICAgICBjaGFuZ2UuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNZWRpYVF1ZXJ5ID0gaXRlbSA/IGAnJHtpdGVtLm1xQWxpYXN9JyA9ICgke2l0ZW0ubWVkaWFRdWVyeX0pYCA6ICcnO1xyXG5cclxuICAgICAgICAgIGlmIChpdGVtLm1xQWxpYXMgPT09ICd4cycpIHtcclxuICAgICAgICAgICAgdGhpcy5zaWRlbmF2TW9kZSA9ICdvdmVyJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2lkZW5hdk1vZGUgPSAnc2lkZSc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNpZGVuYXZCbG9ja3MoKSB7XHJcbiAgICB0aGlzLnNpZGVuYXYudG9nZ2xlKClcclxuXHJcbiAgICB0aGlzLmlzU2lkZW5hdk9wZW4gPSB0aGlzLnNpZGVuYXYub3BlbmVkXHJcblxyXG4gICAgdGhpcy5jbXNTZXJ2aWNlLmNhdGFsb2dCbG9ja3NPcGVuZWQkLm5leHQodGhpcy5pc1NpZGVuYXZPcGVuKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFBhZ2VDTVNEYXRhcygpOiBTZWN0aW9uTW9kZWxDb21tYW5kW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY21zU2VydmljZS5zZWN0aW9uc1BhZ2VEYXRhcygpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFNlY3Rpb25FdmVudCgpIHtcclxuICAgIHRoaXMuY21zU2VydmljZS5zZWN0aW9uQWRkZWQkLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgdGFwKF8gPT4gdGhpcy5yZWZyZXNoTnVtYmVyU2VjdGlvbigpKSxcclxuICAgICAgdGFwKChkYXRhczogSW5zZXJ0U2VjdGlvbkF0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbmplY3RDb21wb25lbnRTZXJ2aWNlLmxvYWRBbmRBZGRDb21wb25lbnRUb0NvbnRhaW5lcihDb2NvcmluZ0Ntc1NlY3Rpb25Db21wb25lbnQsIHRoaXMuY29udGFpbmVyUmVmLFxyXG4gICAgICAgICAgeyBzZWN0aW9uOiBkYXRhcy5zZWN0aW9uLCBhcGlzQ29uZmlnOiB0aGlzLmNvbmZpZ0Ntcy53eXNpd3lnT3B0aW9ucyB9LFxyXG4gICAgICAgICAgeyBhZnRlclJlbW92ZUFuaW1hdGlvbjogKHNlY3Rpb25JbmRleFJlbW92ZWQ6IG51bWJlcikgPT4gdGhpcy5vblNlY3Rpb25SZW1vdmVkQWZ0ZXJBbmltYXRpb24oc2VjdGlvbkluZGV4UmVtb3ZlZCkgfSwgZGF0YXMuaW5kZXhcclxuICAgICAgICApXHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblNlY3Rpb25SZW1vdmVkQWZ0ZXJBbmltYXRpb24oaW5kZXhTZWN0aW9uUmVtb3ZlZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmluamVjdENvbXBvbmVudFNlcnZpY2UucmVtb3ZlQ29tcG9uZW50RnJvbVZpZXdDb250YWluZXIoaW5kZXhTZWN0aW9uUmVtb3ZlZCwgdGhpcy5jb250YWluZXJSZWYpXHJcblxyXG4gICAgdGhpcy5yZWZyZXNoTnVtYmVyU2VjdGlvbigpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uU2VjdGlvbk1vdmVkKCkge1xyXG4gICAgdGhpcy5jbXNTZXJ2aWNlLm1vdmVTZWN0aW9uJC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgIHRhcCgodmFsdWVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLm1vdmVTZWN0aW9uQ29udGFpbmVyKHsgcHJldmlvdXNJbmRleDogdmFsdWVzLnByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleDogdmFsdWVzLmN1cnJlbnRJbmRleCB9KVxyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaE51bWJlclNlY3Rpb24oKSB7XHJcbiAgICB0aGlzLnRvdGFsU2VjdGlvbnMgPSB0aGlzLmNtc1NlcnZpY2Uuc2VjdGlvbnMubGVuZ3RoXHJcblxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZHJvcFNlY3Rpb24oZXZlbnQ6IENka0RyYWdEcm9wPGFueVtdPikge1xyXG4gICAgdGhpcy5tb3ZlU2VjdGlvbkNvbnRhaW5lcih7IHByZXZpb3VzSW5kZXg6IGV2ZW50LnByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleDogZXZlbnQuY3VycmVudEluZGV4IH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1vdmVTZWN0aW9uQ29udGFpbmVyKG1vdmVJbmRleGVzOiBTZWN0aW9uTW92ZUluZGV4ZXMpIHtcclxuICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmNtc1NlcnZpY2Uuc2VjdGlvbnMsIG1vdmVJbmRleGVzLnByZXZpb3VzSW5kZXgsIG1vdmVJbmRleGVzLmN1cnJlbnRJbmRleCk7XHJcblxyXG4gICAgdGhpcy5pbmplY3RDb21wb25lbnRTZXJ2aWNlLm1vdmVDb21wb25lbnRGcm9tVmlld0NvbnRhaW5lcihtb3ZlSW5kZXhlcy5jdXJyZW50SW5kZXgsIG1vdmVJbmRleGVzLnByZXZpb3VzSW5kZXgsIHRoaXMuY29udGFpbmVyUmVmKVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicGFnZVwiPlxyXG4gICAgPGNvY29yaW5nLXRvb2xiYXItY21zIFtzaG93U2F2ZUJ0bl09XCJfc2hvd1NhdmVCdG5cIiAodG9nZ2xlU2lkZW5hdik9XCJ0b2dnbGVTaWRlbmF2QmxvY2tzKClcIj48L2NvY29yaW5nLXRvb2xiYXItY21zPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJzaWRlbmF2LWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxtYXQtc2lkZW5hdi1jb250YWluZXIgY2xhc3M9XCJsYXlvdXQtY29udGFpbmVyXCIgW2hhc0JhY2tkcm9wXT1cImZhbHNlXCIgZnVsbHNjcmVlbj5cclxuICAgICAgICAgICAgPG1hdC1zaWRlbmF2IGNsYXNzPVwic2lkZW5hdi1ibG9ja3MtY2F0YWxvZ1wiICNzaWRlbmF2IFttb2RlXT1cInNpZGVuYXZNb2RlXCIgcG9zaXRpb249XCJlbmRcIiBvcGVuZWQ9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgPGNvY29yaW5nLWNtcy1ibG9ja3MtY2F0YWxvZyBbY2F0YWxvZ109XCJjYXRhbG9nXCI+PC9jb2NvcmluZy1jbXMtYmxvY2tzLWNhdGFsb2c+XHJcbiAgICAgICAgICAgIDwvbWF0LXNpZGVuYXY+XHJcbiAgICAgICAgICAgIDxtYXQtc2lkZW5hdi1jb250ZW50IFtuZ0NsYXNzXT1cInsnbm8tbWFyZ2luLXJpZ2h0JzogaXNTaWRlbmF2T3BlbiAmJiB0b3RhbFNlY3Rpb25zfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpZGVuYXYtY29udGVudFwiIFtuZ0NsYXNzXT1cInsnc2lkZW5hdi1vcGVubmVkJzogaXNTaWRlbmF2T3Blbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXRvdGFsU2VjdGlvbnMgJiYgIWlzU2lkZW5hdk9wZW5cIiBjbGFzcz1cIm5vLXNlY3Rpb25cIiAoY2xpY2spPVwidG9nZ2xlU2lkZW5hdkJsb2NrcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDE+Q3VzdG9taXNleiB2b3RyZSBwYWdlIGZhY2lsZW1lbnQg8J+RjCA8L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+KGNsaXF1ZXogaWNpIHBvdXIgY29tcG9zZXIgdm90cmUgcGFnZSk8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1NpZGVuYXZPcGVuICYmICF0b3RhbFNlY3Rpb25zXCIgY2xhc3M9XCJjb2wtZWxlbWVudHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHRlLXByZXZpZXdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwZXLDp3UgZGUgdm90cmUgcGFnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5ldy1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxPkF1Y3VuZSBzZWN0aW9uPC9oMT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPmNsaXF1ZXogc3VyIHVuIHRlbXBsYXRlIHBvdXIgbCdham91dGVyPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRvdGFsU2VjdGlvbnNcIiBjbGFzcz1cImNvbnRhaW5lci1zZWN0aW9uc1wiIFtuZ0NsYXNzXT1cInsnY29sLWVsZW1lbnRzJzogaXNTaWRlbmF2T3Blbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsb2Nrc1wiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcFNlY3Rpb24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNDb250YWluZXJSZWY+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9tYXQtc2lkZW5hdi1jb250ZW50PlxyXG4gICAgICAgIDwvbWF0LXNpZGVuYXYtY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==