UNPKG

angular-bootstrap-italia

Version:

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

227 lines 35.6 kB
import { __decorate, __read, __spread } 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'; var StepperComponent = /** @class */ (function () { function StepperComponent(qcs) { this.qcs = qcs; this.fromValueChange = new EventEmitter(); this.submitedEvent = new EventEmitter(); this.latitude = 42.50; this.longitude = 12.50; } StepperComponent.prototype.ngOnInit = function () { var _this = this; var _a, _b, _c, _d; this.widthExp = 100 / this.stepElements.length; // step a 1 this.currentStepIndex = 1; this.validSteps = []; this.touchedSteps = []; this.formRows = [].concat.apply([], __spread(this.stepElements.map(function (e) { return e.fromRows; }))); var elements = [].concat.apply([], __spread(this.formRows.map(function (e) { return e.items; }))); this.stepForm = this.qcs.toFormGroup(elements); this.mapId = this.getMapId(); var mapFormRows = this.stepElements.find(function (elem) { return elem.mapId; }).fromRows; this.mapFormFields = [].concat.apply([], __spread(mapFormRows.map(function (e) { return 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(function (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(function (newVal) { _this.longitude = newVal; }); this.formStateSubscription = this.stepForm.valueChanges .subscribe(function (newValue) { var _a; var mapFieldsKeys = _this.mapFormFields.map(function (e) { return e.key; }); var mapBoxingValues = []; mapFieldsKeys.forEach(function (key) { var 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); }); }; StepperComponent.prototype.ngOnDestroy = function () { if (this.formStateSubscription) { this.formStateSubscription.unsubscribe(); } if (this.latSub) { this.latSub.unsubscribe(); } if (this.lngSub) { this.lngSub.unsubscribe(); } }; Object.defineProperty(StepperComponent.prototype, "stepRows", { get: function () { var _this = this; var rows = this.stepElements.find(function (e) { return e.index === _this.currentStepIndex; }).fromRows; return rows; }, enumerable: true, configurable: true }); StepperComponent.prototype.getItems = function (formRow) { var _this = this; var items = formRow.items.filter(function (item) { var _a, _b, _c, _d, _e, _f, _g; var 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; }; StepperComponent.prototype.getPratentField = function (itemKey) { var elements = [].concat.apply([], __spread(this.formRows.map(function (e) { return e.items; }))); return elements.find(function (e) { return e.parentFieldKey === itemKey; }); }; StepperComponent.prototype.isValidStep = function (stepIndex) { var step = this.validSteps.find(function (e) { return e === stepIndex; }); if (step) { return true; } return false; }; StepperComponent.prototype.setValidStep = function (stepIndex) { // ritorna true se tutti campi di quello step sono validi altrimenti false // prendi le chiavi dei campi di quel particolare step var rowsItems = this.stepElements .find(function (e) { return e.index === stepIndex; }).fromRows .map(function (e) { return e.items; }); var rowsElements = [].concat.apply([], __spread(rowsItems)); var fieldsKeys = rowsElements.map(function (e) { return e.key; }); var controls = this.stepForm.controls; var filtered = Object.keys(controls) .filter(function (key) { return fieldsKeys.includes(key) && controls[key].valid; }) .reduce(function (obj, key) { obj[key] = controls[key]; return obj; }, {}); if (arraysEqual(fieldsKeys, Object.keys(filtered))) { var index = this.validSteps.indexOf(stepIndex, 0); if (index === -1) { this.validSteps.push(stepIndex); } } else { var index = this.validSteps.indexOf(stepIndex, 0); if (index > -1) { this.validSteps.splice(index, 1); } } }; StepperComponent.prototype.isTouchedStep = function (stepIndex) { var step = this.touchedSteps.find(function (e) { return e === stepIndex; }); if (step) { return true; } return false; }; StepperComponent.prototype.prevStep = function () { this.stepForm.updateValueAndValidity(); this.setValidStep(this.currentStepIndex); this.touchedSteps.push(this.currentStepIndex); this.currentStepIndex--; }; StepperComponent.prototype.nextStep = function () { this.stepForm.updateValueAndValidity(); this.setValidStep(this.currentStepIndex); this.touchedSteps.push(this.currentStepIndex); this.currentStepIndex++; }; StepperComponent.prototype.onSubmit = function () { this.submitedEvent.emit(this.stepForm.getRawValue()); }; StepperComponent.prototype.stepHaveMap = function (stepIndex) { var step = this.stepElements.find(function (e) { return 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; }; StepperComponent.prototype.getMapGeojson = function (geoJson) { this.mapGeoJson = geoJson; console.log(geoJson); }; StepperComponent.prototype.getMapId = function () { var step = this.stepElements.find(function (e) { return e.mapId; }); if (step && step.mapId) { return step.mapId; } return null; }; StepperComponent.ctorParameters = function () { return [ { 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); return 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 (var i = 0; i < a.length; ++i) { if (a[i] !== b[i]) { return false; } } return true; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWJvb3RzdHJhcC1pdGFsaWEvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9zdGVwcGVyL3N0ZXBwZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxNQUFNLEVBQUUsWUFBWSxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUNuSCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsYUFBYTtBQUNiLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsV0FBVztBQUNYLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBZXpGO0lBNEJFLDBCQUFvQixHQUE4QjtRQUE5QixRQUFHLEdBQUgsR0FBRyxDQUEyQjtRQXhCeEMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBQ2hELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVc3QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBRyxLQUFLLENBQUM7SUFXb0MsQ0FBQztJQUV2RCxtQ0FBUSxHQUFSO1FBQUEsaUJBd0RDOztRQXZEQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUUvQyxXQUFXO1FBQ1gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxNQUFNLE9BQVQsRUFBRSxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVB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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuLy8gQ29tcG9uZW50c1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLy8gU2VydmljZXNcclxuaW1wb3J0IHsgRHluYW1pY0Zvcm1Db250cm9sU2VydmljZSB9IGZyb20gJy4uL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0tY29udHJvbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vLyBNb2RlbHNcclxuaW1wb3J0IHsgRm9ybVJvdyB9IGZyb20gJy4uL2Zvcm0vZm9ybS1yb3cnO1xyXG5pbXBvcnQgeyBGb3JtQmFzZSB9IGZyb20gJy4uL2Zvcm0vZm9ybS1iYXNlJztcclxuaW1wb3J0IHsgU3RlcHBlckVsZW1lbnQgfSBmcm9tICcuL3N0ZXBwZXItZWxlbWVudC5tb2RlbCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc3RlcHBlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXBwZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3N0ZXBwZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICAvLyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RlcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgQElucHV0KCkgc3RlcEVsZW1lbnRzOiBTdGVwcGVyRWxlbWVudDxzdHJpbmc+W107XHJcblxyXG4gIEBPdXRwdXQoKSBmcm9tVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4oKTtcclxuICBAT3V0cHV0KCkgc3VibWl0ZWRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgd2lkdGhFeHA6IG51bWJlcjtcclxuICBjdXJyZW50U3RlcEluZGV4OiBudW1iZXI7IC8vIERpdmVudGEgSW5wdXQgLyBPdXRwdXRcclxuICB0b3VjaGVkU3RlcHM6IG51bWJlcltdO1xyXG4gIHZhbGlkU3RlcHM6IG51bWJlcltdO1xyXG4gIHN0ZXBGb3JtOiBGb3JtR3JvdXA7XHJcbiAgZm9ybVN0YXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIC8vIE1hcCBEZXRhbGlzXHJcbiAgbWFwSWQ6IHN0cmluZztcclxuICBsYXRpdHVkZSA9IDQyLjUwO1xyXG4gIGxvbmdpdHVkZSA9IDEyLjUwO1xyXG4gIGxhdFN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIGxuZ1N1YjogU3Vic2NyaXB0aW9uO1xyXG4gIG1hcEdlb0pzb246IGFueTtcclxuICBtYXBCYm94UG9seWdvbjogYW55O1xyXG4gIG1hcFNoYXBlUG9seWdvbjogYW55O1xyXG4gIG1hcEZvcm1GaWVsZHM6IEZvcm1CYXNlPGFueT5bXTtcclxuXHJcbiAgLy8gRm9ybSBlbGVtZW50c1xyXG4gIGZvcm1Sb3dzOiBGb3JtUm93PHN0cmluZz5bXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBxY3M6IER5bmFtaWNGb3JtQ29udHJvbFNlcnZpY2UpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMud2lkdGhFeHAgPSAxMDAgLyB0aGlzLnN0ZXBFbGVtZW50cy5sZW5ndGg7XHJcblxyXG4gICAgLy8gc3RlcCBhIDFcclxuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IDE7XHJcbiAgICB0aGlzLnZhbGlkU3RlcHMgPSBbXTtcclxuICAgIHRoaXMudG91Y2hlZFN0ZXBzID0gW107XHJcblxyXG4gICAgdGhpcy5mb3JtUm93cyA9IFtdLmNvbmNhdCguLi50aGlzLnN0ZXBFbGVtZW50cy5tYXAoZSA9PiBlLmZyb21Sb3dzKSk7XHJcblxyXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXS5jb25jYXQoLi4udGhpcy5mb3JtUm93cy5tYXAoZSA9PiBlLml0ZW1zKSk7XHJcblxyXG4gICAgdGhpcy5zdGVwRm9ybSA9IHRoaXMucWNzLnRvRm9ybUdyb3VwKGVsZW1lbnRzKTtcclxuXHJcbiAgICB0aGlzLm1hcElkID0gdGhpcy5nZXRNYXBJZCgpO1xyXG4gICAgY29uc3QgbWFwRm9ybVJvd3MgPSB0aGlzLnN0ZXBFbGVtZW50cy5maW5kKGVsZW0gPT4gZWxlbS5tYXBJZCkuZnJvbVJvd3M7XHJcbiAgICB0aGlzLm1hcEZvcm1GaWVsZHMgPSBbXS5jb25jYXQoLi4ubWFwRm9ybVJvd3MubWFwKGUgPT4gZS5pdGVtcykpO1xyXG5cclxuICAgIC8vIEZvcm0gTGF0aXR1cmVcclxuICAgIHRoaXMuc3RlcEZvcm0uY29udHJvbHMubGF0aXR1ZGU/LnNldFZhbHVlKDQyLjUwKTtcclxuICAgIHRoaXMubGF0U3ViID0gdGhpcy5zdGVwRm9ybS5jb250cm9scy5sYXRpdHVkZT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxyXG4gICAgICAuc3Vic2NyaWJlKG5ld1ZhbCA9PiB7XHJcbiAgICAgICAgdGhpcy5sYXRpdHVkZSA9IG5ld1ZhbDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8gRm9ybSBMb25naXR1ZGVcclxuICAgIHRoaXMuc3RlcEZvcm0uY29udHJvbHMubG9uZ2l0dWRlPy5zZXRWYWx1ZSgxMi41MCk7XHJcbiAgICB0aGlzLmxuZ1N1YiA9IHRoaXMuc3RlcEZvcm0uY29udHJvbHMubG9uZ2l0dWRlPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDUwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXHJcbiAgICAgIC5zdWJzY3JpYmUobmV3VmFsID0+IHtcclxuICAgICAgICB0aGlzLmxvbmdpdHVkZSA9IG5ld1ZhbDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5mb3JtU3RhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnN0ZXBGb3JtLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAuc3Vic2NyaWJlKG5ld1ZhbHVlID0+IHtcclxuICAgICAgICBjb25zdCBtYXBGaWVsZHNLZXlzID0gdGhpcy5tYXBGb3JtRmllbGRzLm1hcChlID0+IGUua2V5KTtcclxuICAgICAgICBjb25zdCBtYXBCb3hpbmdWYWx1ZXMgPSBbXTtcclxuXHJcbiAgICAgICAgbWFwRmllbGRzS2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5zdGVwRm9ybS52YWx1ZVtrZXldO1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBtYXBCb3hpbmdWYWx1ZXMucHVzaCh0aGlzLnN0ZXBGb3JtLnZhbHVlW2tleV0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChmaWVsZFZhbHVlPy5zaGFwZWxpZ2h0KSB7ICAvLyBUT0RPOiBGaXggbmFtZVxyXG4gICAgICAgICAgICB0aGlzLm1hcFNoYXBlUG9seWdvbiA9IGZpZWxkVmFsdWUuc2hhcGVsaWdodDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKG1hcEJveGluZ1ZhbHVlcz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5tYXBCYm94UG9seWdvbiA9IG1hcEJveGluZ1ZhbHVlc1ttYXBCb3hpbmdWYWx1ZXMubGVuZ3RoIC0gMV0/LmJvdW5kaW5nYm94OyAvLyBUT0RPOiBGaXggTmFtZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mcm9tVmFsdWVDaGFuZ2UuZW1pdChuZXdWYWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtU3RhdGVTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5mb3JtU3RhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxhdFN1Yikge1xyXG4gICAgICB0aGlzLmxhdFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubG5nU3ViKSB7XHJcbiAgICAgIHRoaXMubG5nU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc3RlcFJvd3MoKTogRm9ybVJvdzxzdHJpbmc+W10ge1xyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuc3RlcEVsZW1lbnRzLmZpbmQoZSA9PiBlLmluZGV4ID09PSB0aGlzLmN1cnJlbnRTdGVwSW5kZXgpLmZyb21Sb3dzO1xyXG4gICAgcmV0dXJuIHJvd3M7XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtcyhmb3JtUm93OiBGb3JtUm93PHN0cmluZz4pIHtcclxuICAgIGNvbnN0IGl0ZW1zID0gZm9ybVJvdy5pdGVtcy5maWx0ZXIoaXRlbSA9PiB7XHJcbiAgICAgIGxldCBzaG93Q29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgIC8vIFNlIHRpcG8gc2VtcGxpY2VcclxuICAgICAgaWYgKGl0ZW0ucGFyZW50U2hvd0NvbmRpdGlvbj8ucGFyZW50S2V5ICYmXHJcbiAgICAgICAgaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uPy5wYXJlbnRWYWx1ZSA9PT0gdGhpcy5zdGVwRm9ybS5nZXQoaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uLnBhcmVudEtleSkudmFsdWUpIHtcclxuICAgICAgICBzaG93Q29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU2Ugb2dnZXR0b1xyXG4gICAgICBpZiAoaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uPy5wYXJlbnRLZXlcclxuICAgICAgICAmJiB0eXBlb2YgaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uPy5wYXJlbnRWYWx1ZSA9PT0gJ29iamVjdCdcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICAgICYmIEpTT04uc3RyaW5naWZ5KGl0ZW0ucGFyZW50U2hvd0NvbmRpdGlvbj8ucGFyZW50VmFsdWUpID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLnN0ZXBGb3JtLmdldChpdGVtLnBhcmVudFNob3dDb25kaXRpb24ucGFyZW50S2V5KS52YWx1ZSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgc2hvd0NvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghaXRlbS5wYXJlbnRTaG93Q29uZGl0aW9uIHx8IHNob3dDb25kaXRpb24pIHtcclxuICAgICAgICB0aGlzLnN0ZXBGb3JtLmdldChpdGVtLmtleSk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdGVwRm9ybS5nZXQoaXRlbS5rZXkpPy5zZXRWYWxpZGF0b3JzKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBpdGVtcztcclxuICB9XHJcblxyXG4gIGdldFByYXRlbnRGaWVsZChpdGVtS2V5OiBzdHJpbmcpOiBGb3JtQmFzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IGVsZW1lbnRzID0gW10uY29uY2F0KC4uLnRoaXMuZm9ybVJvd3MubWFwKGUgPT4gZS5pdGVtcykpO1xyXG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoZSA9PiBlLnBhcmVudEZpZWxkS2V5ID09PSBpdGVtS2V5KTtcclxuICB9XHJcblxyXG4gIGlzVmFsaWRTdGVwKHN0ZXBJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy52YWxpZFN0ZXBzLmZpbmQoZSA9PiBlID09PSBzdGVwSW5kZXgpO1xyXG4gICAgaWYgKHN0ZXApIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNldFZhbGlkU3RlcChzdGVwSW5kZXg6IG51bWJlcikge1xyXG4gICAgLy8gcml0b3JuYSB0cnVlIHNlIHR1dHRpIGNhbXBpIGRpIHF1ZWxsbyBzdGVwIHNvbm8gdmFsaWRpIGFsdHJpbWVudGkgZmFsc2VcclxuICAgIC8vIHByZW5kaSBsZSBjaGlhdmkgZGVpIGNhbXBpIGRpIHF1ZWwgcGFydGljb2xhcmUgc3RlcFxyXG4gICAgY29uc3Qgcm93c0l0ZW1zID0gdGhpcy5zdGVwRWxlbWVudHNcclxuICAgICAgLmZpbmQoZSA9PiBlLmluZGV4ID09PSBzdGVwSW5kZXgpLmZyb21Sb3dzXHJcbiAgICAgIC5tYXAoZSA9PiBlLml0ZW1zKTtcclxuICAgIGNvbnN0IHJvd3NFbGVtZW50cyA9IFtdLmNvbmNhdCguLi5yb3dzSXRlbXMpO1xyXG4gICAgY29uc3QgZmllbGRzS2V5cyA9IHJvd3NFbGVtZW50cy5tYXAoZSA9PiBlLmtleSk7XHJcbiAgICBjb25zdCBjb250cm9scyA9IHRoaXMuc3RlcEZvcm0uY29udHJvbHM7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3Qua2V5cyhjb250cm9scylcclxuICAgICAgLmZpbHRlcihrZXkgPT4gZmllbGRzS2V5cy5pbmNsdWRlcyhrZXkpICYmIGNvbnRyb2xzW2tleV0udmFsaWQpXHJcbiAgICAgIC5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgb2JqW2tleV0gPSBjb250cm9sc1trZXldO1xyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgIH0sIHt9KTtcclxuXHJcbiAgICBpZiAoYXJyYXlzRXF1YWwoZmllbGRzS2V5cywgT2JqZWN0LmtleXMoZmlsdGVyZWQpKSkge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMudmFsaWRTdGVwcy5pbmRleE9mKHN0ZXBJbmRleCwgMCk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICB0aGlzLnZhbGlkU3RlcHMucHVzaChzdGVwSW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMudmFsaWRTdGVwcy5pbmRleE9mKHN0ZXBJbmRleCwgMCk7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy52YWxpZFN0ZXBzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzVG91Y2hlZFN0ZXAoc3RlcEluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnRvdWNoZWRTdGVwcy5maW5kKGUgPT4gZSA9PT0gc3RlcEluZGV4KTtcclxuICAgIGlmIChzdGVwKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcmV2U3RlcCgpIHtcclxuICAgIHRoaXMuc3RlcEZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5zZXRWYWxpZFN0ZXAodGhpcy5jdXJyZW50U3RlcEluZGV4KTtcclxuICAgIHRoaXMudG91Y2hlZFN0ZXBzLnB1c2godGhpcy5jdXJyZW50U3RlcEluZGV4KTtcclxuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleC0tO1xyXG4gIH1cclxuXHJcbiAgbmV4dFN0ZXAoKSB7XHJcbiAgICB0aGlzLnN0ZXBGb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuc2V0VmFsaWRTdGVwKHRoaXMuY3VycmVudFN0ZXBJbmRleCk7XHJcbiAgICB0aGlzLnRvdWNoZWRTdGVwcy5wdXNoKHRoaXMuY3VycmVudFN0ZXBJbmRleCk7XHJcbiAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXgrKztcclxuICB9XHJcblxyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgdGhpcy5zdWJtaXRlZEV2ZW50LmVtaXQodGhpcy5zdGVwRm9ybS5nZXRSYXdWYWx1ZSgpKTtcclxuICB9XHJcblxyXG4gIHN0ZXBIYXZlTWFwKHN0ZXBJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwRWxlbWVudHMuZmluZChlID0+IGUuaW5kZXggPT09IHN0ZXBJbmRleCk7XHJcbiAgICBpZiAoc3RlcCAmJiBzdGVwLm1hcElkKSB7XHJcbiAgICAgIC8vIGNvbnN0IGZyb21FbGVtZW50cyA9IFtdLmNvbmNhdCguLi5zdGVwLmZyb21Sb3dzLm1hcChlID0+IGUuaXRlbXMpKTtcclxuICAgICAgLy8gY29uc3QgbGF0aXR1ZGVDb250cm9sID0gZnJvbUVsZW1lbnRzLmZpbmQoZSA9PiBlLmtleSA9PT0gdGhpcy5sYXRpdHVkZSk7XHJcbiAgICAgIC8vIGNvbnN0IGxvbmdpdHVkZUNvbnRyb2wgPSBmcm9tRWxlbWVudHMuZmluZChlID0+IGUua2V5ID09PSB0aGlzLmxvbmdpdHVkZSk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWFwR2VvanNvbihnZW9Kc29uOiBhbnkpIHtcclxuICAgIHRoaXMubWFwR2VvSnNvbiA9IGdlb0pzb247XHJcbiAgICBjb25zb2xlLmxvZyhnZW9Kc29uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TWFwSWQoKSB7XHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwRWxlbWVudHMuZmluZChlID0+IGUubWFwSWQpO1xyXG4gICAgaWYgKHN0ZXAgJiYgc3RlcC5tYXBJZCkge1xyXG4gICAgICByZXR1cm4gc3RlcC5tYXBJZDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5c0VxdWFsKGEsIGIpIHtcclxuICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkge1xyXG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcbiJdfQ==