commons-assessment 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +191 -0
- package/bundles/commons-assessment.umd.js +3968 -0
- package/bundles/commons-assessment.umd.js.map +1 -0
- package/commons-assessment.d.ts +5 -0
- package/esm2015/commons-assessment.js +5 -0
- package/esm2015/lib/commons-assessment.module.js +28 -0
- package/esm2015/lib/configuration.js +4 -0
- package/esm2015/lib/modules/assessment-maker/assessment-maker.component.js +409 -0
- package/esm2015/lib/modules/assessment-maker/assessment-maker.module.js +52 -0
- package/esm2015/lib/modules/assessment-maker/components/add-edit-section-introduction/add-edit-section-introduction.component.js +55 -0
- package/esm2015/lib/modules/assessment-maker/components/assessment-builder/assessment-builder.component.js +551 -0
- package/esm2015/lib/modules/assessment-maker/components/question-details/question-details.component.js +75 -0
- package/esm2015/lib/modules/assessment-maker/services/assessment-builder.service.js +150 -0
- package/esm2015/lib/modules/assessment-maker/services/assessment-maker.service.js +55 -0
- package/esm2015/lib/modules/assessment-taker/assessment-taker.component.js +618 -0
- package/esm2015/lib/modules/assessment-taker/assessment-taker.module.js +70 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-editor/question-type-editor.component.js +70 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-file-upload/question-type-file-upload.component.js +153 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-long/question-type-long.component.js +74 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-multiselect/question-type-multiselect.component.js +105 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-number/question-type-number.component.js +47 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-objective/question-type-objective.component.js +91 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-preference/question-type-preference.component.js +105 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-short/question-type-short.component.js +98 -0
- package/esm2015/lib/modules/assessment-taker/components/section-instructions/section-instructions.component.js +61 -0
- package/esm2015/lib/modules/assessment-taker/services/assessment-taker.service.js +58 -0
- package/esm2015/lib/modules/assessment-taker/services/response-builder.service.js +202 -0
- package/esm2015/lib/shared/components/text-editor/text-editor.component.js +119 -0
- package/esm2015/lib/shared/controllers.js +21 -0
- package/esm2015/lib/shared/interfaces/assessment.interface.js +2 -0
- package/esm2015/lib/shared/interfaces/question-paper.interface.js +2 -0
- package/esm2015/lib/shared/interfaces/question.interface.js +2 -0
- package/esm2015/lib/shared/material-modules.js +74 -0
- package/esm2015/lib/shared/pipes/order-by.pipe.js +25 -0
- package/esm2015/lib/shared/shared.module.js +48 -0
- package/esm2015/lib/shared/utils.js +16 -0
- package/esm2015/public-api.js +13 -0
- package/fesm2015/commons-assessment.js +3278 -0
- package/fesm2015/commons-assessment.js.map +1 -0
- package/lib/commons-assessment.module.d.ts +10 -0
- package/lib/configuration.d.ts +5 -0
- package/lib/modules/assessment-maker/assessment-maker.component.d.ts +64 -0
- package/lib/modules/assessment-maker/assessment-maker.module.d.ts +14 -0
- package/lib/modules/assessment-maker/components/add-edit-section-introduction/add-edit-section-introduction.component.d.ts +24 -0
- package/lib/modules/assessment-maker/components/assessment-builder/assessment-builder.component.d.ts +70 -0
- package/lib/modules/assessment-maker/components/question-details/question-details.component.d.ts +36 -0
- package/lib/modules/assessment-maker/services/assessment-builder.service.d.ts +43 -0
- package/lib/modules/assessment-maker/services/assessment-maker.service.d.ts +22 -0
- package/lib/modules/assessment-taker/assessment-taker.component.d.ts +81 -0
- package/lib/modules/assessment-taker/assessment-taker.module.d.ts +20 -0
- package/lib/modules/assessment-taker/components/question-type-editor/question-type-editor.component.d.ts +22 -0
- package/lib/modules/assessment-taker/components/question-type-file-upload/question-type-file-upload.component.d.ts +38 -0
- package/lib/modules/assessment-taker/components/question-type-long/question-type-long.component.d.ts +23 -0
- package/lib/modules/assessment-taker/components/question-type-multiselect/question-type-multiselect.component.d.ts +25 -0
- package/lib/modules/assessment-taker/components/question-type-number/question-type-number.component.d.ts +13 -0
- package/lib/modules/assessment-taker/components/question-type-objective/question-type-objective.component.d.ts +23 -0
- package/lib/modules/assessment-taker/components/question-type-preference/question-type-preference.component.d.ts +25 -0
- package/lib/modules/assessment-taker/components/question-type-short/question-type-short.component.d.ts +25 -0
- package/lib/modules/assessment-taker/components/section-instructions/section-instructions.component.d.ts +24 -0
- package/lib/modules/assessment-taker/services/assessment-taker.service.d.ts +20 -0
- package/lib/modules/assessment-taker/services/response-builder.service.d.ts +16 -0
- package/lib/shared/components/text-editor/text-editor.component.d.ts +24 -0
- package/lib/shared/controllers.d.ts +19 -0
- package/lib/shared/interfaces/assessment.interface.d.ts +133 -0
- package/lib/shared/interfaces/question-paper.interface.d.ts +73 -0
- package/lib/shared/interfaces/question.interface.d.ts +82 -0
- package/lib/shared/material-modules.d.ts +18 -0
- package/lib/shared/pipes/order-by.pipe.d.ts +7 -0
- package/lib/shared/shared.module.d.ts +12 -0
- package/lib/shared/utils.d.ts +2 -0
- package/package.json +22 -0
- package/public-api.d.ts +9 -0
- package/src/lib/assets/images/action-dots.svg +5 -0
- package/src/lib/assets/images/add-section.svg +4 -0
- package/src/lib/assets/images/arrow-down-black.svg +3 -0
- package/src/lib/assets/images/arrow-ramp-left.svg +3 -0
- package/src/lib/assets/images/close.svg +3 -0
- package/src/lib/assets/images/copy.svg +3 -0
- package/src/lib/assets/images/delete.svg +1 -0
- package/src/lib/assets/images/drag-drop.svg +8 -0
- package/src/lib/assets/images/file.svg +5 -0
- package/src/lib/assets/images/go-back.svg +3 -0
- package/src/lib/assets/images/info.svg +3 -0
- package/src/lib/assets/images/jpeg.svg +5 -0
- package/src/lib/assets/images/jpg.svg +5 -0
- package/src/lib/assets/images/keyboard.svg +3 -0
- package/src/lib/assets/images/no-questions.svg +14 -0
- package/src/lib/assets/images/pdf.svg +5 -0
- package/src/lib/assets/images/pencil.svg +3 -0
- package/src/lib/assets/images/plus-primary.svg +3 -0
- package/src/lib/assets/images/png.svg +5 -0
- package/src/lib/assets/images/svg.svg +5 -0
- package/src/lib/assets/json/imageConfig.json +22 -0
- package/src/lib/assets/json/labelConfig.json +96 -0
- package/src/lib/assets/json/question-builder-rules.json +97 -0
- package/src/lib/assets/json/questionTypes.json +50 -0
- package/src/lib/assets/theme/_theme.global.scss +63 -0
- package/src/lib/assets/theme/_theme.scss +568 -0
- package/src/lib/assets/theme/styles.global.scss +191 -0
- package/src/lib/assets/theme/styles.scss +63 -0
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { forkJoin } from 'rxjs';
|
|
3
|
+
import { FormControl, Validators } from '@angular/forms';
|
|
4
|
+
import { SectionInstructionsComponent } from './components/section-instructions/section-instructions.component';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "./services/assessment-taker.service";
|
|
7
|
+
import * as i2 from "@angular/forms";
|
|
8
|
+
import * as i3 from "./services/response-builder.service";
|
|
9
|
+
import * as i4 from "@angular/platform-browser";
|
|
10
|
+
import * as i5 from "@angular/material/dialog";
|
|
11
|
+
import * as i6 from "@angular/material/tabs";
|
|
12
|
+
import * as i7 from "@angular/material/expansion";
|
|
13
|
+
import * as i8 from "@angular/material/progress-spinner";
|
|
14
|
+
import * as i9 from "@angular/material/form-field";
|
|
15
|
+
import * as i10 from "@angular/material/select";
|
|
16
|
+
import * as i11 from "@angular/material/core";
|
|
17
|
+
import * as i12 from "./components/question-type-short/question-type-short.component";
|
|
18
|
+
import * as i13 from "./components/question-type-long/question-type-long.component";
|
|
19
|
+
import * as i14 from "./components/question-type-editor/question-type-editor.component";
|
|
20
|
+
import * as i15 from "./components/question-type-objective/question-type-objective.component";
|
|
21
|
+
import * as i16 from "./components/question-type-multiselect/question-type-multiselect.component";
|
|
22
|
+
import * as i17 from "./components/question-type-preference/question-type-preference.component";
|
|
23
|
+
import * as i18 from "./components/question-type-file-upload/question-type-file-upload.component";
|
|
24
|
+
import * as i19 from "@angular/common";
|
|
25
|
+
import * as i20 from "@angular/cdk/overlay";
|
|
26
|
+
import * as i21 from "../../shared/pipes/order-by.pipe";
|
|
27
|
+
export class AssessmentTakerComponent {
|
|
28
|
+
constructor(assessmentTakerService, fb, responseBuilderService, sanitizer, dialog) {
|
|
29
|
+
this.assessmentTakerService = assessmentTakerService;
|
|
30
|
+
this.fb = fb;
|
|
31
|
+
this.responseBuilderService = responseBuilderService;
|
|
32
|
+
this.sanitizer = sanitizer;
|
|
33
|
+
this.dialog = dialog;
|
|
34
|
+
this.labelConfig = {};
|
|
35
|
+
this.imageConfig = {};
|
|
36
|
+
this.showFooter = false;
|
|
37
|
+
this.assesseeData = { id: 0, actorId: 0, actorType: 'ACTOR_TYPE.BRIDGE_USER' };
|
|
38
|
+
this.assessorData = { id: 0, actorId: 0, actorType: 'TENANT' };
|
|
39
|
+
this.disabled = false;
|
|
40
|
+
this.previewMode = false;
|
|
41
|
+
this.verticalView = false;
|
|
42
|
+
this.enableMarks = false;
|
|
43
|
+
this.snackbarMessage = new EventEmitter();
|
|
44
|
+
this.submitAssessment = new EventEmitter();
|
|
45
|
+
this.showLoader = false;
|
|
46
|
+
this.questionBank = {};
|
|
47
|
+
this.assessmentQuestionPaperData = {};
|
|
48
|
+
this.assessmentData = {};
|
|
49
|
+
this.assesseeResponse = {};
|
|
50
|
+
this.configsLoaded = false;
|
|
51
|
+
this.isSubmitting = false;
|
|
52
|
+
this.sectionFormGroups = [];
|
|
53
|
+
this.selectedTabIndex = 0;
|
|
54
|
+
this.sectionErrors = [];
|
|
55
|
+
this.tenantId = 0;
|
|
56
|
+
this.tooltipState = {};
|
|
57
|
+
this.expandedState = [];
|
|
58
|
+
}
|
|
59
|
+
ngOnInit() {
|
|
60
|
+
this.getConfigsFromJSON();
|
|
61
|
+
if (this.previewMode) {
|
|
62
|
+
this.disabled = true;
|
|
63
|
+
}
|
|
64
|
+
if (this.assessmentInstanceId) {
|
|
65
|
+
this.showLoader = true;
|
|
66
|
+
this.loadAssessmentData();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
getConfigsFromJSON() {
|
|
70
|
+
forkJoin({
|
|
71
|
+
labelConfig: this.assessmentTakerService.getConfigJSON('json/labelConfig'),
|
|
72
|
+
imageConfig: this.assessmentTakerService.getConfigJSON('json/imageConfig')
|
|
73
|
+
}).subscribe((res) => {
|
|
74
|
+
this.labelConfig = Object.assign({}, res === null || res === void 0 ? void 0 : res.labelConfig, this.labelConfig);
|
|
75
|
+
this.imageConfig = Object.assign({}, res === null || res === void 0 ? void 0 : res.imageConfig, this.imageConfig);
|
|
76
|
+
this.configsLoaded = true;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
loadAssessmentData() {
|
|
80
|
+
var _a;
|
|
81
|
+
const apiCalls = Object.assign({ assessmentData: this.assessmentTakerService.getAssessmentContextById(this.assessmentId) }, (((_a = this.assesseeData) === null || _a === void 0 ? void 0 : _a.id) && {
|
|
82
|
+
assesseeResponse: this.assessmentTakerService.getAnswersByAiaId(this.assesseeData.id)
|
|
83
|
+
}));
|
|
84
|
+
forkJoin(apiCalls).subscribe({
|
|
85
|
+
next: (data) => {
|
|
86
|
+
var _a, _b, _c, _d, _e;
|
|
87
|
+
this.assessmentQuestionPaperData = (_a = data === null || data === void 0 ? void 0 : data.assessmentData) === null || _a === void 0 ? void 0 : _a.assessmentQuestionPaperDTO;
|
|
88
|
+
this.assessmentData = (_b = data === null || data === void 0 ? void 0 : data.assessmentData) === null || _b === void 0 ? void 0 : _b.assessment;
|
|
89
|
+
this.questionBank = (_c = data === null || data === void 0 ? void 0 : data.assessmentData) === null || _c === void 0 ? void 0 : _c.questionDTOMap;
|
|
90
|
+
this.tenantId = (_e = (_d = data === null || data === void 0 ? void 0 : data.assessmentData) === null || _d === void 0 ? void 0 : _d.assessment) === null || _e === void 0 ? void 0 : _e.tenantId;
|
|
91
|
+
if (data === null || data === void 0 ? void 0 : data.assesseeResponse) {
|
|
92
|
+
this.assesseeResponse = data === null || data === void 0 ? void 0 : data.assesseeResponse;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
this.assesseeResponse = {
|
|
96
|
+
id: 0,
|
|
97
|
+
assessmentInstance: { id: this.assessmentInstanceId },
|
|
98
|
+
assessee: this.assesseeData,
|
|
99
|
+
assessor: this.assessorData,
|
|
100
|
+
aiadefaultResponseList: [],
|
|
101
|
+
tenant: this.tenantId
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
this.formSetup();
|
|
105
|
+
this.showLoader = false;
|
|
106
|
+
},
|
|
107
|
+
error: error => {
|
|
108
|
+
this.snackbarMessage.emit({ message: this.labelConfig['COMMONS_ASSESSMENT.TOAST.ERROR_DEFAULT'], type: 'error' });
|
|
109
|
+
throw { error, method: 'GET' };
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
formSetup() {
|
|
114
|
+
var _a, _b;
|
|
115
|
+
this.sectionFormGroups = [];
|
|
116
|
+
(_b = (_a = this.assessmentQuestionPaperData) === null || _a === void 0 ? void 0 : _a.questionPaperSectionList) === null || _b === void 0 ? void 0 : _b.forEach(section => {
|
|
117
|
+
var _a, _b;
|
|
118
|
+
const group = {};
|
|
119
|
+
(_a = section === null || section === void 0 ? void 0 : section.sectionQuestionsList) === null || _a === void 0 ? void 0 : _a.forEach(sq => {
|
|
120
|
+
var _a;
|
|
121
|
+
const qId = sq.questionId;
|
|
122
|
+
if (!qId || !this.questionBank[qId])
|
|
123
|
+
return;
|
|
124
|
+
const question = this.questionBank[qId];
|
|
125
|
+
this.addControlForQuestion(group, question, question === null || question === void 0 ? void 0 : question.isMandatory);
|
|
126
|
+
if ((_a = question.defaultOptionsList) === null || _a === void 0 ? void 0 : _a.length) {
|
|
127
|
+
question.defaultOptionsList.forEach((option) => {
|
|
128
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
129
|
+
if (option.remarksRequired) {
|
|
130
|
+
// Pre-populate remarks if we have answers matching this option.
|
|
131
|
+
let remarkVal = null;
|
|
132
|
+
const prefilledOptions = this.getPrefilledAnswer(qId);
|
|
133
|
+
if (prefilledOptions) {
|
|
134
|
+
const ansObj = (_b = (_a = this.assesseeResponse) === null || _a === void 0 ? void 0 : _a.aiadefaultResponseList) === null || _b === void 0 ? void 0 : _b.find((a) => { var _a; return ((_a = a.sectionQuestion) === null || _a === void 0 ? void 0 : _a.questionId) === qId && (!a.childQuestionId || a.childQuestionId === 0); });
|
|
135
|
+
if (ansObj) {
|
|
136
|
+
if (((_c = question.questionType) === null || _c === void 0 ? void 0 : _c.code) === 'QUESTION_TYPE.OBJECTIVE' && prefilledOptions.id === ((_e = (_d = option.options) === null || _d === void 0 ? void 0 : _d.id) !== null && _e !== void 0 ? _e : option.id)) {
|
|
137
|
+
remarkVal = ansObj.remarks || null;
|
|
138
|
+
}
|
|
139
|
+
else if (Array.isArray(prefilledOptions)) {
|
|
140
|
+
const matchingObj = (_f = ansObj.drobjectiveresponseList) === null || _f === void 0 ? void 0 : _f.find((r) => { var _a, _b, _c, _d; return ((_b = (_a = r.defaultOption) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.id) === ((_d = (_c = option.options) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : option.id); });
|
|
141
|
+
if (matchingObj) {
|
|
142
|
+
remarkVal = matchingObj.remarks || null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const remarkCtrl = new FormControl(remarkVal);
|
|
148
|
+
if (((_h = (_g = this.assesseeResponse) === null || _g === void 0 ? void 0 : _g.assessmentTaken) === null || _h === void 0 ? void 0 : _h.code) === 'ASSESSMENT_TAKEN.COMPLETED' || this.disabled)
|
|
149
|
+
remarkCtrl.disable();
|
|
150
|
+
group[`${qId}_remarks_${option.id}`] = remarkCtrl;
|
|
151
|
+
}
|
|
152
|
+
(_j = option.childQuestionList) === null || _j === void 0 ? void 0 : _j.forEach((childId) => {
|
|
153
|
+
var _a, _b;
|
|
154
|
+
const childQues = this.questionBank[childId];
|
|
155
|
+
if (childQues) {
|
|
156
|
+
this.addControlForQuestion(group, childQues, false, true, qId, (_b = (_a = option.options) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : option.id);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
const fg = this.fb.group(group);
|
|
163
|
+
(_b = section === null || section === void 0 ? void 0 : section.sectionQuestionsList) === null || _b === void 0 ? void 0 : _b.forEach(sq => {
|
|
164
|
+
var _a, _b;
|
|
165
|
+
const qId = sq.questionId;
|
|
166
|
+
if (!qId || !this.questionBank[qId])
|
|
167
|
+
return;
|
|
168
|
+
const question = this.questionBank[qId];
|
|
169
|
+
if ((_a = question.defaultOptionsList) === null || _a === void 0 ? void 0 : _a.length) {
|
|
170
|
+
(_b = fg.get(qId.toString())) === null || _b === void 0 ? void 0 : _b.valueChanges.subscribe(val => {
|
|
171
|
+
var _a;
|
|
172
|
+
(_a = question.defaultOptionsList) === null || _a === void 0 ? void 0 : _a.forEach((option) => {
|
|
173
|
+
var _a, _b;
|
|
174
|
+
const isSelected = this.isOptionSelected(fg, question, (_a = option.options) === null || _a === void 0 ? void 0 : _a.id);
|
|
175
|
+
if (option.remarksRequired) {
|
|
176
|
+
const remarkCtrl = fg.get(`${qId}_remarks_${option.id}`);
|
|
177
|
+
if (isSelected) {
|
|
178
|
+
remarkCtrl === null || remarkCtrl === void 0 ? void 0 : remarkCtrl.setValidators([Validators.required]);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
remarkCtrl === null || remarkCtrl === void 0 ? void 0 : remarkCtrl.clearValidators();
|
|
182
|
+
remarkCtrl === null || remarkCtrl === void 0 ? void 0 : remarkCtrl.setValue(null);
|
|
183
|
+
}
|
|
184
|
+
remarkCtrl === null || remarkCtrl === void 0 ? void 0 : remarkCtrl.updateValueAndValidity();
|
|
185
|
+
}
|
|
186
|
+
if ((_b = option.childQuestionList) === null || _b === void 0 ? void 0 : _b.length) {
|
|
187
|
+
option.childQuestionList.forEach((childId) => {
|
|
188
|
+
const childQues = this.questionBank[childId];
|
|
189
|
+
if (childQues === null || childQues === void 0 ? void 0 : childQues.id) {
|
|
190
|
+
const childCtrl = fg.get(childQues.id.toString());
|
|
191
|
+
if (isSelected) {
|
|
192
|
+
const validators = this.getValidatorsForQuestion(childQues, childQues.isMandatory || false);
|
|
193
|
+
childCtrl === null || childCtrl === void 0 ? void 0 : childCtrl.setValidators(validators);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
childCtrl === null || childCtrl === void 0 ? void 0 : childCtrl.clearValidators();
|
|
197
|
+
childCtrl === null || childCtrl === void 0 ? void 0 : childCtrl.setValue(null);
|
|
198
|
+
}
|
|
199
|
+
childCtrl === null || childCtrl === void 0 ? void 0 : childCtrl.updateValueAndValidity();
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
this.sectionFormGroups.push({
|
|
208
|
+
sectionId: section.id,
|
|
209
|
+
formGroup: fg
|
|
210
|
+
});
|
|
211
|
+
this.sectionErrors.push(false);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
addControlForQuestion(group, question, isMandatory = false, isChild = false, parentId, parentOptionId) {
|
|
215
|
+
var _a, _b;
|
|
216
|
+
const qId = question.id;
|
|
217
|
+
if (!qId)
|
|
218
|
+
return;
|
|
219
|
+
const validators = this.getValidatorsForQuestion(question, isMandatory);
|
|
220
|
+
let prefilledValue = this.getPrefilledAnswer(qId, isChild, parentId, parentOptionId);
|
|
221
|
+
const control = new FormControl(prefilledValue, validators);
|
|
222
|
+
// Disable if assessment is completed
|
|
223
|
+
if (((_b = (_a = this.assesseeResponse) === null || _a === void 0 ? void 0 : _a.assessmentTaken) === null || _b === void 0 ? void 0 : _b.code) === 'ASSESSMENT_TAKEN.COMPLETED' || this.disabled) {
|
|
224
|
+
control.disable();
|
|
225
|
+
}
|
|
226
|
+
group[qId] = control;
|
|
227
|
+
// Attach mark assignment control if required
|
|
228
|
+
if (this.enableMarks && this.shouldShowMarksDropdown(question)) {
|
|
229
|
+
let markValue = this.getPrefilledMark(qId, isChild, parentId, parentOptionId);
|
|
230
|
+
group[`${qId}_marks`] = new FormControl(markValue);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
getPrefilledMark(qId, isChild = false, parentId, parentOptionId) {
|
|
234
|
+
var _a, _b;
|
|
235
|
+
if (!((_a = this.assesseeResponse) === null || _a === void 0 ? void 0 : _a.aiadefaultResponseList))
|
|
236
|
+
return null;
|
|
237
|
+
const answerObj = this.assesseeResponse.aiadefaultResponseList.find((a) => {
|
|
238
|
+
var _a;
|
|
239
|
+
if (isChild) {
|
|
240
|
+
return a.childQuestionId === qId && a.childQuestionParentQuestionId === parentId && a.childDefaultOptionId === parentOptionId;
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
return ((_a = a.sectionQuestion) === null || _a === void 0 ? void 0 : _a.questionId) === qId && (!a.childQuestionId || a.childQuestionId === 0);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
return (_b = answerObj === null || answerObj === void 0 ? void 0 : answerObj.marks) !== null && _b !== void 0 ? _b : null;
|
|
247
|
+
}
|
|
248
|
+
getQuestionWeight(qId) {
|
|
249
|
+
var _a;
|
|
250
|
+
return ((_a = this.questionBank[qId]) === null || _a === void 0 ? void 0 : _a.weight) || 0;
|
|
251
|
+
}
|
|
252
|
+
getMarksRange(qId) {
|
|
253
|
+
const max = this.getQuestionWeight(qId);
|
|
254
|
+
if (max === 0)
|
|
255
|
+
return [];
|
|
256
|
+
return Array.from({ length: Math.floor(max) + 1 }, (_, i) => i);
|
|
257
|
+
}
|
|
258
|
+
shouldShowMarksDropdown(question) {
|
|
259
|
+
var _a;
|
|
260
|
+
const autoAssignedTypes = [
|
|
261
|
+
'QUESTION_TYPE.OBJECTIVE',
|
|
262
|
+
'QUESTION_TYPE.MULTI_SELECT',
|
|
263
|
+
'QUESTION_TYPE.SCALE_RATING',
|
|
264
|
+
'QUESTION_TYPE.CONSENT',
|
|
265
|
+
'QUESTION_TYPE.MULTISELECT_HIERARCHY',
|
|
266
|
+
'QUESTION_TYPE.MULTISELECT_OPTION_RICHTEXT_REMARKS',
|
|
267
|
+
'QUESTION_TYPE.PREFERENCE'
|
|
268
|
+
];
|
|
269
|
+
const hasWeight = this.getQuestionWeight(question.id || 0) > 0;
|
|
270
|
+
return !autoAssignedTypes.includes(((_a = question.questionType) === null || _a === void 0 ? void 0 : _a.code) || '') && hasWeight;
|
|
271
|
+
}
|
|
272
|
+
getPrefilledAnswer(qId, isChild = false, parentId, parentOptionId) {
|
|
273
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
274
|
+
if (!((_a = this.assesseeResponse) === null || _a === void 0 ? void 0 : _a.aiadefaultResponseList))
|
|
275
|
+
return null;
|
|
276
|
+
const answerObj = this.assesseeResponse.aiadefaultResponseList.find((a) => {
|
|
277
|
+
var _a;
|
|
278
|
+
if (isChild) {
|
|
279
|
+
return a.childQuestionId === qId && a.childQuestionParentQuestionId === parentId && a.childDefaultOptionId === parentOptionId;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
return ((_a = a.sectionQuestion) === null || _a === void 0 ? void 0 : _a.questionId) === qId && (!a.childQuestionId || a.childQuestionId === 0);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
if (!answerObj)
|
|
286
|
+
return null;
|
|
287
|
+
const question = this.questionBank[qId];
|
|
288
|
+
if (!question)
|
|
289
|
+
return null;
|
|
290
|
+
const qType = (_b = question.questionType) === null || _b === void 0 ? void 0 : _b.code;
|
|
291
|
+
if (qType === 'QUESTION_TYPE.OBJECTIVE') {
|
|
292
|
+
return (_c = answerObj.optionId) === null || _c === void 0 ? void 0 : _c.id;
|
|
293
|
+
}
|
|
294
|
+
else if (qType === 'QUESTION_TYPE.MULTI_SELECT' || qType === 'QUESTION_TYPE.PREFERENCE') {
|
|
295
|
+
let sortedList = [...(answerObj.drobjectiveresponseList || [])];
|
|
296
|
+
if (qType === 'QUESTION_TYPE.PREFERENCE') {
|
|
297
|
+
sortedList.sort((a, b) => (a.orderNo || 0) - (b.orderNo || 0));
|
|
298
|
+
}
|
|
299
|
+
return sortedList.map((r) => { var _a; return (_a = r.defaultOption) === null || _a === void 0 ? void 0 : _a.options; }) || [];
|
|
300
|
+
}
|
|
301
|
+
else if (qType === 'QUESTION_TYPE.FILE_UPLOAD') {
|
|
302
|
+
// Fallback parsing if we only have responseText
|
|
303
|
+
return ((_d = answerObj.drsubjectiveresponseList) === null || _d === void 0 ? void 0 : _d.map((r) => {
|
|
304
|
+
try {
|
|
305
|
+
return JSON.parse(r.responseText);
|
|
306
|
+
}
|
|
307
|
+
catch (e) {
|
|
308
|
+
return { id: r.responseText }; // basic fallback
|
|
309
|
+
}
|
|
310
|
+
})) || [];
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
return (_g = (_f = (_e = answerObj.drsubjectiveresponseList) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.responseText) !== null && _g !== void 0 ? _g : null;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
getValidatorsForQuestion(question, isMandatory) {
|
|
317
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
318
|
+
const validators = [];
|
|
319
|
+
if (isMandatory) {
|
|
320
|
+
validators.push(Validators.required);
|
|
321
|
+
}
|
|
322
|
+
if (question.responseValidation) {
|
|
323
|
+
validators.push(Validators.pattern(question.responseValidation));
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
if (((_a = question.questionType) === null || _a === void 0 ? void 0 : _a.code) === 'QUESTION_TYPE.EMAIL') {
|
|
327
|
+
validators.push(Validators.pattern(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/));
|
|
328
|
+
}
|
|
329
|
+
else if (((_b = question.questionType) === null || _b === void 0 ? void 0 : _b.code) === 'QUESTION_TYPE.URL') {
|
|
330
|
+
validators.push(Validators.pattern(/^(https?:\/\/)?([\w\-]+(\.[\w\-]+)+)([\/?#].*)?$/i));
|
|
331
|
+
}
|
|
332
|
+
else if (((_c = question.questionType) === null || _c === void 0 ? void 0 : _c.code) === 'QUESTION_TYPE.CONTACT_NUMBER') {
|
|
333
|
+
validators.push(Validators.pattern(/^[0-9]{10}$/));
|
|
334
|
+
}
|
|
335
|
+
else if (((_d = question.questionType) === null || _d === void 0 ? void 0 : _d.code) === 'QUESTION_TYPE.NUMBER') {
|
|
336
|
+
validators.push(Validators.pattern(/^[0-9]+$/));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (question.questionConfigs && question.questionConfigs.length > 0) {
|
|
340
|
+
const minChar = (_e = question.questionConfigs.find(c => c.configKey === 'minCharacterCount')) === null || _e === void 0 ? void 0 : _e.configValue;
|
|
341
|
+
if (minChar)
|
|
342
|
+
validators.push(Validators.minLength(Number(minChar)));
|
|
343
|
+
const maxChar = (_f = question.questionConfigs.find(c => c.configKey === 'maxCharacterCount')) === null || _f === void 0 ? void 0 : _f.configValue;
|
|
344
|
+
if (maxChar)
|
|
345
|
+
validators.push(Validators.maxLength(Number(maxChar)));
|
|
346
|
+
const minOpt = (_g = question.questionConfigs.find(c => c.configKey === 'minimumNumberOfOption')) === null || _g === void 0 ? void 0 : _g.configValue;
|
|
347
|
+
if (minOpt) {
|
|
348
|
+
validators.push((control) => {
|
|
349
|
+
var _a;
|
|
350
|
+
if (!control.value || control.value.length < Number(minOpt)) {
|
|
351
|
+
return { minOptions: { required: Number(minOpt), actual: ((_a = control.value) === null || _a === void 0 ? void 0 : _a.length) || 0 } };
|
|
352
|
+
}
|
|
353
|
+
return null;
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
const maxOpt = (_h = question.questionConfigs.find(c => c.configKey === 'maximumNumberOfOption')) === null || _h === void 0 ? void 0 : _h.configValue;
|
|
357
|
+
if (maxOpt) {
|
|
358
|
+
validators.push((control) => {
|
|
359
|
+
var _a;
|
|
360
|
+
if (control.value && control.value.length > Number(maxOpt)) {
|
|
361
|
+
return { maxOptions: { required: Number(maxOpt), actual: ((_a = control.value) === null || _a === void 0 ? void 0 : _a.length) || 0 } };
|
|
362
|
+
}
|
|
363
|
+
return null;
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
const maxFiles = (_j = question.questionConfigs.find(c => c.configKey === 'maxNoOfFiles')) === null || _j === void 0 ? void 0 : _j.configValue;
|
|
367
|
+
if (maxFiles) {
|
|
368
|
+
validators.push((control) => {
|
|
369
|
+
var _a;
|
|
370
|
+
if (control.value && control.value.length > Number(maxFiles)) {
|
|
371
|
+
return { maxFiles: { required: Number(maxFiles), actual: ((_a = control.value) === null || _a === void 0 ? void 0 : _a.length) || 0 } };
|
|
372
|
+
}
|
|
373
|
+
return null;
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
const maxFileSize = (_k = question.questionConfigs.find(c => c.configKey === 'maxFileSize')) === null || _k === void 0 ? void 0 : _k.configValue;
|
|
377
|
+
if (maxFileSize) {
|
|
378
|
+
validators.push((control) => {
|
|
379
|
+
if (control.value && Array.isArray(control.value)) {
|
|
380
|
+
const hasLargeFile = control.value.some((file) => (file === null || file === void 0 ? void 0 : file.size) && file.size > (Number(maxFileSize) * 1024 * 1024));
|
|
381
|
+
if (hasLargeFile) {
|
|
382
|
+
return { maxFileSize: { requiredSize: Number(maxFileSize) } };
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return null;
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return validators;
|
|
390
|
+
}
|
|
391
|
+
imageErrorHandler(event, filePath) {
|
|
392
|
+
event.target.src = filePath;
|
|
393
|
+
}
|
|
394
|
+
isOptionSelected(formGroup, question, optionId) {
|
|
395
|
+
var _a;
|
|
396
|
+
if (!optionId)
|
|
397
|
+
return false;
|
|
398
|
+
let controlName = (_a = question.id) === null || _a === void 0 ? void 0 : _a.toString();
|
|
399
|
+
if (!controlName)
|
|
400
|
+
return false;
|
|
401
|
+
const control = formGroup.get(controlName);
|
|
402
|
+
if (!control || control.value == null)
|
|
403
|
+
return false;
|
|
404
|
+
// Multi-select deals with an array of values
|
|
405
|
+
if (Array.isArray(control.value)) {
|
|
406
|
+
return control.value.includes(optionId) || control.value.some((val) => (val === null || val === void 0 ? void 0 : val.id) === optionId);
|
|
407
|
+
}
|
|
408
|
+
// Objective / Single select deals with a single value (could be integer ID or object)
|
|
409
|
+
if (typeof control.value === 'object' && control.value.id) {
|
|
410
|
+
return control.value.id === optionId;
|
|
411
|
+
}
|
|
412
|
+
return control.value === optionId;
|
|
413
|
+
}
|
|
414
|
+
getMaxCharCount(question) {
|
|
415
|
+
var _a;
|
|
416
|
+
const config = (_a = question === null || question === void 0 ? void 0 : question.questionConfigs) === null || _a === void 0 ? void 0 : _a.find(c => c.configKey === 'maxCharacterCount');
|
|
417
|
+
return config ? Number(config.configValue) : 0;
|
|
418
|
+
}
|
|
419
|
+
getRemainingChars(question, control) {
|
|
420
|
+
const max = this.getMaxCharCount(question);
|
|
421
|
+
const currentLength = control.value ? control.value.length : 0;
|
|
422
|
+
return max - currentLength;
|
|
423
|
+
}
|
|
424
|
+
goBack() {
|
|
425
|
+
if (this.selectedTabIndex > 0) {
|
|
426
|
+
this.selectedTabIndex--;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
shouldDisableTab(index) {
|
|
430
|
+
var _a, _b;
|
|
431
|
+
for (let j = 0; j < index; j++) {
|
|
432
|
+
if ((_b = (_a = this.sectionFormGroups[j]) === null || _a === void 0 ? void 0 : _a.formGroup) === null || _b === void 0 ? void 0 : _b.invalid) {
|
|
433
|
+
return true;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return false;
|
|
437
|
+
}
|
|
438
|
+
goNext(markAsCompleted = true) {
|
|
439
|
+
var _a, _b, _c;
|
|
440
|
+
const save = ((_c = (_b = (_a = this.assessmentData) === null || _a === void 0 ? void 0 : _a.assessmentConfigs) === null || _b === void 0 ? void 0 : _b.find(c => c.configKey == 'assesment.config.allowed-partial-response')) === null || _c === void 0 ? void 0 : _c.configValue) == '1';
|
|
441
|
+
const currentSection = this.sectionFormGroups[this.selectedTabIndex];
|
|
442
|
+
if (!currentSection)
|
|
443
|
+
return;
|
|
444
|
+
currentSection.formGroup.markAllAsTouched();
|
|
445
|
+
if (currentSection.formGroup.invalid) {
|
|
446
|
+
this.sectionErrors[this.selectedTabIndex] = true;
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
this.sectionErrors[this.selectedTabIndex] = false;
|
|
450
|
+
if (this.selectedTabIndex < this.sectionFormGroups.length - 1) {
|
|
451
|
+
save ? this.save() : this.selectedTabIndex++;
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
this.processSubmit(markAsCompleted);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
processSubmit(markAsCompleted = true) {
|
|
458
|
+
let firstInvalidIndex = -1;
|
|
459
|
+
this.sectionFormGroups.forEach((group, index) => {
|
|
460
|
+
group.formGroup.markAllAsTouched();
|
|
461
|
+
if (group.formGroup.invalid) {
|
|
462
|
+
this.sectionErrors[index] = true;
|
|
463
|
+
if (firstInvalidIndex === -1)
|
|
464
|
+
firstInvalidIndex = index;
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
this.sectionErrors[index] = false;
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
if (firstInvalidIndex !== -1) {
|
|
471
|
+
if (!this.verticalView) {
|
|
472
|
+
this.selectedTabIndex = firstInvalidIndex;
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
this.expandedState[firstInvalidIndex] = true;
|
|
476
|
+
}
|
|
477
|
+
this.snackbarMessage.emit({ message: this.labelConfig['COMMONS_ASSESSMENT.TOAST.FIX_ERRORS'], type: 'error' });
|
|
478
|
+
this.scrollToFirstInvalidField(firstInvalidIndex);
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
this.save(true, markAsCompleted);
|
|
482
|
+
}
|
|
483
|
+
scrollToFirstInvalidField(sectionIndex) {
|
|
484
|
+
setTimeout(() => {
|
|
485
|
+
const formGroup = this.sectionFormGroups[sectionIndex].formGroup;
|
|
486
|
+
for (const controlName in formGroup.controls) {
|
|
487
|
+
if (formGroup.controls[controlName].invalid) {
|
|
488
|
+
let qId = controlName;
|
|
489
|
+
if (controlName.includes('_remarks_') || controlName.includes('_marks')) {
|
|
490
|
+
qId = controlName.split('_')[0];
|
|
491
|
+
}
|
|
492
|
+
const element = document.getElementById(`question-container-${qId}`);
|
|
493
|
+
if (element) {
|
|
494
|
+
element.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
495
|
+
break;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}, 100);
|
|
500
|
+
}
|
|
501
|
+
save(goNext = true, markAsCompleted = true) {
|
|
502
|
+
var _a;
|
|
503
|
+
this.isSubmitting = true;
|
|
504
|
+
if (markAsCompleted && this.selectedTabIndex == this.sectionFormGroups.length - 1) {
|
|
505
|
+
this.assesseeResponse.assessmentTaken = { code: 'ASSESSMENT_TAKEN.COMPLETED' };
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
this.assesseeResponse.assessmentTaken = { code: 'ASSESSMENT_TAKEN.INCOMPLETE' };
|
|
509
|
+
}
|
|
510
|
+
const payload = this.responseBuilderService.buildResponsePayload(this.assesseeResponse, this.assessmentQuestionPaperData, this.sectionFormGroups, this.questionBank, this.tenantId);
|
|
511
|
+
const apiCall = ((_a = this.assesseeResponse) === null || _a === void 0 ? void 0 : _a.id) ? this.assessmentTakerService.patchAssessment(payload) : this.assessmentTakerService.submitAssessment(payload);
|
|
512
|
+
apiCall.subscribe({
|
|
513
|
+
next: (res) => {
|
|
514
|
+
var _a, _b;
|
|
515
|
+
if (!((_a = this.assesseeResponse) === null || _a === void 0 ? void 0 : _a.id)) {
|
|
516
|
+
this.getAnswersByAiaId(res);
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
this.assesseeResponse = res;
|
|
520
|
+
}
|
|
521
|
+
this.isSubmitting = false;
|
|
522
|
+
this.submitAssessment.emit({ assesseeId: ((_b = res === null || res === void 0 ? void 0 : res.assessee) === null || _b === void 0 ? void 0 : _b.id) || res, completed: goNext && (this.selectedTabIndex == this.sectionFormGroups.length - 1 || this.verticalView) });
|
|
523
|
+
if (goNext && this.selectedTabIndex < this.sectionFormGroups.length - 1) {
|
|
524
|
+
this.selectedTabIndex++;
|
|
525
|
+
}
|
|
526
|
+
},
|
|
527
|
+
error: error => {
|
|
528
|
+
var _a;
|
|
529
|
+
this.isSubmitting = false;
|
|
530
|
+
this.snackbarMessage.emit({ message: this.labelConfig['COMMONS_ASSESSMENT.TOAST.SAVE_FAILED'], type: 'error' });
|
|
531
|
+
throw { error, method: ((_a = this.assesseeResponse) === null || _a === void 0 ? void 0 : _a.id) ? 'PATCH' : 'POST', payload };
|
|
532
|
+
}
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
getAnswersByAiaId(assesseeId) {
|
|
536
|
+
this.assessmentTakerService.getAnswersByAiaId(assesseeId).subscribe({
|
|
537
|
+
next: (res) => {
|
|
538
|
+
this.assesseeResponse = res;
|
|
539
|
+
},
|
|
540
|
+
error: error => {
|
|
541
|
+
this.snackbarMessage.emit({ message: this.labelConfig['COMMONS_ASSESSMENT.TOAST.GET_FAILED'], type: 'error' });
|
|
542
|
+
throw { error, method: 'GET' };
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
addYoutubeIframeSrc(videoUrl) {
|
|
547
|
+
const videoId = this.getVideoId(videoUrl);
|
|
548
|
+
const youtubeUrl = `https://www.youtube.com/embed/${videoId}`;
|
|
549
|
+
return this.sanitizer.bypassSecurityTrustResourceUrl(youtubeUrl);
|
|
550
|
+
}
|
|
551
|
+
getVideoId(videoUrl) {
|
|
552
|
+
let pattern = null;
|
|
553
|
+
if (videoUrl.includes('youtube.com')) {
|
|
554
|
+
pattern = /(?:\?v=|&v=|youtu\.be\/|\/embed\/|\/\d\/|\/vi\/|\/v\/|https?:\/\/(?:www\.)?youtube\.com\/(?:v\/|embed\/|watch\?(?:\S+&)?v=|watch\?(?:\S+&)?vi=|\S+\/))([a-zA-Z0-9_-]{11})/;
|
|
555
|
+
}
|
|
556
|
+
else if (videoUrl.includes('youtu.be')) {
|
|
557
|
+
pattern = /youtu\.be\/([a-zA-Z0-9_-]{11})/;
|
|
558
|
+
}
|
|
559
|
+
if (pattern) {
|
|
560
|
+
const match = videoUrl.match(pattern);
|
|
561
|
+
if (match && match[1]) {
|
|
562
|
+
return match[1];
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
return null;
|
|
566
|
+
}
|
|
567
|
+
openInstructionsDialog(section) {
|
|
568
|
+
this.dialog.open(SectionInstructionsComponent, {
|
|
569
|
+
autoFocus: false,
|
|
570
|
+
maxWidth: '95%',
|
|
571
|
+
width: 'calc(20rem + 500px)',
|
|
572
|
+
maxHeight: '95dvh',
|
|
573
|
+
panelClass: ['assessment-dialog'],
|
|
574
|
+
data: {
|
|
575
|
+
imageConfig: this.imageConfig,
|
|
576
|
+
labelConfig: this.labelConfig,
|
|
577
|
+
sectionDetails: section
|
|
578
|
+
},
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
AssessmentTakerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AssessmentTakerComponent, deps: [{ token: i1.AssessmentTakerService }, { token: i2.FormBuilder }, { token: i3.ResponseBuilderService }, { token: i4.DomSanitizer }, { token: i5.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
583
|
+
AssessmentTakerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AssessmentTakerComponent, selector: "lib-assessment-taker", inputs: { labelConfig: "labelConfig", imageConfig: "imageConfig", showFooter: "showFooter", assessmentId: "assessmentId", assessmentInstanceId: "assessmentInstanceId", assesseeData: "assesseeData", assessorData: "assessorData", disabled: "disabled", previewMode: "previewMode", verticalView: "verticalView", enableMarks: "enableMarks" }, outputs: { snackbarMessage: "snackbarMessage", submitAssessment: "submitAssessment" }, ngImport: i0, template: "<div *ngIf=\"configsLoaded && !showLoader; else loader\" class=\"col-12 h-100\">\r\n <div class=\"col-12 h-100 py-4\" [class.height-without-footer]=\"showFooter\">\r\n <ng-container *ngIf=\"assessmentQuestionPaperData?.questionPaperSectionList?.length\">\r\n <mat-tab-group *ngIf=\"!verticalView\" animationDuration=\"0ms\" class=\"assessment-mat-custom-tabs\"\r\n [(selectedIndex)]=\"selectedTabIndex\">\r\n <mat-tab\r\n *ngFor=\"let section of assessmentQuestionPaperData.questionPaperSectionList | orderBy; let i = index\"\r\n [disabled]=\"shouldDisableTab(i)\">\r\n <ng-template mat-tab-label>\r\n <span class=\"assessment-text-semibold-16\"\r\n [ngClass]=\"sectionErrors[i] ? 'assessment-text-danger' : ''\">{{section.qpsName?.[0]?.text}}</span>\r\n </ng-template>\r\n <div class=\"mt-4\">\r\n <ng-container\r\n *ngTemplateOutlet=\"sectionContent; context: { section: section, i: i }\"></ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <mat-accordion *ngIf=\"verticalView\" multi=\"true\" class=\"d-flex flex-column gap-4 mb-4\">\r\n <mat-expansion-panel\r\n *ngFor=\"let section of assessmentQuestionPaperData.questionPaperSectionList | orderBy; let i = index\"\r\n [expanded]=\"expandedState[i] !== false\" (opened)=\"expandedState[i] = true\"\r\n (closed)=\"expandedState[i] = false\"\r\n class=\"assessment-border-radius-two shadow-none m-0 assessment-panel\">\r\n <mat-expansion-panel-header class=\"assessment-bg-grey-two h-auto py-3 bg-transparent\">\r\n <mat-panel-title>\r\n <span class=\"assessment-text-semibold-16\"\r\n [ngClass]=\"sectionErrors[i] ? 'assessment-text-danger' : ''\">{{section.qpsName?.[0]?.text}}</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"mt-4 px-md-3\">\r\n <ng-container\r\n *ngTemplateOutlet=\"sectionContent; context: { section: section, i: i }\"></ng-container>\r\n </div>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!assessmentQuestionPaperData?.questionPaperSectionList?.length\"\r\n class=\"h-100 d-flex flex-column align-items-center justify-content-center gap-3\">\r\n <img [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.NO_QUESTIONS']\" class=\"col-sm-auto col-6\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/no-questions.svg')\" />\r\n <div class=\"text-center\">\r\n <p class=\"mb-1 assessment-text-medium-18\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.NO_QUESTIONS']}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"showFooter\"\r\n class=\"bg-white p-3 position-sticky bottom-0 d-flex align-items-center justify-content-end border-top gap-3 z-index-1\">\r\n <button\r\n class=\"assessment-zoom-animation assessment-border-radius-two assessment-button-padding-large assessment-btn-primary-transparent assessment-text-semibold-13\"\r\n (click)=\"goBack()\" *ngIf=\"selectedTabIndex > 0 && !verticalView\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.GO_BACK']}}</button>\r\n <button [disabled]=\"isSubmitting\" (click)=\"verticalView ? processSubmit(true) : goNext()\"\r\n class=\"assessment-zoom-animation assessment-border-radius-two assessment-button-padding-large assessment-btn-primary assessment-text-semibold-13 position-relative\">\r\n <span [ngClass]=\"{'opacity-0': isSubmitting}\">\r\n {{ (verticalView || selectedTabIndex === sectionFormGroups.length - 1) ?\r\n labelConfig['COMMONS_ASSESSMENT.LABEL.SUBMIT'] : labelConfig['COMMONS_ASSESSMENT.LABEL.NEXT'] }}\r\n </span>\r\n <mat-spinner *ngIf=\"isSubmitting\" [diameter]=\"20\"\r\n class=\"position-absolute top-50 start-50 translate-middle assessment-spinner-white\"></mat-spinner>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #loader>\r\n <div class=\"h-100 col-12 d-flex align-items-center justify-content-center py-5\">\r\n <mat-spinner diameter=\"60\" class=\"assessment-spinner-primary\"></mat-spinner>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Recursive Template for Questions & Child Questions -->\r\n<ng-template #questionTemplate let-questionId=\"questionId\" let-isMandatory=\"isMandatory\" let-groupIndex=\"groupIndex\"\r\n let-parentOptionId=\"parentOptionId\" let-questionIndex=\"questionIndex\">\r\n <div [formGroup]=\"sectionFormGroups[groupIndex].formGroup\" [id]=\"'question-container-' + questionId\">\r\n <div class=\"assessment-border-radius-two mb-3\" [ngClass]=\"parentOptionId? '' : 'p-3 assessment-card-border'\"\r\n *ngIf=\"questionBank[questionId] as question\">\r\n <div\r\n class=\"d-flex flex-column flex-md-row justify-content-between gap-2 gap-md-3 align-items-md-start mb-3\">\r\n <div class=\"d-flex gap-md-3 gap-2 align-items-start flex-grow-1\">\r\n <div class=\"flex-grow-1\">\r\n <p class=\"assessment-text-medium-15 mb-0 d-flex gap-1 gap-md-2\">\r\n {{questionIndex + 1}}.\r\n <span [innerHtml]=\"question.questionText?.[0]?.text\"></span>\r\n </p>\r\n <div class=\"mt-3 col-12\" *ngIf=\"question?.mediaUrl\">\r\n <ng-container\r\n *ngTemplateOutlet=\"VideoTemplate; context:{videoUrl:question?.mediaUrl}\"></ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"question.hintText && !previewMode\">\r\n <img [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.INFO']\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/info.svg')\"\r\n cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\"\r\n (mouseenter)=\"tooltipState[question.id!] = true\"\r\n (mouseleave)=\"tooltipState[question.id!] = false\" class=\"cursor-pointer\" />\r\n <ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"trigger\"\r\n [cdkConnectedOverlayOpen]=\"tooltipState[question.id!] || false\"\r\n [cdkConnectedOverlayPositions]=\"[{ originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -8, offsetY: 0 }, { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 8, offsetY: 0 }]\">\r\n <div class=\"assessment-bg-grey-two assessment-tooltip-border p-3 assessment-border-radius-two assessment-box-shadow-tooltip question-info assessment-text-regular-13\"\r\n (mouseenter)=\"tooltipState[question.id!] = true\"\r\n (mouseleave)=\"tooltipState[question.id!] = false\" [innerHTML]=\"question.hintText\">\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Assessor Marks Dropdown Logic -->\r\n <ng-container\r\n *ngIf=\"enableMarks && shouldShowMarksDropdown(question) && sectionFormGroups[groupIndex].formGroup.get(question.id + '_marks')\">\r\n <mat-form-field appearance=\"outline\"\r\n class=\"mb-0 assessment-marks-dropdown assessment-text-medium-12\">\r\n <mat-label\r\n class=\"assessment-text-medium-12\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.MARKS']}}</mat-label>\r\n <mat-select [formControlName]=\"question.id + '_marks'\">\r\n <mat-option class=\"assessment-text-medium-12\"\r\n *ngFor=\"let mark of getMarksRange(question.id!)\" [value]=\"mark\">\r\n {{mark}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container [ngSwitch]=\"question.questionType?.code\">\r\n\r\n <div class=\"col-12\" *ngSwitchCase=\"'QUESTION_TYPE.SUBJECTIVE_SHORT'\">\r\n <lib-question-type-short [question]=\"question\" [formControlName]=\"question.id!\"\r\n [required]=\"isMandatory\" [previewMode]=\"previewMode\"\r\n [labelConfig]=\"labelConfig\"></lib-question-type-short>\r\n </div>\r\n\r\n <div class=\"col-12\" *ngSwitchCase=\"'QUESTION_TYPE.SUBJECTIVE_LONG'\">\r\n <lib-question-type-long [question]=\"question\" [formControlName]=\"question.id!\"\r\n [required]=\"isMandatory\" [previewMode]=\"previewMode\"\r\n [labelConfig]=\"labelConfig\"></lib-question-type-long>\r\n </div>\r\n\r\n <div class=\"col-12\" *ngSwitchCase=\"'QUESTION_TYPE.SUBJECTIVE_RICH_TEXT'\">\r\n <lib-question-type-editor [question]=\"question\" [formControlName]=\"question.id!\"\r\n [required]=\"isMandatory\" [previewMode]=\"previewMode\"\r\n [labelConfig]=\"labelConfig\"></lib-question-type-editor>\r\n </div>\r\n\r\n <div class=\"col-12\" *ngSwitchCase=\"'QUESTION_TYPE.OBJECTIVE'\">\r\n <lib-question-type-objective [question]=\"question\" [formControlName]=\"question.id!\"\r\n [required]=\"isMandatory\"></lib-question-type-objective>\r\n </div>\r\n\r\n <div class=\"col-12\" *ngSwitchCase=\"'QUESTION_TYPE.MULTI_SELECT'\">\r\n <lib-question-type-multiselect [question]=\"question\" [formControlName]=\"question.id!\"\r\n [required]=\"isMandatory\"></lib-question-type-multiselect>\r\n </div>\r\n\r\n <div class=\"col-12\" *ngSwitchCase=\"'QUESTION_TYPE.PREFERENCE'\">\r\n <lib-question-type-preference [question]=\"question\" [formControlName]=\"question.id!\"\r\n [required]=\"isMandatory\"></lib-question-type-preference>\r\n </div>\r\n\r\n <div class=\"col-12\" *ngSwitchCase=\"'QUESTION_TYPE.NUMBER'\">\r\n <lib-question-type-short [question]=\"question\" [formControlName]=\"question.id!\"\r\n [required]=\"isMandatory\" [previewMode]=\"previewMode\"\r\n [labelConfig]=\"labelConfig\"></lib-question-type-short>\r\n </div>\r\n\r\n <div class=\"col-12\" *ngSwitchCase=\"'QUESTION_TYPE.EMAIL'\">\r\n <lib-question-type-short [question]=\"question\" [formControlName]=\"question.id!\"\r\n [required]=\"isMandatory\" [previewMode]=\"previewMode\"\r\n [labelConfig]=\"labelConfig\"></lib-question-type-short>\r\n </div>\r\n\r\n <div class=\"col-12\" *ngSwitchCase=\"'QUESTION_TYPE.CONTACT_NUMBER'\">\r\n <lib-question-type-short [question]=\"question\" [formControlName]=\"question.id!\"\r\n [required]=\"isMandatory\" [previewMode]=\"previewMode\"\r\n [labelConfig]=\"labelConfig\"></lib-question-type-short>\r\n </div>\r\n\r\n <div class=\"col-12\" *ngSwitchCase=\"'QUESTION_TYPE.URL'\">\r\n <lib-question-type-short [question]=\"question\" [formControlName]=\"question.id!\"\r\n [required]=\"isMandatory\" [previewMode]=\"previewMode\"\r\n [labelConfig]=\"labelConfig\"></lib-question-type-short>\r\n </div>\r\n\r\n <div class=\"col-12\" *ngSwitchCase=\"'QUESTION_TYPE.FILE_UPLOAD'\">\r\n <lib-question-type-file-upload [question]=\"question\" [formControlName]=\"question.id!\"\r\n [required]=\"isMandatory\" [labelConfig]=\"labelConfig\"\r\n [imageConfig]=\"imageConfig\"></lib-question-type-file-upload>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Error Messages and Character Count Container -->\r\n <ng-container *ngIf=\"sectionFormGroups[groupIndex].formGroup.get(question.id?.toString() || '') as control\">\r\n <div class=\"d-flex justify-content-between align-items-start mt-1\">\r\n <span>\r\n <mat-error class=\"assessment-text-regular-12 assessment-text-danger\"\r\n *ngIf=\"control.touched && control.errors?.['required']\">\r\n {{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED_RESPONSE']}}\r\n </mat-error>\r\n\r\n <mat-error class=\"assessment-text-regular-12 assessment-text-danger mt-1\"\r\n *ngIf=\"control.touched && control.errors?.['pattern']\">\r\n {{question?.validationMessage || labelConfig['COMMONS_ASSESSMENT.ERROR.INVALID_FORMAT']}}\r\n </mat-error>\r\n\r\n <mat-error class=\"assessment-text-regular-12 assessment-text-danger mt-1\"\r\n *ngIf=\"control.touched && control.errors?.['minlength']\">\r\n {{labelConfig['COMMONS_ASSESSMENT.ERROR.MIN_CHARS']?.replace('{{length}}',\r\n control.errors?.['minlength'].requiredLength + '')}}\r\n </mat-error>\r\n\r\n <mat-error class=\"assessment-text-regular-12 assessment-text-danger mt-1\"\r\n *ngIf=\"control.touched && control.errors?.['maxlength']\">\r\n {{labelConfig['COMMONS_ASSESSMENT.ERROR.MAX_CHARS']?.replace('{{length}}',\r\n control.errors?.['maxlength'].requiredLength + '')}}\r\n </mat-error>\r\n\r\n <mat-error class=\"assessment-text-regular-12 assessment-text-danger mt-1\"\r\n *ngIf=\"control.touched && control.errors?.['minOptions']\">\r\n {{labelConfig['COMMONS_ASSESSMENT.ERROR.MIN_OPTIONS']?.replace('{{count}}',\r\n control.errors?.['minOptions'].required + '')}}\r\n </mat-error>\r\n\r\n <mat-error class=\"assessment-text-regular-12 assessment-text-danger mt-1\"\r\n *ngIf=\"control.touched && control.errors?.['maxOptions']\">\r\n {{labelConfig['COMMONS_ASSESSMENT.ERROR.MAX_OPTIONS']?.replace('{{count}}',\r\n control.errors?.['maxOptions'].required + '')}}\r\n </mat-error>\r\n\r\n <mat-error class=\"assessment-text-regular-12 assessment-text-danger mt-1\"\r\n *ngIf=\"control.touched && control.errors?.['maxFiles']\">\r\n {{labelConfig['COMMONS_ASSESSMENT.ERROR.MAX_FILES']?.replace('{{count}}',\r\n control.errors?.['maxFiles'].required + '')}}\r\n </mat-error>\r\n\r\n <mat-error class=\"assessment-text-regular-12 assessment-text-danger mt-1\"\r\n *ngIf=\"control.touched && control.errors?.['maxFileSize']\">\r\n {{labelConfig['COMMONS_ASSESSMENT.ERROR.MAX_FILE_SIZE']?.replace('{{size}}',\r\n control.errors?.['maxFileSize'].requiredSize + '')}}\r\n </mat-error>\r\n </span>\r\n\r\n <div class=\"assessment-text-regular-12 assessment-text-grey-seven white-space-nowrap ms-2\"\r\n *ngIf=\"getMaxCharCount(question) > 0\">\r\n {{ getRemainingChars(question, control) }}\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.CHARACTER']}}{{getRemainingChars(question, control) !==\r\n 1\r\n ? 's' : ''}} {{labelConfig['COMMONS_ASSESSMENT.LABEL.REMAINING']}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n <!-- Child Questions and Remarks Rendering Logic based on checked form state -->\r\n <ng-container *ngIf=\"question.defaultOptionsList?.length\">\r\n <ng-container *ngFor=\"let option of question.defaultOptionsList\">\r\n\r\n <ng-container\r\n *ngIf=\"isOptionSelected(sectionFormGroups[groupIndex].formGroup, question, option.options?.id)\">\r\n\r\n <!-- REMARKS FIELD -->\r\n <div class=\"mt-3\"\r\n *ngIf=\"option.remarksRequired && sectionFormGroups[groupIndex].formGroup.get(question.id + '_remarks_' + option.id) as remarksControl\">\r\n <p class=\"assessment-text-regular-15 mb-2\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.REMARKS']}}</p>\r\n <textarea formControlName=\"{{question.id}}_remarks_{{option.id}}\" rows=\"2\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.REMARKS']\"\r\n [ngClass]=\"remarksControl.invalid && remarksControl.touched ? 'assessment-input-border-invalid' : ''\"\r\n class=\"col-12 assessment-text-regular-13 assessment-input-border-one assessment-border-radius-two assessment-input-padding outline-0 assessment-bg-grey-one\"></textarea>\r\n <mat-error class=\"assessment-text-regular-12 assessment-text-danger mt-1\"\r\n *ngIf=\"remarksControl.invalid && remarksControl.touched\">\r\n {{labelConfig['COMMONS_ASSESSMENT.ERROR.FIELD_REQUIRED']}}\r\n </mat-error>\r\n </div>\r\n\r\n <!-- CHILD QUESTIONS RECURSION -->\r\n <div class=\"col-12 mt-3\" *ngIf=\"option.childQuestionList?.length\">\r\n <ng-container *ngFor=\"let childId of option.childQuestionList; let childIndex = index\">\r\n <ng-container *ngTemplateOutlet=\"questionTemplate; context: {\r\n questionId: childId,\r\n isMandatory: questionBank[childId]?.isMandatory,\r\n groupIndex: groupIndex,\r\n parentOptionId: option.id,\r\n questionIndex: childIndex\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Reusable Section Form Template -->\r\n<ng-template #sectionContent let-section=\"section\" let-i=\"i\">\r\n <form class=\"w-100\" [formGroup]=\"sectionFormGroups[i].formGroup\" [name]=\"'sectionfrm-' + i\" novalidate>\r\n <div class=\"d-flex justify-content-between align-items-center mb-4\">\r\n <span class=\"assessment-text-semibold-14 assessment-text-grey-ten\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.TOTAL_QUESTIONS']}}{{ section?.totalQuestions || 0 }}\r\n </span>\r\n <button (click)=\"openInstructionsDialog(section)\"\r\n *ngIf=\"!previewMode && (section?.qpsDesc?.[0]?.text || section?.mediaUrl)\"\r\n class=\"assessment-zoom-animation assessment-button-padding assessment-text-medium-13 assessment-btn-primary-transparent\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.VIEW_INSTRUCTIONS']}}\r\n </button>\r\n </div>\r\n\r\n <ng-container *ngFor=\"let sq of section.sectionQuestionsList | orderBy; let j = index\">\r\n <ng-container *ngTemplateOutlet=\"questionTemplate; context: {\r\n questionId: sq.questionId,\r\n isMandatory: questionBank[sq.questionId]?.isMandatory,\r\n groupIndex: i,\r\n parentOptionId: null,\r\n questionIndex: j\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n </form>\r\n</ng-template>\r\n\r\n<!-- video preview -->\r\n<ng-template let-videoUrl=\"videoUrl\" #VideoTemplate>\r\n <div class=\"assessment-border-radius-two overflow-hidden col-md-10 col-12\">\r\n <video *ngIf=\"videoUrl?.includes('.mp4') else youtubeVideo\" width=\"400\" controls class=\"mw-100 d-block mx-auto\">\r\n <source [src]=\"videoUrl\" type=\"video/mp4\">\r\n </video>\r\n <ng-template #youtubeVideo>\r\n <div class=\"youtube-video position-relative h-100\">\r\n <iframe [src]=\"addYoutubeIframeSrc(videoUrl)\" title=\"YouTube video player\" frameborder=\"0\"\r\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\r\n allowfullscreen class=\"position-absolute top-0 start-0 w-100 h-100 d-block\">\r\n </iframe>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</ng-template>", styles: [".assessment-text-grey-ten{color:var(--assessment-grey-ten)!important}.assessment-bg-grey-ten{background-color:var(--assessment-grey-ten)!important}.assessment-text-grey-nine{color:var(--assessment-grey-nine)!important}.assessment-bg-grey-nine{background-color:var(--assessment-grey-nine)!important}.assessment-text-grey-eight{color:var(--assessment-grey-eight)!important}.assessment-bg-grey-eight{background-color:var(--assessment-grey-eight)!important}.assessment-text-grey-seven{color:var(--assessment-grey-seven)!important}.assessment-bg-grey-seven{background-color:var(--assessment-grey-seven)!important}.assessment-text-grey-six{color:var(--assessment-grey-six)!important}.assessment-bg-grey-six{background-color:var(--assessment-grey-six)!important}.assessment-text-grey-five{color:var(--assessment-grey-five)!important}.assessment-bg-grey-five{background-color:var(--assessment-grey-five)!important}.assessment-text-grey-four{color:var(--assessment-grey-four)!important}.assessment-bg-grey-four{background-color:var(--assessment-grey-four)!important}.assessment-text-grey-three{color:var(--assessment-grey-three)!important}.assessment-bg-grey-three{background-color:var(--assessment-grey-three)!important}.assessment-text-grey-two{color:var(--assessment-grey-two)!important}.assessment-bg-grey-two{background-color:var(--assessment-grey-two)!important}.assessment-text-grey-one{color:var(--assessment-grey-one)!important}.assessment-bg-grey-one{background-color:var(--assessment-grey-one)!important}.assessment-text-white{color:var(--assessment-white)!important}.assessment-bg-white{background-color:var(--assessment-white)!important}.assessment-text-black{color:var(--assessment-black)!important}.assessment-bg-black{background-color:var(--assessment-black)!important}.assessment-text-danger{color:var(--assessment-danger)!important}.assessment-bg-danger{background-color:var(--assessment-danger)!important}.assessment-text-primary-one{color:var(--assessment-primary-one)!important}.assessment-bg-primary-one{background-color:var(--assessment-primary-one)!important}.assessment-text-primary-four{color:var(--assessment-primary-four)!important}.assessment-bg-primary-four{background-color:var(--assessment-primary-four)!important}.assessment-text-palette-EDF3FD{color:var(--assessment-palette-EDF3FD)!important}.assessment-bg-palette-EDF3FD{background-color:var(--assessment-palette-EDF3FD)!important}.assessment-text-palette-C8DAF9{color:var(--assessment-palette-C8DAF9)!important}.assessment-bg-palette-C8DAF9{background-color:var(--assessment-palette-C8DAF9)!important}.assessment-text-palette-ADC9F6{color:var(--assessment-palette-ADC9F6)!important}.assessment-bg-palette-ADC9F6{background-color:var(--assessment-palette-ADC9F6)!important}.assessment-text-palette-FEF9F1{color:var(--assessment-palette-FEF9F1)!important}.assessment-bg-palette-FEF9F1{background-color:var(--assessment-palette-FEF9F1)!important}.assessment-text-palette-F9DAA6{color:var(--assessment-palette-F9DAA6)!important}.assessment-bg-palette-F9DAA6{background-color:var(--assessment-palette-F9DAA6)!important}.assessment-text-palette-E8F7F0{color:var(--assessment-palette-E8F7F0)!important}.assessment-bg-palette-E8F7F0{background-color:var(--assessment-palette-E8F7F0)!important}.assessment-text-palette-B7E7CF{color:var(--assessment-palette-B7E7CF)!important}.assessment-bg-palette-B7E7CF{background-color:var(--assessment-palette-B7E7CF)!important}.assessment-box-shadow-one{box-shadow:var(--assessment-box-shadow-one)!important}.assessment-border-radius-one{border-radius:var(--assessment-border-radius-one)!important}.assessment-border-radius-two{border-radius:var(--assessment-border-radius-two)!important}.assessment-border-radius-three{border-radius:var(--assessment-border-radius-three)!important}.assessment-border-radius-four{border-radius:var(--assessment-border-radius-four)!important}.assessment-border-radius-five{border-radius:var(--assessment-border-radius-five)!important}.assessment-border-radius-six{border-radius:var(--assessment-border-radius-six)!important}.assessment-input-border-one{border:var(--assessment-input-border-one)!important}.assessment-input-border-invalid{border:var(--assessment-input-border-invalid)!important}.assessment-input-focus-border{border:var(--assessment-input-focus-border)!important}.assessment-border-two{border:var(--assessment-border-two)!important}.assessment-card-border{border:var(--assessment-card-border)!important}.assessment-tooltip-border{border:var(--assessment-tooltip-border)!important}.assessment-box-shadow-tooltip{box-shadow:var(--assessment-box-shadow-tooltip)!important}.assessment-button-padding{padding:var(--assessment-button-padding)!important}.assessment-button-padding-large{padding:var(--assessment-button-padding-large)!important}.assessment-input-padding{padding:var(--assessment-input-padding)!important}.assessment-text-font-family{color:var(--assessment-font-family)!important}.assessment-bg-font-family{background-color:var(--assessment-font-family)!important}.assessment-text-regular-12{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(.48rem + .3vw);line-height:calc(.9rem + .3vw)}.assessment-text-bold-12{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.48rem + .3vw);line-height:calc(.9rem + .3vw)}.assessment-text-semibold-12{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.48rem + .3vw);line-height:calc(.9rem + .3vw)}.assessment-text-semibold-11{font-weight:600;font-family:var(--assessment-font-family);font-size:calc(.48rem + .25vw);line-height:calc(.8rem + .25vw)}.assessment-text-medium-11{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(.48rem + .25vw);line-height:calc(.8rem + .25vw)}.assessment-text-regular-11{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(.48rem + .25vw);line-height:calc(.8rem + .25vw)}.assessment-text-medium-12{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(.48rem + .3vw);line-height:calc(.9rem + .3vw)}.assessment-text-regular-13{font-weight:400;font-family:var(--assessment-font-family)!important;font-size:calc(.64rem + .2vw)!important;line-height:calc(.9rem + .2vw)!important}.assessment-text-bold-13{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.64rem + .2vw)!important;line-height:calc(.9rem + .2vw)!important}.assessment-text-semibold-13{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.64rem + .2vw)!important;line-height:calc(.9rem + .2vw)!important}.assessment-text-medium-13{font-weight:500;font-family:var(--assessment-font-family)!important;font-size:calc(.64rem + .2vw)!important;line-height:calc(.9rem + .2vw)!important}.assessment-text-regular-14{font-weight:400;font-family:var(--assessment-font-family)!important;font-size:calc(.7rem + .2vw);line-height:calc(1.2rem + .2vw)}.assessment-text-bold-14{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.7rem + .2vw);line-height:calc(1.2rem + .2vw)}.assessment-text-medium-14{font-weight:500;font-family:var(--assessment-font-family)!important;font-size:calc(.7rem + .2vw)!important;line-height:calc(1.2rem + .2vw)!important}.assessment-text-semibold-14{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.7rem + .2vw);line-height:calc(1.2rem + .2vw)}.assessment-text-semibold-10{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.55rem + .1vw);line-height:calc(1rem + .1vw)}.assessment-text-regular-10{font-weight:400;font-family:var(--assessment-font-family)!important;font-size:calc(.55rem + .1vw)!important;line-height:calc(1rem + .1vw)}.assessment-text-regular-15{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(.85rem + .1vw);line-height:calc(1.4rem + .1vw)}.assessment-text-medium-15{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(.85rem + .1vw);line-height:calc(1.25rem + .1vw)}.assessment-text-semibold-15{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.85rem + .1vw);line-height:calc(1.25rem + .1vw)}.assessment-text-bold-15{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.85rem + .1vw);line-height:calc(1.25rem + .1vw)}.assessment-text-regular-16{font-weight:400;font-family:var(--assessment-font-family)!important;font-size:calc(.77rem + .25vw);line-height:calc(1.25rem + .2vw)}.assessment-text-semibold-16{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.77rem + .25vw);line-height:calc(1.25rem + .2vw)}.assessment-text-bold-16{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.77rem + .25vw);line-height:calc(1.25rem + .2vw)}.assessment-text-medium-16{font-weight:500;font-family:var(--assessment-font-family)!important;font-size:calc(.77rem + .25vw);line-height:calc(1.25rem + .2vw)}.assessment-text-regular-20{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(1rem + .3vw);line-height:calc(1.2rem + .3vw)}.assessment-text-bold-20{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .3vw);line-height:calc(1.2rem + .3vw)}.assessment-text-semibold-20{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .3vw);line-height:calc(1.2rem + .3vw)}.assessment-text-medium-20{font-weight:500;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .3vw);line-height:calc(1.2rem + .3vw)}.assessment-text-medium-18{font-weight:500;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .125vw)!important;line-height:calc(1.5rem + .1vw)!important}.assessment-text-regular-18{font-weight:400;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .125vw)!important;line-height:calc(1.5rem + .3vw)!important}.assessment-text-bold-18{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .125vw);line-height:calc(1.5rem + .1vw)}.assessment-text-semibold-18{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .125vw)!important;line-height:calc(1.5rem + .1vw)!important}.assessment-text-bold-34{overflow-wrap:break-word;font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(2rem + .15vw);line-height:calc(2.5rem + .15vw)}.assessment-text-medium-34{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(2rem + .15vw);line-height:calc(2.5rem + .15vw)}.assessment-text-bold-32{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1.3rem + .75vw);line-height:calc(1.625rem + .5vw)}.assessment-text-bold-22{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .4vw);line-height:calc(1.5rem + .4vw)}.assessment-text-regular-22{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(1rem + .4vw);line-height:calc(1.5rem + .4vw)}.assessment-text-semibold-22{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .4vw);line-height:calc(1.5rem + .4vw)}.assessment-text-medium-22{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(1rem + .4vw);line-height:calc(1.5rem + .4vw)}.assessment-text-bold-24{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.8rem + .75vw);line-height:calc(.9rem + .75vw)}.assessment-text-regular-24{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(.8rem + .75vw);line-height:calc(.9rem + .75vw)}.assessment-text-semibold-24{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.8rem + .75vw);line-height:calc(.9rem + .75vw)}.assessment-text-medium-24{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(.8rem + .75vw);line-height:calc(1.2rem + .75vw)}.assessment-text-regular-26{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(1.5rem + .1vw);line-height:calc(1.8rem + .1vw)}.assessment-text-medium-26{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(1.5rem + .1vw);line-height:calc(1.8rem + .1vw)}.assessment-text-bold-26{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1.5rem + .1vw);line-height:calc(1.8rem + .1vw)}.assessment-text-semibold-26{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1.55rem + .1vw);line-height:calc(1.8rem + .1vw)}.assessment-text-regular-28{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(1.55rem + .2vw);line-height:calc(2rem + .2vw)}.assessment-text-medium-28{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(1.55rem + .2vw);line-height:calc(2rem + .2vw)}.assessment-text-semibold-28{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1.55rem + .2vw);line-height:calc(2rem + .2vw);letter-spacing:1}.assessment-text-bold-28{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1.55rem + .2vw);line-height:calc(2rem + .2vw)}.assessment-text-regular-30{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(1.5rem + .4vw)}.assessment-text-medium-30{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(1.5rem + .4vw);line-height:calc(1.5rem + .4vw)}.assessment-text-bold-30{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1.5rem + .4vw);line-height:calc(2rem + .4vw)}.assessment-text-semibold-30{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1.5rem + .4vw);line-height:calc(1.5rem + .4vw);letter-spacing:.5}.assessment-text-bold-36{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(2rem + .25vw);line-height:calc(2.5rem + .3vw)}.assessment-text-semibold-36{font-weight:600;font-family:var(--assessment-font-family);font-size:calc(2rem + .25vw);line-height:calc(2.5rem + .3vw)}@media (min-height: 100vw) and (orientation: portrait){.assessment-text-bold-34{font-size:calc(1.8rem + .15vh);line-height:calc(2.2rem + .15vh)}.assessment-text-bold-32{font-size:calc(1.3rem + 1vh);line-height:calc(1.5rem + 1vh)}.assessment-text-semibold-30{font-size:calc(1.5rem + .4vh);line-height:calc(1.8rem + .4vh)}.assessment-text-medium-24{line-height:2.188rem}.assessment-text-medium-24,.assessment-text-regular-24,.assessment-text-semibold-24,.assessment-text-bold-24,.assessment-text-light-24{font-size:calc(1.3rem + .5vh);line-height:calc(1.8rem + .5vh)}.assessment-text-medium-18,.assessment-text-regular-18,.assessment-text-bold-18,.assessment-text-semibold-18,.assessment-text-light-18{font-size:calc(1rem + .1vh)!important;line-height:calc(1.6rem + .1vh)!important}.assessment-text-light-16,.assessment-text-bold-16{font-size:calc(.9rem + .3vh)!important;line-height:calc(1.2rem + .3vh)!important}.assessment-text-medium-16,.assessment-text-semibold-16,.assessment-text-regular-16{font-size:calc(.9rem + .2vh)!important;line-height:calc(1.4rem + .2vh)!important}.assessment-text-regular-15,.assessment-text-semibold-15,.assessment-text-bold-15,.assessment-text-light-15{font-size:calc(.8rem + .2vh);line-height:calc(1.27rem + .2vh)}.assessment-text-medium-15{font-size:calc(.8rem + .2vh);line-height:calc(1.27rem + .2vh)}.assessment-text-medium-12,.assessment-text-regular-12,.assessment-text-semibold-12,.assessment-text-bold-12,.assessment-text-medium-upper-12,.assessment-text-light-12{font-size:calc(.5rem + .4vh);line-height:calc(.8rem + .4vh)}.assessment-text-medium-14,.assessment-text-regular-14,.assessment-text-light-14,.assessment-text-medium-upper-14,.assessment-text-semibold-14,.assessment-text-bold-14{font-size:calc(.8rem + .1vh)!important;line-height:calc(1.2rem + .2vh)!important}.assessment-text-regular-13,.assessment-text-medium-13,.assessment-text-semibold-13,.assessment-text-bold-13,.assessment-text-light-13{font-size:calc(.7rem + .2vh)!important;line-height:calc(1rem + .3vh)!important}.assessment-text-regular-11,.assessment-text-medium-11,.assessment-text-semibold-11,.assessment-text-bold-11,.assessment-text-light-11{font-size:calc(.5rem + .2vh)!important;line-height:calc(.8rem + .2vh)!important}}.assessment-btn-primary{background-color:var(--assessment-primary-one);color:var(--assessment-white);border:.064rem solid var(--assessment-primary-one);border-radius:var(--assessment-border-radius-two)}.assessment-btn-primary-transparent{background-color:var(--assessment-white);color:var(--assessment-primary-one);border-radius:var(--assessment-border-radius-two);border:.064rem solid var(--assessment-primary-one)}.assessment-zoom-animation{transition:transform .2s ease;transform:translateZ(0);text-rendering:optimizeLegibility}.assessment-zoom-animation:hover{transform:scale(1.03)}.assessment-zoom-animation:active{transform:scale(1)}.assessment-zoom-animation:disabled{transform:none!important}.change-direction{transform:rotate(180deg);transition:.3s ease-out}.change-direction-reverse{transform:rotate(0);transition:.3s ease-out}.outline-0{outline:none}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.action-icon{width:1.2rem}.mat-menu-item{height:inherit}.height-without-footer{height:calc(100% - 4.4rem)!important}.z-index-1{z-index:1}.question-info{min-width:15rem;max-width:40vw}@media screen and (max-width: 768px){.question-info{max-width:75vw}}@media screen and (min-width: 768px){.assessment-marks-dropdown{width:6rem}}.youtube-video{aspect-ratio:16/9}\n"], components: [{ type: i6.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { type: i6.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby"], exportAs: ["matTab"] }, { type: i7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: i8.MatSpinner, selector: "mat-spinner", inputs: ["color"] }, { type: i9.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i12.QuestionTypeShortComponent, selector: "lib-question-type-short", inputs: ["required", "question", "previewMode", "labelConfig"] }, { type: i13.QuestionTypeLongComponent, selector: "lib-question-type-long", inputs: ["required", "question", "previewMode", "labelConfig"] }, { type: i14.QuestionTypeEditorComponent, selector: "lib-question-type-editor", inputs: ["required", "question", "previewMode", "labelConfig"] }, { type: i15.QuestionTypeObjectiveComponent, selector: "lib-question-type-objective", inputs: ["required", "question"], outputs: ["viewChild"] }, { type: i16.QuestionTypeMultiselectComponent, selector: "lib-question-type-multiselect", inputs: ["required", "question"], outputs: ["viewChild"] }, { type: i17.QuestionTypePreferenceComponent, selector: "lib-question-type-preference", inputs: ["required", "question"], outputs: ["viewChild"] }, { type: i18.QuestionTypeFileUploadComponent, selector: "lib-question-type-file-upload", inputs: ["required", "question", "labelConfig", "imageConfig"] }], directives: [{ type: i19.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i19.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { type: i19.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i19.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.MatAccordion, selector: "mat-accordion", inputs: ["multi", "displayMode", "togglePosition", "hideToggle"], exportAs: ["matAccordion"] }, { type: i7.MatExpansionPanelTitle, selector: "mat-panel-title" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i20.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { type: i20.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayPositions", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayTransformOriginOn"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { type: i9.MatLabel, selector: "mat-label" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i19.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i19.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i9.MatError, selector: "mat-error", inputs: ["id"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }], pipes: { "orderBy": i21.OrderByPipe } });
|
|
584
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AssessmentTakerComponent, decorators: [{
|
|
585
|
+
type: Component,
|
|
586
|
+
args: [{
|
|
587
|
+
selector: 'lib-assessment-taker',
|
|
588
|
+
templateUrl: './assessment-taker.component.html',
|
|
589
|
+
styleUrls: ['./assessment-taker.component.scss']
|
|
590
|
+
}]
|
|
591
|
+
}], ctorParameters: function () { return [{ type: i1.AssessmentTakerService }, { type: i2.FormBuilder }, { type: i3.ResponseBuilderService }, { type: i4.DomSanitizer }, { type: i5.MatDialog }]; }, propDecorators: { labelConfig: [{
|
|
592
|
+
type: Input
|
|
593
|
+
}], imageConfig: [{
|
|
594
|
+
type: Input
|
|
595
|
+
}], showFooter: [{
|
|
596
|
+
type: Input
|
|
597
|
+
}], assessmentId: [{
|
|
598
|
+
type: Input
|
|
599
|
+
}], assessmentInstanceId: [{
|
|
600
|
+
type: Input
|
|
601
|
+
}], assesseeData: [{
|
|
602
|
+
type: Input
|
|
603
|
+
}], assessorData: [{
|
|
604
|
+
type: Input
|
|
605
|
+
}], disabled: [{
|
|
606
|
+
type: Input
|
|
607
|
+
}], previewMode: [{
|
|
608
|
+
type: Input
|
|
609
|
+
}], verticalView: [{
|
|
610
|
+
type: Input
|
|
611
|
+
}], enableMarks: [{
|
|
612
|
+
type: Input
|
|
613
|
+
}], snackbarMessage: [{
|
|
614
|
+
type: Output
|
|
615
|
+
}], submitAssessment: [{
|
|
616
|
+
type: Output
|
|
617
|
+
}] } });
|
|
618
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXNzbWVudC10YWtlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb25zLWFzc2Vzc21lbnQvc3JjL2xpYi9tb2R1bGVzL2Fzc2Vzc21lbnQtdGFrZXIvYXNzZXNzbWVudC10YWtlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb25zLWFzc2Vzc21lbnQvc3JjL2xpYi9tb2R1bGVzL2Fzc2Vzc21lbnQtdGFrZXIvYXNzZXNzbWVudC10YWtlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFaEMsT0FBTyxFQUFlLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXaEgsTUFBTSxPQUFPLHdCQUF3QjtJQThCbkMsWUFDVSxzQkFBOEMsRUFDOUMsRUFBZSxFQUNmLHNCQUE4QyxFQUM5QyxTQUF1QixFQUN2QixNQUFpQjtRQUpqQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQWxDbEIsZ0JBQVcsR0FBOEIsRUFBRSxDQUFDO1FBQzVDLGdCQUFXLEdBQThCLEVBQUUsQ0FBQztRQUM1QyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBRzVCLGlCQUFZLEdBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSx3QkFBd0IsRUFBRSxDQUFDO1FBQ3ZGLGlCQUFZLEdBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUN2RSxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRTVCLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQTJELENBQUM7UUFDOUYscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVyRCxlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGlCQUFZLEdBQXVDLEVBQUUsQ0FBQztRQUN0RCxnQ0FBMkIsR0FBNEIsRUFBRSxDQUFDO1FBQzFELG1CQUFjLEdBQWUsRUFBRSxDQUFDO1FBQ2hDLHFCQUFnQixHQUFpQyxFQUFFLENBQUM7UUFDcEQsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFOUIsc0JBQWlCLEdBQWtELEVBQUUsQ0FBQztRQUN0RSxxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFDN0Isa0JBQWEsR0FBYyxFQUFFLENBQUM7UUFDOUIsYUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQixpQkFBWSxHQUE0QixFQUFFLENBQUM7UUFtYTNDLGtCQUFhLEdBQWMsRUFBRSxDQUFDO0lBM1oxQixDQUFDO0lBRUwsUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRTFCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUN0QjtRQUVELElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixRQUFRLENBQUM7WUFDUCxXQUFXLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztZQUMxRSxXQUFXLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztTQUMzRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXpFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGtCQUFrQjs7UUFDaEIsTUFBTSxRQUFRLG1CQUNaLGNBQWMsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUNwRixDQUFDLENBQUEsTUFBQSxJQUFJLENBQUMsWUFBWSwwQ0FBRSxFQUFFLEtBQUk7WUFDM0IsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1NBQ3RGLENBQUMsQ0FDSCxDQUFBO1FBQ0QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMzQixJQUFJLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTs7Z0JBQ2xCLElBQUksQ0FBQywyQkFBMkIsR0FBRyxNQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxjQUFjLDBDQUFFLDBCQUEwQixDQUFDO2dCQUNwRixJQUFJLENBQUMsY0FBYyxHQUFHLE1BQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLGNBQWMsMENBQUUsVUFBVSxDQUFDO2dCQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLGNBQWMsMENBQUUsY0FBYyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQUEsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsY0FBYywwQ0FBRSxVQUFVLDBDQUFFLFFBQVEsQ0FBQztnQkFDM0QsSUFBSSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsZ0JBQWdCLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsZ0JBQWdCLENBQUM7aUJBQ2hEO3FCQUFNO29CQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRzt3QkFDdEIsRUFBRSxFQUFFLENBQUM7d0JBQ0wsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFO3dCQUNyRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVk7d0JBQzNCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWTt3QkFDM0Isc0JBQXNCLEVBQUUsRUFBRTt3QkFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRO3FCQUN0QixDQUFDO2lCQUNIO2dCQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDMUIsQ0FBQztZQUNELEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDYixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLHdDQUF3QyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ2xILE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFBO1lBQ2hDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsU0FBUzs7UUFDUCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBRTVCLE1BQUEsTUFBQSxJQUFJLENBQUMsMkJBQTJCLDBDQUFFLHdCQUF3QiwwQ0FBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7O1lBQzVFLE1BQU0sS0FBSyxHQUFRLEVBQUUsQ0FBQztZQUV0QixNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxvQkFBb0IsMENBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFOztnQkFDMUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO29CQUFFLE9BQU87Z0JBRTVDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxXQUFXLENBQUMsQ0FBQztnQkFFbkUsSUFBSSxNQUFBLFFBQVEsQ0FBQyxrQkFBa0IsMENBQUUsTUFBTSxFQUFFO29CQUN2QyxRQUFRLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7O3dCQUNsRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUU7NEJBQzFCLGdFQUFnRTs0QkFDaEUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDOzRCQUNyQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEQsSUFBSSxnQkFBZ0IsRUFBRTtnQ0FDcEIsTUFBTSxNQUFNLEdBQUcsTUFBQSxNQUFBLElBQUksQ0FBQyxnQkFBZ0IsMENBQUUsc0JBQXNCLDBDQUFFLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLFdBQzVFLE9BQUEsQ0FBQSxNQUFBLENBQUMsQ0FBQyxlQUFlLDBDQUFFLFVBQVUsTUFBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLGVBQWUsS0FBSyxDQUFDLENBQUMsQ0FBQSxFQUFBLENBQ3pGLENBQUM7Z0NBQ0YsSUFBSSxNQUFNLEVBQUU7b0NBQ1YsSUFBSSxDQUFBLE1BQUEsUUFBUSxDQUFDLFlBQVksMENBQUUsSUFBSSxNQUFLLHlCQUF5QixJQUFJLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQUEsTUFBQSxNQUFNLENBQUMsT0FBTywwQ0FBRSxFQUFFLG1DQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRTt3Q0FDMUgsU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDO3FDQUNwQzt5Q0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRTt3Q0FDMUMsTUFBTSxXQUFXLEdBQUcsTUFBQSxNQUFNLENBQUMsdUJBQXVCLDBDQUFFLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLHVCQUFDLE9BQUEsQ0FBQSxNQUFBLE1BQUEsQ0FBQyxDQUFDLGFBQWEsMENBQUUsT0FBTywwQ0FBRSxFQUFFLE1BQUssQ0FBQyxNQUFBLE1BQUEsTUFBTSxDQUFDLE9BQU8sMENBQUUsRUFBRSxtQ0FBSSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUEsRUFBQSxDQUFDLENBQUM7d0NBQ3pJLElBQUksV0FBVyxFQUFFOzRDQUNmLFNBQVMsR0FBRyxXQUFXLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQzt5Q0FDekM7cUNBQ0Y7aUNBQ0Y7NkJBQ0Y7NEJBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQzlDLElBQUksQ0FBQSxNQUFBLE1BQUEsSUFBSSxDQUFDLGdCQUFnQiwwQ0FBRSxlQUFlLDBDQUFFLElBQUksTUFBSyw0QkFBNEIsSUFBSSxJQUFJLENBQUMsUUFBUTtnQ0FBRSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7NEJBQ3pILEtBQUssQ0FBQyxHQUFHLEdBQUcsWUFBWSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUM7eUJBQ25EO3dCQUVELE1BQUEsTUFBTSxDQUFDLGlCQUFpQiwwQ0FBRSxPQUFPLENBQUMsQ0FBQyxPQUFlLEVBQUUsRUFBRTs7NEJBQ3BELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQzdDLElBQUksU0FBUyxFQUFFO2dDQUNiLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQUEsTUFBQSxNQUFNLENBQUMsT0FBTywwQ0FBRSxFQUFFLG1DQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzs2QkFDakc7d0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWhDLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLG9CQUFvQiwwQ0FBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7O2dCQUMxQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7b0JBQUUsT0FBTztnQkFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFeEMsSUFBSSxNQUFBLFFBQVEsQ0FBQyxrQkFBa0IsMENBQUUsTUFBTSxFQUFFO29CQUN2QyxNQUFBLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLDBDQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7O3dCQUNuRCxNQUFBLFFBQVEsQ0FBQyxrQkFBa0IsMENBQUUsT0FBTyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7OzRCQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFBLE1BQU0sQ0FBQyxPQUFPLDBDQUFFLEVBQUUsQ0FBQyxDQUFDOzRCQUUzRSxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUU7Z0NBQzFCLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLFlBQVksTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0NBQ3pELElBQUksVUFBVSxFQUFFO29DQUNkLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztpQ0FDbEQ7cUNBQU07b0NBQ0wsVUFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLGVBQWUsRUFBRSxDQUFDO29DQUM5QixVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2lDQUM1QjtnQ0FDRCxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsc0JBQXNCLEVBQUUsQ0FBQzs2QkFDdEM7NEJBRUQsSUFBSSxNQUFBLE1BQU0sQ0FBQyxpQkFBaUIsMENBQUUsTUFBTSxFQUFFO2dDQUNwQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBZSxFQUFFLEVBQUU7b0NBQ25ELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7b0NBQzdDLElBQUksU0FBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLEVBQUUsRUFBRTt3Q0FDakIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7d0NBQ2xELElBQUksVUFBVSxFQUFFOzRDQUNkLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsQ0FBQzs0Q0FDNUYsU0FBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzt5Q0FDdEM7NkNBQU07NENBQ0wsU0FBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLGVBQWUsRUFBRSxDQUFDOzRDQUM3QixTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO3lDQUMzQjt3Q0FDRCxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsc0JBQXNCLEVBQUUsQ0FBQztxQ0FDckM7Z0NBQ0gsQ0FBQyxDQUFDLENBQUM7NkJBQ0o7d0JBRUgsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDckIsU0FBUyxFQUFFLEVBQUU7YUFDZCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFVLEVBQUUsUUFBNEIsRUFBRSxjQUF1QixLQUFLLEVBQUUsVUFBbUIsS0FBSyxFQUFFLFFBQWlCLEVBQUUsY0FBdUI7O1FBQ2hLLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPO1FBRWpCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDeEUsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRXJGLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1RCxxQ0FBcUM7UUFDckMsSUFBSSxDQUFBLE1BQUEsTUFBQSxJQUFJLENBQUMsZ0JBQWdCLDBDQUFFLGVBQWUsMENBQUUsSUFBSSxNQUFLLDRCQUE0QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ25CO1FBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUVyQiw2Q0FBNkM7UUFDN0MsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM5RCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDOUUsS0FBSyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNwRDtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsVUFBbUIsS0FBSyxFQUFFLFFBQWlCLEVBQUUsY0FBdUI7O1FBQ2hHLElBQUksQ0FBQyxDQUFBLE1BQUEsSUFBSSxDQUFDLGdCQUFnQiwwQ0FBRSxzQkFBc0IsQ0FBQTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTs7WUFDN0UsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsT0FBTyxDQUFDLENBQUMsZUFBZSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsNkJBQTZCLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxvQkFBb0IsS0FBSyxjQUFjLENBQUM7YUFDL0g7aUJBQU07Z0JBQ0wsT0FBTyxDQUFBLE1BQUEsQ0FBQyxDQUFDLGVBQWUsMENBQUUsVUFBVSxNQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUMsZUFBZSxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ2pHO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQUEsU0FBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLEtBQUssbUNBQUksSUFBSSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxHQUFXOztRQUMzQixPQUFPLENBQUEsTUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQywwQ0FBRSxNQUFNLEtBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBVztRQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELHVCQUF1QixDQUFDLFFBQTRCOztRQUNsRCxNQUFNLGlCQUFpQixHQUFHO1lBQ3hCLHlCQUF5QjtZQUN6Qiw0QkFBNEI7WUFDNUIsNEJBQTRCO1lBQzVCLHVCQUF1QjtZQUN2QixxQ0FBcUM7WUFDckMsbURBQW1EO1lBQ25ELDBCQUEwQjtTQUMzQixDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQSxNQUFBLFFBQVEsQ0FBQyxZQUFZLDBDQUFFLElBQUksS0FBSSxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUM7SUFDckYsQ0FBQztJQUVELGtCQUFrQixDQUFDLEdBQVcsRUFBRSxVQUFtQixLQUFLLEVBQUUsUUFBaUIsRUFBRSxjQUF1Qjs7UUFDbEcsSUFBSSxDQUFDLENBQUEsTUFBQSxJQUFJLENBQUMsZ0JBQWdCLDBDQUFFLHNCQUFzQixDQUFBO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFaEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFOztZQUM3RSxJQUFJLE9BQU8sRUFBRTtnQkFDWCxPQUFPLENBQUMsQ0FBQyxlQUFlLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyw2QkFBNkIsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLG9CQUFvQixLQUFLLGNBQWMsQ0FBQzthQUMvSDtpQkFBTTtnQkFDTCxPQUFPLENBQUEsTUFBQSxDQUFDLENBQUMsZUFBZSwwQ0FBRSxVQUFVLE1BQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyxlQUFlLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDakc7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTNCLE1BQU0sS0FBSyxHQUFHLE1BQUEsUUFBUSxDQUFDLFlBQVksMENBQUUsSUFBSSxDQUFDO1FBRTFDLElBQUksS0FBSyxLQUFLLHlCQUF5QixFQUFFO1lBQ3ZDLE9BQU8sTUFBQSxTQUFTLENBQUMsUUFBUSwwQ0FBRSxFQUFFLENBQUM7U0FDL0I7YUFBTSxJQUFJLEtBQUssS0FBSyw0QkFBNEIsSUFBSSxLQUFLLEtBQUssMEJBQTBCLEVBQUU7WUFDekYsSUFBSSxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxLQUFLLEtBQUssMEJBQTBCLEVBQUU7Z0JBQ3hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUU7WUFDRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxXQUFDLE9BQUEsTUFBQSxDQUFDLENBQUMsYUFBYSwwQ0FBRSxPQUFPLENBQUEsRUFBQSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ25FO2FBQU0sSUFBSSxLQUFLLEtBQUssMkJBQTJCLEVBQUU7WUFDaEQsZ0RBQWdEO1lBQ2hELE9BQU8sQ0FBQSxNQUFBLFNBQVMsQ0FBQyx3QkFBd0IsMENBQUUsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7Z0JBQ3hELElBQUk7b0JBQ0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDbkM7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxpQkFBaUI7aUJBQ2pEO1lBQ0gsQ0FBQyxDQUFDLEtBQUksRUFBRSxDQUFDO1NBQ1Y7YUFBTTtZQUNMLE9BQU8sTUFBQSxNQUFBLE1BQUEsU0FBUyxDQUFDLHdCQUF3QiwwQ0FBRyxDQUFDLENBQUMsMENBQUUsWUFBWSxtQ0FBSSxJQUFJLENBQUM7U0FDdEU7SUFDSCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsUUFBNEIsRUFBRSxXQUFvQjs7UUFDekUsTUFBTSxVQUFVLEdBQVUsRUFBRSxDQUFDO1FBQzdCLElBQUksV0FBVyxFQUFFO1lBQ2YsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdEM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtZQUMvQixVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztTQUNsRTthQUFNO1lBQ0wsSUFBSSxDQUFBLE1BQUEsUUFBUSxDQUFDLFlBQVksMENBQUUsSUFBSSxNQUFLLHFCQUFxQixFQUFFO2dCQUN6RCxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsa0RBQWtELENBQUMsQ0FBQyxDQUFDO2FBQ3pGO2lCQUFNLElBQUksQ0FBQSxNQUFBLFFBQVEsQ0FBQyxZQUFZLDBDQUFFLElBQUksTUFBSyxtQkFBbUIsRUFBRTtnQkFDOUQsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLG1EQUFtRCxDQUFDLENBQUMsQ0FBQzthQUMxRjtpQkFBTSxJQUFJLENBQUEsTUFBQSxRQUFRLENBQUMsWUFBWSwwQ0FBRSxJQUFJLE1BQUssOEJBQThCLEVBQUU7Z0JBQ3pFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2FBQ3BEO2lCQUFNLElBQUksQ0FBQSxNQUFBLFFBQVEsQ0FBQyxZQUFZLDBDQUFFLElBQUksTUFBSyxzQkFBc0IsRUFBRTtnQkFDakUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7YUFDakQ7U0FDRjtRQUVELElBQUksUUFBUSxDQUFDLGVBQWUsSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkUsTUFBTSxPQUFPLEdBQUcsTUFBQSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssbUJBQW1CLENBQUMsMENBQUUsV0FBVyxDQUFDO1lBQ3JHLElBQUksT0FBTztnQkFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVwRSxNQUFNLE9BQU8sR0FBRyxNQUFBLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxtQkFBbUIsQ0FBQywwQ0FBRSxXQUFXLENBQUM7WUFDckcsSUFBSSxPQUFPO2dCQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXBFLE1BQU0sTUFBTSxHQUFHLE1BQUEsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLHVCQUF1QixDQUFDLDBDQUFFLFdBQVcsQ0FBQztZQUN4RyxJQUFJLE1BQU0sRUFBRTtnQkFDVixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBb0IsRUFBRSxFQUFFOztvQkFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQSxNQUFBLE9BQU8sQ0FBQyxLQUFLLDBDQUFFLE1BQU0sS0FBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO3FCQUN6RjtvQkFDRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBQSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssdUJBQXVCLENBQUMsMENBQUUsV0FBVyxDQUFDO1lBQ3hHLElBQUksTUFBTSxFQUFFO2dCQUNWLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFvQixFQUFFLEVBQUU7O29CQUN2QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQSxNQUFBLE9BQU8sQ0FBQyxLQUFLLDBDQUFFLE1BQU0sS0FBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO3FCQUN6RjtvQkFDRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBQSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssY0FBYyxDQUFDLDBDQUFFLFdBQVcsQ0FBQztZQUNqRyxJQUFJLFFBQVEsRUFBRTtnQkFDWixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBb0IsRUFBRSxFQUFFOztvQkFDdkMsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUEsTUFBQSxPQUFPLENBQUMsS0FBSywwQ0FBRSxNQUFNLEtBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztxQkFDekY7b0JBQ0QsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUVELE1BQU0sV0FBVyxHQUFHLE1BQUEsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLGFBQWEsQ0FBQywwQ0FBRSxXQUFXLENBQUM7WUFDbkcsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQW9CLEVBQUUsRUFBRTtvQkFDdkMsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUNqRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsSUFBSSxLQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3RILElBQUksWUFBWSxFQUFFOzRCQUNoQixPQUFPLEVBQUUsV0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUM7eUJBQy9EO3FCQUNGO29CQUNELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFVLEVBQUUsUUFBZ0I7UUFDNUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDO0lBQzlCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFvQixFQUFFLFFBQTRCLEVBQUUsUUFBNEI7O1FBQy9GLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFNUIsSUFBSSxXQUFXLEdBQUcsTUFBQSxRQUFRLENBQUMsRUFBRSwwQ0FBRSxRQUFRLEVBQUUsQ0FBQztRQUUxQyxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRS9CLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVwRCw2Q0FBNkM7UUFDN0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNoQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxFQUFFLE1BQUssUUFBUSxDQUFDLENBQUM7U0FDbkc7UUFFRCxzRkFBc0Y7UUFDdEYsSUFBSSxPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3pELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDO1NBQ3RDO1FBRUQsT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQsZUFBZSxDQUFDLFFBQTRCOztRQUMxQyxNQUFNLE1BQU0sR0FBRyxNQUFBLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxlQUFlLDBDQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssbUJBQW1CLENBQUMsQ0FBQztRQUN6RixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxRQUE0QixFQUFFLE9BQVk7UUFDMUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sR0FBRyxHQUFHLGFBQWEsQ0FBQztJQUM3QixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsRUFBRTtZQUM3QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFhOztRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlCLElBQUksTUFBQSxNQUFBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsMENBQUUsU0FBUywwQ0FBRSxPQUFPLEVBQUU7Z0JBQ2pELE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sQ0FBQyxrQkFBMkIsSUFBSTs7UUFDcEMsTUFBTSxJQUFJLEdBQUcsQ0FBQSxNQUFBLE1BQUEsTUFBQSxJQUFJLENBQUMsY0FBYywwQ0FBRSxpQkFBaUIsMENBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSwyQ0FBMkMsQ0FBQywwQ0FBRSxXQUFXLEtBQUksR0FBRyxDQUFDO1FBQy9JLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFFNUIsY0FBYyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRTVDLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDakQsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQzlDO2FBQU07WUFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQztJQUlELGFBQWEsQ0FBQyxrQkFBMkIsSUFBSTtRQUMzQyxJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDOUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ25DLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxJQUFJLGlCQUFpQixLQUFLLENBQUMsQ0FBQztvQkFBRSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7YUFDekQ7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDbkM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksaUJBQWlCLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQzthQUMzQztpQkFBTTtnQkFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQzlDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQy9HLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2xELE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxZQUFvQjtRQUM1QyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNqRSxLQUFLLE1BQU0sV0FBVyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUU7Z0JBQzVDLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUU7b0JBQzNDLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQztvQkFDdEIsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQ3ZFLEdBQUcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNqQztvQkFDRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNyRSxJQUFJLE9BQU8sRUFBRTt3QkFDWCxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQzt3QkFDaEUsTUFBTTtxQkFDUDtpQkFDRjthQUNGO1FBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELElBQUksQ0FBQyxTQUFrQixJQUFJLEVBQUUsa0JBQTJCLElBQUk7O1FBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXpCLElBQUksZUFBZSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNqRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxHQUFHLEVBQUUsSUFBSSxFQUFFLDRCQUE0QixFQUFFLENBQUM7U0FDaEY7YUFBTTtZQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEdBQUcsRUFBRSxJQUFJLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQztTQUNqRjtRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FDOUQsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixJQUFJLENBQUMsMkJBQTJCLEVBQ2hDLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FDZCxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsQ0FBQSxNQUFBLElBQUksQ0FBQyxnQkFBZ0IsMENBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekosT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUNoQixJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTs7Z0JBQ2pCLElBQUksQ0FBQyxDQUFBLE1BQUEsSUFBSSxDQUFDLGdCQUFnQiwwQ0FBRSxFQUFFLENBQUEsRUFBRTtvQkFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUM3QjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO2lCQUM3QjtnQkFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFBLE1BQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFFBQVEsMENBQUUsRUFBRSxLQUFJLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdLLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDdkUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7aUJBQ3pCO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTs7Z0JBQ2IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsc0NBQXNDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDaEgsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQSxNQUFBLElBQUksQ0FBQyxnQkFBZ0IsMENBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQTtZQUNoRixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQixDQUFDLFVBQWtCO1FBQ2xDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbEUsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7WUFDOUIsQ0FBQztZQUNELEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDYixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLHFDQUFxQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQy9HLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFBO1lBQ2hDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsUUFBZ0I7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxNQUFNLFVBQVUsR0FBRyxpQ0FBaUMsT0FBTyxFQUFFLENBQUM7UUFDOUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxVQUFVLENBQUMsUUFBZ0I7UUFDekIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNwQyxPQUFPLEdBQUcsMktBQTJLLENBQUM7U0FDdkw7YUFBTSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDeEMsT0FBTyxHQUFHLGdDQUFnQyxDQUFDO1NBQzVDO1FBQ0QsSUFBSSxPQUFPLEVBQUU7WUFDWCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDckIsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakI7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHNCQUFzQixDQUFDLE9BQTZCO1FBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFO1lBQzdDLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsS0FBSyxFQUFFLHFCQUFxQjtZQUM1QixTQUFTLEVBQUUsT0FBTztZQUNsQixVQUFVLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztZQUNqQyxJQUFJLEVBQUU7Z0JBQ0osV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzdCLGNBQWMsRUFBRSxPQUFPO2FBQ3hCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7c0hBbmtCVSx3QkFBd0I7MEdBQXhCLHdCQUF3QixxZUNsQnJDLDZtc0JBb1ZjOzRGRGxVRCx3QkFBd0I7a0JBTnBDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsV0FBVyxFQUFFLG1DQUFtQztvQkFDaEQsU0FBUyxFQUFFLENBQUMsbUNBQW1DLENBQUM7aUJBQ2pEOytOQUdVLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEFzc2Vzc21lbnRUYWtlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Fzc2Vzc21lbnQtdGFrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFJlc3BvbnNlQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3Jlc3BvbnNlLWJ1aWxkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNlY3Rpb25JbnN0cnVjdGlvbnNDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvc2VjdGlvbi1pbnN0cnVjdGlvbnMvc2VjdGlvbi1pbnN0cnVjdGlvbnMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQXNzZXNzZWVEVE8sIEFzc2Vzc29yRFRPLCBBc3Nlc3NtZW50LCBBc3Nlc3NtZW50SW5zdGFuY2VBc3Nlc3NlRFRPIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ludGVyZmFjZXMvYXNzZXNzbWVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBBc3Nlc3NtZW50UXVlc3Rpb24gfSBmcm9tICcuLi8uLi9zaGFyZWQvaW50ZXJmYWNlcy9xdWVzdGlvbi5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBBc3Nlc3NtZW50UXVlc3Rpb25QYXBlciwgUXVlc3Rpb25QYXBlclNlY3Rpb24gfSBmcm9tICcuLi8uLi9zaGFyZWQvaW50ZXJmYWNlcy9xdWVzdGlvbi1wYXBlci5pbnRlcmZhY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYXNzZXNzbWVudC10YWtlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Fzc2Vzc21lbnQtdGFrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Fzc2Vzc21lbnQtdGFrZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEFzc2Vzc21lbnRUYWtlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgbGFiZWxDb25maWc6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcclxuICBASW5wdXQoKSBpbWFnZUNvbmZpZzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xyXG4gIEBJbnB1dCgpIHNob3dGb290ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBhc3Nlc3NtZW50SWQhOiBudW1iZXI7XHJcbiAgQElucHV0KCkgYXNzZXNzbWVudEluc3RhbmNlSWQhOiBudW1iZXI7XHJcbiAgQElucHV0KCkgYXNzZXNzZWVEYXRhOiBBc3Nlc3NlZURUTyA9IHsgaWQ6IDAsIGFjdG9ySWQ6IDAsIGFjdG9yVHlwZTogJ0FDVE9SX1RZUEUuQlJJREdFX1VTRVInIH07XHJcbiAgQElucHV0KCkgYXNzZXNzb3JEYXRhOiBBc3Nlc3NvckRUTyA9IHsgaWQ6IDAsIGFjdG9ySWQ6IDAsIGFjdG9yVHlwZTogJ1RFTkFOVCcgfTtcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHByZXZpZXdNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdmVydGljYWxWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZW5hYmxlTWFya3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIHNuYWNrYmFyTWVzc2FnZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBzdHJpbmcsIHR5cGU6ICdzdWNjZXNzJyB8ICdlcnJvcicgfCAnaW5mbycgfT4oKTtcclxuICBAT3V0cHV0KCkgc3VibWl0QXNzZXNzbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBzaG93TG9hZGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcXVlc3Rpb25CYW5rOiBSZWNvcmQ8bnVtYmVyLCBBc3Nlc3NtZW50UXVlc3Rpb24+ID0ge307XHJcbiAgYXNzZXNzbWVudFF1ZXN0aW9uUGFwZXJEYXRhOiBBc3Nlc3NtZW50UXVlc3Rpb25QYXBlciA9IHt9O1xyXG4gIGFzc2Vzc21lbnREYXRhOiBBc3Nlc3NtZW50ID0ge307XHJcbiAgYXNzZXNzZWVSZXNwb25zZTogQXNzZXNzbWVudEluc3RhbmNlQXNzZXNzZURUTyA9IHt9O1xyXG4gIGNvbmZpZ3NMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc2VjdGlvbkZvcm1Hcm91cHM6IHsgc2VjdGlvbklkOiBudW1iZXI7IGZvcm1Hcm91cDogRm9ybUdyb3VwIH1bXSA9IFtdO1xyXG4gIHNlbGVjdGVkVGFiSW5kZXg6IG51bWJlciA9IDA7XHJcbiAgc2VjdGlvbkVycm9yczogYm9vbGVhbltdID0gW107XHJcbiAgdGVuYW50SWQ6IG51bWJlciA9IDA7XHJcbiAgdG9vbHRpcFN0YXRlOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPiA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYXNzZXNzbWVudFRha2VyU2VydmljZTogQXNzZXNzbWVudFRha2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSByZXNwb25zZUJ1aWxkZXJTZXJ2aWNlOiBSZXNwb25zZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2dcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0Q29uZmlnc0Zyb21KU09OKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucHJldmlld01vZGUpIHtcclxuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXNzZXNzbWVudEluc3RhbmNlSWQpIHtcclxuICAgICAgdGhpcy5zaG93TG9hZGVyID0gdHJ1ZTtcclxuICAgICAgdGhpcy5sb2FkQXNzZXNzbWVudERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENvbmZpZ3NGcm9tSlNPTigpIHtcclxuICAgIGZvcmtKb2luKHtcclxuICAgICAgbGFiZWxDb25maWc6IHRoaXMuYXNzZXNzbWVudFRha2VyU2VydmljZS5nZXRDb25maWdKU09OKCdqc29uL2xhYmVsQ29uZmlnJyksXHJcbiAgICAgIGltYWdlQ29uZmlnOiB0aGlzLmFzc2Vzc21lbnRUYWtlclNlcnZpY2UuZ2V0Q29uZmlnSlNPTignanNvbi9pbWFnZUNvbmZpZycpXHJcbiAgICB9KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMubGFiZWxDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCByZXM/LmxhYmVsQ29uZmlnLCB0aGlzLmxhYmVsQ29uZmlnKTtcclxuICAgICAgdGhpcy5pbWFnZUNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIHJlcz8uaW1hZ2VDb25maWcsIHRoaXMuaW1hZ2VDb25maWcpO1xyXG5cclxuICAgICAgdGhpcy5jb25maWdzTG9hZGVkID0gdHJ1ZTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBsb2FkQXNzZXNzbWVudERhdGEoKSB7XHJcbiAgICBjb25zdCBhcGlDYWxscyA9IHtcclxuICAgICAgYXNzZXNzbWVudERhdGE6IHRoaXMuYXNzZXNzbWVudFRha2VyU2VydmljZS5nZXRBc3Nlc3NtZW50Q29udGV4dEJ5SWQodGhpcy5hc3Nlc3NtZW50SWQpLFxyXG4gICAgICAuLi4odGhpcy5hc3Nlc3NlZURhdGE/LmlkICYmIHtcclxuICAgICAgICBhc3Nlc3NlZVJlc3BvbnNlOiB0aGlzLmFzc2Vzc21lbnRUYWtlclNlcnZpY2UuZ2V0QW5zd2Vyc0J5QWlhSWQodGhpcy5hc3Nlc3NlZURhdGEuaWQpXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBmb3JrSm9pbihhcGlDYWxscykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXNzZXNzbWVudFF1ZXN0aW9uUGFwZXJEYXRhID0gZGF0YT8uYXNzZXNzbWVudERhdGE/LmFzc2Vzc21lbnRRdWVzdGlvblBhcGVyRFRPO1xyXG4gICAgICAgIHRoaXMuYXNzZXNzbWVudERhdGEgPSBkYXRhPy5hc3Nlc3NtZW50RGF0YT8uYXNzZXNzbWVudDtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uQmFuayA9IGRhdGE/LmFzc2Vzc21lbnREYXRhPy5xdWVzdGlvbkRUT01hcDtcclxuICAgICAgICB0aGlzLnRlbmFudElkID0gZGF0YT8uYXNzZXNzbWVudERhdGE/LmFzc2Vzc21lbnQ/LnRlbmFudElkO1xyXG4gICAgICAgIGlmIChkYXRhPy5hc3Nlc3NlZVJlc3BvbnNlKSB7XHJcbiAgICAgICAgICB0aGlzLmFzc2Vzc2VlUmVzcG9uc2UgPSBkYXRhPy5hc3Nlc3NlZVJlc3BvbnNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmFzc2Vzc2VlUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgIGlkOiAwLFxyXG4gICAgICAgICAgICBhc3Nlc3NtZW50SW5zdGFuY2U6IHsgaWQ6IHRoaXMuYXNzZXNzbWVudEluc3RhbmNlSWQgfSxcclxuICAgICAgICAgICAgYXNzZXNzZWU6IHRoaXMuYXNzZXNzZWVEYXRhLFxyXG4gICAgICAgICAgICBhc3Nlc3NvcjogdGhpcy5hc3Nlc3NvckRhdGEsXHJcbiAgICAgICAgICAgIGFpYWRlZmF1bHRSZXNwb25zZUxpc3Q6IFtdLFxyXG4gICAgICAgICAgICB0ZW5hbnQ6IHRoaXMudGVuYW50SWRcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZm9ybVNldHVwKCk7XHJcbiAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiBlcnJvciA9PiB7XHJcbiAgICAgICAgdGhpcy5zbmFja2Jhck1lc3NhZ2UuZW1pdCh7IG1lc3NhZ2U6IHRoaXMubGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5UT0FTVC5FUlJPUl9ERUZBVUxUJ10sIHR5cGU6ICdlcnJvcicgfSk7XHJcbiAgICAgICAgdGhyb3cgeyBlcnJvciwgbWV0aG9kOiAnR0VUJyB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZm9ybVNldHVwKCkge1xyXG4gICAgdGhpcy5zZWN0aW9uRm9ybUdyb3VwcyA9IFtdO1xyXG5cclxuICAgIHRoaXMuYXNzZXNzbWVudFF1ZXN0aW9uUGFwZXJEYXRhPy5xdWVzdGlvblBhcGVyU2VjdGlvbkxpc3Q/LmZvckVhY2goc2VjdGlvbiA9PiB7XHJcbiAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcclxuXHJcbiAgICAgIHNlY3Rpb24/LnNlY3Rpb25RdWVzdGlvbnNMaXN0Py5mb3JFYWNoKHNxID0+IHtcclxuICAgICAgICBjb25zdCBxSWQgPSBzcS5xdWVzdGlvbklkO1xyXG4gICAgICAgIGlmICghcUlkIHx8ICF0aGlzLnF1ZXN0aW9uQmFua1txSWRdKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbkJhbmtbcUlkXTtcclxuICAgICAgICB0aGlzLmFkZENvbnRyb2xGb3JRdWVzdGlvbihncm91cCwgcXVlc3Rpb24sIHF1ZXN0aW9uPy5pc01hbmRhdG9yeSk7XHJcblxyXG4gICAgICAgIGlmIChxdWVzdGlvbi5kZWZhdWx0T3B0aW9uc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcXVlc3Rpb24uZGVmYXVsdE9wdGlvbnNMaXN0LmZvckVhY2goKG9wdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb24ucmVtYXJrc1JlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgICAgLy8gUHJlLXBvcHVsYXRlIHJlbWFya3MgaWYgd2UgaGF2ZSBhbnN3ZXJzIG1hdGNoaW5nIHRoaXMgb3B0aW9uLlxyXG4gICAgICAgICAgICAgIGxldCByZW1hcmtWYWwgPSBudWxsO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHByZWZpbGxlZE9wdGlvbnMgPSB0aGlzLmdldFByZWZpbGxlZEFuc3dlcihxSWQpO1xyXG4gICAgICAgICAgICAgIGlmIChwcmVmaWxsZWRPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbnNPYmogPSB0aGlzLmFzc2Vzc2VlUmVzcG9uc2U/LmFpYWRlZmF1bHRSZXNwb25zZUxpc3Q/LmZpbmQoKGE6IGFueSkgPT5cclxuICAgICAgICAgICAgICAgICAgYS5zZWN0aW9uUXVlc3Rpb24/LnF1ZXN0aW9uSWQgPT09IHFJZCAmJiAoIWEuY2hpbGRRdWVzdGlvbklkIHx8IGEuY2hpbGRRdWVzdGlvbklkID09PSAwKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmIChhbnNPYmopIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLnF1ZXN0aW9uVHlwZT8uY29kZSA9PT0gJ1FVRVNUSU9OX1RZUEUuT0JKRUNUSVZFJyAmJiBwcmVmaWxsZWRPcHRpb25zLmlkID09PSAob3B0aW9uLm9wdGlvbnM/LmlkID8/IG9wdGlvbi5pZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW1hcmtWYWwgPSBhbnNPYmoucmVtYXJrcyB8fCBudWxsO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJlZmlsbGVkT3B0aW9ucykpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGluZ09iaiA9IGFuc09iai5kcm9iamVjdGl2ZXJlc3BvbnNlTGlzdD8uZmluZCgocjogYW55KSA9PiByLmRlZmF1bHRPcHRpb24/Lm9wdGlvbnM/LmlkID09PSAob3B0aW9uLm9wdGlvbnM/LmlkID8/IG9wdGlvbi5pZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ09iaikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmVtYXJrVmFsID0gbWF0Y2hpbmdPYmoucmVtYXJrcyB8fCBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgcmVtYXJrQ3RybCA9IG5ldyBGb3JtQ29udHJvbChyZW1hcmtWYWwpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmFzc2Vzc2VlUmVzcG9uc2U/LmFzc2Vzc21lbnRUYWtlbj8uY29kZSA9PT0gJ0FTU0VTU01FTlRfVEFLRU4uQ09NUExFVEVEJyB8fCB0aGlzLmRpc2FibGVkKSByZW1hcmtDdHJsLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgICBncm91cFtgJHtxSWR9X3JlbWFya3NfJHtvcHRpb24uaWR9YF0gPSByZW1hcmtDdHJsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvcHRpb24uY2hpbGRRdWVzdGlvbkxpc3Q/LmZvckVhY2goKGNoaWxkSWQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkUXVlcyA9IHRoaXMucXVlc3Rpb25CYW5rW2NoaWxkSWRdO1xyXG4gICAgICAgICAgICAgIGlmIChjaGlsZFF1ZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ29udHJvbEZvclF1ZXN0aW9uKGdyb3VwLCBjaGlsZFF1ZXMsIGZhbHNlLCB0cnVlLCBxSWQsIG9wdGlvbi5vcHRpb25zPy5pZCA/PyBvcHRpb24uaWQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgZmcgPSB0aGlzLmZiLmdyb3VwKGdyb3VwKTtcclxuXHJcbiAgICAgIHNlY3Rpb24/LnNlY3Rpb25RdWVzdGlvbnNMaXN0Py5mb3JFYWNoKHNxID0+IHtcclxuICAgICAgICBjb25zdCBxSWQgPSBzcS5xdWVzdGlvbklkO1xyXG4gICAgICAgIGlmICghcUlkIHx8ICF0aGlzLnF1ZXN0aW9uQmFua1txSWRdKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uQmFua1txSWRdO1xyXG5cclxuICAgICAgICBpZiAocXVlc3Rpb24uZGVmYXVsdE9wdGlvbnNMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgIGZnLmdldChxSWQudG9TdHJpbmcoKSk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsID0+IHtcclxuICAgICAgICAgICAgcXVlc3Rpb24uZGVmYXVsdE9wdGlvbnNMaXN0Py5mb3JFYWNoKChvcHRpb246IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmlzT3B0aW9uU2VsZWN0ZWQoZmcsIHF1ZXN0aW9uLCBvcHRpb24ub3B0aW9ucz8uaWQpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAob3B0aW9uLnJlbWFya3NSZXF1aXJlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVtYXJrQ3RybCA9IGZnLmdldChgJHtxSWR9X3JlbWFya3NfJHtvcHRpb24uaWR9YCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICByZW1hcmtDdHJsPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICByZW1hcmtDdHJsPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgICAgICAgcmVtYXJrQ3RybD8uc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZW1hcmtDdHJsPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAob3B0aW9uLmNoaWxkUXVlc3Rpb25MaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbi5jaGlsZFF1ZXN0aW9uTGlzdC5mb3JFYWNoKChjaGlsZElkOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRRdWVzID0gdGhpcy5xdWVzdGlvbkJhbmtbY2hpbGRJZF07XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZFF1ZXM/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDdHJsID0gZmcuZ2V0KGNoaWxkUXVlcy5pZC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMuZ2V0VmFsaWRhdG9yc0ZvclF1ZXN0aW9uKGNoaWxkUXVlcywgY2hpbGRRdWVzLmlzTWFuZGF0b3J5IHx8IGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQ3RybD8uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2hpbGRDdHJsPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQ3RybD8uc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkQ3RybD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnNlY3Rpb25Gb3JtR3JvdXBzLnB1c2goe1xyXG4gICAgICAgIHNlY3Rpb25JZDogc2VjdGlvbi5pZCxcclxuICAgICAgICBmb3JtR3JvdXA6IGZnXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNlY3Rpb25FcnJvcnMucHVzaChmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFkZENvbnRyb2xGb3JRdWVzdGlvbihncm91cDogYW55LCBxdWVzdGlvbjogQXNzZXNzbWVudFF1ZXN0aW9uLCBpc01hbmRhdG9yeTogYm9vbGVhbiA9IGZhbHNlLCBpc0NoaWxkOiBib29sZWFuID0gZmFsc2UsIHBhcmVudElkPzogbnVtYmVyLCBwYXJlbnRPcHRpb25JZD86IG51bWJlcikge1xyXG4gICAgY29uc3QgcUlkID0gcXVlc3Rpb24uaWQ7XHJcbiAgICBpZiAoIXFJZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLmdldFZhbGlkYXRvcnNGb3JRdWVzdGlvbihxdWVzdGlvbiwgaXNNYW5kYXRvcnkpO1xyXG4gICAgbGV0IHByZWZpbGxlZFZhbHVlID0gdGhpcy5nZXRQcmVmaWxsZWRBbnN3ZXIocUlkLCBpc0NoaWxkLCBwYXJlbnRJZCwgcGFyZW50T3B0aW9uSWQpO1xyXG5cclxuICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wocHJlZmlsbGVkVmFsdWUsIHZhbGlkYXRvcnMpO1xyXG5cclxuICAgIC8vIERpc2FibGUgaWYgYXNzZXNzbWVudCBpcyBjb21wbGV0ZWRcclxuICAgIGlmICh0aGlzLmFzc2Vzc2VlUmVzcG9uc2U/LmFzc2Vzc21lbnRUYWtlbj8uY29kZSA9PT0gJ0FTU0VTU01FTlRfVEFLRU4uQ09NUExFVEVEJyB8fCB0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdyb3VwW3FJZF0gPSBjb250cm9sO1xyXG5cclxuICAgIC8vIEF0dGFjaCBtYXJrIGFzc2lnbm1lbnQgY29udHJvbCBpZiByZXF1aXJlZFxyXG4gICAgaWYgKHRoaXMuZW5hYmxlTWFya3MgJiYgdGhpcy5zaG91bGRTaG93TWFya3NEcm9wZG93bihxdWVzdGlvbikpIHtcclxuICAgICAgbGV0IG1hcmtWYWx1ZSA9IHRoaXMuZ2V0UHJlZmlsbGVkTWFyayhxSWQsIGlzQ2hpbGQsIHBhcmVudElkLCBwYXJlbnRPcHRpb25JZCk7XHJcbiAgICAgIGdyb3VwW2Ake3FJZH1fbWFya3NgXSA9IG5ldyBGb3JtQ29udHJvbChtYXJrVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UHJlZmlsbGVkTWFyayhxSWQ6IG51bWJlciwgaXNDaGlsZDogYm9vbGVhbiA9IGZhbHNlLCBwYXJlbnRJZD86IG51bWJlciwgcGFyZW50T3B0aW9uSWQ/OiBudW1iZXIpOiBhbnkge1xyXG4gICAgaWYgKCF0aGlzLmFzc2Vzc2VlUmVzcG9uc2U/LmFpYWRlZmF1bHRSZXNwb25zZUxpc3QpIHJldHVybiBudWxsO1xyXG4gICAgY29uc3QgYW5zd2VyT2JqID0gdGhpcy5hc3Nlc3NlZVJlc3BvbnNlLmFpYWRlZmF1bHRSZXNwb25zZUxpc3QuZmluZCgoYTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChpc0NoaWxkKSB7XHJcbiAgICAgICAgcmV0dXJuIGEuY2hpbGRRdWVzdGlvbklkID09PSBxSWQgJiYgYS5jaGlsZFF1ZXN0aW9uUGFyZW50UXVlc3Rpb25JZCA9PT0gcGFyZW50SWQgJiYgYS5jaGlsZERlZmF1bHRPcHRpb25JZCA9PT0gcGFyZW50T3B0aW9uSWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGEuc2VjdGlvblF1ZXN0aW9uPy5xdWVzdGlvbklkID09PSBxSWQgJiYgKCFhLmNoaWxkUXVlc3Rpb25JZCB8fCBhLmNoaWxkUXVlc3Rpb25JZCA9PT0gMCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGFuc3dlck9iaj8ubWFya3MgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldFF1ZXN0aW9uV2VpZ2h0KHFJZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQmFua1txSWRdPy53ZWlnaHQgfHwgMDtcclxuICB9XHJcblxyXG4gIGdldE1hcmtzUmFuZ2UocUlkOiBudW1iZXIpOiBudW1iZXJbXSB7XHJcbiAgICBjb25zdCBtYXggPSB0aGlzLmdldFF1ZXN0aW9uV2VpZ2h0KHFJZCk7XHJcbiAgICBpZiAobWF4ID09PSAwKSByZXR1cm4gW107XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogTWF0aC5mbG9vcihtYXgpICsgMSB9LCAoXywgaSkgPT4gaSk7XHJcbiAgfVxyXG5cclxuICBzaG91bGRTaG93TWFya3NEcm9wZG93bihxdWVzdGlvbjogQXNzZXNzbWVudFF1ZXN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhdXRvQXNzaWduZWRUeXBlcyA9IFtcclxuICAgICAgJ1FVRVNUSU9OX1RZUEUuT0JKRUNUSVZFJyxcclxuICAgICAgJ1FVRVNUSU9OX1RZUEUuTVVMVElfU0VMRUNUJyxcclxuICAgICAgJ1FVRVNUSU9OX1RZUEUuU0NBTEVfUkFUSU5HJyxcclxuICAgICAgJ1FVRVNUSU9OX1RZUEUuQ09OU0VOVCcsXHJcbiAgICAgICdRVUVTVElPTl9UWVBFLk1VTFRJU0VMRUNUX0hJRVJBUkNIWScsXHJcbiAgICAgICdRVUVTVElPTl9UWVBFLk1VTFRJU0VMRUNUX09QVElPTl9SSUNIVEVYVF9SRU1BUktTJyxcclxuICAgICAgJ1FVRVNUSU9OX1RZUEUuUFJFRkVSRU5DRSdcclxuICAgIF07XHJcbiAgICBjb25zdCBoYXNXZWlnaHQgPSB0aGlzLmdldFF1ZXN0aW9uV2VpZ2h0KHF1ZXN0aW9uLmlkIHx8IDApID4gMDtcclxuICAgIHJldHVybiAhYXV0b0Fzc2lnbmVkVHlwZXMuaW5jbHVkZXMocXVlc3Rpb24ucXVlc3Rpb25UeXBlPy5jb2RlIHx8ICcnKSAmJiBoYXNXZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBnZXRQcmVmaWxsZWRBbnN3ZXIocUlkOiBudW1iZXIsIGlzQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZSwgcGFyZW50SWQ/OiBudW1iZXIsIHBhcmVudE9wdGlvbklkPzogbnVtYmVyKTogYW55IHtcclxuICAgIGlmICghdGhpcy5hc3Nlc3NlZVJlc3BvbnNlPy5haWFkZWZhdWx0UmVzcG9uc2VMaXN0KSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBhbnN3ZXJPYmogPSB0aGlzLmFzc2Vzc2VlUmVzcG9uc2UuYWlhZGVmYXVsdFJlc3BvbnNlTGlzdC5maW5kKChhOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGlzQ2hpbGQpIHtcclxuICAgICAgICByZXR1cm4gYS5jaGlsZFF1ZXN0aW9uSWQgPT09IHFJZCAmJiBhLmNoaWxkUXVlc3Rpb25QYXJlbnRRdWVzdGlvbklkID09PSBwYXJlbnRJZCAmJiBhLmNoaWxkRGVmYXVsdE9wdGlvbklkID09PSBwYXJlbnRPcHRpb25JZDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gYS5zZWN0aW9uUXVlc3Rpb24/LnF1ZXN0aW9uSWQgPT09IHFJZCAmJiAoIWEuY2hpbGRRdWVzdGlvbklkIHx8IGEuY2hpbGRRdWVzdGlvbklkID09PSAwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFhbnN3ZXJPYmopIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbkJhbmtbcUlkXTtcclxuICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHFUeXBlID0gcXVlc3Rpb24ucXVlc3Rpb25UeXBlPy5jb2RlO1xyXG5cclxuICAgIGlmIChxVHlwZSA9PT0gJ1FVRVNUSU9OX1RZUEUuT0JKRUNUSVZFJykge1xyXG4gICAgICByZXR1cm4gYW5zd2VyT2JqLm9wdGlvbklkPy5pZDtcclxuICAgIH0gZWxzZSBpZiAocVR5cGUgPT09ICdRVUVTVElPTl9UWVBFLk1VTFRJX1NFTEVDVCcgfHwgcVR5cGUgPT09ICdRVUVTVElPTl9UWVBFLlBSRUZFUkVOQ0UnKSB7XHJcbiAgICAgIGxldCBzb3J0ZWRMaXN0ID0gWy4uLihhbnN3ZXJPYmouZHJvYmplY3RpdmVyZXNwb25zZUxpc3QgfHwgW10pXTtcclxuICAgICAgaWYgKHFUeXBlID09PSAnUVVFU1RJT05fVFlQRS5QUkVGRVJFTkNFJykge1xyXG4gICAgICAgIHNvcnRlZExpc3Quc29ydCgoYTogYW55LCBiOiBhbnkpID0+IChhLm9yZGVyTm8gfHwgMCkgLSAoYi5vcmRlck5vIHx8IDApKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gc29ydGVkTGlzdC5tYXAoKHI6IGFueSkgPT4gci5kZWZhdWx0T3B0aW9uPy5vcHRpb25zKSB8fCBbXTtcclxuICAgIH0gZWxzZSBpZiAocVR5cGUgPT09ICdRVUVTVElPTl9UWVBFLkZJTEVfVVBMT0FEJykge1xyXG4gICAgICAvLyBGYWxsYmFjayBwYXJzaW5nIGlmIHdlIG9ubHkgaGF2ZSByZXNwb25zZVRleHRcclxuICAgICAgcmV0dXJuIGFuc3dlck9iai5kcnN1YmplY3RpdmVyZXNwb25zZUxpc3Q/Lm1hcCgocjogYW55KSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHIucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICByZXR1cm4geyBpZDogci5yZXNwb25zZVRleHQgfTsgLy8gYmFzaWMgZmFsbGJhY2tcclxuICAgICAgICB9XHJcbiAgICAgIH0pIHx8IFtdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGFuc3dlck9iai5kcnN1YmplY3RpdmVyZXNwb25zZUxpc3Q/LlswXT8ucmVzcG9uc2VUZXh0ID8/IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRWYWxpZGF0b3JzRm9yUXVlc3Rpb24ocXVlc3Rpb246IEFzc2Vzc21lbnRRdWVzdGlvbiwgaXNNYW5kYXRvcnk6IGJvb2xlYW4pOiBhbnlbXSB7XHJcbiAgICBjb25zdCB2YWxpZGF0b3JzOiBhbnlbXSA9IFtdO1xyXG4gICAgaWYgKGlzTWFuZGF0b3J5KSB7XHJcbiAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocXVlc3Rpb24ucmVzcG9uc2VWYWxpZGF0aW9uKSB7XHJcbiAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4ocXVlc3Rpb24ucmVzcG9uc2VWYWxpZGF0aW9uKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAocXVlc3Rpb24ucXVlc3Rpb25UeXBlPy5jb2RlID09PSAnUVVFU1RJT05fVFlQRS5FTUFJTCcpIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLykpO1xyXG4gICAgICB9IGVsc2UgaWYgKHF1ZXN0aW9uLnF1ZXN0aW9uVHlwZT8uY29kZSA9PT0gJ1FVRVNUSU9OX1RZUEUuVVJMJykge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oL14oaHR0cHM/OlxcL1xcLyk/KFtcXHdcXC1dKyhcXC5bXFx3XFwtXSspKykoW1xcLz8jXS4qKT8kL2kpKTtcclxuICAgICAgfSBlbHNlIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGU/LmNvZGUgPT09ICdRVUVTVElPTl9UWVBFLkNPTlRBQ1RfTlVNQkVSJykge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oL15bMC05XXsxMH0kLykpO1xyXG4gICAgICB9IGVsc2UgaWYgKHF1ZXN0aW9uLnF1ZXN0aW9uVHlwZT8uY29kZSA9PT0gJ1FVRVNUSU9OX1RZUEUuTlVNQkVSJykge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oL15bMC05XSskLykpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHF1ZXN0aW9uLnF1ZXN0aW9uQ29uZmlncyAmJiBxdWVzdGlvbi5xdWVzdGlvbkNvbmZpZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBtaW5DaGFyID0gcXVlc3Rpb24ucXVlc3Rpb25Db25maWdzLmZpbmQoYyA9PiBjLmNvbmZpZ0tleSA9PT0gJ21pbkNoYXJhY3RlckNvdW50Jyk/LmNvbmZpZ1ZhbHVlO1xyXG4gICAgICBpZiAobWluQ2hhcikgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKE51bWJlcihtaW5DaGFyKSkpO1xyXG5cclxuICAgICAgY29uc3QgbWF4Q2hhciA9IHF1ZXN0aW9uLnF1ZXN0aW9uQ29uZmlncy5maW5kKGMgPT4gYy5jb25maWdLZXkgPT09ICdtYXhDaGFyYWN0ZXJDb3VudCcpPy5jb25maWdWYWx1ZTtcclxuICAgICAgaWYgKG1heENoYXIpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aChOdW1iZXIobWF4Q2hhcikpKTtcclxuXHJcbiAgICAgIGNvbnN0IG1pbk9wdCA9IHF1ZXN0aW9uLnF1ZXN0aW9uQ29uZmlncy5maW5kKGMgPT4gYy5jb25maWdLZXkgPT09ICdtaW5pbXVtTnVtYmVyT2ZPcHRpb24nKT8uY29uZmlnVmFsdWU7XHJcbiAgICAgIGlmIChtaW5PcHQpIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5sZW5ndGggPCBOdW1iZXIobWluT3B0KSkge1xyXG4gICAgICAgICAgICByZXR1cm4geyBtaW5PcHRpb25zOiB7IHJlcXVpcmVkOiBOdW1iZXIobWluT3B0KSwgYWN0dWFsOiBjb250cm9sLnZhbHVlPy5sZW5ndGggfHwgMCB9IH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbWF4T3B0ID0gcXVlc3Rpb24ucXVlc3Rpb25Db25maWdzLmZpbmQoYyA9PiBjLmNvbmZpZ0tleSA9PT0gJ21heGltdW1OdW1iZXJPZk9wdGlvbicpPy5jb25maWdWYWx1ZTtcclxuICAgICAgaWYgKG1heE9wdCkge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaCgoY29udHJvbDogRm9ybUNvbnRyb2wpID0+IHtcclxuICAgICAgICAgIGlmIChjb250cm9sLnZhbHVlICYmIGNvbnRyb2wudmFsdWUubGVuZ3RoID4gTnVtYmVyKG1heE9wdCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgbWF4T3B0aW9uczogeyByZXF1aXJlZDogTnVtYmVyKG1heE9wdCksIGFjdHVhbDogY29udHJvbC52YWx1ZT8ubGVuZ3RoIHx8IDAgfSB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG1heEZpbGVzID0gcXVlc3Rpb24ucXVlc3Rpb25Db25maWdzLmZpbmQoYyA9PiBjLmNvbmZpZ0tleSA9PT0gJ21heE5vT2ZGaWxlcycpPy5jb25maWdWYWx1ZTtcclxuICAgICAgaWYgKG1heEZpbGVzKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKChjb250cm9sOiBGb3JtQ29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgY29udHJvbC52YWx1ZS5sZW5ndGggPiBOdW1iZXIobWF4RmlsZXMpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IG1heEZpbGVzOiB7IHJlcXVpcmVkOiBOdW1iZXIobWF4RmlsZXMpLCBhY3R1YWw6IGNvbnRyb2wudmFsdWU/Lmxlbmd0aCB8fCAwIH0gfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtYXhGaWxlU2l6ZSA9IHF1ZXN0aW9uLnF1ZXN0aW9uQ29uZmlncy5maW5kKGMgPT4gYy5jb25maWdLZXkgPT09ICdtYXhGaWxlU2l6ZScpPy5jb25maWdWYWx1ZTtcclxuICAgICAgaWYgKG1heEZpbGVTaXplKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKChjb250cm9sOiBGb3JtQ29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgQXJyYXkuaXNBcnJheShjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgICAgICBjb25zdCBoYXNMYXJnZUZpbGUgPSBjb250cm9sLnZhbHVlLnNvbWUoKGZpbGU6IGFueSkgPT4gZmlsZT8uc2l6ZSAmJiBmaWxlLnNpemUgPiAoTnVtYmVyKG1heEZpbGVTaXplKSAqIDEwMjQgKiAxMDI0KSk7XHJcbiAgICAgICAgICAgIGlmIChoYXNMYXJnZUZpbGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4geyBtYXhGaWxlU2l6ZTogeyByZXF1aXJlZFNpemU6IE51bWJlcihtYXhGaWxlU2l6ZSkgfSB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XHJcbiAgfVxyXG5cclxuICBpbWFnZUVycm9ySGFuZGxlcihldmVudDogYW55LCBmaWxlUGF0aDogc3RyaW5nKSB7XHJcbiAgICBldmVudC50YXJnZXQuc3JjID0gZmlsZVBhdGg7XHJcbiAgfVxyXG5cclxuICBpc09wdGlvblNlbGVjdGVkKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBxdWVzdGlvbjogQXNzZXNzbWVudFF1ZXN0aW9uLCBvcHRpb25JZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIW9wdGlvbklkKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgbGV0IGNvbnRyb2xOYW1lID0gcXVlc3Rpb24uaWQ/LnRvU3RyaW5nKCk7XHJcblxyXG4gICAgaWYgKCFjb250cm9sTmFtZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lKTtcclxuICAgIGlmICghY29udHJvbCB8fCBjb250cm9sLnZhbHVlID09IG51bGwpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBNdWx0aS1zZWxlY3QgZGVhbHMgd2l0aCBhbiBhcnJheSBvZiB2YWx1ZXNcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBjb250cm9sLnZhbHVlLmluY2x1ZGVzKG9wdGlvbklkKSB8fCBjb250cm9sLnZhbHVlLnNvbWUoKHZhbDogYW55KSA9PiB2YWw/LmlkID09PSBvcHRpb25JZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT2JqZWN0aXZlIC8gU2luZ2xlIHNlbGVjdCBkZWFscyB3aXRoIGEgc2luZ2xlIHZhbHVlIChjb3VsZCBiZSBpbnRlZ2VyIElEIG9yIG9iamVjdClcclxuICAgIGlmICh0eXBlb2YgY29udHJvbC52YWx1ZSA9PT0gJ29iamVjdCcgJiYgY29udHJvbC52YWx1ZS5pZCkge1xyXG4gICAgICByZXR1cm4gY29udHJvbC52YWx1ZS5pZCA9PT0gb3B0aW9uSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbnRyb2wudmFsdWUgPT09IG9wdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF4Q2hhckNvdW50KHF1ZXN0aW9uOiBBc3Nlc3NtZW50UXVlc3Rpb24pOiBudW1iZXIge1xyXG4gICAgY29uc3QgY29uZmlnID0gcXVlc3Rpb24/LnF1ZXN0aW9uQ29uZmlncz8uZmluZChjID0+IGMuY29uZmlnS2V5ID09PSAnbWF4Q2hhcmFjdGVyQ291bnQnKTtcclxuICAgIHJldHVybiBjb25maWcgPyBOdW1iZXIoY29uZmlnLmNvbmZpZ1ZhbHVlKSA6IDA7XHJcbiAgfVxyXG5cclxuICBnZXRSZW1haW5pbmdDaGFycyhxdWVzdGlvbjogQXNzZXNzbWVudFF1ZXN0aW9uLCBjb250cm9sOiBhbnkpOiBudW1iZXIge1xyXG4gICAgY29uc3QgbWF4ID0gdGhpcy5nZXRNYXhDaGFyQ291bnQocXVlc3Rpb24pO1xyXG4gICAgY29uc3QgY3VycmVudExlbmd0aCA9IGNvbnRyb2wudmFsdWUgPyBjb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7XHJcbiAgICByZXR1cm4gbWF4IC0gY3VycmVudExlbmd0aDtcclxuICB9XHJcblxyXG4gIGdvQmFjaygpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFiSW5kZXggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleC0tO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvdWxkRGlzYWJsZVRhYihpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGluZGV4OyBqKyspIHtcclxuICAgICAgaWYgKHRoaXMuc2VjdGlvbkZvcm1Hcm91cHNbal0/LmZvcm1Hcm91cD8uaW52YWxpZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnb05leHQobWFya0FzQ29tcGxldGVkOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgY29uc3Qgc2F2ZSA9IHRoaXMuYXNzZXNzbWVudERhdGE/LmFzc2Vzc21lbnRDb25maWdzPy5maW5kKGMgPT4gYy5jb25maWdLZXkgPT0gJ2Fzc2VzbWVudC5jb25maWcuYWxsb3dlZC1wYXJ0aWFsLXJlc3BvbnNlJyk/LmNvbmZpZ1ZhbHVlID09ICcxJztcclxuICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9uID0gdGhpcy5zZWN0aW9uRm9ybUdyb3Vwc1t0aGlzLnNlbGVjdGVkVGFiSW5kZXhdO1xyXG4gICAgaWYgKCFjdXJyZW50U2VjdGlvbikgcmV0dXJuO1xyXG5cclxuICAgIGN1cnJlbnRTZWN0aW9uLmZvcm1Hcm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcblxyXG4gICAgaWYgKGN1cnJlbnRTZWN0aW9uLmZvcm1Hcm91cC5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2VjdGlvbkVycm9yc1t0aGlzLnNlbGVjdGVkVGFiSW5kZXhdID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VjdGlvbkVycm9yc1t0aGlzLnNlbGVjdGVkVGFiSW5kZXhdID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA8IHRoaXMuc2VjdGlvbkZvcm1Hcm91cHMubGVuZ3RoIC0gMSkge1xyXG4gICAgICBzYXZlID8gdGhpcy5zYXZlKCkgOiB0aGlzLnNlbGVjdGVkVGFiSW5kZXgrKztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucHJvY2Vzc1N1Ym1pdChtYXJrQXNDb21wbGV0ZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwYW5kZWRTdGF0ZTogYm9vbGVhbltdID0gW107XHJcblxyXG4gIHByb2Nlc3NTdWJtaXQobWFya0FzQ29tcGxldGVkOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgbGV0IGZpcnN0SW52YWxpZEluZGV4ID0gLTE7XHJcbiAgICB0aGlzLnNlY3Rpb25Gb3JtR3JvdXBzLmZvckVhY2goKGdyb3VwLCBpbmRleCkgPT4ge1xyXG4gICAgICBncm91cC5mb3JtR3JvdXAubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICBpZiAoZ3JvdXAuZm9ybUdyb3VwLmludmFsaWQpIHtcclxuICAgICAgICB0aGlzLnNlY3Rpb25FcnJvcnNbaW5kZXhdID0gdHJ1ZTtcclxuICAgICAgICBpZiAoZmlyc3RJbnZhbGlkSW5kZXggPT09IC0xKSBmaXJzdEludmFsaWRJbmRleCA9IGluZGV4O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VjdGlvbkVycm9yc1tpbmRleF0gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGZpcnN0SW52YWxpZEluZGV4ICE9PSAtMSkge1xyXG4gICAgICBpZiAoIXRoaXMudmVydGljYWxWaWV3KSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gZmlyc3RJbnZhbGlkSW5kZXg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZFN0YXRlW2ZpcnN0SW52YWxpZEluZGV4XSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zbmFja2Jhck1lc3NhZ2UuZW1pdCh7IG1lc3NhZ2U6IHRoaXMubGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5UT0FTVC5GSVhfRVJST1JTJ10sIHR5cGU6ICdlcnJvcicgfSk7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9GaXJzdEludmFsaWRGaWVsZChmaXJzdEludmFsaWRJbmRleCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNhdmUodHJ1ZSwgbWFya0FzQ29tcGxldGVkKTtcclxuICB9XHJcblxyXG4gIHNjcm9sbFRvRmlyc3RJbnZhbGlkRmllbGQoc2VjdGlvbkluZGV4OiBudW1iZXIpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLnNlY3Rpb25Gb3JtR3JvdXBzW3NlY3Rpb25JbmRleF0uZm9ybUdyb3VwO1xyXG4gICAgICBmb3IgKGNvbnN0IGNvbnRyb2xOYW1lIGluIGZvcm1Hcm91cC5jb250cm9scykge1xyXG4gICAgICAgIGlmIChmb3JtR3JvdXAuY29udHJvbHNbY29udHJvbE5hbWVdLmludmFsaWQpIHtcclxuICAgICAgICAgIGxldCBxSWQgPSBjb250cm9sTmFtZTtcclxuICAgICAgICAgIGlmIChjb250cm9sTmFtZS5pbmNsdWRlcygnX3JlbWFya3NfJykgfHwgY29udHJvbE5hbWUuaW5jbHVkZXMoJ19tYXJrcycpKSB7XHJcbiAgICAgICAgICAgIHFJZCA9IGNvbnRyb2xOYW1lLnNwbGl0KCdfJylbMF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHF1ZXN0aW9uLWNvbnRhaW5lci0ke3FJZH1gKTtcclxuICAgICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgc2F2ZShnb05leHQ6IGJvb2xlYW4gPSB0cnVlLCBtYXJrQXNDb21wbGV0ZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XHJcblxyXG4gICAgaWYgKG1hcmtBc0NvbXBsZXRlZCAmJiB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPT0gdGhpcy5zZWN0aW9uRm9ybUdyb3Vwcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgIHRoaXMuYXNzZXNzZWVSZXNwb25zZS5hc3Nlc3NtZW50VGFrZW4gPSB7IGNvZGU6ICdBU1NFU1NNRU5UX1RBS0VOLkNPTVBMRVRFRCcgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXNzZXNzZWVSZXNwb25zZS5hc3Nlc3NtZW50VGFrZW4gPSB7IGNvZGU6ICdBU1NFU1NNRU5UX1RBS0VOLklOQ09NUExFVEUnIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMucmVzcG9uc2VCdWlsZGVyU2VydmljZS5idWlsZFJlc3BvbnNlUGF5bG9hZChcclxuICAgICAgdGhpcy5hc3Nlc3NlZVJlc3BvbnNlLFxyXG4gICAgICB0aGlzLmFzc2Vzc21lbnRRdWVzdGlvblBhcGVyRGF0YSxcclxuICAgICAgdGhpcy5zZWN0aW9uRm9ybUdyb3VwcyxcclxuICAgICAgdGhpcy5xdWVzdGlvbkJhbmssXHJcbiAgICAgIHRoaXMudGVuYW50SWRcclxuICAgICk7XHJcbiAgICBjb25zdCBhcGlDYWxsID0gdGhpcy5hc3Nlc3NlZVJlc3BvbnNlPy5pZCA/IHRoaXMuYXNzZXNzbWVudFRha2VyU2VydmljZS5wYXRjaEFzc2Vzc21lbnQocGF5bG9hZCkgOiB0aGlzLmFzc2Vzc21lbnRUYWtlclNlcnZpY2Uuc3VibWl0QXNzZXNzbWVudChwYXlsb2FkKTtcclxuICAgIGFwaUNhbGwuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmFzc2Vzc2VlUmVzcG9uc2U/LmlkKSB7XHJcbiAgICAgICAgICB0aGlzLmdldEFuc3dlcnNCeUFpYUlkKHJlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuYXNzZXNzZWVSZXNwb25zZSA9IHJlcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnN1Ym1pdEFzc2Vzc21lbnQuZW1pdCh7IGFzc2Vzc2VlSWQ6IHJlcz8uYXNzZXNzZWU/LmlkIHx8IHJlcywgY29tcGxldGVkOiBnb05leHQgJiYgKHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9PSB0aGlzLnNlY3Rpb25Gb3JtR3JvdXBzLmxlbmd0aCAtIDEgfHwgdGhpcy52ZXJ0aWNhbFZpZXcpIH0pO1xyXG4gICAgICAgIGlmIChnb05leHQgJiYgdGhpcy5zZWxlY3RlZFRhYkluZGV4IDwgdGhpcy5zZWN0aW9uRm9ybUdyb3Vwcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiBlcnJvciA9PiB7XHJcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNuYWNrYmFyTWVzc2FnZS5lbWl0KHsgbWVzc2FnZTogdGhpcy5sYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULlRPQVNULlNBVkVfRkFJTEVEJ10sIHR5cGU6ICdlcnJvcicgfSk7XHJcbiAgICAgICAgdGhyb3cgeyBlcnJvciwgbWV0aG9kOiB0aGlzLmFzc2Vzc2VlUmVzcG9uc2U/LmlkID8gJ1BBVENIJyA6ICdQT1NUJywgcGF5bG9hZCB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QW5zd2Vyc0J5QWlhSWQoYXNzZXNzZWVJZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFzc2Vzc21lbnRUYWtlclNlcnZpY2UuZ2V0QW5zd2Vyc0J5QWlhSWQoYXNzZXNzZWVJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5hc3Nlc3NlZVJlc3BvbnNlID0gcmVzO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogZXJyb3IgPT4ge1xyXG4gICAgICAgIHRoaXMuc25hY2tiYXJNZXNzYWdlLmVtaXQoeyBtZXNzYWdlOiB0aGlzLmxhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuVE9BU1QuR0VUX0ZBSUxFRCddLCB0eXBlOiAnZXJyb3InIH0pO1xyXG4gICAgICAgIHRocm93IHsgZXJyb3IsIG1ldGhvZDogJ0dFVCcgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFkZFlvdXR1YmVJZnJhbWVTcmModmlkZW9Vcmw6IHN0cmluZykge1xyXG4gICAgY29uc3QgdmlkZW9JZCA9IHRoaXMuZ2V0VmlkZW9JZCh2aWRlb1VybCk7XHJcbiAgICBjb25zdCB5b3V0dWJlVXJsID0gYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyR7dmlkZW9JZH1gO1xyXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh5b3V0dWJlVXJsKTtcclxuICB9XHJcblxyXG4gIGdldFZpZGVvSWQodmlkZW9Vcmw6IHN0cmluZykge1xyXG4gICAgbGV0IHBhdHRlcm4gPSBudWxsO1xyXG4gICAgaWYgKHZpZGVvVXJsLmluY2x1ZGVzKCd5b3V0dWJlLmNvbScpKSB7XHJcbiAgICAgIHBhdHRlcm4gPSAvKD86XFw/dj18JnY9fHlvdXR1XFwuYmVcXC98XFwvZW1iZWRcXC98XFwvXFxkXFwvfFxcL3ZpXFwvfFxcL3ZcXC98aHR0cHM/OlxcL1xcLyg/Ond3d1xcLik/eW91dHViZVxcLmNvbVxcLyg/OnZcXC98ZW1iZWRcXC98d2F0Y2hcXD8oPzpcXFMrJik/dj18d2F0Y2hcXD8oPzpcXFMrJik/dmk9fFxcUytcXC8pKShbYS16QS1aMC05Xy1dezExfSkvO1xyXG4gICAgfSBlbHNlIGlmICh2aWRlb1VybC5pbmNsdWRlcygneW91dHUuYmUnKSkge1xyXG4gICAgICBwYXR0ZXJuID0gL3lvdXR1XFwuYmVcXC8oW2EtekEtWjAtOV8tXXsxMX0pLztcclxuICAgIH1cclxuICAgIGlmIChwYXR0ZXJuKSB7XHJcbiAgICAgIGNvbnN0IG1hdGNoID0gdmlkZW9VcmwubWF0Y2gocGF0dGVybik7XHJcbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFsxXSkge1xyXG4gICAgICAgIHJldHVybiBtYXRjaFsxXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBvcGVuSW5zdHJ1Y3Rpb25zRGlhbG9nKHNlY3Rpb246IFF1ZXN0aW9uUGFwZXJTZWN0aW9uKSB7XHJcbiAgICB0aGlzLmRpYWxvZy5vcGVuKFNlY3Rpb25JbnN0cnVjdGlvbnNDb21wb25lbnQsIHtcclxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcclxuICAgICAgbWF4V2lkdGg6ICc5NSUnLFxyXG4gICAgICB3aWR0aDogJ2NhbGMoMjByZW0gKyA1MDBweCknLFxyXG4gICAgICBtYXhIZWlnaHQ6ICc5NWR2aCcsXHJcbiAgICAgIHBhbmVsQ2xhc3M6IFsnYXNzZXNzbWVudC1kaWFsb2cnXSxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIGltYWdlQ29uZmlnOiB0aGlzLmltYWdlQ29uZmlnLFxyXG4gICAgICAgIGxhYmVsQ29uZmlnOiB0aGlzLmxhYmVsQ29uZmlnLFxyXG4gICAgICAgIHNlY3Rpb25EZXRhaWxzOiBzZWN0aW9uXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cImNvbmZpZ3NMb2FkZWQgJiYgIXNob3dMb2FkZXI7IGVsc2UgbG9hZGVyXCIgY2xhc3M9XCJjb2wtMTIgaC0xMDBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgaC0xMDAgcHktNFwiIFtjbGFzcy5oZWlnaHQtd2l0aG91dC1mb290ZXJdPVwic2hvd0Zvb3RlclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhc3Nlc3NtZW50UXVlc3Rpb25QYXBlckRhdGE/LnF1ZXN0aW9uUGFwZXJTZWN0aW9uTGlzdD8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwiIXZlcnRpY2FsVmlld1wiIGFuaW1hdGlvbkR1cmF0aW9uPVwiMG1zXCIgY2xhc3M9XCJhc3Nlc3NtZW50LW1hdC1jdXN0b20tdGFic1wiXHJcbiAgICAgICAgICAgICAgICBbKHNlbGVjdGVkSW5kZXgpXT1cInNlbGVjdGVkVGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtdGFiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2YgYXNzZXNzbWVudFF1ZXN0aW9uUGFwZXJEYXRhLnF1ZXN0aW9uUGFwZXJTZWN0aW9uTGlzdCB8IG9yZGVyQnk7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzaG91bGREaXNhYmxlVGFiKGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXNlbWlib2xkLTE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlY3Rpb25FcnJvcnNbaV0gPyAnYXNzZXNzbWVudC10ZXh0LWRhbmdlcicgOiAnJ1wiPnt7c2VjdGlvbi5xcHNOYW1lPy5bMF0/LnRleHR9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VjdGlvbkNvbnRlbnQ7IGNvbnRleHQ6IHsgc2VjdGlvbjogc2VjdGlvbiwgaTogaSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L21hdC10YWI+XHJcbiAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cclxuXHJcbiAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uICpuZ0lmPVwidmVydGljYWxWaWV3XCIgbXVsdGk9XCJ0cnVlXCIgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTQgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWxcclxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBhc3Nlc3NtZW50UXVlc3Rpb25QYXBlckRhdGEucXVlc3Rpb25QYXBlclNlY3Rpb25MaXN0IHwgb3JkZXJCeTsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2V4cGFuZGVkXT1cImV4cGFuZGVkU3RhdGVbaV0gIT09IGZhbHNlXCIgKG9wZW5lZCk9XCJleHBhbmRlZFN0YXRlW2ldID0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsb3NlZCk9XCJleHBhbmRlZFN0YXRlW2ldID0gZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC1ib3JkZXItcmFkaXVzLXR3byBzaGFkb3ctbm9uZSBtLTAgYXNzZXNzbWVudC1wYW5lbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciBjbGFzcz1cImFzc2Vzc21lbnQtYmctZ3JleS10d28gaC1hdXRvIHB5LTMgYmctdHJhbnNwYXJlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXNlbWlib2xkLTE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWN0aW9uRXJyb3JzW2ldID8gJ2Fzc2Vzc21lbnQtdGV4dC1kYW5nZXInIDogJydcIj57e3NlY3Rpb24ucXBzTmFtZT8uWzBdPy50ZXh0fX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTQgcHgtbWQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInNlY3Rpb25Db250ZW50OyBjb250ZXh0OiB7IHNlY3Rpb246IHNlY3Rpb24sIGk6IGkgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgICAgICA8L21hdC1hY2NvcmRpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhYXNzZXNzbWVudFF1ZXN0aW9uUGFwZXJEYXRhPy5xdWVzdGlvblBhcGVyU2VjdGlvbkxpc3Q/Lmxlbmd0aFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaC0xMDAgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0zXCI+XHJcbiAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZUNvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULklDT04uTk9fUVVFU1RJT05TJ11cIiBjbGFzcz1cImNvbC1zbS1hdXRvIGNvbC02XCJcclxuICAgICAgICAgICAgICAgIChlcnJvcik9XCJpbWFnZUVycm9ySGFuZGxlcigkZXZlbnQsICdhc3NldHMvY29tbW9ucy1hc3Nlc3NtZW50L2ltYWdlcy9uby1xdWVzdGlvbnMuc3ZnJylcIiAvPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMSBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTE4XCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLk5PX1FVRVNUSU9OUyddfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0Zvb3RlclwiXHJcbiAgICAgICAgY2xhc3M9XCJiZy13aGl0ZSBwLTMgcG9zaXRpb24tc3RpY2t5IGJvdHRvbS0wIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBib3JkZXItdG9wIGdhcC0zIHotaW5kZXgtMVwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXpvb20tYW5pbWF0aW9uIGFzc2Vzc21lbnQtYm9yZGVyLXJhZGl1cy10d28gYXNzZXNzbWVudC1idXR0b24tcGFkZGluZy1sYXJnZSBhc3Nlc3NtZW50LWJ0bi1wcmltYXJ5LXRyYW5zcGFyZW50IGFzc2Vzc21lbnQtdGV4dC1zZW1pYm9sZC0xM1wiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJnb0JhY2soKVwiICpuZ0lmPVwic2VsZWN0ZWRUYWJJbmRleCA+IDAgJiYgIXZlcnRpY2FsVmlld1wiPlxyXG4gICAgICAgICAgICB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuR09fQkFDSyddfX08L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1N1Ym1pdHRpbmdcIiAoY2xpY2spPVwidmVydGljYWxWaWV3ID8gcHJvY2Vzc1N1Ym1pdCh0cnVlKSA6IGdvTmV4dCgpXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXpvb20tYW5pbWF0aW9uIGFzc2Vzc21lbnQtYm9yZGVyLXJhZGl1cy10d28gYXNzZXNzbWVudC1idXR0b24tcGFkZGluZy1sYXJnZSBhc3Nlc3NtZW50LWJ0bi1wcmltYXJ5IGFzc2Vzc21lbnQtdGV4dC1zZW1pYm9sZC0xMyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJ7J29wYWNpdHktMCc6IGlzU3VibWl0dGluZ31cIj5cclxuICAgICAgICAgICAgICAgIHt7ICh2ZXJ0aWNhbFZpZXcgfHwgc2VsZWN0ZWRUYWJJbmRleCA9PT0gc2VjdGlvbkZvcm1Hcm91cHMubGVuZ3RoIC0gMSkgP1xyXG4gICAgICAgICAgICAgICAgbGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5TVUJNSVQnXSA6IGxhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuTkVYVCddIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNTdWJtaXR0aW5nXCIgW2RpYW1ldGVyXT1cIjIwXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgdG9wLTUwIHN0YXJ0LTUwIHRyYW5zbGF0ZS1taWRkbGUgYXNzZXNzbWVudC1zcGlubmVyLXdoaXRlXCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbG9hZGVyPlxyXG4gICAgPGRpdiBjbGFzcz1cImgtMTAwIGNvbC0xMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcHktNVwiPlxyXG4gICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjYwXCIgY2xhc3M9XCJhc3Nlc3NtZW50LXNwaW5uZXItcHJpbWFyeVwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gUmVjdXJzaXZlIFRlbXBsYXRlIGZvciBRdWVzdGlvbnMgJiBDaGlsZCBRdWVzdGlvbnMgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjcXVlc3Rpb25UZW1wbGF0ZSBsZXQtcXVlc3Rpb25JZD1cInF1ZXN0aW9uSWRcIiBsZXQtaXNNYW5kYXRvcnk9XCJpc01hbmRhdG9yeVwiIGxldC1ncm91cEluZGV4PVwiZ3JvdXBJbmRleFwiXHJcbiAgICBsZXQtcGFyZW50T3B0aW9uSWQ9XCJwYXJlbnRPcHRpb25JZFwiIGxldC1xdWVzdGlvbkluZGV4PVwicXVlc3Rpb25JbmRleFwiPlxyXG4gICAgPGRpdiBbZm9ybUdyb3VwXT1cInNlY3Rpb25Gb3JtR3JvdXBzW2dyb3VwSW5kZXhdLmZvcm1Hcm91cFwiIFtpZF09XCIncXVlc3Rpb24tY29udGFpbmVyLScgKyBxdWVzdGlvbklkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFzc2Vzc21lbnQtYm9yZGVyLXJhZGl1cy10d28gbWItM1wiIFtuZ0NsYXNzXT1cInBhcmVudE9wdGlvbklkPyAnJyA6ICdwLTMgYXNzZXNzbWVudC1jYXJkLWJvcmRlcidcIlxyXG4gICAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uQmFua1txdWVzdGlvbklkXSBhcyBxdWVzdGlvblwiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBmbGV4LW1kLXJvdyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtMiBnYXAtbWQtMyBhbGlnbi1pdGVtcy1tZC1zdGFydCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC1tZC0zIGdhcC0yIGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xNSBtYi0wIGQtZmxleCBnYXAtMSBnYXAtbWQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3txdWVzdGlvbkluZGV4ICsgMX19LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySHRtbF09XCJxdWVzdGlvbi5xdWVzdGlvblRleHQ/LlswXT8udGV4dFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMyBjb2wtMTJcIiAqbmdJZj1cInF1ZXN0aW9uPy5tZWRpYVVybFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiVmlkZW9UZW1wbGF0ZTsgY29udGV4dDp7dmlkZW9Vcmw6cXVlc3Rpb24/Lm1lZGlhVXJsfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlc3Rpb24uaGludFRleHQgJiYgIXByZXZpZXdNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZUNvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULklDT04uSU5GTyddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJpbWFnZUVycm9ySGFuZGxlcigkZXZlbnQsICdhc3NldHMvY29tbW9ucy1hc3Nlc3NtZW50L2ltYWdlcy9pbmZvLnN2ZycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNka092ZXJsYXlPcmlnaW4gI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInRvb2x0aXBTdGF0ZVtxdWVzdGlvbi5pZCFdID0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJ0b29sdGlwU3RhdGVbcXVlc3Rpb24uaWQhXSA9IGZhbHNlXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBjZGtDb25uZWN0ZWRPdmVybGF5IFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cInRvb2x0aXBTdGF0ZVtxdWVzdGlvbi5pZCFdIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cIlt7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdjZW50ZXInLCBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnY2VudGVyJywgb2Zmc2V0WDogLTgsIG9mZnNldFk6IDAgfSwgeyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ2NlbnRlcicsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2NlbnRlcicsIG9mZnNldFg6IDgsIG9mZnNldFk6IDAgfV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhc3Nlc3NtZW50LWJnLWdyZXktdHdvIGFzc2Vzc21lbnQtdG9vbHRpcC1ib3JkZXIgcC0zIGFzc2Vzc21lbnQtYm9yZGVyLXJhZGl1cy10d28gYXNzZXNzbWVudC1ib3gtc2hhZG93LXRvb2x0aXAgcXVlc3Rpb24taW5mbyBhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwidG9vbHRpcFN0YXRlW3F1ZXN0aW9uLmlkIV0gPSB0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJ0b29sdGlwU3RhdGVbcXVlc3Rpb24uaWQhXSA9IGZhbHNlXCIgW2lubmVySFRNTF09XCJxdWVzdGlvbi5oaW50VGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEFzc2Vzc29yIE1hcmtzIERyb3Bkb3duIExvZ2ljIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlTWFya3MgJiYgc2hvdWxkU2hvd01hcmtzRHJvcGRvd24ocXVlc3Rpb24pICYmIHNlY3Rpb25Gb3JtR3JvdXBzW2dyb3VwSW5kZXhdLmZvcm1Hcm91cC5nZXQocXVlc3Rpb24uaWQgKyAnX21hcmtzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1iLTAgYXNzZXNzbWVudC1tYXJrcy1kcm9wZG93biBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xMlwiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5NQVJLUyddfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJxdWVzdGlvbi5pZCArICdfbWFya3MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtYXJrIG9mIGdldE1hcmtzUmFuZ2UocXVlc3Rpb24uaWQhKVwiIFt2YWx1ZV09XCJtYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ttYXJrfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJxdWVzdGlvbi5xdWVzdGlvblR5cGU/LmNvZGVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCIgKm5nU3dpdGNoQ2FzZT1cIidRVUVTVElPTl9UWVBFLlNVQkpFQ1RJVkVfU0hPUlQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbi10eXBlLXNob3J0IFtxdWVzdGlvbl09XCJxdWVzdGlvblwiIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24uaWQhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlzTWFuZGF0b3J5XCIgW3ByZXZpZXdNb2RlXT1cInByZXZpZXdNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsQ29uZmlnXT1cImxhYmVsQ29uZmlnXCI+PC9saWItcXVlc3Rpb24tdHlwZS1zaG9ydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIiAqbmdTd2l0Y2hDYXNlPVwiJ1FVRVNUSU9OX1RZUEUuU1VCSkVDVElWRV9MT05HJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItcXVlc3Rpb24tdHlwZS1sb25nIFtxdWVzdGlvbl09XCJxdWVzdGlvblwiIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24uaWQhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlzTWFuZGF0b3J5XCIgW3ByZXZpZXdNb2RlXT1cInByZXZpZXdNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsQ29uZmlnXT1cImxhYmVsQ29uZmlnXCI+PC9saWItcXVlc3Rpb24tdHlwZS1sb25nPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiICpuZ1N3aXRjaENhc2U9XCInUVVFU1RJT05fVFlQRS5TVUJKRUNUSVZFX1JJQ0hfVEVYVCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGliLXF1ZXN0aW9uLXR5cGUtZWRpdG9yIFtxdWVzdGlvbl09XCJxdWVzdGlvblwiIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24uaWQhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlzTWFuZGF0b3J5XCIgW3ByZXZpZXdNb2RlXT1cInByZXZpZXdNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsQ29uZmlnXT1cImxhYmVsQ29uZmlnXCI+PC9saWItcXVlc3Rpb24tdHlwZS1lZGl0b3I+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCIgKm5nU3dpdGNoQ2FzZT1cIidRVUVTVElPTl9UWVBFLk9CSkVDVElWRSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGliLXF1ZXN0aW9uLXR5cGUtb2JqZWN0aXZlIFtxdWVzdGlvbl09XCJxdWVzdGlvblwiIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24uaWQhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlzTWFuZGF0b3J5XCI+PC9saWItcXVlc3Rpb24tdHlwZS1vYmplY3RpdmU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCIgKm5nU3dpdGNoQ2FzZT1cIidRVUVTVElPTl9UWVBFLk1VTFRJX1NFTEVDVCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGliLXF1ZXN0aW9uLXR5cGUtbXVsdGlzZWxlY3QgW3F1ZXN0aW9uXT1cInF1ZXN0aW9uXCIgW2Zvcm1Db250cm9sTmFtZV09XCJxdWVzdGlvbi5pZCFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiaXNNYW5kYXRvcnlcIj48L2xpYi1xdWVzdGlvbi10eXBlLW11bHRpc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiICpuZ1N3aXRjaENhc2U9XCInUVVFU1RJT05fVFlQRS5QUkVGRVJFTkNFJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItcXVlc3Rpb24tdHlwZS1wcmVmZXJlbmNlIFtxdWVzdGlvbl09XCJxdWVzdGlvblwiIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24uaWQhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlzTWFuZGF0b3J5XCI+PC9saWItcXVlc3Rpb24tdHlwZS1wcmVmZXJlbmNlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiICpuZ1N3aXRjaENhc2U9XCInUVVFU1RJT05fVFlQRS5OVU1CRVInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbi10eXBlLXNob3J0IFtxdWVzdGlvbl09XCJxdWVzdGlvblwiIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24uaWQhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlzTWFuZGF0b3J5XCIgW3ByZXZpZXdNb2RlXT1cInByZXZpZXdNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsQ29uZmlnXT1cImxhYmVsQ29uZmlnXCI+PC9saWItcXVlc3Rpb24tdHlwZS1zaG9ydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIiAqbmdTd2l0Y2hDYXNlPVwiJ1FVRVNUSU9OX1RZUEUuRU1BSUwnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbi10eXBlLXNob3J0IFtxdWVzdGlvbl09XCJxdWVzdGlvblwiIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24uaWQhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlzTWFuZGF0b3J5XCIgW3ByZXZpZXdNb2RlXT1cInByZXZpZXdNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsQ29uZmlnXT1cImxhYmVsQ29uZmlnXCI+PC9saWItcXVlc3Rpb24tdHlwZS1zaG9ydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIiAqbmdTd2l0Y2hDYXNlPVwiJ1FVRVNUSU9OX1RZUEUuQ09OVEFDVF9OVU1CRVInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbi10eXBlLXNob3J0IFtxdWVzdGlvbl09XCJxdWVzdGlvblwiIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24uaWQhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlzTWFuZGF0b3J5XCIgW3ByZXZpZXdNb2RlXT1cInByZXZpZXdNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsQ29uZmlnXT1cImxhYmVsQ29uZmlnXCI+PC9saWItcXVlc3Rpb24tdHlwZS1zaG9ydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIiAqbmdTd2l0Y2hDYXNlPVwiJ1FVRVNUSU9OX1RZUEUuVVJMJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItcXVlc3Rpb24tdHlwZS1zaG9ydCBbcXVlc3Rpb25dPVwicXVlc3Rpb25cIiBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLmlkIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJpc01hbmRhdG9yeVwiIFtwcmV2aWV3TW9kZV09XCJwcmV2aWV3TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbENvbmZpZ109XCJsYWJlbENvbmZpZ1wiPjwvbGliLXF1ZXN0aW9uLXR5cGUtc2hvcnQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCIgKm5nU3dpdGNoQ2FzZT1cIidRVUVTVElPTl9UWVBFLkZJTEVfVVBMT0FEJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItcXVlc3Rpb24tdHlwZS1maWxlLXVwbG9hZCBbcXVlc3Rpb25dPVwicXVlc3Rpb25cIiBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLmlkIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJpc01hbmRhdG9yeVwiIFtsYWJlbENvbmZpZ109XCJsYWJlbENvbmZpZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbWFnZUNvbmZpZ109XCJpbWFnZUNvbmZpZ1wiPjwvbGliLXF1ZXN0aW9uLXR5cGUtZmlsZS11cGxvYWQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEVycm9yIE1lc3NhZ2VzIGFuZCBDaGFyYWN0ZXIgQ291bnQgQ29udGFpbmVyIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VjdGlvbkZvcm1Hcm91cHNbZ3JvdXBJbmRleF0uZm9ybUdyb3VwLmdldChxdWVzdGlvbi5pZD8udG9TdHJpbmcoKSB8fCAnJykgYXMgY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5FUlJPUi5SRVFVSVJFRF9SRVNQT05TRSddfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWRhbmdlciBtdC0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzPy5bJ3BhdHRlcm4nXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3txdWVzdGlvbj8udmFsaWRhdGlvbk1lc3NhZ2UgfHwgbGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5FUlJPUi5JTlZBTElEX0ZPUk1BVCddfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWRhbmdlciBtdC0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzPy5bJ21pbmxlbmd0aCddXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuRVJST1IuTUlOX0NIQVJTJ10/LnJlcGxhY2UoJ3t7bGVuZ3RofX0nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5lcnJvcnM/LlsnbWlubGVuZ3RoJ10ucmVxdWlyZWRMZW5ndGggKyAnJyl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZGFuZ2VyIG10LTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnM/LlsnbWF4bGVuZ3RoJ11cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5FUlJPUi5NQVhfQ0hBUlMnXT8ucmVwbGFjZSgne3tsZW5ndGh9fScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmVycm9ycz8uWydtYXhsZW5ndGgnXS5yZXF1aXJlZExlbmd0aCArICcnKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciBjbGFzcz1cImFzc2Vzc21lbnQtdGV4dC1yZWd1bGFyLTEyIGFzc2Vzc21lbnQtdGV4dC1kYW5nZXIgbXQtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9ycz8uWydtaW5PcHRpb25zJ11cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5FUlJPUi5NSU5fT1BUSU9OUyddPy5yZXBsYWNlKCd7e2NvdW50fX0nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5lcnJvcnM/LlsnbWluT3B0aW9ucyddLnJlcXVpcmVkICsgJycpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWRhbmdlciBtdC0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzPy5bJ21heE9wdGlvbnMnXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkVSUk9SLk1BWF9PUFRJT05TJ10/LnJlcGxhY2UoJ3t7Y291bnR9fScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmVycm9ycz8uWydtYXhPcHRpb25zJ10ucmVxdWlyZWQgKyAnJyl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZGFuZ2VyIG10LTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnM/LlsnbWF4RmlsZXMnXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkVSUk9SLk1BWF9GSUxFUyddPy5yZXBsYWNlKCd7e2NvdW50fX0nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5lcnJvcnM/LlsnbWF4RmlsZXMnXS5yZXF1aXJlZCArICcnKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciBjbGFzcz1cImFzc2Vzc21lbnQtdGV4dC1yZWd1bGFyLTEyIGFzc2Vzc21lbnQtdGV4dC1kYW5nZXIgbXQtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9ycz8uWydtYXhGaWxlU2l6ZSddXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuRVJST1IuTUFYX0ZJTEVfU0laRSddPy5yZXBsYWNlKCd7e3NpemV9fScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmVycm9ycz8uWydtYXhGaWxlU2l6ZSddLnJlcXVpcmVkU2l6ZSArICcnKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFzc2Vzc21lbnQtdGV4dC1yZWd1bGFyLTEyIGFzc2Vzc21lbnQtdGV4dC1ncmV5LXNldmVuIHdoaXRlLXNwYWNlLW5vd3JhcCBtcy0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRNYXhDaGFyQ291bnQocXVlc3Rpb24pID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRSZW1haW5pbmdDaGFycyhxdWVzdGlvbiwgY29udHJvbCkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLkNIQVJBQ1RFUiddfX17e2dldFJlbWFpbmluZ0NoYXJzKHF1ZXN0aW9uLCBjb250cm9sKSAhPT1cclxuICAgICAgICAgICAgICAgICAgICAgICAgMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdzJyA6ICcnfX0ge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLlJFTUFJTklORyddfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgPCEtLSBDaGlsZCBRdWVzdGlvbnMgYW5kIFJlbWFya3MgUmVuZGVyaW5nIExvZ2ljIGJhc2VkIG9uIGNoZWNrZWQgZm9ybSBzdGF0ZSAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXN0aW9uLmRlZmF1bHRPcHRpb25zTGlzdD8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcXVlc3Rpb24uZGVmYXVsdE9wdGlvbnNMaXN0XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc09wdGlvblNlbGVjdGVkKHNlY3Rpb25Gb3JtR3JvdXBzW2dyb3VwSW5kZXhdLmZvcm1Hcm91cCwgcXVlc3Rpb24sIG9wdGlvbi5vcHRpb25zPy5pZClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUkVNQVJLUyBGSUVMRCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24ucmVtYXJrc1JlcXVpcmVkICYmIHNlY3Rpb25Gb3JtR3JvdXBzW2dyb3VwSW5kZXhdLmZvcm1Hcm91cC5nZXQocXVlc3Rpb24uaWQgKyAnX3JlbWFya3NfJyArIG9wdGlvbi5pZCkgYXMgcmVtYXJrc0NvbnRyb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTUgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5SRU1BUktTJ119fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJ7e3F1ZXN0aW9uLmlkfX1fcmVtYXJrc197e29wdGlvbi5pZH19XCIgcm93cz1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULlBMQUNFSE9MREVSLlJFTUFSS1MnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicmVtYXJrc0NvbnRyb2wuaW52YWxpZCAmJiByZW1hcmtzQ29udHJvbC50b3VjaGVkID8gJ2Fzc2Vzc21lbnQtaW5wdXQtYm9yZGVyLWludmFsaWQnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLTEyIGFzc2Vzc21lbnQtdGV4dC1yZWd1bGFyLTEzIGFzc2Vzc21lbnQtaW5wdXQtYm9yZGVyLW9uZSBhc3Nlc3NtZW50LWJvcmRlci1yYWRpdXMtdHdvIGFzc2Vzc21lbnQtaW5wdXQtcGFkZGluZyBvdXRsaW5lLTAgYXNzZXNzbWVudC1iZy1ncmV5LW9uZVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWRhbmdlciBtdC0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlbWFya3NDb250cm9sLmludmFsaWQgJiYgcmVtYXJrc0NvbnRyb2wudG91Y2hlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5FUlJPUi5GSUVMRF9SRVFVSVJFRCddfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0hJTEQgUVVFU1RJT05TIFJFQ1VSU0lPTiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtdC0zXCIgKm5nSWY9XCJvcHRpb24uY2hpbGRRdWVzdGlvbkxpc3Q/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hpbGRJZCBvZiBvcHRpb24uY2hpbGRRdWVzdGlvbkxpc3Q7IGxldCBjaGlsZEluZGV4ID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicXVlc3Rpb25UZW1wbGF0ZTsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25JZDogY2hpbGRJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWFuZGF0b3J5OiBxdWVzdGlvbkJhbmtbY2hpbGRJZF0/LmlzTWFuZGF0b3J5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJbmRleDogZ3JvdXBJbmRleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE9wdGlvbklkOiBvcHRpb24uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbkluZGV4OiBjaGlsZEluZGV4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIFJldXNhYmxlIFNlY3Rpb24gRm9ybSBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNzZWN0aW9uQ29udGVudCBsZXQtc2VjdGlvbj1cInNlY3Rpb25cIiBsZXQtaT1cImlcIj5cclxuICAgIDxmb3JtIGNsYXNzPVwidy0xMDBcIiBbZm9ybUdyb3VwXT1cInNlY3Rpb25Gb3JtR3JvdXBzW2ldLmZvcm1Hcm91cFwiIFtuYW1lXT1cIidzZWN0aW9uZnJtLScgKyBpXCIgbm92YWxpZGF0ZT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi00XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXNlbWlib2xkLTE0IGFzc2Vzc21lbnQtdGV4dC1ncmV5LXRlblwiPlxyXG4gICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLlRPVEFMX1FVRVNUSU9OUyddfX17eyBzZWN0aW9uPy50b3RhbFF1ZXN0aW9ucyB8fCAwIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib3Blbkluc3RydWN0aW9uc0RpYWxvZyhzZWN0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFwcmV2aWV3TW9kZSAmJiAoc2VjdGlvbj8ucXBzRGVzYz8uWzBdPy50ZXh0IHx8IHNlY3Rpb24/Lm1lZGlhVXJsKVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFzc2Vzc21lbnQtem9vbS1hbmltYXRpb24gYXNzZXNzbWVudC1idXR0b24tcGFkZGluZyBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzIGFzc2Vzc21lbnQtYnRuLXByaW1hcnktdHJhbnNwYXJlbnRcIj5cclxuICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5WSUVXX0lOU1RSVUNUSU9OUyddfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNxIG9mIHNlY3Rpb24uc2VjdGlvblF1ZXN0aW9uc0xpc3QgfCBvcmRlckJ5OyBsZXQgaiA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJxdWVzdGlvblRlbXBsYXRlOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICBxdWVzdGlvbklkOiBzcS5xdWVzdGlvbklkLFxyXG4gICAgICAgICAgICAgICAgaXNNYW5kYXRvcnk6IHF1ZXN0aW9uQmFua1tzcS5xdWVzdGlvbklkXT8uaXNNYW5kYXRvcnksXHJcbiAgICAgICAgICAgICAgICBncm91cEluZGV4OiBpLFxyXG4gICAgICAgICAgICAgICAgcGFyZW50T3B0aW9uSWQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBxdWVzdGlvbkluZGV4OiBqXHJcbiAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Zvcm0+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIHZpZGVvIHByZXZpZXcgIC0tPlxyXG48bmctdGVtcGxhdGUgbGV0LXZpZGVvVXJsPVwidmlkZW9VcmxcIiAjVmlkZW9UZW1wbGF0ZT5cclxuICAgIDxkaXYgY2xhc3M9XCJhc3Nlc3NtZW50LWJvcmRlci1yYWRpdXMtdHdvIG92ZXJmbG93LWhpZGRlbiBjb2wtbWQtMTAgY29sLTEyXCI+XHJcbiAgICAgICAgPHZpZGVvICpuZ0lmPVwidmlkZW9Vcmw/LmluY2x1ZGVzKCcubXA0JykgZWxzZSB5b3V0dWJlVmlkZW9cIiB3aWR0aD1cIjQwMFwiIGNvbnRyb2xzIGNsYXNzPVwibXctMTAwIGQtYmxvY2sgbXgtYXV0b1wiPlxyXG4gICAgICAgICAgICA8c291cmNlIFtzcmNdPVwidmlkZW9VcmxcIiB0eXBlPVwidmlkZW8vbXA0XCI+XHJcbiAgICAgICAgPC92aWRlbz5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3lvdXR1YmVWaWRlbz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInlvdXR1YmUtdmlkZW8gcG9zaXRpb24tcmVsYXRpdmUgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxpZnJhbWUgW3NyY109XCJhZGRZb3V0dWJlSWZyYW1lU3JjKHZpZGVvVXJsKVwiIHRpdGxlPVwiWW91VHViZSB2aWRlbyBwbGF5ZXJcIiBmcmFtZWJvcmRlcj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFsbG93PVwiYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZTsgd2ViLXNoYXJlXCJcclxuICAgICAgICAgICAgICAgICAgICBhbGxvd2Z1bGxzY3JlZW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB0b3AtMCBzdGFydC0wIHctMTAwIGgtMTAwIGQtYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDwvaWZyYW1lPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
|