UNPKG

angular-bootstrap-italia

Version:

<p align="center"> <h1 align="center">Bootstrap Italia + Angular 9</h1>

219 lines 33.9 kB
import { __decorate } from "tslib"; import { Component, Input, Output, EventEmitter } from '@angular/core'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; // Components import { Validators } from '@angular/forms'; // Services import { DynamicFormControlService } from '../dynamic-form/dynamic-form-control.service'; let StepperComponent = class StepperComponent { constructor(qcs) { this.qcs = qcs; this.fromValueChange = new EventEmitter(); this.submitedEvent = new EventEmitter(); this.latitude = 42.50; this.longitude = 12.50; } ngOnInit() { var _a, _b, _c, _d; this.widthExp = 100 / this.stepElements.length; // step a 1 this.currentStepIndex = 1; this.validSteps = []; this.touchedSteps = []; this.formRows = [].concat(...this.stepElements.map(e => e.fromRows)); const elements = [].concat(...this.formRows.map(e => e.items)); this.stepForm = this.qcs.toFormGroup(elements); this.mapId = this.getMapId(); const mapFormRows = this.stepElements.find(elem => elem.mapId).fromRows; this.mapFormFields = [].concat(...mapFormRows.map(e => e.items)); // Form Latiture (_a = this.stepForm.controls.latitude) === null || _a === void 0 ? void 0 : _a.setValue(42.50); this.latSub = (_b = this.stepForm.controls.latitude) === null || _b === void 0 ? void 0 : _b.valueChanges.pipe(debounceTime(500), distinctUntilChanged()).subscribe(newVal => { this.latitude = newVal; }); // Form Longitude (_c = this.stepForm.controls.longitude) === null || _c === void 0 ? void 0 : _c.setValue(12.50); this.lngSub = (_d = this.stepForm.controls.longitude) === null || _d === void 0 ? void 0 : _d.valueChanges.pipe(debounceTime(500), distinctUntilChanged()).subscribe(newVal => { this.longitude = newVal; }); this.formStateSubscription = this.stepForm.valueChanges .subscribe(newValue => { var _a; const mapFieldsKeys = this.mapFormFields.map(e => e.key); const mapBoxingValues = []; mapFieldsKeys.forEach(key => { const fieldValue = this.stepForm.value[key]; if (typeof fieldValue === 'object') { mapBoxingValues.push(this.stepForm.value[key]); } if (fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.shapelight) { // TODO: Fix name this.mapShapePolygon = fieldValue.shapelight; } }); if ((mapBoxingValues === null || mapBoxingValues === void 0 ? void 0 : mapBoxingValues.length) > 0) { this.mapBboxPolygon = (_a = mapBoxingValues[mapBoxingValues.length - 1]) === null || _a === void 0 ? void 0 : _a.boundingbox; // TODO: Fix Name } this.fromValueChange.emit(newValue); }); } ngOnDestroy() { if (this.formStateSubscription) { this.formStateSubscription.unsubscribe(); } if (this.latSub) { this.latSub.unsubscribe(); } if (this.lngSub) { this.lngSub.unsubscribe(); } } get stepRows() { const rows = this.stepElements.find(e => e.index === this.currentStepIndex).fromRows; return rows; } getItems(formRow) { const items = formRow.items.filter(item => { var _a, _b, _c, _d, _e, _f, _g; let showCondition = false; // Se tipo semplice if (((_a = item.parentShowCondition) === null || _a === void 0 ? void 0 : _a.parentKey) && ((_b = item.parentShowCondition) === null || _b === void 0 ? void 0 : _b.parentValue) === this.stepForm.get(item.parentShowCondition.parentKey).value) { showCondition = true; } // Se oggetto if (((_c = item.parentShowCondition) === null || _c === void 0 ? void 0 : _c.parentKey) && typeof ((_d = item.parentShowCondition) === null || _d === void 0 ? void 0 : _d.parentValue) === 'object' // tslint:disable-next-line: max-line-length && JSON.stringify((_e = item.parentShowCondition) === null || _e === void 0 ? void 0 : _e.parentValue) === JSON.stringify(this.stepForm.get(item.parentShowCondition.parentKey).value)) { showCondition = true; } if (!item.parentShowCondition || showCondition) { (_f = this.stepForm.get(item.key)) === null || _f === void 0 ? void 0 : _f.setValidators(Validators.required); return item; } else { (_g = this.stepForm.get(item.key)) === null || _g === void 0 ? void 0 : _g.setValidators(null); } }); return items; } getPratentField(itemKey) { const elements = [].concat(...this.formRows.map(e => e.items)); return elements.find(e => e.parentFieldKey === itemKey); } isValidStep(stepIndex) { const step = this.validSteps.find(e => e === stepIndex); if (step) { return true; } return false; } setValidStep(stepIndex) { // ritorna true se tutti campi di quello step sono validi altrimenti false // prendi le chiavi dei campi di quel particolare step const rowsItems = this.stepElements .find(e => e.index === stepIndex).fromRows .map(e => e.items); const rowsElements = [].concat(...rowsItems); const fieldsKeys = rowsElements.map(e => e.key); const controls = this.stepForm.controls; const filtered = Object.keys(controls) .filter(key => fieldsKeys.includes(key) && controls[key].valid) .reduce((obj, key) => { obj[key] = controls[key]; return obj; }, {}); if (arraysEqual(fieldsKeys, Object.keys(filtered))) { const index = this.validSteps.indexOf(stepIndex, 0); if (index === -1) { this.validSteps.push(stepIndex); } } else { const index = this.validSteps.indexOf(stepIndex, 0); if (index > -1) { this.validSteps.splice(index, 1); } } } isTouchedStep(stepIndex) { const step = this.touchedSteps.find(e => e === stepIndex); if (step) { return true; } return false; } prevStep() { this.stepForm.updateValueAndValidity(); this.setValidStep(this.currentStepIndex); this.touchedSteps.push(this.currentStepIndex); this.currentStepIndex--; } nextStep() { this.stepForm.updateValueAndValidity(); this.setValidStep(this.currentStepIndex); this.touchedSteps.push(this.currentStepIndex); this.currentStepIndex++; } onSubmit() { this.submitedEvent.emit(this.stepForm.getRawValue()); } stepHaveMap(stepIndex) { const step = this.stepElements.find(e => e.index === stepIndex); if (step && step.mapId) { // const fromElements = [].concat(...step.fromRows.map(e => e.items)); // const latitudeControl = fromElements.find(e => e.key === this.latitude); // const longitudeControl = fromElements.find(e => e.key === this.longitude); return true; } return false; } getMapGeojson(geoJson) { this.mapGeoJson = geoJson; console.log(geoJson); } getMapId() { const step = this.stepElements.find(e => e.mapId); if (step && step.mapId) { return step.mapId; } return null; } }; StepperComponent.ctorParameters = () => [ { type: DynamicFormControlService } ]; __decorate([ Input() ], StepperComponent.prototype, "stepElements", void 0); __decorate([ Output() ], StepperComponent.prototype, "fromValueChange", void 0); __decorate([ Output() ], StepperComponent.prototype, "submitedEvent", void 0); StepperComponent = __decorate([ Component({ selector: 'lib-stepper', template: "<div class=\"steppers\">\r\n <ul class=\"steppers-header custom-stepper-header\">\r\n\r\n <li *ngFor=\"let step of stepElements\"\r\n [ngClass]=\"{'active': step.index === currentStepIndex, 'confirmed': step.index !== currentStepIndex && isValidStep(step.index)}\"\r\n [ngStyle]=\"{'width': widthExp + '%'}\">\r\n {{ step.label }}\r\n <svg class=\"icon icon-success steppers-success\" *ngIf=\"step.index !== currentStepIndex && isValidStep(step.index)\">\r\n <use xlink:href=\"./assets/bootstrap-italia/svg/sprite.svg#it-check\"></use>\r\n </svg>\r\n <svg class=\"icon icon-warning steppers-success\" *ngIf=\"step.index !== currentStepIndex && !isValidStep(step.index) && isTouchedStep(step.index)\">\r\n <use xlink:href=\"./assets/bootstrap-italia/svg/sprite.svg#it-info-circle\"></use>\r\n </svg>\r\n <span class=\"sr-only\" *ngIf=\"step.index === currentStepIndex\">Attivo</span>\r\n <span class=\"sr-only\" *ngIf=\"step.index !== currentStepIndex && isValidStep(step.index)\">Confermato</span>\r\n </li>\r\n\r\n <li class=\"steppers-index\" aria-hidden=\"true\">{{ currentStepIndex }}/{{ stepElements.length }}</li>\r\n\r\n </ul>\r\n <div class=\"align-middle custom-stepper\" aria-live=\"polite\">\r\n <form [formGroup]=\"stepForm\">\r\n <div class=\"form-row\" *ngFor=\"let row of stepRows\">\r\n <div class=\"custom-form-group\" *ngFor=\"let item of getItems(row)\" [ngClass]=\"item.class\">\r\n <lib-dynamic-form-element [field]=\"item\" [parentField]=\"getPratentField(item.parentFieldKey)\" [form]=\"stepForm\"></lib-dynamic-form-element>\r\n </div>\r\n </div>\r\n <div class=\"form-map\" *ngIf=\"stepHaveMap(currentStepIndex)\">\r\n <lib-leaflet-map [latitude]=\"latitude\" [longitude]=\"longitude\" [bboxPolygon]=\"mapBboxPolygon\" [shapePolygon]=\"mapShapePolygon\" (geoJson)=\"getMapGeojson($event)\" [enableEdit]=\"true\"></lib-leaflet-map>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <nav class=\"steppers-nav custom-stepper-nav\">\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm steppers-btn-prev\" (click)=\"prevStep()\" [disabled]=\"currentStepIndex === 1\">\r\n <svg class=\"icon icon-primary\">\r\n <use xlink:href=\"./assets/bootstrap-italia/svg/sprite.svg#it-chevron-left\"></use>\r\n </svg>\r\n Indietro\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm steppers-btn-save\" (click)=\"onSubmit()\" [disabled]=\"!stepForm.valid\">Salva</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm steppers-btn-next\" (click)=\"nextStep()\" [disabled]=\"currentStepIndex === stepElements.length\">Avanti\r\n <svg class=\"icon icon-primary\">\r\n <use xlink:href=\"./assets/bootstrap-italia/svg/sprite.svg#it-chevron-right\"></use>\r\n </svg>\r\n </button>\r\n </nav>\r\n</div>\r\n", styles: [".custom-stepper{min-height:20em;padding-top:3em;padding-left:1em;padding-right:1em;justify-content:center;align-items:center;color:#333}@media (min-width:992px){.custom-stepper{min-height:22em}.custom-stepper .form-map{margin-bottom:3em}.custom-stepper-header{box-shadow:0 10px 40px -30px grey}.custom-stepper-nav{box-shadow:0 -15px 30px -25px grey}.custom-form-group{min-height:5em}}"] }) ], StepperComponent); export { StepperComponent }; function arraysEqual(a, b) { if (a === b) { return true; } if (a == null || b == null) { return false; } if (a.length !== b.length) { return false; } for (let i = 0; i < a.length; ++i) { if (a[i] !== b[i]) { return false; } } return true; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWJvb3RzdHJhcC1pdGFsaWEvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9zdGVwcGVyL3N0ZXBwZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxNQUFNLEVBQUUsWUFBWSxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUNuSCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsYUFBYTtBQUNiLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsV0FBVztBQUNYLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBZXpGLElBQWEsZ0JBQWdCLEdBQTdCLE1BQWEsZ0JBQWdCO0lBNEIzQixZQUFvQixHQUE4QjtRQUE5QixRQUFHLEdBQUgsR0FBRyxDQUEyQjtRQXhCeEMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBQ2hELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVc3QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBRyxLQUFLLENBQUM7SUFXb0MsQ0FBQztJQUV2RCxRQUFROztRQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1FBRS9DLFdBQVc7UUFDWCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxD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QUU7c0RBQXdDO0FBRXRDO0lBQVQsTUFBTSxFQUFFO3lEQUFpRDtBQUNoRDtJQUFULE1BQU0sRUFBRTt1REFBb0M7QUFMbEMsZ0JBQWdCO0lBTjVCLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxhQUFhO1FBQ3ZCLHk0RkFBdUM7O0tBR3hDLENBQUM7R0FDVyxnQkFBZ0IsQ0E4TjVCO1NBOU5ZLGdCQUFnQjtBQWdPN0IsU0FBUyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUM7S0FBRTtJQUM3QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0tBQUU7SUFDN0MsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUU7UUFBRSxPQUFPLEtBQUssQ0FBQztLQUFFO0lBRTVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ2pDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1NBQUU7S0FDckM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vLyBDb21wb25lbnRzXHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG4vLyBTZXJ2aWNlc1xyXG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbnRyb2xTZXJ2aWNlIH0gZnJvbSAnLi4vZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS1jb250cm9sLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbi8vIE1vZGVsc1xyXG5pbXBvcnQgeyBGb3JtUm93IH0gZnJvbSAnLi4vZm9ybS9mb3JtLXJvdyc7XHJcbmltcG9ydCB7IEZvcm1CYXNlIH0gZnJvbSAnLi4vZm9ybS9mb3JtLWJhc2UnO1xyXG5pbXBvcnQgeyBTdGVwcGVyRWxlbWVudCB9IGZyb20gJy4vc3RlcHBlci1lbGVtZW50Lm1vZGVsJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1zdGVwcGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcHBlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3RlcHBlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIC8vIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdGVwcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBASW5wdXQoKSBzdGVwRWxlbWVudHM6IFN0ZXBwZXJFbGVtZW50PHN0cmluZz5bXTtcclxuXHJcbiAgQE91dHB1dCgpIGZyb21WYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybUdyb3VwPigpO1xyXG4gIEBPdXRwdXQoKSBzdWJtaXRlZEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICB3aWR0aEV4cDogbnVtYmVyO1xyXG4gIGN1cnJlbnRTdGVwSW5kZXg6IG51bWJlcjsgLy8gRGl2ZW50YSBJbnB1dCAvIE91dHB1dFxyXG4gIHRvdWNoZWRTdGVwczogbnVtYmVyW107XHJcbiAgdmFsaWRTdGVwczogbnVtYmVyW107XHJcbiAgc3RlcEZvcm06IEZvcm1Hcm91cDtcclxuICBmb3JtU3RhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLy8gTWFwIERldGFsaXNcclxuICBtYXBJZDogc3RyaW5nO1xyXG4gIGxhdGl0dWRlID0gNDIuNTA7XHJcbiAgbG9uZ2l0dWRlID0gMTIuNTA7XHJcbiAgbGF0U3ViOiBTdWJzY3JpcHRpb247XHJcbiAgbG5nU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgbWFwR2VvSnNvbjogYW55O1xyXG4gIG1hcEJib3hQb2x5Z29uOiBhbnk7XHJcbiAgbWFwU2hhcGVQb2x5Z29uOiBhbnk7XHJcbiAgbWFwRm9ybUZpZWxkczogRm9ybUJhc2U8YW55PltdO1xyXG5cclxuICAvLyBGb3JtIGVsZW1lbnRzXHJcbiAgZm9ybVJvd3M6IEZvcm1Sb3c8c3RyaW5nPltdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHFjczogRHluYW1pY0Zvcm1Db250cm9sU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy53aWR0aEV4cCA9IDEwMCAvIHRoaXMuc3RlcEVsZW1lbnRzLmxlbmd0aDtcclxuXHJcbiAgICAvLyBzdGVwIGEgMVxyXG4gICAgdGhpcy5jdXJyZW50U3RlcEluZGV4ID0gMTtcclxuICAgIHRoaXMudmFsaWRTdGVwcyA9IFtdO1xyXG4gICAgdGhpcy50b3VjaGVkU3RlcHMgPSBbXTtcclxuXHJcbiAgICB0aGlzLmZvcm1Sb3dzID0gW10uY29uY2F0KC4uLnRoaXMuc3RlcEVsZW1lbnRzLm1hcChlID0+IGUuZnJvbVJvd3MpKTtcclxuXHJcbiAgICBjb25zdCBlbGVtZW50cyA9IFtdLmNvbmNhdCguLi50aGlzLmZvcm1Sb3dzLm1hcChlID0+IGUuaXRlbXMpKTtcclxuXHJcbiAgICB0aGlzLnN0ZXBGb3JtID0gdGhpcy5xY3MudG9Gb3JtR3JvdXAoZWxlbWVudHMpO1xyXG5cclxuICAgIHRoaXMubWFwSWQgPSB0aGlzLmdldE1hcElkKCk7XHJcbiAgICBjb25zdCBtYXBGb3JtUm93cyA9IHRoaXMuc3RlcEVsZW1lbnRzLmZpbmQoZWxlbSA9PiBlbGVtLm1hcElkKS5mcm9tUm93cztcclxuICAgIHRoaXMubWFwRm9ybUZpZWxkcyA9IFtdLmNvbmNhdCguLi5tYXBGb3JtUm93cy5tYXAoZSA9PiBlLml0ZW1zKSk7XHJcblxyXG4gICAgLy8gRm9ybSBMYXRpdHVyZVxyXG4gICAgdGhpcy5zdGVwRm9ybS5jb250cm9scy5sYXRpdHVkZT8uc2V0VmFsdWUoNDIuNTApO1xyXG4gICAgdGhpcy5sYXRTdWIgPSB0aGlzLnN0ZXBGb3JtLmNvbnRyb2xzLmxhdGl0dWRlPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDUwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXHJcbiAgICAgIC5zdWJzY3JpYmUobmV3VmFsID0+IHtcclxuICAgICAgICB0aGlzLmxhdGl0dWRlID0gbmV3VmFsO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyBGb3JtIExvbmdpdHVkZVxyXG4gICAgdGhpcy5zdGVwRm9ybS5jb250cm9scy5sb25naXR1ZGU/LnNldFZhbHVlKDEyLjUwKTtcclxuICAgIHRoaXMubG5nU3ViID0gdGhpcy5zdGVwRm9ybS5jb250cm9scy5sb25naXR1ZGU/LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoNTAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcclxuICAgICAgLnN1YnNjcmliZShuZXdWYWwgPT4ge1xyXG4gICAgICAgIHRoaXMubG9uZ2l0dWRlID0gbmV3VmFsO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZvcm1TdGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMuc3RlcEZvcm0udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5zdWJzY3JpYmUobmV3VmFsdWUgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1hcEZpZWxkc0tleXMgPSB0aGlzLm1hcEZvcm1GaWVsZHMubWFwKGUgPT4gZS5rZXkpO1xyXG4gICAgICAgIGNvbnN0IG1hcEJveGluZ1ZhbHVlcyA9IFtdO1xyXG5cclxuICAgICAgICBtYXBGaWVsZHNLZXlzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB0aGlzLnN0ZXBGb3JtLnZhbHVlW2tleV07XHJcbiAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIG1hcEJveGluZ1ZhbHVlcy5wdXNoKHRoaXMuc3RlcEZvcm0udmFsdWVba2V5XSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkVmFsdWU/LnNoYXBlbGlnaHQpIHsgIC8vIFRPRE86IEZpeCBuYW1lXHJcbiAgICAgICAgICAgIHRoaXMubWFwU2hhcGVQb2x5Z29uID0gZmllbGRWYWx1ZS5zaGFwZWxpZ2h0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAobWFwQm94aW5nVmFsdWVzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLm1hcEJib3hQb2x5Z29uID0gbWFwQm94aW5nVmFsdWVzW21hcEJveGluZ1ZhbHVlcy5sZW5ndGggLSAxXT8uYm91bmRpbmdib3g7IC8vIFRPRE86IEZpeCBOYW1lXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZyb21WYWx1ZUNoYW5nZS5lbWl0KG5ld1ZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZvcm1TdGF0ZVN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmZvcm1TdGF0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGF0U3ViKSB7XHJcbiAgICAgIHRoaXMubGF0U3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5sbmdTdWIpIHtcclxuICAgICAgdGhpcy5sbmdTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBzdGVwUm93cygpOiBGb3JtUm93PHN0cmluZz5bXSB7XHJcbiAgICBjb25zdCByb3dzID0gdGhpcy5zdGVwRWxlbWVudHMuZmluZChlID0+IGUuaW5kZXggPT09IHRoaXMuY3VycmVudFN0ZXBJbmRleCkuZnJvbVJvd3M7XHJcbiAgICByZXR1cm4gcm93cztcclxuICB9XHJcblxyXG4gIGdldEl0ZW1zKGZvcm1Sb3c6IEZvcm1Sb3c8c3RyaW5nPikge1xyXG4gICAgY29uc3QgaXRlbXMgPSBmb3JtUm93Lml0ZW1zLmZpbHRlcihpdGVtID0+IHtcclxuICAgICAgbGV0IHNob3dDb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgLy8gU2UgdGlwbyBzZW1wbGljZVxyXG4gICAgICBpZiAoaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uPy5wYXJlbnRLZXkgJiZcclxuICAgICAgICBpdGVtLnBhcmVudFNob3dDb25kaXRpb24/LnBhcmVudFZhbHVlID09PSB0aGlzLnN0ZXBGb3JtLmdldChpdGVtLnBhcmVudFNob3dDb25kaXRpb24ucGFyZW50S2V5KS52YWx1ZSkge1xyXG4gICAgICAgIHNob3dDb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBTZSBvZ2dldHRvXHJcbiAgICAgIGlmIChpdGVtLnBhcmVudFNob3dDb25kaXRpb24/LnBhcmVudEtleVxyXG4gICAgICAgICYmIHR5cGVvZiBpdGVtLnBhcmVudFNob3dDb25kaXRpb24/LnBhcmVudFZhbHVlID09PSAnb2JqZWN0J1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICAgJiYgSlNPTi5zdHJpbmdpZnkoaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uPy5wYXJlbnRWYWx1ZSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuc3RlcEZvcm0uZ2V0KGl0ZW0ucGFyZW50U2hvd0NvbmRpdGlvbi5wYXJlbnRLZXkpLnZhbHVlKVxyXG4gICAgICApIHtcclxuICAgICAgICBzaG93Q29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFpdGVtLnBhcmVudFNob3dDb25kaXRpb24gfHwgc2hvd0NvbmRpdGlvbikge1xyXG4gICAgICAgIHRoaXMuc3RlcEZvcm0uZ2V0KGl0ZW0ua2V5KT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0ZXBGb3JtLmdldChpdGVtLmtleSk/LnNldFZhbGlkYXRvcnMobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJhdGVudEZpZWxkKGl0ZW1LZXk6IHN0cmluZyk6IEZvcm1CYXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXS5jb25jYXQoLi4udGhpcy5mb3JtUm93cy5tYXAoZSA9PiBlLml0ZW1zKSk7XHJcbiAgICByZXR1cm4gZWxlbWVudHMuZmluZChlID0+IGUucGFyZW50RmllbGRLZXkgPT09IGl0ZW1LZXkpO1xyXG4gIH1cclxuXHJcbiAgaXNWYWxpZFN0ZXAoc3RlcEluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnZhbGlkU3RlcHMuZmluZChlID0+IGUgPT09IHN0ZXBJbmRleCk7XHJcbiAgICBpZiAoc3RlcCkgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc2V0VmFsaWRTdGVwKHN0ZXBJbmRleDogbnVtYmVyKSB7XHJcbiAgICAvLyByaXRvcm5hIHRydWUgc2UgdHV0dGkgY2FtcGkgZGkgcXVlbGxvIHN0ZXAgc29ubyB2YWxpZGkgYWx0cmltZW50aSBmYWxzZVxyXG4gICAgLy8gcHJlbmRpIGxlIGNoaWF2aSBkZWkgY2FtcGkgZGkgcXVlbCBwYXJ0aWNvbGFyZSBzdGVwXHJcbiAgICBjb25zdCByb3dzSXRlbXMgPSB0aGlzLnN0ZXBFbGVtZW50c1xyXG4gICAgICAuZmluZChlID0+IGUuaW5kZXggPT09IHN0ZXBJbmRleCkuZnJvbVJvd3NcclxuICAgICAgLm1hcChlID0+IGUuaXRlbXMpO1xyXG4gICAgY29uc3Qgcm93c0VsZW1lbnRzID0gW10uY29uY2F0KC4uLnJvd3NJdGVtcyk7XHJcbiAgICBjb25zdCBmaWVsZHNLZXlzID0gcm93c0VsZW1lbnRzLm1hcChlID0+IGUua2V5KTtcclxuICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy5zdGVwRm9ybS5jb250cm9scztcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJlZCA9IE9iamVjdC5rZXlzKGNvbnRyb2xzKVxyXG4gICAgICAuZmlsdGVyKGtleSA9PiBmaWVsZHNLZXlzLmluY2x1ZGVzKGtleSkgJiYgY29udHJvbHNba2V5XS52YWxpZClcclxuICAgICAgLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcclxuICAgICAgICBvYmpba2V5XSA9IGNvbnRyb2xzW2tleV07XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgfSwge30pO1xyXG5cclxuICAgIGlmIChhcnJheXNFcXVhbChmaWVsZHNLZXlzLCBPYmplY3Qua2V5cyhmaWx0ZXJlZCkpKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWxpZFN0ZXBzLmluZGV4T2Yoc3RlcEluZGV4LCAwKTtcclxuICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHRoaXMudmFsaWRTdGVwcy5wdXNoKHN0ZXBJbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWxpZFN0ZXBzLmluZGV4T2Yoc3RlcEluZGV4LCAwKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLnZhbGlkU3RlcHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNUb3VjaGVkU3RlcChzdGVwSW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMudG91Y2hlZFN0ZXBzLmZpbmQoZSA9PiBlID09PSBzdGVwSW5kZXgpO1xyXG4gICAgaWYgKHN0ZXApIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByZXZTdGVwKCkge1xyXG4gICAgdGhpcy5zdGVwRm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLnNldFZhbGlkU3RlcCh0aGlzLmN1cnJlbnRTdGVwSW5kZXgpO1xyXG4gICAgdGhpcy50b3VjaGVkU3RlcHMucHVzaCh0aGlzLmN1cnJlbnRTdGVwSW5kZXgpO1xyXG4gICAgdGhpcy5jdXJyZW50U3RlcEluZGV4LS07XHJcbiAgfVxyXG5cclxuICBuZXh0U3RlcCgpIHtcclxuICAgIHRoaXMuc3RlcEZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5zZXRWYWxpZFN0ZXAodGhpcy5jdXJyZW50U3RlcEluZGV4KTtcclxuICAgIHRoaXMudG91Y2hlZFN0ZXBzLnB1c2godGhpcy5jdXJyZW50U3RlcEluZGV4KTtcclxuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCsrO1xyXG4gIH1cclxuXHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICB0aGlzLnN1Ym1pdGVkRXZlbnQuZW1pdCh0aGlzLnN0ZXBGb3JtLmdldFJhd1ZhbHVlKCkpO1xyXG4gIH1cclxuXHJcbiAgc3RlcEhhdmVNYXAoc3RlcEluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXBFbGVtZW50cy5maW5kKGUgPT4gZS5pbmRleCA9PT0gc3RlcEluZGV4KTtcclxuICAgIGlmIChzdGVwICYmIHN0ZXAubWFwSWQpIHtcclxuICAgICAgLy8gY29uc3QgZnJvbUVsZW1lbnRzID0gW10uY29uY2F0KC4uLnN0ZXAuZnJvbVJvd3MubWFwKGUgPT4gZS5pdGVtcykpO1xyXG4gICAgICAvLyBjb25zdCBsYXRpdHVkZUNvbnRyb2wgPSBmcm9tRWxlbWVudHMuZmluZChlID0+IGUua2V5ID09PSB0aGlzLmxhdGl0dWRlKTtcclxuICAgICAgLy8gY29uc3QgbG9uZ2l0dWRlQ29udHJvbCA9IGZyb21FbGVtZW50cy5maW5kKGUgPT4gZS5rZXkgPT09IHRoaXMubG9uZ2l0dWRlKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRNYXBHZW9qc29uKGdlb0pzb246IGFueSkge1xyXG4gICAgdGhpcy5tYXBHZW9Kc29uID0gZ2VvSnNvbjtcclxuICAgIGNvbnNvbGUubG9nKGdlb0pzb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRNYXBJZCgpIHtcclxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXBFbGVtZW50cy5maW5kKGUgPT4gZS5tYXBJZCk7XHJcbiAgICBpZiAoc3RlcCAmJiBzdGVwLm1hcElkKSB7XHJcbiAgICAgIHJldHVybiBzdGVwLm1hcElkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gYXJyYXlzRXF1YWwoYSwgYikge1xyXG4gIGlmIChhID09PSBiKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XHJcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICB9XHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuIl19