@touchpoll/tp-survey 0.0.1
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 +24 -0
- package/esm2022/lib/component/answer/answer.additional/answer.additional.component.mjs +49 -0
- package/esm2022/lib/component/answer/answer.additional/directive/additional.answer.caption.position/additional.answer.caption.position.directive.mjs +61 -0
- package/esm2022/lib/component/answer/answer.end/answer.end.component.mjs +30 -0
- package/esm2022/lib/component/answer/answer.info/answer.info.component.mjs +30 -0
- package/esm2022/lib/component/answer/answer.lang/answer.lang.component.mjs +22 -0
- package/esm2022/lib/component/answer/answer.master/answer.master.component.mjs +55 -0
- package/esm2022/lib/component/answer/answer.ms/answer.ms.component.mjs +106 -0
- package/esm2022/lib/component/answer/answer.od/answer.od.component.mjs +39 -0
- package/esm2022/lib/component/answer/answer.ol/answer.ol.component.mjs +39 -0
- package/esm2022/lib/component/answer/answer.sl/answer.sl.component.mjs +131 -0
- package/esm2022/lib/component/answer/answer.sl/pipe/as.form.array/as.form.array.pipe.mjs +17 -0
- package/esm2022/lib/component/answer/answer.sl/pipe/as.form.control/as.form.control.pipe.mjs +17 -0
- package/esm2022/lib/component/answer/answer.ss/answer.ss.component.mjs +51 -0
- package/esm2022/lib/component/answer/container.answer/container.answer.component.mjs +317 -0
- package/esm2022/lib/component/answer/container.answer/container.answer.validator.mjs +124 -0
- package/esm2022/lib/component/navigation.button/navigation.button.component.mjs +21 -0
- package/esm2022/lib/component/question.caption/question.caption.component.mjs +15 -0
- package/esm2022/lib/component/survey.play/survey.play.component.mjs +131 -0
- package/esm2022/lib/component/survey.question.preview/survey.question.preview.component.mjs +44 -0
- package/esm2022/lib/core/tp.servey.quota/tp.survey.quota.mjs +82 -0
- package/esm2022/lib/core/tp.survey.answer/tp.survey.answer.mjs +30 -0
- package/esm2022/lib/core/tp.survey.core/tp.survey.core.service.mjs +370 -0
- package/esm2022/lib/core/tp.survey.interview/tp.survey.interview.service.mjs +70 -0
- package/esm2022/lib/core/tp.survey.logic/tp.survey.logic.service.mjs +43 -0
- package/esm2022/lib/directive/alternatives.container/alternatives.container.directive.mjs +130 -0
- package/esm2022/lib/directive/focus.and.select/focus.and.select.directive.mjs +27 -0
- package/esm2022/lib/directive/survey.theme/survey.theme.directive.mjs +53 -0
- package/esm2022/lib/directive/update.font.size/update.font.size.directive.mjs +28 -0
- package/esm2022/lib/icons/default.icons/default.icons.mjs +15 -0
- package/esm2022/lib/icons/default.icons/default.icons.module.mjs +31 -0
- package/esm2022/lib/pipe/get.active.language/get.active.language.pipe.mjs +17 -0
- package/esm2022/lib/pipe/get.additional.value.by.value/get.additional.value.by.value.pipe.mjs +18 -0
- package/esm2022/lib/pipe/key.values/key.values.pipe.mjs +20 -0
- package/esm2022/lib/pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe.mjs +26 -0
- package/esm2022/lib/tp.survey.config.mjs +8 -0
- package/esm2022/lib/tp.survey.const.mjs +28 -0
- package/esm2022/lib/tp.survey.enum.mjs +59 -0
- package/esm2022/lib/tp.survey.interface.mjs +2 -0
- package/esm2022/lib/tp.survey.method.mjs +5 -0
- package/esm2022/lib/tp.survey.module.mjs +27 -0
- package/esm2022/lib/tp.survey.type.mjs +2 -0
- package/esm2022/public-api.mjs +14 -0
- package/esm2022/touchpoll-tp-survey.mjs +5 -0
- package/fesm2022/touchpoll-tp-survey.mjs +2210 -0
- package/fesm2022/touchpoll-tp-survey.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/component/answer/answer.additional/answer.additional.component.d.ts +17 -0
- package/lib/component/answer/answer.additional/directive/additional.answer.caption.position/additional.answer.caption.position.directive.d.ts +16 -0
- package/lib/component/answer/answer.end/answer.end.component.d.ts +6 -0
- package/lib/component/answer/answer.info/answer.info.component.d.ts +6 -0
- package/lib/component/answer/answer.lang/answer.lang.component.d.ts +9 -0
- package/lib/component/answer/answer.master/answer.master.component.d.ts +21 -0
- package/lib/component/answer/answer.ms/answer.ms.component.d.ts +21 -0
- package/lib/component/answer/answer.od/answer.od.component.d.ts +8 -0
- package/lib/component/answer/answer.ol/answer.ol.component.d.ts +7 -0
- package/lib/component/answer/answer.sl/answer.sl.component.d.ts +21 -0
- package/lib/component/answer/answer.sl/pipe/as.form.array/as.form.array.pipe.d.ts +8 -0
- package/lib/component/answer/answer.sl/pipe/as.form.control/as.form.control.pipe.d.ts +8 -0
- package/lib/component/answer/answer.ss/answer.ss.component.d.ts +10 -0
- package/lib/component/answer/container.answer/container.answer.component.d.ts +36 -0
- package/lib/component/answer/container.answer/container.answer.validator.d.ts +10 -0
- package/lib/component/navigation.button/navigation.button.component.d.ts +9 -0
- package/lib/component/question.caption/question.caption.component.d.ts +8 -0
- package/lib/component/survey.play/survey.play.component.d.ts +36 -0
- package/lib/component/survey.question.preview/survey.question.preview.component.d.ts +16 -0
- package/lib/core/tp.servey.quota/tp.survey.quota.d.ts +12 -0
- package/lib/core/tp.survey.answer/tp.survey.answer.d.ts +17 -0
- package/lib/core/tp.survey.core/tp.survey.core.service.d.ts +29 -0
- package/lib/core/tp.survey.interview/tp.survey.interview.service.d.ts +14 -0
- package/lib/core/tp.survey.logic/tp.survey.logic.service.d.ts +12 -0
- package/lib/directive/alternatives.container/alternatives.container.directive.d.ts +17 -0
- package/lib/directive/focus.and.select/focus.and.select.directive.d.ts +9 -0
- package/lib/directive/survey.theme/survey.theme.directive.d.ts +13 -0
- package/lib/directive/update.font.size/update.font.size.directive.d.ts +10 -0
- package/lib/icons/default.icons/default.icons.d.ts +5 -0
- package/lib/icons/default.icons/default.icons.module.d.ts +12 -0
- package/lib/pipe/get.active.language/get.active.language.pipe.d.ts +8 -0
- package/lib/pipe/get.additional.value.by.value/get.additional.value.by.value.pipe.d.ts +8 -0
- package/lib/pipe/key.values/key.values.pipe.d.ts +14 -0
- package/lib/pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe.d.ts +11 -0
- package/lib/tp.survey.config.d.ts +11 -0
- package/lib/tp.survey.const.d.ts +4 -0
- package/lib/tp.survey.enum.d.ts +51 -0
- package/lib/tp.survey.interface.d.ts +320 -0
- package/lib/tp.survey.method.d.ts +1 -0
- package/lib/tp.survey.module.d.ts +10 -0
- package/lib/tp.survey.type.d.ts +13 -0
- package/package.json +25 -0
- package/public-api.d.ts +9 -0
- package/styles/platform/component/survey.checkbox.scss +102 -0
- package/styles/platform/component/survey.radio.button.scss +34 -0
- package/styles/platform/survey.mixins.desktop.scss +146 -0
- package/styles/platform/survey.mixins.tablet.scss +132 -0
- package/styles/survey.mixins.scss +76 -0
- package/styles/survey.themes.scss +56 -0
- package/styles/theme/azure.blue.scss +54 -0
- package/styles/theme/cyan.orange.scss +54 -0
- package/styles/theme/rose.red.scss +54 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { executeLogicExpression } from '../../tp.survey.method';
|
|
2
|
+
export class SurveyQuotas {
|
|
3
|
+
#completedQuota = { name: null, guid: null, guid2d: null };
|
|
4
|
+
#quotas = [];
|
|
5
|
+
#quotas2d = [];
|
|
6
|
+
#quotaLimitDestinationQuestionGuid = -1;
|
|
7
|
+
#quotaLimitDestinationQuestionNum = -1;
|
|
8
|
+
setQuotas(quotas1d = [], quotas2d = [], quotaLimitDestinationQuestionGuid = -1, destinationQuestionNum = -1) {
|
|
9
|
+
this.#quotas = quotas1d;
|
|
10
|
+
this.#quotas2d = quotas2d;
|
|
11
|
+
this.#quotaLimitDestinationQuestionGuid = quotaLimitDestinationQuestionGuid;
|
|
12
|
+
this.#quotaLimitDestinationQuestionNum = destinationQuestionNum;
|
|
13
|
+
}
|
|
14
|
+
guidIsDestinationQuestion(guid) {
|
|
15
|
+
return this.#quotaLimitDestinationQuestionGuid === guid;
|
|
16
|
+
}
|
|
17
|
+
get quotaIsCompleted() {
|
|
18
|
+
return this.#completedQuota && (!!this.#completedQuota.guid || !!this.#completedQuota.guid2d);
|
|
19
|
+
}
|
|
20
|
+
get destinationQuestionGuid() {
|
|
21
|
+
return this.#quotaLimitDestinationQuestionGuid;
|
|
22
|
+
}
|
|
23
|
+
get quotaCount() {
|
|
24
|
+
const quotas = this.#quotas && Array.isArray(this.#quotas) ? this.#quotas.length : 0;
|
|
25
|
+
const quotas2d = this.#quotas2d && Array.isArray(this.#quotas2d) ? this.#quotas2d.length : 0;
|
|
26
|
+
return quotas + quotas2d;
|
|
27
|
+
}
|
|
28
|
+
findFilledQuotas(currentQuestionNum, vars, interviewAnswers) {
|
|
29
|
+
/*
|
|
30
|
+
* Поиск заполненной квоты это очень дорогой процесс. Его нужно оптимизировать по максимуму.
|
|
31
|
+
* Перед поиском нужно выполнить ряд проверок.
|
|
32
|
+
* Проверка currentQuestionNum <= this.#quotaLimitDestinationQuestionNum Нужна для оптимизации.
|
|
33
|
+
* DestinationQuestion Желательно располагать после последнего квотного вопроса, потому что нет смысла постоянно проверять квоты, если вопросы которые используются для расчёта квоты меняться не будут.
|
|
34
|
+
* например Квота Q1 + Q2 <= 25. DestinationQuestion нужно делать номером 3 или 4. Потому что как бы респондент не отвечал на последующие вопросы, результат квот не измениться и каждый раз их пересчитывать смысла нет.
|
|
35
|
+
*/
|
|
36
|
+
if ((this.destinationQuestionGuid > 0) && //Глобально в настройках анкеты должен быть указан вопрос который должен отобразиться при достижении квоты, если его нет, то и искать квоты смысла нет.
|
|
37
|
+
(this.quotaCount > 0) && //проверим если у нас вообще квоты
|
|
38
|
+
(currentQuestionNum <= this.#quotaLimitDestinationQuestionNum) && // номер текущий вопроса меньше номера вопроса для перехода по достижении квот
|
|
39
|
+
(!this.quotaIsCompleted) //и на финал проверим если ли уже заполненная квота, повторно не запускаем
|
|
40
|
+
) {
|
|
41
|
+
new Promise((resolve, reject) => {
|
|
42
|
+
if (Array.isArray(this.#quotas)) {
|
|
43
|
+
const completedQuota = this.#quotas.find(quota => executeLogicExpression(quota.expression, vars));
|
|
44
|
+
if (!!completedQuota) {
|
|
45
|
+
return resolve({ name: completedQuota.name, guid: completedQuota.quota_guid });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (Array.isArray(this.#quotas2d)) {
|
|
49
|
+
const answers = this.#quotas2d.length > 0 ? interviewAnswers.map(a => ({ av: a.AnswerValue, qg: a.QuestionGUID })) : [];
|
|
50
|
+
const filledQuota2dArray = this.#quotas2d.filter(quotaValues => quotaValues.qs.every(qvq => !!answers.find(intAnswer => intAnswer.qg === qvq.guid && intAnswer.av === qvq.value)));
|
|
51
|
+
//если не нашли заполненных квот выходим
|
|
52
|
+
if (filledQuota2dArray.length <= 0) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
//ищем квоту которая заполнена и у нее есть условие и оно выполняется.
|
|
56
|
+
const quota2dWithExpression = filledQuota2dArray.find((q) => !!q.exp && executeLogicExpression(q.exp, vars));
|
|
57
|
+
//если квота есть сообщим
|
|
58
|
+
if (!!quota2dWithExpression) {
|
|
59
|
+
return resolve({ name: null, guid2d: quota2dWithExpression.qvg });
|
|
60
|
+
}
|
|
61
|
+
//если квоты с Expression нет, ищем квоту которая заполнена и у нее нет условия
|
|
62
|
+
const quota2dWithoutExpression = filledQuota2dArray.find((q) => !q.exp || (typeof q.exp === 'string' && q.exp.trim().length === 0));
|
|
63
|
+
if (!!quota2dWithoutExpression) {
|
|
64
|
+
return resolve({ name: null, guid2d: quota2dWithoutExpression.qvg });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
reject(null);
|
|
68
|
+
}).then(quota => {
|
|
69
|
+
if (!!quota) {
|
|
70
|
+
this.#completedQuota = {
|
|
71
|
+
name: quota.name,
|
|
72
|
+
guid: 'guid' in quota ? quota.guid : null,
|
|
73
|
+
guid2d: 'guid2d' in quota ? quota.guid2d : null,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}).catch(err => {
|
|
77
|
+
console.error(err);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAuc3VydmV5LnF1b3RhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHAuc3VydmV5L3NyYy9saWIvY29yZS90cC5zZXJ2ZXkucXVvdGEvdHAuc3VydmV5LnF1b3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBVzlELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLGVBQWUsR0FBb0UsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDO0lBQzFILE9BQU8sR0FBK0IsRUFBRSxDQUFDO0lBQ3pDLFNBQVMsR0FBdUMsRUFBRSxDQUFDO0lBQ25ELGtDQUFrQyxHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2hELGlDQUFpQyxHQUFXLENBQUMsQ0FBQyxDQUFDO0lBRS9DLFNBQVMsQ0FBQyxXQUF1QyxFQUFFLEVBQUUsV0FBK0MsRUFBRSxFQUFFLG9DQUE0QyxDQUFDLENBQUMsRUFBRSx5QkFBaUMsQ0FBQyxDQUFDO1FBQ3pMLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxpQ0FBaUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsaUNBQWlDLEdBQUcsc0JBQXNCLENBQUM7SUFDbEUsQ0FBQztJQUVELHlCQUF5QixDQUFDLElBQVk7UUFDcEMsT0FBTyxJQUFJLENBQUMsa0NBQWtDLEtBQUssSUFBSSxDQUFDO0lBQzFELENBQUM7SUFHRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMs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MUMsTUFBTSxFQUFFLFFBQVEsSUFBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUk7cUJBQ2pELENBQUE7Z0JBQ0gsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SWRiUXVlc3Rpb25hcnlRdW90YSwgSWRiUXVlc3Rpb25hcnlRdW90YTJkT2JqZWN0fSBmcm9tICcuLi8uLi90cC5zdXJ2ZXkuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJy4uL3RwLnN1cnZleS5hbnN3ZXIvdHAuc3VydmV5LmFuc3dlcic7XHJcbmltcG9ydCB7ZXhlY3V0ZUxvZ2ljRXhwcmVzc2lvbn0gZnJvbSAnLi4vLi4vdHAuc3VydmV5Lm1ldGhvZCc7XHJcbmltcG9ydCB7TG9naWNPYmplY3R9IGZyb20gJy4uLy4uL3RwLnN1cnZleS50eXBlJztcclxuXHJcbnR5cGUgUXVvdGFDYWxjdWxhdGlvblJlc3VsdCA9IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZ3VpZDogbnVtYmVyO1xyXG59IHwge1xyXG4gIG5hbWU6IG51bGw7XHJcbiAgZ3VpZDJkOiBudW1iZXI7XHJcbn0gfCBudWxsO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleVF1b3RhcyB7XHJcbiAgI2NvbXBsZXRlZFF1b3RhOiB7bmFtZTogc3RyaW5nIHwgbnVsbDsgZ3VpZDogbnVtYmVyfCBudWxsOyBndWlkMmQ6IG51bWJlcnwgbnVsbH0gPSB7bmFtZTogbnVsbCwgZ3VpZDogbnVsbCwgZ3VpZDJkOiBudWxsfTtcclxuICAjcXVvdGFzOiBBcnJheTxJZGJRdWVzdGlvbmFyeVF1b3RhPiA9IFtdO1xyXG4gICNxdW90YXMyZDogQXJyYXk8SWRiUXVlc3Rpb25hcnlRdW90YTJkT2JqZWN0PiA9IFtdO1xyXG4gICNxdW90YUxpbWl0RGVzdGluYXRpb25RdWVzdGlvbkd1aWQ6IG51bWJlciA9IC0xO1xyXG4gICNxdW90YUxpbWl0RGVzdGluYXRpb25RdWVzdGlvbk51bTogbnVtYmVyID0gLTE7XHJcblxyXG4gIHNldFF1b3RhcyhxdW90YXMxZDogQXJyYXk8SWRiUXVlc3Rpb25hcnlRdW90YT4gPSBbXSwgcXVvdGFzMmQ6IEFycmF5PElkYlF1ZXN0aW9uYXJ5UXVvdGEyZE9iamVjdD4gPSBbXSwgcXVvdGFMaW1pdERlc3RpbmF0aW9uUXVlc3Rpb25HdWlkOiBudW1iZXIgPSAtMSwgZGVzdGluYXRpb25RdWVzdGlvbk51bTogbnVtYmVyID0gLTEpe1xyXG4gICAgdGhpcy4jcXVvdGFzID0gcXVvdGFzMWQ7XHJcbiAgICB0aGlzLiNxdW90YXMyZCA9IHF1b3RhczJkO1xyXG4gICAgdGhpcy4jcXVvdGFMaW1pdERlc3RpbmF0aW9uUXVlc3Rpb25HdWlkID0gcXVvdGFMaW1pdERlc3RpbmF0aW9uUXVlc3Rpb25HdWlkO1xyXG4gICAgdGhpcy4jcXVvdGFMaW1pdERlc3RpbmF0aW9uUXVlc3Rpb25OdW0gPSBkZXN0aW5hdGlvblF1ZXN0aW9uTnVtO1xyXG4gIH1cclxuXHJcbiAgZ3VpZElzRGVzdGluYXRpb25RdWVzdGlvbihndWlkOiBudW1iZXIpOiBib29sZWFue1xyXG4gICAgcmV0dXJuIHRoaXMuI3F1b3RhTGltaXREZXN0aW5hdGlvblF1ZXN0aW9uR3VpZCA9PT0gZ3VpZDtcclxuICB9XHJcblxyXG5cclxuICBnZXQgcXVvdGFJc0NvbXBsZXRlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLiNjb21wbGV0ZWRRdW90YSAmJiAoISF0aGlzLiNjb21wbGV0ZWRRdW90YS5ndWlkIHx8ICEhdGhpcy4jY29tcGxldGVkUXVvdGEuZ3VpZDJkKSAgO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRlc3RpbmF0aW9uUXVlc3Rpb25HdWlkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy4jcXVvdGFMaW1pdERlc3RpbmF0aW9uUXVlc3Rpb25HdWlkXHJcbiAgfVxyXG5cclxuICBnZXQgcXVvdGFDb3VudCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgcXVvdGFzICAgPSB0aGlzLiNxdW90YXMgJiYgIEFycmF5LmlzQXJyYXkodGhpcy4jcXVvdGFzKSA/IHRoaXMuI3F1b3Rhcy5sZW5ndGggOiAwO1xyXG4gICAgY29uc3QgcXVvdGFzMmQgPSB0aGlzLiNxdW90YXMyZCAmJiAgQXJyYXkuaXNBcnJheSh0aGlzLiNxdW90YXMyZCkgPyB0aGlzLiNxdW90YXMyZC5sZW5ndGggOiAwO1xyXG4gICAgcmV0dXJuIHF1b3RhcyArIHF1b3RhczJkO1xyXG4gIH1cclxuXHJcbiAgZmluZEZpbGxlZFF1b3RhcyhjdXJyZW50UXVlc3Rpb25OdW06IG51bWJlciwgdmFyczogTG9naWNPYmplY3QsIGludGVydmlld0Fuc3dlcnM6IEFycmF5PEFuc3dlcj4pOiB2b2lkIHtcclxuICAgIC8qXHJcbiAgICAqINCf0L7QuNGB0Log0LfQsNC/0L7Qu9C90LXQvdC90L7QuSDQutCy0L7RgtGLINGN0YLQviDQvtGH0LXQvdGMINC00L7RgNC+0LPQvtC5INC/0YDQvtGG0LXRgdGBLiDQldCz0L4g0L3Rg9C20L3QviDQvtC/0YLQuNC80LjQt9C40YDQvtCy0LDRgtGMINC/0L4g0LzQsNC60YHQuNC80YPQvNGDLlxyXG4gICAgKiDQn9C10YDQtdC0INC/0L7QuNGB0LrQvtC8INC90YPQttC90L4g0LLRi9C/0L7Qu9C90LjRgtGMINGA0Y/QtCDQv9GA0L7QstC10YDQvtC6LlxyXG4gICAgKiDQn9GA0L7QstC10YDQutCwIGN1cnJlbnRRdWVzdGlvbk51bSA8PSB0aGlzLiNxdW90YUxpbWl0RGVzdGluYXRpb25RdWVzdGlvbk51bSDQndGD0LbQvdCwINC00LvRjyDQvtC/0YLQuNC80LjQt9Cw0YbQuNC4LlxyXG4gICAgKiBEZXN0aW5hdGlvblF1ZXN0aW9uINCW0LXQu9Cw0YLQtdC70YzQvdC+INGA0LDRgdC/0L7Qu9Cw0LPQsNGC0Ywg0L/QvtGB0LvQtSDQv9C+0YHQu9C10LTQvdC10LPQviDQutCy0L7RgtC90L7Qs9C+INCy0L7Qv9GA0L7RgdCwLCDQv9C+0YLQvtC80YMg0YfRgtC+INC90LXRgiDRgdC80YvRgdC70LAg0L/QvtGB0YLQvtGP0L3QvdC+INC/0YDQvtCy0LXRgNGP0YLRjCDQutCy0L7RgtGLLCDQtdGB0LvQuCDQstC+0L/RgNC+0YHRiyDQutC+0YLQvtGA0YvQtSDQuNGB0L/QvtC70YzQt9GD0Y7RgtGB0Y8g0LTQu9GPINGA0LDRgdGH0ZHRgtCwINC60LLQvtGC0Ysg0LzQtdC90Y/RgtGM0YHRjyDQvdC1INCx0YPQtNGD0YIuXHJcbiAgICAqINC90LDQv9GA0LjQvNC10YAg0JrQstC+0YLQsCBRMSArIFEyIDw9IDI1LiBEZXN0aW5hdGlvblF1ZXN0aW9uINC90YPQttC90L4g0LTQtdC70LDRgtGMINC90L7QvNC10YDQvtC8IDMg0LjQu9C4IDQuINCf0L7RgtC+0LzRgyDRh9GC0L4g0LrQsNC6INCx0Ysg0YDQtdGB0L/QvtC90LTQtdC90YIg0L3QtSDQvtGC0LLQtdGH0LDQuyDQvdCwINC/0L7RgdC70LXQtNGD0Y7RidC40LUg0LLQvtC/0YDQvtGB0YssINGA0LXQt9GD0LvRjNGC0LDRgiDQutCy0L7RgiDQvdC1INC40LfQvNC10L3QuNGC0YzRgdGPINC4INC60LDQttC00YvQuSDRgNCw0Lcg0LjRhSDQv9C10YDQtdGB0YfQuNGC0YvQstCw0YLRjCDRgdC80YvRgdC70LAg0L3QtdGCLlxyXG4gICAgKi9cclxuICAgIGlmIChcclxuICAgICAodGhpcy5kZXN0aW5hdGlvblF1ZXN0aW9uR3VpZCA+IDApICYmIC8v0JPQu9C+0LHQsNC70YzQvdC+INCyINC90LDRgdGC0YDQvtC50LrQsNGFINCw0L3QutC10YLRiyDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0YPQutCw0LfQsNC9INCy0L7Qv9GA0L7RgSDQutC+0YLQvtGA0YvQuSDQtNC+0LvQttC10L0g0L7RgtC+0LHRgNCw0LfQuNGC0YzRgdGPINC/0YDQuCDQtNC+0YHRgtC40LbQtdC90LjQuCDQutCy0L7RgtGLLCDQtdGB0LvQuCDQtdCz0L4g0L3QtdGCLCDRgtC+INC4INC40YHQutCw0YLRjCDQutCy0L7RgtGLINGB0LzRi9GB0LvQsCDQvdC10YIuXHJcbiAgICAgKHRoaXMucXVvdGFDb3VudCA+IDApICYmIC8v0L/RgNC+0LLQtdGA0LjQvCDQtdGB0LvQuCDRgyDQvdCw0YEg0LLQvtC+0LHRidC1INC60LLQvtGC0YtcclxuICAgICAoY3VycmVudFF1ZXN0aW9uTnVtIDw9IHRoaXMuI3F1b3RhTGltaXREZXN0aW5hdGlvblF1ZXN0aW9uTnVtKSAmJiAvLyDQvdC+0LzQtdGAINGC0LXQutGD0YnQuNC5INCy0L7Qv9GA0L7RgdCwINC80LXQvdGM0YjQtSDQvdC+0LzQtdGA0LAg0LLQvtC/0YDQvtGB0LAg0LTQu9GPINC/0LXRgNC10YXQvtC00LAg0L/QviDQtNC+0YHRgtC40LbQtdC90LjQuCDQutCy0L7RglxyXG4gICAgICghdGhpcy5xdW90YUlzQ29tcGxldGVkKSAvL9C4INC90LAg0YTQuNC90LDQuyDQv9GA0L7QstC10YDQuNC8INC10YHQu9C4INC70Lgg0YPQttC1INC30LDQv9C+0LvQvdC10L3QvdCw0Y8g0LrQstC+0YLQsCwg0L/QvtCy0YLQvtGA0L3QviDQvdC1INC30LDQv9GD0YHQutCw0LXQvFxyXG4gICAgKSB7XHJcblxyXG4gICAgICBuZXcgUHJvbWlzZTxRdW90YUNhbGN1bGF0aW9uUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy4jcXVvdGFzKSkge1xyXG4gICAgICAgICAgY29uc3QgY29tcGxldGVkUXVvdGEgPSB0aGlzLiNxdW90YXMuZmluZChxdW90YSA9PiBleGVjdXRlTG9naWNFeHByZXNzaW9uKHF1b3RhLmV4cHJlc3Npb24sIHZhcnMpKTtcclxuICAgICAgICAgIGlmICghIWNvbXBsZXRlZFF1b3RhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHtuYW1lOiBjb21wbGV0ZWRRdW90YS5uYW1lLCBndWlkOiBjb21wbGV0ZWRRdW90YS5xdW90YV9ndWlkfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLiNxdW90YXMyZCkpIHtcclxuICAgICAgICAgIGNvbnN0IGFuc3dlcnMgPSB0aGlzLiNxdW90YXMyZC5sZW5ndGggPiAwID8gaW50ZXJ2aWV3QW5zd2Vycy5tYXAoYSA9PiAoe2F2OiBhLkFuc3dlclZhbHVlLCBxZzogYS5RdWVzdGlvbkdVSUR9KSApIDogW107XHJcblxyXG4gICAgICAgICAgY29uc3QgZmlsbGVkUXVvdGEyZEFycmF5ID0gdGhpcy4jcXVvdGFzMmQuZmlsdGVyKHF1b3RhVmFsdWVzID0+IHF1b3RhVmFsdWVzLnFzLmV2ZXJ5KHF2cSA9PiAhIWFuc3dlcnMuZmluZChpbnRBbnN3ZXIgPT4gaW50QW5zd2VyLnFnID09PSBxdnEuZ3VpZCAmJiBpbnRBbnN3ZXIuYXYgPT09IHF2cS52YWx1ZSkpKTtcclxuXHJcbiAgICAgICAgICAvL9C10YHQu9C4INC90LUg0L3QsNGI0LvQuCDQt9Cw0L/QvtC70L3QtdC90L3Ri9GFINC60LLQvtGCINCy0YvRhdC+0LTQuNC8XHJcbiAgICAgICAgICBpZiAoZmlsbGVkUXVvdGEyZEFycmF5Lmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL9C40YnQtdC8INC60LLQvtGC0YMg0LrQvtGC0L7RgNCw0Y8g0LfQsNC/0L7Qu9C90LXQvdCwINC4INGDINC90LXQtSDQtdGB0YLRjCDRg9GB0LvQvtCy0LjQtSDQuCDQvtC90L4g0LLRi9C/0L7Qu9C90Y/QtdGC0YHRjy5cclxuICAgICAgICAgIGNvbnN0IHF1b3RhMmRXaXRoRXhwcmVzc2lvbiA9IGZpbGxlZFF1b3RhMmRBcnJheS5maW5kKChxOiBJZGJRdWVzdGlvbmFyeVF1b3RhMmRPYmplY3QpID0+ICEhcS5leHAgJiYgZXhlY3V0ZUxvZ2ljRXhwcmVzc2lvbihxLmV4cCwgdmFycykpO1xyXG5cclxuICAgICAgICAgIC8v0LXRgdC70Lgg0LrQstC+0YLQsCDQtdGB0YLRjCDRgdC+0L7QsdGJ0LjQvFxyXG4gICAgICAgICAgaWYgKCEhcXVvdGEyZFdpdGhFeHByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHtuYW1lOiBudWxsLCBndWlkMmQ6IHF1b3RhMmRXaXRoRXhwcmVzc2lvbi5xdmd9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL9C10YHQu9C4INC60LLQvtGC0Ysg0YEgRXhwcmVzc2lvbiDQvdC10YIsINC40YnQtdC8INC60LLQvtGC0YMg0LrQvtGC0L7RgNCw0Y8g0LfQsNC/0L7Qu9C90LXQvdCwINC4INGDINC90LXQtSDQvdC10YIg0YPRgdC70L7QstC40Y9cclxuICAgICAgICAgIGNvbnN0IHF1b3RhMmRXaXRob3V0RXhwcmVzc2lvbiA9IGZpbGxlZFF1b3RhMmRBcnJheS5maW5kKChxOiBJZGJRdWVzdGlvbmFyeVF1b3RhMmRPYmplY3QpID0+ICFxLmV4cCAgfHwgKHR5cGVvZiBxLmV4cCAgPT09ICdzdHJpbmcnICYmIHEuZXhwLnRyaW0oKS5sZW5ndGggPT09IDApKTtcclxuICAgICAgICAgIGlmICghIXF1b3RhMmRXaXRob3V0RXhwcmVzc2lvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7bmFtZTogbnVsbCwgZ3VpZDJkOiBxdW90YTJkV2l0aG91dEV4cHJlc3Npb24ucXZnfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlamVjdChudWxsKVxyXG4gICAgICB9KS50aGVuKHF1b3RhID0+IHtcclxuICAgICAgICBpZiAoISFxdW90YSkge1xyXG4gICAgICAgICAgdGhpcy4jY29tcGxldGVkUXVvdGEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHF1b3RhLm5hbWUsXHJcbiAgICAgICAgICAgIGd1aWQ6ICdndWlkJyBpbiAgcXVvdGEgPyBxdW90YS5ndWlkIDogbnVsbCxcclxuICAgICAgICAgICAgZ3VpZDJkOiAnZ3VpZDJkJyBpbiAgcXVvdGEgPyBxdW90YS5ndWlkMmQgOiBudWxsLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { MISSING_VALUE } from '../../tp.survey.const';
|
|
2
|
+
export class Answer {
|
|
3
|
+
constructor(guid, version = -1) {
|
|
4
|
+
this.AnswerAdditional = {};
|
|
5
|
+
this.ViewedAlternativeValues = [];
|
|
6
|
+
this.ViewedSectionGuids = [];
|
|
7
|
+
this.AlternativeSequenceClicks = [];
|
|
8
|
+
this.StartedAt = 0;
|
|
9
|
+
this.FinishedAt = 0;
|
|
10
|
+
this.AnswerValue = MISSING_VALUE;
|
|
11
|
+
this.answerIsComplete = false;
|
|
12
|
+
this.QuestionGUID = guid;
|
|
13
|
+
this.QuestionVersion = version;
|
|
14
|
+
}
|
|
15
|
+
clear() {
|
|
16
|
+
this.StartedAt = 0;
|
|
17
|
+
this.FinishedAt = 0;
|
|
18
|
+
this.AnswerValue = MISSING_VALUE;
|
|
19
|
+
this.ViewedAlternativeValues.length = 0;
|
|
20
|
+
this.ViewedSectionGuids.length = 0;
|
|
21
|
+
this.AlternativeSequenceClicks.length = 0;
|
|
22
|
+
for (const key of Object.keys(this.AnswerAdditional)) {
|
|
23
|
+
this.AnswerAdditional[Number(key)] = null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
addAnswer(answerValue, answerAdditional, asComplete) {
|
|
27
|
+
this.AnswerValue = answerValue;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAuc3VydmV5LmFuc3dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RwLnN1cnZleS9zcmMvbGliL2NvcmUvdHAuc3VydmV5LmFuc3dlci90cC5zdXJ2ZXkuYW5zd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sTUFBTTtJQVdqQixZQUFZLElBQVksRUFBRSxVQUFrQixDQUFDLENBQUM7UUFSckMscUJBQWdCLEdBQXFDLEVBQUUsQ0FBQztRQUN4RCw0QkFBdUIsR0FBa0IsRUFBRSxDQUFDO1FBQzVDLHVCQUFrQixHQUFrQixFQUFFLENBQUM7UUFDdkMsOEJBQXlCLEdBQTRCLEVBQUUsQ0FBQztRQUNqRSxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGdCQUFXLEdBQVEsYUFBYSxDQUFDO1FBQ2pDLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUVoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztJQUNqQyxDQUFDO0lBQ0QsS0FBSztRQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDO1FBQ2pDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ3JELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsV0FBb0IsRUFBRSxnQkFBNkIsRUFBRSxVQUFtQjtRQUNoRixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0lRdWVzdGlvbkFuc3dlcn0gZnJvbSAnLi4vLi4vdHAuc3VydmV5LmludGVyZmFjZSc7XHJcbmltcG9ydCB7QWRkaXRpb25hbEFuc3dlciwgTG9naWNPYmplY3R9IGZyb20gJy4uLy4uL3RwLnN1cnZleS50eXBlJztcclxuaW1wb3J0IHtNSVNTSU5HX1ZBTFVFfSBmcm9tICcuLi8uLi90cC5zdXJ2ZXkuY29uc3QnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFuc3dlciBpbXBsZW1lbnRzIElRdWVzdGlvbkFuc3dlciB7XHJcbiAgcmVhZG9ubHkgUXVlc3Rpb25HVUlEOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgUXVlc3Rpb25WZXJzaW9uOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgQW5zd2VyQWRkaXRpb25hbDogUmVjb3JkPG51bWJlciwgQWRkaXRpb25hbEFuc3dlcj4gPSB7fTtcclxuICByZWFkb25seSBWaWV3ZWRBbHRlcm5hdGl2ZVZhbHVlczogQXJyYXk8bnVtYmVyPiA9IFtdO1xyXG4gIHJlYWRvbmx5IFZpZXdlZFNlY3Rpb25HdWlkczogQXJyYXk8bnVtYmVyPiA9IFtdO1xyXG4gIHJlYWRvbmx5IEFsdGVybmF0aXZlU2VxdWVuY2VDbGlja3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gW107XHJcbiAgU3RhcnRlZEF0ID0gMDtcclxuICBGaW5pc2hlZEF0ID0gMDtcclxuICBBbnN3ZXJWYWx1ZTogYW55ID0gTUlTU0lOR19WQUxVRTtcclxuICBhbnN3ZXJJc0NvbXBsZXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IoZ3VpZDogbnVtYmVyLCB2ZXJzaW9uOiBudW1iZXIgPSAtMSkge1xyXG4gICAgdGhpcy5RdWVzdGlvbkdVSUQgPSBndWlkO1xyXG4gICAgdGhpcy5RdWVzdGlvblZlcnNpb24gPSB2ZXJzaW9uO1xyXG4gIH1cclxuICBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuU3RhcnRlZEF0ID0gMDtcclxuICAgIHRoaXMuRmluaXNoZWRBdCA9IDA7XHJcbiAgICB0aGlzLkFuc3dlclZhbHVlID0gTUlTU0lOR19WQUxVRTtcclxuICAgIHRoaXMuVmlld2VkQWx0ZXJuYXRpdmVWYWx1ZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuVmlld2VkU2VjdGlvbkd1aWRzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLkFsdGVybmF0aXZlU2VxdWVuY2VDbGlja3MubGVuZ3RoID0gMDtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuQW5zd2VyQWRkaXRpb25hbCkpIHtcclxuICAgICAgdGhpcy5BbnN3ZXJBZGRpdGlvbmFsW051bWJlcihrZXkpXSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGFkZEFuc3dlcihhbnN3ZXJWYWx1ZTogdW5rbm93biwgYW5zd2VyQWRkaXRpb25hbDogTG9naWNPYmplY3QsIGFzQ29tcGxldGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuQW5zd2VyVmFsdWUgPSBhbnN3ZXJWYWx1ZTtcclxuICB9XHJcbiAgXHJcbn1cclxuIl19
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import { DestroyRef, inject, Inject, Injectable, PLATFORM_ID } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, filter, Subject } from 'rxjs';
|
|
3
|
+
import { SurveyQuotas } from '../tp.servey.quota/tp.survey.quota';
|
|
4
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
5
|
+
import { map } from 'rxjs/operators';
|
|
6
|
+
import { QuestionsType, ResultativeStatus, SurveyEvents, ValidStatus } from '../../tp.survey.enum';
|
|
7
|
+
import { MISSING_VALUE } from '../../tp.survey.const';
|
|
8
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "../tp.survey.logic/tp.survey.logic.service";
|
|
11
|
+
import * as i2 from "../tp.survey.interview/tp.survey.interview.service";
|
|
12
|
+
export class TpSurveyCoreService {
|
|
13
|
+
#currentQuestion;
|
|
14
|
+
#surveyQuotas;
|
|
15
|
+
#questionary;
|
|
16
|
+
#displayedQuestions; // нужно для навигации по кнопке back
|
|
17
|
+
#destroyRef;
|
|
18
|
+
constructor(platformId, _logic, _interview) {
|
|
19
|
+
this.platformId = platformId;
|
|
20
|
+
this._logic = _logic;
|
|
21
|
+
this._interview = _interview;
|
|
22
|
+
this._eventBus = new Subject();
|
|
23
|
+
this.#currentQuestion = new BehaviorSubject(null);
|
|
24
|
+
this.#surveyQuotas = new SurveyQuotas();
|
|
25
|
+
this.#displayedQuestions = []; // нужно для навигации по кнопке back
|
|
26
|
+
this.#destroyRef = inject(DestroyRef);
|
|
27
|
+
// запускам проверку квот, после скрытия каждого(почти) вопроса (seQuestionHide)
|
|
28
|
+
this._eventBus.asObservable().pipe(filter(ev => ev.key === SurveyEvents.seQuestionHide), takeUntilDestroyed(this.#destroyRef)).subscribe({
|
|
29
|
+
next: () => this.#surveyQuotas.findFilledQuotas(this.#currentQuestion.value?.QuestionNum ?? -1, Object.assign({}, this._logic.getLogicVars()), this._interview.getAnswerList())
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
setupSurvey(questionaryRawData, logicVars, answerList, questionGuid) {
|
|
33
|
+
//если анкеты нет, делать нечего.
|
|
34
|
+
if (!questionaryRawData) {
|
|
35
|
+
this.#currentQuestion.next(null);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
this.#questionary = questionaryRawData;
|
|
39
|
+
if (isPlatformBrowser(this.platformId)) {
|
|
40
|
+
//узнаем есть ли вопрос который указали для перехода при заполнении квоты
|
|
41
|
+
const destinationQuestion = this.#findQuestionByGuid(questionaryRawData.BaseParams.QuotaLimitDestinationQuestionGuid);
|
|
42
|
+
//инициализируем квоты
|
|
43
|
+
this.#surveyQuotas.setQuotas(questionaryRawData.Quotas, questionaryRawData.Quotas2d, destinationQuestion?.QuestionGuid ?? -1, destinationQuestion?.QuestionNum ?? -1);
|
|
44
|
+
}
|
|
45
|
+
//создадим ответы и логические переменные
|
|
46
|
+
this.#initiateQuestions(this.#questionary.Questions);
|
|
47
|
+
// Может быть 2 варианта запуска интервью, 1-новое интервью, 2-перезапуск старого интервью. В первом случае начало это lang или первый вопрос. Во втором, с последнего вопроса на который ответили.
|
|
48
|
+
let startQuestionNum = undefined;
|
|
49
|
+
//если загружаем ранее не законченное интервью, продолжаем с места последнего вопроса (случай номер 2)
|
|
50
|
+
if (!!logicVars && !!answerList && !!questionGuid) {
|
|
51
|
+
//загружаем старые логические переменные и ответы
|
|
52
|
+
this.#fillOldInterviewData(logicVars, answerList);
|
|
53
|
+
//ищем номер вопроса, который был последний перед сохранением.
|
|
54
|
+
const questionLastSave = this.#findQuestionByGuid(questionGuid);
|
|
55
|
+
//Вопрос могли удалить. Тогда начнем сначала.
|
|
56
|
+
if (!!questionLastSave) {
|
|
57
|
+
startQuestionNum = questionLastSave.QuestionNum;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (startQuestionNum === undefined) {
|
|
61
|
+
//Это новое интервью, без ранее сохранённых данных(случай 1). Запускаем опрос, первый экран это Lang вопрос, но если выбора языка нет, пропускаем и переходим на 1-й вопрос
|
|
62
|
+
startQuestionNum = this.#activeLangCount > 1 ? 0 : this.#nextQuestionNum();
|
|
63
|
+
}
|
|
64
|
+
//пошлём событие о начале опроса
|
|
65
|
+
this._eventBus.next({ key: SurveyEvents.seSurveyStart, data: { questionary: this.#questionary } });
|
|
66
|
+
//показываем вопрос
|
|
67
|
+
this.#changeCurrentQuestion(this.#questionary.Questions[startQuestionNum]);
|
|
68
|
+
}
|
|
69
|
+
on(...key) {
|
|
70
|
+
return this._eventBus.asObservable().pipe(filter(event => key.includes(event.key)), map(event => event.data));
|
|
71
|
+
}
|
|
72
|
+
goToNextQuestion() {
|
|
73
|
+
const currentQuestion = this.#currentQuestion.value;
|
|
74
|
+
if (!currentQuestion) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
//если ответ на текущий вопрос не закончен, выходим
|
|
78
|
+
if (!this._interview.questionIsComplete(currentQuestion.QuestionGuid)) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
//если указан PostScript, выполним его
|
|
82
|
+
if (!!currentQuestion.PostScript) {
|
|
83
|
+
this._logic.executePostScript(currentQuestion.PostScript);
|
|
84
|
+
}
|
|
85
|
+
this.#changeCurrentQuestion(this.#questionary.Questions[this.#nextQuestionNum()]);
|
|
86
|
+
}
|
|
87
|
+
goToBackQuestion() {
|
|
88
|
+
this.#displayedQuestions.pop(); // удалим информацию о том что показывали этот вопрос
|
|
89
|
+
const previousQuestionNum = this.#displayedQuestions.pop(); // узнаем номер вопроса на который нам надо перейти, и удалим информацию что-бы не дублировать
|
|
90
|
+
if (!!previousQuestionNum) {
|
|
91
|
+
const prevQuestion = this.#questionary?.Questions[previousQuestionNum];
|
|
92
|
+
if (!!prevQuestion) {
|
|
93
|
+
this.#changeCurrentQuestion(prevQuestion);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
questionIsComplete(guid) {
|
|
98
|
+
const answer = this._interview.findAnswerByGuid(guid);
|
|
99
|
+
return answer?.answerIsComplete ?? false;
|
|
100
|
+
}
|
|
101
|
+
#fillOldInterviewData(logicVars, answerList) {
|
|
102
|
+
//пропишем старые логические переменные
|
|
103
|
+
if (Array.isArray(logicVars)) {
|
|
104
|
+
logicVars.forEach(logicVarObj => {
|
|
105
|
+
this._logic.setLogicValue(logicVarObj.nm, logicVarObj.vl);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//пропишем старые ответы
|
|
109
|
+
this._interview.overrideAnswers(answerList);
|
|
110
|
+
//нужно вернуть время начала интервью, отдельно оно не сохраняется, поэтому возьмём минимальное время начала из ответов
|
|
111
|
+
//фильтруем все вопросы у которых оно указано(>0) и трансформируем в число.
|
|
112
|
+
const startedAtArray = answerList.filter(answer => answer.StartedAt > 0).map(answer => answer.StartedAt);
|
|
113
|
+
//берём минимальное
|
|
114
|
+
this._interview.startedAt = Math.min(...startedAtArray);
|
|
115
|
+
}
|
|
116
|
+
#changeCurrentQuestion(newQuestion) {
|
|
117
|
+
const currentQuestion = this.#currentQuestion.value;
|
|
118
|
+
const currentTime = new Date().getTime();
|
|
119
|
+
if (!!currentQuestion) {
|
|
120
|
+
/*
|
|
121
|
+
Сохраним время начала интервью. Фиксировать будем не с самого начала, а с ответа на первый вопрос.
|
|
122
|
+
Потому что практика такая, открыть анкету на планшете и ходить искать респондентов и из-за этого длительность интервью может быть нерелевантно.
|
|
123
|
+
* */
|
|
124
|
+
if (this._interview.startedAt === 0 && currentQuestion.QuestionNum >= 0) {
|
|
125
|
+
this._interview.startedAt = currentTime;
|
|
126
|
+
}
|
|
127
|
+
//нужно сохранить FinishedAt в ответах для старого вопроса
|
|
128
|
+
const answer = this._interview.findAnswerByGuid(currentQuestion.QuestionGuid);
|
|
129
|
+
if (!!answer) {
|
|
130
|
+
answer.FinishedAt = currentTime;
|
|
131
|
+
}
|
|
132
|
+
this._eventBus.next({ key: SurveyEvents.seQuestionHide, data: currentQuestion });
|
|
133
|
+
}
|
|
134
|
+
this.#displayedQuestions.push(newQuestion.QuestionNum);
|
|
135
|
+
this.#currentQuestion.next(newQuestion);
|
|
136
|
+
//нужно сохранить StartedAt в ответах для нового вопроса
|
|
137
|
+
const answerNew = this._interview.findAnswerByGuid(newQuestion.QuestionGuid);
|
|
138
|
+
if (!!answerNew) {
|
|
139
|
+
answerNew.StartedAt = currentTime;
|
|
140
|
+
}
|
|
141
|
+
this._eventBus.next({ key: SurveyEvents.seQuestionShow, data: newQuestion });
|
|
142
|
+
//если новый экран это end тогда завершаем интервью
|
|
143
|
+
if (newQuestion.QuestionType === 'END') {
|
|
144
|
+
this.#finishInterview();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
currentQuestion$() {
|
|
148
|
+
return this.#currentQuestion.asObservable();
|
|
149
|
+
}
|
|
150
|
+
findAnswerByGuid(guid) {
|
|
151
|
+
return this._interview.findAnswerByGuid(guid);
|
|
152
|
+
}
|
|
153
|
+
setLogicValue(varName, value) {
|
|
154
|
+
this._logic.setLogicValue(varName, value);
|
|
155
|
+
}
|
|
156
|
+
getLogicVars() {
|
|
157
|
+
return this._logic.getLogicVars();
|
|
158
|
+
}
|
|
159
|
+
getAnswerList() {
|
|
160
|
+
return this._interview.getAnswerList();
|
|
161
|
+
}
|
|
162
|
+
updateAnswer(eventData) {
|
|
163
|
+
const answer = this._interview.findAnswerByGuid(eventData.guid);
|
|
164
|
+
if (!answer) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
//вопросы которые в своем составе имеет секции, хранят ответы чуть по другому, точнее ответ на каждую секцию это отдельный объект в _interview.answerList
|
|
168
|
+
//поэтому ответ для таких типов вопросов это [key: string]: Array<number> | number, где key(guid секции) это ответ на секцию, если key нет, секция не была показана
|
|
169
|
+
if (this.#currentQuestion.value?.QuestionType === QuestionsType.eqSL) {
|
|
170
|
+
const sectionList = this.#currentQuestion.value?.Sectionlist;
|
|
171
|
+
//пройдёмся по каждой секции и если для неё есть ответ, запишем, в противном случае вместо ответа укажем -97(MISSING_VALUE)
|
|
172
|
+
if (!!sectionList) {
|
|
173
|
+
sectionList.forEach(section => {
|
|
174
|
+
const sectionInterviewAnswer = this._interview.findAnswerByGuid(section.SectionGuid);
|
|
175
|
+
if (!sectionInterviewAnswer) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const sectionQuestionAnswer = eventData.answer ? eventData.answer[section.SectionGuid.toString()] : undefined;
|
|
179
|
+
sectionInterviewAnswer.AnswerValue = sectionQuestionAnswer === undefined ? MISSING_VALUE : sectionQuestionAnswer;
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
//ответ самого исходного вопроса должен быть 1
|
|
183
|
+
answer.AnswerValue = 1;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
//ответ на вопрос у которого нет секций
|
|
187
|
+
answer.AnswerValue = eventData.answer;
|
|
188
|
+
}
|
|
189
|
+
//на вопрос ответили тогда когда есть все ответы и выполняется логика кнопки далее(если её указали)
|
|
190
|
+
answer.answerIsComplete = eventData.isComplete && this.#nextButtonExpressionIsTrue();
|
|
191
|
+
//ViewedAlternativeValues и ViewedSectionGuids. Т.к. они readonly сначала удалим, потом добавим
|
|
192
|
+
answer.ViewedAlternativeValues.length = 0;
|
|
193
|
+
eventData.viewedAlternativeValues.forEach(oa => answer.ViewedAlternativeValues.push(oa));
|
|
194
|
+
answer.ViewedSectionGuids.length = 0;
|
|
195
|
+
eventData.viewedSectionGuids.forEach(oa => answer.ViewedSectionGuids.push(oa));
|
|
196
|
+
answer.AlternativeSequenceClicks.length = 0;
|
|
197
|
+
eventData.alternativeSequenceClicks.forEach(oa => answer.AlternativeSequenceClicks.push(oa));
|
|
198
|
+
Object.entries(answer.AnswerAdditional).forEach(([key]) => delete answer.AnswerAdditional[Number(key)]);
|
|
199
|
+
Object.entries(eventData.additionalAnswers).forEach(([key, value]) => answer.AnswerAdditional[Number(key)] = value);
|
|
200
|
+
this.updateLogic(eventData.logicVars);
|
|
201
|
+
this._eventBus.next({ key: SurveyEvents.seQuestionAnswersChange, data: { question: this.#currentQuestion.value, answerIsComplete: answer.answerIsComplete } });
|
|
202
|
+
//может возникнуть ситуация, когда нет ни одной альтернативы или секции для отображения.в этом случае вопрос показывать не нужно, как ответ записываем 0 и переходим на следующий
|
|
203
|
+
const question = this.#findQuestionByGuid(eventData.guid);
|
|
204
|
+
//ситуация для ss/ms вопросов,
|
|
205
|
+
if (!!question && answer.answerIsComplete && (question.QuestionType === 'SS' || question.QuestionType === 'MS') && (eventData.viewedAlternativeValues.length === 0)) {
|
|
206
|
+
this.goToNextQuestion();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
updateLogic(logicVars) {
|
|
210
|
+
Object.entries(logicVars).forEach(([varName, value]) => {
|
|
211
|
+
this.setLogicValue(varName, value);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
//возвращает количество активных языков
|
|
215
|
+
get #activeLangCount() {
|
|
216
|
+
//если анкета по какой-то причине ну указана, вернём 0
|
|
217
|
+
return this.#questionary?.BaseParams.LanguageList.filter(langObj => langObj.isActive).length ?? 0;
|
|
218
|
+
}
|
|
219
|
+
//возвращает количество вопросов
|
|
220
|
+
get #questionsCount() {
|
|
221
|
+
return this.#questionary?.Questions.length ?? 0;
|
|
222
|
+
}
|
|
223
|
+
#finishInterview() {
|
|
224
|
+
const currentTime = new Date();
|
|
225
|
+
let resultDirty;
|
|
226
|
+
try {
|
|
227
|
+
resultDirty = this._logic.executeLogic(this.#questionary?.BaseParams.ResultativeScript ?? '');
|
|
228
|
+
}
|
|
229
|
+
catch (e) {
|
|
230
|
+
resultDirty = false;
|
|
231
|
+
}
|
|
232
|
+
const interview = {
|
|
233
|
+
Language: 0, //todo lang
|
|
234
|
+
SpotId: 0,
|
|
235
|
+
DeviceId: 0,
|
|
236
|
+
DeviceType: 0,
|
|
237
|
+
Resultative: ResultativeStatus.rsUnset,
|
|
238
|
+
Valid: ValidStatus.vsUnset,
|
|
239
|
+
Wave: this.#questionary?.Info.current_wave ?? 0,
|
|
240
|
+
QuestionaryName: this.#questionary?.Info.name ?? '',
|
|
241
|
+
QuestionaryGuid: this.#questionary?.Info.questionary_guid ?? 0,
|
|
242
|
+
StartedAt: this._interview.startedAt,
|
|
243
|
+
FinishedAt: currentTime.getTime(),
|
|
244
|
+
TineZoneBias: currentTime.getTimezoneOffset(),
|
|
245
|
+
ResultatDirty: resultDirty,
|
|
246
|
+
Answers: {
|
|
247
|
+
AnsversList: Array.from(this._interview.getAnswerList())
|
|
248
|
+
},
|
|
249
|
+
additional_info: {
|
|
250
|
+
QuestionaryUpdateTimestamp: new Date(this.#questionary?.Info.last_update_timestamp ?? 0).getTime(),
|
|
251
|
+
},
|
|
252
|
+
ResultQuotaGuids: [],
|
|
253
|
+
ResultQuota2dGuids: [],
|
|
254
|
+
LogicVars: [],
|
|
255
|
+
};
|
|
256
|
+
const logicVars = this._logic.getLogicVars();
|
|
257
|
+
Object.entries(logicVars).forEach(([key, value]) => interview.LogicVars.push({ nm: key, vl: value }));
|
|
258
|
+
this._eventBus.next({ key: SurveyEvents.seSurveyEnd, data: interview });
|
|
259
|
+
}
|
|
260
|
+
#nextQuestionNum() {
|
|
261
|
+
const currentQuestion = this.#currentQuestion.value;
|
|
262
|
+
// проверим квоты
|
|
263
|
+
const currentGuid = currentQuestion?.QuestionGuid ?? 0;
|
|
264
|
+
if (this.#surveyQuotas.quotaIsCompleted && !this.#surveyQuotas.guidIsDestinationQuestion(currentGuid)) {
|
|
265
|
+
// у нас есть заполненная квота, найдем вопрос который нужно показать при заполнении квоты
|
|
266
|
+
const destinationQ = this.#findQuestionByGuid(this.#surveyQuotas.destinationQuestionGuid);
|
|
267
|
+
//если вопрос есть(его могли удалить из анкеты), показывает его
|
|
268
|
+
if (!!destinationQ) {
|
|
269
|
+
return destinationQ.QuestionNum;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// если нет заполненной квоты, переходим на следующий вопрос, ищем следующий вопрос который мы можем отобразить (до логика может запретить показ вопроса)
|
|
273
|
+
let nextQuestionNum = (currentQuestion?.QuestionNum ?? 0) + 1;
|
|
274
|
+
// но сначала проверим после логику
|
|
275
|
+
if (!!currentQuestion) {
|
|
276
|
+
const destQ = currentQuestion.logiclist.find(logObj => (logObj.DestinationQuestionGuid > 0) && this._logic.executeLogic(logObj.LogicText));
|
|
277
|
+
if (!!destQ) {
|
|
278
|
+
const destQNum = this.#findQuestionByGuid(destQ.DestinationQuestionGuid)?.QuestionNum;
|
|
279
|
+
if (Number.isSafeInteger(destQNum)) { // вопрос мог быть удалён, а логику оставить
|
|
280
|
+
nextQuestionNum = destQNum;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// общее количество вопросов, цикл будет считать до этого количества
|
|
285
|
+
const questionCount = this.#questionsCount;
|
|
286
|
+
do {
|
|
287
|
+
//потенциально следующий вопрос
|
|
288
|
+
const q = this.#questionary.Questions[nextQuestionNum];
|
|
289
|
+
//если это последний вопрос или если выполняется BeforeExpression и этот вопрос не DestinationQuota, можем его показать
|
|
290
|
+
if (q.QuestionType === QuestionsType.eqEND || (this._logic.executeLogic(q.BeforeExpression) && !this.#surveyQuotas.guidIsDestinationQuestion(q.QuestionGuid))) {
|
|
291
|
+
return nextQuestionNum;
|
|
292
|
+
}
|
|
293
|
+
//вопрос нельзя показывать, увеличиваем счётчик текущего вопроса на 1
|
|
294
|
+
nextQuestionNum++;
|
|
295
|
+
} while (nextQuestionNum < questionCount - 1); // end вопрос должен всегда быть показан
|
|
296
|
+
return nextQuestionNum;
|
|
297
|
+
}
|
|
298
|
+
#initiateQuestions(questionList) {
|
|
299
|
+
questionList.forEach(question => {
|
|
300
|
+
//создаём пустой ответ для вопроса.
|
|
301
|
+
const answer = this._interview.createAnswer(question.QuestionGuid, question.Version);
|
|
302
|
+
//такого быть не должно, это ошибка
|
|
303
|
+
if (!answer) {
|
|
304
|
+
throw new Error('answer not found');
|
|
305
|
+
}
|
|
306
|
+
this._logic.setLogicValue(question.SysName, MISSING_VALUE); // переменная самого вопроса
|
|
307
|
+
//добавим доп ответы и логику для них
|
|
308
|
+
question.AdditionalAnswerlist.forEach(aa => {
|
|
309
|
+
answer.AnswerAdditional[aa.Value] = null;
|
|
310
|
+
this._logic.setLogicValue(`${question.SysName}${aa.SysName}`, MISSING_VALUE); // логика для переменных доп ответа
|
|
311
|
+
});
|
|
312
|
+
// если в тексте postScript есть запись типа setVar('varName', value); нужно инициализировать переменную varName значением -97.
|
|
313
|
+
if (!!question.PostScript) {
|
|
314
|
+
(question.PostScript.match(/(\bsetvar\b)\(['|"](.*?)['|"]/gim) ?? []).map(scriptVar => scriptVar.match(/['|"](.+)['|"]/i)[1]).forEach(varName => this._logic.setLogicValue(varName, null));
|
|
315
|
+
}
|
|
316
|
+
// для Вопросов SS/MS нужно прописать логику альтернатив sysname вопроса + sysname альтернативы
|
|
317
|
+
if (question.Sectionlist.length <= 0) { // для Вопросов SS/MS
|
|
318
|
+
question.Alternativelist.forEach(alt => this._logic.setLogicValue(`${question.SysName}${alt.SysName}`, MISSING_VALUE));
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
//для вопросов у которых есть секции проинициализируем каждую секцию
|
|
322
|
+
question.Sectionlist.forEach(section => {
|
|
323
|
+
//создаём пустой ответ для секции.
|
|
324
|
+
const answerForSection = this._interview.createAnswer(section.SectionGuid, 1);
|
|
325
|
+
//такого быть не должно, это ошибка
|
|
326
|
+
if (!answerForSection) {
|
|
327
|
+
throw new Error('answer not found');
|
|
328
|
+
}
|
|
329
|
+
// для Вопросов SL нужно прописать логику альтернатив и секций sysname секции + sysname альтернативы
|
|
330
|
+
this._logic.setLogicValue(section.SysName, MISSING_VALUE); // переменная самой секции
|
|
331
|
+
//логика альтернатив SL вопроса
|
|
332
|
+
question.Alternativelist.forEach(alt => this._logic.setLogicValue(`${section.SysName}${alt.SysName}`, MISSING_VALUE));
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
//ищет вопрос на guid
|
|
338
|
+
#findQuestionByGuid(guid) {
|
|
339
|
+
if (!this.#questionary) {
|
|
340
|
+
return undefined;
|
|
341
|
+
}
|
|
342
|
+
return this.#questionary.Questions.find(q => q.QuestionGuid === guid);
|
|
343
|
+
}
|
|
344
|
+
#nextButtonExpressionIsTrue() {
|
|
345
|
+
const buttonNextExpression = this.#currentQuestion.value?.BtnNextExpression ?? '';
|
|
346
|
+
//если скрипта для кнопки далее нет, вернём true
|
|
347
|
+
if (buttonNextExpression.trim() === '') {
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
try {
|
|
351
|
+
return this._logic.executeLogic(buttonNextExpression);
|
|
352
|
+
}
|
|
353
|
+
catch (e) {
|
|
354
|
+
console.error(e);
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: TpSurveyCoreService, deps: [{ token: PLATFORM_ID }, { token: i1.TpSurveyLogicService }, { token: i2.TpSurveyInterviewService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
359
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: TpSurveyCoreService, providedIn: 'root' }); }
|
|
360
|
+
}
|
|
361
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: TpSurveyCoreService, decorators: [{
|
|
362
|
+
type: Injectable,
|
|
363
|
+
args: [{
|
|
364
|
+
providedIn: 'root'
|
|
365
|
+
}]
|
|
366
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
367
|
+
type: Inject,
|
|
368
|
+
args: [PLATFORM_ID]
|
|
369
|
+
}] }, { type: i1.TpSurveyLogicService }, { type: i2.TpSurveyInterviewService }] });
|
|
370
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAuc3VydmV5LmNvcmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RwLnN1cnZleS9zcmMvbGliL2NvcmUvdHAuc3VydmV5LmNvcmUvdHAuc3VydmV5LmNvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQUMsZUFBZSxFQUFFLE1BQU0sRUFBYyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRWhFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUduQyxPQUFPLEVBQUMsYUFBYSxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUdqRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFTOUQsTUFBTSxPQUFPLG1CQUFtQjtJQUVyQixnQkFBZ0IsQ0FBaUQ7SUFDMUUsYUFBYSxDQUFzQjtJQUNuQyxZQUFZLENBQWtCO0lBQzlCLG1CQUFtQixDQUFxQixDQUFDLHFDQUFxQztJQUNyRSxXQUFXLENBQXNCO0lBQzFDLFlBQWtELFVBQWtCLEVBQW1CLE1BQTRCLEVBQW1CLFVBQW9DO1FBQXhILGVBQVUsR0FBVixVQUFVLENBQVE7UUFBbUIsV0FBTSxHQUFOLE1BQU0sQ0FBc0I7UUFBbUIsZUFBVSxHQUFWLFVBQVUsQ0FBMEI7UUFOekosY0FBUyxHQUFHLElBQUksT0FB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clpVLG1CQUFtQixrQkFPVixXQUFXO2tIQVBwQixtQkFBbUIsY0FGbEIsTUFBTTs7MkZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBUWMsTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZXN0cm95UmVmLCBpbmplY3QsIEluamVjdCwgSW5qZWN0YWJsZSwgUExBVEZPUk1fSUR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZmlsdGVyLCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtTdXJ2ZXlRdW90YXN9IGZyb20gJy4uL3RwLnNlcnZleS5xdW90YS90cC5zdXJ2ZXkucXVvdGEnO1xyXG5pbXBvcnQge1RwU3VydmV5TG9naWNTZXJ2aWNlfSBmcm9tICcuLi90cC5zdXJ2ZXkubG9naWMvdHAuc3VydmV5LmxvZ2ljLnNlcnZpY2UnO1xyXG5pbXBvcnQge2lzUGxhdGZvcm1Ccm93c2VyfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge0Fuc3dlckNoYW5nZSwgSWRiUXVlc3Rpb24sIElkYlF1ZXN0aW9uYXJ5LCBJSW50ZXJ2aWV3RGF0YSwgSUludGVydmlld0xvZ2ljVmFyLCBJUXVlc3Rpb25BbnN3ZXJ9IGZyb20gJy4uLy4uL3RwLnN1cnZleS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1RwU3VydmV5SW50ZXJ2aWV3U2VydmljZX0gZnJvbSAnLi4vdHAuc3VydmV5LmludGVydmlldy90cC5zdXJ2ZXkuaW50ZXJ2aWV3LnNlcnZpY2UnO1xyXG5pbXBvcnQge1F1ZXN0aW9uc1R5cGUsIFJlc3VsdGF0aXZlU3RhdHVzLCBTdXJ2ZXlFdmVudHMsIFZhbGlkU3RhdHVzfSBmcm9tICcuLi8uLi90cC5zdXJ2ZXkuZW51bSc7XHJcbmltcG9ydCB7QW5zd2VyfSBmcm9tICcuLi90cC5zdXJ2ZXkuYW5zd2VyL3RwLnN1cnZleS5hbnN3ZXInO1xyXG5pbXBvcnQge0Fuc3dlclNsVHlwZSwgTG9naWNPYmplY3R9IGZyb20gJy4uLy4uL3RwLnN1cnZleS50eXBlJztcclxuaW1wb3J0IHtNSVNTSU5HX1ZBTFVFfSBmcm9tICcuLi8uLi90cC5zdXJ2ZXkuY29uc3QnO1xyXG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5cclxuaW50ZXJmYWNlIEJyb2FkY2FzdEV2ZW50IHtcclxuICBrZXk6IHN0cmluZztcclxuICBkYXRhPzogYW55O1xyXG59XHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRwU3VydmV5Q29yZVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50QnVzID0gbmV3IFN1YmplY3Q8QnJvYWRjYXN0RXZlbnQ+KCk7XHJcbiAgcmVhZG9ubHkgI2N1cnJlbnRRdWVzdGlvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SWRiUXVlc3Rpb24gfCBudWxsPihudWxsKTtcclxuICAjc3VydmV5UXVvdGFzID0gbmV3IFN1cnZleVF1b3RhcygpO1xyXG4gICNxdWVzdGlvbmFyeT86IElkYlF1ZXN0aW9uYXJ5O1xyXG4gICNkaXNwbGF5ZWRRdWVzdGlvbnM6IEFycmF5PG51bWJlcj4gPSBbXTsgLy8g0L3Rg9C20L3QviDQtNC70Y8g0L3QsNCy0LjQs9Cw0YbQuNC4INC/0L4g0LrQvdC+0L/QutC1IGJhY2tcclxuICByZWFkb25seSAjZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQ6IG9iamVjdCwgcHJpdmF0ZSByZWFkb25seSBfbG9naWM6IFRwU3VydmV5TG9naWNTZXJ2aWNlLCBwcml2YXRlIHJlYWRvbmx5IF9pbnRlcnZpZXc6IFRwU3VydmV5SW50ZXJ2aWV3U2VydmljZSkge1xyXG4gICAgLy8g0LfQsNC/0YPRgdC60LDQvCDQv9GA0L7QstC10YDQutGDINC60LLQvtGCLCDQv9C+0YHQu9C1INGB0LrRgNGL0YLQuNGPINC60LDQttC00L7Qs9C+KNC/0L7Rh9GC0LgpINCy0L7Qv9GA0L7RgdCwIChzZVF1ZXN0aW9uSGlkZSlcclxuICAgIHRoaXMuX2V2ZW50QnVzLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXHJcbiAgICAgZmlsdGVyKGV2ID0+IGV2LmtleSA9PT0gU3VydmV5RXZlbnRzLnNlUXVlc3Rpb25IaWRlICksXHJcbiAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuI2Rlc3Ryb3lSZWYpLFxyXG4gICAgKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB0aGlzLiNzdXJ2ZXlRdW90YXMuZmluZEZpbGxlZFF1b3Rhcyh0aGlzLiNjdXJyZW50UXVlc3Rpb24udmFsdWU/LlF1ZXN0aW9uTnVtID8/IC0xLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9sb2dpYy5nZXRMb2dpY1ZhcnMoKSksIHRoaXMuX2ludGVydmlldy5nZXRBbnN3ZXJMaXN0KCkpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldHVwU3VydmV5KHF1ZXN0aW9uYXJ5UmF3RGF0YTogSWRiUXVlc3Rpb25hcnksIGxvZ2ljVmFycz86IEFycmF5PElJbnRlcnZpZXdMb2dpY1Zhcj4sIGFuc3dlckxpc3Q/OiBBcnJheTxJUXVlc3Rpb25BbnN3ZXI+LCBxdWVzdGlvbkd1aWQ/OiBudW1iZXIpIHtcclxuICAgIC8v0LXRgdC70Lgg0LDQvdC60LXRgtGLINC90LXRgiwg0LTQtdC70LDRgtGMINC90LXRh9C10LPQvi5cclxuICAgIGlmICghcXVlc3Rpb25hcnlSYXdEYXRhKSB7XHJcbiAgICAgIHRoaXMuI2N1cnJlbnRRdWVzdGlvbi5uZXh0KG51bGwpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4jcXVlc3Rpb25hcnkgPSBxdWVzdGlvbmFyeVJhd0RhdGE7XHJcblxyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgLy/Rg9C30L3QsNC10Lwg0LXRgdGC0Ywg0LvQuCDQstC+0L/RgNC+0YEg0LrQvtGC0L7RgNGL0Lkg0YPQutCw0LfQsNC70Lgg0LTQu9GPINC/0LXRgNC10YXQvtC00LAg0L/RgNC4INC30LDQv9C+0LvQvdC10L3QuNC4INC60LLQvtGC0YtcclxuICAgICAgY29uc3QgZGVzdGluYXRpb25RdWVzdGlvbiA9IHRoaXMuI2ZpbmRRdWVzdGlvbkJ5R3VpZChxdWVzdGlvbmFyeVJhd0RhdGEuQmFzZVBhcmFtcy5RdW90YUxpbWl0RGVzdGluYXRpb25RdWVzdGlvbkd1aWQpO1xyXG5cclxuICAgICAgLy/QuNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdC8INC60LLQvtGC0YtcclxuICAgICAgdGhpcy4jc3VydmV5UXVvdGFzLnNldFF1b3RhcyhxdWVzdGlvbmFyeVJhd0RhdGEuUXVvdGFzLCBxdWVzdGlvbmFyeVJhd0RhdGEuUXVvdGFzMmQsIGRlc3RpbmF0aW9uUXVlc3Rpb24/LlF1ZXN0aW9uR3VpZCA/PyAtMSwgZGVzdGluYXRpb25RdWVzdGlvbj8uUXVlc3Rpb25OdW0gPz8gLTEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v0YHQvtC30LTQsNC00LjQvCDQvtGC0LLQtdGC0Ysg0Lgg0LvQvtCz0LjRh9C10YHQutC40LUg0L/QtdGA0LXQvNC10L3QvdGL0LVcclxuICAgIHRoaXMuI2luaXRpYXRlUXVlc3Rpb25zKHRoaXMuI3F1ZXN0aW9uYXJ5LlF1ZXN0aW9ucylcclxuXHJcbiAgICAvLyDQnNC+0LbQtdGCINCx0YvRgtGMIDIg0LLQsNGA0LjQsNC90YLQsCDQt9Cw0L/Rg9GB0LrQsCDQuNC90YLQtdGA0LLRjNGOLCAxLdC90L7QstC+0LUg0LjQvdGC0LXRgNCy0YzRjiwgMi3Qv9C10YDQtdC30LDQv9GD0YHQuiDRgdGC0LDRgNC+0LPQviDQuNC90YLQtdGA0LLRjNGOLiDQkiDQv9C10YDQstC+0Lwg0YHQu9GD0YfQsNC1INC90LDRh9Cw0LvQviDRjdGC0L4gbGFuZyDQuNC70Lgg0L/QtdGA0LLRi9C5INCy0L7Qv9GA0L7RgS4g0JLQviDQstGC0L7RgNC+0LwsINGBINC/0L7RgdC70LXQtNC90LXQs9C+INCy0L7Qv9GA0L7RgdCwINC90LAg0LrQvtGC0L7RgNGL0Lkg0L7RgtCy0LXRgtC40LvQuC5cclxuICAgIGxldCBzdGFydFF1ZXN0aW9uTnVtOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAvL9C10YHQu9C4INC30LDQs9GA0YPQttCw0LXQvCDRgNCw0L3QtdC1INC90LUg0LfQsNC60L7QvdGH0LXQvdC90L7QtSDQuNC90YLQtdGA0LLRjNGOLCDQv9GA0L7QtNC+0LvQttCw0LXQvCDRgSDQvNC10YHRgtCwINC/0L7RgdC70LXQtNC90LXQs9C+INCy0L7Qv9GA0L7RgdCwICjRgdC70YPRh9Cw0Lkg0L3QvtC80LXRgCAyKVxyXG4gICAgaWYgKCEhbG9naWNWYXJzICYmICEhYW5zd2VyTGlzdCAmJiAhIXF1ZXN0aW9uR3VpZCkge1xyXG4gICAgICAvL9C30LDQs9GA0YPQttCw0LXQvCDRgdGC0LDRgNGL0LUg0LvQvtCz0LjRh9C10YHQutC40LUg0L/QtdGA0LXQvNC10L3QvdGL0LUg0Lgg0L7RgtCy0LXRgtGLXHJcbiAgICAgIHRoaXMuI2ZpbGxPbGRJbnRlcnZpZXdEYXRhKGxvZ2ljVmFycywgYW5zd2VyTGlzdCk7XHJcblxyXG4gICAgICAvL9C40YnQtdC8INC90L7QvNC10YAg0LLQvtC/0YDQvtGB0LAsINC60L7RgtC+0YDRi9C5INCx0YvQuyDQv9C+0YHQu9C10LTQvdC40Lkg0L/QtdGA0LXQtCDRgdC+0YXRgNCw0L3QtdC90LjQtdC8LlxyXG4gICAgICBjb25zdCBxdWVzdGlvbkxhc3RTYXZlID0gdGhpcy4jZmluZFF1ZXN0aW9uQnlHdWlkKHF1ZXN0aW9uR3VpZCk7XHJcblxyXG4gICAgICAvL9CS0L7Qv9GA0L7RgSDQvNC+0LPQu9C4INGD0LTQsNC70LjRgtGMLiDQotC+0LPQtNCwINC90LDRh9C90LXQvCDRgdC90LDRh9Cw0LvQsC5cclxuICAgICAgaWYgKCEhcXVlc3Rpb25MYXN0U2F2ZSkge1xyXG4gICAgICAgIHN0YXJ0UXVlc3Rpb25OdW0gPSBxdWVzdGlvbkxhc3RTYXZlLlF1ZXN0aW9uTnVtO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoc3RhcnRRdWVzdGlvbk51bSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8v0K3RgtC+INC90L7QstC+0LUg0LjQvdGC0LXRgNCy0YzRjiwg0LHQtdC3INGA0LDQvdC10LUg0YHQvtGF0YDQsNC90ZHQvdC90YvRhSDQtNCw0L3QvdGL0YUo0YHQu9GD0YfQsNC5IDEpLiDQl9Cw0L/Rg9GB0LrQsNC10Lwg0L7Qv9GA0L7RgSwg0L/QtdGA0LLRi9C5INGN0LrRgNCw0L0g0Y3RgtC+IExhbmcg0LLQvtC/0YDQvtGBLCDQvdC+INC10YHQu9C4INCy0YvQsdC+0YDQsCDRj9C30YvQutCwINC90LXRgiwg0L/RgNC+0L/Rg9GB0LrQsNC10Lwg0Lgg0L/QtdGA0LXRhdC+0LTQuNC8INC90LAgMS3QuSDQstC+0L/RgNC+0YFcclxuICAgICAgc3RhcnRRdWVzdGlvbk51bSA9IHRoaXMuI2FjdGl2ZUxhbmdDb3VudCA+IDEgPyAwIDogdGhpcy4jbmV4dFF1ZXN0aW9uTnVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/Qv9C+0YjQu9GR0Lwg0YHQvtCx0YvRgtC40LUg0L4g0L3QsNGH0LDQu9C1INC+0L/RgNC+0YHQsFxyXG4gICAgdGhpcy5fZXZlbnRCdXMubmV4dCh7a2V5OiBTdXJ2ZXlFdmVudHMuc2VTdXJ2ZXlTdGFydCwgZGF0YToge3F1ZXN0aW9uYXJ5OiB0aGlzLiNxdWVzdGlvbmFyeX19KTtcclxuXHJcbiAgICAvL9C/0L7QutCw0LfRi9Cy0LDQtdC8INCy0L7Qv9GA0L7RgVxyXG4gICAgdGhpcy4jY2hhbmdlQ3VycmVudFF1ZXN0aW9uKHRoaXMuI3F1ZXN0aW9uYXJ5IS5RdWVzdGlvbnNbc3RhcnRRdWVzdGlvbk51bV0pO1xyXG4gIH1cclxuXHJcbiAgb24oLi4ua2V5OiBBcnJheTxzdHJpbmc+KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9ldmVudEJ1cy5hc09ic2VydmFibGUoKS5waXBlKFxyXG4gICAgIGZpbHRlcihldmVudCA9PiBrZXkuaW5jbHVkZXMoZXZlbnQua2V5KSksXHJcbiAgICAgbWFwKGV2ZW50ID0+IGV2ZW50LmRhdGEpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ29Ub05leHRRdWVzdGlvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGN1cnJlbnRRdWVzdGlvbiA9IHRoaXMuI2N1cnJlbnRRdWVzdGlvbi52YWx1ZTtcclxuICAgIGlmICghY3VycmVudFF1ZXN0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8v0LXRgdC70Lgg0L7RgtCy0LXRgiDQvdCwINGC0LXQutGD0YnQuNC5INCy0L7Qv9GA0L7RgSDQvdC1INC30LDQutC+0L3Rh9C10L0sINCy0YvRhdC+0LTQuNC8XHJcbiAgICBpZiAoIXRoaXMuX2ludGVydmlldy5xdWVzdGlvbklzQ29tcGxldGUoY3VycmVudFF1ZXN0aW9uLlF1ZXN0aW9uR3VpZCkpIHtcclxuICAgICAgcmV0dXJuIDtcclxuICAgIH1cclxuXHJcbiAgICAvL9C10YHQu9C4INGD0LrQsNC30LDQvSBQb3N0U2NyaXB0LCDQstGL0L/QvtC70L3QuNC8INC10LPQvlxyXG4gICAgaWYgKCEhY3VycmVudFF1ZXN0aW9uLlBvc3RTY3JpcHQpIHtcclxuICAgICAgdGhpcy5fbG9naWMuZXhlY3V0ZVBvc3RTY3JpcHQoY3VycmVudFF1ZXN0aW9uLlBvc3RTY3JpcHQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy4jY2hhbmdlQ3VycmVudFF1ZXN0aW9uKHRoaXMuI3F1ZXN0aW9uYXJ5IS5RdWVzdGlvbnNbdGhpcy4jbmV4dFF1ZXN0aW9uTnVtKCldKTtcclxuICB9XHJcblxyXG4gIGdvVG9CYWNrUXVlc3Rpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLiNkaXNwbGF5ZWRRdWVzdGlvbnMucG9wKCk7IC8vINGD0LTQsNC70LjQvCDQuNC90YTQvtGA0LzQsNGG0LjRjiDQviDRgtC+0Lwg0YfRgtC+INC/0L7QutCw0LfRi9Cy0LDQu9C4INGN0YLQvtGCINCy0L7Qv9GA0L7RgVxyXG4gICAgY29uc3QgcHJldmlvdXNRdWVzdGlvbk51bSA9IHRoaXMuI2Rpc3BsYXllZFF1ZXN0aW9ucy5wb3AoKTsgLy8g0YPQt9C90LDQtdC8INC90L7QvNC10YAg0LLQvtC/0YDQvtGB0LAg0L3QsCDQutC+0YLQvtGA0YvQuSDQvdCw0Lwg0L3QsNC00L4g0L/QtdGA0LXQudGC0LgsINC4INGD0LTQsNC70LjQvCDQuNC90YTQvtGA0LzQsNGG0LjRjiDRh9GC0L4t0LHRiyDQvdC1INC00YPQsdC70LjRgNC+0LLQsNGC0YxcclxuICAgIGlmICghIXByZXZpb3VzUXVlc3Rpb25OdW0pIHtcclxuICAgICAgY29uc3QgcHJldlF1ZXN0aW9uID0gdGhpcy4jcXVlc3Rpb25hcnk/LlF1ZXN0aW9uc1twcmV2aW91c1F1ZXN0aW9uTnVtXTtcclxuICAgICAgaWYgKCEhcHJldlF1ZXN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy4jY2hhbmdlQ3VycmVudFF1ZXN0aW9uKHByZXZRdWVzdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHF1ZXN0aW9uSXNDb21wbGV0ZShndWlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGFuc3dlciA9IHRoaXMuX2ludGVydmlldy5maW5kQW5zd2VyQnlHdWlkKGd1aWQpO1xyXG4gICAgcmV0dXJuIGFuc3dlcj8uYW5zd2VySXNDb21wbGV0ZSA/PyBmYWxzZVxyXG4gIH1cclxuXHJcbiAgI2ZpbGxPbGRJbnRlcnZpZXdEYXRhKGxvZ2ljVmFyczogQXJyYXk8SUludGVydmlld0xvZ2ljVmFyPiwgYW5zd2VyTGlzdDogQXJyYXk8SVF1ZXN0aW9uQW5zd2VyPik6IHZvaWR7XHJcbiAgICAvL9C/0YDQvtC/0LjRiNC10Lwg0YHRgtCw0YDRi9C1INC70L7Qs9C40YfQtdGB0LrQuNC1INC/0LXRgNC10LzQtdC90L3Ri9C1XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsb2dpY1ZhcnMpKSB7XHJcbiAgICAgIGxvZ2ljVmFycy5mb3JFYWNoKGxvZ2ljVmFyT2JqID0+IHtcclxuICAgICAgICB0aGlzLl9sb2dpYy5zZXRMb2dpY1ZhbHVlKGxvZ2ljVmFyT2JqLm5tLCBsb2dpY1Zhck9iai52bCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLy/Qv9GA0L7Qv9C40YjQtdC8INGB0YLQsNGA0YvQtSDQvtGC0LLQtdGC0YtcclxuICAgIHRoaXMuX2ludGVydmlldy5vdmVycmlkZUFuc3dlcnMoYW5zd2VyTGlzdCk7XHJcblxyXG4gICAgLy/QvdGD0LbQvdC+INCy0LXRgNC90YPRgtGMINCy0YDQtdC80Y8g0L3QsNGH0LDQu9CwINC40L3RgtC10YDQstGM0Y4sINC+0YLQtNC10LvRjNC90L4g0L7QvdC+INC90LUg0YHQvtGF0YDQsNC90Y/QtdGC0YHRjywg0L/QvtGN0YLQvtC80YMg0LLQvtC30YzQvNGR0Lwg0LzQuNC90LjQvNCw0LvRjNC90L7QtSDQstGA0LXQvNGPINC90LDRh9Cw0LvQsCDQuNC3INC+0YLQstC10YLQvtCyXHJcbiAgICAvL9GE0LjQu9GM0YLRgNGD0LXQvCDQstGB0LUg0LLQvtC/0YDQvtGB0Ysg0YMg0LrQvtGC0L7RgNGL0YUg0L7QvdC+INGD0LrQsNC30LDQvdC+KD4wKSDQuCDRgtGA0LDQvdGB0YTQvtGA0LzQuNGA0YPQtdC8INCyINGH0LjRgdC70L4uXHJcbiAgICBjb25zdCBzdGFydGVkQXRBcnJheSA9ICBhbnN3ZXJMaXN0LmZpbHRlcihhbnN3ZXIgPT4gYW5zd2VyLlN0YXJ0ZWRBdCA+IDApLm1hcChhbnN3ZXIgPT4gYW5zd2VyLlN0YXJ0ZWRBdCk7XHJcblxyXG4gICAgLy/QsdC10YDRkdC8INC80LjQvdC40LzQsNC70YzQvdC+0LVcclxuICAgIHRoaXMuX2ludGVydmlldy5zdGFydGVkQXQgPSBNYXRoLm1pbiguLi5zdGFydGVkQXRBcnJheSk7XHJcbiAgfVxyXG5cclxuICAjY2hhbmdlQ3VycmVudFF1ZXN0aW9uKG5ld1F1ZXN0aW9uOiBJZGJRdWVzdGlvbik6IHZvaWQge1xyXG4gICAgY29uc3QgY3VycmVudFF1ZXN0aW9uID0gdGhpcy4jY3VycmVudFF1ZXN0aW9uLnZhbHVlO1xyXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuXHJcbiAgICBpZiAoISFjdXJyZW50UXVlc3Rpb24pIHtcclxuICAgICAgLypcclxuICAgICAg0KHQvtGF0YDQsNC90LjQvCDQstGA0LXQvNGPINC90LDRh9Cw0LvQsCDQuNC90YLQtdGA0LLRjNGOLiDQpNC40LrRgdC40YDQvtCy0LDRgtGMINCx0YPQtNC10Lwg0L3QtSDRgSDRgdCw0LzQvtCz0L4g0L3QsNGH0LDQu9CwLCDQsCDRgSDQvtGC0LLQtdGC0LAg0L3QsCDQv9C10YDQstGL0Lkg0LLQvtC/0YDQvtGBLlxyXG4gICAgICDQn9C+0YLQvtC80YMg0YfRgtC+INC/0YDQsNC60YLQuNC60LAg0YLQsNC60LDRjywg0L7RgtC60YDRi9GC0Ywg0LDQvdC60LXRgtGDINC90LAg0L/Qu9Cw0L3RiNC10YLQtSDQuCDRhdC+0LTQuNGC0Ywg0LjRgdC60LDRgtGMINGA0LXRgdC/0L7QvdC00LXQvdGC0L7QsiDQuCDQuNC3LdC30LAg0Y3RgtC+0LPQviDQtNC70LjRgtC10LvRjNC90L7RgdGC0Ywg0LjQvdGC0LXRgNCy0YzRjiDQvNC+0LbQtdGCINCx0YvRgtGMINC90LXRgNC10LvQtdCy0LDQvdGC0L3Qvi5cclxuICAgICAgKiAqL1xyXG4gICAgICBpZiAodGhpcy5faW50ZXJ2aWV3LnN0YXJ0ZWRBdCA9PT0gMCAmJiBjdXJyZW50UXVlc3Rpb24uUXVlc3Rpb25OdW0gPj0gMCkge1xyXG4gICAgICAgIHRoaXMuX2ludGVydmlldy5zdGFydGVkQXQgPSBjdXJyZW50VGltZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy/QvdGD0LbQvdC+INGB0L7RhdGA0LDQvdC40YLRjCBGaW5pc2hlZEF0INCyINC+0YLQstC10YLQsNGFINC00LvRjyDRgdGC0LDRgNC+0LPQviDQstC+0L/RgNC+0YHQsFxyXG4gICAgICBjb25zdCBhbnN3ZXIgPSB0aGlzLl9pbnRlcnZpZXcuZmluZEFuc3dlckJ5R3VpZChjdXJyZW50UXVlc3Rpb24uUXVlc3Rpb25HdWlkKTtcclxuICAgICAgaWYgKCEhYW5zd2VyKSB7XHJcbiAgICAgICAgYW5zd2VyLkZpbmlzaGVkQXQgPSBjdXJyZW50VGltZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9ldmVudEJ1cy5uZXh0KHtrZXk6IFN1cnZleUV2ZW50cy5zZVF1ZXN0aW9uSGlkZSwgZGF0YTogY3VycmVudFF1ZXN0aW9ufSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLiNkaXNwbGF5ZWRRdWVzdGlvbnMucHVzaChuZXdRdWVzdGlvbi5RdWVzdGlvbk51bSk7XHJcbiAgICB0aGlzLiNjdXJyZW50UXVlc3Rpb24ubmV4dChuZXdRdWVzdGlvbik7XHJcblxyXG4gICAgLy/QvdGD0LbQvdC+INGB0L7RhdGA0LDQvdC40YLRjCBTdGFydGVkQXQg0LIg0L7RgtCy0LXRgtCw0YUg0LTQu9GPINC90L7QstC+0LPQviDQstC+0L/RgNC+0YHQsFxyXG4gICAgY29uc3QgYW5zd2VyTmV3ID0gdGhpcy5faW50ZXJ2aWV3LmZpbmRBbnN3ZXJCeUd1aWQobmV3UXVlc3Rpb24uUXVlc3Rpb25HdWlkKTtcclxuICAgIGlmICghIWFuc3dlck5ldykge1xyXG4gICAgICBhbnN3ZXJOZXcuU3RhcnRlZEF0ID0gY3VycmVudFRpbWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ldmVudEJ1cy5uZXh0KHtrZXk6IFN1cnZleUV2ZW50cy5zZVF1ZXN0aW9uU2hvdywgZGF0YTogbmV3UXVlc3Rpb259KTtcclxuXHJcbiAgICAvL9C10YHQu9C4INC90L7QstGL0Lkg0Y3QutGA0LDQvSDRjdGC0L4gZW5kINGC0L7Qs9C00LAg0LfQsNCy0LXRgNGI0LDQtdC8INC40L3RgtC10YDQstGM0Y5cclxuICAgIGlmIChuZXdRdWVzdGlvbi5RdWVzdGlvblR5cGUgPT09ICdFTkQnKSB7XHJcbiAgICAgIHRoaXMuI2ZpbmlzaEludGVydmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3VycmVudFF1ZXN0aW9uJCgpOiBPYnNlcnZhYmxlPElkYlF1ZXN0aW9uIHwgbnVsbD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRRdWVzdGlvbi5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGZpbmRBbnN3ZXJCeUd1aWQoZ3VpZDogbnVtYmVyKTogQW5zd2VyIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9pbnRlcnZpZXcuZmluZEFuc3dlckJ5R3VpZChndWlkKTtcclxuICB9XHJcblxyXG4gIHNldExvZ2ljVmFsdWUodmFyTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb2dpYy5zZXRMb2dpY1ZhbHVlKHZhck5hbWUsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldExvZ2ljVmFycygpOiBMb2dpY09iamVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fbG9naWMuZ2V0TG9naWNWYXJzKCk7XHJcbiAgfVxyXG5cclxuICBnZXRBbnN3ZXJMaXN0KCk6IEFycmF5PEFuc3dlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ludGVydmlldy5nZXRBbnN3ZXJMaXN0KCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVBbnN3ZXIoZXZlbnREYXRhOiBBbnN3ZXJDaGFuZ2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFuc3dlciA9IHRoaXMuX2ludGVydmlldy5maW5kQW5zd2VyQnlHdWlkKGV2ZW50RGF0YS5ndWlkKTtcclxuICAgIGlmICghYW5zd2VyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL9Cy0L7Qv9GA0L7RgdGLINC60L7RgtC+0YDRi9C1INCyINGB0LLQvtC10Lwg0YHQvtGB0YLQsNCy0LUg0LjQvNC10LXRgiDRgdC10LrRhtC40LgsINGF0YDQsNC90Y/RgiDQvtGC0LLQtdGC0Ysg0YfRg9GC0Ywg0L/QviDQtNGA0YPQs9C+0LzRgywg0YLQvtGH0L3QtdC1INC+0YLQstC10YIg0L3QsCDQutCw0LbQtNGD0Y4g0YHQtdC60YbQuNGOINGN0YLQviDQvtGC0LTQtdC70YzQvdGL0Lkg0L7QsdGK0LXQutGCINCyICBfaW50ZXJ2aWV3LmFuc3dlckxpc3RcclxuICAgIC8v0L/QvtGN0YLQvtC80YMg0L7RgtCy0LXRgiDQtNC70Y8g0YLQsNC60LjRhSDRgtC40L/QvtCyINCy0L7Qv9GA0L7RgdC+0LIg0Y3RgtC+IFtrZXk6IHN0cmluZ106IEFycmF5PG51bWJlcj4gfCBudW1iZXIsINCz0LTQtSBrZXkoZ3VpZCDRgdC10LrRhtC40LgpINGN0YLQviDQvtGC0LLQtdGCINC90LAg0YHQtdC60YbQuNGOLCDQtdGB0LvQuCBrZXkg0L3QtdGCLCDRgdC10LrRhtC40Y8g0L3QtSDQsdGL0LvQsCDQv9C+0LrQsNC30LDQvdCwXHJcbiAgICBpZiAodGhpcy4jY3VycmVudFF1ZXN0aW9uLnZhbHVlPy5RdWVzdGlvblR5cGUgPT09IFF1ZXN0aW9uc1R5cGUuZXFTTCkge1xyXG4gICAgICBjb25zdCBzZWN0aW9uTGlzdCA9IHRoaXMuI2N1cnJlbnRRdWVzdGlvbi52YWx1ZT8uU2VjdGlvbmxpc3Q7XHJcblxyXG4gICAgICAvL9C/0YDQvtC50LTRkdC80YHRjyDQv9C+INC60LDQttC00L7QuSDRgdC10LrRhtC40Lgg0Lgg0LXRgdC70Lgg0LTQu9GPINC90LXRkSDQtdGB0YLRjCDQvtGC0LLQtdGCLCDQt9Cw0L/QuNGI0LXQvCwg0LIg0L/RgNC+0YLQuNCy0L3QvtC8INGB0LvRg9GH0LDQtSDQstC80LXRgdGC0L4g0L7RgtCy0LXRgtCwINGD0LrQsNC20LXQvCAtOTcoTUlTU0lOR19WQUxVRSlcclxuICAgICAgaWYgKCEhc2VjdGlvbkxpc3QpIHtcclxuICAgICAgICBzZWN0aW9uTGlzdC5mb3JFYWNoKHNlY3Rpb24gPT4ge1xyXG4gICAgICAgICAgY29uc3Qgc2VjdGlvbkludGVydmlld0Fuc3dlciA9ICB0aGlzLl9pbnRlcnZpZXcuZmluZEFuc3dlckJ5R3VpZChzZWN0aW9uLlNlY3Rpb25HdWlkKTtcclxuICAgICAgICAgIGlmICghc2VjdGlvbkludGVydmlld0Fuc3dlcil7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3Qgc2VjdGlvblF1ZXN0aW9uQW5zd2VyID0gZXZlbnREYXRhLmFuc3dlciA/ICAoZXZlbnREYXRhLmFuc3dlciBhcyBBbnN3ZXJTbFR5cGUpW3NlY3Rpb24uU2VjdGlvbkd1aWQudG9TdHJpbmcoKV0gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICBzZWN0aW9uSW50ZXJ2aWV3QW5zd2VyLkFuc3dlclZhbHVlID0gc2VjdGlvblF1ZXN0aW9uQW5zd2VyID09PSB1bmRlZmluZWQgPyBNSVNTSU5HX1ZBTFVFIDogc2VjdGlvblF1ZXN0aW9uQW5zd2VyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8v0L7RgtCy0LXRgiDRgdCw0LzQvtCz0L4g0LjRgdGF0L7QtNC90L7Qs9C+INCy0L7Qv9GA0L7RgdCwINC00L7Qu9C20LXQvSDQsdGL0YLRjCAxXHJcbiAgICAgIGFuc3dlci5BbnN3ZXJWYWx1ZSA9IDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL9C+0YLQstC10YIg0L3QsCDQstC+0L/RgNC+0YEg0YMg0LrQvtGC0L7RgNC+0LPQviDQvdC10YIg0YHQtdC60YbQuNC5XHJcbiAgICAgIGFuc3dlci5BbnN3ZXJWYWx1ZSA9IGV2ZW50RGF0YS5hbnN3ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLy/QvdCwINCy0L7Qv9GA0L7RgSDQvtGC0LLQtdGC0LjQu9C4INGC0L7Qs9C00LAg0LrQvtCz0LTQsCDQtdGB0YLRjCDQstGB0LUg0L7RgtCy0LXRgtGLINC4INCy0YvQv9C+0LvQvdGP0LXRgtGB0Y8g0LvQvtCz0LjQutCwINC60L3QvtC/0LrQuCDQtNCw0LvQtdC1KNC10YHQu9C4INC10ZEg0YPQutCw0LfQsNC70LgpXHJcbiAgICBhbnN3ZXIuYW5zd2VySXNDb21wbGV0ZSA9IGV2ZW50RGF0YS5pc0NvbXBsZXRlICYmIHRoaXMuI25leHRCdXR0b25FeHByZXNzaW9uSXNUcnVlKCk7XHJcblxyXG4gICAgLy9WaWV3ZWRBbHRlcm5hdGl2ZVZhbHVlcyDQuCBWaWV3ZWRTZWN0aW9uR3VpZHMuINCiLtC6LiDQvtC90LggcmVhZG9ubHkg0YHQvdCw0YfQsNC70LAg0YPQtNCw0LvQuNC8LCDQv9C+0YLQvtC8INC00L7QsdCw0LLQuNC8XHJcbiAgICBhbnN3ZXIuVmlld2VkQWx0ZXJuYXRpdmVWYWx1ZXMubGVuZ3RoID0gMDtcclxuICAgIGV2ZW50RGF0YS52aWV3ZWRBbHRlcm5hdGl2ZVZhbHVlcy5mb3JFYWNoKG9hID0+IGFuc3dlci5WaWV3ZWRBbHRlcm5hdGl2ZVZhbHVlcy5wdXNoKG9hKSk7XHJcblxyXG4gICAgYW5zd2VyLlZpZXdlZFNlY3Rpb25HdWlkcy5sZW5ndGggPSAwO1xyXG4gICAgZXZlbnREYXRhLnZpZXdlZFNlY3Rpb25HdWlkcy5mb3JFYWNoKG9hID0+IGFuc3dlci5WaWV3ZWRTZWN0aW9uR3VpZHMucHVzaChvYSkpO1xyXG5cclxuICAgIGFuc3dlci5BbHRlcm5hdGl2ZVNlcXVlbmNlQ2xpY2tzLmxlbmd0aCA9IDA7XHJcbiAgICBldmVudERhdGEuYWx0ZXJuYXRpdmVTZXF1ZW5jZUNsaWNrcy5mb3JFYWNoKG9hID0+IGFuc3dlci5BbHRlcm5hdGl2ZVNlcXVlbmNlQ2xpY2tzLnB1c2gob2EpKTtcclxuXHJcblxyXG4gICAgT2JqZWN0LmVudHJpZXMoYW5zd2VyLkFuc3dlckFkZGl0aW9uYWwpLmZvckVhY2goKFtrZXldKSA9PiBkZWxldGUgYW5zd2VyLkFuc3dlckFkZGl0aW9uYWxbTnVtYmVyKGtleSldKTtcclxuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50RGF0YS5hZGRpdGlvbmFsQW5zd2VycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiBhbnN3ZXIuQW5zd2VyQWRkaXRpb25hbFtOdW1iZXIoa2V5KV0gPSB2YWx1ZSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVMb2dpYyhldmVudERhdGEubG9naWNWYXJzKTtcclxuXHJcbiAgICB0aGlzLl9ldmVudEJ1cy5uZXh0KHtrZXk6IFN1cnZleUV2ZW50cy5zZVF1ZXN0aW9uQW5zd2Vyc0NoYW5nZSwgZGF0YToge3F1ZXN0aW9uOiB0aGlzLiNjdXJyZW50UXVlc3Rpb24udmFsdWUsIGFuc3dlcklzQ29tcGxldGU6IGFuc3dlci5hbnN3ZXJJc0NvbXBsZXRlfX0pO1xyXG5cclxuICAgIC8v0LzQvtC20LXRgiDQstC+0LfQvdC40LrQvdGD0YLRjCDRgdC40YLRg9Cw0YbQuNGPLCDQutC+0LPQtNCwINC90LXRgiDQvdC4INC+0LTQvdC+0Lkg0LDQu9GM0YLQtdGA0L3QsNGC0LjQstGLINC40LvQuCDRgdC10LrRhtC40Lgg0LTQu9GPINC+0YLQvtCx0YDQsNC20LXQvdC40Y8u0LIg0Y3RgtC+0Lwg0YHQu9GD0YfQsNC1INCy0L7Qv9GA0L7RgSDQv9C+0LrQsNC30YvQstCw0YLRjCDQvdC1INC90YPQttC90L4sINC60LDQuiDQvtGC0LLQtdGCINC30LDQv9C40YHRi9Cy0LDQtdC8IDAg0Lgg0L/QtdGA0LXRhdC+0LTQuNC8INC90LAg0YHQu9C10LTRg9GO0YnQuNC5XHJcbiAgICBjb25zdCBxdWVzdGlvbiA9IHRoaXMuI2ZpbmRRdWVzdGlvbkJ5R3VpZChldmVudERhdGEuZ3VpZCk7XHJcbiAgICAvL9GB0LjRgtGD0LDRhtC40Y8g0LTQu9GPIHNzL21zINCy0L7Qv9GA0L7RgdC+0LIsXHJcbiAgICBpZiAoISFxdWVzdGlvbiAmJiBhbnN3ZXIuYW5zd2VySXNDb21wbGV0ZSAmJiAocXVlc3Rpb24uUXVlc3Rpb25UeXBlID09PSAnU1MnIHx8IHF1ZXN0aW9uLlF1ZXN0aW9uVHlwZSA9PT0gJ01TJykgJiYgKGV2ZW50RGF0YS52aWV3ZWRBbHRlcm5hdGl2ZVZhbHVlcy5sZW5ndGggPT09IDApKSB7XHJcbiAgICAgIHRoaXMuZ29Ub05leHRRdWVzdGlvbigpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVMb2dpYyhsb2dpY1ZhcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lke1xyXG4gICAgT2JqZWN0LmVudHJpZXMobG9naWNWYXJzKS5mb3JFYWNoKChbdmFyTmFtZSwgdmFsdWVdKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0TG9naWNWYWx1ZSh2YXJOYW1lLCB2YWx1ZSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvL9Cy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INCw0LrRgtC40LLQvdGL0YUg0Y/Qt9GL0LrQvtCyXHJcbiAgZ2V0ICNhY3RpdmVMYW5nQ291bnQoKTogbnVtYmVyIHtcclxuICAgIC8v0LXRgdC70Lgg0LDQvdC60LXRgtCwINC/0L4g0LrQsNC60L7QuS3RgtC+INC/0YDQuNGH0LjQvdC1INC90YMg0YPQutCw0LfQsNC90LAsINCy0LXRgNC90ZHQvCAwXHJcbiAgICByZXR1cm4gdGhpcy4jcXVlc3Rpb25hcnk/LkJhc2VQYXJhbXMuTGFuZ3VhZ2VMaXN0LmZpbHRlciggbGFuZ09iaiA9PiBsYW5nT2JqLmlzQWN0aXZlKS5sZW5ndGggPz8gMDtcclxuICB9XHJcblxyXG4gIC8v0LLQvtC30LLRgNCw0YnQsNC10YIg0LrQvtC70LjRh9C10YHRgtCy0L4g0LLQvtC/0YDQvtGB0L7QslxyXG4gIGdldCAjcXVlc3Rpb25zQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLiNxdWVzdGlvbmFyeT8uUXVlc3Rpb25zLmxlbmd0aCA/PyAwO1xyXG4gIH1cclxuXHJcbiAgI2ZpbmlzaEludGVydmlldygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKTtcclxuICAgIGxldCByZXN1bHREaXJ0eTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJlc3VsdERpcnR5ID0gdGhpcy5fbG9naWMuZXhlY3V0ZUxvZ2ljKHRoaXMuI3F1ZXN0aW9uYXJ5Py5CYXNlUGFyYW1zLlJlc3VsdGF0aXZlU2NyaXB0ID8/ICcnKTtcclxuICAgIH1jYXRjaCAoZSkge1xyXG4gICAgICByZXN1bHREaXJ0eSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGludGVydmlldzogSUludGVydmlld0RhdGEgPSB7XHJcbiAgICAgIExhbmd1YWdlOiAwLCAgICAvL3RvZG8gbGFuZ1xyXG4gICAgICBTcG90SWQ6IDAsXHJcbiAgICAgIERldmljZUlkOiAwLFxyXG4gICAgICBEZXZpY2VUeXBlOiAwLFxyXG4gICAgICBSZXN1bHRhdGl2ZTogUmVzdWx0YXRpdmVTdGF0dXMucnNVbnNldCxcclxuICAgICAgVmFsaWQ6IFZhbGlkU3RhdHVzLnZzVW5zZXQsXHJcbiAgICAgIFdhdmU6IHRoaXMuI3F1ZXN0aW9uYXJ5Py5JbmZvLmN1cnJlbnRfd2F2ZSA/PyAwLFxyXG4gICAgICBRdWVzdGlvbmFyeU5hbWU6IHRoaXMuI3F1ZXN0aW9uYXJ5Py5JbmZvLm5hbWUgPz8gJycsXHJcbiAgICAgIFF1ZXN0aW9uYXJ5R3VpZDogdGhpcy4jcXVlc3Rpb25hcnk/LkluZm8ucXVlc3Rpb25hcnlfZ3VpZCA/PyAwLFxyXG4gICAgICBTdGFydGVkQXQ6IHRoaXMuX2ludGVydmlldy5zdGFydGVkQXQsXHJcbiAgICAgIEZpbmlzaGVkQXQ6IGN1cnJlbnRUaW1lLmdldFRpbWUoKSxcclxuICAgICAgVGluZVpvbmVCaWFzOiBjdXJyZW50VGltZS5nZXRUaW1lem9uZU9mZnNldCgpLFxyXG4gICAgICBSZXN1bHRhdERpcnR5OiByZXN1bHREaXJ0eSxcclxuICAgICAgQW5zd2Vyczoge1xyXG4gICAgICAgIEFuc3ZlcnNMaXN0OiBBcnJheS5mcm9tKHRoaXMuX2ludGVydmlldy5nZXRBbnN3ZXJMaXN0KCkpXHJcbiAgICAgIH0sXHJcbiAgICAgIGFkZGl0aW9uYWxfaW5mbzoge1xyXG4gICAgICAgIFF1ZXN0aW9uYXJ5VXBkYXRlVGltZXN0YW1wOiBuZXcgRGF0ZSh0aGlzLiNxdWVzdGlvbmFyeT8uSW5mby5sYXN0X3VwZGF0ZV90aW1lc3RhbXAgPz8gMCkuZ2V0VGltZSgpICxcclxuICAgICAgfSxcclxuICAgICAgUmVzdWx0UXVvdGFHdWlkczogW10sXHJcbiAgICAgIFJlc3VsdFF1b3RhMmRHdWlkczogW10sXHJcbiAgICAgIExvZ2ljVmFyczogW10sXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGxvZ2ljVmFycyA9IHRoaXMuX2xvZ2ljLmdldExvZ2ljVmFycygpO1xyXG4gICAgT2JqZWN0LmVudHJpZXMobG9naWNWYXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IGludGVydmlldy5Mb2dpY1ZhcnMucHVzaCh7bm06IGtleSwgdmw6IHZhbHVlfSkpO1xyXG5cclxuICAgIHRoaXMuX2V2ZW50QnVzLm5leHQoe2tleTogU3VydmV5RXZlbnRzLnNlU3VydmV5RW5kLCBkYXRhOiBpbnRlcnZpZXd9KTtcclxuICB9XHJcblxyXG4gICNuZXh0UXVlc3Rpb25OdW0oKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGN1cnJlbnRRdWVzdGlvbiA9IHRoaXMuI2N1cnJlbnRRdWVzdGlvbi52YWx1ZTtcclxuICAgIC8vINC/0YDQvtCy0LXRgNC40Lwg0LrQstC+0YLRi1xyXG4gICAgY29uc3QgY3VycmVudEd1aWQgPSBjdXJyZW50UXVlc3Rpb24/LlF1ZXN0aW9uR3VpZCA/PyAwO1xyXG4gICAgaWYgKHRoaXMuI3N1cnZleVF1b3Rhcy5xdW90YUlzQ29tcGxldGVkICYmICF0aGlzLiNzdXJ2ZXlRdW90YXMuZ3VpZElzRGVzdGluYXRpb25RdWVzdGlvbihjdXJyZW50R3VpZCkpIHtcclxuICAgICAgLy8g0YMg0L3QsNGBINC10YHRgtGMINC30LDQv9C+0LvQvdC10L3QvdCw0Y8g0LrQstC+0YLQsCwg0L3QsNC50LTQtdC8INCy0L7Qv9GA0L7RgSDQutC+0YLQvtGA0YvQuSDQvdGD0LbQvdC+INC/0L7QutCw0LfQsNGC0Ywg0L/RgNC4INC30LDQv9C+0LvQvdC10L3QuNC4INC60LLQvtGC0YtcclxuICAgICAgY29uc3QgZGVzdGluYXRpb25RID0gdGhpcy4jZmluZFF1ZXN0aW9uQnlHdWlkKHRoaXMuI3N1cnZleVF1b3Rhcy5kZXN0aW5hdGlvblF1ZXN0aW9uR3VpZCk7XHJcbiAgICAgIC8v0LXRgdC70Lgg0LLQvtC/0YDQvtGBINC10YHRgtGMKNC10LPQviDQvNC+0LPQu9C4INGD0LTQsNC70LjRgtGMINC40Lcg0LDQvdC60LXRgtGLKSwg0L/QvtC60LDQt9GL0LLQsNC10YIg0LXQs9C+XHJcbiAgICAgIGlmICghIWRlc3RpbmF0aW9uUSkge1xyXG4gICAgICAgIHJldHVybiBkZXN0aW5hdGlvblEuUXVlc3Rpb25OdW07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDQtdGB0LvQuCDQvdC10YIg0LfQsNC/0L7Qu9C90LXQvdC90L7QuSDQutCy0L7RgtGLLCDQv9C10YDQtdGF0L7QtNC40Lwg0L3QsCDRgdC70LXQtNGD0Y7RidC40Lkg0LLQvtC/0YDQvtGBLCDQuNGJ0LXQvCDRgdC70LXQtNGD0Y7RidC40Lkg0LLQvtC/0YDQvtGBINC60L7RgtC+0YDRi9C5INC80Ysg0LzQvtC20LXQvCDQvtGC0L7QsdGA0LDQt9C40YLRjCAo0LTQviDQu9C+0LPQuNC60LAg0LzQvtC20LXRgiDQt9Cw0L/RgNC10YLQuNGC0Ywg0L/QvtC60LDQtyDQstC+0L/RgNC+0YHQsClcclxuICAgIGxldCBuZXh0UXVlc3Rpb25OdW0gPSAoY3VycmVudFF1ZXN0aW9uPy5RdWVzdGlvbk51bSA/PyAwKSArIDE7XHJcblxyXG4gICAgLy8g0L3QviDRgdC90LDRh9Cw0LvQsCDQv9GA0L7QstC10YDQuNC8INC/0L7RgdC70LUg0LvQvtCz0LjQutGDXHJcbiAgICBpZiAoISFjdXJyZW50UXVlc3Rpb24pIHtcclxuICAgICAgY29uc3QgZGVzdFEgPSBjdXJyZW50UXVlc3Rpb24ubG9naWNsaXN0LmZpbmQobG9nT2JqID0+IChsb2dPYmouRGVzdGluYXRpb25RdWVzdGlvbkd1aWQgPiAwKSAmJiB0aGlzLl9sb2dpYy5leGVjdXRlTG9naWMobG9nT2JqLkxvZ2ljVGV4dCkgKTtcclxuICAgICAgaWYgKCEhZGVzdFEpIHtcclxuICAgICAgICBjb25zdCBkZXN0UU51bSA9IHRoaXMuI2ZpbmRRdWVzdGlvbkJ5R3VpZChkZXN0US5EZXN0aW5hdGlvblF1ZXN0aW9uR3VpZCk/LlF1ZXN0aW9uTnVtO1xyXG4gICAgICAgIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihkZXN0UU51bSkpIHsgLy8g0LLQvtC/0YDQvtGBINC80L7QsyDQsdGL0YLRjCDRg9C00LDQu9GR0L0sINCwINC70L7Qs9C40LrRgyDQvtGB0YLQsNCy0LjRgtGMXHJcbiAgICAgICAgICBuZXh0UXVlc3Rpb25OdW0gPSBkZXN0UU51bSE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g0L7QsdGJ0LXQtSDQutC+0LvQuNGH0LXRgdGC0LLQviDQstC+0L/RgNC+0YHQvtCyLCDRhtC40LrQuyDQsdGD0LTQtdGCINGB0YfQuNGC0LDRgtGMINC00L4g0Y3RgtC+0LPQviDQutC+0LvQuNGH0LXRgdGC0LLQsFxyXG4gICAgY29uc3QgcXVlc3Rpb25Db3VudCA9IHRoaXMuI3F1ZXN0aW9uc0NvdW50O1xyXG4gICAgZG8ge1xyXG4gICAgICAvL9C/0L7RgtC10L3RhtC40LDQu9GM0L3QviDRgdC70LXQtNGD0Y7RidC40Lkg0LLQvtC/0YDQvtGBXHJcbiAgICAgIGNvbnN0IHEgPSB0aGlzLiNxdWVzdGlvbmFyeSEuUXVlc3Rpb25zW25leHRRdWVzdGlvbk51bV07XHJcblxyXG4gICAgICAvL9C10YHQu9C4INGN0YLQviDQv9C+0YHQu9C10LTQvdC40Lkg0LLQvtC/0YDQvtGBINC40LvQuCDQtdGB0LvQuCDQstGL0L/QvtC70L3Rj9C10YLRgdGPIEJlZm9yZUV4cHJlc3Npb24g0Lgg0Y3RgtC+0YIg0LLQvtC/0YDQvtGBINC90LUgRGVzdGluYXRpb25RdW90YSwg0LzQvtC20LXQvCDQtdCz0L4g0L/QvtC60LDQt9Cw0YLRjFxyXG4gICAgICBpZiAocS5RdWVzdGlvblR5cGUgPT09IFF1ZXN0aW9uc1R5cGUuZXFFTkQgfHwgKHRoaXMuX2xvZ2ljLmV4ZWN1dGVMb2dpYyhxLkJlZm9yZUV4cHJlc3Npb24pICYmICF0aGlzLiNzdXJ2ZXlRdW90YXMuZ3VpZElzRGVzdGluYXRpb25RdWVzdGlvbihxLlF1ZXN0aW9uR3VpZCkpICkge1xyXG4gICAgICAgIHJldHVybiBuZXh0UXVlc3Rpb25OdW07XHJcbiAgICAgIH1cclxuICAgICAgLy/QstC+0L/RgNC+0YEg0L3QtdC70YzQt9GPINC/0L7QutCw0LfRi9Cy0LDRgtGMLCDRg9Cy0LXQu9C40YfQuNCy0LDQtdC8INGB0YfRkdGC0YfQuNC6INGC0LXQutGD0YnQtdCz0L4g0LLQvtC/0YDQvtGB0LAg0L3QsCAxXHJcbiAgICAgIG5leHRRdWVzdGlvbk51bSsrO1xyXG4gICAgfSB3aGlsZSAobmV4dFF1ZXN0aW9uTnVtIDwgcXVlc3Rpb25Db3VudCAtIDEpOyAvLyBlbmQg0LLQvtC/0YDQvtGBINC00L7Qu9C20LXQvSDQstGB0LXQs9C00LAg0LHRi9GC0Ywg0L/QvtC60LDQt9Cw0L1cclxuICAgIHJldHVybiBuZXh0UXVlc3Rpb25OdW07XHJcbiAgfVxyXG5cclxuICAjaW5pdGlhdGVRdWVzdGlvbnMocXVlc3Rpb25MaXN0OiBBcnJheTxJZGJRdWVzdGlvbj4pOiB2b2lke1xyXG4gICAgcXVlc3Rpb25MaXN0LmZvckVhY2gocXVlc3Rpb24gPT4ge1xyXG4gICAgICAvL9GB0L7Qt9C00LDRkdC8INC/0YPRgdGC0L7QuSDQvtGC0LLQtdGCINC00LvRjyDQstC+0L/RgNC+0YHQsC5cclxuICAgICAgY29uc3QgYW5zd2VyID0gdGhpcy5faW50ZXJ2aWV3LmNyZWF0ZUFuc3dlcihxdWVzdGlvbi5RdWVzdGlvbkd1aWQsIHF1ZXN0aW9uLlZlcnNpb24pO1xyXG5cclxuICAgICAgLy/RgtCw0LrQvtCz0L4g0LHRi9GC0Ywg0L3QtSDQtNC+0LvQttC90L4sINGN0YLQviDQvtGI0LjQsdC60LBcclxuICAgICAgaWYgKCFhbnN3ZXIpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Fuc3dlciBub3QgZm91bmQnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fbG9naWMuc2V0TG9naWNWYWx1ZShxdWVzdGlvbi5TeXNOYW1lLCBNSVNTSU5HX1ZBTFVFKTsgLy8g0L/QtdGA0LXQvNC10L3QvdCw0Y8g0YHQsNC80L7Qs9C+INCy0L7Qv9GA0L7RgdCwXHJcblxyXG4gICAgICAvL9C00L7QsdCw0LLQuNC8INC00L7QvyDQvtGC0LLQtdGC0Ysg0Lgg0LvQvtCz0LjQutGDINC00LvRjyDQvdC40YVcclxuICAgICAgcXVlc3Rpb24uQWRkaXRpb25hbEFuc3dlcmxpc3QuZm9yRWFjaChhYSA9PiB7XHJcbiAgICAgICAgYW5zd2VyLkFuc3dlckFkZGl0aW9uYWxbYWEuVmFsdWVdID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9sb2dpYy5zZXRMb2dpY1ZhbHVlKGAke3F1ZXN0aW9uLlN5c05hbWV9JHthYS5TeXNOYW1lfWAsIE1JU1NJTkdfVkFMVUUpOyAvLyDQu9C+0LPQuNC60LAg0LTQu9GPINC/0LXRgNC10LzQtdC90L3Ri9GFINC00L7QvyDQvtGC0LLQtdGC0LBcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyDQtdGB0LvQuCDQsiDRgtC10LrRgdGC0LUgcG9zdFNjcmlwdCDQtdGB0YLRjCDQt9Cw0L/QuNGB0Ywg0YLQuNC/0LAgc2V0VmFyKCd2YXJOYW1lJywgIHZhbHVlKTsgINC90YPQttC90L4g0LjQvdC40YbQuNCw0LvQuNC30LjRgNC+0LLQsNGC0Ywg0L/QtdGA0LXQvNC10L3QvdGD0Y4gdmFyTmFtZSDQt9C90LDRh9C10L3QuNC10LwgLTk3LlxyXG4gICAgICBpZiAoISFxdWVzdGlvbi5Qb3N0U2NyaXB0KSB7XHJcbiAgICAgICAgKHF1ZXN0aW9uLlBvc3RTY3JpcHQubWF0Y2goLyhcXGJzZXR2YXJcXGIpXFwoWyd8XCJdKC4qPylbJ3xcIl0vZ2ltKSA/PyBbXSkubWFwKHNjcmlwdFZhciA9PiBzY3JpcHRWYXIubWF0Y2goL1snfFwiXSguKylbJ3xcIl0vaSkhWzFdKS5mb3JFYWNoKHZhck5hbWUgPT4gdGhpcy5fbG9naWMuc2V0TG9naWNWYWx1ZSh2YXJOYW1lLCBudWxsKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vINC00LvRjyDQktC+0L/RgNC+0YHQvtCyIFNTL01TINC90YPQttC90L4g0L/RgNC+0L/QuNGB0LDRgtGMINC70L7Qs9C40LrRgyDQsNC70YzRgtC10YDQvdCw0YLQuNCyIHN5c25hbWUg0LLQvtC/0YDQvtGB0LAgKyBzeXNuYW1lINCw0LvRjNGC0LXRgNC90LDRgtC40LLRi1xyXG4gICAgICBpZiAocXVlc3Rpb24uU2VjdGlvbmxpc3QubGVuZ3RoIDw9IDApIHsvLyDQtNC70Y8g0JLQvtC/0YDQvtGB0L7QsiBTUy9NU1xyXG4gICAgICAgIHF1ZXN0aW9uLkFsdGVybmF0aXZlbGlzdC5mb3JFYWNoKGFsdCA9PiB0aGlzLl9sb2dpYy5zZXRMb2dpY1ZhbHVlKGAke3F1ZXN0aW9uLlN5c05hbWV9JHthbHQuU3lzTmFtZX1gLCBNSVNTSU5HX1ZBTFVFKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy/QtNC70Y8g0LLQvtC/0YDQvtGB0L7QsiDRgyDQutC+0YLQvtGA0YvRhSDQtdGB0YLRjCDRgdC10LrRhtC40Lgg0L/RgNC+0LjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXQvCDQutCw0LbQtNGD0Y4g0YHQtdC60YbQuNGOXHJcbiAgICAgICAgcXVlc3Rpb24uU2VjdGlvbmxpc3QuZm9yRWFjaChzZWN0aW9uID0+IHtcclxuXHJcbiAgICAgICAgICAvL9GB0L7Qt9C00LDRkdC8INC/0YPRgdGC0L7QuSDQvtGC0LLQtdGCINC00LvRjyDRgdC10LrRhtC40LguXHJcbiAgICAgICAgICBjb25zdCBhbnN3ZXJGb3JTZWN0aW9uID0gdGhpcy5faW50ZXJ2aWV3LmNyZWF0ZUFuc3dlcihzZWN0aW9uLlNlY3Rpb25HdWlkLCAxKTtcclxuXHJcbiAgICAgICAgICAvL9GC0LDQutC+0LPQviDQsdGL0YLRjCDQvdC1INC00L7Qu9C20L3Qviwg0Y3RgtC+INC+0YjQuNCx0LrQsFxyXG4gICAgICAgICAgaWYgKCFhbnN3ZXJGb3JTZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYW5zd2VyIG5vdCBmb3VuZCcpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vINC00LvRjyDQktC+0L/RgNC+0YHQvtCyIFNMINC90YPQttC90L4g0L/RgNC+0L/QuNGB0LDRgtGMINC70L7Qs9C40LrRgyDQsNC70YzRgtC10YDQvdCw0YLQuNCyINC4INGB0LXQutGG0LjQuSBzeXNuYW1lINGB0LXQutGG0LjQuCArIHN5c25hbWUg0LDQu9GM0YLQtdGA0L3QsNGC0LjQstGLXHJcbiAgICAgICAgICB0aGlzLl9sb2dpYy5zZXRMb2dpY1ZhbHVlKHNlY3Rpb24uU3lzTmFtZSwgTUlTU0lOR19WQUxVRSk7IC8vINC/0LXRgNC10LzQtdC90L3QsNGPINGB0LDQvNC+0Lkg0YHQtdC60YbQuNC4XHJcblxyXG4gICAgICAgICAgLy/Qu9C+0LPQuNC60LAg0LDQu9GM0YLQtdGA0L3QsNGC0LjQsiBTTCDQstC+0L/RgNC+0YHQsFxyXG4gICAgICAgICAgcXVlc3Rpb24uQWx0ZXJuYXRpdmVsaXN0LmZvckVhY2goYWx0ID0+IHRoaXMuX2xvZ2ljLnNldExvZ2ljVmFsdWUoYCR7c2VjdGlvbi5TeXNOYW1lfSR7YWx0LlN5c05hbWV9YCwgTUlTU0lOR19WQUxVRSkpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvL9C40YnQtdGCINCy0L7Qv9GA0L7RgSDQvdCwIGd1aWRcclxuICAjZmluZFF1ZXN0aW9uQnlHdWlkKGd1aWQ6IG51bWJlcik6IElkYlF1ZXN0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghdGhpcy4jcXVlc3Rpb25hcnkpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLiNxdWVzdGlvbmFyeS5RdWVzdGlvbnMuZmluZChxID0+IHEuUXVlc3Rpb25HdWlkID09PSBndWlkKTtcclxuICB9XHJcblxyXG4gICNuZXh0QnV0dG9uRXhwcmVzc2lvbklzVHJ1ZSgpOiBib29sZWFue1xyXG4gICAgY29uc3QgYnV0dG9uTmV4dEV4cHJlc3Npb24gPSB0aGlzLiNjdXJyZW50UXVlc3Rpb24udmFsdWU/LkJ0bk5leHRFeHByZXNzaW9uID8/ICcnO1xyXG4gICAgLy/QtdGB0LvQuCDRgdC60YDQuNC/0YLQsCDQtNC70Y8g0LrQvdC+0L/QutC4INC00LDQu9C10LUg0L3QtdGCLCDQstC10YDQvdGR0LwgdHJ1ZVxyXG4gICAgaWYgKGJ1dHRvbk5leHRFeHByZXNzaW9uLnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbG9naWMuZXhlY3V0ZUxvZ2ljKGJ1dHRvbk5leHRFeHByZXNzaW9uKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|