@deeksha2309/sunbird-collection-editor 8.0.7
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/collection-editor-cursor.service.mjs +3 -0
- package/esm2022/lib/collection-editor-library.component.mjs +16 -0
- package/esm2022/lib/collection-editor-library.module.mjs +137 -0
- package/esm2022/lib/components/answer/answer.component.mjs +43 -0
- package/esm2022/lib/components/asset-browser/asset-browser.component.mjs +325 -0
- package/esm2022/lib/components/asset-browser/asset-browser.data.mjs +53 -0
- package/esm2022/lib/components/assign-page-number/assign-page-number.component.mjs +191 -0
- package/esm2022/lib/components/ckeditor-tool/ckeditor-tool.component.mjs +895 -0
- package/esm2022/lib/components/collection-icon/collection-icon.component.mjs +43 -0
- package/esm2022/lib/components/contentplayer-page/contentplayer-page.component.mjs +351 -0
- package/esm2022/lib/components/csv-upload/csv-upload.component.mjs +178 -0
- package/esm2022/lib/components/dialcode/dialcode.component.mjs +182 -0
- package/esm2022/lib/components/editor/editor.component.mjs +1125 -0
- package/esm2022/lib/components/fancy-tree/fancy-tree.component.mjs +529 -0
- package/esm2022/lib/components/header/header.component.mjs +123 -0
- package/esm2022/lib/components/library/library.component.mjs +242 -0
- package/esm2022/lib/components/library-filter/library-filter.component.mjs +149 -0
- package/esm2022/lib/components/library-list/library-list.component.mjs +92 -0
- package/esm2022/lib/components/library-player/library-player.component.mjs +62 -0
- package/esm2022/lib/components/manage-collaborator/manage-collaborator.component.mjs +256 -0
- package/esm2022/lib/components/meta-form/meta-form.component.mjs +377 -0
- package/esm2022/lib/components/options/options.component.mjs +144 -0
- package/esm2022/lib/components/plain-tree/plain-tree.component.mjs +125 -0
- package/esm2022/lib/components/progress-status/progress-status.component.mjs +46 -0
- package/esm2022/lib/components/publish-checklist/publish-checklist.component.mjs +67 -0
- package/esm2022/lib/components/quality-params-modal/quality-params-modal.component.mjs +52 -0
- package/esm2022/lib/components/question/question.component.mjs +1360 -0
- package/esm2022/lib/components/quml-player/quml-player.component.mjs +73 -0
- package/esm2022/lib/components/qumlplayer-page/qumlplayer-page.component.mjs +84 -0
- package/esm2022/lib/components/resource-reorder/resource-reorder.component.mjs +143 -0
- package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +26 -0
- package/esm2022/lib/components/template/template.component.mjs +42 -0
- package/esm2022/lib/components/term-and-condition/term-and-condition.component.mjs +68 -0
- package/esm2022/lib/directives/telemetry-interact/telemetry-interact.directive.mjs +33 -0
- package/esm2022/lib/interfaces/McqForm.mjs +29 -0
- package/esm2022/lib/interfaces/editor.mjs +2 -0
- package/esm2022/lib/interfaces/framework.mjs +2 -0
- package/esm2022/lib/interfaces/httpOptions.mjs +2 -0
- package/esm2022/lib/interfaces/requestParam.mjs +2 -0
- package/esm2022/lib/interfaces/serverResponse.mjs +2 -0
- package/esm2022/lib/pipes/sanitize-html.pipe.mjs +20 -0
- package/esm2022/lib/services/config/category.config.json +8 -0
- package/esm2022/lib/services/config/config.service.mjs +27 -0
- package/esm2022/lib/services/config/editor.config.json +31 -0
- package/esm2022/lib/services/config/label.config.json +314 -0
- package/esm2022/lib/services/config/player.config.json +96 -0
- package/esm2022/lib/services/config/url.config.json +69 -0
- package/esm2022/lib/services/data/data.service.mjs +192 -0
- package/esm2022/lib/services/dialcode/dialcode.service.mjs +309 -0
- package/esm2022/lib/services/editor/editor.service.mjs +682 -0
- package/esm2022/lib/services/framework/framework.service.mjs +106 -0
- package/esm2022/lib/services/helper/helper.service.mjs +160 -0
- package/esm2022/lib/services/player/player.service.mjs +99 -0
- package/esm2022/lib/services/public-data/public-data.service.mjs +21 -0
- package/esm2022/lib/services/question/question.service.mjs +167 -0
- package/esm2022/lib/services/telemetry/telemetry.service.mjs +120 -0
- package/esm2022/lib/services/toaster/toaster.service.mjs +105 -0
- package/esm2022/lib/services/tree/tree.service.mjs +284 -0
- package/esm2022/project-sunbird-sunbird-collection-editor.mjs +5 -0
- package/esm2022/public-api.mjs +4 -0
- package/fesm2022/project-sunbird-sunbird-collection-editor.mjs +10138 -0
- package/fesm2022/project-sunbird-sunbird-collection-editor.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/assets/.gitkeep +0 -0
- package/lib/assets/images/MCQ.png +0 -0
- package/lib/assets/images/Spin.gif +0 -0
- package/lib/assets/images/bulkuploadfile.png +0 -0
- package/lib/assets/images/cancel-sign copy.png +0 -0
- package/lib/assets/images/cancel-sign.png +0 -0
- package/lib/assets/images/emptyResult.svg +1 -0
- package/lib/assets/images/icons-rtl.gif +0 -0
- package/lib/assets/images/icons.gif +0 -0
- package/lib/assets/images/imageicon.svg +16 -0
- package/lib/assets/images/imageicon_blue.svg +16 -0
- package/lib/assets/images/layoutoneicon.svg +16 -0
- package/lib/assets/images/layoutoneicon_blue.svg +16 -0
- package/lib/assets/images/layoutthreeicon.svg +18 -0
- package/lib/assets/images/layoutthreeicon_blue.svg +18 -0
- package/lib/assets/images/layouttwoicon.svg +18 -0
- package/lib/assets/images/layouttwoicon_blue.svg +18 -0
- package/lib/assets/images/leftalignicon.svg +17 -0
- package/lib/assets/images/leftalignicon_blue.svg +17 -0
- package/lib/assets/images/loader.gif +0 -0
- package/lib/assets/images/loader.svg +1 -0
- package/lib/assets/images/loading.gif +0 -0
- package/lib/assets/images/middlealignicon.svg +17 -0
- package/lib/assets/images/middlealignicon_blue.svg +17 -0
- package/lib/assets/images/question_collection.svg +18 -0
- package/lib/assets/images/rightalignicon.svg +17 -0
- package/lib/assets/images/rightalignicon_blue.svg +17 -0
- package/lib/assets/images/vline-rtl.gif +0 -0
- package/lib/assets/images/vline.gif +0 -0
- package/lib/assets/images/writing.png +0 -0
- package/lib/collection-editor-cursor.service.d.ts +5 -0
- package/lib/collection-editor-cursor.service.d.ts.map +1 -0
- package/lib/collection-editor-library.component.d.ts +9 -0
- package/lib/collection-editor-library.component.d.ts.map +1 -0
- package/lib/collection-editor-library.module.d.ts +50 -0
- package/lib/collection-editor-library.module.d.ts.map +1 -0
- package/lib/components/answer/answer.component.d.ts +24 -0
- package/lib/components/answer/answer.component.d.ts.map +1 -0
- package/lib/components/asset-browser/asset-browser.component.d.ts +81 -0
- package/lib/components/asset-browser/asset-browser.component.d.ts.map +1 -0
- package/lib/components/asset-browser/asset-browser.data.d.ts +52 -0
- package/lib/components/asset-browser/asset-browser.data.d.ts.map +1 -0
- package/lib/components/assign-page-number/assign-page-number.component.d.ts +38 -0
- package/lib/components/assign-page-number/assign-page-number.component.d.ts.map +1 -0
- package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts +161 -0
- package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts.map +1 -0
- package/lib/components/collection-icon/collection-icon.component.d.ts +18 -0
- package/lib/components/collection-icon/collection-icon.component.d.ts.map +1 -0
- package/lib/components/contentplayer-page/contentplayer-page.component.d.ts +54 -0
- package/lib/components/contentplayer-page/contentplayer-page.component.d.ts.map +1 -0
- package/lib/components/csv-upload/csv-upload.component.d.ts +42 -0
- package/lib/components/csv-upload/csv-upload.component.d.ts.map +1 -0
- package/lib/components/dialcode/dialcode.component.d.ts +48 -0
- package/lib/components/dialcode/dialcode.component.d.ts.map +1 -0
- package/lib/components/editor/editor.component.d.ts +146 -0
- package/lib/components/editor/editor.component.d.ts.map +1 -0
- package/lib/components/fancy-tree/fancy-tree.component.d.ts +77 -0
- package/lib/components/fancy-tree/fancy-tree.component.d.ts.map +1 -0
- package/lib/components/header/header.component.d.ts +46 -0
- package/lib/components/header/header.component.d.ts.map +1 -0
- package/lib/components/library/library.component.d.ts +69 -0
- package/lib/components/library/library.component.d.ts.map +1 -0
- package/lib/components/library-filter/library-filter.component.d.ts +47 -0
- package/lib/components/library-filter/library-filter.component.d.ts.map +1 -0
- package/lib/components/library-list/library-list.component.d.ts +32 -0
- package/lib/components/library-list/library-list.component.d.ts.map +1 -0
- package/lib/components/library-player/library-player.component.d.ts +24 -0
- package/lib/components/library-player/library-player.component.d.ts.map +1 -0
- package/lib/components/manage-collaborator/manage-collaborator.component.d.ts +75 -0
- package/lib/components/manage-collaborator/manage-collaborator.component.d.ts.map +1 -0
- package/lib/components/meta-form/meta-form.component.d.ts +51 -0
- package/lib/components/meta-form/meta-form.component.d.ts.map +1 -0
- package/lib/components/options/options.component.d.ts +53 -0
- package/lib/components/options/options.component.d.ts.map +1 -0
- package/lib/components/plain-tree/plain-tree.component.d.ts +20 -0
- package/lib/components/plain-tree/plain-tree.component.d.ts.map +1 -0
- package/lib/components/progress-status/progress-status.component.d.ts +25 -0
- package/lib/components/progress-status/progress-status.component.d.ts.map +1 -0
- package/lib/components/publish-checklist/publish-checklist.component.d.ts +23 -0
- package/lib/components/publish-checklist/publish-checklist.component.d.ts.map +1 -0
- package/lib/components/quality-params-modal/quality-params-modal.component.d.ts +24 -0
- package/lib/components/quality-params-modal/quality-params-modal.component.d.ts.map +1 -0
- package/lib/components/question/question.component.d.ts +215 -0
- package/lib/components/question/question.component.d.ts.map +1 -0
- package/lib/components/quml-player/quml-player.component.d.ts +26 -0
- package/lib/components/quml-player/quml-player.component.d.ts.map +1 -0
- package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts +31 -0
- package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts.map +1 -0
- package/lib/components/resource-reorder/resource-reorder.component.d.ts +45 -0
- package/lib/components/resource-reorder/resource-reorder.component.d.ts.map +1 -0
- package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +13 -0
- package/lib/components/skeleton-loader/skeleton-loader.component.d.ts.map +1 -0
- package/lib/components/template/template.component.d.ts +21 -0
- package/lib/components/template/template.component.d.ts.map +1 -0
- package/lib/components/term-and-condition/term-and-condition.component.d.ts +26 -0
- package/lib/components/term-and-condition/term-and-condition.component.d.ts.map +1 -0
- package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts +27 -0
- package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts.map +1 -0
- package/lib/interfaces/McqForm.d.ts +32 -0
- package/lib/interfaces/McqForm.d.ts.map +1 -0
- package/lib/interfaces/editor.d.ts +78 -0
- package/lib/interfaces/editor.d.ts.map +1 -0
- package/lib/interfaces/framework.d.ts +46 -0
- package/lib/interfaces/framework.d.ts.map +1 -0
- package/lib/interfaces/httpOptions.d.ts +35 -0
- package/lib/interfaces/httpOptions.d.ts.map +1 -0
- package/lib/interfaces/requestParam.d.ts +24 -0
- package/lib/interfaces/requestParam.d.ts.map +1 -0
- package/lib/interfaces/serverResponse.d.ts +38 -0
- package/lib/interfaces/serverResponse.d.ts.map +1 -0
- package/lib/pipes/sanitize-html.pipe.d.ts +11 -0
- package/lib/pipes/sanitize-html.pipe.d.ts.map +1 -0
- package/lib/services/config/config.service.d.ts +13 -0
- package/lib/services/config/config.service.d.ts.map +1 -0
- package/lib/services/data/data.service.d.ts +85 -0
- package/lib/services/data/data.service.d.ts.map +1 -0
- package/lib/services/dialcode/dialcode.service.d.ts +36 -0
- package/lib/services/dialcode/dialcode.service.d.ts.map +1 -0
- package/lib/services/editor/editor.service.d.ts +150 -0
- package/lib/services/editor/editor.service.d.ts.map +1 -0
- package/lib/services/framework/framework.service.d.ts +35 -0
- package/lib/services/framework/framework.service.d.ts.map +1 -0
- package/lib/services/helper/helper.service.d.ts +41 -0
- package/lib/services/helper/helper.service.d.ts.map +1 -0
- package/lib/services/player/player.service.d.ts +33 -0
- package/lib/services/player/player.service.d.ts.map +1 -0
- package/lib/services/public-data/public-data.service.d.ts +15 -0
- package/lib/services/public-data/public-data.service.d.ts.map +1 -0
- package/lib/services/question/question.service.d.ts +30 -0
- package/lib/services/question/question.service.d.ts.map +1 -0
- package/lib/services/telemetry/telemetry.service.d.ts +45 -0
- package/lib/services/telemetry/telemetry.service.d.ts.map +1 -0
- package/lib/services/toaster/toaster.service.d.ts +50 -0
- package/lib/services/toaster/toaster.service.d.ts.map +1 -0
- package/lib/services/tree/tree.service.d.ts +51 -0
- package/lib/services/tree/tree.service.d.ts.map +1 -0
- package/package.json +32 -0
- package/project-sunbird-sunbird-collection-editor.d.ts.map +1 -0
- package/public-api.d.ts +4 -0
- package/public-api.d.ts.map +1 -0
|
@@ -0,0 +1,1360 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import * as _ from 'lodash-es';
|
|
3
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
4
|
+
import { McqForm } from '../../interfaces/McqForm';
|
|
5
|
+
import { throwError, Subject } from 'rxjs';
|
|
6
|
+
import { filter, finalize, take, takeUntil } from 'rxjs/operators';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../../services/question/question.service";
|
|
9
|
+
import * as i2 from "../../services/editor/editor.service";
|
|
10
|
+
import * as i3 from "../../services/telemetry/telemetry.service";
|
|
11
|
+
import * as i4 from "../../services/player/player.service";
|
|
12
|
+
import * as i5 from "../../services/toaster/toaster.service";
|
|
13
|
+
import * as i6 from "../../services/tree/tree.service";
|
|
14
|
+
import * as i7 from "../../services/framework/framework.service";
|
|
15
|
+
import * as i8 from "@angular/router";
|
|
16
|
+
import * as i9 from "../../services/config/config.service";
|
|
17
|
+
import * as i10 from "../../collection-editor-cursor.service";
|
|
18
|
+
import * as i11 from "@angular/common";
|
|
19
|
+
import * as i12 from "@angular/forms";
|
|
20
|
+
import * as i13 from "@project-sunbird/ng2-semantic-ui";
|
|
21
|
+
import * as i14 from "@project-sunbird/common-form-elements-full";
|
|
22
|
+
import * as i15 from "../header/header.component";
|
|
23
|
+
import * as i16 from "../options/options.component";
|
|
24
|
+
import * as i17 from "../answer/answer.component";
|
|
25
|
+
import * as i18 from "../ckeditor-tool/ckeditor-tool.component";
|
|
26
|
+
import * as i19 from "../../directives/telemetry-interact/telemetry-interact.directive";
|
|
27
|
+
import * as i20 from "../quml-player/quml-player.component";
|
|
28
|
+
import * as i21 from "../term-and-condition/term-and-condition.component";
|
|
29
|
+
import * as i22 from "../quality-params-modal/quality-params-modal.component";
|
|
30
|
+
const evidenceMimeType = '';
|
|
31
|
+
const evidenceSizeLimit = '20480';
|
|
32
|
+
export class QuestionComponent {
|
|
33
|
+
constructor(questionService, editorService, telemetryService, playerService, toasterService, treeService, frameworkService, router, configService, editorCursor) {
|
|
34
|
+
this.questionService = questionService;
|
|
35
|
+
this.editorService = editorService;
|
|
36
|
+
this.telemetryService = telemetryService;
|
|
37
|
+
this.playerService = playerService;
|
|
38
|
+
this.toasterService = toasterService;
|
|
39
|
+
this.treeService = treeService;
|
|
40
|
+
this.frameworkService = frameworkService;
|
|
41
|
+
this.router = router;
|
|
42
|
+
this.configService = configService;
|
|
43
|
+
this.editorCursor = editorCursor;
|
|
44
|
+
this.QumlPlayerConfig = {};
|
|
45
|
+
this.questionEmitter = new EventEmitter();
|
|
46
|
+
this.onComponentDestroy$ = new Subject();
|
|
47
|
+
this.toolbarConfig = {};
|
|
48
|
+
this.editorState = {};
|
|
49
|
+
this.showPreview = false;
|
|
50
|
+
this.mediaArr = [];
|
|
51
|
+
this.videoShow = false;
|
|
52
|
+
this.showFormError = false;
|
|
53
|
+
this.showSolutionDropDown = true;
|
|
54
|
+
this.showSolution = false;
|
|
55
|
+
this.solutionTypes = [{
|
|
56
|
+
type: 'html',
|
|
57
|
+
value: 'Text+Image'
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
type: 'video',
|
|
61
|
+
value: 'video'
|
|
62
|
+
}];
|
|
63
|
+
this.setCharacterLimit = 160;
|
|
64
|
+
this.showLoader = true;
|
|
65
|
+
this.showConfirmPopup = false;
|
|
66
|
+
this.validQuestionData = false;
|
|
67
|
+
this.pageId = 'question';
|
|
68
|
+
this.frameworkDetails = {};
|
|
69
|
+
this.questionMetadataFormStatus = true;
|
|
70
|
+
this.buttonLoaders = {
|
|
71
|
+
saveButtonLoader: false,
|
|
72
|
+
review: false
|
|
73
|
+
};
|
|
74
|
+
this.showTranslation = false;
|
|
75
|
+
this.sliderDatas = {};
|
|
76
|
+
this.sliderOptions = {};
|
|
77
|
+
this.categoryLabel = {};
|
|
78
|
+
this.condition = 'default';
|
|
79
|
+
this.responseVariable = 'response1';
|
|
80
|
+
this.options = [];
|
|
81
|
+
this.isChildQuestion = false;
|
|
82
|
+
this.maxScore = 1;
|
|
83
|
+
this.showQualityParameterPopup = false;
|
|
84
|
+
this.isReadOnlyMode = false;
|
|
85
|
+
this.showSubmitConfirmPopup = false;
|
|
86
|
+
this.showReviewModal = false;
|
|
87
|
+
this.contentComment = '';
|
|
88
|
+
const { primaryCategory } = this.editorService.selectedChildren;
|
|
89
|
+
this.questionPrimaryCategory = primaryCategory;
|
|
90
|
+
this.pageStartTime = Date.now();
|
|
91
|
+
}
|
|
92
|
+
ngOnInit() {
|
|
93
|
+
const { questionSetId, questionId, type, category, creationContext, creationMode } = this.questionInput;
|
|
94
|
+
this.questionInteractionType = type;
|
|
95
|
+
this.questionId = questionId;
|
|
96
|
+
this.questionSetId = questionSetId;
|
|
97
|
+
this.toolbarConfig = this.editorService.getToolbarConfig();
|
|
98
|
+
this.toolbarConfig.showPreview = this.editorService.editorMode !== 'edit';
|
|
99
|
+
this.toolbarConfig.add_translation = true;
|
|
100
|
+
this.treeNodeData = this.treeService.getFirstChild();
|
|
101
|
+
if (_.get(this.creationContext, 'objectType') === 'question') {
|
|
102
|
+
this.toolbarConfig.questionContribution = true;
|
|
103
|
+
}
|
|
104
|
+
this.solutionUUID = uuidv4();
|
|
105
|
+
this.telemetryService.telemetryPageId = this.pageId;
|
|
106
|
+
this.initialLeafFormConfig = _.cloneDeep(this.leafFormConfig);
|
|
107
|
+
this.initialize();
|
|
108
|
+
this.framework = _.get(this.editorService.editorConfig, 'context.framework');
|
|
109
|
+
this.qualityFormConfig = this.editorService.qualityFormConfig;
|
|
110
|
+
}
|
|
111
|
+
fetchFrameWorkDetails() {
|
|
112
|
+
this.frameworkService.frameworkData$.pipe(takeUntil(this.onComponentDestroy$), filter(data => _.get(data, `frameworkdata.${this.framework}`)), take(1)).subscribe((frameworkDetails) => {
|
|
113
|
+
if (frameworkDetails && !frameworkDetails.err) {
|
|
114
|
+
const frameworkData = frameworkDetails.frameworkdata[this.framework].categories;
|
|
115
|
+
this.frameworkDetails.frameworkData = frameworkData;
|
|
116
|
+
this.frameworkDetails.topicList = _.get(_.find(frameworkData, { code: 'topic' }), 'terms');
|
|
117
|
+
this.populateFrameworkData();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
populateFrameworkData() {
|
|
122
|
+
const categoryMasterList = this.frameworkDetails.frameworkData;
|
|
123
|
+
_.forEach(categoryMasterList, (category) => {
|
|
124
|
+
_.forEach(this.leafFormConfig, (formFieldCategory) => {
|
|
125
|
+
if (category.code === formFieldCategory.code) {
|
|
126
|
+
formFieldCategory.terms = category.terms;
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
ngAfterViewInit() {
|
|
132
|
+
this.telemetryService.impression({
|
|
133
|
+
type: 'edit', pageid: this.telemetryService.telemetryPageId, uri: this.router.url,
|
|
134
|
+
duration: (Date.now() - this.pageStartTime) / 1000
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
initialize() {
|
|
138
|
+
this.editorService.fetchCollectionHierarchy(this.questionSetId).subscribe((response) => {
|
|
139
|
+
this.questionSetHierarchy = _.get(response, 'result.questionSet');
|
|
140
|
+
const parentId = this.editorService.parentIdentifier ? this.editorService.parentIdentifier : this.questionId;
|
|
141
|
+
//only for observation,survey,observation with rubrics
|
|
142
|
+
if (!_.isUndefined(parentId) && !_.isUndefined(this.editorService.editorConfig.config.renderTaxonomy)) {
|
|
143
|
+
this.getParentQuestionOptions(parentId);
|
|
144
|
+
const sectionData = this.treeService.getNodeById(parentId);
|
|
145
|
+
const children = _.get(response, 'result.questionSet.children');
|
|
146
|
+
this.sectionPrimaryCategory = _.get(response, 'result.questionSet.primaryCategory');
|
|
147
|
+
this.selectedSectionId = _.get(sectionData, 'data.metadata.parent');
|
|
148
|
+
this.getBranchingLogic(children);
|
|
149
|
+
}
|
|
150
|
+
this.questionFormConfig = _.cloneDeep(this.leafFormConfig);
|
|
151
|
+
let leafFormConfigFields = _.join(_.map(this.leafFormConfig, value => (value.code)), ',');
|
|
152
|
+
leafFormConfigFields += ',isReviewModificationAllowed';
|
|
153
|
+
if (!_.isUndefined(this.questionId)) {
|
|
154
|
+
this.questionService.readQuestion(this.questionId, leafFormConfigFields)
|
|
155
|
+
.subscribe((res) => {
|
|
156
|
+
if (_.get(res, 'result')) {
|
|
157
|
+
this.questionMetaData = _.get(res, 'result.question');
|
|
158
|
+
this.questionPrimaryCategory = _.get(this.questionMetaData, 'primaryCategory');
|
|
159
|
+
// tslint:disable-next-line:max-line-length
|
|
160
|
+
this.questionInteractionType = _.get(this.questionMetaData, 'interactionTypes') ? _.get(this.questionMetaData, 'interactionTypes[0]') : 'default';
|
|
161
|
+
this.editorService.setIsReviewModificationAllowed(_.get(this.questionMetaData, 'isReviewModificationAllowed', false));
|
|
162
|
+
this.populateFormData();
|
|
163
|
+
if (this.questionInteractionType === 'default') {
|
|
164
|
+
if (this.questionMetaData.editorState) {
|
|
165
|
+
this.editorState = this.questionMetaData.editorState;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (this.questionInteractionType === 'choice') {
|
|
169
|
+
const responseDeclaration = this.questionMetaData.responseDeclaration;
|
|
170
|
+
const templateId = this.questionMetaData.templateId;
|
|
171
|
+
const numberOfOptions = this.questionMetaData?.editorState?.options?.length || 0;
|
|
172
|
+
const maximumOptions = _.get(this.questionInput, 'config.maximumOptions');
|
|
173
|
+
this.editorService.optionsLength = numberOfOptions;
|
|
174
|
+
const options = _.map(this.questionMetaData?.editorState?.options, option => ({ body: option.value.body }));
|
|
175
|
+
const question = this.questionMetaData?.editorState?.question;
|
|
176
|
+
const interactions = this.questionMetaData?.interactions;
|
|
177
|
+
this.editorState = new McqForm({
|
|
178
|
+
question, options, answer: _.get(responseDeclaration, 'response1.correctResponse.value')
|
|
179
|
+
}, { templateId, numberOfOptions, maximumOptions });
|
|
180
|
+
this.editorState.solutions = this.questionMetaData?.editorState?.solutions;
|
|
181
|
+
this.editorState.interactions = interactions;
|
|
182
|
+
if (_.has(this.questionMetaData, 'responseDeclaration')) {
|
|
183
|
+
this.editorState.responseDeclaration = _.get(this.questionMetaData, 'responseDeclaration');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (_.has(this.questionMetaData, 'primaryCategory')) {
|
|
187
|
+
this.editorState.primaryCategory = _.get(this.questionMetaData, 'primaryCategory');
|
|
188
|
+
}
|
|
189
|
+
this.setQuestionTitle(this.questionId);
|
|
190
|
+
if (!_.isEmpty(this.editorState.solutions)) {
|
|
191
|
+
this.selectedSolutionType = this.editorState.solutions[0].type;
|
|
192
|
+
this.solutionUUID = this.editorState.solutions[0].id;
|
|
193
|
+
this.showSolutionDropDown = false;
|
|
194
|
+
this.showSolution = true;
|
|
195
|
+
if (this.selectedSolutionType === 'video') {
|
|
196
|
+
const index = _.findIndex(this.questionMetaData.media, (o) => {
|
|
197
|
+
return o.type === 'video' && o.id === this.editorState.solutions[0].value;
|
|
198
|
+
});
|
|
199
|
+
this.videoSolutionName = this.questionMetaData.media[index].name;
|
|
200
|
+
this.videoThumbnail = this.questionMetaData.media[index].thumbnail;
|
|
201
|
+
}
|
|
202
|
+
if (this.selectedSolutionType === 'html') {
|
|
203
|
+
this.editorState.solutions = this.editorState.solutions[0].value;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (this.questionMetaData.media) {
|
|
207
|
+
this.mediaArr = this.questionMetaData.media;
|
|
208
|
+
}
|
|
209
|
+
/** for observation and survey to show hint,tip,dependent question option. */
|
|
210
|
+
if (!_.isUndefined(this.editorService?.editorConfig?.config?.renderTaxonomy)) {
|
|
211
|
+
this.subMenuConfig();
|
|
212
|
+
}
|
|
213
|
+
this.contentComment = _.get(this.creationContext, 'correctionComments');
|
|
214
|
+
if (this.showPreview) {
|
|
215
|
+
this.previewContent();
|
|
216
|
+
}
|
|
217
|
+
this.showLoader = false;
|
|
218
|
+
}
|
|
219
|
+
}, (err) => {
|
|
220
|
+
const errInfo = {
|
|
221
|
+
errorMsg: 'Fetching question details failed. Please try again...',
|
|
222
|
+
};
|
|
223
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
if (_.isUndefined(this.questionId)) {
|
|
227
|
+
this.tempQuestionId = uuidv4();
|
|
228
|
+
this.populateFormData();
|
|
229
|
+
this.setQuestionTitle();
|
|
230
|
+
if (this.questionInteractionType === 'default') {
|
|
231
|
+
let editorState;
|
|
232
|
+
if (this.questionCategory) {
|
|
233
|
+
editorState = _.get(this.configService, `editorConfig.defaultStates.nonInteractiveQuestions.${this.questionCategory}`);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this.editorState = { question: '', answer: '', solutions: '' };
|
|
237
|
+
}
|
|
238
|
+
if (editorState) {
|
|
239
|
+
this.editorState = { ...editorState };
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
else if (this.questionInteractionType === 'choice') {
|
|
243
|
+
this.editorState = new McqForm({ question: '', options: [] }, { numberOfOptions: _.get(this.questionInput, 'config.numberOfOptions'), maximumOptions: _.get(this.questionInput, 'config.maximumOptions') });
|
|
244
|
+
}
|
|
245
|
+
/** for observation and survey to show hint,tip,dependent question option. */
|
|
246
|
+
if (!_.isUndefined(this.editorService?.editorConfig?.config?.renderTaxonomy)) {
|
|
247
|
+
this.subMenuConfig();
|
|
248
|
+
}
|
|
249
|
+
this.showLoader = false;
|
|
250
|
+
}
|
|
251
|
+
}, (err) => {
|
|
252
|
+
const errInfo = {
|
|
253
|
+
errorMsg: 'Fetching question set details failed. Please try again...',
|
|
254
|
+
};
|
|
255
|
+
this.editorService.apiErrorHandling(err, errInfo);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
get contentPolicyUrl() {
|
|
259
|
+
return this.editorService.contentPolicyUrl;
|
|
260
|
+
}
|
|
261
|
+
toolbarEventListener(event) {
|
|
262
|
+
switch (event.button) {
|
|
263
|
+
case 'saveContent':
|
|
264
|
+
this.saveContent();
|
|
265
|
+
break;
|
|
266
|
+
case 'cancelContent':
|
|
267
|
+
this.handleRedirectToQuestionset();
|
|
268
|
+
break;
|
|
269
|
+
case 'backContent':
|
|
270
|
+
this.handleRedirectToQuestionset();
|
|
271
|
+
break;
|
|
272
|
+
case 'previewContent':
|
|
273
|
+
this.previewContent();
|
|
274
|
+
break;
|
|
275
|
+
case 'editContent':
|
|
276
|
+
this.isReadOnlyMode = false;
|
|
277
|
+
this.showPreview = false;
|
|
278
|
+
this.toolbarConfig.showPreview = false;
|
|
279
|
+
this.previewFormData(!this.toolbarConfig.showPreview);
|
|
280
|
+
break;
|
|
281
|
+
case 'showReviewcomments':
|
|
282
|
+
this.showReviewModal = !this.showReviewModal;
|
|
283
|
+
break;
|
|
284
|
+
case 'saveQualityParameters':
|
|
285
|
+
this.showQualityParameterPopup = true;
|
|
286
|
+
break;
|
|
287
|
+
default:
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
handleRedirectToQuestionset() {
|
|
292
|
+
if (_.isUndefined(this.questionId)) {
|
|
293
|
+
this.showConfirmPopup = true;
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
this.redirectToQuestionset();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
submitHandler() {
|
|
300
|
+
this.validateQuestionData();
|
|
301
|
+
this.validateFormFields();
|
|
302
|
+
if (this.showFormError === false) {
|
|
303
|
+
this.showSubmitConfirmPopup = true;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
saveContent() {
|
|
307
|
+
this.validateQuestionData();
|
|
308
|
+
if (this.showFormError === false && this.questionMetadataFormStatus === true) {
|
|
309
|
+
this.saveQuestion();
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.044'));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
onConsentSubmit(event) {
|
|
316
|
+
this.showSubmitConfirmPopup = false;
|
|
317
|
+
if (event) {
|
|
318
|
+
this.questionMetaData = _.assign(this.questionMetaData, { isReviewModificationAllowed: event.editingConsent });
|
|
319
|
+
this.sendForReview();
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
sendForReview() {
|
|
323
|
+
if (!_.get(this.editorService.editorConfig, 'config.skipTwoLevelReview')) {
|
|
324
|
+
let callback = function () {
|
|
325
|
+
this.editorService.reviewContent(this.questionId).subscribe(data => {
|
|
326
|
+
this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.002'));
|
|
327
|
+
this.redirectToChapterList();
|
|
328
|
+
}, err => {
|
|
329
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.002'));
|
|
330
|
+
});
|
|
331
|
+
};
|
|
332
|
+
if (!this.questionId) {
|
|
333
|
+
callback = function () {
|
|
334
|
+
this.editorService.reviewContent(this.questionId).subscribe(data => {
|
|
335
|
+
this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.002'));
|
|
336
|
+
this.addResourceToQuestionset();
|
|
337
|
+
}, err => {
|
|
338
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.002'));
|
|
339
|
+
});
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
callback = callback.bind(this);
|
|
343
|
+
this.upsertQuestion(callback);
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
const publishCallback = this.sendQuestionForPublish.bind(this);
|
|
347
|
+
const callback = this.addResourceToQuestionset.bind(this, publishCallback);
|
|
348
|
+
this.upsertQuestion(callback);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
requestForChanges(comment) {
|
|
352
|
+
this.editorService.submitRequestChanges(this.questionId, comment).subscribe(res => {
|
|
353
|
+
this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.003'));
|
|
354
|
+
this.redirectToChapterList();
|
|
355
|
+
}, err => {
|
|
356
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.003'));
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
sendQuestionForPublish(event) {
|
|
360
|
+
this.editorService.publishContent(this.questionId, event).subscribe(res => {
|
|
361
|
+
if (!(this.creationMode === 'sourcingReview' && this.editorService.isReviewModificationAllowed)) {
|
|
362
|
+
this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.037'));
|
|
363
|
+
}
|
|
364
|
+
this.redirectToChapterList();
|
|
365
|
+
}, err => {
|
|
366
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.038'));
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
rejectQuestion(comment) {
|
|
370
|
+
const editableFields = _.get(this.creationContext, 'editableFields');
|
|
371
|
+
if (this.creationMode === 'orgreview' && editableFields && !_.isEmpty(editableFields[this.creationMode])) {
|
|
372
|
+
this.validateFormFields();
|
|
373
|
+
if (this.showFormError === true) {
|
|
374
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.029'));
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
let callback = this.requestForChanges.bind(this, [comment]);
|
|
378
|
+
this.upsertQuestion(callback);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
this.requestForChanges(comment);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
publishQuestion(event) {
|
|
385
|
+
const editableFields = _.get(this.creationContext, 'editableFields');
|
|
386
|
+
if (this.creationMode === 'orgreview' && editableFields && !_.isEmpty(editableFields[this.creationMode])) {
|
|
387
|
+
this.validateFormFields();
|
|
388
|
+
if (this.showFormError === true) {
|
|
389
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.029'));
|
|
390
|
+
return false;
|
|
391
|
+
}
|
|
392
|
+
let callback = this.sendQuestionForPublish.bind(this, [event]);
|
|
393
|
+
this.upsertQuestion(callback);
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
this.sendQuestionForPublish(event);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
sourcingUpdate(event) {
|
|
400
|
+
const editableFields = _.get(this.creationContext, 'editableFields');
|
|
401
|
+
if (this.creationMode === 'sourcingreview' && editableFields && !_.isEmpty(editableFields[this.creationMode])) {
|
|
402
|
+
this.validateFormFields();
|
|
403
|
+
if (this.showFormError === true) {
|
|
404
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.029'));
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
let questionIds = [];
|
|
409
|
+
//let comments = {};
|
|
410
|
+
let comments = event.comment;
|
|
411
|
+
let successMessage = '';
|
|
412
|
+
this.editorService.fetchCollectionHierarchy(this.questionSetId).subscribe(res => {
|
|
413
|
+
const questionSet = res.result['questionSet'];
|
|
414
|
+
switch (event.button) {
|
|
415
|
+
case 'sourcingApproveQuestion':
|
|
416
|
+
questionIds = questionSet.acceptedContributions || [];
|
|
417
|
+
successMessage = _.get(this.configService, 'labelConfig.messages.success.038');
|
|
418
|
+
break;
|
|
419
|
+
case 'sourcingRejectQuestion':
|
|
420
|
+
questionIds = questionSet.rejectedContributions || [];
|
|
421
|
+
comments = questionSet.rejectedContributionComments || {};
|
|
422
|
+
comments[this.questionId] = event.comment;
|
|
423
|
+
successMessage = _.get(this.configService, 'labelConfig.messages.success.039');
|
|
424
|
+
break;
|
|
425
|
+
default:
|
|
426
|
+
break;
|
|
427
|
+
}
|
|
428
|
+
questionIds.push(this.questionId);
|
|
429
|
+
event['requestBody'] = this.prepareSourcingUpdateBody(questionIds, comments);
|
|
430
|
+
this.editorService.updateCollection(this.questionSetId, event).subscribe(res => {
|
|
431
|
+
this.toasterService.success(successMessage);
|
|
432
|
+
this.redirectToChapterList();
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
sendBackQuestion(event) {
|
|
437
|
+
this.questionService.readQuestion(this.questionId, 'status')
|
|
438
|
+
.subscribe((res) => {
|
|
439
|
+
const requestObj = {
|
|
440
|
+
question: {
|
|
441
|
+
prevStatus: _.get(res.result, `question.status`),
|
|
442
|
+
status: 'Draft',
|
|
443
|
+
requestChanges: event.comment
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
this.questionService.updateQuestion(this.questionId, requestObj).subscribe(res => {
|
|
447
|
+
this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.040'));
|
|
448
|
+
this.redirectToChapterList();
|
|
449
|
+
});
|
|
450
|
+
}, (err) => {
|
|
451
|
+
const errInfo = {
|
|
452
|
+
errorMsg: 'Cannot update question status. Please try again...',
|
|
453
|
+
};
|
|
454
|
+
this.editorService.apiErrorHandling(err, errInfo);
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
validateQuestionData() {
|
|
458
|
+
if ([undefined, ''].includes(this.editorState.question)) {
|
|
459
|
+
this.showFormError = true;
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
// to handle when question type is subjective
|
|
463
|
+
if (this.questionInteractionType === 'default') {
|
|
464
|
+
if (this.editorState.answer !== '') {
|
|
465
|
+
this.showFormError = false;
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
this.showFormError = true;
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
// to handle when question type is mcq
|
|
473
|
+
if (this.questionInteractionType === 'choice') {
|
|
474
|
+
const data = _.get(this.treeNodeData, 'data.metadata');
|
|
475
|
+
if (_.get(this.editorState, 'interactionTypes[0]') === 'choice' &&
|
|
476
|
+
_.isEmpty(this.editorState?.responseDeclaration?.response1?.mapping) &&
|
|
477
|
+
!_.isUndefined(this.editorService?.editorConfig?.config?.renderTaxonomy) &&
|
|
478
|
+
_.get(data, 'allowScoring') === 'Yes') {
|
|
479
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.005'));
|
|
480
|
+
this.showFormError = true;
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
this.showFormError = false;
|
|
485
|
+
}
|
|
486
|
+
const optionValid = _.find(this.editorState.options, option => (option.body === undefined || option.body === '' || option.length > this.setCharacterLimit));
|
|
487
|
+
if (optionValid || (!this.editorState.answer && this.sourcingSettings?.enforceCorrectAnswer)) {
|
|
488
|
+
this.showFormError = true;
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
this.showFormError = false;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
if (this.questionInteractionType === 'slider') {
|
|
496
|
+
const min = _.get(this.sliderDatas, 'validation.range.min');
|
|
497
|
+
const max = _.get(this.sliderDatas, 'validation.range.max');
|
|
498
|
+
const step = _.get(this.sliderDatas, 'step');
|
|
499
|
+
if (_.isEmpty(this.sliderDatas) || _.isEmpty(min) || _.isEmpty(max) || _.isEmpty(step)) {
|
|
500
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.005'));
|
|
501
|
+
this.showFormError = true;
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
this.showFormError = false;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
redirectToQuestionset() {
|
|
509
|
+
this.showConfirmPopup = false;
|
|
510
|
+
setTimeout(() => {
|
|
511
|
+
if (this.showAddSecondaryQuestionCat) {
|
|
512
|
+
this.questionEmitter.emit({
|
|
513
|
+
type: "createNewContent",
|
|
514
|
+
isChildQuestion: true,
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
this.editorService.parentIdentifier = undefined;
|
|
519
|
+
}
|
|
520
|
+
this.showAddSecondaryQuestionCat = false;
|
|
521
|
+
this.questionEmitter.emit({ status: false });
|
|
522
|
+
}, 100);
|
|
523
|
+
}
|
|
524
|
+
addResourceToQuestionset(publishCallback) {
|
|
525
|
+
const questionSetId = _.get(this.editorService.editorConfig, 'context.identifier');
|
|
526
|
+
const unitId = this.selectedSectionId || _.get(this.questionInput, 'config.parent');
|
|
527
|
+
this.editorService.addResourceToQuestionset(questionSetId, unitId, this.questionId).subscribe(() => {
|
|
528
|
+
this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.009'));
|
|
529
|
+
if (publishCallback) {
|
|
530
|
+
publishCallback();
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
this.redirectToQuestionset();
|
|
534
|
+
}
|
|
535
|
+
}, (err) => {
|
|
536
|
+
const errInfo = {
|
|
537
|
+
errorMsg: 'Failed to add question to questionset. Please try again...',
|
|
538
|
+
};
|
|
539
|
+
this.editorService.apiErrorHandling(err, errInfo);
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
redirectToChapterList() {
|
|
543
|
+
this.questionEmitter.emit({ status: false });
|
|
544
|
+
}
|
|
545
|
+
setQuestionId(questionId) {
|
|
546
|
+
this.questionId = questionId;
|
|
547
|
+
}
|
|
548
|
+
editorDataHandler(event, type) {
|
|
549
|
+
if (type === 'question') {
|
|
550
|
+
this.editorState.question = event.body;
|
|
551
|
+
}
|
|
552
|
+
else if (type === 'solution') {
|
|
553
|
+
this.editorState.solutions = event.body;
|
|
554
|
+
}
|
|
555
|
+
else {
|
|
556
|
+
this.editorState = _.assign(this.editorState, event.body);
|
|
557
|
+
}
|
|
558
|
+
if (event.mediaobj) {
|
|
559
|
+
const media = event.mediaobj;
|
|
560
|
+
this.setMedia(media);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
setMedia(media) {
|
|
564
|
+
if (media) {
|
|
565
|
+
const value = _.find(this.mediaArr, ob => {
|
|
566
|
+
return ob.id === media.id;
|
|
567
|
+
});
|
|
568
|
+
if (value === undefined) {
|
|
569
|
+
this.mediaArr.push(media);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
saveQuestion() {
|
|
574
|
+
if (_.get(this.creationContext, 'objectType') === 'question') {
|
|
575
|
+
if (this.creationMode === 'edit') {
|
|
576
|
+
const callback = this.addResourceToQuestionset.bind(this);
|
|
577
|
+
this.upsertQuestion(callback);
|
|
578
|
+
}
|
|
579
|
+
else if (this.creationMode === 'sourcingReview') {
|
|
580
|
+
const callback = this.sendQuestionForPublish.bind(this);
|
|
581
|
+
this.upsertQuestion(callback);
|
|
582
|
+
}
|
|
583
|
+
else {
|
|
584
|
+
this.upsertQuestion(undefined);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
if (_.isUndefined(this.questionId)) {
|
|
589
|
+
this.createQuestion();
|
|
590
|
+
}
|
|
591
|
+
if (!_.isUndefined(this.questionId)) {
|
|
592
|
+
this.updateQuestion();
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
videoDataOutput(event) {
|
|
597
|
+
if (event) {
|
|
598
|
+
this.videoSolutionData = event;
|
|
599
|
+
this.videoSolutionName = event.name;
|
|
600
|
+
this.editorState.solutions = event.identifier;
|
|
601
|
+
this.videoThumbnail = event.thumbnail;
|
|
602
|
+
const videoMedia = {};
|
|
603
|
+
videoMedia.id = event.identifier;
|
|
604
|
+
videoMedia.src = event.src;
|
|
605
|
+
videoMedia.type = 'video';
|
|
606
|
+
videoMedia.assetId = event.identifier;
|
|
607
|
+
videoMedia.name = event.name;
|
|
608
|
+
videoMedia.thumbnail = this.videoThumbnail;
|
|
609
|
+
videoMedia.baseUrl = _.get(this.editorService.editorConfig, 'context.host') || document.location.origin;
|
|
610
|
+
if (videoMedia.thumbnail) {
|
|
611
|
+
const thumbnailMedia = {};
|
|
612
|
+
thumbnailMedia.src = this.videoThumbnail;
|
|
613
|
+
thumbnailMedia.type = 'image';
|
|
614
|
+
thumbnailMedia.id = `video_${event.identifier}`;
|
|
615
|
+
thumbnailMedia.baseUrl = _.get(this.editorService.editorConfig, 'context.host') || document.location.origin;
|
|
616
|
+
this.mediaArr.push(thumbnailMedia);
|
|
617
|
+
}
|
|
618
|
+
this.mediaArr.push(videoMedia);
|
|
619
|
+
this.showSolutionDropDown = false;
|
|
620
|
+
this.showSolution = true;
|
|
621
|
+
}
|
|
622
|
+
else {
|
|
623
|
+
this.deleteSolution();
|
|
624
|
+
}
|
|
625
|
+
this.videoShow = false;
|
|
626
|
+
}
|
|
627
|
+
selectSolutionType(data) {
|
|
628
|
+
const index = _.findIndex(this.solutionTypes, (sol) => {
|
|
629
|
+
return sol.value === data;
|
|
630
|
+
});
|
|
631
|
+
this.selectedSolutionType = this.solutionTypes[index].type;
|
|
632
|
+
if (this.selectedSolutionType === 'video') {
|
|
633
|
+
const showVideo = true;
|
|
634
|
+
this.videoShow = showVideo;
|
|
635
|
+
}
|
|
636
|
+
else {
|
|
637
|
+
this.showSolutionDropDown = false;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
deleteSolution() {
|
|
641
|
+
if (this.selectedSolutionType === 'video') {
|
|
642
|
+
this.mediaArr = _.filter(this.mediaArr, (item) => item.id !== this.editorState.solutions);
|
|
643
|
+
}
|
|
644
|
+
this.showSolutionDropDown = true;
|
|
645
|
+
this.selectedSolutionType = '';
|
|
646
|
+
this.videoSolutionName = '';
|
|
647
|
+
this.editorState.solutions = '';
|
|
648
|
+
this.videoThumbnail = '';
|
|
649
|
+
this.showSolution = false;
|
|
650
|
+
}
|
|
651
|
+
getSolutionObj(solutionUUID, selectedSolutionType, editorStateSolutions) {
|
|
652
|
+
let solutionObj;
|
|
653
|
+
solutionObj = {};
|
|
654
|
+
solutionObj.id = solutionUUID;
|
|
655
|
+
solutionObj.type = selectedSolutionType;
|
|
656
|
+
if (_.isString(editorStateSolutions)) {
|
|
657
|
+
solutionObj.value = editorStateSolutions;
|
|
658
|
+
}
|
|
659
|
+
if (_.isArray(editorStateSolutions)) {
|
|
660
|
+
if (_.has(editorStateSolutions[0], 'value')) {
|
|
661
|
+
solutionObj.value = editorStateSolutions[0].value;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
return solutionObj;
|
|
665
|
+
}
|
|
666
|
+
getQuestionMetadata() {
|
|
667
|
+
let metadata = {
|
|
668
|
+
mimeType: 'application/vnd.sunbird.question',
|
|
669
|
+
media: this.mediaArr,
|
|
670
|
+
editorState: {}
|
|
671
|
+
};
|
|
672
|
+
metadata = _.assign(metadata, this.editorState);
|
|
673
|
+
metadata.editorState.question = metadata.question;
|
|
674
|
+
metadata.body = metadata.question;
|
|
675
|
+
const treeNodeData = _.get(this.treeNodeData, 'data.metadata');
|
|
676
|
+
if (!(_.get(treeNodeData, "allowScoring") === "Yes")) {
|
|
677
|
+
_.set(metadata, "responseDeclaration.response1.mapping", []);
|
|
678
|
+
}
|
|
679
|
+
if (this.questionInteractionType === 'choice') {
|
|
680
|
+
metadata.body = this.getMcqQuestionHtmlBody(this.editorState.question, this.editorState.templateId);
|
|
681
|
+
}
|
|
682
|
+
if (!_.isUndefined(this.selectedSolutionType) && !_.isEmpty(this.selectedSolutionType)) {
|
|
683
|
+
const solutionObj = this.getSolutionObj(this.solutionUUID, this.selectedSolutionType, this.editorState.solutions);
|
|
684
|
+
metadata.editorState.solutions = [solutionObj];
|
|
685
|
+
metadata.solutions = [solutionObj];
|
|
686
|
+
}
|
|
687
|
+
if (_.isEmpty(this.editorState.solutions)) {
|
|
688
|
+
metadata.solutions = [];
|
|
689
|
+
}
|
|
690
|
+
metadata = _.merge(metadata, this.getDefaultSessionContext());
|
|
691
|
+
if (_.get(this.creationContext, 'objectType') === 'question') {
|
|
692
|
+
metadata.programId = _.get(this.editorService, 'editorConfig.context.programId');
|
|
693
|
+
metadata.collectionId = _.get(this.editorService, 'editorConfig.context.collectionIdentifier');
|
|
694
|
+
metadata.organisationId = _.get(this.editorService, 'editorConfig.context.contributionOrgId');
|
|
695
|
+
}
|
|
696
|
+
if (this.questionInteractionType === 'choice') {
|
|
697
|
+
metadata.responseDeclaration.response1.maxScore = this.maxScore;
|
|
698
|
+
metadata.responseDeclaration.response1.correctResponse.outcomes.SCORE = this.maxScore;
|
|
699
|
+
}
|
|
700
|
+
metadata = _.merge(metadata, _.pickBy(this.childFormData, _.identity));
|
|
701
|
+
if (_.get(this.creationContext, 'objectType') === 'question') {
|
|
702
|
+
metadata.isReviewModificationAllowed = !!_.get(this.questionMetaData, 'isReviewModificationAllowed');
|
|
703
|
+
}
|
|
704
|
+
// tslint:disable-next-line:max-line-length
|
|
705
|
+
return _.omit(metadata, ['question', 'numberOfOptions', 'options', 'allowMultiSelect', 'showEvidence', 'evidenceMimeType', 'showRemarks', 'markAsNotMandatory', 'leftAnchor', 'rightAnchor', 'step', 'numberOnly', 'characterLimit', 'dateFormat', 'autoCapture', 'remarksLimit', 'maximumOptions']);
|
|
706
|
+
}
|
|
707
|
+
getResponseDeclaration(type) {
|
|
708
|
+
const responseDeclaration = {
|
|
709
|
+
response1: {
|
|
710
|
+
type: type === 'slider' ? 'integer' : 'string'
|
|
711
|
+
}
|
|
712
|
+
};
|
|
713
|
+
if (type === 'text' || type === 'slider') {
|
|
714
|
+
responseDeclaration.response1['maxScore'] = this.maxScore;
|
|
715
|
+
}
|
|
716
|
+
return responseDeclaration;
|
|
717
|
+
}
|
|
718
|
+
getMcqQuestionHtmlBody(question, templateId) {
|
|
719
|
+
const mcqTemplateConfig = {
|
|
720
|
+
// tslint:disable-next-line:max-line-length
|
|
721
|
+
mcqBody: '<div class=\'question-body\'><div class=\'mcq-title\'>{question}</div><div data-choice-interaction=\'response1\' class=\'{templateClass}\'></div></div>'
|
|
722
|
+
};
|
|
723
|
+
const { mcqBody } = mcqTemplateConfig;
|
|
724
|
+
const questionBody = mcqBody.replace('{templateClass}', templateId)
|
|
725
|
+
.replace('{question}', question);
|
|
726
|
+
return questionBody;
|
|
727
|
+
}
|
|
728
|
+
getDefaultSessionContext() {
|
|
729
|
+
return _.omitBy(_.merge({
|
|
730
|
+
author: _.get(this.editorService.editorConfig, 'context.user.fullName'),
|
|
731
|
+
createdBy: _.get(this.editorService.editorConfig, 'context.user.id'),
|
|
732
|
+
..._.pick(_.get(this.editorService.editorConfig, 'context'), ['board', 'medium', 'gradeLevel', 'subject', 'topic'])
|
|
733
|
+
}, {
|
|
734
|
+
..._.pick(this.questionSetHierarchy, this.configService.sessionContext)
|
|
735
|
+
}), key => _.isEmpty(key));
|
|
736
|
+
}
|
|
737
|
+
setQuestionTypeValues(metaData) {
|
|
738
|
+
metaData.showEvidence = this.childFormData.showEvidence;
|
|
739
|
+
if (metaData.showEvidence === 'Yes') {
|
|
740
|
+
metaData.evidence = {
|
|
741
|
+
required: 'No',
|
|
742
|
+
mimeType: this.childFormData.evidenceMimeType,
|
|
743
|
+
minCount: 1,
|
|
744
|
+
maxCount: 1,
|
|
745
|
+
sizeLimit: evidenceSizeLimit,
|
|
746
|
+
};
|
|
747
|
+
}
|
|
748
|
+
metaData.showRemarks = this.childFormData.showRemarks;
|
|
749
|
+
if (metaData.showRemarks === 'Yes') {
|
|
750
|
+
metaData.remarks = {
|
|
751
|
+
maxLength: this.childFormData.remarksLimit,
|
|
752
|
+
required: 'No'
|
|
753
|
+
};
|
|
754
|
+
}
|
|
755
|
+
metaData.interactions = metaData.interactions || {};
|
|
756
|
+
metaData.interactions.validation = { required: this.childFormData.markAsNotMandatory === 'Yes' ? 'No' : 'Yes' };
|
|
757
|
+
if (this.childFormData.allowMultiSelect === 'Yes') {
|
|
758
|
+
metaData.responseDeclaration.response1.cardinality = 'multiple';
|
|
759
|
+
}
|
|
760
|
+
else {
|
|
761
|
+
metaData.responseDeclaration.response1.cardinality = 'single';
|
|
762
|
+
}
|
|
763
|
+
if (!_.isUndefined(this.editorService?.editorConfig?.config?.renderTaxonomy)) {
|
|
764
|
+
this.calculateMinMaxScore(metaData);
|
|
765
|
+
}
|
|
766
|
+
_.forEach(this.subMenus, (el) => {
|
|
767
|
+
if (el.id === 'addHint') {
|
|
768
|
+
metaData.hints = {
|
|
769
|
+
en: [el.value]
|
|
770
|
+
};
|
|
771
|
+
}
|
|
772
|
+
if (el.id === 'addTip') {
|
|
773
|
+
metaData.instructions = {
|
|
774
|
+
en: [el.value]
|
|
775
|
+
};
|
|
776
|
+
}
|
|
777
|
+
});
|
|
778
|
+
if (!_.isEmpty(this.sliderDatas) && this.questionInteractionType === 'slider') {
|
|
779
|
+
metaData.interactionTypes = [this.questionInteractionType];
|
|
780
|
+
metaData.primaryCategory = this.questionPrimaryCategory;
|
|
781
|
+
metaData.interactions = {
|
|
782
|
+
...metaData.interactions,
|
|
783
|
+
response1: {
|
|
784
|
+
validation: this.sliderDatas.validation,
|
|
785
|
+
step: this.sliderDatas.step
|
|
786
|
+
}
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
if (this.questionInteractionType === 'date') {
|
|
790
|
+
metaData.interactionTypes = [this.questionInteractionType];
|
|
791
|
+
metaData.primaryCategory = this.questionPrimaryCategory;
|
|
792
|
+
metaData.interactions = {
|
|
793
|
+
...metaData.interactions,
|
|
794
|
+
response1: {
|
|
795
|
+
validation: { pattern: this.childFormData.dateFormat },
|
|
796
|
+
autoCapture: this.childFormData.autoCapture
|
|
797
|
+
}
|
|
798
|
+
};
|
|
799
|
+
}
|
|
800
|
+
if (this.questionInteractionType === 'text') {
|
|
801
|
+
metaData.interactionTypes = [this.questionInteractionType];
|
|
802
|
+
metaData.primaryCategory = this.questionPrimaryCategory;
|
|
803
|
+
metaData.interactions = {
|
|
804
|
+
...metaData.interactions,
|
|
805
|
+
response1: {
|
|
806
|
+
validation: {
|
|
807
|
+
limit: {
|
|
808
|
+
maxLength: this.childFormData.characterLimit,
|
|
809
|
+
}
|
|
810
|
+
},
|
|
811
|
+
type: {
|
|
812
|
+
number: this.childFormData.numberOnly
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
};
|
|
816
|
+
}
|
|
817
|
+
// return metaData;
|
|
818
|
+
}
|
|
819
|
+
prepareRequestBody() {
|
|
820
|
+
const questionId = this.questionId ? this.questionId : uuidv4();
|
|
821
|
+
this.newQuestionID = questionId;
|
|
822
|
+
const data = this.treeNodeData;
|
|
823
|
+
const activeNode = this.treeService.getActiveNode();
|
|
824
|
+
const selectedUnitId = _.get(activeNode, 'data.id');
|
|
825
|
+
this.editorService.data = {};
|
|
826
|
+
return {
|
|
827
|
+
nodesModified: {
|
|
828
|
+
[questionId]: {
|
|
829
|
+
metadata: this.getQuestionMetadata(),
|
|
830
|
+
objectType: 'Question',
|
|
831
|
+
root: false,
|
|
832
|
+
isNew: !this.questionId
|
|
833
|
+
}
|
|
834
|
+
},
|
|
835
|
+
hierarchy: this.editorService.getHierarchyObj(data, questionId, selectedUnitId)
|
|
836
|
+
};
|
|
837
|
+
}
|
|
838
|
+
prepareQuestionBody() {
|
|
839
|
+
return this.questionId ?
|
|
840
|
+
{
|
|
841
|
+
question: _.omit(this.getQuestionMetadata(), ['mimeType', 'creator', 'createdBy', 'organisationId'])
|
|
842
|
+
} :
|
|
843
|
+
{
|
|
844
|
+
question: {
|
|
845
|
+
code: uuidv4(),
|
|
846
|
+
...this.getQuestionMetadata()
|
|
847
|
+
}
|
|
848
|
+
};
|
|
849
|
+
}
|
|
850
|
+
prepareSourcingUpdateBody(questionIds, comments) {
|
|
851
|
+
const sourcingUpdateAttribute = this.actionType === 'sourcingApproveQuestion' ? 'acceptedContributions'
|
|
852
|
+
: 'rejectedContributions';
|
|
853
|
+
const collectionObjectType = _.replace(_.lowerCase(this.creationContext['collectionObjectType']), ' ', '');
|
|
854
|
+
const requestBody = {
|
|
855
|
+
request: {
|
|
856
|
+
[collectionObjectType]: {
|
|
857
|
+
[sourcingUpdateAttribute]: questionIds
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
};
|
|
861
|
+
if (this.actionType === 'sourcingRejectQuestion') {
|
|
862
|
+
requestBody.request[collectionObjectType]['rejectedContributionComments'] = comments;
|
|
863
|
+
// requestBody.request[collectionObjectType]['rejectComment'] = comments;
|
|
864
|
+
}
|
|
865
|
+
return requestBody;
|
|
866
|
+
}
|
|
867
|
+
upsertQuestion(callback) {
|
|
868
|
+
const requestBody = this.prepareQuestionBody();
|
|
869
|
+
this.showHideSpinnerLoader(true);
|
|
870
|
+
this.questionService.upsertQuestion(this.questionId, requestBody).pipe(finalize(() => {
|
|
871
|
+
this.showHideSpinnerLoader(false);
|
|
872
|
+
})).subscribe((response) => {
|
|
873
|
+
if (!_.includes(['submitQuestion'], this.actionType)) {
|
|
874
|
+
this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.013'));
|
|
875
|
+
}
|
|
876
|
+
this.setQuestionId(_.get(response, 'result.identifier'));
|
|
877
|
+
if (callback)
|
|
878
|
+
callback();
|
|
879
|
+
}, (err) => {
|
|
880
|
+
const errInfo = {
|
|
881
|
+
errorMsg: 'Failed to save question. Please try again...',
|
|
882
|
+
};
|
|
883
|
+
this.editorService.apiErrorHandling(err, errInfo);
|
|
884
|
+
});
|
|
885
|
+
}
|
|
886
|
+
createQuestion() {
|
|
887
|
+
const requestBody = this.prepareRequestBody();
|
|
888
|
+
this.showHideSpinnerLoader(true);
|
|
889
|
+
this.questionService.updateHierarchyQuestionCreate(requestBody).pipe(finalize(() => {
|
|
890
|
+
this.showHideSpinnerLoader(false);
|
|
891
|
+
})).subscribe((response) => {
|
|
892
|
+
this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.007'));
|
|
893
|
+
this.redirectToQuestionset();
|
|
894
|
+
}, (err) => {
|
|
895
|
+
const errInfo = {
|
|
896
|
+
errorMsg: 'Question creating failed. Please try again...',
|
|
897
|
+
};
|
|
898
|
+
this.editorService.apiErrorHandling(err, errInfo);
|
|
899
|
+
});
|
|
900
|
+
}
|
|
901
|
+
updateQuestion() {
|
|
902
|
+
const requestBody = this.prepareRequestBody();
|
|
903
|
+
this.showHideSpinnerLoader(true);
|
|
904
|
+
this.questionService.updateHierarchyQuestionUpdate(requestBody).pipe(finalize(() => {
|
|
905
|
+
this.showHideSpinnerLoader(false);
|
|
906
|
+
})).subscribe((response) => {
|
|
907
|
+
this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.008'));
|
|
908
|
+
this.redirectToQuestionset();
|
|
909
|
+
}, (err) => {
|
|
910
|
+
const errInfo = {
|
|
911
|
+
errorMsg: 'Question updating failed. Please try again...',
|
|
912
|
+
};
|
|
913
|
+
this.editorService.apiErrorHandling(err, errInfo);
|
|
914
|
+
});
|
|
915
|
+
}
|
|
916
|
+
saveQuestions(requestBody, type) {
|
|
917
|
+
this.showHideSpinnerLoader(true);
|
|
918
|
+
const serviceMethod = type === 'create' ?
|
|
919
|
+
this.questionService.updateHierarchyQuestionCreate(requestBody) :
|
|
920
|
+
this.questionService.updateHierarchyQuestionUpdate(requestBody);
|
|
921
|
+
serviceMethod.pipe(finalize(() => {
|
|
922
|
+
this.showHideSpinnerLoader(false);
|
|
923
|
+
})).subscribe((response) => {
|
|
924
|
+
const successMsg = type === 'create' ?
|
|
925
|
+
_.get(this.configService, 'labelConfig.messages.success.007') :
|
|
926
|
+
_.get(this.configService, 'labelConfig.messages.success.008');
|
|
927
|
+
this.toasterService.success(successMsg);
|
|
928
|
+
this.redirectToQuestionset();
|
|
929
|
+
}, (err) => {
|
|
930
|
+
const errInfo = {
|
|
931
|
+
errorMsg: `Question ${type === 'create' ? 'creating' : 'updating'} failed. Please try again...`,
|
|
932
|
+
};
|
|
933
|
+
this.editorService.apiErrorHandling(err, errInfo);
|
|
934
|
+
});
|
|
935
|
+
}
|
|
936
|
+
showHideSpinnerLoader(status) {
|
|
937
|
+
this.buttonLoaders.saveButtonLoader = status;
|
|
938
|
+
}
|
|
939
|
+
previewContent() {
|
|
940
|
+
this.validateQuestionData();
|
|
941
|
+
if (this.showFormError === false && this.questionMetadataFormStatus === true) {
|
|
942
|
+
this.previewFormData(false);
|
|
943
|
+
const activeNode = this.treeService.getActiveNode();
|
|
944
|
+
let questionId = '';
|
|
945
|
+
if (_.isUndefined(this.questionId)) {
|
|
946
|
+
questionId = this.tempQuestionId;
|
|
947
|
+
this.setParentConfig(activeNode?.data?.metadata);
|
|
948
|
+
}
|
|
949
|
+
else {
|
|
950
|
+
questionId = this.questionId;
|
|
951
|
+
this.setParentConfig(activeNode?.parent?.data?.metadata);
|
|
952
|
+
}
|
|
953
|
+
this.questionSetHierarchy.childNodes = [questionId];
|
|
954
|
+
this.setQumlPlayerData(questionId);
|
|
955
|
+
this.showPreview = true;
|
|
956
|
+
this.toolbarConfig.showPreview = true;
|
|
957
|
+
}
|
|
958
|
+
else {
|
|
959
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.044'));
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
setParentConfig(parentConfig) {
|
|
963
|
+
this.questionSetHierarchy.showSolutions = !_.isUndefined(parentConfig?.showSolutions) ?
|
|
964
|
+
parentConfig.showSolutions : 'No';
|
|
965
|
+
this.questionSetHierarchy.shuffle = !_.isUndefined(parentConfig?.shuffle) ?
|
|
966
|
+
parentConfig.shuffle : true;
|
|
967
|
+
this.questionSetHierarchy.showFeedback = !_.isUndefined(parentConfig?.showFeedback) ?
|
|
968
|
+
parentConfig.showFeedback : 'No';
|
|
969
|
+
}
|
|
970
|
+
setQumlPlayerData(questionId) {
|
|
971
|
+
const questionMetadata = _.cloneDeep(this.getQuestionMetadata());
|
|
972
|
+
questionMetadata.identifier = questionId;
|
|
973
|
+
this.questionSetHierarchy.children = [questionMetadata];
|
|
974
|
+
if (this.questionSetHierarchy.shuffle === true) {
|
|
975
|
+
// tslint:disable-next-line:no-string-literal
|
|
976
|
+
this.questionSetHierarchy['maxScore'] = 1;
|
|
977
|
+
}
|
|
978
|
+
else {
|
|
979
|
+
if (questionMetadata.qType === 'SA') {
|
|
980
|
+
this.questionSetHierarchy = _.omit(this.questionSetHierarchy, 'maxScore');
|
|
981
|
+
}
|
|
982
|
+
else if (questionMetadata.maxScore) {
|
|
983
|
+
// tslint:disable-next-line:no-string-literal
|
|
984
|
+
this.questionSetHierarchy['maxScore'] = this.maxScore;
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
this.editorCursor.setQuestionMap(questionId, questionMetadata);
|
|
988
|
+
}
|
|
989
|
+
getPlayerEvents(event) {
|
|
990
|
+
console.log('get player events', JSON.stringify(event));
|
|
991
|
+
}
|
|
992
|
+
getTelemetryEvents(event) {
|
|
993
|
+
console.log('event is for telemetry', JSON.stringify(event));
|
|
994
|
+
}
|
|
995
|
+
setQuestionTitle(questionId) {
|
|
996
|
+
let index;
|
|
997
|
+
let questionTitle = '';
|
|
998
|
+
let hierarchyChildren = this.treeService.getChildren();
|
|
999
|
+
if (!_.isUndefined(questionId)) {
|
|
1000
|
+
const parentNode = this.treeService.getActiveNode().getParent();
|
|
1001
|
+
hierarchyChildren = parentNode.getChildren();
|
|
1002
|
+
index = _.findIndex(hierarchyChildren, (node) => node.data.id === questionId);
|
|
1003
|
+
const question = hierarchyChildren[index];
|
|
1004
|
+
questionTitle = `Q${(index + 1).toString()} | ` + question.data.primaryCategory;
|
|
1005
|
+
}
|
|
1006
|
+
else {
|
|
1007
|
+
index = hierarchyChildren.length;
|
|
1008
|
+
questionTitle = `Q${(index + 1).toString()} | `;
|
|
1009
|
+
if (!_.isUndefined(this.questionPrimaryCategory)) {
|
|
1010
|
+
questionTitle = questionTitle + this.questionPrimaryCategory;
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
this.toolbarConfig.title = questionTitle;
|
|
1014
|
+
}
|
|
1015
|
+
output(event) { }
|
|
1016
|
+
onStatusChanges(event) {
|
|
1017
|
+
console.log(event);
|
|
1018
|
+
if (_.has(event, 'isValid')) {
|
|
1019
|
+
this.questionMetadataFormStatus = event.isValid;
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
valueChanges(event) {
|
|
1023
|
+
if (_.has(event, 'maxScore')) {
|
|
1024
|
+
// tslint:disable-next-line:radix
|
|
1025
|
+
event.maxScore = !_.isNull(event.maxScore) ? parseInt(event.maxScore) : this.maxScore;
|
|
1026
|
+
this.maxScore = event.maxScore;
|
|
1027
|
+
}
|
|
1028
|
+
this.childFormData = event;
|
|
1029
|
+
}
|
|
1030
|
+
validateFormFields() {
|
|
1031
|
+
_.forEach(this.leafFormConfig, (formFieldCategory) => {
|
|
1032
|
+
if (formFieldCategory.required && !this.childFormData[formFieldCategory.code]) {
|
|
1033
|
+
this.showFormError = true;
|
|
1034
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.008'));
|
|
1035
|
+
return false;
|
|
1036
|
+
}
|
|
1037
|
+
});
|
|
1038
|
+
return true;
|
|
1039
|
+
}
|
|
1040
|
+
previewFormData(status) {
|
|
1041
|
+
const formConfig = _.cloneDeep(this.leafFormConfig);
|
|
1042
|
+
this.questionFormConfig = null;
|
|
1043
|
+
_.forEach(formConfig, (formFieldCategory) => {
|
|
1044
|
+
if (_.has(formFieldCategory, 'editable') && !_.isUndefined(formFieldCategory.editable)) {
|
|
1045
|
+
formFieldCategory.editable = status ? _.find(this.leafFormConfig, { code: formFieldCategory.code }).editable : status;
|
|
1046
|
+
formFieldCategory.default = this.childFormData[formFieldCategory.code];
|
|
1047
|
+
}
|
|
1048
|
+
});
|
|
1049
|
+
this.leafFormConfig = formConfig;
|
|
1050
|
+
}
|
|
1051
|
+
populateFormData() {
|
|
1052
|
+
this.childFormData = {};
|
|
1053
|
+
_.forEach(this.leafFormConfig, (formFieldCategory) => {
|
|
1054
|
+
if (!_.isUndefined(this.questionId)) {
|
|
1055
|
+
if (formFieldCategory.code === 'maxScore' && this.questionInteractionType === 'choice') {
|
|
1056
|
+
this.childFormData[formFieldCategory.code] = _.has(this.questionMetaData, 'responseDeclaration.response1.maxScore') ?
|
|
1057
|
+
_.get(this.questionMetaData, 'responseDeclaration.response1.maxScore') : this.maxScore;
|
|
1058
|
+
}
|
|
1059
|
+
else if (formFieldCategory.code === 'allowMultiSelect' && this.questionInteractionType === 'choice') {
|
|
1060
|
+
this.childFormData[formFieldCategory.code] = _.get(this.questionMetaData, 'responseDeclaration.response1.cardinality') === 'multiple' ? 'Yes' : 'No';
|
|
1061
|
+
}
|
|
1062
|
+
else if (this.questionMetaData && _.has(this.questionMetaData, formFieldCategory.code)) {
|
|
1063
|
+
formFieldCategory.default = this.questionMetaData[formFieldCategory.code];
|
|
1064
|
+
this.childFormData[formFieldCategory.code] = this.questionMetaData[formFieldCategory.code];
|
|
1065
|
+
}
|
|
1066
|
+
try {
|
|
1067
|
+
const availableAlias = {
|
|
1068
|
+
dateFormat: 'interactions.response1.validation.pattern',
|
|
1069
|
+
autoCapture: 'interactions.response1.autoCapture',
|
|
1070
|
+
markAsNotMandatory: 'interactions.validation.required',
|
|
1071
|
+
numberOnly: 'interactions.response1.type.number',
|
|
1072
|
+
characterLimit: 'interactions.response1.validation.limit.maxLength',
|
|
1073
|
+
remarksLimit: 'remarks.maxLength',
|
|
1074
|
+
evidenceMimeType: 'evidence.mimeType'
|
|
1075
|
+
};
|
|
1076
|
+
if (this.questionMetaData && _.has(availableAlias, formFieldCategory.code)) {
|
|
1077
|
+
let defaultValue = _.get(this.questionMetaData, availableAlias[formFieldCategory.code]);
|
|
1078
|
+
if (formFieldCategory.code === 'markAsNotMandatory') {
|
|
1079
|
+
defaultValue = defaultValue === 'Yes' ? 'No' : 'Yes';
|
|
1080
|
+
}
|
|
1081
|
+
formFieldCategory.default = defaultValue;
|
|
1082
|
+
this.childFormData[formFieldCategory.code] = defaultValue;
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
catch (error) {
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
else {
|
|
1089
|
+
// tslint:disable-next-line:max-line-length
|
|
1090
|
+
const questionSetDefaultValue = _.get(this.questionSetHierarchy, formFieldCategory.code) ? _.get(this.questionSetHierarchy, formFieldCategory.code) : '';
|
|
1091
|
+
const defaultEditStatus = _.find(this.initialLeafFormConfig, { code: formFieldCategory.code }).editable === true ? true : false;
|
|
1092
|
+
formFieldCategory.default = defaultEditStatus ? '' : questionSetDefaultValue;
|
|
1093
|
+
this.childFormData[formFieldCategory.code] = formFieldCategory.default;
|
|
1094
|
+
if (formFieldCategory.code === 'maxScore' && this.questionInteractionType === 'choice') {
|
|
1095
|
+
this.childFormData[formFieldCategory.code] = this.maxScore;
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
});
|
|
1099
|
+
this.fetchFrameWorkDetails();
|
|
1100
|
+
(this.isReadOnlyMode === true && !_.isUndefined(this.editorService?.editorConfig?.config?.renderTaxonomy)) ? this.previewFormData(false) : this.previewFormData(true);
|
|
1101
|
+
}
|
|
1102
|
+
subMenuChange({ index, value }) {
|
|
1103
|
+
if (this.subMenus[index].id === 'addDependantQuestion') {
|
|
1104
|
+
this.showAddSecondaryQuestionCat = true;
|
|
1105
|
+
this.saveContent();
|
|
1106
|
+
if (this.showFormError) {
|
|
1107
|
+
this.showAddSecondaryQuestionCat = false;
|
|
1108
|
+
return;
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
this.subMenus[index].value = value;
|
|
1112
|
+
}
|
|
1113
|
+
get dependentQuestions() {
|
|
1114
|
+
try {
|
|
1115
|
+
return this.subMenus.filter(menu => menu.id === 'addDependantQuestion')[0].value;
|
|
1116
|
+
}
|
|
1117
|
+
catch (error) {
|
|
1118
|
+
return null;
|
|
1119
|
+
}
|
|
1120
|
+
}
|
|
1121
|
+
subMenuConfig() {
|
|
1122
|
+
this.subMenus = [
|
|
1123
|
+
{
|
|
1124
|
+
id: 'addHint',
|
|
1125
|
+
name: 'Add Hint',
|
|
1126
|
+
value: _.get(this.questionMetaData, 'hints.en[0]'),
|
|
1127
|
+
label: 'Hint',
|
|
1128
|
+
enabled: _.get(this.questionMetaData, 'hints.en[0]') ? true : false,
|
|
1129
|
+
type: 'input',
|
|
1130
|
+
show: _.get(this.sourcingSettings, 'showAddHints')
|
|
1131
|
+
},
|
|
1132
|
+
{
|
|
1133
|
+
id: 'addTip',
|
|
1134
|
+
name: 'Add Tip',
|
|
1135
|
+
value: _.get(this.questionMetaData, 'instructions.en[0]'),
|
|
1136
|
+
label: 'Tip',
|
|
1137
|
+
enabled: _.get(this.questionMetaData, 'instructions.en[0]') ? true : false,
|
|
1138
|
+
type: 'input',
|
|
1139
|
+
show: _.get(this.sourcingSettings, 'showAddTips')
|
|
1140
|
+
},
|
|
1141
|
+
{
|
|
1142
|
+
id: 'addDependantQuestion',
|
|
1143
|
+
name: 'Add Dependant Question',
|
|
1144
|
+
label: '',
|
|
1145
|
+
value: [],
|
|
1146
|
+
enabled: false,
|
|
1147
|
+
type: '',
|
|
1148
|
+
show: _.get(this.sourcingSettings, 'showAddSecondaryQuestion') && !this.questionInput.setChildQueston
|
|
1149
|
+
},
|
|
1150
|
+
];
|
|
1151
|
+
if (!_.get(this.sourcingSettings, 'showAddSecondaryQuestion') && !this.questionInput.setChildQueston) {
|
|
1152
|
+
this.showOptions = false;
|
|
1153
|
+
}
|
|
1154
|
+
else {
|
|
1155
|
+
this.showOptions = (this.questionInput.setChildQueston === true) ? true : false;
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
ngOnDestroy() {
|
|
1159
|
+
this.onComponentDestroy$.next();
|
|
1160
|
+
this.onComponentDestroy$.complete();
|
|
1161
|
+
this.editorCursor.clearQuestionMap();
|
|
1162
|
+
}
|
|
1163
|
+
sliderData($event) {
|
|
1164
|
+
const val = $event;
|
|
1165
|
+
const obj = {
|
|
1166
|
+
validation: {
|
|
1167
|
+
range: {
|
|
1168
|
+
min: '',
|
|
1169
|
+
max: ''
|
|
1170
|
+
}
|
|
1171
|
+
},
|
|
1172
|
+
step: ''
|
|
1173
|
+
};
|
|
1174
|
+
if (val.leftAnchor) {
|
|
1175
|
+
obj.validation.range.min = val.leftAnchor;
|
|
1176
|
+
}
|
|
1177
|
+
if (val.rightAnchor) {
|
|
1178
|
+
obj.validation.range.max = val.rightAnchor;
|
|
1179
|
+
}
|
|
1180
|
+
if (val.step) {
|
|
1181
|
+
obj.step = val.step;
|
|
1182
|
+
}
|
|
1183
|
+
this.sliderDatas = obj;
|
|
1184
|
+
}
|
|
1185
|
+
optionHandler(e) {
|
|
1186
|
+
this.targetOption = e.target.value;
|
|
1187
|
+
}
|
|
1188
|
+
buildCondition(type) {
|
|
1189
|
+
if (this.condition === 'default' || _.isEmpty(this.selectedOptions)) {
|
|
1190
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.038'));
|
|
1191
|
+
return;
|
|
1192
|
+
}
|
|
1193
|
+
const questionId = this.questionId ? this.questionId : uuidv4();
|
|
1194
|
+
const data = this.treeNodeData;
|
|
1195
|
+
const hierarchyData = this.editorService.getHierarchyObj(data, '', this.selectedSectionId);
|
|
1196
|
+
const sectionData = _.get(hierarchyData, `${this.selectedSectionId}`);
|
|
1197
|
+
const sectionName = sectionData.name;
|
|
1198
|
+
const branchingLogic = {
|
|
1199
|
+
...this.branchingLogic,
|
|
1200
|
+
[this.editorService.parentIdentifier]: {
|
|
1201
|
+
target: this.updateTarget(questionId),
|
|
1202
|
+
preCondition: {},
|
|
1203
|
+
source: []
|
|
1204
|
+
},
|
|
1205
|
+
[questionId]: {
|
|
1206
|
+
target: [],
|
|
1207
|
+
source: [this.editorService.parentIdentifier],
|
|
1208
|
+
preCondition: {
|
|
1209
|
+
and: [
|
|
1210
|
+
{
|
|
1211
|
+
[this.condition]: [
|
|
1212
|
+
{
|
|
1213
|
+
var: `${this.editorService.parentIdentifier}.${this.responseVariable}.value`,
|
|
1214
|
+
type: 'responseDeclaration',
|
|
1215
|
+
},
|
|
1216
|
+
this.selectedOptions,
|
|
1217
|
+
],
|
|
1218
|
+
},
|
|
1219
|
+
],
|
|
1220
|
+
},
|
|
1221
|
+
},
|
|
1222
|
+
};
|
|
1223
|
+
this.updateTreeCache(sectionName, branchingLogic, this.selectedSectionId);
|
|
1224
|
+
const metaData = this.getQuestionMetadata();
|
|
1225
|
+
this.setQuestionTypeValues(metaData);
|
|
1226
|
+
const finalResult = {
|
|
1227
|
+
nodesModified: {
|
|
1228
|
+
[questionId]: {
|
|
1229
|
+
metadata: metaData,
|
|
1230
|
+
objectType: 'Question',
|
|
1231
|
+
root: false,
|
|
1232
|
+
isNew: this.questionId ? false : true
|
|
1233
|
+
},
|
|
1234
|
+
[this.selectedSectionId]: {
|
|
1235
|
+
...this.treeService.treeCache.nodesModified[this.selectedSectionId]
|
|
1236
|
+
}
|
|
1237
|
+
},
|
|
1238
|
+
hierarchy: this.editorService.getHierarchyObj(data, questionId, this.selectedSectionId, this.editorService.parentIdentifier)
|
|
1239
|
+
};
|
|
1240
|
+
this.saveQuestions(finalResult, type);
|
|
1241
|
+
}
|
|
1242
|
+
updateTarget(questionId) {
|
|
1243
|
+
if (!_.isEmpty(this.branchingLogic) && _.get(this.branchingLogic, `${this.editorService.parentIdentifier}.target`)) {
|
|
1244
|
+
if (this.branchingLogic[this.editorService.parentIdentifier].target.includes(questionId)) {
|
|
1245
|
+
return [...this.branchingLogic[this.editorService.parentIdentifier].target];
|
|
1246
|
+
}
|
|
1247
|
+
return [...this.branchingLogic[this.editorService.parentIdentifier].target, `${questionId}`];
|
|
1248
|
+
}
|
|
1249
|
+
return [`${questionId}`];
|
|
1250
|
+
}
|
|
1251
|
+
getOptions() {
|
|
1252
|
+
if (this.editorService.optionsLength) {
|
|
1253
|
+
this.options = [];
|
|
1254
|
+
Array.from({ length: this.editorService.optionsLength }, (x, i) => {
|
|
1255
|
+
this.options.push({ value: i, label: i });
|
|
1256
|
+
});
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
getParentQuestionOptions(questionId) {
|
|
1260
|
+
this.editorService.parentIdentifier = questionId;
|
|
1261
|
+
this.questionService.readQuestion(questionId)
|
|
1262
|
+
.subscribe((res) => {
|
|
1263
|
+
if (res.responseCode === 'OK') {
|
|
1264
|
+
const result = res.result.question;
|
|
1265
|
+
if (result.interactionTypes[0] === 'choice') {
|
|
1266
|
+
const numberOfOptions = result.editorState.options.length;
|
|
1267
|
+
this.editorService.optionsLength = numberOfOptions;
|
|
1268
|
+
this.getOptions();
|
|
1269
|
+
}
|
|
1270
|
+
}
|
|
1271
|
+
});
|
|
1272
|
+
}
|
|
1273
|
+
updateTreeCache(sectionName, branchingLogic, selectedSection) {
|
|
1274
|
+
const metadata = {
|
|
1275
|
+
name: sectionName,
|
|
1276
|
+
primaryCategory: this.sectionPrimaryCategory,
|
|
1277
|
+
allowBranching: 'Yes',
|
|
1278
|
+
branchingLogic
|
|
1279
|
+
};
|
|
1280
|
+
this.treeService.updateNode(metadata, selectedSection, this.sectionPrimaryCategory);
|
|
1281
|
+
}
|
|
1282
|
+
setCondition(data) {
|
|
1283
|
+
const Condition = _.get(data?.branchingLogic, `${this.questionId}.preCondition.and[0]`);
|
|
1284
|
+
const getCondition = Object.keys(Condition);
|
|
1285
|
+
this.condition = getCondition[0];
|
|
1286
|
+
this.selectedOptions = Condition[getCondition][1];
|
|
1287
|
+
}
|
|
1288
|
+
getBranchingLogic(children) {
|
|
1289
|
+
_.forEach(children, (data) => {
|
|
1290
|
+
if (data.identifier === this.selectedSectionId) {
|
|
1291
|
+
this.branchingLogic = data?.branchingLogic ? data?.branchingLogic : {};
|
|
1292
|
+
if (_.get(data?.branchingLogic, `${this.questionId}.source[0]`)) {
|
|
1293
|
+
this.isChildQuestion = true;
|
|
1294
|
+
this.getParentQuestionOptions(data.branchingLogic[this.questionId].source[0]);
|
|
1295
|
+
this.setCondition(data);
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
if (data?.children) {
|
|
1299
|
+
this.getBranchingLogic(data?.children);
|
|
1300
|
+
}
|
|
1301
|
+
});
|
|
1302
|
+
}
|
|
1303
|
+
onQualityFormSubmit(event) {
|
|
1304
|
+
switch (event.action) {
|
|
1305
|
+
case 'submit':
|
|
1306
|
+
this.saveQualityParameters(event.data, this.sendQuestionForPublish.bind(this, {}));
|
|
1307
|
+
break;
|
|
1308
|
+
case 'requestChange':
|
|
1309
|
+
this.requestChangesPopupAction = null;
|
|
1310
|
+
this.saveQualityParameters(event.data, this.openRequestChangesPopup.bind(this, {}));
|
|
1311
|
+
break;
|
|
1312
|
+
default:
|
|
1313
|
+
this.showQualityParameterPopup = false;
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
saveQualityParameters(qualityParameters, callback) {
|
|
1317
|
+
const requestObj = {
|
|
1318
|
+
question: {
|
|
1319
|
+
reviewerQualityChecks: qualityParameters
|
|
1320
|
+
}
|
|
1321
|
+
};
|
|
1322
|
+
this.questionService.updateQuestion(this.questionId, requestObj).subscribe(res => {
|
|
1323
|
+
this.showQualityParameterPopup = false;
|
|
1324
|
+
if (callback) {
|
|
1325
|
+
callback();
|
|
1326
|
+
}
|
|
1327
|
+
});
|
|
1328
|
+
}
|
|
1329
|
+
openRequestChangesPopup() {
|
|
1330
|
+
this.requestChangesPopupAction = 'rejectQuestion';
|
|
1331
|
+
}
|
|
1332
|
+
calculateMinMaxScore(metaData) {
|
|
1333
|
+
const scores = [];
|
|
1334
|
+
if (!_.isEmpty(metaData.responseDeclaration.response1.mapping)) {
|
|
1335
|
+
metaData.responseDeclaration.response1.mapping.forEach(item => scores.push(item.outcomes.score));
|
|
1336
|
+
metaData.responseDeclaration.response1.minScore = Math.min(...scores);
|
|
1337
|
+
if (_.get(metaData, 'responseDeclaration.response1.cardinality') === 'multiple') {
|
|
1338
|
+
let sum = 0;
|
|
1339
|
+
metaData.responseDeclaration.response1.mapping.forEach(item => sum += +(item.outcomes.score));
|
|
1340
|
+
metaData.responseDeclaration.response1.maxScore = sum;
|
|
1341
|
+
}
|
|
1342
|
+
else {
|
|
1343
|
+
metaData.responseDeclaration.response1.maxScore = Math.max(...scores);
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
}
|
|
1347
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: QuestionComponent, deps: [{ token: i1.QuestionService }, { token: i2.EditorService }, { token: i3.EditorTelemetryService }, { token: i4.PlayerService }, { token: i5.ToasterService }, { token: i6.TreeService }, { token: i7.FrameworkService }, { token: i8.Router }, { token: i9.ConfigService }, { token: i10.EditorCursor }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1348
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: QuestionComponent, selector: "lib-question", inputs: { questionInput: "questionInput", leafFormConfig: "leafFormConfig" }, outputs: { questionEmitter: "questionEmitter" }, ngImport: i0, template: "<div class=\"sb-editor-container mb-0\" *ngIf=\"!showLoader\">\n <lib-header [labelConfigData]=\"toolbarConfig\" [buttonLoaders]=\"buttonLoaders\" [pageId]=\"pageId\" [requestChange] = \"requestChangesPopupAction\" (toolbarEmitter)=\"toolbarEventListener($event)\">\n </lib-header>\n\n <div class=\"sb-bg-white py-20\">\n <div class=\"ui container sb-container\">\n <div class=\"ui twelve column wide h-100\">\n <div class=\"px-16\">\n <div *ngIf=\"showPreview\" class=\"br-2 b-1-100\">\n <lib-quml-player [questionSetHierarchy]=\"questionSetHierarchy\" [isSingleQuestionPreview]=\"true\" ></lib-quml-player>\n </div>\n <div style=\"display: flex;align-items: flex-end;justify-content: flex-end;\"\n *ngIf=\"showOptions || isChildQuestion \">\n <div class=\"options\">\n <sui-select [(ngModel)]=\"condition\" valueField=\"value\" class=\"selection multiselect\"\n labelField=\"label\" [placeholder]=\"'Select Condition'\" #select [isDisabled]=\"isReadOnlyMode\">\n <sui-select-option [value]=\"{label:'Equal to',value:'eq'}\"></sui-select-option>\n <sui-select-option [value]=\"{label:'Not equal',value:'ne'}\"></sui-select-option>\n </sui-select>\n\n <sui-multi-select class=\"selection multiselect\" [(ngModel)]=\"selectedOptions\" valueField=\"value\"\n labelField=\"label\" [isSearchable]=\"false\" #multiSelect [placeholder]=\"'Select options'\" [isDisabled]=\"isReadOnlyMode\" >\n <sui-select-option *ngFor=\"let option of options\" [value]=\"option\">\n </sui-select-option>\n </sui-multi-select>\n </div>\n </div>\n <div class=\"py-20 px-32 br-4 b-1-100\" *ngIf=\"!showPreview\" [ngClass]=\"{'sb-bg-color-primary-0': !isReadOnlyMode}\">\n <div class=\"sb-field-group\">\n <label class=\"fs-0-92 font-weight-bold\">{{configService.labelConfig?.lbl?.question}}<span class=\"sb-required\">*</span></label>\n <div class=\"sb-field\">\n <div class=\"ckeditor-tool__question mb-5\">\n <lib-ckeditor-tool\n (editorDataOutput)=\"editorDataHandler($event, 'question')\"\n [editorDataInput]=\"editorState.question\"\n (videoDataOutput)=\"videoDataOutput($event)\" [videoShow]=\"videoShow\"></lib-ckeditor-tool>\n </div>\n <label *ngIf=\"\n showFormError &&\n [undefined, ''].includes(editorState.question)\n \" class=\"sb-color-error fs-0-785\">{{configService.labelConfig?.lbl?.questionRequired}}</label>\n </div>\n\n <lib-answer *ngIf=\"questionInteractionType === 'default'\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\"></lib-answer>\n\n <lib-options *ngIf=\"questionInteractionType === 'choice'\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\"></lib-options>\n\n <div class=\"d-flex flex-ai-center ckeditor-tool__solution py-10 px-16 mt-15 sb-bg-color-white\">\n <label class=\"fs-0-92 mb-0 ckeditor-tool__label pb-4\">\n <span class=\"sb-color-primary fs-0-785 mr-4\">{{configService.labelConfig?.lbl?.solution}}</span>\n <span class=\"sb-color-gray-200 fxsmall font-weight-normal\">{{configService.labelConfig?.lbl?.optional}}</span>\n </label>\n <div\n class=\"ui dropdown sb-btn sb-btn-outline-primary sb-btn-normal sb-right-icon-btn sb-btn-radius ml-auto\"\n suiDropdown autoClose=\"itemClick\" *ngIf=\"showSolutionDropDown\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('choose_type','click','single_select', telemetryService.telemetryPageId)\">\n <div class=\"text gray-200\">{{configService.labelConfig?.lbl?.chooseType}}</div>\n <i class=\"dropdown icon mx-8\"></i>\n <div class=\"menu\" suiDropdownMenu>\n <div class=\"item\" (click)=\"selectSolutionType('Text+Image')\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n {{configService.labelConfig?.lbl?.textImage}}\n </div>\n <div class=\"item\" (click)=\"selectSolutionType('video')\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'video'})\">\n {{configService.labelConfig?.lbl?.video}}\n </div>\n </div>\n </div>\n </div>\n <div class=\"solution_html\" *ngIf=\"selectedSolutionType == 'html'\">\n <div class=\"ckeditor-tool-container\">\n <div class=\"sb-ckeditor relative mb-8\">\n <button (click)=\"deleteSolution()\" class=\"sb-btn sb-ckeditor-close absolute\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n <i class=\"icon close\"></i>\n </button>\n <lib-ckeditor-tool (editorDataOutput)=\"\n editorDataHandler($event, 'solution')\n \"[editorDataInput]=\"editorState.solutions\"\n class=\"ckeditor-tool__option\"></lib-ckeditor-tool>\n </div>\n </div>\n </div>\n <div class=\"solution_video\" *ngIf=\"selectedSolutionType == 'video' && showSolution\">\n <div class=\"ckeditor-tool__solution sb-bg-color-white sb-ckeditor relative\">\n <div class=\"solution-media p-16 d-flex flex-ai-center ckeditor-tool__option p-16\">\n <div class=\"mcq-checkbox-answer\">\n <button class=\"sb-btn sb-ckeditor-close absolute\" (click)=\"deleteSolution()\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', this.telemetryService.telemetryPageId, {solution_type:'video'})\">\n <i class=\"icon close\"></i>\n </button>\n </div>\n <div class=\"solution-media__video relative position\">\n <div class=\"overlay-image\" [ngStyle]=\"\n videoThumbnail\n ? { background: 'url(' + videoThumbnail + ')' }\n : { background: 'rgba(0,0,0,0.3)' }\n \">\n <i class=\"play circle icon\"></i>\n </div>\n </div>\n <div class=\"solution-media__desc ml-16 sb-color-primary\">\n {{ videoSolutionName\n }}\n <!-- <i class=\"icon ellipsis vertical sb-color-black\"></i> -->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- <lib-translations *ngIf=\"showTranslation\"></lib-translations> -->\n <!-- child question section -->\n <div class=\"b-1-100 br-4 my-15 px-32 py-10 sb-bg-color-primary-0\"\n *ngFor=\"let question of dependentQuestions;let childindex=index\">\n {{ questionSetHierarchy.children ? 'Q'+ (questionSetHierarchy.children.length+1):''}} {{'. '+\n (childindex+1)}}\n <button\n class=\"sb-btn sb-btn-outline-primary sb-btn-xs sb-left-icon-btn text-inherit b-0 bg-none no-hover pl-0\">\n <span class=\"sb-line-height-24\">edit question</span>\n </button>\n </div>\n <hr>\n <div *ngIf=\"questionFormConfig\">\n <div class=\"pl-5 py-10 font-weight-bold fs-0-92\">\n {{configService.labelConfig?.lbl?.Questiondetails}}\n </div>\n <div class=\"form-container px-30\">\n <sb-dynamic-form [config]=\"leafFormConfig\" (initialize)=\"output($event)\"\n (statusChanges)=\"onStatusChanges($event)\" (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<sui-modal *ngIf=\"showConfirmPopup\" [mustScroll]=\"true\" [isClosable]=\"true\" [transitionDuration]=\"0\" [size]=\"'small'\"\n class=\"sb-modal bx-none overflow-modal\" appBodyScroll (dismissed)=\"showConfirmPopup = !showConfirmPopup\" #modal>\n <div class=\"sb-modal-header\"></div>\n <div class=\"sb-modal-content\">\n {{configService.labelConfig?.lbl?.confirmQuestionNotSaved}}\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" (click)=\"redirectToQuestionset()\">\n {{configService.labelConfig?.button_labels?.yes_btn_label}}\n </button>\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"showConfirmPopup = !showConfirmPopup\">\n {{configService.labelConfig?.button_labels?.no_btn_label}}\n </button>\n </div>\n</sui-modal>\n\n<lib-term-and-condition\n [showEditingConsent]=\"editorService.isReviewerEditEnable\"\n [showSubmitConfirmPopup]=\"showSubmitConfirmPopup\" (sendForReviewOutput)=\"onConsentSubmit($event)\">\n</lib-term-and-condition>\n\n<sui-modal *ngIf=\"showReviewModal\" [mustScroll]=\"true\" [isClosable]=\"false\" [transitionDuration]=\"0\"\n [size]=\"'normal'\" class=\"sb-modal bx-none overflow-modal\" appBodyScroll #modal (dismissed)=\"showReviewModal = false;\">\n <div class=\"sb-modal-header\">\n {{configService.labelConfig?.lbl?.reviewComments}}\n </div>\n <div class=\"sb-modal-content\">\n <div class=\"sb-field\">\n <label>{{configService.labelConfig?.lbl?.comments}}</label>\n <textarea disabled=\"disabled\" type=\"text\" class=\"wmd-input width-100 sb-form-control p-10 sb-disabled-textarea\" id=\"wmd-input\" [(ngModel)]=\"contentComment\" name=\"rejectedComment\"></textarea>\n </div>\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"modal.deny('denied')\"\n libTelemetryInteract [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('close','click','cancel', telemetryService.telemetryPageId, {key: 'dialog_id', value: 'review_comments'})\">{{configService.labelConfig?.button_labels?.close_btn_label}}</button>\n </div>\n</sui-modal>\n\n<lib-quality-params-modal\n [labelConfigData]=\"toolbarConfig\"\n [showQualityParameterPopup]=\"showQualityParameterPopup\"\n [qualityFormConfig]=\"qualityFormConfig\"\n (qualityParamChanged)=\"onQualityFormSubmit($event)\">\n</lib-quality-params-modal>\n", styles: [".sb-w-85{width:85%}sui-select{width:100%;border:1px solid rgba(34,36,38,.15);font-size:.8rem;padding:.4rem .2rem;background:#fff}.dropdown.icon{float:right!important}.menu{width:100%}.solution-media__video{width:166px;height:96px}.solution-media__video .overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer;z-index:1}.solution-media__video .overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer;height:auto}.solution-media__desc{font-size:12px;font-weight:700;color:#333;max-width:180px;height:96px;display:flex;align-items:flex-end;line-height:normal;line-height:13px}.ckeditor-tool__option,.ckeditor-tool__question{border:1px solid #c4c4c4;border-radius:4px;border-top:0;position:relative;display:flow-root}.ckeditor-tool__solution{border:1px solid #c4c4c4;border-radius:4px;margin-bottom:-4px}.ckeditor-tool__solution .menu .item{font-size:.785rem!important}.solution_video .ckeditor-tool__option{border:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-radius:4px!important}.solution_html .sb-ckeditor .sb-ckeditor-close,.solution_video .sb-ckeditor .sb-ckeditor-close{right:5px;top:-30px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-ckeditor .sb-ckeditor-close{right:-5px;top:-22px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-mcq-form .sb-mcq-item:nth-child(4) .sb-ckeditor .ckeditor-tool__option{margin-bottom:0!important}.two-column-grid{display:grid;grid-template-columns:repeat(2,1fr);column-gap:.5rem;border-bottom:solid 1px var(--gray-100)}.two-column-grid:last-child{border-bottom:none}.dynamic-form .sb-search-input::-webkit-input-placeholder{padding-left:1.4rem!important}.dynamic-form .required label:after,.sb-editor-container .dynamic-form .required .multi-select-container .list-border ul:after,.sb-editor-container .dynamic-form .multi-select-container .list-border .required ul:after{content:\"*\";margin:-.2em 0 0 .2em;color:#db2828}.list-border{height:inherit!important}.list-border ul{padding:0!important}.list-border ul span{font-weight:500!important;font-size:.785rem}.sb-editor-container{position:relative;z-index:999!important}.sb-editor-container .sb-input:first-child{margin:1rem 0!important}.sb-editor-container .sb-container{width:95%!important}.sb-editor-container .dynamic-form .sb-dropdown-select{padding:11px 8px!important}.sb-editor-container .dynamic-form label,.sb-editor-container .dynamic-form .multi-select-container .list-border ul{font-size:12px!important;margin-bottom:.5rem!important;color:#121213e0;font-weight:600}.sb-editor-container .dynamic-form .sb-textbox,.sb-editor-container .dynamic-form .topic-picker-selector,.sb-editor-container .dynamic-form select,.sb-editor-container .dynamic-form .sb-textarea,.sb-editor-container .dynamic-form .list-border{border:1px solid rgba(34,36,38,.15)!important;padding:12px 8px!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500}.sb-editor-container .dynamic-form .multi-select-container .list-border ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-weight:500!important}.sb-editor-container .dynamic-form .sb-modal-dropdown-web ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-size:12px!important;font-weight:500;border:2px solid #eeeeef}.sb-editor-container .dynamic-form .sb-keywordbox{border:1px solid rgba(34,36,38,.15)!important;padding:.45rem .5rem!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500;padding:0!important}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input{padding:0}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input tag{margin-left:.5rem}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tags-container{margin-top:.2rem}.sb-editor-container .dynamic-form .sb-keywordbox .tag-wrapper,.sb-editor-container .dynamic-form .sb-keywordbox delete-icon svg{height:24px;line-height:24px}.sb-editor-container .dynamic-form .sb-dropdown label,.sb-editor-container .dynamic-form .sb-dropdown .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-dropdown ul{padding:0}.sb-editor-container .dynamic-form .sb-textarea-container .sb-textarea{height:2.9rem;padding-top:.5rem!important}.sb-editor-container .dynamic-form .sb-textarea-container label,.sb-editor-container .dynamic-form .sb-textarea-container .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-textarea-container ul{padding:0}.sb-editor-container .dynamic-form .sb-checkbox{padding:0;margin-top:0}.sb-editor-container .dynamic-form sb-icon-dropdown{top:10px!important;right:6px!important}.sb-editor-container .sb-textarea-container,.sb-editor-container .sb-dropdown{margin:1rem 0!important}lib-chat-window,.chat_bot{display:none!important}.h-100{height:100%!important}.sb-required{color:#ff4558;padding-left:2px;position:relative;top:-5px}select[disabled]{opacity:.8!important;font-weight:500!important}.multiselect{position:relative;top:-7px;height:48px;left:7px;font-size:14px;font-weight:400}.treepicker-parent .list-border{height:38px!important;padding:1rem!important;margin-top:15px!important}.options{justify-content:flex-end;margin-right:10px;display:flex;gap:10px}\n"], dependencies: [{ kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i13.SuiDropdown, selector: "[suiDropdown]", inputs: ["isOpen", "isDisabled", "tabindex", "autoClose"], outputs: ["isOpenChange"] }, { kind: "directive", type: i13.SuiDropdownMenu, selector: "[suiDropdownMenu]", inputs: ["menuTransition", "menuTransitionDuration", "menuAutoSelectFirst", "menuSelectedItemClass"] }, { kind: "directive", type: i13.SuiDropdownMenuItem, selector: ".item" }, { kind: "component", type: i13.SuiModal, selector: "sui-modal", inputs: ["isClosable", "closeResult", "size", "isCentered", "isFullScreen", "isBasic", "mustScroll", "isInverted", "transition", "transitionDuration"], outputs: ["approved", "denied", "dismissed"] }, { kind: "component", type: i13.SuiSelect, selector: "sui-select", inputs: ["placeholder"], outputs: ["selectedOptionChange"] }, { kind: "component", type: i13.SuiSelectOption, selector: "sui-select-option", inputs: ["value"], outputs: ["onSelected"] }, { kind: "directive", type: i13.SuiSelectValueAccessor, selector: "sui-select" }, { kind: "component", type: i13.SuiMultiSelect, selector: "sui-multi-select", inputs: ["hasLabels", "placeholder", "maxSelected", "zeroSelectionText", "defaultSelectionText"], outputs: ["selectedOptionsChange"] }, { kind: "directive", type: i13.SuiMultiSelectValueAccessor, selector: "sui-multi-select" }, { kind: "component", type: i14.DynamicFormComponent, selector: "sb-dynamic-form", inputs: ["config", "dataLoadStatusDelegate"], outputs: ["initialize", "finalize", "valueChanges", "statusChanges"] }, { kind: "component", type: i15.HeaderComponent, selector: "lib-header", inputs: ["pageId", "labelConfigData", "buttonLoaders", "showComment", "publishchecklist", "requestChange"], outputs: ["toolbarEmitter", "qualityParamEmitter"] }, { kind: "component", type: i16.OptionsComponent, selector: "lib-options", inputs: ["editorState", "showFormError", "sourcingSettings", "isReadOnlyMode", "showSubMenu", "parentMeta"], outputs: ["editorDataOutput"] }, { kind: "component", type: i17.AnswerComponent, selector: "lib-answer", inputs: ["editorState", "showFormError"], outputs: ["editorDataOutput"] }, { kind: "component", type: i18.CkeditorToolComponent, selector: "lib-ckeditor-tool", inputs: ["editorDataInput", "videoShow", "setCharacterLimit", "setImageLimit"], outputs: ["editorDataOutput", "hasError", "videoDataOutput"] }, { kind: "directive", type: i19.TelemetryInteractDirective, selector: "[libTelemetryInteract]", inputs: ["telemetryInteractEdata"] }, { kind: "component", type: i20.QumlPlayerComponent, selector: "lib-quml-player", inputs: ["questionSetHierarchy", "isSingleQuestionPreview"], outputs: ["toolbarEmitter"] }, { kind: "component", type: i21.TermAndConditionComponent, selector: "lib-term-and-condition", inputs: ["showEditingConsent", "showSubmitConfirmPopup"], outputs: ["sendForReviewOutput"] }, { kind: "component", type: i22.QualityParamsModalComponent, selector: "lib-quality-params-modal", inputs: ["qualityFormConfig", "showQualityParameterPopup", "labelConfigData"], outputs: ["qualityParamChanged"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
1349
|
+
}
|
|
1350
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: QuestionComponent, decorators: [{
|
|
1351
|
+
type: Component,
|
|
1352
|
+
args: [{ selector: 'lib-question', encapsulation: ViewEncapsulation.None, template: "<div class=\"sb-editor-container mb-0\" *ngIf=\"!showLoader\">\n <lib-header [labelConfigData]=\"toolbarConfig\" [buttonLoaders]=\"buttonLoaders\" [pageId]=\"pageId\" [requestChange] = \"requestChangesPopupAction\" (toolbarEmitter)=\"toolbarEventListener($event)\">\n </lib-header>\n\n <div class=\"sb-bg-white py-20\">\n <div class=\"ui container sb-container\">\n <div class=\"ui twelve column wide h-100\">\n <div class=\"px-16\">\n <div *ngIf=\"showPreview\" class=\"br-2 b-1-100\">\n <lib-quml-player [questionSetHierarchy]=\"questionSetHierarchy\" [isSingleQuestionPreview]=\"true\" ></lib-quml-player>\n </div>\n <div style=\"display: flex;align-items: flex-end;justify-content: flex-end;\"\n *ngIf=\"showOptions || isChildQuestion \">\n <div class=\"options\">\n <sui-select [(ngModel)]=\"condition\" valueField=\"value\" class=\"selection multiselect\"\n labelField=\"label\" [placeholder]=\"'Select Condition'\" #select [isDisabled]=\"isReadOnlyMode\">\n <sui-select-option [value]=\"{label:'Equal to',value:'eq'}\"></sui-select-option>\n <sui-select-option [value]=\"{label:'Not equal',value:'ne'}\"></sui-select-option>\n </sui-select>\n\n <sui-multi-select class=\"selection multiselect\" [(ngModel)]=\"selectedOptions\" valueField=\"value\"\n labelField=\"label\" [isSearchable]=\"false\" #multiSelect [placeholder]=\"'Select options'\" [isDisabled]=\"isReadOnlyMode\" >\n <sui-select-option *ngFor=\"let option of options\" [value]=\"option\">\n </sui-select-option>\n </sui-multi-select>\n </div>\n </div>\n <div class=\"py-20 px-32 br-4 b-1-100\" *ngIf=\"!showPreview\" [ngClass]=\"{'sb-bg-color-primary-0': !isReadOnlyMode}\">\n <div class=\"sb-field-group\">\n <label class=\"fs-0-92 font-weight-bold\">{{configService.labelConfig?.lbl?.question}}<span class=\"sb-required\">*</span></label>\n <div class=\"sb-field\">\n <div class=\"ckeditor-tool__question mb-5\">\n <lib-ckeditor-tool\n (editorDataOutput)=\"editorDataHandler($event, 'question')\"\n [editorDataInput]=\"editorState.question\"\n (videoDataOutput)=\"videoDataOutput($event)\" [videoShow]=\"videoShow\"></lib-ckeditor-tool>\n </div>\n <label *ngIf=\"\n showFormError &&\n [undefined, ''].includes(editorState.question)\n \" class=\"sb-color-error fs-0-785\">{{configService.labelConfig?.lbl?.questionRequired}}</label>\n </div>\n\n <lib-answer *ngIf=\"questionInteractionType === 'default'\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\"></lib-answer>\n\n <lib-options *ngIf=\"questionInteractionType === 'choice'\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\"></lib-options>\n\n <div class=\"d-flex flex-ai-center ckeditor-tool__solution py-10 px-16 mt-15 sb-bg-color-white\">\n <label class=\"fs-0-92 mb-0 ckeditor-tool__label pb-4\">\n <span class=\"sb-color-primary fs-0-785 mr-4\">{{configService.labelConfig?.lbl?.solution}}</span>\n <span class=\"sb-color-gray-200 fxsmall font-weight-normal\">{{configService.labelConfig?.lbl?.optional}}</span>\n </label>\n <div\n class=\"ui dropdown sb-btn sb-btn-outline-primary sb-btn-normal sb-right-icon-btn sb-btn-radius ml-auto\"\n suiDropdown autoClose=\"itemClick\" *ngIf=\"showSolutionDropDown\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('choose_type','click','single_select', telemetryService.telemetryPageId)\">\n <div class=\"text gray-200\">{{configService.labelConfig?.lbl?.chooseType}}</div>\n <i class=\"dropdown icon mx-8\"></i>\n <div class=\"menu\" suiDropdownMenu>\n <div class=\"item\" (click)=\"selectSolutionType('Text+Image')\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n {{configService.labelConfig?.lbl?.textImage}}\n </div>\n <div class=\"item\" (click)=\"selectSolutionType('video')\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'video'})\">\n {{configService.labelConfig?.lbl?.video}}\n </div>\n </div>\n </div>\n </div>\n <div class=\"solution_html\" *ngIf=\"selectedSolutionType == 'html'\">\n <div class=\"ckeditor-tool-container\">\n <div class=\"sb-ckeditor relative mb-8\">\n <button (click)=\"deleteSolution()\" class=\"sb-btn sb-ckeditor-close absolute\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n <i class=\"icon close\"></i>\n </button>\n <lib-ckeditor-tool (editorDataOutput)=\"\n editorDataHandler($event, 'solution')\n \"[editorDataInput]=\"editorState.solutions\"\n class=\"ckeditor-tool__option\"></lib-ckeditor-tool>\n </div>\n </div>\n </div>\n <div class=\"solution_video\" *ngIf=\"selectedSolutionType == 'video' && showSolution\">\n <div class=\"ckeditor-tool__solution sb-bg-color-white sb-ckeditor relative\">\n <div class=\"solution-media p-16 d-flex flex-ai-center ckeditor-tool__option p-16\">\n <div class=\"mcq-checkbox-answer\">\n <button class=\"sb-btn sb-ckeditor-close absolute\" (click)=\"deleteSolution()\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', this.telemetryService.telemetryPageId, {solution_type:'video'})\">\n <i class=\"icon close\"></i>\n </button>\n </div>\n <div class=\"solution-media__video relative position\">\n <div class=\"overlay-image\" [ngStyle]=\"\n videoThumbnail\n ? { background: 'url(' + videoThumbnail + ')' }\n : { background: 'rgba(0,0,0,0.3)' }\n \">\n <i class=\"play circle icon\"></i>\n </div>\n </div>\n <div class=\"solution-media__desc ml-16 sb-color-primary\">\n {{ videoSolutionName\n }}\n <!-- <i class=\"icon ellipsis vertical sb-color-black\"></i> -->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- <lib-translations *ngIf=\"showTranslation\"></lib-translations> -->\n <!-- child question section -->\n <div class=\"b-1-100 br-4 my-15 px-32 py-10 sb-bg-color-primary-0\"\n *ngFor=\"let question of dependentQuestions;let childindex=index\">\n {{ questionSetHierarchy.children ? 'Q'+ (questionSetHierarchy.children.length+1):''}} {{'. '+\n (childindex+1)}}\n <button\n class=\"sb-btn sb-btn-outline-primary sb-btn-xs sb-left-icon-btn text-inherit b-0 bg-none no-hover pl-0\">\n <span class=\"sb-line-height-24\">edit question</span>\n </button>\n </div>\n <hr>\n <div *ngIf=\"questionFormConfig\">\n <div class=\"pl-5 py-10 font-weight-bold fs-0-92\">\n {{configService.labelConfig?.lbl?.Questiondetails}}\n </div>\n <div class=\"form-container px-30\">\n <sb-dynamic-form [config]=\"leafFormConfig\" (initialize)=\"output($event)\"\n (statusChanges)=\"onStatusChanges($event)\" (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<sui-modal *ngIf=\"showConfirmPopup\" [mustScroll]=\"true\" [isClosable]=\"true\" [transitionDuration]=\"0\" [size]=\"'small'\"\n class=\"sb-modal bx-none overflow-modal\" appBodyScroll (dismissed)=\"showConfirmPopup = !showConfirmPopup\" #modal>\n <div class=\"sb-modal-header\"></div>\n <div class=\"sb-modal-content\">\n {{configService.labelConfig?.lbl?.confirmQuestionNotSaved}}\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" (click)=\"redirectToQuestionset()\">\n {{configService.labelConfig?.button_labels?.yes_btn_label}}\n </button>\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"showConfirmPopup = !showConfirmPopup\">\n {{configService.labelConfig?.button_labels?.no_btn_label}}\n </button>\n </div>\n</sui-modal>\n\n<lib-term-and-condition\n [showEditingConsent]=\"editorService.isReviewerEditEnable\"\n [showSubmitConfirmPopup]=\"showSubmitConfirmPopup\" (sendForReviewOutput)=\"onConsentSubmit($event)\">\n</lib-term-and-condition>\n\n<sui-modal *ngIf=\"showReviewModal\" [mustScroll]=\"true\" [isClosable]=\"false\" [transitionDuration]=\"0\"\n [size]=\"'normal'\" class=\"sb-modal bx-none overflow-modal\" appBodyScroll #modal (dismissed)=\"showReviewModal = false;\">\n <div class=\"sb-modal-header\">\n {{configService.labelConfig?.lbl?.reviewComments}}\n </div>\n <div class=\"sb-modal-content\">\n <div class=\"sb-field\">\n <label>{{configService.labelConfig?.lbl?.comments}}</label>\n <textarea disabled=\"disabled\" type=\"text\" class=\"wmd-input width-100 sb-form-control p-10 sb-disabled-textarea\" id=\"wmd-input\" [(ngModel)]=\"contentComment\" name=\"rejectedComment\"></textarea>\n </div>\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"modal.deny('denied')\"\n libTelemetryInteract [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('close','click','cancel', telemetryService.telemetryPageId, {key: 'dialog_id', value: 'review_comments'})\">{{configService.labelConfig?.button_labels?.close_btn_label}}</button>\n </div>\n</sui-modal>\n\n<lib-quality-params-modal\n [labelConfigData]=\"toolbarConfig\"\n [showQualityParameterPopup]=\"showQualityParameterPopup\"\n [qualityFormConfig]=\"qualityFormConfig\"\n (qualityParamChanged)=\"onQualityFormSubmit($event)\">\n</lib-quality-params-modal>\n", styles: [".sb-w-85{width:85%}sui-select{width:100%;border:1px solid rgba(34,36,38,.15);font-size:.8rem;padding:.4rem .2rem;background:#fff}.dropdown.icon{float:right!important}.menu{width:100%}.solution-media__video{width:166px;height:96px}.solution-media__video .overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer;z-index:1}.solution-media__video .overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer;height:auto}.solution-media__desc{font-size:12px;font-weight:700;color:#333;max-width:180px;height:96px;display:flex;align-items:flex-end;line-height:normal;line-height:13px}.ckeditor-tool__option,.ckeditor-tool__question{border:1px solid #c4c4c4;border-radius:4px;border-top:0;position:relative;display:flow-root}.ckeditor-tool__solution{border:1px solid #c4c4c4;border-radius:4px;margin-bottom:-4px}.ckeditor-tool__solution .menu .item{font-size:.785rem!important}.solution_video .ckeditor-tool__option{border:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-radius:4px!important}.solution_html .sb-ckeditor .sb-ckeditor-close,.solution_video .sb-ckeditor .sb-ckeditor-close{right:5px;top:-30px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-ckeditor .sb-ckeditor-close{right:-5px;top:-22px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-mcq-form .sb-mcq-item:nth-child(4) .sb-ckeditor .ckeditor-tool__option{margin-bottom:0!important}.two-column-grid{display:grid;grid-template-columns:repeat(2,1fr);column-gap:.5rem;border-bottom:solid 1px var(--gray-100)}.two-column-grid:last-child{border-bottom:none}.dynamic-form .sb-search-input::-webkit-input-placeholder{padding-left:1.4rem!important}.dynamic-form .required label:after,.sb-editor-container .dynamic-form .required .multi-select-container .list-border ul:after,.sb-editor-container .dynamic-form .multi-select-container .list-border .required ul:after{content:\"*\";margin:-.2em 0 0 .2em;color:#db2828}.list-border{height:inherit!important}.list-border ul{padding:0!important}.list-border ul span{font-weight:500!important;font-size:.785rem}.sb-editor-container{position:relative;z-index:999!important}.sb-editor-container .sb-input:first-child{margin:1rem 0!important}.sb-editor-container .sb-container{width:95%!important}.sb-editor-container .dynamic-form .sb-dropdown-select{padding:11px 8px!important}.sb-editor-container .dynamic-form label,.sb-editor-container .dynamic-form .multi-select-container .list-border ul{font-size:12px!important;margin-bottom:.5rem!important;color:#121213e0;font-weight:600}.sb-editor-container .dynamic-form .sb-textbox,.sb-editor-container .dynamic-form .topic-picker-selector,.sb-editor-container .dynamic-form select,.sb-editor-container .dynamic-form .sb-textarea,.sb-editor-container .dynamic-form .list-border{border:1px solid rgba(34,36,38,.15)!important;padding:12px 8px!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500}.sb-editor-container .dynamic-form .multi-select-container .list-border ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-weight:500!important}.sb-editor-container .dynamic-form .sb-modal-dropdown-web ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-size:12px!important;font-weight:500;border:2px solid #eeeeef}.sb-editor-container .dynamic-form .sb-keywordbox{border:1px solid rgba(34,36,38,.15)!important;padding:.45rem .5rem!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500;padding:0!important}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input{padding:0}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input tag{margin-left:.5rem}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tags-container{margin-top:.2rem}.sb-editor-container .dynamic-form .sb-keywordbox .tag-wrapper,.sb-editor-container .dynamic-form .sb-keywordbox delete-icon svg{height:24px;line-height:24px}.sb-editor-container .dynamic-form .sb-dropdown label,.sb-editor-container .dynamic-form .sb-dropdown .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-dropdown ul{padding:0}.sb-editor-container .dynamic-form .sb-textarea-container .sb-textarea{height:2.9rem;padding-top:.5rem!important}.sb-editor-container .dynamic-form .sb-textarea-container label,.sb-editor-container .dynamic-form .sb-textarea-container .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-textarea-container ul{padding:0}.sb-editor-container .dynamic-form .sb-checkbox{padding:0;margin-top:0}.sb-editor-container .dynamic-form sb-icon-dropdown{top:10px!important;right:6px!important}.sb-editor-container .sb-textarea-container,.sb-editor-container .sb-dropdown{margin:1rem 0!important}lib-chat-window,.chat_bot{display:none!important}.h-100{height:100%!important}.sb-required{color:#ff4558;padding-left:2px;position:relative;top:-5px}select[disabled]{opacity:.8!important;font-weight:500!important}.multiselect{position:relative;top:-7px;height:48px;left:7px;font-size:14px;font-weight:400}.treepicker-parent .list-border{height:38px!important;padding:1rem!important;margin-top:15px!important}.options{justify-content:flex-end;margin-right:10px;display:flex;gap:10px}\n"] }]
|
|
1353
|
+
}], ctorParameters: function () { return [{ type: i1.QuestionService }, { type: i2.EditorService }, { type: i3.EditorTelemetryService }, { type: i4.PlayerService }, { type: i5.ToasterService }, { type: i6.TreeService }, { type: i7.FrameworkService }, { type: i8.Router }, { type: i9.ConfigService }, { type: i10.EditorCursor }]; }, propDecorators: { questionInput: [{
|
|
1354
|
+
type: Input
|
|
1355
|
+
}], leafFormConfig: [{
|
|
1356
|
+
type: Input
|
|
1357
|
+
}], questionEmitter: [{
|
|
1358
|
+
type: Output
|
|
1359
|
+
}] } });
|
|
1360
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvcXVlc3Rpb24vcXVlc3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvcXVlc3Rpb24vcXVlc3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBaUIsaUJBQWlCLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBT25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTTNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJuRSxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUM1QixNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQVFsQyxNQUFNLE9BQU8saUJBQWlCO0lBcUY1QixZQUNVLGVBQWdDLEVBQVMsYUFBNEIsRUFBUyxnQkFBd0MsRUFDdkgsYUFBNEIsRUFBVSxjQUE4QixFQUFVLFdBQXdCLEVBQ3JHLGdCQUFrQyxFQUFVLE1BQWMsRUFBUyxhQUE0QixFQUMvRixZQUEwQjtRQUgxQixvQkFBZSxHQUFmLGVBQWUs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QUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7YUFDdkU7U0FDRjtJQUNILENBQUM7K0dBbDRDVSxpQkFBaUI7bUdBQWpCLGlCQUFpQixtTEMxQzlCLDgwV0E0TEE7OzRGRGxKYSxpQkFBaUI7a0JBTjdCLFNBQVM7K0JBQ0UsY0FBYyxpQkFHVCxpQkFBaUIsQ0FBQyxJQUFJO3NXQUk1QixhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0ksZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEFmdGVyVmlld0luaXQsIFZpZXdFbmNhcHN1bGF0aW9uLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgTWNxRm9ybSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvTWNxRm9ybSc7XG5pbXBvcnQgeyBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2VydmVyUmVzcG9uc2UnO1xuaW1wb3J0IHsgUXVlc3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcXVlc3Rpb24vcXVlc3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGxheWVyL3BsYXllci5zZXJ2aWNlJztcbmltcG9ydCB7IEVkaXRvclRlbGVtZXRyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90ZWxlbWV0cnkvdGVsZW1ldHJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VkaXRvci9lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RvYXN0ZXIvdG9hc3Rlci5zZXJ2aWNlJztcbmltcG9ydCB7IHRocm93RXJyb3IsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IEZyYW1ld29ya1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mcmFtZXdvcmsvZnJhbWV3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJlZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmVlL3RyZWUuc2VydmljZSc7XG5pbXBvcnQgeyBFZGl0b3JDdXJzb3IgfSBmcm9tICcuLi8uLi9jb2xsZWN0aW9uLWVkaXRvci1jdXJzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpbmFsaXplLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ViTWVudSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgbGFiZWw6IHN0cmluZztcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgdHlwZTogc3RyaW5nO1xuICBzaG93OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDcmVhdGlvbkNvbnRleHQge1xuICBvYmplY3RUeXBlPzogc3RyaW5nO1xuICBjb2xsZWN0aW9uT2JqZWN0VHlwZT86IHN0cmluZztcbn1cblxuY29uc3QgZXZpZGVuY2VNaW1lVHlwZSA9ICcnO1xuY29uc3QgZXZpZGVuY2VTaXplTGltaXQgPSAnMjA0ODAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItcXVlc3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vcXVlc3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9xdWVzdGlvbi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgUXVtbFBsYXllckNvbmZpZzogYW55ID0ge307XG4gIEBJbnB1dCgpIHF1ZXN0aW9uSW5wdXQ6IGFueTtcbiAgQElucHV0KCkgbGVhZkZvcm1Db25maWc6IGFueTtcbiAgcHVibGljIGluaXRpYWxMZWFmRm9ybUNvbmZpZzogYW55O1xuICBwdWJsaWMgY2hpbGRGb3JtRGF0YTogYW55O1xuICBAT3V0cHV0KCkgcXVlc3Rpb25FbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIHByaXZhdGUgb25Db21wb25lbnREZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgdG9vbGJhckNvbmZpZzogYW55ID0ge307XG4gIHB1YmxpYyBlZGl0b3JTdGF0ZTogYW55ID0ge307XG4gIHB1YmxpYyBzaG93UHJldmlldyA9IGZhbHNlO1xuICBwdWJsaWMgbWVkaWFBcnI6IGFueSA9IFtdO1xuICBwdWJsaWMgdmlkZW9TaG93ID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93Rm9ybUVycm9yID0gZmFsc2U7XG4gIHNlbGVjdGVkU29sdXRpb25UeXBlOiBzdHJpbmc7XG4gIHNlbGVjdGVkU29sdXRpb25UeXBlSW5kZXg6IHN0cmluZztcbiAgc2hvd1NvbHV0aW9uRHJvcERvd24gPSB0cnVlO1xuICBzaG93U29sdXRpb24gPSBmYWxzZTtcbiAgdmlkZW9Tb2x1dGlvbk5hbWU6IHN0cmluZztcbiAgdmlkZW9Tb2x1dGlvbkRhdGE6IGFueTtcbiAgdmlkZW9UaHVtYm5haWw6IHN0cmluZztcbiAgc29sdXRpb25VVUlEOiBzdHJpbmc7XG4gIHNvbHV0aW9uVmFsdWU6IHN0cmluZztcbiAgc29sdXRpb25UeXBlczogYW55ID0gW3tcbiAgICB0eXBlOiAnaHRtbCcsXG4gICAgdmFsdWU6ICdUZXh0K0ltYWdlJ1xuICB9LFxuICB7XG4gICAgdHlwZTogJ3ZpZGVvJyxcbiAgICB2YWx1ZTogJ3ZpZGVvJ1xuICB9XTtcbiAgcXVlc3Rpb25NZXRhRGF0YTogYW55O1xuICBxdWVzdGlvbkludGVyYWN0aW9uVHlwZTtcbiAgcXVlc3Rpb25JZDtcbiAgdGVtcFF1ZXN0aW9uSWQ7XG4gIHF1ZXN0aW9uU2V0SWQ7XG4gIHB1YmxpYyBzZXRDaGFyYWN0ZXJMaW1pdCA9IDE2MDtcbiAgcHVibGljIHNob3dMb2FkZXIgPSB0cnVlO1xuICBxdWVzdGlvblNldEhpZXJhcmNoeTogYW55O1xuICBzaG93Q29uZmlybVBvcHVwID0gZmFsc2U7XG4gIHZhbGlkUXVlc3Rpb25EYXRhID0gZmFsc2U7XG4gIHF1ZXN0aW9uUHJpbWFyeUNhdGVnb3J5OiBzdHJpbmc7XG4gIHBhZ2VJZCA9ICdxdWVzdGlvbic7XG4gIHBhZ2VTdGFydFRpbWU6IGFueTtcbiAgcHVibGljIGZyYW1ld29yaztcbiAgcHVibGljIGZyYW1ld29ya0RldGFpbHM6IGFueSA9IHt9O1xuICBwdWJsaWMgcXVlc3Rpb25NZXRhZGF0YUZvcm1TdGF0dXMgPSB0cnVlO1xuICBwdWJsaWMgYnV0dG9uTG9hZGVycyA9IHtcbiAgICBzYXZlQnV0dG9uTG9hZGVyOiBmYWxzZSxcbiAgICByZXZpZXc6IGZhbHNlXG4gIH07XG4gIHB1YmxpYyBzaG93VHJhbnNsYXRpb24gPSBmYWxzZTtcbiAgc3ViTWVudXM6IFN1Yk1lbnVbXTtcbiAgc2hvd0FkZFNlY29uZGFyeVF1ZXN0aW9uQ2F0OiBib29sZWFuO1xuICBzbGlkZXJEYXRhczogYW55ID0ge307XG4gIHNsaWRlck9wdGlvbnM6IGFueSA9IHt9O1xuICBoaW50czogYW55O1xuICBjYXRlZ29yeUxhYmVsOiBhbnkgPSB7fTtcbiAgc2NvcmVNYXBwaW5nOiBhbnk7XG4gIGNvbmRpdGlvbiA9ICdkZWZhdWx0JztcbiAgdGFyZ2V0T3B0aW9uOiBhbnk7XG4gIHJlc3BvbnNlVmFyaWFibGUgPSAncmVzcG9uc2UxJztcbiAgbmV3UXVlc3Rpb25JRDogYW55O1xuICBzaG93T3B0aW9uczogYm9vbGVhbjtcbiAgc2VsZWN0ZWRPcHRpb25zOiBhbnk7XG4gIG9wdGlvbnMgPSBbXTtcbiAgaXNDaGlsZFF1ZXN0aW9uID0gZmFsc2U7XG4gIGJyYW5jaGluZ0xvZ2ljOiBhbnk7XG4gIHNlbGVjdGVkU2VjdGlvbklkOiBhbnk7XG4gIHNlY3Rpb25QcmltYXJ5Q2F0ZWdvcnk6IGFueTtcbiAgbWF4U2NvcmUgPSAxO1xuICBwdWJsaWMgcXVlc3Rpb25Gb3JtQ29uZmlnOiBhbnk7XG4gIHRyZWVOb2RlRGF0YTogYW55O1xuICBzaG93UXVhbGl0eVBhcmFtZXRlclBvcHVwOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBxdWFsaXR5Rm9ybUNvbmZpZzogYW55O1xuICByZXF1ZXN0Q2hhbmdlc1BvcHVwQWN0aW9uOiBzdHJpbmc7XG4gIGlzUmVhZE9ubHlNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dTdWJtaXRDb25maXJtUG9wdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1Jldmlld01vZGFsOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnRlbnRDb21tZW50OiBzdHJpbmcgPSAnJztcbiAgY3JlYXRpb25Nb2RlOiBzdHJpbmc7XG4gIGFjdGlvblR5cGU6IHN0cmluZztcbiAgY3JlYXRpb25Db250ZXh0OiBJQ3JlYXRpb25Db250ZXh0O1xuICBzb3VyY2luZ1NldHRpbmdzOiBhbnk7XG4gIHF1ZXN0aW9uQ2F0ZWdvcnk6IHN0cmluZztcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBxdWVzdGlvblNlcnZpY2U6IFF1ZXN0aW9uU2VydmljZSwgcHVibGljIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsIHB1YmxpYyB0ZWxlbWV0cnlTZXJ2aWNlOiBFZGl0b3JUZWxlbWV0cnlTZXJ2aWNlLFxuICAgIHB1YmxpYyBwbGF5ZXJTZXJ2aWNlOiBQbGF5ZXJTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSwgcHJpdmF0ZSB0cmVlU2VydmljZTogVHJlZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmcmFtZXdvcmtTZXJ2aWNlOiBGcmFtZXdvcmtTZXJ2aWNlLCBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwdWJsaWMgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGVkaXRvckN1cnNvcjogRWRpdG9yQ3Vyc29yKSB7XG4gICAgY29uc3QgeyBwcmltYXJ5Q2F0ZWdvcnkgfSA9IHRoaXMuZWRpdG9yU2VydmljZS5zZWxlY3RlZENoaWxkcmVuO1xuICAgIHRoaXMucXVlc3Rpb25QcmltYXJ5Q2F0ZWdvcnkgPSBwcmltYXJ5Q2F0ZWdvcnk7XG4gICAgdGhpcy5wYWdlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHsgcXVlc3Rpb25TZXRJZCwgcXVlc3Rpb25JZCwgdHlwZSwgY2F0ZWdvcnksIGNyZWF0aW9uQ29udGV4dCwgY3JlYXRpb25Nb2RlIH0gPSB0aGlzLnF1ZXN0aW9uSW5wdXQ7XG4gICAgdGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9IHR5cGU7XG4gICAgdGhpcy5xdWVzdGlvbklkID0gcXVlc3Rpb25JZDtcbiAgICB0aGlzLnF1ZXN0aW9uU2V0SWQgPSBxdWVzdGlvblNldElkO1xuICAgIHRoaXMudG9vbGJhckNvbmZpZyA9IHRoaXMuZWRpdG9yU2VydmljZS5nZXRUb29sYmFyQ29uZmlnKCk7XG4gICAgdGhpcy50b29sYmFyQ29uZmlnLnNob3dQcmV2aWV3ID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvck1vZGUgIT09ICdlZGl0JztcbiAgICB0aGlzLnRvb2xiYXJDb25maWcuYWRkX3RyYW5zbGF0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLnRyZWVOb2RlRGF0YSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0Rmlyc3RDaGlsZCgpO1xuICAgIGlmIChfLmdldCh0aGlzLmNyZWF0aW9uQ29udGV4dCwgJ29iamVjdFR5cGUnKSA9PT0gJ3F1ZXN0aW9uJykgeyB0aGlzLnRvb2xiYXJDb25maWcucXVlc3Rpb25Db250cmlidXRpb24gPSB0cnVlOyB9XG4gICAgdGhpcy5zb2x1dGlvblVVSUQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkID0gdGhpcy5wYWdlSWQ7XG4gICAgdGhpcy5pbml0aWFsTGVhZkZvcm1Db25maWcgPSBfLmNsb25lRGVlcCh0aGlzLmxlYWZGb3JtQ29uZmlnKTtcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmZyYW1ld29yayA9IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LmZyYW1ld29yaycpO1xuICAgIHRoaXMucXVhbGl0eUZvcm1Db25maWcgPSB0aGlzLmVkaXRvclNlcnZpY2UucXVhbGl0eUZvcm1Db25maWc7XG4gIH1cblxuICBmZXRjaEZyYW1lV29ya0RldGFpbHMoKSB7XG4gICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmZyYW1ld29ya0RhdGEkLnBpcGUodGFrZVVudGlsKHRoaXMub25Db21wb25lbnREZXN0cm95JCksXG4gICAgICBmaWx0ZXIoZGF0YSA9PiBfLmdldChkYXRhLCBgZnJhbWV3b3JrZGF0YS4ke3RoaXMuZnJhbWV3b3JrfWApKSwgdGFrZSgxKSkuc3Vic2NyaWJlKChmcmFtZXdvcmtEZXRhaWxzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGZyYW1ld29ya0RldGFpbHMgJiYgIWZyYW1ld29ya0RldGFpbHMuZXJyKSB7XG4gICAgICAgICAgY29uc3QgZnJhbWV3b3JrRGF0YSA9IGZyYW1ld29ya0RldGFpbHMuZnJhbWV3b3JrZGF0YVt0aGlzLmZyYW1ld29ya10uY2F0ZWdvcmllcztcbiAgICAgICAgICB0aGlzLmZyYW1ld29ya0RldGFpbHMuZnJhbWV3b3JrRGF0YSA9IGZyYW1ld29ya0RhdGE7XG4gICAgICAgICAgdGhpcy5mcmFtZXdvcmtEZXRhaWxzLnRvcGljTGlzdCA9IF8uZ2V0KF8uZmluZChmcmFtZXdvcmtEYXRhLCB7IGNvZGU6ICd0b3BpYycgfSksICd0ZXJtcycpO1xuICAgICAgICAgIHRoaXMucG9wdWxhdGVGcmFtZXdvcmtEYXRhKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG4gIHBvcHVsYXRlRnJhbWV3b3JrRGF0YSgpIHtcbiAgICBjb25zdCBjYXRlZ29yeU1hc3Rlckxpc3QgPSB0aGlzLmZyYW1ld29ya0RldGFpbHMuZnJhbWV3b3JrRGF0YTtcbiAgICBfLmZvckVhY2goY2F0ZWdvcnlNYXN0ZXJMaXN0LCAoY2F0ZWdvcnkpID0+IHtcbiAgICAgIF8uZm9yRWFjaCh0aGlzLmxlYWZGb3JtQ29uZmlnLCAoZm9ybUZpZWxkQ2F0ZWdvcnkpID0+IHtcbiAgICAgICAgaWYgKGNhdGVnb3J5LmNvZGUgPT09IGZvcm1GaWVsZENhdGVnb3J5LmNvZGUpIHtcbiAgICAgICAgICBmb3JtRmllbGRDYXRlZ29yeS50ZXJtcyA9IGNhdGVnb3J5LnRlcm1zO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLmltcHJlc3Npb24oe1xuICAgICAgdHlwZTogJ2VkaXQnLCBwYWdlaWQ6IHRoaXMudGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQsIHVyaTogdGhpcy5yb3V0ZXIudXJsLFxuICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gdGhpcy5wYWdlU3RhcnRUaW1lKSAvIDEwMDBcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRpYWxpemUoKSB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmZldGNoQ29sbGVjdGlvbkhpZXJhcmNoeSh0aGlzLnF1ZXN0aW9uU2V0SWQpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHkgPSBfLmdldChyZXNwb25zZSwgJ3Jlc3VsdC5xdWVzdGlvblNldCcpO1xuICAgICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllciA/IHRoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyIDogdGhpcy5xdWVzdGlvbklkO1xuICAgICAgLy9vbmx5IGZvciBvYnNlcnZhdGlvbixzdXJ2ZXksb2JzZXJ2YXRpb24gd2l0aCBydWJyaWNzXG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyZW50SWQpICYmICFfLmlzVW5kZWZpbmVkKHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcuY29uZmlnLnJlbmRlclRheG9ub215KSkge1xuICAgICAgICB0aGlzLmdldFBhcmVudFF1ZXN0aW9uT3B0aW9ucyhwYXJlbnRJZCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25EYXRhID0gdGhpcy50cmVlU2VydmljZS5nZXROb2RlQnlJZChwYXJlbnRJZCk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gXy5nZXQocmVzcG9uc2UsICdyZXN1bHQucXVlc3Rpb25TZXQuY2hpbGRyZW4nKTtcbiAgICAgICAgdGhpcy5zZWN0aW9uUHJpbWFyeUNhdGVnb3J5ID0gXy5nZXQocmVzcG9uc2UsICdyZXN1bHQucXVlc3Rpb25TZXQucHJpbWFyeUNhdGVnb3J5Jyk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uSWQgPSBfLmdldChzZWN0aW9uRGF0YSwgJ2RhdGEubWV0YWRhdGEucGFyZW50Jyk7XG4gICAgICAgIHRoaXMuZ2V0QnJhbmNoaW5nTG9naWMoY2hpbGRyZW4pO1xuICAgICAgfVxuICAgICAgdGhpcy5xdWVzdGlvbkZvcm1Db25maWcgPSBfLmNsb25lRGVlcCh0aGlzLmxlYWZGb3JtQ29uZmlnKTtcbiAgICAgIGxldCBsZWFmRm9ybUNvbmZpZ0ZpZWxkcyA9IF8uam9pbihfLm1hcCh0aGlzLmxlYWZGb3JtQ29uZmlnLCB2YWx1ZSA9PiAodmFsdWUuY29kZSkpLCAnLCcpO1xuICAgICAgbGVhZkZvcm1Db25maWdGaWVsZHMgKz0gJyxpc1Jldmlld01vZGlmaWNhdGlvbkFsbG93ZWQnO1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMucXVlc3Rpb25JZCkpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvblNlcnZpY2UucmVhZFF1ZXN0aW9uKHRoaXMucXVlc3Rpb25JZCwgbGVhZkZvcm1Db25maWdGaWVsZHMpXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoXy5nZXQocmVzLCAncmVzdWx0JykpIHtcbiAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbk1ldGFEYXRhID0gXy5nZXQocmVzLCAncmVzdWx0LnF1ZXN0aW9uJyk7XG4gICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25QcmltYXJ5Q2F0ZWdvcnkgPSBfLmdldCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsICdwcmltYXJ5Q2F0ZWdvcnknKTtcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID0gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAnaW50ZXJhY3Rpb25UeXBlcycpID8gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAnaW50ZXJhY3Rpb25UeXBlc1swXScpIDogJ2RlZmF1bHQnO1xuICAgICAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0SXNSZXZpZXdNb2RpZmljYXRpb25BbGxvd2VkKF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2lzUmV2aWV3TW9kaWZpY2F0aW9uQWxsb3dlZCcsIGZhbHNlKSk7XG4gICAgICAgICAgICAgIHRoaXMucG9wdWxhdGVGb3JtRGF0YSgpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25NZXRhRGF0YS5lZGl0b3JTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JTdGF0ZSA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS5lZGl0b3JTdGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURlY2xhcmF0aW9uID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhLnJlc3BvbnNlRGVjbGFyYXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVJZCA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS50ZW1wbGF0ZUlkO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mT3B0aW9ucyA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YT8uZWRpdG9yU3RhdGU/Lm9wdGlvbnM/Lmxlbmd0aCB8fCAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heGltdW1PcHRpb25zID0gXy5nZXQodGhpcy5xdWVzdGlvbklucHV0LCAnY29uZmlnLm1heGltdW1PcHRpb25zJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLm9wdGlvbnNMZW5ndGggPSBudW1iZXJPZk9wdGlvbnM7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IF8ubWFwKHRoaXMucXVlc3Rpb25NZXRhRGF0YT8uZWRpdG9yU3RhdGU/Lm9wdGlvbnMsIG9wdGlvbiA9PiAoeyBib2R5OiBvcHRpb24udmFsdWUuYm9keSB9KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uTWV0YURhdGE/LmVkaXRvclN0YXRlPy5xdWVzdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmFjdGlvbnMgPSB0aGlzLnF1ZXN0aW9uTWV0YURhdGE/LmludGVyYWN0aW9ucztcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvclN0YXRlID0gbmV3IE1jcUZvcm0oe1xuICAgICAgICAgICAgICAgICAgcXVlc3Rpb24sIG9wdGlvbnMsIGFuc3dlcjogXy5nZXQocmVzcG9uc2VEZWNsYXJhdGlvbiwgJ3Jlc3BvbnNlMS5jb3JyZWN0UmVzcG9uc2UudmFsdWUnKVxuICAgICAgICAgICAgICAgIH0sIHsgdGVtcGxhdGVJZCwgbnVtYmVyT2ZPcHRpb25zLCBtYXhpbXVtT3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucyA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YT8uZWRpdG9yU3RhdGU/LnNvbHV0aW9ucztcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvclN0YXRlLmludGVyYWN0aW9ucyA9IGludGVyYWN0aW9ucztcbiAgICAgICAgICAgICAgICBpZiAoXy5oYXModGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncmVzcG9uc2VEZWNsYXJhdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvclN0YXRlLnJlc3BvbnNlRGVjbGFyYXRpb24gPSBfLmdldCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsICdyZXNwb25zZURlY2xhcmF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChfLmhhcyh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsICdwcmltYXJ5Q2F0ZWdvcnknKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yU3RhdGUucHJpbWFyeUNhdGVnb3J5ID0gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncHJpbWFyeUNhdGVnb3J5Jyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zZXRRdWVzdGlvblRpdGxlKHRoaXMucXVlc3Rpb25JZCk7XG4gICAgICAgICAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb2x1dGlvblR5cGUgPSB0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9uc1swXS50eXBlO1xuICAgICAgICAgICAgICAgIHRoaXMuc29sdXRpb25VVUlEID0gdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnNbMF0uaWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U29sdXRpb25Ecm9wRG93biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NvbHV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFNvbHV0aW9uVHlwZSA9PT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEubWVkaWEsIChvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvLnR5cGUgPT09ICd2aWRlbycgJiYgby5pZCA9PT0gdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnNbMF0udmFsdWU7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9Tb2x1dGlvbk5hbWUgPSB0aGlzLnF1ZXN0aW9uTWV0YURhdGEubWVkaWFbaW5kZXhdLm5hbWU7XG4gICAgICAgICAgICAgICAgICB0aGlzLnZpZGVvVGh1bWJuYWlsID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhLm1lZGlhW2luZGV4XS50aHVtYm5haWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU29sdXRpb25UeXBlID09PSAnaHRtbCcpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zID0gdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnNbMF0udmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWV0YURhdGEubWVkaWEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lZGlhQXJyID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhLm1lZGlhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8qKiBmb3Igb2JzZXJ2YXRpb24gYW5kIHN1cnZleSB0byBzaG93IGhpbnQsdGlwLGRlcGVuZGVudCBxdWVzdGlvbiBvcHRpb24uICovXG4gICAgICAgICAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLmVkaXRvclNlcnZpY2U/LmVkaXRvckNvbmZpZz8uY29uZmlnPy5yZW5kZXJUYXhvbm9teSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Yk1lbnVDb25maWcoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRDb21tZW50ID0gXy5nZXQodGhpcy5jcmVhdGlvbkNvbnRleHQsICdjb3JyZWN0aW9uQ29tbWVudHMnKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1ByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdDb250ZW50KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgKGVycjogU2VydmVyUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgICAgIGVycm9yTXNnOiAnRmV0Y2hpbmcgcXVlc3Rpb24gZGV0YWlscyBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uLi4nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgICB0aGlzLnRlbXBRdWVzdGlvbklkID0gdXVpZHY0KCk7XG4gICAgICAgIHRoaXMucG9wdWxhdGVGb3JtRGF0YSgpO1xuICAgICAgICB0aGlzLnNldFF1ZXN0aW9uVGl0bGUoKTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgIGxldCBlZGl0b3JTdGF0ZTogYW55O1xuICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uQ2F0ZWdvcnkpIHtcbiAgICAgICAgICAgIGVkaXRvclN0YXRlID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCBgZWRpdG9yQ29uZmlnLmRlZmF1bHRTdGF0ZXMubm9uSW50ZXJhY3RpdmVRdWVzdGlvbnMuJHt0aGlzLnF1ZXN0aW9uQ2F0ZWdvcnl9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU3RhdGUgPSB7IHF1ZXN0aW9uOiAnJywgYW5zd2VyOiAnJywgc29sdXRpb25zOiAnJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWRpdG9yU3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU3RhdGUgPSB7IC4uLmVkaXRvclN0YXRlIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdjaG9pY2UnKSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JTdGF0ZSA9IG5ldyBNY3FGb3JtKHsgcXVlc3Rpb246ICcnLCBvcHRpb25zOiBbXSB9LCB7IG51bWJlck9mT3B0aW9uczogXy5nZXQodGhpcy5xdWVzdGlvbklucHV0LCAnY29uZmlnLm51bWJlck9mT3B0aW9ucycpLCBtYXhpbXVtT3B0aW9uczogXy5nZXQodGhpcy5xdWVzdGlvbklucHV0LCAnY29uZmlnLm1heGltdW1PcHRpb25zJykgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIGZvciBvYnNlcnZhdGlvbiBhbmQgc3VydmV5IHRvIHNob3cgaGludCx0aXAsZGVwZW5kZW50IHF1ZXN0aW9uIG9wdGlvbi4gKi9cbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuZWRpdG9yU2VydmljZT8uZWRpdG9yQ29uZmlnPy5jb25maWc/LnJlbmRlclRheG9ub215KSkge1xuICAgICAgICAgIHRoaXMuc3ViTWVudUNvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd0xvYWRlciA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0sIChlcnI6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0ge1xuICAgICAgICBlcnJvck1zZzogJ0ZldGNoaW5nIHF1ZXN0aW9uIHNldCBkZXRhaWxzIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4uLicsXG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBjb250ZW50UG9saWN5VXJsKCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuY29udGVudFBvbGljeVVybDtcbiAgfVxuXG4gIHRvb2xiYXJFdmVudExpc3RlbmVyKGV2ZW50KSB7XG4gICAgc3dpdGNoIChldmVudC5idXR0b24pIHtcbiAgICAgIGNhc2UgJ3NhdmVDb250ZW50JzpcbiAgICAgICAgdGhpcy5zYXZlQ29udGVudCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NhbmNlbENvbnRlbnQnOlxuICAgICAgICB0aGlzLmhhbmRsZVJlZGlyZWN0VG9RdWVzdGlvbnNldCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JhY2tDb250ZW50JzpcbiAgICAgICAgdGhpcy5oYW5kbGVSZWRpcmVjdFRvUXVlc3Rpb25zZXQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwcmV2aWV3Q29udGVudCc6XG4gICAgICAgIHRoaXMucHJldmlld0NvbnRlbnQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlZGl0Q29udGVudCc6XG4gICAgICAgIHRoaXMuaXNSZWFkT25seU1vZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93UHJldmlldyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvb2xiYXJDb25maWcuc2hvd1ByZXZpZXcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmV2aWV3Rm9ybURhdGEoIXRoaXMudG9vbGJhckNvbmZpZy5zaG93UHJldmlldyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2hvd1Jldmlld2NvbW1lbnRzJzpcbiAgICAgICAgdGhpcy5zaG93UmV2aWV3TW9kYWwgPSAhdGhpcy5zaG93UmV2aWV3TW9kYWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2F2ZVF1YWxpdHlQYXJhbWV0ZXJzJzpcbiAgICAgICAgdGhpcy5zaG93UXVhbGl0eVBhcmFtZXRlclBvcHVwID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBoYW5kbGVSZWRpcmVjdFRvUXVlc3Rpb25zZXQoKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgdGhpcy5zaG93Q29uZmlybVBvcHVwID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWRpcmVjdFRvUXVlc3Rpb25zZXQoKTtcbiAgICB9XG4gIH1cblxuXG4gIHN1Ym1pdEhhbmRsZXIoKSB7XG4gICAgdGhpcy52YWxpZGF0ZVF1ZXN0aW9uRGF0YSgpO1xuICAgIHRoaXMudmFsaWRhdGVGb3JtRmllbGRzKCk7XG4gICAgaWYgKHRoaXMuc2hvd0Zvcm1FcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc2hvd1N1Ym1pdENvbmZpcm1Qb3B1cCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2F2ZUNvbnRlbnQoKSB7XG4gICAgdGhpcy52YWxpZGF0ZVF1ZXN0aW9uRGF0YSgpO1xuICAgIGlmICh0aGlzLnNob3dGb3JtRXJyb3IgPT09IGZhbHNlICYmIHRoaXMucXVlc3Rpb25NZXRhZGF0YUZvcm1TdGF0dXMgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2F2ZVF1ZXN0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDQ0JykpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29uc2VudFN1Ym1pdChldmVudCkge1xuICAgIHRoaXMuc2hvd1N1Ym1pdENvbmZpcm1Qb3B1cCA9IGZhbHNlO1xuICAgIGlmIChldmVudCkge1xuICAgICAgdGhpcy5xdWVzdGlvbk1ldGFEYXRhID0gXy5hc3NpZ24odGhpcy5xdWVzdGlvbk1ldGFEYXRhLCB7IGlzUmV2aWV3TW9kaWZpY2F0aW9uQWxsb3dlZDogZXZlbnQuZWRpdGluZ0NvbnNlbnQgfSk7XG4gICAgICB0aGlzLnNlbmRGb3JSZXZpZXcoKTtcbiAgICB9XG4gIH1cblxuICBzZW5kRm9yUmV2aWV3KCkge1xuICAgIGlmICghXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbmZpZy5za2lwVHdvTGV2ZWxSZXZpZXcnKSkge1xuICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UucmV2aWV3Q29udGVudCh0aGlzLnF1ZXN0aW9uSWQpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMDInKSk7XG4gICAgICAgICAgdGhpcy5yZWRpcmVjdFRvQ2hhcHRlckxpc3QoKTtcbiAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAwMicpKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uSWQpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnJldmlld0NvbnRlbnQodGhpcy5xdWVzdGlvbklkKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMDInKSk7XG4gICAgICAgICAgICB0aGlzLmFkZFJlc291cmNlVG9RdWVzdGlvbnNldCgpO1xuICAgICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAwMicpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2suYmluZCh0aGlzKTtcbiAgICAgIHRoaXMudXBzZXJ0UXVlc3Rpb24oY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwdWJsaXNoQ2FsbGJhY2sgPSB0aGlzLnNlbmRRdWVzdGlvbkZvclB1Ymxpc2guYmluZCh0aGlzKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5hZGRSZXNvdXJjZVRvUXVlc3Rpb25zZXQuYmluZCh0aGlzLCBwdWJsaXNoQ2FsbGJhY2spO1xuICAgICAgdGhpcy51cHNlcnRRdWVzdGlvbihjYWxsYmFjayk7XG4gICAgfVxuICB9XG5cbiAgcmVxdWVzdEZvckNoYW5nZXMoY29tbWVudCkge1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5zdWJtaXRSZXF1ZXN0Q2hhbmdlcyh0aGlzLnF1ZXN0aW9uSWQsIGNvbW1lbnQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDAzJykpO1xuICAgICAgdGhpcy5yZWRpcmVjdFRvQ2hhcHRlckxpc3QoKTtcbiAgICB9LCBlcnIgPT4ge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMDMnKSk7XG4gICAgfSk7XG4gIH1cblxuICBzZW5kUXVlc3Rpb25Gb3JQdWJsaXNoKGV2ZW50KSB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnB1Ymxpc2hDb250ZW50KHRoaXMucXVlc3Rpb25JZCwgZXZlbnQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgaWYgKCEodGhpcy5jcmVhdGlvbk1vZGUgPT09ICdzb3VyY2luZ1JldmlldycgJiYgdGhpcy5lZGl0b3JTZXJ2aWNlLmlzUmV2aWV3TW9kaWZpY2F0aW9uQWxsb3dlZCkpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDM3JykpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWRpcmVjdFRvQ2hhcHRlckxpc3QoKTtcbiAgICB9LCBlcnIgPT4ge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMzgnKSk7XG4gICAgfSk7XG4gIH1cblxuICByZWplY3RRdWVzdGlvbihjb21tZW50KSB7XG4gICAgY29uc3QgZWRpdGFibGVGaWVsZHMgPSBfLmdldCh0aGlzLmNyZWF0aW9uQ29udGV4dCwgJ2VkaXRhYmxlRmllbGRzJyk7XG4gICAgaWYgKHRoaXMuY3JlYXRpb25Nb2RlID09PSAnb3JncmV2aWV3JyAmJiBlZGl0YWJsZUZpZWxkcyAmJiAhXy5pc0VtcHR5KGVkaXRhYmxlRmllbGRzW3RoaXMuY3JlYXRpb25Nb2RlXSkpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtRmllbGRzKCk7XG4gICAgICBpZiAodGhpcy5zaG93Rm9ybUVycm9yID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDI5JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBsZXQgY2FsbGJhY2sgPSB0aGlzLnJlcXVlc3RGb3JDaGFuZ2VzLmJpbmQodGhpcywgW2NvbW1lbnRdKTtcbiAgICAgIHRoaXMudXBzZXJ0UXVlc3Rpb24oY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlcXVlc3RGb3JDaGFuZ2VzKGNvbW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHB1Ymxpc2hRdWVzdGlvbihldmVudCkge1xuICAgIGNvbnN0IGVkaXRhYmxlRmllbGRzID0gXy5nZXQodGhpcy5jcmVhdGlvbkNvbnRleHQsICdlZGl0YWJsZUZpZWxkcycpO1xuICAgIGlmICh0aGlzLmNyZWF0aW9uTW9kZSA9PT0gJ29yZ3JldmlldycgJiYgZWRpdGFibGVGaWVsZHMgJiYgIV8uaXNFbXB0eShlZGl0YWJsZUZpZWxkc1t0aGlzLmNyZWF0aW9uTW9kZV0pKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlRm9ybUZpZWxkcygpO1xuICAgICAgaWYgKHRoaXMuc2hvd0Zvcm1FcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAyOScpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgbGV0IGNhbGxiYWNrID0gdGhpcy5zZW5kUXVlc3Rpb25Gb3JQdWJsaXNoLmJpbmQodGhpcywgW2V2ZW50XSk7XG4gICAgICB0aGlzLnVwc2VydFF1ZXN0aW9uKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kUXVlc3Rpb25Gb3JQdWJsaXNoKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBzb3VyY2luZ1VwZGF0ZShldmVudCkge1xuICAgIGNvbnN0IGVkaXRhYmxlRmllbGRzID0gXy5nZXQodGhpcy5jcmVhdGlvbkNvbnRleHQsICdlZGl0YWJsZUZpZWxkcycpO1xuICAgIGlmICh0aGlzLmNyZWF0aW9uTW9kZSA9PT0gJ3NvdXJjaW5ncmV2aWV3JyAmJiBlZGl0YWJsZUZpZWxkcyAmJiAhXy5pc0VtcHR5KGVkaXRhYmxlRmllbGRzW3RoaXMuY3JlYXRpb25Nb2RlXSkpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtRmllbGRzKCk7XG4gICAgICBpZiAodGhpcy5zaG93Rm9ybUVycm9yID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDI5JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBxdWVzdGlvbklkcyA9IFtdO1xuICAgIC8vbGV0IGNvbW1lbnRzID0ge307XG4gICAgbGV0IGNvbW1lbnRzID0gZXZlbnQuY29tbWVudFxuICAgIGxldCBzdWNjZXNzTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5mZXRjaENvbGxlY3Rpb25IaWVyYXJjaHkodGhpcy5xdWVzdGlvblNldElkKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uU2V0ID0gcmVzLnJlc3VsdFsncXVlc3Rpb25TZXQnXTtcbiAgICAgIHN3aXRjaCAoZXZlbnQuYnV0dG9uKSB7XG4gICAgICAgIGNhc2UgJ3NvdXJjaW5nQXBwcm92ZVF1ZXN0aW9uJzpcbiAgICAgICAgICBxdWVzdGlvbklkcyA9IHF1ZXN0aW9uU2V0LmFjY2VwdGVkQ29udHJpYnV0aW9ucyB8fCBbXTtcbiAgICAgICAgICBzdWNjZXNzTWVzc2FnZSA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDM4JylcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc291cmNpbmdSZWplY3RRdWVzdGlvbic6XG4gICAgICAgICAgcXVlc3Rpb25JZHMgPSBxdWVzdGlvblNldC5yZWplY3RlZENvbnRyaWJ1dGlvbnMgfHwgW107XG4gICAgICAgICAgY29tbWVudHMgPSBxdWVzdGlvblNldC5yZWplY3RlZENvbnRyaWJ1dGlvbkNvbW1lbnRzIHx8IHt9O1xuICAgICAgICAgIGNvbW1lbnRzW3RoaXMucXVlc3Rpb25JZF0gPSBldmVudC5jb21tZW50O1xuICAgICAgICAgIHN1Y2Nlc3NNZXNzYWdlID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMzknKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcXVlc3Rpb25JZHMucHVzaCh0aGlzLnF1ZXN0aW9uSWQpO1xuICAgICAgZXZlbnRbJ3JlcXVlc3RCb2R5J10gPSB0aGlzLnByZXBhcmVTb3VyY2luZ1VwZGF0ZUJvZHkocXVlc3Rpb25JZHMsIGNvbW1lbnRzKTtcbiAgICAgIHRoaXMuZWRpdG9yU2VydmljZS51cGRhdGVDb2xsZWN0aW9uKHRoaXMucXVlc3Rpb25TZXRJZCwgZXZlbnQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3Moc3VjY2Vzc01lc3NhZ2UpO1xuICAgICAgICB0aGlzLnJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpO1xuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgc2VuZEJhY2tRdWVzdGlvbihldmVudCkge1xuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLnJlYWRRdWVzdGlvbih0aGlzLnF1ZXN0aW9uSWQsICdzdGF0dXMnKVxuICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RPYmogPSB7XG4gICAgICAgICAgcXVlc3Rpb246IHtcbiAgICAgICAgICAgIHByZXZTdGF0dXM6IF8uZ2V0KHJlcy5yZXN1bHQsIGBxdWVzdGlvbi5zdGF0dXNgKSxcbiAgICAgICAgICAgIHN0YXR1czogJ0RyYWZ0JyxcbiAgICAgICAgICAgIHJlcXVlc3RDaGFuZ2VzOiBldmVudC5jb21tZW50XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGRhdGVRdWVzdGlvbih0aGlzLnF1ZXN0aW9uSWQsIHJlcXVlc3RPYmopLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjA0MCcpKTtcbiAgICAgICAgICB0aGlzLnJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIChlcnI6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgZXJyb3JNc2c6ICdDYW5ub3QgdXBkYXRlIHF1ZXN0aW9uIHN0YXR1cy4gUGxlYXNlIHRyeSBhZ2Fpbi4uLicsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlUXVlc3Rpb25EYXRhKCkge1xuXG4gICAgaWYgKFt1bmRlZmluZWQsICcnXS5pbmNsdWRlcyh0aGlzLmVkaXRvclN0YXRlLnF1ZXN0aW9uKSkge1xuICAgICAgdGhpcy5zaG93Rm9ybUVycm9yID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0byBoYW5kbGUgd2hlbiBxdWVzdGlvbiB0eXBlIGlzIHN1YmplY3RpdmVcbiAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICBpZiAodGhpcy5lZGl0b3JTdGF0ZS5hbnN3ZXIgIT09ICcnKSB7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93Rm9ybUVycm9yID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRvIGhhbmRsZSB3aGVuIHF1ZXN0aW9uIHR5cGUgaXMgbWNxXG4gICAgaWYgKHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdjaG9pY2UnKSB7XG4gICAgICBjb25zdCBkYXRhID0gXy5nZXQodGhpcy50cmVlTm9kZURhdGEsICdkYXRhLm1ldGFkYXRhJyk7XG4gICAgICBpZiAoXy5nZXQodGhpcy5lZGl0b3JTdGF0ZSwgJ2ludGVyYWN0aW9uVHlwZXNbMF0nKSA9PT0gJ2Nob2ljZScgJiZcbiAgICAgICAgXy5pc0VtcHR5KHRoaXMuZWRpdG9yU3RhdGU/LnJlc3BvbnNlRGVjbGFyYXRpb24/LnJlc3BvbnNlMT8ubWFwcGluZykgJiZcbiAgICAgICAgIV8uaXNVbmRlZmluZWQodGhpcy5lZGl0b3JTZXJ2aWNlPy5lZGl0b3JDb25maWc/LmNvbmZpZz8ucmVuZGVyVGF4b25vbXkpICYmXG4gICAgICAgIF8uZ2V0KGRhdGEsICdhbGxvd1Njb3JpbmcnKSA9PT0gJ1llcycpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMDUnKSk7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9uVmFsaWQgPSBfLmZpbmQodGhpcy5lZGl0b3JTdGF0ZS5vcHRpb25zLCBvcHRpb24gPT5cbiAgICAgICAgKG9wdGlvbi5ib2R5ID09PSB1bmRlZmluZWQgfHwgb3B0aW9uLmJvZHkgPT09ICcnIHx8IG9wdGlvbi5sZW5ndGggPiB0aGlzLnNldENoYXJhY3RlckxpbWl0KSk7XG4gICAgICBpZiAob3B0aW9uVmFsaWQgfHwgKCF0aGlzLmVkaXRvclN0YXRlLmFuc3dlciAmJiB0aGlzLnNvdXJjaW5nU2V0dGluZ3M/LmVuZm9yY2VDb3JyZWN0QW5zd2VyKSkge1xuICAgICAgICB0aGlzLnNob3dGb3JtRXJyb3IgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dGb3JtRXJyb3IgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ3NsaWRlcicpIHtcbiAgICAgIGNvbnN0IG1pbiA9IF8uZ2V0KHRoaXMuc2xpZGVyRGF0YXMsICd2YWxpZGF0aW9uLnJhbmdlLm1pbicpO1xuICAgICAgY29uc3QgbWF4ID0gXy5nZXQodGhpcy5zbGlkZXJEYXRhcywgJ3ZhbGlkYXRpb24ucmFuZ2UubWF4Jyk7XG4gICAgICBjb25zdCBzdGVwID0gXy5nZXQodGhpcy5zbGlkZXJEYXRhcywgJ3N0ZXAnKTtcbiAgICAgIGlmIChfLmlzRW1wdHkodGhpcy5zbGlkZXJEYXRhcykgfHwgXy5pc0VtcHR5KG1pbikgfHwgXy5pc0VtcHR5KG1heCkgfHwgXy5pc0VtcHR5KHN0ZXApKSB7XG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDA1JykpO1xuICAgICAgICB0aGlzLnNob3dGb3JtRXJyb3IgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93Rm9ybUVycm9yID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICByZWRpcmVjdFRvUXVlc3Rpb25zZXQoKSB7XG4gICAgdGhpcy5zaG93Q29uZmlybVBvcHVwID0gZmFsc2U7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zaG93QWRkU2Vjb25kYXJ5UXVlc3Rpb25DYXQpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbkVtaXR0ZXIuZW1pdCh7XG4gICAgICAgICAgdHlwZTogXCJjcmVhdGVOZXdDb250ZW50XCIsXG4gICAgICAgICAgaXNDaGlsZFF1ZXN0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhpcy5zaG93QWRkU2Vjb25kYXJ5UXVlc3Rpb25DYXQgPSBmYWxzZTtcbiAgICAgIHRoaXMucXVlc3Rpb25FbWl0dGVyLmVtaXQoeyBzdGF0dXM6IGZhbHNlIH0pO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBhZGRSZXNvdXJjZVRvUXVlc3Rpb25zZXQocHVibGlzaENhbGxiYWNrPykge1xuICAgIGNvbnN0IHF1ZXN0aW9uU2V0SWQgPSBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLCAnY29udGV4dC5pZGVudGlmaWVyJyk7XG4gICAgY29uc3QgdW5pdElkID0gdGhpcy5zZWxlY3RlZFNlY3Rpb25JZCB8fCBfLmdldCh0aGlzLnF1ZXN0aW9uSW5wdXQsICdjb25maWcucGFyZW50Jyk7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmFkZFJlc291cmNlVG9RdWVzdGlvbnNldChxdWVzdGlvblNldElkLCB1bml0SWQsIHRoaXMucXVlc3Rpb25JZCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwOScpKTtcbiAgICAgIGlmIChwdWJsaXNoQ2FsbGJhY2spIHtcbiAgICAgICAgcHVibGlzaENhbGxiYWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZGlyZWN0VG9RdWVzdGlvbnNldCgpO1xuICAgICAgfVxuICAgIH0sIChlcnIpID0+IHtcbiAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgIGVycm9yTXNnOiAnRmFpbGVkIHRvIGFkZCBxdWVzdGlvbiB0byBxdWVzdGlvbnNldC4gUGxlYXNlIHRyeSBhZ2Fpbi4uLicsXG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpIHtcbiAgICB0aGlzLnF1ZXN0aW9uRW1pdHRlci5lbWl0KHsgc3RhdHVzOiBmYWxzZSB9KTtcbiAgfVxuXG4gIHNldFF1ZXN0aW9uSWQocXVlc3Rpb25JZDogc3RyaW5nKSB7XG4gICAgdGhpcy5xdWVzdGlvbklkID0gcXVlc3Rpb25JZDtcbiAgfVxuXG4gIGVkaXRvckRhdGFIYW5kbGVyKGV2ZW50LCB0eXBlPykge1xuICAgIGlmICh0eXBlID09PSAncXVlc3Rpb24nKSB7XG4gICAgICB0aGlzLmVkaXRvclN0YXRlLnF1ZXN0aW9uID0gZXZlbnQuYm9keTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzb2x1dGlvbicpIHtcbiAgICAgIHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zID0gZXZlbnQuYm9keTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0b3JTdGF0ZSA9IF8uYXNzaWduKHRoaXMuZWRpdG9yU3RhdGUsIGV2ZW50LmJvZHkpO1xuICAgIH1cblxuICAgIGlmIChldmVudC5tZWRpYW9iaikge1xuICAgICAgY29uc3QgbWVkaWEgPSBldmVudC5tZWRpYW9iajtcbiAgICAgIHRoaXMuc2V0TWVkaWEobWVkaWEpO1xuICAgIH1cbiAgfVxuXG4gIHNldE1lZGlhKG1lZGlhKSB7XG4gICAgaWYgKG1lZGlhKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IF8uZmluZCh0aGlzLm1lZGlhQXJyLCBvYiA9PiB7XG4gICAgICAgIHJldHVybiBvYi5pZCA9PT0gbWVkaWEuaWQ7XG4gICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubWVkaWFBcnIucHVzaChtZWRpYSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2F2ZVF1ZXN0aW9uKCkge1xuICAgIGlmIChfLmdldCh0aGlzLmNyZWF0aW9uQ29udGV4dCwgJ29iamVjdFR5cGUnKSA9PT0gJ3F1ZXN0aW9uJykge1xuICAgICAgaWYgKHRoaXMuY3JlYXRpb25Nb2RlID09PSAnZWRpdCcpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmFkZFJlc291cmNlVG9RdWVzdGlvbnNldC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnVwc2VydFF1ZXN0aW9uKGNhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jcmVhdGlvbk1vZGUgPT09ICdzb3VyY2luZ1JldmlldycpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLnNlbmRRdWVzdGlvbkZvclB1Ymxpc2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy51cHNlcnRRdWVzdGlvbihjYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwc2VydFF1ZXN0aW9uKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZVF1ZXN0aW9uKCk7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmlkZW9EYXRhT3V0cHV0KGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLnZpZGVvU29sdXRpb25EYXRhID0gZXZlbnQ7XG4gICAgICB0aGlzLnZpZGVvU29sdXRpb25OYW1lID0gZXZlbnQubmFtZTtcbiAgICAgIHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zID0gZXZlbnQuaWRlbnRpZmllcjtcbiAgICAgIHRoaXMudmlkZW9UaHVtYm5haWwgPSBldmVudC50aHVtYm5haWw7XG4gICAgICBjb25zdCB2aWRlb01lZGlhOiBhbnkgPSB7fTtcbiAgICAgIHZpZGVvTWVkaWEuaWQgPSBldmVudC5pZGVudGlmaWVyO1xuICAgICAgdmlkZW9NZWRpYS5zcmMgPSBldmVudC5zcmM7XG4gICAgICB2aWRlb01lZGlhLnR5cGUgPSAndmlkZW8nO1xuICAgICAgdmlkZW9NZWRpYS5hc3NldElkID0gZXZlbnQuaWRlbnRpZmllcjtcbiAgICAgIHZpZGVvTWVkaWEubmFtZSA9IGV2ZW50Lm5hbWU7XG4gICAgICB2aWRlb01lZGlhLnRodW1ibmFpbCA9IHRoaXMudmlkZW9UaHVtYm5haWw7XG4gICAgICB2aWRlb01lZGlhLmJhc2VVcmwgPSBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLCAnY29udGV4dC5ob3N0JykgfHwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luO1xuICAgICAgaWYgKHZpZGVvTWVkaWEudGh1bWJuYWlsKSB7XG4gICAgICAgIGNvbnN0IHRodW1ibmFpbE1lZGlhOiBhbnkgPSB7fTtcbiAgICAgICAgdGh1bWJuYWlsTWVkaWEuc3JjID0gdGhpcy52aWRlb1RodW1ibmFpbDtcbiAgICAgICAgdGh1bWJuYWlsTWVkaWEudHlwZSA9ICdpbWFnZSc7XG4gICAgICAgIHRodW1ibmFpbE1lZGlhLmlkID0gYHZpZGVvXyR7ZXZlbnQuaWRlbnRpZmllcn1gO1xuICAgICAgICB0aHVtYm5haWxNZWRpYS5iYXNlVXJsID0gXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQuaG9zdCcpIHx8IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgICAgdGhpcy5tZWRpYUFyci5wdXNoKHRodW1ibmFpbE1lZGlhKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWVkaWFBcnIucHVzaCh2aWRlb01lZGlhKTtcbiAgICAgIHRoaXMuc2hvd1NvbHV0aW9uRHJvcERvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd1NvbHV0aW9uID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWxldGVTb2x1dGlvbigpO1xuICAgIH1cbiAgICB0aGlzLnZpZGVvU2hvdyA9IGZhbHNlO1xuICB9XG5cbiAgc2VsZWN0U29sdXRpb25UeXBlKGRhdGE6IGFueSkge1xuICAgIGNvbnN0IGluZGV4ID0gXy5maW5kSW5kZXgodGhpcy5zb2x1dGlvblR5cGVzLCAoc29sOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBzb2wudmFsdWUgPT09IGRhdGE7XG4gICAgfSk7XG4gICAgdGhpcy5zZWxlY3RlZFNvbHV0aW9uVHlwZSA9IHRoaXMuc29sdXRpb25UeXBlc1tpbmRleF0udHlwZTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFNvbHV0aW9uVHlwZSA9PT0gJ3ZpZGVvJykge1xuICAgICAgY29uc3Qgc2hvd1ZpZGVvID0gdHJ1ZTtcbiAgICAgIHRoaXMudmlkZW9TaG93ID0gc2hvd1ZpZGVvO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dTb2x1dGlvbkRyb3BEb3duID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlU29sdXRpb24oKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTb2x1dGlvblR5cGUgPT09ICd2aWRlbycpIHtcbiAgICAgIHRoaXMubWVkaWFBcnIgPSBfLmZpbHRlcih0aGlzLm1lZGlhQXJyLCAoaXRlbTogYW55KSA9PiBpdGVtLmlkICE9PSB0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucyk7XG4gICAgfVxuICAgIHRoaXMuc2hvd1NvbHV0aW9uRHJvcERvd24gPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRTb2x1dGlvblR5cGUgPSAnJztcbiAgICB0aGlzLnZpZGVvU29sdXRpb25OYW1lID0gJyc7XG4gICAgdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnMgPSAnJztcbiAgICB0aGlzLnZpZGVvVGh1bWJuYWlsID0gJyc7XG4gICAgdGhpcy5zaG93U29sdXRpb24gPSBmYWxzZTtcbiAgfVxuXG4gIGdldFNvbHV0aW9uT2JqKHNvbHV0aW9uVVVJRCwgc2VsZWN0ZWRTb2x1dGlvblR5cGUsIGVkaXRvclN0YXRlU29sdXRpb25zOiBhbnkpIHtcbiAgICBsZXQgc29sdXRpb25PYmo6IGFueTtcbiAgICBzb2x1dGlvbk9iaiA9IHt9O1xuICAgIHNvbHV0aW9uT2JqLmlkID0gc29sdXRpb25VVUlEO1xuICAgIHNvbHV0aW9uT2JqLnR5cGUgPSBzZWxlY3RlZFNvbHV0aW9uVHlwZTtcbiAgICBpZiAoXy5pc1N0cmluZyhlZGl0b3JTdGF0ZVNvbHV0aW9ucykpIHtcbiAgICAgIHNvbHV0aW9uT2JqLnZhbHVlID0gZWRpdG9yU3RhdGVTb2x1dGlvbnM7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkoZWRpdG9yU3RhdGVTb2x1dGlvbnMpKSB7XG4gICAgICBpZiAoXy5oYXMoZWRpdG9yU3RhdGVTb2x1dGlvbnNbMF0sICd2YWx1ZScpKSB7XG4gICAgICAgIHNvbHV0aW9uT2JqLnZhbHVlID0gZWRpdG9yU3RhdGVTb2x1dGlvbnNbMF0udmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb2x1dGlvbk9iajtcbiAgfVxuXG4gIGdldFF1ZXN0aW9uTWV0YWRhdGEoKSB7XG4gICAgbGV0IG1ldGFkYXRhOiBhbnkgPSB7XG4gICAgICBtaW1lVHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uJyxcbiAgICAgIG1lZGlhOiB0aGlzLm1lZGlhQXJyLFxuICAgICAgZWRpdG9yU3RhdGU6IHt9XG4gICAgfTtcbiAgICBtZXRhZGF0YSA9IF8uYXNzaWduKG1ldGFkYXRhLCB0aGlzLmVkaXRvclN0YXRlKTtcbiAgICBtZXRhZGF0YS5lZGl0b3JTdGF0ZS5xdWVzdGlvbiA9IG1ldGFkYXRhLnF1ZXN0aW9uO1xuICAgIG1ldGFkYXRhLmJvZHkgPSBtZXRhZGF0YS5xdWVzdGlvbjtcbiAgICBjb25zdCB0cmVlTm9kZURhdGEgPSBfLmdldCh0aGlzLnRyZWVOb2RlRGF0YSwgJ2RhdGEubWV0YWRhdGEnKTtcblxuICAgIGlmICghKF8uZ2V0KHRyZWVOb2RlRGF0YSwgXCJhbGxvd1Njb3JpbmdcIikgPT09IFwiWWVzXCIpKSB7XG4gICAgICBfLnNldChtZXRhZGF0YSwgXCJyZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5tYXBwaW5nXCIsIFtdKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgIG1ldGFkYXRhLmJvZHkgPSB0aGlzLmdldE1jcVF1ZXN0aW9uSHRtbEJvZHkodGhpcy5lZGl0b3JTdGF0ZS5xdWVzdGlvbiwgdGhpcy5lZGl0b3JTdGF0ZS50ZW1wbGF0ZUlkKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5zZWxlY3RlZFNvbHV0aW9uVHlwZSkgJiYgIV8uaXNFbXB0eSh0aGlzLnNlbGVjdGVkU29sdXRpb25UeXBlKSkge1xuICAgICAgY29uc3Qgc29sdXRpb25PYmogPSB0aGlzLmdldFNvbHV0aW9uT2JqKHRoaXMuc29sdXRpb25VVUlELCB0aGlzLnNlbGVjdGVkU29sdXRpb25UeXBlLCB0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucyk7XG4gICAgICBtZXRhZGF0YS5lZGl0b3JTdGF0ZS5zb2x1dGlvbnMgPSBbc29sdXRpb25PYmpdO1xuICAgICAgbWV0YWRhdGEuc29sdXRpb25zID0gW3NvbHV0aW9uT2JqXTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucykpIHtcbiAgICAgIG1ldGFkYXRhLnNvbHV0aW9ucyA9IFtdO1xuICAgIH1cbiAgICBtZXRhZGF0YSA9IF8ubWVyZ2UobWV0YWRhdGEsIHRoaXMuZ2V0RGVmYXVsdFNlc3Npb25Db250ZXh0KCkpO1xuICAgIGlmIChfLmdldCh0aGlzLmNyZWF0aW9uQ29udGV4dCwgJ29iamVjdFR5cGUnKSA9PT0gJ3F1ZXN0aW9uJykge1xuICAgICAgbWV0YWRhdGEucHJvZ3JhbUlkID0gXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLCAnZWRpdG9yQ29uZmlnLmNvbnRleHQucHJvZ3JhbUlkJyk7XG4gICAgICBtZXRhZGF0YS5jb2xsZWN0aW9uSWQgPSBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UsICdlZGl0b3JDb25maWcuY29udGV4dC5jb2xsZWN0aW9uSWRlbnRpZmllcicpO1xuICAgICAgbWV0YWRhdGEub3JnYW5pc2F0aW9uSWQgPSBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UsICdlZGl0b3JDb25maWcuY29udGV4dC5jb250cmlidXRpb25PcmdJZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgIG1ldGFkYXRhLnJlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1heFNjb3JlID0gdGhpcy5tYXhTY29yZTtcbiAgICAgIG1ldGFkYXRhLnJlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLmNvcnJlY3RSZXNwb25zZS5vdXRjb21lcy5TQ09SRSA9IHRoaXMubWF4U2NvcmU7XG4gICAgfVxuICAgIG1ldGFkYXRhID0gXy5tZXJnZShtZXRhZGF0YSwgXy5waWNrQnkodGhpcy5jaGlsZEZvcm1EYXRhLCBfLmlkZW50aXR5KSk7XG4gICAgaWYgKF8uZ2V0KHRoaXMuY3JlYXRpb25Db250ZXh0LCAnb2JqZWN0VHlwZScpID09PSAncXVlc3Rpb24nKSB7XG4gICAgICBtZXRhZGF0YS5pc1Jldmlld01vZGlmaWNhdGlvbkFsbG93ZWQgPSAhIV8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2lzUmV2aWV3TW9kaWZpY2F0aW9uQWxsb3dlZCcpO1xuICAgIH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgcmV0dXJuIF8ub21pdChtZXRhZGF0YSwgWydxdWVzdGlvbicsICdudW1iZXJPZk9wdGlvbnMnLCAnb3B0aW9ucycsICdhbGxvd011bHRpU2VsZWN0JywgJ3Nob3dFdmlkZW5jZScsICdldmlkZW5jZU1pbWVUeXBlJywgJ3Nob3dSZW1hcmtzJywgJ21hcmtBc05vdE1hbmRhdG9yeScsICdsZWZ0QW5jaG9yJywgJ3JpZ2h0QW5jaG9yJywgJ3N0ZXAnLCAnbnVtYmVyT25seScsICdjaGFyYWN0ZXJMaW1pdCcsICdkYXRlRm9ybWF0JywgJ2F1dG9DYXB0dXJlJywgJ3JlbWFya3NMaW1pdCcsICdtYXhpbXVtT3B0aW9ucyddKTtcbiAgfVxuXG4gIGdldFJlc3BvbnNlRGVjbGFyYXRpb24odHlwZSkge1xuICAgIGNvbnN0IHJlc3BvbnNlRGVjbGFyYXRpb24gPSB7XG4gICAgICByZXNwb25zZTE6IHtcbiAgICAgICAgdHlwZTogdHlwZSA9PT0gJ3NsaWRlcicgPyAnaW50ZWdlcicgOiAnc3RyaW5nJ1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHR5cGUgPT09ICd0ZXh0JyB8fCB0eXBlID09PSAnc2xpZGVyJykge1xuICAgICAgcmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTFbJ21heFNjb3JlJ10gPSB0aGlzLm1heFNjb3JlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VEZWNsYXJhdGlvbjtcbiAgfVxuXG5cblxuICBnZXRNY3FRdWVzdGlvbkh0bWxCb2R5KHF1ZXN0aW9uLCB0ZW1wbGF0ZUlkKSB7XG4gICAgY29uc3QgbWNxVGVtcGxhdGVDb25maWcgPSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICBtY3FCb2R5OiAnPGRpdiBjbGFzcz1cXCdxdWVzdGlvbi1ib2R5XFwnPjxkaXYgY2xhc3M9XFwnbWNxLXRpdGxlXFwnPntxdWVzdGlvbn08L2Rpdj48ZGl2IGRhdGEtY2hvaWNlLWludGVyYWN0aW9uPVxcJ3Jlc3BvbnNlMVxcJyBjbGFzcz1cXCd7dGVtcGxhdGVDbGFzc31cXCc+PC9kaXY+PC9kaXY+J1xuICAgIH07XG4gICAgY29uc3QgeyBtY3FCb2R5IH0gPSBtY3FUZW1wbGF0ZUNvbmZpZztcbiAgICBjb25zdCBxdWVzdGlvbkJvZHkgPSBtY3FCb2R5LnJlcGxhY2UoJ3t0ZW1wbGF0ZUNsYXNzfScsIHRlbXBsYXRlSWQpXG4gICAgICAucmVwbGFjZSgne3F1ZXN0aW9ufScsIHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gcXVlc3Rpb25Cb2R5O1xuICB9XG5cbiAgZ2V0RGVmYXVsdFNlc3Npb25Db250ZXh0KCkge1xuICAgIHJldHVybiBfLm9taXRCeShfLm1lcmdlKFxuICAgICAge1xuICAgICAgICBhdXRob3I6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuZnVsbE5hbWUnKSxcbiAgICAgICAgY3JlYXRlZEJ5OiBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLCAnY29udGV4dC51c2VyLmlkJyksXG4gICAgICAgIC4uLl8ucGljayhfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLCAnY29udGV4dCcpLCBbJ2JvYXJkJywgJ21lZGl1bScsICdncmFkZUxldmVsJywgJ3N1YmplY3QnLCAndG9waWMnXSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLl8ucGljayh0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5LCB0aGlzLmNvbmZpZ1NlcnZpY2Uuc2Vzc2lvbkNvbnRleHQpXG4gICAgICB9XG4gICAgKSwga2V5ID0+IF8uaXNFbXB0eShrZXkpKTtcbiAgfVxuXG4gIHNldFF1ZXN0aW9uVHlwZVZhbHVlcyhtZXRhRGF0YSkge1xuICAgIG1ldGFEYXRhLnNob3dFdmlkZW5jZSA9IHRoaXMuY2hpbGRGb3JtRGF0YS5zaG93RXZpZGVuY2U7XG4gICAgaWYgKG1ldGFEYXRhLnNob3dFdmlkZW5jZSA9PT0gJ1llcycpIHtcbiAgICAgIG1ldGFEYXRhLmV2aWRlbmNlID0ge1xuICAgICAgICByZXF1aXJlZDogJ05vJyxcbiAgICAgICAgbWltZVR5cGU6IHRoaXMuY2hpbGRGb3JtRGF0YS5ldmlkZW5jZU1pbWVUeXBlLFxuICAgICAgICBtaW5Db3VudDogMSxcbiAgICAgICAgbWF4Q291bnQ6IDEsXG4gICAgICAgIHNpemVMaW1pdDogZXZpZGVuY2VTaXplTGltaXQsXG4gICAgICB9O1xuICAgIH1cbiAgICBtZXRhRGF0YS5zaG93UmVtYXJrcyA9IHRoaXMuY2hpbGRGb3JtRGF0YS5zaG93UmVtYXJrcztcbiAgICBpZiAobWV0YURhdGEuc2hvd1JlbWFya3MgPT09ICdZZXMnKSB7XG4gICAgICBtZXRhRGF0YS5yZW1hcmtzID0ge1xuICAgICAgICBtYXhMZW5ndGg6IHRoaXMuY2hpbGRGb3JtRGF0YS5yZW1hcmtzTGltaXQsXG4gICAgICAgIHJlcXVpcmVkOiAnTm8nXG4gICAgICB9O1xuICAgIH1cbiAgICBtZXRhRGF0YS5pbnRlcmFjdGlvbnMgPSBtZXRhRGF0YS5pbnRlcmFjdGlvbnMgfHwge307XG5cbiAgICBtZXRhRGF0YS5pbnRlcmFjdGlvbnMudmFsaWRhdGlvbiA9IHsgcmVxdWlyZWQ6IHRoaXMuY2hpbGRGb3JtRGF0YS5tYXJrQXNOb3RNYW5kYXRvcnkgPT09ICdZZXMnID8gJ05vJyA6ICdZZXMnIH07XG4gICAgaWYgKHRoaXMuY2hpbGRGb3JtRGF0YS5hbGxvd011bHRpU2VsZWN0ID09PSAnWWVzJykge1xuICAgICAgbWV0YURhdGEucmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEuY2FyZGluYWxpdHkgPSAnbXVsdGlwbGUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXRhRGF0YS5yZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5jYXJkaW5hbGl0eSA9ICdzaW5nbGUnO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLmVkaXRvclNlcnZpY2U/LmVkaXRvckNvbmZpZz8uY29uZmlnPy5yZW5kZXJUYXhvbm9teSkpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlTWluTWF4U2NvcmUobWV0YURhdGEpO1xuICAgIH1cblxuICAgIF8uZm9yRWFjaCh0aGlzLnN1Yk1lbnVzLCAoZWw6IGFueSkgPT4ge1xuICAgICAgaWYgKGVsLmlkID09PSAnYWRkSGludCcpIHtcbiAgICAgICAgbWV0YURhdGEuaGludHMgPSB7XG4gICAgICAgICAgZW46IFtlbC52YWx1ZV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlbC5pZCA9PT0gJ2FkZFRpcCcpIHtcbiAgICAgICAgbWV0YURhdGEuaW5zdHJ1Y3Rpb25zID0ge1xuICAgICAgICAgIGVuOiBbZWwudmFsdWVdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLnNsaWRlckRhdGFzKSAmJiB0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnc2xpZGVyJykge1xuICAgICAgbWV0YURhdGEuaW50ZXJhY3Rpb25UeXBlcyA9IFt0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlXTtcbiAgICAgIG1ldGFEYXRhLnByaW1hcnlDYXRlZ29yeSA9IHRoaXMucXVlc3Rpb25QcmltYXJ5Q2F0ZWdvcnk7XG4gICAgICBtZXRhRGF0YS5pbnRlcmFjdGlvbnMgPSB7XG4gICAgICAgIC4uLm1ldGFEYXRhLmludGVyYWN0aW9ucyxcbiAgICAgICAgcmVzcG9uc2UxOiB7XG4gICAgICAgICAgdmFsaWRhdGlvbjogdGhpcy5zbGlkZXJEYXRhcy52YWxpZGF0aW9uLFxuICAgICAgICAgIHN0ZXA6IHRoaXMuc2xpZGVyRGF0YXMuc3RlcFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnZGF0ZScpIHtcbiAgICAgIG1ldGFEYXRhLmludGVyYWN0aW9uVHlwZXMgPSBbdGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZV07XG4gICAgICBtZXRhRGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPSB0aGlzLnF1ZXN0aW9uUHJpbWFyeUNhdGVnb3J5O1xuICAgICAgbWV0YURhdGEuaW50ZXJhY3Rpb25zID0ge1xuICAgICAgICAuLi5tZXRhRGF0YS5pbnRlcmFjdGlvbnMsXG4gICAgICAgIHJlc3BvbnNlMToge1xuICAgICAgICAgIHZhbGlkYXRpb246IHsgcGF0dGVybjogdGhpcy5jaGlsZEZvcm1EYXRhLmRhdGVGb3JtYXQgfSxcbiAgICAgICAgICBhdXRvQ2FwdHVyZTogdGhpcy5jaGlsZEZvcm1EYXRhLmF1dG9DYXB0dXJlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgbWV0YURhdGEuaW50ZXJhY3Rpb25UeXBlcyA9IFt0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlXTtcbiAgICAgIG1ldGFEYXRhLnByaW1hcnlDYXRlZ29yeSA9IHRoaXMucXVlc3Rpb25QcmltYXJ5Q2F0ZWdvcnk7XG4gICAgICBtZXRhRGF0YS5pbnRlcmFjdGlvbnMgPSB7XG4gICAgICAgIC4uLm1ldGFEYXRhLmludGVyYWN0aW9ucyxcbiAgICAgICAgcmVzcG9uc2UxOiB7XG4gICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgbGltaXQ6IHtcbiAgICAgICAgICAgICAgbWF4TGVuZ3RoOiB0aGlzLmNoaWxkRm9ybURhdGEuY2hhcmFjdGVyTGltaXQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBudW1iZXI6IHRoaXMuY2hpbGRGb3JtRGF0YS5udW1iZXJPbmx5XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICAvLyAgcmV0dXJuIG1ldGFEYXRhO1xuICB9XG5cbiAgcHJlcGFyZVJlcXVlc3RCb2R5KCkge1xuICAgIGNvbnN0IHF1ZXN0aW9uSWQgPSB0aGlzLnF1ZXN0aW9uSWQgPyB0aGlzLnF1ZXN0aW9uSWQgOiB1dWlkdjQoKTtcbiAgICB0aGlzLm5ld1F1ZXN0aW9uSUQgPSBxdWVzdGlvbklkO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnRyZWVOb2RlRGF0YTtcbiAgICBjb25zdCBhY3RpdmVOb2RlID0gdGhpcy50cmVlU2VydmljZS5nZXRBY3RpdmVOb2RlKCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRVbml0SWQgPSBfLmdldChhY3RpdmVOb2RlLCAnZGF0YS5pZCcpO1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5kYXRhID0ge307XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGVzTW9kaWZpZWQ6IHtcbiAgICAgICAgW3F1ZXN0aW9uSWRdOiB7XG4gICAgICAgICAgbWV0YWRhdGE6IHRoaXMuZ2V0UXVlc3Rpb25NZXRhZGF0YSgpLFxuICAgICAgICAgIG9iamVjdFR5cGU6ICdRdWVzdGlvbicsXG4gICAgICAgICAgcm9vdDogZmFsc2UsXG4gICAgICAgICAgaXNOZXc6ICF0aGlzLnF1ZXN0aW9uSWRcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhpZXJhcmNoeTogdGhpcy5lZGl0b3JTZXJ2aWNlLmdldEhpZXJhcmNoeU9iaihkYXRhLCBxdWVzdGlvbklkLCBzZWxlY3RlZFVuaXRJZClcbiAgICB9O1xuICB9XG5cbiAgcHJlcGFyZVF1ZXN0aW9uQm9keSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbklkID9cbiAgICAgIHtcbiAgICAgICAgcXVlc3Rpb246IF8ub21pdCh0aGlzLmdldFF1ZXN0aW9uTWV0YWRhdGEoKSwgWydtaW1lVHlwZScsICdjcmVhdG9yJywgJ2NyZWF0ZWRCeScsICdvcmdhbmlzYXRpb25JZCddKVxuICAgICAgfSA6XG4gICAgICB7XG4gICAgICAgIHF1ZXN0aW9uOiB7XG4gICAgICAgICAgY29kZTogdXVpZHY0KCksXG4gICAgICAgICAgLi4udGhpcy5nZXRRdWVzdGlvbk1ldGFkYXRhKClcbiAgICAgICAgfVxuICAgICAgfTtcbiAgfVxuXG4gIHByZXBhcmVTb3VyY2luZ1VwZGF0ZUJvZHkocXVlc3Rpb25JZHMsIGNvbW1lbnRzPykge1xuICAgIGNvbnN0IHNvdXJjaW5nVXBkYXRlQXR0cmlidXRlID0gdGhpcy5hY3Rpb25UeXBlID09PSAnc291cmNpbmdBcHByb3ZlUXVlc3Rpb24nID8gJ2FjY2VwdGVkQ29udHJpYnV0aW9ucydcbiAgICAgIDogJ3JlamVjdGVkQ29udHJpYnV0aW9ucyc7XG4gICAgY29uc3QgY29sbGVjdGlvbk9iamVjdFR5cGUgPSBfLnJlcGxhY2UoXy5sb3dlckNhc2UodGhpcy5jcmVhdGlvbkNvbnRleHRbJ2NvbGxlY3Rpb25PYmplY3RUeXBlJ10pLCAnICcsICcnKTtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgW2NvbGxlY3Rpb25PYmplY3RUeXBlXToge1xuICAgICAgICAgIFtzb3VyY2luZ1VwZGF0ZUF0dHJpYnV0ZV06IHF1ZXN0aW9uSWRzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICh0aGlzLmFjdGlvblR5cGUgPT09ICdzb3VyY2luZ1JlamVjdFF1ZXN0aW9uJykge1xuICAgICAgcmVxdWVzdEJvZHkucmVxdWVzdFtjb2xsZWN0aW9uT2JqZWN0VHlwZV1bJ3JlamVjdGVkQ29udHJpYnV0aW9uQ29tbWVudHMnXSA9IGNvbW1lbnRzO1xuICAgICAgLy8gcmVxdWVzdEJvZHkucmVxdWVzdFtjb2xsZWN0aW9uT2JqZWN0VHlwZV1bJ3JlamVjdENvbW1lbnQnXSA9IGNvbW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gcmVxdWVzdEJvZHk7XG4gIH1cblxuICB1cHNlcnRRdWVzdGlvbihjYWxsYmFjaykge1xuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gdGhpcy5wcmVwYXJlUXVlc3Rpb25Cb2R5KCk7XG4gICAgdGhpcy5zaG93SGlkZVNwaW5uZXJMb2FkZXIodHJ1ZSk7XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UudXBzZXJ0UXVlc3Rpb24odGhpcy5xdWVzdGlvbklkLCByZXF1ZXN0Qm9keSkucGlwZShcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93SGlkZVNwaW5uZXJMb2FkZXIoZmFsc2UpO1xuICAgICAgfSkpLnN1YnNjcmliZSgocmVzcG9uc2U6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmICghXy5pbmNsdWRlcyhbJ3N1Ym1pdFF1ZXN0aW9uJ10sIHRoaXMuYWN0aW9uVHlwZSkpIHtcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMTMnKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRRdWVzdGlvbklkKF8uZ2V0KHJlc3BvbnNlLCAncmVzdWx0LmlkZW50aWZpZXInKSk7XG4gICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIH0sIChlcnI6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgZXJyb3JNc2c6ICdGYWlsZWQgdG8gc2F2ZSBxdWVzdGlvbi4gUGxlYXNlIHRyeSBhZ2Fpbi4uLicsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVF1ZXN0aW9uKCkge1xuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gdGhpcy5wcmVwYXJlUmVxdWVzdEJvZHkoKTtcbiAgICB0aGlzLnNob3dIaWRlU3Bpbm5lckxvYWRlcih0cnVlKTtcbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGRhdGVIaWVyYXJjaHlRdWVzdGlvbkNyZWF0ZShyZXF1ZXN0Qm9keSkucGlwZShcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93SGlkZVNwaW5uZXJMb2FkZXIoZmFsc2UpO1xuICAgICAgfSkpLnN1YnNjcmliZSgocmVzcG9uc2U6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwNycpKTtcbiAgICAgICAgdGhpcy5yZWRpcmVjdFRvUXVlc3Rpb25zZXQoKTtcbiAgICAgIH0sIChlcnI6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgZXJyb3JNc2c6ICdRdWVzdGlvbiBjcmVhdGluZyBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uLi4nLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pO1xuICAgICAgfSk7XG4gIH1cblxuICB1cGRhdGVRdWVzdGlvbigpIHtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHRoaXMucHJlcGFyZVJlcXVlc3RCb2R5KCk7XG4gICAgdGhpcy5zaG93SGlkZVNwaW5uZXJMb2FkZXIodHJ1ZSk7XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UudXBkYXRlSGllcmFyY2h5UXVlc3Rpb25VcGRhdGUocmVxdWVzdEJvZHkpLnBpcGUoXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd0hpZGVTcGlubmVyTG9hZGVyKGZhbHNlKTtcbiAgICAgIH0pKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBTZXJ2ZXJSZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMDgnKSk7XG4gICAgICAgIHRoaXMucmVkaXJlY3RUb1F1ZXN0aW9uc2V0KCk7XG4gICAgICB9LCAoZXJyOiBTZXJ2ZXJSZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBlcnJJbmZvID0ge1xuICAgICAgICAgIGVycm9yTXNnOiAnUXVlc3Rpb24gdXBkYXRpbmcgZmFpbGVkLiBQbGVhc2UgdHJ5IGFnYWluLi4uJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2F2ZVF1ZXN0aW9ucyhyZXF1ZXN0Qm9keSwgdHlwZSkge1xuICAgIHRoaXMuc2hvd0hpZGVTcGlubmVyTG9hZGVyKHRydWUpO1xuICAgIGNvbnN0IHNlcnZpY2VNZXRob2QgPSB0eXBlID09PSAnY3JlYXRlJyA/XG4gICAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGRhdGVIaWVyYXJjaHlRdWVzdGlvbkNyZWF0ZShyZXF1ZXN0Qm9keSkgOlxuICAgICAgdGhpcy5xdWVzdGlvblNlcnZpY2UudXBkYXRlSGllcmFyY2h5UXVlc3Rpb25VcGRhdGUocmVxdWVzdEJvZHkpO1xuXG4gICAgc2VydmljZU1ldGhvZC5waXBlKFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dIaWRlU3Bpbm5lckxvYWRlcihmYWxzZSk7XG4gICAgICB9KSkuc3Vic2NyaWJlKChyZXNwb25zZTogU2VydmVyUmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3Qgc3VjY2Vzc01zZyA9IHR5cGUgPT09ICdjcmVhdGUnID9cbiAgICAgICAgICBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwNycpIDpcbiAgICAgICAgICBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwOCcpO1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3Moc3VjY2Vzc01zZyk7XG4gICAgICAgIHRoaXMucmVkaXJlY3RUb1F1ZXN0aW9uc2V0KCk7XG4gICAgICB9LCAoZXJyOiBTZXJ2ZXJSZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBlcnJJbmZvID0ge1xuICAgICAgICAgIGVycm9yTXNnOiBgUXVlc3Rpb24gJHt0eXBlID09PSAnY3JlYXRlJyA/ICdjcmVhdGluZycgOiAndXBkYXRpbmcnfSBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uLi5gLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pO1xuICAgICAgfSk7XG4gIH1cblxuICBzaG93SGlkZVNwaW5uZXJMb2FkZXIoc3RhdHVzOiBib29sZWFuKSB7XG4gICAgdGhpcy5idXR0b25Mb2FkZXJzLnNhdmVCdXR0b25Mb2FkZXIgPSBzdGF0dXM7XG4gIH1cblxuICBwcmV2aWV3Q29udGVudCgpIHtcbiAgICB0aGlzLnZhbGlkYXRlUXVlc3Rpb25EYXRhKCk7XG4gICAgaWYgKHRoaXMuc2hvd0Zvcm1FcnJvciA9PT0gZmFsc2UgJiYgdGhpcy5xdWVzdGlvbk1ldGFkYXRhRm9ybVN0YXR1cyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5wcmV2aWV3Rm9ybURhdGEoZmFsc2UpO1xuICAgICAgY29uc3QgYWN0aXZlTm9kZSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0QWN0aXZlTm9kZSgpO1xuICAgICAgbGV0IHF1ZXN0aW9uSWQgPSAnJztcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMucXVlc3Rpb25JZCkpIHtcbiAgICAgICAgcXVlc3Rpb25JZCA9IHRoaXMudGVtcFF1ZXN0aW9uSWQ7XG4gICAgICAgIHRoaXMuc2V0UGFyZW50Q29uZmlnKGFjdGl2ZU5vZGU/LmRhdGE/Lm1ldGFkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXN0aW9uSWQgPSB0aGlzLnF1ZXN0aW9uSWQ7XG4gICAgICAgIHRoaXMuc2V0UGFyZW50Q29uZmlnKGFjdGl2ZU5vZGU/LnBhcmVudD8uZGF0YT8ubWV0YWRhdGEpO1xuICAgICAgfVxuICAgICAgdGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeS5jaGlsZE5vZGVzID0gW3F1ZXN0aW9uSWRdO1xuICAgICAgdGhpcy5zZXRRdW1sUGxheWVyRGF0YShxdWVzdGlvbklkKTtcbiAgICAgIHRoaXMuc2hvd1ByZXZpZXcgPSB0cnVlO1xuICAgICAgdGhpcy50b29sYmFyQ29uZmlnLnNob3dQcmV2aWV3ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wNDQnKSk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGFyZW50Q29uZmlnKHBhcmVudENvbmZpZykge1xuICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHkuc2hvd1NvbHV0aW9ucyA9ICFfLmlzVW5kZWZpbmVkKHBhcmVudENvbmZpZz8uc2hvd1NvbHV0aW9ucykgP1xuICAgICAgcGFyZW50Q29uZmlnLnNob3dTb2x1dGlvbnMgOiAnTm8nO1xuICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHkuc2h1ZmZsZSA9ICFfLmlzVW5kZWZpbmVkKHBhcmVudENvbmZpZz8uc2h1ZmZsZSkgP1xuICAgICAgcGFyZW50Q29uZmlnLnNodWZmbGUgOiB0cnVlO1xuICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHkuc2hvd0ZlZWRiYWNrID0gIV8uaXNVbmRlZmluZWQocGFyZW50Q29uZmlnPy5zaG93RmVlZGJhY2spID9cbiAgICAgIHBhcmVudENvbmZpZy5zaG93RmVlZGJhY2sgOiAnTm8nO1xuICB9XG5cbiAgc2V0UXVtbFBsYXllckRhdGEocXVlc3Rpb25JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcXVlc3Rpb25NZXRhZGF0YTogYW55ID0gXy5jbG9uZURlZXAodGhpcy5nZXRRdWVzdGlvbk1ldGFkYXRhKCkpO1xuICAgIHF1ZXN0aW9uTWV0YWRhdGEuaWRlbnRpZmllciA9IHF1ZXN0aW9uSWQ7XG4gICAgdGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeS5jaGlsZHJlbiA9IFtxdWVzdGlvbk1ldGFkYXRhXTtcbiAgICBpZiAodGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeS5zaHVmZmxlID09PSB0cnVlKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWxcbiAgICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHlbJ21heFNjb3JlJ10gPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocXVlc3Rpb25NZXRhZGF0YS5xVHlwZSA9PT0gJ1NBJykge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5ID0gXy5vbWl0KHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHksICdtYXhTY29yZScpO1xuICAgICAgfSBlbHNlIGlmIChxdWVzdGlvbk1ldGFkYXRhLm1heFNjb3JlKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbFxuICAgICAgICB0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5WydtYXhTY29yZSddID0gdGhpcy5tYXhTY29yZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lZGl0b3JDdXJzb3Iuc2V0UXVlc3Rpb25NYXAocXVlc3Rpb25JZCwgcXVlc3Rpb25NZXRhZGF0YSk7XG4gIH1cblxuICBnZXRQbGF5ZXJFdmVudHMoZXZlbnQpIHtcbiAgICBjb25zb2xlLmxvZygnZ2V0IHBsYXllciBldmVudHMnLCBKU09OLnN0cmluZ2lmeShldmVudCkpO1xuICB9XG5cbiAgZ2V0VGVsZW1ldHJ5RXZlbnRzKGV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJ2V2ZW50IGlzIGZvciB0ZWxlbWV0cnknLCBKU09OLnN0cmluZ2lmeShldmVudCkpO1xuICB9XG5cbiAgc2V0UXVlc3Rpb25UaXRsZShxdWVzdGlvbklkPykge1xuICAgIGxldCBpbmRleDtcbiAgICBsZXQgcXVlc3Rpb25UaXRsZSA9ICcnO1xuICAgIGxldCBoaWVyYXJjaHlDaGlsZHJlbiA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0Q2hpbGRyZW4oKTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocXVlc3Rpb25JZCkpIHtcbiAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldEFjdGl2ZU5vZGUoKS5nZXRQYXJlbnQoKTtcbiAgICAgIGhpZXJhcmNoeUNoaWxkcmVuID0gcGFyZW50Tm9kZS5nZXRDaGlsZHJlbigpO1xuICAgICAgaW5kZXggPSBfLmZpbmRJbmRleChoaWVyYXJjaHlDaGlsZHJlbiwgKG5vZGUpID0+IG5vZGUuZGF0YS5pZCA9PT0gcXVlc3Rpb25JZCk7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IGhpZXJhcmNoeUNoaWxkcmVuW2luZGV4XTtcbiAgICAgIHF1ZXN0aW9uVGl0bGUgPSBgUSR7KGluZGV4ICsgMSkudG9TdHJpbmcoKX0gfCBgICsgcXVlc3Rpb24uZGF0YS5wcmltYXJ5Q2F0ZWdvcnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4ID0gaGllcmFyY2h5Q2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgcXVlc3Rpb25UaXRsZSA9IGBRJHsoaW5kZXggKyAxKS50b1N0cmluZygpfSB8IGA7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvblByaW1hcnlDYXRlZ29yeSkpIHtcbiAgICAgICAgcXVlc3Rpb25UaXRsZSA9IHF1ZXN0aW9uVGl0bGUgKyB0aGlzLnF1ZXN0aW9uUHJpbWFyeUNhdGVnb3J5O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRvb2xiYXJDb25maWcudGl0bGUgPSBxdWVzdGlvblRpdGxlO1xuICB9XG4gIG91dHB1dChldmVudCkgeyB9XG5cbiAgb25TdGF0dXNDaGFuZ2VzKGV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xuICAgIGlmIChfLmhhcyhldmVudCwgJ2lzVmFsaWQnKSkge1xuICAgICAgdGhpcy5xdWVzdGlvbk1ldGFkYXRhRm9ybVN0YXR1cyA9IGV2ZW50LmlzVmFsaWQ7XG4gICAgfVxuICB9XG5cbiAgdmFsdWVDaGFuZ2VzKGV2ZW50KSB7XG4gICAgaWYgKF8uaGFzKGV2ZW50LCAnbWF4U2NvcmUnKSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJhZGl4XG4gICAgICBldmVudC5tYXhTY29yZSA9ICFfLmlzTnVsbChldmVudC5tYXhTY29yZSkgPyBwYXJzZUludChldmVudC5tYXhTY29yZSkgOiB0aGlzLm1heFNjb3JlO1xuICAgICAgdGhpcy5tYXhTY29yZSA9IGV2ZW50Lm1heFNjb3JlO1xuICAgIH1cbiAgICB0aGlzLmNoaWxkRm9ybURhdGEgPSBldmVudDtcbiAgfVxuICB2YWxpZGF0ZUZvcm1GaWVsZHMoKSB7XG4gICAgXy5mb3JFYWNoKHRoaXMubGVhZkZvcm1Db25maWcsIChmb3JtRmllbGRDYXRlZ29yeSkgPT4ge1xuICAgICAgaWYgKGZvcm1GaWVsZENhdGVnb3J5LnJlcXVpcmVkICYmICF0aGlzLmNoaWxkRm9ybURhdGFbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV0pIHtcbiAgICAgICAgdGhpcy5zaG93Rm9ybUVycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMDgnKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcmV2aWV3Rm9ybURhdGEoc3RhdHVzKSB7XG4gICAgY29uc3QgZm9ybUNvbmZpZyA9IF8uY2xvbmVEZWVwKHRoaXMubGVhZkZvcm1Db25maWcpO1xuICAgIHRoaXMucXVlc3Rpb25Gb3JtQ29uZmlnID0gbnVsbDtcbiAgICBfLmZvckVhY2goZm9ybUNvbmZpZywgKGZvcm1GaWVsZENhdGVnb3J5KSA9PiB7XG4gICAgICBpZiAoXy5oYXMoZm9ybUZpZWxkQ2F0ZWdvcnksICdlZGl0YWJsZScpICYmICFfLmlzVW5kZWZpbmVkKGZvcm1GaWVsZENhdGVnb3J5LmVkaXRhYmxlKSkge1xuICAgICAgICBmb3JtRmllbGRDYXRlZ29yeS5lZGl0YWJsZSA9IHN0YXR1cyA/IF8uZmluZCh0aGlzLmxlYWZGb3JtQ29uZmlnLCB7IGNvZGU6IGZvcm1GaWVsZENhdGVnb3J5LmNvZGUgfSkuZWRpdGFibGUgOiBzdGF0dXM7XG4gICAgICAgIGZvcm1GaWVsZENhdGVnb3J5LmRlZmF1bHQgPSB0aGlzLmNoaWxkRm9ybURhdGFbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5sZWFmRm9ybUNvbmZpZyA9IGZvcm1Db25maWc7XG4gIH1cbiAgcG9wdWxhdGVGb3JtRGF0YSgpIHtcbiAgICB0aGlzLmNoaWxkRm9ybURhdGEgPSB7fTtcbiAgICBfLmZvckVhY2godGhpcy5sZWFmRm9ybUNvbmZpZywgKGZvcm1GaWVsZENhdGVnb3J5KSA9PiB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgICBpZiAoZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZSA9PT0gJ21heFNjb3JlJyAmJiB0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnY2hvaWNlJykge1xuICAgICAgICAgIHRoaXMuY2hpbGRGb3JtRGF0YVtmb3JtRmllbGRDYXRlZ29yeS5jb2RlXSA9IF8uaGFzKHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ3Jlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1heFNjb3JlJykgP1xuICAgICAgICAgICAgXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEubWF4U2NvcmUnKSA6IHRoaXMubWF4U2NvcmU7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZSA9PT0gJ2FsbG93TXVsdGlTZWxlY3QnICYmIHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdjaG9pY2UnKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZEZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdID0gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEuY2FyZGluYWxpdHknKSA9PT0gJ211bHRpcGxlJyA/ICdZZXMnIDogJ05vJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnF1ZXN0aW9uTWV0YURhdGEgJiYgXy5oYXModGhpcy5xdWVzdGlvbk1ldGFEYXRhLCBmb3JtRmllbGRDYXRlZ29yeS5jb2RlKSkge1xuICAgICAgICAgIGZvcm1GaWVsZENhdGVnb3J5LmRlZmF1bHQgPSB0aGlzLnF1ZXN0aW9uTWV0YURhdGFbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV07XG4gICAgICAgICAgdGhpcy5jaGlsZEZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXZhaWxhYmxlQWxpYXMgPSB7XG4gICAgICAgICAgICBkYXRlRm9ybWF0OiAnaW50ZXJhY3Rpb25zLnJlc3BvbnNlMS52YWxpZGF0aW9uLnBhdHRlcm4nLFxuICAgICAgICAgICAgYXV0b0NhcHR1cmU6ICdpbnRlcmFjdGlvbnMucmVzcG9uc2UxLmF1dG9DYXB0dXJlJyxcbiAgICAgICAgICAgIG1hcmtBc05vdE1hbmRhdG9yeTogJ2ludGVyYWN0aW9ucy52YWxpZGF0aW9uLnJlcXVpcmVkJyxcbiAgICAgICAgICAgIG51bWJlck9ubHk6ICdpbnRlcmFjdGlvbnMucmVzcG9uc2UxLnR5cGUubnVtYmVyJyxcbiAgICAgICAgICAgIGNoYXJhY3RlckxpbWl0OiAnaW50ZXJhY3Rpb25zLnJlc3BvbnNlMS52YWxpZGF0aW9uLmxpbWl0Lm1heExlbmd0aCcsXG4gICAgICAgICAgICByZW1hcmtzTGltaXQ6ICdyZW1hcmtzLm1heExlbmd0aCcsXG4gICAgICAgICAgICBldmlkZW5jZU1pbWVUeXBlOiAnZXZpZGVuY2UubWltZVR5cGUnXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1ldGFEYXRhICYmIF8uaGFzKGF2YWlsYWJsZUFsaWFzLCBmb3JtRmllbGRDYXRlZ29yeS5jb2RlKSkge1xuICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgYXZhaWxhYmxlQWxpYXNbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV0pO1xuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZENhdGVnb3J5LmNvZGUgPT09ICdtYXJrQXNOb3RNYW5kYXRvcnknKSB7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA9PT0gJ1llcycgPyAnTm8nIDogJ1llcyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtRmllbGRDYXRlZ29yeS5kZWZhdWx0ID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jaGlsZEZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uU2V0RGVmYXVsdFZhbHVlID0gXy5nZXQodGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeSwgZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZSkgPyBfLmdldCh0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5LCBmb3JtRmllbGRDYXRlZ29yeS5jb2RlKSA6ICcnO1xuICAgICAgICBjb25zdCBkZWZhdWx0RWRpdFN0YXR1cyA9IF8uZmluZCh0aGlzLmluaXRpYWxMZWFmRm9ybUNvbmZpZywgeyBjb2RlOiBmb3JtRmllbGRDYXRlZ29yeS5jb2RlIH0pLmVkaXRhYmxlID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBmb3JtRmllbGRDYXRlZ29yeS5kZWZhdWx0ID0gZGVmYXVsdEVkaXRTdGF0dXMgPyAnJyA6IHF1ZXN0aW9uU2V0RGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLmNoaWxkRm9ybURhdGFbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV0gPSBmb3JtRmllbGRDYXRlZ29yeS5kZWZhdWx0O1xuICAgICAgICBpZiAoZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZSA9PT0gJ21heFNjb3JlJyAmJiB0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnY2hvaWNlJykge1xuICAgICAgICAgIHRoaXMuY2hpbGRGb3JtRGF0YVtmb3JtRmllbGRDYXRlZ29yeS5jb2RlXSA9IHRoaXMubWF4U2NvcmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZldGNoRnJhbWVXb3JrRGV0YWlscygpO1xuICAgICh0aGlzLmlzUmVhZE9ubHlNb2RlID09PSB0cnVlICYmICFfLmlzVW5kZWZpbmVkKHRoaXMuZWRpdG9yU2VydmljZT8uZWRpdG9yQ29uZmlnPy5jb25maWc/LnJlbmRlclRheG9ub215KSkgPyB0aGlzLnByZXZpZXdGb3JtRGF0YShmYWxzZSkgOiB0aGlzLnByZXZpZXdGb3JtRGF0YSh0cnVlKTtcbiAgfVxuXG4gIHN1Yk1lbnVDaGFuZ2UoeyBpbmRleCwgdmFsdWUgfSkge1xuICAgIGlmICh0aGlzLnN1Yk1lbnVzW2luZGV4XS5pZCA9PT0gJ2FkZERlcGVuZGFudFF1ZXN0aW9uJykge1xuICAgICAgdGhpcy5zaG93QWRkU2Vjb25kYXJ5UXVlc3Rpb25DYXQgPSB0cnVlO1xuICAgICAgdGhpcy5zYXZlQ29udGVudCgpO1xuICAgICAgaWYgKHRoaXMuc2hvd0Zvcm1FcnJvcikge1xuICAgICAgICB0aGlzLnNob3dBZGRTZWNvbmRhcnlRdWVzdGlvbkNhdCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3ViTWVudXNbaW5kZXhdLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgZGVwZW5kZW50UXVlc3Rpb25zKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5zdWJNZW51cy5maWx0ZXIobWVudSA9PiBtZW51LmlkID09PSAnYWRkRGVwZW5kYW50UXVlc3Rpb24nKVswXS52YWx1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHN1Yk1lbnVDb25maWcoKSB7XG4gICAgdGhpcy5zdWJNZW51cyA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdhZGRIaW50JyxcbiAgICAgICAgbmFtZTogJ0FkZCBIaW50JyxcbiAgICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2hpbnRzLmVuWzBdJyksXG4gICAgICAgIGxhYmVsOiAnSGludCcsXG4gICAgICAgIGVuYWJsZWQ6IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2hpbnRzLmVuWzBdJykgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIHNob3c6IF8uZ2V0KHRoaXMuc291cmNpbmdTZXR0aW5ncywgJ3Nob3dBZGRIaW50cycpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJ2FkZFRpcCcsXG4gICAgICAgIG5hbWU6ICdBZGQgVGlwJyxcbiAgICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2luc3RydWN0aW9ucy5lblswXScpLFxuICAgICAgICBsYWJlbDogJ1RpcCcsXG4gICAgICAgIGVuYWJsZWQ6IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2luc3RydWN0aW9ucy5lblswXScpID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBzaG93OiBfLmdldCh0aGlzLnNvdXJjaW5nU2V0dGluZ3MsICdzaG93QWRkVGlwcycpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJ2FkZERlcGVuZGFudFF1ZXN0aW9uJyxcbiAgICAgICAgbmFtZTogJ0FkZCBEZXBlbmRhbnQgUXVlc3Rpb24nLFxuICAgICAgICBsYWJlbDogJycsXG4gICAgICAgIHZhbHVlOiBbXSxcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHR5cGU6ICcnLFxuICAgICAgICBzaG93OiBfLmdldCh0aGlzLnNvdXJjaW5nU2V0dGluZ3MsICdzaG93QWRkU2Vjb25kYXJ5UXVlc3Rpb24nKSAmJiAhdGhpcy5xdWVzdGlvbklucHV0LnNldENoaWxkUXVlc3RvblxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmICghXy5nZXQodGhpcy5zb3VyY2luZ1NldHRpbmdzLCAnc2hvd0FkZFNlY29uZGFyeVF1ZXN0aW9uJykgJiYgIXRoaXMucXVlc3Rpb25JbnB1dC5zZXRDaGlsZFF1ZXN0b24pIHtcbiAgICAgIHRoaXMuc2hvd09wdGlvbnMgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93T3B0aW9ucyA9ICh0aGlzLnF1ZXN0aW9uSW5wdXQuc2V0Q2hpbGRRdWVzdG9uID09PSB0cnVlKSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5vbkNvbXBvbmVudERlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLm9uQ29tcG9uZW50RGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmVkaXRvckN1cnNvci5jbGVhclF1ZXN0aW9uTWFwKCk7XG4gIH1cblxuICBzbGlkZXJEYXRhKCRldmVudCkge1xuICAgIGNvbnN0IHZhbCA9ICRldmVudDtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICB2YWxpZGF0aW9uOiB7XG4gICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgbWluOiAnJyxcbiAgICAgICAgICBtYXg6ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzdGVwOiAnJ1xuICAgIH07XG4gICAgaWYgKHZhbC5sZWZ0QW5jaG9yKSB7XG4gICAgICBvYmoudmFsaWRhdGlvbi5yYW5nZS5taW4gPSB2YWwubGVmdEFuY2hvcjtcbiAgICB9XG4gICAgaWYgKHZhbC5yaWdodEFuY2hvcikge1xuICAgICAgb2JqLnZhbGlkYXRpb24ucmFuZ2UubWF4ID0gdmFsLnJpZ2h0QW5jaG9yO1xuICAgIH1cbiAgICBpZiAodmFsLnN0ZXApIHtcbiAgICAgIG9iai5zdGVwID0gdmFsLnN0ZXA7XG4gICAgfVxuICAgIHRoaXMuc2xpZGVyRGF0YXMgPSBvYmo7XG4gIH1cblxuICBvcHRpb25IYW5kbGVyKGUpIHtcbiAgICB0aGlzLnRhcmdldE9wdGlvbiA9IGUudGFyZ2V0LnZhbHVlO1xuICB9XG5cblxuICBidWlsZENvbmRpdGlvbih0eXBlKSB7XG4gICAgaWYgKHRoaXMuY29uZGl0aW9uID09PSAnZGVmYXVsdCcgfHwgXy5pc0VtcHR5KHRoaXMuc2VsZWN0ZWRPcHRpb25zKSkge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMzgnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHF1ZXN0aW9uSWQgPSB0aGlzLnF1ZXN0aW9uSWQgPyB0aGlzLnF1ZXN0aW9uSWQgOiB1dWlkdjQoKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy50cmVlTm9kZURhdGE7XG4gICAgY29uc3QgaGllcmFyY2h5RGF0YSA9IHRoaXMuZWRpdG9yU2VydmljZS5nZXRIaWVyYXJjaHlPYmooZGF0YSwgJycsIHRoaXMuc2VsZWN0ZWRTZWN0aW9uSWQpO1xuICAgIGNvbnN0IHNlY3Rpb25EYXRhID0gXy5nZXQoaGllcmFyY2h5RGF0YSwgYCR7dGhpcy5zZWxlY3RlZFNlY3Rpb25JZH1gKTtcbiAgICBjb25zdCBzZWN0aW9uTmFtZSA9IHNlY3Rpb25EYXRhLm5hbWU7XG4gICAgY29uc3QgYnJhbmNoaW5nTG9naWMgPSB7XG4gICAgICAuLi50aGlzLmJyYW5jaGluZ0xvZ2ljLFxuICAgICAgW3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyXToge1xuICAgICAgICB0YXJnZXQ6IHRoaXMudXBkYXRlVGFyZ2V0KHF1ZXN0aW9uSWQpLFxuICAgICAgICBwcmVDb25kaXRpb246IHt9LFxuICAgICAgICBzb3VyY2U6IFtdXG4gICAgICB9LFxuICAgICAgW3F1ZXN0aW9uSWRdOiB7XG4gICAgICAgIHRhcmdldDogW10sXG4gICAgICAgIHNvdXJjZTogW3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyXSxcbiAgICAgICAgcHJlQ29uZGl0aW9uOiB7XG4gICAgICAgICAgYW5kOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFt0aGlzLmNvbmRpdGlvbl06IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB2YXI6IGAke3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyfS4ke3RoaXMucmVzcG9uc2VWYXJpYWJsZX0udmFsdWVgLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Jlc3BvbnNlRGVjbGFyYXRpb24nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVUcmVlQ2FjaGUoc2VjdGlvbk5hbWUsIGJyYW5jaGluZ0xvZ2ljLCB0aGlzLnNlbGVjdGVkU2VjdGlvbklkKTtcbiAgICBjb25zdCBtZXRhRGF0YSA9IHRoaXMuZ2V0UXVlc3Rpb25NZXRhZGF0YSgpO1xuICAgIHRoaXMuc2V0UXVlc3Rpb25UeXBlVmFsdWVzKG1ldGFEYXRhKTtcbiAgICBjb25zdCBmaW5hbFJlc3VsdCA9IHtcbiAgICAgIG5vZGVzTW9kaWZpZWQ6IHtcbiAgICAgICAgW3F1ZXN0aW9uSWRdOiB7XG4gICAgICAgICAgbWV0YWRhdGE6IG1ldGFEYXRhLFxuICAgICAgICAgIG9iamVjdFR5cGU6ICdRdWVzdGlvbicsXG4gICAgICAgICAgcm9vdDogZmFsc2UsXG4gICAgICAgICAgaXNOZXc6IHRoaXMucXVlc3Rpb25JZCA/IGZhbHNlIDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBbdGhpcy5zZWxlY3RlZFNlY3Rpb25JZF06IHtcbiAgICAgICAgICAuLi50aGlzLnRyZWVTZXJ2aWNlLnRyZWVDYWNoZS5ub2Rlc01vZGlmaWVkW3RoaXMuc2VsZWN0ZWRTZWN0aW9uSWRdXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoaWVyYXJjaHk6IHRoaXMuZWRpdG9yU2VydmljZS5nZXRIaWVyYXJjaHlPYmooZGF0YSwgcXVlc3Rpb25JZCwgdGhpcy5zZWxlY3RlZFNlY3Rpb25JZCwgdGhpcy5lZGl0b3JTZXJ2aWNlLnBhcmVudElkZW50aWZpZXIpXG4gICAgfTtcbiAgICB0aGlzLnNhdmVRdWVzdGlvbnMoZmluYWxSZXN1bHQsIHR5cGUpO1xuICB9XG5cbiAgdXBkYXRlVGFyZ2V0KHF1ZXN0aW9uSWQpIHtcbiAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmJyYW5jaGluZ0xvZ2ljKSAmJiBfLmdldCh0aGlzLmJyYW5jaGluZ0xvZ2ljLCBgJHt0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllcn0udGFyZ2V0YCkpIHtcbiAgICAgIGlmICh0aGlzLmJyYW5jaGluZ0xvZ2ljW3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyXS50YXJnZXQuaW5jbHVkZXMocXVlc3Rpb25JZCkpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmJyYW5jaGluZ0xvZ2ljW3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyXS50YXJnZXRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFsuLi50aGlzLmJyYW5jaGluZ0xvZ2ljW3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyXS50YXJnZXQsIGAke3F1ZXN0aW9uSWR9YF07XG4gICAgfVxuICAgIHJldHVybiBbYCR7cXVlc3Rpb25JZH1gXTtcbiAgfVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuZWRpdG9yU2VydmljZS5vcHRpb25zTGVuZ3RoKSB7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcbiAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuZWRpdG9yU2VydmljZS5vcHRpb25zTGVuZ3RoIH0sICh4LCBpKSA9PiB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5wdXNoKHsgdmFsdWU6IGksIGxhYmVsOiBpIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGFyZW50UXVlc3Rpb25PcHRpb25zKHF1ZXN0aW9uSWQpIHtcbiAgICB0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllciA9IHF1ZXN0aW9uSWQ7XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UucmVhZFF1ZXN0aW9uKHF1ZXN0aW9uSWQpXG4gICAgICAuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5yZXNwb25zZUNvZGUgPT09ICdPSycpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXMucmVzdWx0LnF1ZXN0aW9uO1xuICAgICAgICAgIGlmIChyZXN1bHQuaW50ZXJhY3Rpb25UeXBlc1swXSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgICAgICAgIGNvbnN0IG51bWJlck9mT3B0aW9ucyA9IHJlc3VsdC5lZGl0b3JTdGF0ZS5vcHRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5vcHRpb25zTGVuZ3RoID0gbnVtYmVyT2ZPcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVRyZWVDYWNoZShzZWN0aW9uTmFtZSwgYnJhbmNoaW5nTG9naWMsIHNlbGVjdGVkU2VjdGlvbikge1xuICAgIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogc2VjdGlvbk5hbWUsXG4gICAgICBwcmltYXJ5Q2F0ZWdvcnk6IHRoaXMuc2VjdGlvblByaW1hcnlDYXRlZ29yeSxcbiAgICAgIGFsbG93QnJhbmNoaW5nOiAnWWVzJyxcbiAgICAgIGJyYW5jaGluZ0xvZ2ljXG4gICAgfTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLnVwZGF0ZU5vZGUobWV0YWRhdGEsIHNlbGVjdGVkU2VjdGlvbiwgdGhpcy5zZWN0aW9uUHJpbWFyeUNhdGVnb3J5KTtcbiAgfVxuXG4gIHNldENvbmRpdGlvbihkYXRhKSB7XG4gICAgY29uc3QgQ29uZGl0aW9uID0gXy5nZXQoZGF0YT8uYnJhbmNoaW5nTG9naWMsIGAke3RoaXMucXVlc3Rpb25JZH0ucHJlQ29uZGl0aW9uLmFuZFswXWApO1xuICAgIGNvbnN0IGdldENvbmRpdGlvbiA9IE9iamVjdC5rZXlzKENvbmRpdGlvbik7XG4gICAgdGhpcy5jb25kaXRpb24gPSBnZXRDb25kaXRpb25bMF07XG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMgPSBDb25kaXRpb25bZ2V0Q29uZGl0aW9uXVsxXTtcbiAgfVxuXG4gIGdldEJyYW5jaGluZ0xvZ2ljKGNoaWxkcmVuKSB7XG4gICAgXy5mb3JFYWNoKGNoaWxkcmVuLCAoZGF0YSkgPT4ge1xuICAgICAgaWYgKGRhdGEuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFNlY3Rpb25JZCkge1xuICAgICAgICB0aGlzLmJyYW5jaGluZ0xvZ2ljID0gZGF0YT8uYnJhbmNoaW5nTG9naWMgPyBkYXRhPy5icmFuY2hpbmdMb2dpYyA6IHt9O1xuICAgICAgICBpZiAoXy5nZXQoZGF0YT8uYnJhbmNoaW5nTG9naWMsIGAke3RoaXMucXVlc3Rpb25JZH0uc291cmNlWzBdYCkpIHtcbiAgICAgICAgICB0aGlzLmlzQ2hpbGRRdWVzdGlvbiA9IHRydWU7XG4gICAgICAgICAgdGhpcy5nZXRQYXJlbnRRdWVzdGlvbk9wdGlvbnMoZGF0YS5icmFuY2hpbmdMb2dpY1t0aGlzLnF1ZXN0aW9uSWRdLnNvdXJjZVswXSk7XG4gICAgICAgICAgdGhpcy5zZXRDb25kaXRpb24oZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkYXRhPy5jaGlsZHJlbikge1xuICAgICAgICB0aGlzLmdldEJyYW5jaGluZ0xvZ2ljKGRhdGE/LmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uUXVhbGl0eUZvcm1TdWJtaXQoZXZlbnQpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmFjdGlvbikge1xuICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgICAgdGhpcy5zYXZlUXVhbGl0eVBhcmFtZXRlcnMoZXZlbnQuZGF0YSwgdGhpcy5zZW5kUXVlc3Rpb25Gb3JQdWJsaXNoLmJpbmQodGhpcywge30pKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZXF1ZXN0Q2hhbmdlJzpcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q2hhbmdlc1BvcHVwQWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5zYXZlUXVhbGl0eVBhcmFtZXRlcnMoZXZlbnQuZGF0YSwgdGhpcy5vcGVuUmVxdWVzdENoYW5nZXNQb3B1cC5iaW5kKHRoaXMsIHt9KSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5zaG93UXVhbGl0eVBhcmFtZXRlclBvcHVwID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc2F2ZVF1YWxpdHlQYXJhbWV0ZXJzKHF1YWxpdHlQYXJhbWV0ZXJzLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHJlcXVlc3RPYmogPSB7XG4gICAgICBxdWVzdGlvbjoge1xuICAgICAgICByZXZpZXdlclF1YWxpdHlDaGVja3M6IHF1YWxpdHlQYXJhbWV0ZXJzXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGRhdGVRdWVzdGlvbih0aGlzLnF1ZXN0aW9uSWQsIHJlcXVlc3RPYmopLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgdGhpcy5zaG93UXVhbGl0eVBhcmFtZXRlclBvcHVwID0gZmFsc2U7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9wZW5SZXF1ZXN0Q2hhbmdlc1BvcHVwKCkge1xuICAgIHRoaXMucmVxdWVzdENoYW5nZXNQb3B1cEFjdGlvbiA9ICdyZWplY3RRdWVzdGlvbic7XG4gIH1cblxuICBjYWxjdWxhdGVNaW5NYXhTY29yZShtZXRhRGF0YSkge1xuICAgIGNvbnN0IHNjb3JlcyA9IFtdO1xuICAgIGlmICghXy5pc0VtcHR5KG1ldGFEYXRhLnJlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1hcHBpbmcpKSB7XG4gICAgICBtZXRhRGF0YS5yZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5tYXBwaW5nLmZvckVhY2goaXRlbSA9PiBzY29yZXMucHVzaChpdGVtLm91dGNvbWVzLnNjb3JlKSk7XG4gICAgICBtZXRhRGF0YS5yZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5taW5TY29yZSA9IE1hdGgubWluKC4uLnNjb3Jlcyk7XG4gICAgICBpZiAoXy5nZXQobWV0YURhdGEsICdyZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5jYXJkaW5hbGl0eScpID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBtZXRhRGF0YS5yZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5tYXBwaW5nLmZvckVhY2goaXRlbSA9PiBzdW0gKz0gKyhpdGVtLm91dGNvbWVzLnNjb3JlKSk7XG4gICAgICAgIG1ldGFEYXRhLnJlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1heFNjb3JlID0gc3VtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0YURhdGEucmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEubWF4U2NvcmUgPSBNYXRoLm1heCguLi5zY29yZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJzYi1lZGl0b3ItY29udGFpbmVyIG1iLTBcIiAqbmdJZj1cIiFzaG93TG9hZGVyXCI+XG4gIDxsaWItaGVhZGVyIFtsYWJlbENvbmZpZ0RhdGFdPVwidG9vbGJhckNvbmZpZ1wiIFtidXR0b25Mb2FkZXJzXT1cImJ1dHRvbkxvYWRlcnNcIiBbcGFnZUlkXT1cInBhZ2VJZFwiIFtyZXF1ZXN0Q2hhbmdlXSA9IFwicmVxdWVzdENoYW5nZXNQb3B1cEFjdGlvblwiICh0b29sYmFyRW1pdHRlcik9XCJ0b29sYmFyRXZlbnRMaXN0ZW5lcigkZXZlbnQpXCI+XG4gIDwvbGliLWhlYWRlcj5cblxuICA8ZGl2IGNsYXNzPVwic2ItYmctd2hpdGUgcHktMjBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidWkgY29udGFpbmVyIHNiLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInVpIHR3ZWx2ZSBjb2x1bW4gd2lkZSBoLTEwMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMTZcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1ByZXZpZXdcIiBjbGFzcz1cImJyLTIgYi0xLTEwMFwiPlxuICAgICAgICAgICAgPGxpYi1xdW1sLXBsYXllciBbcXVlc3Rpb25TZXRIaWVyYXJjaHldPVwicXVlc3Rpb25TZXRIaWVyYXJjaHlcIiBbaXNTaW5nbGVRdWVzdGlvblByZXZpZXddPVwidHJ1ZVwiID48L2xpYi1xdW1sLXBsYXllcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDthbGlnbi1pdGVtczogZmxleC1lbmQ7anVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIlxuICAgICAgICAgICAgKm5nSWY9XCJzaG93T3B0aW9ucyB8fCBpc0NoaWxkUXVlc3Rpb24gXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uc1wiPlxuICAgICAgICAgICAgICA8c3VpLXNlbGVjdCBbKG5nTW9kZWwpXT1cImNvbmRpdGlvblwiIHZhbHVlRmllbGQ9XCJ2YWx1ZVwiIGNsYXNzPVwic2VsZWN0aW9uIG11bHRpc2VsZWN0XCJcbiAgICAgICAgICAgICAgbGFiZWxGaWVsZD1cImxhYmVsXCIgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgQ29uZGl0aW9uJ1wiICNzZWxlY3QgW2lzRGlzYWJsZWRdPVwiaXNSZWFkT25seU1vZGVcIj5cbiAgICAgICAgICAgICAgICA8c3VpLXNlbGVjdC1vcHRpb24gW3ZhbHVlXT1cIntsYWJlbDonRXF1YWwgdG8nLHZhbHVlOidlcSd9XCI+PC9zdWktc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8c3VpLXNlbGVjdC1vcHRpb24gW3ZhbHVlXT1cIntsYWJlbDonTm90IGVxdWFsJyx2YWx1ZTonbmUnfVwiPjwvc3VpLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvc3VpLXNlbGVjdD5cblxuICAgICAgICAgICAgICA8c3VpLW11bHRpLXNlbGVjdCBjbGFzcz1cInNlbGVjdGlvbiBtdWx0aXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRPcHRpb25zXCIgdmFsdWVGaWVsZD1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICBsYWJlbEZpZWxkPVwibGFiZWxcIiBbaXNTZWFyY2hhYmxlXT1cImZhbHNlXCIgI211bHRpU2VsZWN0IFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IG9wdGlvbnMnXCIgW2lzRGlzYWJsZWRdPVwiaXNSZWFkT25seU1vZGVcIiA+XG4gICAgICAgICAgICAgICAgPHN1aS1zZWxlY3Qtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8L3N1aS1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICA8L3N1aS1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktMjAgcHgtMzIgYnItNCBiLTEtMTAwXCIgKm5nSWY9XCIhc2hvd1ByZXZpZXdcIiBbbmdDbGFzc109XCJ7J3NiLWJnLWNvbG9yLXByaW1hcnktMCc6ICFpc1JlYWRPbmx5TW9kZX1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1maWVsZC1ncm91cFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmcy0wLTkyIGZvbnQtd2VpZ2h0LWJvbGRcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ucXVlc3Rpb259fTxzcGFuIGNsYXNzPVwic2ItcmVxdWlyZWRcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJja2VkaXRvci10b29sX19xdWVzdGlvbiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICA8bGliLWNrZWRpdG9yLXRvb2xcbiAgICAgICAgICAgICAgICAgICAgKGVkaXRvckRhdGFPdXRwdXQpPVwiZWRpdG9yRGF0YUhhbmRsZXIoJGV2ZW50LCAncXVlc3Rpb24nKVwiXG4gICAgICAgICAgICAgICAgICAgIFtlZGl0b3JEYXRhSW5wdXRdPVwiZWRpdG9yU3RhdGUucXVlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAodmlkZW9EYXRhT3V0cHV0KT1cInZpZGVvRGF0YU91dHB1dCgkZXZlbnQpXCIgW3ZpZGVvU2hvd109XCJ2aWRlb1Nob3dcIj48L2xpYi1ja2VkaXRvci10b29sPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybUVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgIFt1bmRlZmluZWQsICcnXS5pbmNsdWRlcyhlZGl0b3JTdGF0ZS5xdWVzdGlvbilcbiAgICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwic2ItY29sb3ItZXJyb3IgZnMtMC03ODVcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ucXVlc3Rpb25SZXF1aXJlZH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGxpYi1hbnN3ZXIgKm5nSWY9XCJxdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2RlZmF1bHQnXCJcbiAgICAgICAgICAgICAgICBbZWRpdG9yU3RhdGVdPVwiZWRpdG9yU3RhdGVcIiBbc2hvd0Zvcm1FcnJvcl09XCJzaG93Rm9ybUVycm9yXCJcbiAgICAgICAgICAgICAgICAoZWRpdG9yRGF0YU91dHB1dCk9XCJlZGl0b3JEYXRhSGFuZGxlcigkZXZlbnQpXCI+PC9saWItYW5zd2VyPlxuXG4gICAgICAgICAgICAgIDxsaWItb3B0aW9ucyAqbmdJZj1cInF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnY2hvaWNlJ1wiXG4gICAgICAgICAgICAgICAgW2VkaXRvclN0YXRlXT1cImVkaXRvclN0YXRlXCIgW3Nob3dGb3JtRXJyb3JdPVwic2hvd0Zvcm1FcnJvclwiXG4gICAgICAgICAgICAgICAgKGVkaXRvckRhdGFPdXRwdXQpPVwiZWRpdG9yRGF0YUhhbmRsZXIoJGV2ZW50KVwiPjwvbGliLW9wdGlvbnM+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWFpLWNlbnRlciBja2VkaXRvci10b29sX19zb2x1dGlvbiBweS0xMCBweC0xNiBtdC0xNSBzYi1iZy1jb2xvci13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZzLTAtOTIgbWItMCBja2VkaXRvci10b29sX19sYWJlbCBwYi00XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiLWNvbG9yLXByaW1hcnkgZnMtMC03ODUgbXItNFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5zb2x1dGlvbn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYi1jb2xvci1ncmF5LTIwMCBmeHNtYWxsIGZvbnQtd2VpZ2h0LW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5vcHRpb25hbH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1aSBkcm9wZG93biBzYi1idG4gc2ItYnRuLW91dGxpbmUtcHJpbWFyeSBzYi1idG4tbm9ybWFsIHNiLXJpZ2h0LWljb24tYnRuIHNiLWJ0bi1yYWRpdXMgbWwtYXV0b1wiXG4gICAgICAgICAgICAgICAgICBzdWlEcm9wZG93biBhdXRvQ2xvc2U9XCJpdGVtQ2xpY2tcIiAqbmdJZj1cInNob3dTb2x1dGlvbkRyb3BEb3duXCIgbGliVGVsZW1ldHJ5SW50ZXJhY3RcbiAgICAgICAgICAgICAgICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgnY2hvb3NlX3R5cGUnLCdjbGljaycsJ3NpbmdsZV9zZWxlY3QnLCB0ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeVBhZ2VJZClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IGdyYXktMjAwXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNob29zZVR5cGV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJkcm9wZG93biBpY29uIG14LThcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudVwiIHN1aURyb3Bkb3duTWVudT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW1cIiAoY2xpY2spPVwic2VsZWN0U29sdXRpb25UeXBlKCdUZXh0K0ltYWdlJylcIiBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgICAgICAgICAgICAgICAgICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgnc29sdXRpb25fdHlwZScsJ3NlbGVjdCcsJ3NpbmdsZV9zZWxlY3QnLCB0ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeVBhZ2VJZCwge3NvbHV0aW9uX3R5cGU6J1RleHQrSW1hZ2UnfSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udGV4dEltYWdlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtXCIgKGNsaWNrKT1cInNlbGVjdFNvbHV0aW9uVHlwZSgndmlkZW8nKVwiIGxpYlRlbGVtZXRyeUludGVyYWN0XG4gICAgICAgICAgICAgICAgICAgICAgW3RlbGVtZXRyeUludGVyYWN0RWRhdGFdPVwidGVsZW1ldHJ5U2VydmljZS5nZXRUZWxlbWV0cnlJbnRlcmFjdEVkYXRhKCdzb2x1dGlvbl90eXBlJywnc2VsZWN0Jywnc2luZ2xlX3NlbGVjdCcsIHRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkLCB7c29sdXRpb25fdHlwZTondmlkZW8nfSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udmlkZW99fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvbHV0aW9uX2h0bWxcIiAqbmdJZj1cInNlbGVjdGVkU29sdXRpb25UeXBlID09ICdodG1sJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJja2VkaXRvci10b29sLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiLWNrZWRpdG9yIHJlbGF0aXZlIG1iLThcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGVsZXRlU29sdXRpb24oKVwiIGNsYXNzPVwic2ItYnRuIHNiLWNrZWRpdG9yLWNsb3NlIGFic29sdXRlXCIgbGliVGVsZW1ldHJ5SW50ZXJhY3RcbiAgICAgICAgICAgICAgICAgICAgICBbdGVsZW1ldHJ5SW50ZXJhY3RFZGF0YV09XCJ0ZWxlbWV0cnlTZXJ2aWNlLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ2RlbGV0ZV9zb2x1dGlvbicsJ2NsaWNrJywnY2FuY2VsJywgdGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQsIHtzb2x1dGlvbl90eXBlOidUZXh0K0ltYWdlJ30pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uIGNsb3NlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1ja2VkaXRvci10b29sIChlZGl0b3JEYXRhT3V0cHV0KT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yRGF0YUhhbmRsZXIoJGV2ZW50LCAnc29sdXRpb24nKVxuICAgICAgICAgICAgICAgICAgICAgIFwiW2VkaXRvckRhdGFJbnB1dF09XCJlZGl0b3JTdGF0ZS5zb2x1dGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2tlZGl0b3ItdG9vbF9fb3B0aW9uXCI+PC9saWItY2tlZGl0b3ItdG9vbD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvbHV0aW9uX3ZpZGVvXCIgKm5nSWY9XCJzZWxlY3RlZFNvbHV0aW9uVHlwZSA9PSAndmlkZW8nICYmIHNob3dTb2x1dGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJja2VkaXRvci10b29sX19zb2x1dGlvbiBzYi1iZy1jb2xvci13aGl0ZSBzYi1ja2VkaXRvciByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvbHV0aW9uLW1lZGlhIHAtMTYgZC1mbGV4IGZsZXgtYWktY2VudGVyIGNrZWRpdG9yLXRvb2xfX29wdGlvbiBwLTE2XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtY3EtY2hlY2tib3gtYW5zd2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNiLWJ0biBzYi1ja2VkaXRvci1jbG9zZSBhYnNvbHV0ZVwiIChjbGljayk9XCJkZWxldGVTb2x1dGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpYlRlbGVtZXRyeUludGVyYWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbdGVsZW1ldHJ5SW50ZXJhY3RFZGF0YV09XCJ0ZWxlbWV0cnlTZXJ2aWNlLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ2RlbGV0ZV9zb2x1dGlvbicsJ2NsaWNrJywnY2FuY2VsJywgdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeVBhZ2VJZCwge3NvbHV0aW9uX3R5cGU6J3ZpZGVvJ30pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb24gY2xvc2VcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29sdXRpb24tbWVkaWFfX3ZpZGVvIHJlbGF0aXZlIHBvc2l0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW1hZ2VcIiBbbmdTdHlsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9UaHVtYm5haWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgYmFja2dyb3VuZDogJ3VybCgnICsgdmlkZW9UaHVtYm5haWwgKyAnKScgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyBiYWNrZ3JvdW5kOiAncmdiYSgwLDAsMCwwLjMpJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGxheSBjaXJjbGUgaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2x1dGlvbi1tZWRpYV9fZGVzYyBtbC0xNiBzYi1jb2xvci1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgdmlkZW9Tb2x1dGlvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGkgY2xhc3M9XCJpY29uIGVsbGlwc2lzIHZlcnRpY2FsIHNiLWNvbG9yLWJsYWNrXCI+PC9pPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIDxsaWItdHJhbnNsYXRpb25zICpuZ0lmPVwic2hvd1RyYW5zbGF0aW9uXCI+PC9saWItdHJhbnNsYXRpb25zPiAtLT5cbiAgICAgICAgICA8IS0tIGNoaWxkIHF1ZXN0aW9uIHNlY3Rpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImItMS0xMDAgYnItNCBteS0xNSBweC0zMiBweS0xMCBzYi1iZy1jb2xvci1wcmltYXJ5LTBcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHF1ZXN0aW9uIG9mIGRlcGVuZGVudFF1ZXN0aW9ucztsZXQgY2hpbGRpbmRleD1pbmRleFwiPlxuICAgICAgICAgICAge3sgcXVlc3Rpb25TZXRIaWVyYXJjaHkuY2hpbGRyZW4gPyAnUScrIChxdWVzdGlvblNldEhpZXJhcmNoeS5jaGlsZHJlbi5sZW5ndGgrMSk6Jyd9fSB7eycuICcrXG4gICAgICAgICAgICAoY2hpbGRpbmRleCsxKX19XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1vdXRsaW5lLXByaW1hcnkgc2ItYnRuLXhzIHNiLWxlZnQtaWNvbi1idG4gdGV4dC1pbmhlcml0IGItMCBiZy1ub25lIG5vLWhvdmVyIHBsLTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYi1saW5lLWhlaWdodC0yNFwiPmVkaXQgcXVlc3Rpb248L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aHI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uRm9ybUNvbmZpZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsLTUgcHktMTAgZm9udC13ZWlnaHQtYm9sZCBmcy0wLTkyXCI+XG4gICAgICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5RdWVzdGlvbmRldGFpbHN9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250YWluZXIgICBweC0zMFwiPlxuICAgICAgICAgICAgICA8c2ItZHluYW1pYy1mb3JtIFtjb25maWddPVwibGVhZkZvcm1Db25maWdcIiAoaW5pdGlhbGl6ZSk9XCJvdXRwdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHN0YXR1c0NoYW5nZXMpPVwib25TdGF0dXNDaGFuZ2VzKCRldmVudClcIiAodmFsdWVDaGFuZ2VzKT1cInZhbHVlQ2hhbmdlcygkZXZlbnQpXCI+PC9zYi1keW5hbWljLWZvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPHN1aS1tb2RhbCAqbmdJZj1cInNob3dDb25maXJtUG9wdXBcIiBbbXVzdFNjcm9sbF09XCJ0cnVlXCIgW2lzQ2xvc2FibGVdPVwidHJ1ZVwiIFt0cmFuc2l0aW9uRHVyYXRpb25dPVwiMFwiIFtzaXplXT1cIidzbWFsbCdcIlxuICBjbGFzcz1cInNiLW1vZGFsIGJ4LW5vbmUgb3ZlcmZsb3ctbW9kYWxcIiBhcHBCb2R5U2Nyb2xsIChkaXNtaXNzZWQpPVwic2hvd0NvbmZpcm1Qb3B1cCA9ICFzaG93Q29uZmlybVBvcHVwXCIgI21vZGFsPlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtaGVhZGVyXCI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1jb250ZW50XCI+XG4gICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNvbmZpcm1RdWVzdGlvbk5vdFNhdmVkfX1cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1hY3Rpb25zXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInNiLWJ0biBzYi1idG4tbm9ybWFsIHNiLWJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInJlZGlyZWN0VG9RdWVzdGlvbnNldCgpXCI+XG4gICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/Lnllc19idG5fbGFiZWx9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzYi1idG4gc2ItYnRuLW5vcm1hbCBzYi1idG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cInNob3dDb25maXJtUG9wdXAgPSAhc2hvd0NvbmZpcm1Qb3B1cFwiPlxuICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5ub19idG5fbGFiZWx9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvc3VpLW1vZGFsPlxuXG48bGliLXRlcm0tYW5kLWNvbmRpdGlvblxuICAgICAgICBbc2hvd0VkaXRpbmdDb25zZW50XT1cImVkaXRvclNlcnZpY2UuaXNSZXZpZXdlckVkaXRFbmFibGVcIlxuICAgICAgICBbc2hvd1N1Ym1pdENvbmZpcm1Qb3B1cF09XCJzaG93U3VibWl0Q29uZmlybVBvcHVwXCIgKHNlbmRGb3JSZXZpZXdPdXRwdXQpPVwib25Db25zZW50U3VibWl0KCRldmVudClcIj5cbjwvbGliLXRlcm0tYW5kLWNvbmRpdGlvbj5cblxuPHN1aS1tb2RhbCAqbmdJZj1cInNob3dSZXZpZXdNb2RhbFwiIFttdXN0U2Nyb2xsXT1cInRydWVcIiBbaXNDbG9zYWJsZV09XCJmYWxzZVwiIFt0cmFuc2l0aW9uRHVyYXRpb25dPVwiMFwiXG4gIFtzaXplXT1cIidub3JtYWwnXCIgY2xhc3M9XCJzYi1tb2RhbCBieC1ub25lIG92ZXJmbG93LW1vZGFsXCIgYXBwQm9keVNjcm9sbCAjbW9kYWwgKGRpc21pc3NlZCk9XCJzaG93UmV2aWV3TW9kYWwgPSBmYWxzZTtcIj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWhlYWRlclwiPlxuICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5yZXZpZXdDb21tZW50c319XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNiLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5jb21tZW50c319PC9sYWJlbD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBkaXNhYmxlZD1cImRpc2FibGVkXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cIndtZC1pbnB1dCB3aWR0aC0xMDAgc2ItZm9ybS1jb250cm9sIHAtMTAgc2ItZGlzYWJsZWQtdGV4dGFyZWFcIiBpZD1cIndtZC1pbnB1dFwiIFsobmdNb2RlbCldPVwiY29udGVudENvbW1lbnRcIiBuYW1lPVwicmVqZWN0ZWRDb21tZW50XCI+PC90ZXh0YXJlYT5cbiAgICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWFjdGlvbnNcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgc2ItYnRuLW91dGxpbmUtcHJpbWFyeVwiIChjbGljayk9XCJtb2RhbC5kZW55KCdkZW5pZWQnKVwiXG4gICAgbGliVGVsZW1ldHJ5SW50ZXJhY3QgW3RlbGVtZXRyeUludGVyYWN0RWRhdGFdPVwidGVsZW1ldHJ5U2VydmljZS5nZXRUZWxlbWV0cnlJbnRlcmFjdEVkYXRhKCdjbG9zZScsJ2NsaWNrJywnY2FuY2VsJywgdGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQsICB7a2V5OiAnZGlhbG9nX2lkJywgdmFsdWU6ICdyZXZpZXdfY29tbWVudHMnfSlcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LmNsb3NlX2J0bl9sYWJlbH19PC9idXR0b24+XG4gIDwvZGl2PlxuPC9zdWktbW9kYWw+XG5cbjxsaWItcXVhbGl0eS1wYXJhbXMtbW9kYWxcbiAgW2xhYmVsQ29uZmlnRGF0YV09XCJ0b29sYmFyQ29uZmlnXCJcbiAgW3Nob3dRdWFsaXR5UGFyYW1ldGVyUG9wdXBdPVwic2hvd1F1YWxpdHlQYXJhbWV0ZXJQb3B1cFwiXG4gIFtxdWFsaXR5Rm9ybUNvbmZpZ109XCJxdWFsaXR5Rm9ybUNvbmZpZ1wiXG4gIChxdWFsaXR5UGFyYW1DaGFuZ2VkKT1cIm9uUXVhbGl0eUZvcm1TdWJtaXQoJGV2ZW50KVwiPlxuPC9saWItcXVhbGl0eS1wYXJhbXMtbW9kYWw+XG4iXX0=
|