UNPKG

@shikshalokam/sl-questionnaire

Version:
156 lines 31.2 kB
import { Component, ContentChild, HostListener, Input, ViewChild } from '@angular/core'; import { UntypedFormArray, UntypedFormControl, Validators, } from '@angular/forms'; import { TemplateModalConfig, } from '@project-sunbird/ng2-semantic-ui'; import * as _ from 'lodash-es'; import * as i0 from "@angular/core"; import * as i1 from "../services/translate.service"; import * as i2 from "@project-sunbird/ng2-semantic-ui"; import * as i3 from "@angular/forms"; import * as i4 from "../services/utils.service"; import * as i5 from "@angular/common"; export class MatrixQuestionsComponent { onPopState(event) { this.showBadgeAssingModel = false; } constructor(translate, modalService, fb, utils) { this.translate = translate; this.modalService = modalService; this.fb = fb; this.utils = utils; this.instanceLastUpdated = []; } ngOnInit() { this.addText = this.translate['frmelmnts'].btn.add; this.submitText = this.translate['frmelmnts'].btn.submit; this.cancelText = this.translate['frmelmnts'].btn.cancel; setTimeout(() => { this.matrixForm = this.fb.group({}, Validators.required); this.questionnaireForm.addControl(this.question._id, new UntypedFormArray([], [Validators.required])); this.initializeMatrix(); }); } initializeMatrix() { // let valid = true; if (this.question.value.length) { this.question.value.map((v) => { let obj = {}; let endTime = []; v.forEach((ques) => { endTime.push(ques.endTime); if (!ques.value) return; obj[ques._id] = ques.value; }); this.questionnaireForm.controls[this.question._id].push(new UntypedFormControl(obj, [this.instanceValidation])); let instanceupdatedAt = endTime.reduce(function (x, y) { return x > y ? x : y; }); this.instanceLastUpdated.push(instanceupdatedAt); // if (_.isEmpty(obj)) { // valid = false; // } }); } // if (!valid) // this.questionnaireForm.controls[this.question._id].setErrors({ // err: 'Matrix reposne not valid', // }); } instanceValidation(control) { let value = control.value; if (_.isEmpty(value)) { return { err: 'Instance not filled' }; } return null; } addInstances() { this.question.value = this.question.value ? this.question.value : []; this.question.value.push(JSON.parse(JSON.stringify(this.question.instanceQuestions))); this.matrixForm.reset(); this.formAsArray.push(new UntypedFormControl([], [Validators.required])); } viewInstance(i) { this.matrixForm.reset(); if (this.formAsArray.controls[i].value) { this.matrixForm.patchValue(this.formAsArray.controls[i].value); } const config = new TemplateModalConfig(this.modalTemplate); config.closeResult = 'closed!'; let deepClonedQuestion = _.cloneDeep(this.question.value[i]); config.context = { questions: deepClonedQuestion, heading: `${this.question.instanceIdentifier} ${i + 1}`, index: i, }; this.context = config.context; this.showBadgeAssingModel = true; } get formAsArray() { return this.questionnaireForm.controls[this.question._id]; } matrixSubmit(index) { this.showBadgeAssingModel = false; this.question.value[index] = this.context.questions; this.formAsArray.at(index).patchValue(this.matrixForm.value); if (this.matrixForm.invalid) { this.formAsArray.at(index).setErrors({ err: 'Matrix reposne not valid' }); } this.instanceLastUpdated[index] = Date.now(); } async deleteInstanceAlert(index) { // let metaData = await this.observationUtilService.getAlertMetaData(); // metaData.content.body.data = // this.resourceService.frmelmnts.lbl.deleteSubmission; // metaData.content.body.type = 'text'; // metaData.content.title = this.resourceService.frmelmnts.btn.delete; // metaData.size = 'mini'; // metaData.footer.buttons.push({ // type: 'cancel', // returnValue: false, // buttonText: this.resourceService.frmelmnts.btn.no, // }); // metaData.footer.buttons.push({ // type: 'accept', // returnValue: true, // buttonText: this.resourceService.frmelmnts.btn.yes, // }); // metaData.footer.className = 'double-btn'; // const accepted = await this.observationUtilService.showPopupAlert(metaData); const alertMeta = { title: this.translate['frmelmnts'].btn.delete, size: 'mini', bodyType: 'text', data: this.translate['frmelmnts'].lbl.deleteSubmission, buttonClass: 'double-btn', acceptText: this.translate['frmelmnts'].btn.yes, cancelText: this.translate['frmelmnts'].btn.no, }; const accepted = await this.utils.alert(alertMeta); if (!accepted) { return; } this.question.value.splice(index, 1); this.questionnaireForm.controls[this.question._id].removeAt(index); this.instanceLastUpdated.splice(index, 1); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MatrixQuestionsComponent, deps: [{ token: i1.SlTranslateService }, { token: i2.SuiModalService }, { token: i3.UntypedFormBuilder }, { token: i4.SlUtilsService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MatrixQuestionsComponent, selector: "sl-matrix-questions", inputs: { questionnaireForm: "questionnaireForm", question: "question" }, host: { listeners: { "window:popstate": "onPopState($event)" } }, queries: [{ propertyName: "matrixTemplateRef", first: true, predicate: ["matrixTemplateRef"], descendants: true }], viewQueries: [{ propertyName: "modalTemplate", first: true, predicate: ["modalTemplate"], descendants: true }], ngImport: i0, template: "<div class=\"d-flex flex-jc-flex-end\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" (click)=\"addInstances()\">\n {{ addText }}\n {{ question?.instanceIdentifier }}\n </button>\n</div>\n<div\n class=\"ui card student-card\"\n *ngFor=\"let instance of question?.value; let i = index\"\n>\n <div class=\"content flex-jc-space-between\">\n <div\n (click)=\"viewInstance(i)\"\n style=\"flex: 1\"\n class=\"d-flex flex-dc px-10\"\n [ngClass]=\"{\n 'valid-response':\n formAsArray?.controls[i].valid\n }\"\n >\n <span> {{ question?.instanceIdentifier }} {{ i + 1 }}</span>\n <span class=\"fs-0-785 modified\" *ngIf=\"instanceLastUpdated[i]\">Last Updated On : {{instanceLastUpdated[i] |date:'short'}}</span> \n </div>\n <div>\n <i class=\"trash large icon\" (click)=\"deleteInstanceAlert(i)\"></i>\n </div>\n </div>\n</div>\n\n<sui-modal\n [mustScroll]=\"true\"\n [isClosable]=\"true\"\n [transitionDuration]=\"0\"\n [size]=\"'normal'\"\n class=\"sb-modal\"\n appBodyScroll\n (dismissed)=\"showBadgeAssingModel = false\"\n *ngIf=\"showBadgeAssingModel\"\n #modal\n>\n <!--Header-->\n <div class=\"sb-modal-header\">\n {{ context?.heading }}\n </div>\n <!--/Header-->\n <!--Content-->\n <div class=\"sb-modal-content\">\n <ng-container *ngTemplateOutlet=\"matrixTemplateRef\"></ng-container>\n </div>\n <!--/Content-->\n\n <!--Actions-->\n <div class=\"sb-modal-actions\">\n <button\n [disabled]=\"!matrixForm?.valid\"\n type=\"button\"\n (click)=\"matrixSubmit(context.index)\"\n [ngClass]=\"{\n 'sb-btn sb-btn-normal': true,\n 'sb-btn-primary': matrixForm?.valid,\n 'sb-btn-disabled': !matrixForm?.valid\n }\"\n >\n {{ submitText }}\n </button>\n <button\n class=\"sb-btn sb-btn-normal sb-btn-outline-primary\"\n type=\"button\"\n (click)=\"showBadgeAssingModel = false\"\n >\n {{ cancelText }}\n </button>\n </div>\n <!--/Actions-->\n</sui-modal>\n", styles: [".card{width:100%;border-radius:90px}.content{display:flex;flex-direction:row}.ui.card>.content:after,.ui.cards>.card>.content:after{content:none}.modals.dimmer .ui.scrolling.modal{position:fixed!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.SuiModal, selector: "sui-modal", inputs: ["isClosable", "closeResult", "size", "isCentered", "isFullScreen", "isBasic", "mustScroll", "isInverted", "transition", "transitionDuration"], outputs: ["approved", "denied", "dismissed"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MatrixQuestionsComponent, decorators: [{ type: Component, args: [{ selector: 'sl-matrix-questions', template: "<div class=\"d-flex flex-jc-flex-end\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" (click)=\"addInstances()\">\n {{ addText }}\n {{ question?.instanceIdentifier }}\n </button>\n</div>\n<div\n class=\"ui card student-card\"\n *ngFor=\"let instance of question?.value; let i = index\"\n>\n <div class=\"content flex-jc-space-between\">\n <div\n (click)=\"viewInstance(i)\"\n style=\"flex: 1\"\n class=\"d-flex flex-dc px-10\"\n [ngClass]=\"{\n 'valid-response':\n formAsArray?.controls[i].valid\n }\"\n >\n <span> {{ question?.instanceIdentifier }} {{ i + 1 }}</span>\n <span class=\"fs-0-785 modified\" *ngIf=\"instanceLastUpdated[i]\">Last Updated On : {{instanceLastUpdated[i] |date:'short'}}</span> \n </div>\n <div>\n <i class=\"trash large icon\" (click)=\"deleteInstanceAlert(i)\"></i>\n </div>\n </div>\n</div>\n\n<sui-modal\n [mustScroll]=\"true\"\n [isClosable]=\"true\"\n [transitionDuration]=\"0\"\n [size]=\"'normal'\"\n class=\"sb-modal\"\n appBodyScroll\n (dismissed)=\"showBadgeAssingModel = false\"\n *ngIf=\"showBadgeAssingModel\"\n #modal\n>\n <!--Header-->\n <div class=\"sb-modal-header\">\n {{ context?.heading }}\n </div>\n <!--/Header-->\n <!--Content-->\n <div class=\"sb-modal-content\">\n <ng-container *ngTemplateOutlet=\"matrixTemplateRef\"></ng-container>\n </div>\n <!--/Content-->\n\n <!--Actions-->\n <div class=\"sb-modal-actions\">\n <button\n [disabled]=\"!matrixForm?.valid\"\n type=\"button\"\n (click)=\"matrixSubmit(context.index)\"\n [ngClass]=\"{\n 'sb-btn sb-btn-normal': true,\n 'sb-btn-primary': matrixForm?.valid,\n 'sb-btn-disabled': !matrixForm?.valid\n }\"\n >\n {{ submitText }}\n </button>\n <button\n class=\"sb-btn sb-btn-normal sb-btn-outline-primary\"\n type=\"button\"\n (click)=\"showBadgeAssingModel = false\"\n >\n {{ cancelText }}\n </button>\n </div>\n <!--/Actions-->\n</sui-modal>\n", styles: [".card{width:100%;border-radius:90px}.content{display:flex;flex-direction:row}.ui.card>.content:after,.ui.cards>.card>.content:after{content:none}.modals.dimmer .ui.scrolling.modal{position:fixed!important}\n"] }] }], ctorParameters: function () { return [{ type: i1.SlTranslateService }, { type: i2.SuiModalService }, { type: i3.UntypedFormBuilder }, { type: i4.SlUtilsService }]; }, propDecorators: { onPopState: [{ type: HostListener, args: ['window:popstate', ['$event']] }], matrixTemplateRef: [{ type: ContentChild, args: ['matrixTemplateRef', { static: false }] }], questionnaireForm: [{ type: Input }], question: [{ type: Input }], modalTemplate: [{ type: ViewChild, args: ['modalTemplate'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LXF1ZXN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbC1xdWVzdGlvbm5haXJlL3NyYy9saWIvbWF0cml4LXF1ZXN0aW9ucy9tYXRyaXgtcXVlc3Rpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NsLXF1ZXN0aW9ubmFpcmUvc3JjL2xpYi9tYXRyaXgtcXVlc3Rpb25zL21hdHJpeC1xdWVzdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBdUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsa0JBQWtCLEVBRWxCLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFHTCxtQkFBbUIsR0FDcEIsTUFBTSxrQ0FBa0MsQ0FBQztBQUcxQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFdBQVcsQ0FBQzs7Ozs7OztBQWMvQixNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLFVBQVUsQ0FBQyxLQUFLO1FBQ2QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBZUQsWUFDVSxTQUE2QixFQUM5QixZQUE2QixFQUM3QixFQUFzQixFQUNyQixLQUFxQjtRQUhyQixjQUFTLEdBQVQsU0FBUyxDQUFvQjtRQUM5QixpQkFBWSxHQUFaLFlBQVksQ0FBaUI7UUFDN0IsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDckIsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFOL0Isd0JBQW1CLEdBQU8sRUFBRSxDQUFDO0lBTzFCLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFD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YTtzQkFEbkIsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgVW50eXBlZEZvcm1BcnJheSxcbiAgVW50eXBlZEZvcm1CdWlsZGVyLFxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIE1vZGFsVGVtcGxhdGUsXG4gIFN1aU1vZGFsU2VydmljZSxcbiAgVGVtcGxhdGVNb2RhbENvbmZpZyxcbn0gZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9uZzItc2VtYW50aWMtdWknO1xuaW1wb3J0IHsgTWF0cml4UXVlc3Rpb24sIFF1ZXN0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9xdWVzdGlvbm5haXJlLnR5cGUnO1xuaW1wb3J0IHsgU2xUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQWxlcnRNZXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9hbGVydC50eXBlJztcbmltcG9ydCB7IFNsVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRleHQge1xuICBxdWVzdGlvbnM6IFF1ZXN0aW9uW107XG4gIGhlYWRpbmc6IHN0cmluZztcbiAgaW5kZXg6IG51bWJlcjtcbn1cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NsLW1hdHJpeC1xdWVzdGlvbnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0cml4LXF1ZXN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdHJpeC1xdWVzdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTWF0cml4UXVlc3Rpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvcHN0YXRlJywgWyckZXZlbnQnXSlcbiAgb25Qb3BTdGF0ZShldmVudCkge1xuICAgIHRoaXMuc2hvd0JhZGdlQXNzaW5nTW9kZWwgPSBmYWxzZTtcbiAgfVxuICBAQ29udGVudENoaWxkKCdtYXRyaXhUZW1wbGF0ZVJlZicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBtYXRyaXhUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcbiAgYWRkVGV4dDogc3RyaW5nO1xuICBzdWJtaXRUZXh0OiBzdHJpbmc7XG4gIGNhbmNlbFRleHQ6IHN0cmluZztcbiAgQElucHV0KCkgcXVlc3Rpb25uYWlyZUZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIHF1ZXN0aW9uOiBNYXRyaXhRdWVzdGlvbjtcbiAgbWF0cml4Rm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgQFZpZXdDaGlsZCgnbW9kYWxUZW1wbGF0ZScpXG4gIHB1YmxpYyBtb2RhbFRlbXBsYXRlOiBNb2RhbFRlbXBsYXRlPElDb250ZXh0LCBzdHJpbmcsIHN0cmluZz47XG4gIGNvbnRleHQ6IElDb250ZXh0O1xuICBzaG93QmFkZ2VBc3NpbmdNb2RlbDogYm9vbGVhbjtcbiAgaW5zdGFuY2VMYXN0VXBkYXRlZDphbnlbXT1bXTtcbiAgbWF0cml4OlRlbXBsYXRlUmVmPGFueT47XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBTbFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHVibGljIG1vZGFsU2VydmljZTogU3VpTW9kYWxTZXJ2aWNlLFxuICAgIHB1YmxpYyBmYjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgdXRpbHM6IFNsVXRpbHNTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFRleHQgPSB0aGlzLnRyYW5zbGF0ZVsnZnJtZWxtbnRzJ10uYnRuLmFkZDtcbiAgICB0aGlzLnN1Ym1pdFRleHQgPSB0aGlzLnRyYW5zbGF0ZVsnZnJtZWxtbnRzJ10uYnRuLnN1Ym1pdDtcbiAgICB0aGlzLmNhbmNlbFRleHQgPSB0aGlzLnRyYW5zbGF0ZVsnZnJtZWxtbnRzJ10uYnRuLmNhbmNlbDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubWF0cml4Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30sIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgdGhpcy5xdWVzdGlvbm5haXJlRm9ybS5hZGRDb250cm9sKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uLl9pZCxcbiAgICAgICAgbmV3IFVudHlwZWRGb3JtQXJyYXkoW10sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcbiAgICAgICk7XG4gICAgICB0aGlzLmluaXRpYWxpemVNYXRyaXgoKTtcbiAgICB9KTtcbiAgfVxuICBpbml0aWFsaXplTWF0cml4KCkge1xuICAgIC8vIGxldCB2YWxpZCA9IHRydWU7XG4gICAgaWYgKHRoaXMucXVlc3Rpb24udmFsdWUubGVuZ3RoKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uLnZhbHVlLm1hcCgodikgPT4ge1xuICAgICAgICBsZXQgb2JqID0ge307XG4gICAgICAgIGxldCBlbmRUaW1lID0gW11cbiAgICAgICAgdi5mb3JFYWNoKChxdWVzKSA9PiB7XG4gICAgICAgICAgZW5kVGltZS5wdXNoKHF1ZXMuZW5kVGltZSlcbiAgICAgICAgICBpZiAoIXF1ZXMudmFsdWUpIHJldHVybjtcbiAgICAgICAgICBvYmpbcXVlcy5faWRdID0gcXVlcy52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgICh0aGlzLnF1ZXN0aW9ubmFpcmVGb3JtLmNvbnRyb2xzW3RoaXMucXVlc3Rpb24uX2lkXSBhcyBVbnR5cGVkRm9ybUFycmF5KS5wdXNoKFxuICAgICAgICAgIG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wob2JqLFt0aGlzLmluc3RhbmNlVmFsaWRhdGlvbl0pXG4gICAgICAgICk7XG4gICAgICAgbGV0IGluc3RhbmNldXBkYXRlZEF0PSBlbmRUaW1lLnJlZHVjZShmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICAgIHJldHVybiB4ID4geSA/IHggOiB5O1xuICAgICAgIH0pO1xuICAgICAgICB0aGlzLmluc3RhbmNlTGFzdFVwZGF0ZWQucHVzaChpbnN0YW5jZXVwZGF0ZWRBdClcbiAgICAgICAgLy8gaWYgKF8uaXNFbXB0eShvYmopKSB7XG4gICAgICAgIC8vICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgLy8gfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gaWYgKCF2YWxpZClcbiAgICAvLyAgIHRoaXMucXVlc3Rpb25uYWlyZUZvcm0uY29udHJvbHNbdGhpcy5xdWVzdGlvbi5faWRdLnNldEVycm9ycyh7XG4gICAgLy8gICAgIGVycjogJ01hdHJpeCByZXBvc25lIG5vdCB2YWxpZCcsXG4gICAgLy8gICB9KTtcbiAgfVxuXG4gIGluc3RhbmNlVmFsaWRhdGlvbihjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcbiAgbGV0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAoXy5pc0VtcHR5KHZhbHVlKSkge1xuICAgIHJldHVybiB7IGVycjogJ0luc3RhbmNlIG5vdCBmaWxsZWQnIH1cbiAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYWRkSW5zdGFuY2VzKCk6IHZvaWQge1xuICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSB0aGlzLnF1ZXN0aW9uLnZhbHVlID8gdGhpcy5xdWVzdGlvbi52YWx1ZSA6IFtdO1xuICAgIHRoaXMucXVlc3Rpb24udmFsdWUucHVzaChcbiAgICAgIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5xdWVzdGlvbi5pbnN0YW5jZVF1ZXN0aW9ucykpXG4gICAgKTtcbiAgICB0aGlzLm1hdHJpeEZvcm0ucmVzZXQoKTtcbiAgICB0aGlzLmZvcm1Bc0FycmF5LnB1c2gobmV3IFVudHlwZWRGb3JtQ29udHJvbChbXSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSk7XG4gIH1cblxuICB2aWV3SW5zdGFuY2UoaSk6IHZvaWQge1xuICAgIHRoaXMubWF0cml4Rm9ybS5yZXNldCgpO1xuICAgIGlmICh0aGlzLmZvcm1Bc0FycmF5LmNvbnRyb2xzW2ldLnZhbHVlKSB7XG4gICAgICB0aGlzLm1hdHJpeEZvcm0ucGF0Y2hWYWx1ZSh0aGlzLmZvcm1Bc0FycmF5LmNvbnRyb2xzW2ldLnZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gbmV3IFRlbXBsYXRlTW9kYWxDb25maWc8SUNvbnRleHQsIHN0cmluZywgc3RyaW5nPihcbiAgICAgIHRoaXMubW9kYWxUZW1wbGF0ZVxuICAgICk7XG4gICAgY29uZmlnLmNsb3NlUmVzdWx0ID0gJ2Nsb3NlZCEnO1xuICAgIGxldCBkZWVwQ2xvbmVkUXVlc3Rpb24gPSBfLmNsb25lRGVlcCh0aGlzLnF1ZXN0aW9uLnZhbHVlW2ldKTtcbiAgICBjb25maWcuY29udGV4dCA9IHtcbiAgICAgIHF1ZXN0aW9uczogZGVlcENsb25lZFF1ZXN0aW9uLFxuICAgICAgaGVhZGluZzogYCR7dGhpcy5xdWVzdGlvbi5pbnN0YW5jZUlkZW50aWZpZXJ9ICR7aSArIDF9YCxcbiAgICAgIGluZGV4OiBpLFxuICAgIH07XG4gICAgdGhpcy5jb250ZXh0ID0gY29uZmlnLmNvbnRleHQ7XG4gICAgdGhpcy5zaG93QmFkZ2VBc3NpbmdNb2RlbCA9IHRydWU7XG4gIH1cblxuICBnZXQgZm9ybUFzQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25uYWlyZUZvcm0uY29udHJvbHNbdGhpcy5xdWVzdGlvbi5faWRdIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gIH1cblxuICBtYXRyaXhTdWJtaXQoaW5kZXgpIHtcbiAgICB0aGlzLnNob3dCYWRnZUFzc2luZ01vZGVsID0gZmFsc2U7XG4gICAgdGhpcy5xdWVzdGlvbi52YWx1ZVtpbmRleF0gPSB0aGlzLmNvbnRleHQucXVlc3Rpb25zO1xuICAgIHRoaXMuZm9ybUFzQXJyYXkuYXQoaW5kZXgpLnBhdGNoVmFsdWUodGhpcy5tYXRyaXhGb3JtLnZhbHVlKTtcbiAgICBpZiAodGhpcy5tYXRyaXhGb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMuZm9ybUFzQXJyYXkuYXQoaW5kZXgpLnNldEVycm9ycyh7IGVycjogJ01hdHJpeCByZXBvc25lIG5vdCB2YWxpZCcgfSk7XG4gICAgfVxuICAgIHRoaXMuaW5zdGFuY2VMYXN0VXBkYXRlZFtpbmRleF09RGF0ZS5ub3coKVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlSW5zdGFuY2VBbGVydChpbmRleCkge1xuICAgIC8vIGxldCBtZXRhRGF0YSA9IGF3YWl0IHRoaXMub2JzZXJ2YXRpb25VdGlsU2VydmljZS5nZXRBbGVydE1ldGFEYXRhKCk7XG4gICAgLy8gbWV0YURhdGEuY29udGVudC5ib2R5LmRhdGEgPVxuICAgIC8vICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuZnJtZWxtbnRzLmxibC5kZWxldGVTdWJtaXNzaW9uO1xuICAgIC8vIG1ldGFEYXRhLmNvbnRlbnQuYm9keS50eXBlID0gJ3RleHQnO1xuICAgIC8vIG1ldGFEYXRhLmNvbnRlbnQudGl0bGUgPSB0aGlzLnJlc291cmNlU2VydmljZS5mcm1lbG1udHMuYnRuLmRlbGV0ZTtcbiAgICAvLyBtZXRhRGF0YS5zaXplID0gJ21pbmknO1xuICAgIC8vIG1ldGFEYXRhLmZvb3Rlci5idXR0b25zLnB1c2goe1xuICAgIC8vICAgdHlwZTogJ2NhbmNlbCcsXG4gICAgLy8gICByZXR1cm5WYWx1ZTogZmFsc2UsXG4gICAgLy8gICBidXR0b25UZXh0OiB0aGlzLnJlc291cmNlU2VydmljZS5mcm1lbG1udHMuYnRuLm5vLFxuICAgIC8vIH0pO1xuICAgIC8vIG1ldGFEYXRhLmZvb3Rlci5idXR0b25zLnB1c2goe1xuICAgIC8vICAgdHlwZTogJ2FjY2VwdCcsXG4gICAgLy8gICByZXR1cm5WYWx1ZTogdHJ1ZSxcbiAgICAvLyAgIGJ1dHRvblRleHQ6IHRoaXMucmVzb3VyY2VTZXJ2aWNlLmZybWVsbW50cy5idG4ueWVzLFxuICAgIC8vIH0pO1xuICAgIC8vIG1ldGFEYXRhLmZvb3Rlci5jbGFzc05hbWUgPSAnZG91YmxlLWJ0bic7XG4gICAgLy8gY29uc3QgYWNjZXB0ZWQgPSBhd2FpdCB0aGlzLm9ic2VydmF0aW9uVXRpbFNlcnZpY2Uuc2hvd1BvcHVwQWxlcnQobWV0YURhdGEpO1xuICAgIGNvbnN0IGFsZXJ0TWV0YTogQWxlcnRNZXRhID0ge1xuICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlWydmcm1lbG1udHMnXS5idG4uZGVsZXRlLFxuICAgICAgc2l6ZTogJ21pbmknLFxuICAgICAgYm9keVR5cGU6ICd0ZXh0JyxcbiAgICAgIGRhdGE6IHRoaXMudHJhbnNsYXRlWydmcm1lbG1udHMnXS5sYmwuZGVsZXRlU3VibWlzc2lvbixcbiAgICAgIGJ1dHRvbkNsYXNzOiAnZG91YmxlLWJ0bicsXG4gICAgICBhY2NlcHRUZXh0OiB0aGlzLnRyYW5zbGF0ZVsnZnJtZWxtbnRzJ10uYnRuLnllcyxcbiAgICAgIGNhbmNlbFRleHQ6IHRoaXMudHJhbnNsYXRlWydmcm1lbG1udHMnXS5idG4ubm8sXG4gICAgfTtcbiAgICBjb25zdCBhY2NlcHRlZCA9IGF3YWl0IHRoaXMudXRpbHMuYWxlcnQoYWxlcnRNZXRhKTtcbiAgICBpZiAoIWFjY2VwdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5xdWVzdGlvbi52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICh0aGlzLnF1ZXN0aW9ubmFpcmVGb3JtLmNvbnRyb2xzW3RoaXMucXVlc3Rpb24uX2lkXSBhcyBVbnR5cGVkRm9ybUFycmF5KS5yZW1vdmVBdChcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgICB0aGlzLmluc3RhbmNlTGFzdFVwZGF0ZWQuc3BsaWNlKGluZGV4LDEpXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1qYy1mbGV4LWVuZFwiPlxuICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgc2ItYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkSW5zdGFuY2VzKClcIj5cbiAgICB7eyBhZGRUZXh0IH19XG4gICAge3sgcXVlc3Rpb24/Lmluc3RhbmNlSWRlbnRpZmllciB9fVxuICA8L2J1dHRvbj5cbjwvZGl2PlxuPGRpdlxuICBjbGFzcz1cInVpIGNhcmQgc3R1ZGVudC1jYXJkXCJcbiAgKm5nRm9yPVwibGV0IGluc3RhbmNlIG9mIHF1ZXN0aW9uPy52YWx1ZTsgbGV0IGkgPSBpbmRleFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJjb250ZW50IGZsZXgtamMtc3BhY2UtYmV0d2VlblwiPlxuICAgIDxkaXZcbiAgICAgIChjbGljayk9XCJ2aWV3SW5zdGFuY2UoaSlcIlxuICAgICAgc3R5bGU9XCJmbGV4OiAxXCJcbiAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtZGMgcHgtMTBcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAndmFsaWQtcmVzcG9uc2UnOlxuICAgICAgICAgZm9ybUFzQXJyYXk/LmNvbnRyb2xzW2ldLnZhbGlkXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8c3Bhbj4ge3sgcXVlc3Rpb24/Lmluc3RhbmNlSWRlbnRpZmllciB9fSB7eyBpICsgMSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZnMtMC03ODUgbW9kaWZpZWRcIiAqbmdJZj1cImluc3RhbmNlTGFzdFVwZGF0ZWRbaV1cIj5MYXN0IFVwZGF0ZWQgT24gOiB7e2luc3RhbmNlTGFzdFVwZGF0ZWRbaV0gfGRhdGU6J3Nob3J0J319PC9zcGFuPiBcbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGkgY2xhc3M9XCJ0cmFzaCBsYXJnZSBpY29uXCIgKGNsaWNrKT1cImRlbGV0ZUluc3RhbmNlQWxlcnQoaSlcIj48L2k+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxzdWktbW9kYWxcbiAgW211c3RTY3JvbGxdPVwidHJ1ZVwiXG4gIFtpc0Nsb3NhYmxlXT1cInRydWVcIlxuICBbdHJhbnNpdGlvbkR1cmF0aW9uXT1cIjBcIlxuICBbc2l6ZV09XCInbm9ybWFsJ1wiXG4gIGNsYXNzPVwic2ItbW9kYWxcIlxuICBhcHBCb2R5U2Nyb2xsXG4gIChkaXNtaXNzZWQpPVwic2hvd0JhZGdlQXNzaW5nTW9kZWwgPSBmYWxzZVwiXG4gICpuZ0lmPVwic2hvd0JhZGdlQXNzaW5nTW9kZWxcIlxuICAjbW9kYWxcbj5cbiAgPCEtLUhlYWRlci0tPlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtaGVhZGVyXCI+XG4gICAge3sgY29udGV4dD8uaGVhZGluZyB9fVxuICA8L2Rpdj5cbiAgPCEtLS9IZWFkZXItLT5cbiAgPCEtLUNvbnRlbnQtLT5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWNvbnRlbnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0cml4VGVtcGxhdGVSZWZcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDwhLS0vQ29udGVudC0tPlxuXG4gIDwhLS1BY3Rpb25zLS0+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1hY3Rpb25zXCI+XG4gICAgPGJ1dHRvblxuICAgICAgW2Rpc2FibGVkXT1cIiFtYXRyaXhGb3JtPy52YWxpZFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJtYXRyaXhTdWJtaXQoY29udGV4dC5pbmRleClcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnc2ItYnRuIHNiLWJ0bi1ub3JtYWwnOiB0cnVlLFxuICAgICAgICAnc2ItYnRuLXByaW1hcnknOiBtYXRyaXhGb3JtPy52YWxpZCxcbiAgICAgICAgJ3NiLWJ0bi1kaXNhYmxlZCc6ICFtYXRyaXhGb3JtPy52YWxpZFxuICAgICAgfVwiXG4gICAgPlxuICAgICAge3sgc3VibWl0VGV4dCB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgc2ItYnRuLW91dGxpbmUtcHJpbWFyeVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJzaG93QmFkZ2VBc3NpbmdNb2RlbCA9IGZhbHNlXCJcbiAgICA+XG4gICAgICB7eyBjYW5jZWxUZXh0IH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8IS0tL0FjdGlvbnMtLT5cbjwvc3VpLW1vZGFsPlxuIl19