@shikshalokam/sl-questionnaire
Version:
Library to integrate questionnaire in SL Projects
235 lines • 34.6 kB
JavaScript
import { Injectable } from '@angular/core';
import { ResponseType, } from '../interfaces/questionnaire.type';
import * as _ from 'lodash-es';
import * as i0 from "@angular/core";
export class SlQuestionnaireService {
constructor() {
this.validate = (data) => {
return (control) => {
if (typeof data.validation == 'string') {
return null;
}
if (!data.validation.required) {
return null;
}
if (data.validation.regex) {
const forbidden = this.testRegex(data.validation.regex, control.value);
return forbidden ? null : { err: 'Invalid character found' };
}
if (data.validation.IsNumber) {
if (!control.value) {
return { err: 'Number not entered' };
}
const forbidden = !isNaN(control.value);
return forbidden ? null : { err: 'Only numbers allowed' };
}
if (data.validation.required) {
if (!control.value) {
return { err: 'Required field' };
}
if (data.responseType == ResponseType.MULTISELECT) {
return control.value.some((v) => v != '')
? null
: { err: 'Select at least one option' };
}
if (data.responseType == ResponseType.SLIDER) {
let min = data.validation.min;
let max = data.validation.max;
return min <= control.value && control.value <= max
? null
: { err: 'Selected value not within range' };
}
}
};
};
}
testRegex(regexExpression, value) {
const regex = new RegExp(regexExpression);
return regex.test(value);
}
setSubmissionId(submissionId) {
this._submissionId = submissionId;
}
getSubmissionId() {
return this._submissionId;
}
mapSubmissionToAssessment(data) {
const assessment = data.assessment;
for (const evidence of assessment.evidences) {
const validSubmission = assessment.submissions[evidence.externalId];
if (validSubmission) {
evidence.notApplicable = validSubmission.notApplicable;
if (evidence.notApplicable) {
continue;
}
for (const section of evidence.sections) {
for (const question of section.questions) {
if (question.responseType === 'pageQuestions') {
for (const questions of question.pageQuestions) {
questions.value =
questions.responseType !== 'matrix'
? validSubmission.answers[questions._id].value
: this.constructMatrixValue(validSubmission, questions, evidence.externalId);
questions.remarks = validSubmission.answers[questions._id]
? validSubmission.answers[questions._id].remarks
: '';
questions.fileName = validSubmission.answers[questions._id]
? validSubmission.answers[questions._id].fileName
: [];
questions.endTime = validSubmission.answers[questions._id]
? validSubmission.answers[questions._id].endTime
: '';
}
}
else if (validSubmission.answers &&
validSubmission.answers[question._id]) {
question.value =
question.responseType !== 'matrix'
? validSubmission.answers[question._id].value
: this.constructMatrixValue(validSubmission, question, evidence.externalId);
question.remarks = validSubmission.answers[question._id]
? validSubmission.answers[question._id].remarks
: '';
question.fileName = validSubmission.answers[question._id]
? validSubmission.answers[question._id].fileName
: [];
question.endTime = validSubmission.answers[question._id]
? validSubmission.answers[question._id].endTime
: '';
}
}
}
}
}
this.setSubmissionId(assessment.submissionId);
return data;
}
constructMatrixValue(validSubmission, matrixQuestion, ecmId) {
matrixQuestion.value = [];
if (validSubmission.answers &&
validSubmission.answers[matrixQuestion._id] &&
validSubmission.answers[matrixQuestion._id].value) {
for (const answer of validSubmission.answers[matrixQuestion._id].value) {
matrixQuestion.value.push(JSON.parse(JSON.stringify(matrixQuestion.instanceQuestions)));
}
matrixQuestion.value.forEach((instance, index) => {
instance.forEach((question, instanceIndex) => {
if (validSubmission.answers[matrixQuestion._id] &&
validSubmission.answers[matrixQuestion._id].value[index][question._id]) {
question.value =
validSubmission.answers[matrixQuestion._id].value[index][question._id].value;
question.remarks =
validSubmission.answers[matrixQuestion._id].value[index][question._id].remarks;
question.fileName =
validSubmission.answers[matrixQuestion._id].value[index][question._id].fileName;
question.endTime =
validSubmission.answers[matrixQuestion._id].value[index][question._id].endTime;
}
});
});
return matrixQuestion.value;
}
else {
return [];
}
}
getEvidenceData(evidence, formValues) {
let sections = evidence.sections;
let answers = this.getSectionData(sections, formValues);
let payloadData = {
externalId: evidence.externalId,
answers: answers,
startTime: evidence.startTime,
endTime: Date.now(),
};
return payloadData;
}
getSectionData(sections, formValues) {
let answers = {};
for (let index = 0; index < sections.length; index++) {
answers = {
...answers,
...this.createpayload(sections[index].questions, formValues),
};
}
return answers;
}
createpayload(questions, formValues) {
let answers = {};
for (let index = 0; index < questions.length; index++) {
let currentQuestion = questions[index];
if (currentQuestion.responseType == 'pageQuestions') {
answers = {
...answers,
...this.createpayload(currentQuestion.pageQuestions, formValues),
};
continue;
}
if (currentQuestion.responseType == 'matrix') {
for (let index = 0; index < currentQuestion.value.length; index++) {
formValues[currentQuestion._id][index] = this.createpayload(currentQuestion.value[index], formValues[currentQuestion._id][index]);
}
}
let perQuestionData = this.formatToPayload(currentQuestion, formValues);
answers[currentQuestion._id] = perQuestionData;
}
return answers;
}
formatToPayload(currentQuestion, formValues) {
let value, labels;
if (currentQuestion.responseType == 'matrix') {
value = formValues[currentQuestion._id];
labels = currentQuestion.value;
}
else {
value = currentQuestion.value;
labels = formValues[currentQuestion._id];
if (currentQuestion.responseType == 'radio' && currentQuestion.value) {
labels = currentQuestion.options.find(_ => _.value == currentQuestion.value).label;
}
if (currentQuestion.responseType == 'multiselect' && currentQuestion.value) {
labels = currentQuestion.options.filter(_ => currentQuestion.value.includes(_.value)).map(_ => _.label);
}
}
return {
qid: currentQuestion._id,
value: value,
remarks: currentQuestion.remarks,
fileName: currentQuestion.fileName,
gpsLocation: '',
payload: {
question: currentQuestion.question,
labels: this.convertToArray(labels),
responseType: currentQuestion.responseType,
filesNotUploaded: [], //todo
},
startTime: currentQuestion.startTime,
endTime: currentQuestion.endTime,
criteriaId: currentQuestion.payload.criteriaId,
responseType: currentQuestion.responseType,
evidenceMethod: currentQuestion.evidenceMethod,
rubricLevel: '',
};
}
convertToArray(arr) {
if (!arr) {
return arr;
}
let clonedArr = _.cloneDeep(arr);
if (Array.isArray(clonedArr)) {
return arr;
}
else {
return [clonedArr];
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SlQuestionnaireService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SlQuestionnaireService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SlQuestionnaireService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2wtcXVlc3Rpb25uYWlyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2wtcXVlc3Rpb25uYWlyZS9zcmMvbGliL3NlcnZpY2VzL3NsLXF1ZXN0aW9ubmFpcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFHTCxZQUFZLEdBQ2IsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFdBQVcsQ0FBQzs7QUFNL0IsTUFBTSxPQUFPLHNCQUFzQjtJQUVqQztRQUNBLGFBQVEsR0FBRyxDQUFDLElBQWMsRUFBZSxFQUFFO1lBQ3pDLE9BQU8sQ0FBQyxPQUF3QixFQUFpQyxFQUFFO2dCQUNqRSxJQUFJLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxRQUFRLEVBQUU7b0JBQ3RDLE9BQU8sSUFBSSxDQUFDO2lCQUNiO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtvQkFDN0IsT0FBTyxJQUFJLENBQUM7aUJBQ2I7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTtvQkFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3ZFLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLHlCQUF5QixFQUFFLENBQUM7aUJBQzlEO2dCQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7b0JBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO3dCQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFF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RztRQUNoQixJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsT0FBTyxHQUFHLENBQUM7U0FDWjtRQUNELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzVCLE9BQU8sR0FBRyxDQUFDO1NBQ1o7YUFBTTtZQUNMLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNwQjtJQUNILENBQUM7K0dBeFFVLHNCQUFzQjttSEFBdEIsc0JBQXNCLGNBRnJCLE1BQU07OzRGQUVQLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgRXZpZGVuY2UsXG4gIFF1ZXN0aW9uLFxuICBSZXNwb25zZVR5cGUsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcXVlc3Rpb25uYWlyZS50eXBlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2xRdWVzdGlvbm5haXJlU2VydmljZSB7XG4gIHByaXZhdGUgX3N1Ym1pc3Npb25JZDogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIHZhbGlkYXRlID0gKGRhdGE6IFF1ZXN0aW9uKTogVmFsaWRhdG9yRm4gPT4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBkYXRhLnZhbGlkYXRpb24gPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoIWRhdGEudmFsaWRhdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnZhbGlkYXRpb24ucmVnZXgpIHtcbiAgICAgICAgY29uc3QgZm9yYmlkZGVuID0gdGhpcy50ZXN0UmVnZXgoZGF0YS52YWxpZGF0aW9uLnJlZ2V4LCBjb250cm9sLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGZvcmJpZGRlbiA/IG51bGwgOiB7IGVycjogJ0ludmFsaWQgY2hhcmFjdGVyIGZvdW5kJyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS52YWxpZGF0aW9uLklzTnVtYmVyKSB7XG4gICAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgIHJldHVybiB7IGVycjogJ051bWJlciBub3QgZW50ZXJlZCcgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JiaWRkZW4gPSAhaXNOYU4oY29udHJvbC52YWx1ZSk7XG4gICAgICAgIHJldHVybiBmb3JiaWRkZW4gPyBudWxsIDogeyBlcnI6ICdPbmx5IG51bWJlcnMgYWxsb3dlZCcgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEudmFsaWRhdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4geyBlcnI6ICdSZXF1aXJlZCBmaWVsZCcgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLnJlc3BvbnNlVHlwZSA9PSBSZXNwb25zZVR5cGUuTVVMVElTRUxFQ1QpIHtcbiAgICAgICAgICByZXR1cm4gY29udHJvbC52YWx1ZS5zb21lKCh2KSA9PiB2ICE9ICcnKVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHsgZXJyOiAnU2VsZWN0IGF0IGxlYXN0IG9uZSBvcHRpb24nIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS5yZXNwb25zZVR5cGUgPT0gUmVzcG9uc2VUeXBlLlNMSURFUikge1xuICAgICAgICAgIGxldCBtaW4gPSBkYXRhLnZhbGlkYXRpb24ubWluO1xuICAgICAgICAgIGxldCBtYXggPSBkYXRhLnZhbGlkYXRpb24ubWF4O1xuICAgICAgICAgIHJldHVybiBtaW4gPD0gY29udHJvbC52YWx1ZSAmJiBjb250cm9sLnZhbHVlIDw9IG1heFxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHsgZXJyOiAnU2VsZWN0ZWQgdmFsdWUgIG5vdCB3aXRoaW4gcmFuZ2UnIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHB1YmxpYyB0ZXN0UmVnZXgocmVnZXhFeHByZXNzaW9uOiBSZWdFeHAsIHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhFeHByZXNzaW9uKTtcbiAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSk7XG4gIH1cblxuICBzZXRTdWJtaXNzaW9uSWQoc3VibWlzc2lvbklkOiBhbnkpIHtcbiAgICB0aGlzLl9zdWJtaXNzaW9uSWQgPSBzdWJtaXNzaW9uSWQ7XG4gIH1cbiAgZ2V0U3VibWlzc2lvbklkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdWJtaXNzaW9uSWQ7XG4gIH1cblxuICBtYXBTdWJtaXNzaW9uVG9Bc3Nlc3NtZW50KGRhdGEpIHtcbiAgICBjb25zdCBhc3Nlc3NtZW50ID0gZGF0YS5hc3Nlc3NtZW50O1xuXG4gICAgZm9yIChjb25zdCBldmlkZW5jZSBvZiBhc3Nlc3NtZW50LmV2aWRlbmNlcykge1xuICAgICAgY29uc3QgdmFsaWRTdWJtaXNzaW9uID0gYXNzZXNzbWVudC5zdWJtaXNzaW9uc1tldmlkZW5jZS5leHRlcm5hbElkXTtcbiAgICAgIGlmICh2YWxpZFN1Ym1pc3Npb24pIHtcbiAgICAgICAgZXZpZGVuY2Uubm90QXBwbGljYWJsZSA9IHZhbGlkU3VibWlzc2lvbi5ub3RBcHBsaWNhYmxlO1xuICAgICAgICBpZiAoZXZpZGVuY2Uubm90QXBwbGljYWJsZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGV2aWRlbmNlLnNlY3Rpb25zKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBzZWN0aW9uLnF1ZXN0aW9ucykge1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLnJlc3BvbnNlVHlwZSA9PT0gJ3BhZ2VRdWVzdGlvbnMnKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgcXVlc3Rpb25zIG9mIHF1ZXN0aW9uLnBhZ2VRdWVzdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbnMudmFsdWUgPVxuICAgICAgICAgICAgICAgICAgcXVlc3Rpb25zLnJlc3BvbnNlVHlwZSAhPT0gJ21hdHJpeCdcbiAgICAgICAgICAgICAgICAgICAgPyB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbnMuX2lkXS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY29uc3RydWN0TWF0cml4VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmlkZW5jZS5leHRlcm5hbElkXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbnMucmVtYXJrcyA9IHZhbGlkU3VibWlzc2lvbi5hbnN3ZXJzW3F1ZXN0aW9ucy5faWRdXG4gICAgICAgICAgICAgICAgICA/IHZhbGlkU3VibWlzc2lvbi5hbnN3ZXJzW3F1ZXN0aW9ucy5faWRdLnJlbWFya3NcbiAgICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICAgICAgcXVlc3Rpb25zLmZpbGVOYW1lID0gdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbcXVlc3Rpb25zLl9pZF1cbiAgICAgICAgICAgICAgICAgID8gdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbcXVlc3Rpb25zLl9pZF0uZmlsZU5hbWVcbiAgICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgICAgICAgcXVlc3Rpb25zLmVuZFRpbWUgPSB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbnMuX2lkXVxuICAgICAgICAgICAgICAgICAgPyB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbnMuX2lkXS5lbmRUaW1lXG4gICAgICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2VycyAmJlxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbi5faWRdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcXVlc3Rpb24udmFsdWUgPVxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uLnJlc3BvbnNlVHlwZSAhPT0gJ21hdHJpeCdcbiAgICAgICAgICAgICAgICAgID8gdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbcXVlc3Rpb24uX2lkXS52YWx1ZVxuICAgICAgICAgICAgICAgICAgOiB0aGlzLmNvbnN0cnVjdE1hdHJpeFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkU3VibWlzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBldmlkZW5jZS5leHRlcm5hbElkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHF1ZXN0aW9uLnJlbWFya3MgPSB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbi5faWRdXG4gICAgICAgICAgICAgICAgPyB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbi5faWRdLnJlbWFya3NcbiAgICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgICBxdWVzdGlvbi5maWxlTmFtZSA9IHZhbGlkU3VibWlzc2lvbi5hbnN3ZXJzW3F1ZXN0aW9uLl9pZF1cbiAgICAgICAgICAgICAgICA/IHZhbGlkU3VibWlzc2lvbi5hbnN3ZXJzW3F1ZXN0aW9uLl9pZF0uZmlsZU5hbWVcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICAgICAgICBxdWVzdGlvbi5lbmRUaW1lID0gdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbcXVlc3Rpb24uX2lkXVxuICAgICAgICAgICAgICAgID8gdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbcXVlc3Rpb24uX2lkXS5lbmRUaW1lXG4gICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3VibWlzc2lvbklkKGFzc2Vzc21lbnQuc3VibWlzc2lvbklkKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGNvbnN0cnVjdE1hdHJpeFZhbHVlKHZhbGlkU3VibWlzc2lvbiwgbWF0cml4UXVlc3Rpb24sIGVjbUlkKSB7XG4gICAgbWF0cml4UXVlc3Rpb24udmFsdWUgPSBbXTtcbiAgICBpZiAoXG4gICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2VycyAmJlxuICAgICAgdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbbWF0cml4UXVlc3Rpb24uX2lkXSAmJlxuICAgICAgdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbbWF0cml4UXVlc3Rpb24uX2lkXS52YWx1ZVxuICAgICkge1xuICAgICAgZm9yIChjb25zdCBhbnN3ZXIgb2YgdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbbWF0cml4UXVlc3Rpb24uX2lkXS52YWx1ZSkge1xuICAgICAgICBtYXRyaXhRdWVzdGlvbi52YWx1ZS5wdXNoKFxuICAgICAgICAgIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobWF0cml4UXVlc3Rpb24uaW5zdGFuY2VRdWVzdGlvbnMpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbWF0cml4UXVlc3Rpb24udmFsdWUuZm9yRWFjaCgoaW5zdGFuY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGluc3RhbmNlLmZvckVhY2goKHF1ZXN0aW9uLCBpbnN0YW5jZUluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbbWF0cml4UXVlc3Rpb24uX2lkXSAmJlxuICAgICAgICAgICAgdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbbWF0cml4UXVlc3Rpb24uX2lkXS52YWx1ZVtpbmRleF1bXG4gICAgICAgICAgICAgIHF1ZXN0aW9uLl9pZFxuICAgICAgICAgICAgXVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcXVlc3Rpb24udmFsdWUgPVxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1ttYXRyaXhRdWVzdGlvbi5faWRdLnZhbHVlW2luZGV4XVtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5faWRcbiAgICAgICAgICAgICAgXS52YWx1ZTtcbiAgICAgICAgICAgIHF1ZXN0aW9uLnJlbWFya3MgPVxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1ttYXRyaXhRdWVzdGlvbi5faWRdLnZhbHVlW2luZGV4XVtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5faWRcbiAgICAgICAgICAgICAgXS5yZW1hcmtzO1xuICAgICAgICAgICAgcXVlc3Rpb24uZmlsZU5hbWUgPVxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1ttYXRyaXhRdWVzdGlvbi5faWRdLnZhbHVlW2luZGV4XVtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5faWRcbiAgICAgICAgICAgICAgXS5maWxlTmFtZTtcbiAgICAgICAgICAgIHF1ZXN0aW9uLmVuZFRpbWUgPVxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1ttYXRyaXhRdWVzdGlvbi5faWRdLnZhbHVlW2luZGV4XVtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5faWRcbiAgICAgICAgICAgICAgXS5lbmRUaW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtYXRyaXhRdWVzdGlvbi52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGdldEV2aWRlbmNlRGF0YShldmlkZW5jZTogRXZpZGVuY2UsIGZvcm1WYWx1ZXM6IG9iamVjdCkge1xuICAgIGxldCBzZWN0aW9ucyA9IGV2aWRlbmNlLnNlY3Rpb25zO1xuICAgIGxldCBhbnN3ZXJzID0gdGhpcy5nZXRTZWN0aW9uRGF0YShzZWN0aW9ucywgZm9ybVZhbHVlcyk7XG4gICAgbGV0IHBheWxvYWREYXRhID0ge1xuICAgICAgZXh0ZXJuYWxJZDogZXZpZGVuY2UuZXh0ZXJuYWxJZCxcbiAgICAgIGFuc3dlcnM6IGFuc3dlcnMsXG4gICAgICBzdGFydFRpbWU6IGV2aWRlbmNlLnN0YXJ0VGltZSxcbiAgICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgfTtcbiAgICByZXR1cm4gcGF5bG9hZERhdGE7XG4gIH1cblxuICBnZXRTZWN0aW9uRGF0YShzZWN0aW9ucywgZm9ybVZhbHVlcykge1xuICAgIGxldCBhbnN3ZXJzID0ge307XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNlY3Rpb25zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgYW5zd2VycyA9IHtcbiAgICAgICAgLi4uYW5zd2VycyxcbiAgICAgICAgLi4udGhpcy5jcmVhdGVwYXlsb2FkKHNlY3Rpb25zW2luZGV4XS5xdWVzdGlvbnMsIGZvcm1WYWx1ZXMpLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGFuc3dlcnM7XG4gIH1cblxuICBjcmVhdGVwYXlsb2FkKHF1ZXN0aW9ucywgZm9ybVZhbHVlcykge1xuICAgIGxldCBhbnN3ZXJzID0ge307XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHF1ZXN0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGxldCBjdXJyZW50UXVlc3Rpb24gPSBxdWVzdGlvbnNbaW5kZXhdO1xuICAgICAgaWYgKGN1cnJlbnRRdWVzdGlvbi5yZXNwb25zZVR5cGUgPT0gJ3BhZ2VRdWVzdGlvbnMnKSB7XG4gICAgICAgIGFuc3dlcnMgPSB7XG4gICAgICAgICAgLi4uYW5zd2VycyxcbiAgICAgICAgICAuLi50aGlzLmNyZWF0ZXBheWxvYWQoY3VycmVudFF1ZXN0aW9uLnBhZ2VRdWVzdGlvbnMsIGZvcm1WYWx1ZXMpLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50UXVlc3Rpb24ucmVzcG9uc2VUeXBlID09ICdtYXRyaXgnKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjdXJyZW50UXVlc3Rpb24udmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgZm9ybVZhbHVlc1tjdXJyZW50UXVlc3Rpb24uX2lkXVtpbmRleF0gPSB0aGlzLmNyZWF0ZXBheWxvYWQoXG4gICAgICAgICAgICBjdXJyZW50UXVlc3Rpb24udmFsdWVbaW5kZXhdLFxuICAgICAgICAgICAgZm9ybVZhbHVlc1tjdXJyZW50UXVlc3Rpb24uX2lkXVtpbmRleF1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBwZXJRdWVzdGlvbkRhdGEgPSB0aGlzLmZvcm1hdFRvUGF5bG9hZChjdXJyZW50UXVlc3Rpb24sIGZvcm1WYWx1ZXMpO1xuICAgICAgYW5zd2Vyc1tjdXJyZW50UXVlc3Rpb24uX2lkXSA9IHBlclF1ZXN0aW9uRGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gYW5zd2VycztcbiAgfVxuXG4gIGZvcm1hdFRvUGF5bG9hZChjdXJyZW50UXVlc3Rpb24sIGZvcm1WYWx1ZXMpIHtcbiAgICBsZXQgdmFsdWUsIGxhYmVscztcbiAgICBpZiAoY3VycmVudFF1ZXN0aW9uLnJlc3BvbnNlVHlwZSA9PSAnbWF0cml4Jykge1xuICAgICAgdmFsdWUgPSBmb3JtVmFsdWVzW2N1cnJlbnRRdWVzdGlvbi5faWRdO1xuICAgICAgbGFiZWxzID0gY3VycmVudFF1ZXN0aW9uLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IGN1cnJlbnRRdWVzdGlvbi52YWx1ZTtcbiAgICAgIGxhYmVscyA9IGZvcm1WYWx1ZXNbY3VycmVudFF1ZXN0aW9uLl9pZF07XG4gICAgICBpZiAoY3VycmVudFF1ZXN0aW9uLnJlc3BvbnNlVHlwZSA9PSAncmFkaW8nICYmIGN1cnJlbnRRdWVzdGlvbi52YWx1ZSkge1xuICAgICAgICBsYWJlbHMgPSBjdXJyZW50UXVlc3Rpb24ub3B0aW9ucy5maW5kKF8gPT4gXy52YWx1ZSA9PSBjdXJyZW50UXVlc3Rpb24udmFsdWUpLmxhYmVsXG4gICAgICB9IFxuICAgICAgaWYgKGN1cnJlbnRRdWVzdGlvbi5yZXNwb25zZVR5cGUgPT0gJ211bHRpc2VsZWN0JyAmJiBjdXJyZW50UXVlc3Rpb24udmFsdWUpIHtcbiAgICAgICAgbGFiZWxzID0gY3VycmVudFF1ZXN0aW9uLm9wdGlvbnMuZmlsdGVyKF89PmN1cnJlbnRRdWVzdGlvbi52YWx1ZS5pbmNsdWRlcyhfLnZhbHVlKSkubWFwKF89Pl8ubGFiZWwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHFpZDogY3VycmVudFF1ZXN0aW9uLl9pZCxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlbWFya3M6IGN1cnJlbnRRdWVzdGlvbi5yZW1hcmtzLFxuICAgICAgZmlsZU5hbWU6IGN1cnJlbnRRdWVzdGlvbi5maWxlTmFtZSxcbiAgICAgIGdwc0xvY2F0aW9uOiAnJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgcXVlc3Rpb246IGN1cnJlbnRRdWVzdGlvbi5xdWVzdGlvbixcbiAgICAgICAgbGFiZWxzOiB0aGlzLmNvbnZlcnRUb0FycmF5KGxhYmVscyksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogY3VycmVudFF1ZXN0aW9uLnJlc3BvbnNlVHlwZSxcbiAgICAgICAgZmlsZXNOb3RVcGxvYWRlZDogW10sIC8vdG9kb1xuICAgICAgfSxcbiAgICAgIHN0YXJ0VGltZTogY3VycmVudFF1ZXN0aW9uLnN0YXJ0VGltZSxcbiAgICAgIGVuZFRpbWU6IGN1cnJlbnRRdWVzdGlvbi5lbmRUaW1lLFxuICAgICAgY3JpdGVyaWFJZDogY3VycmVudFF1ZXN0aW9uLnBheWxvYWQuY3JpdGVyaWFJZCxcbiAgICAgIHJlc3BvbnNlVHlwZTogY3VycmVudFF1ZXN0aW9uLnJlc3BvbnNlVHlwZSxcbiAgICAgIGV2aWRlbmNlTWV0aG9kOiBjdXJyZW50UXVlc3Rpb24uZXZpZGVuY2VNZXRob2QsXG4gICAgICBydWJyaWNMZXZlbDogJycsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnZlcnRUb0FycmF5KGFycikge1xuICAgIGlmICghYXJyKSB7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH1cbiAgICBsZXQgY2xvbmVkQXJyID0gXy5jbG9uZURlZXAoYXJyKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjbG9uZWRBcnIpKSB7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW2Nsb25lZEFycl07XG4gICAgfVxuICB9XG59XG4iXX0=