@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.
Files changed (204) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/collection-editor-cursor.service.mjs +3 -0
  3. package/esm2022/lib/collection-editor-library.component.mjs +16 -0
  4. package/esm2022/lib/collection-editor-library.module.mjs +137 -0
  5. package/esm2022/lib/components/answer/answer.component.mjs +43 -0
  6. package/esm2022/lib/components/asset-browser/asset-browser.component.mjs +325 -0
  7. package/esm2022/lib/components/asset-browser/asset-browser.data.mjs +53 -0
  8. package/esm2022/lib/components/assign-page-number/assign-page-number.component.mjs +191 -0
  9. package/esm2022/lib/components/ckeditor-tool/ckeditor-tool.component.mjs +895 -0
  10. package/esm2022/lib/components/collection-icon/collection-icon.component.mjs +43 -0
  11. package/esm2022/lib/components/contentplayer-page/contentplayer-page.component.mjs +351 -0
  12. package/esm2022/lib/components/csv-upload/csv-upload.component.mjs +178 -0
  13. package/esm2022/lib/components/dialcode/dialcode.component.mjs +182 -0
  14. package/esm2022/lib/components/editor/editor.component.mjs +1125 -0
  15. package/esm2022/lib/components/fancy-tree/fancy-tree.component.mjs +529 -0
  16. package/esm2022/lib/components/header/header.component.mjs +123 -0
  17. package/esm2022/lib/components/library/library.component.mjs +242 -0
  18. package/esm2022/lib/components/library-filter/library-filter.component.mjs +149 -0
  19. package/esm2022/lib/components/library-list/library-list.component.mjs +92 -0
  20. package/esm2022/lib/components/library-player/library-player.component.mjs +62 -0
  21. package/esm2022/lib/components/manage-collaborator/manage-collaborator.component.mjs +256 -0
  22. package/esm2022/lib/components/meta-form/meta-form.component.mjs +377 -0
  23. package/esm2022/lib/components/options/options.component.mjs +144 -0
  24. package/esm2022/lib/components/plain-tree/plain-tree.component.mjs +125 -0
  25. package/esm2022/lib/components/progress-status/progress-status.component.mjs +46 -0
  26. package/esm2022/lib/components/publish-checklist/publish-checklist.component.mjs +67 -0
  27. package/esm2022/lib/components/quality-params-modal/quality-params-modal.component.mjs +52 -0
  28. package/esm2022/lib/components/question/question.component.mjs +1360 -0
  29. package/esm2022/lib/components/quml-player/quml-player.component.mjs +73 -0
  30. package/esm2022/lib/components/qumlplayer-page/qumlplayer-page.component.mjs +84 -0
  31. package/esm2022/lib/components/resource-reorder/resource-reorder.component.mjs +143 -0
  32. package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +26 -0
  33. package/esm2022/lib/components/template/template.component.mjs +42 -0
  34. package/esm2022/lib/components/term-and-condition/term-and-condition.component.mjs +68 -0
  35. package/esm2022/lib/directives/telemetry-interact/telemetry-interact.directive.mjs +33 -0
  36. package/esm2022/lib/interfaces/McqForm.mjs +29 -0
  37. package/esm2022/lib/interfaces/editor.mjs +2 -0
  38. package/esm2022/lib/interfaces/framework.mjs +2 -0
  39. package/esm2022/lib/interfaces/httpOptions.mjs +2 -0
  40. package/esm2022/lib/interfaces/requestParam.mjs +2 -0
  41. package/esm2022/lib/interfaces/serverResponse.mjs +2 -0
  42. package/esm2022/lib/pipes/sanitize-html.pipe.mjs +20 -0
  43. package/esm2022/lib/services/config/category.config.json +8 -0
  44. package/esm2022/lib/services/config/config.service.mjs +27 -0
  45. package/esm2022/lib/services/config/editor.config.json +31 -0
  46. package/esm2022/lib/services/config/label.config.json +314 -0
  47. package/esm2022/lib/services/config/player.config.json +96 -0
  48. package/esm2022/lib/services/config/url.config.json +69 -0
  49. package/esm2022/lib/services/data/data.service.mjs +192 -0
  50. package/esm2022/lib/services/dialcode/dialcode.service.mjs +309 -0
  51. package/esm2022/lib/services/editor/editor.service.mjs +682 -0
  52. package/esm2022/lib/services/framework/framework.service.mjs +106 -0
  53. package/esm2022/lib/services/helper/helper.service.mjs +160 -0
  54. package/esm2022/lib/services/player/player.service.mjs +99 -0
  55. package/esm2022/lib/services/public-data/public-data.service.mjs +21 -0
  56. package/esm2022/lib/services/question/question.service.mjs +167 -0
  57. package/esm2022/lib/services/telemetry/telemetry.service.mjs +120 -0
  58. package/esm2022/lib/services/toaster/toaster.service.mjs +105 -0
  59. package/esm2022/lib/services/tree/tree.service.mjs +284 -0
  60. package/esm2022/project-sunbird-sunbird-collection-editor.mjs +5 -0
  61. package/esm2022/public-api.mjs +4 -0
  62. package/fesm2022/project-sunbird-sunbird-collection-editor.mjs +10138 -0
  63. package/fesm2022/project-sunbird-sunbird-collection-editor.mjs.map +1 -0
  64. package/index.d.ts +6 -0
  65. package/lib/assets/.gitkeep +0 -0
  66. package/lib/assets/images/MCQ.png +0 -0
  67. package/lib/assets/images/Spin.gif +0 -0
  68. package/lib/assets/images/bulkuploadfile.png +0 -0
  69. package/lib/assets/images/cancel-sign copy.png +0 -0
  70. package/lib/assets/images/cancel-sign.png +0 -0
  71. package/lib/assets/images/emptyResult.svg +1 -0
  72. package/lib/assets/images/icons-rtl.gif +0 -0
  73. package/lib/assets/images/icons.gif +0 -0
  74. package/lib/assets/images/imageicon.svg +16 -0
  75. package/lib/assets/images/imageicon_blue.svg +16 -0
  76. package/lib/assets/images/layoutoneicon.svg +16 -0
  77. package/lib/assets/images/layoutoneicon_blue.svg +16 -0
  78. package/lib/assets/images/layoutthreeicon.svg +18 -0
  79. package/lib/assets/images/layoutthreeicon_blue.svg +18 -0
  80. package/lib/assets/images/layouttwoicon.svg +18 -0
  81. package/lib/assets/images/layouttwoicon_blue.svg +18 -0
  82. package/lib/assets/images/leftalignicon.svg +17 -0
  83. package/lib/assets/images/leftalignicon_blue.svg +17 -0
  84. package/lib/assets/images/loader.gif +0 -0
  85. package/lib/assets/images/loader.svg +1 -0
  86. package/lib/assets/images/loading.gif +0 -0
  87. package/lib/assets/images/middlealignicon.svg +17 -0
  88. package/lib/assets/images/middlealignicon_blue.svg +17 -0
  89. package/lib/assets/images/question_collection.svg +18 -0
  90. package/lib/assets/images/rightalignicon.svg +17 -0
  91. package/lib/assets/images/rightalignicon_blue.svg +17 -0
  92. package/lib/assets/images/vline-rtl.gif +0 -0
  93. package/lib/assets/images/vline.gif +0 -0
  94. package/lib/assets/images/writing.png +0 -0
  95. package/lib/collection-editor-cursor.service.d.ts +5 -0
  96. package/lib/collection-editor-cursor.service.d.ts.map +1 -0
  97. package/lib/collection-editor-library.component.d.ts +9 -0
  98. package/lib/collection-editor-library.component.d.ts.map +1 -0
  99. package/lib/collection-editor-library.module.d.ts +50 -0
  100. package/lib/collection-editor-library.module.d.ts.map +1 -0
  101. package/lib/components/answer/answer.component.d.ts +24 -0
  102. package/lib/components/answer/answer.component.d.ts.map +1 -0
  103. package/lib/components/asset-browser/asset-browser.component.d.ts +81 -0
  104. package/lib/components/asset-browser/asset-browser.component.d.ts.map +1 -0
  105. package/lib/components/asset-browser/asset-browser.data.d.ts +52 -0
  106. package/lib/components/asset-browser/asset-browser.data.d.ts.map +1 -0
  107. package/lib/components/assign-page-number/assign-page-number.component.d.ts +38 -0
  108. package/lib/components/assign-page-number/assign-page-number.component.d.ts.map +1 -0
  109. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts +161 -0
  110. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts.map +1 -0
  111. package/lib/components/collection-icon/collection-icon.component.d.ts +18 -0
  112. package/lib/components/collection-icon/collection-icon.component.d.ts.map +1 -0
  113. package/lib/components/contentplayer-page/contentplayer-page.component.d.ts +54 -0
  114. package/lib/components/contentplayer-page/contentplayer-page.component.d.ts.map +1 -0
  115. package/lib/components/csv-upload/csv-upload.component.d.ts +42 -0
  116. package/lib/components/csv-upload/csv-upload.component.d.ts.map +1 -0
  117. package/lib/components/dialcode/dialcode.component.d.ts +48 -0
  118. package/lib/components/dialcode/dialcode.component.d.ts.map +1 -0
  119. package/lib/components/editor/editor.component.d.ts +146 -0
  120. package/lib/components/editor/editor.component.d.ts.map +1 -0
  121. package/lib/components/fancy-tree/fancy-tree.component.d.ts +77 -0
  122. package/lib/components/fancy-tree/fancy-tree.component.d.ts.map +1 -0
  123. package/lib/components/header/header.component.d.ts +46 -0
  124. package/lib/components/header/header.component.d.ts.map +1 -0
  125. package/lib/components/library/library.component.d.ts +69 -0
  126. package/lib/components/library/library.component.d.ts.map +1 -0
  127. package/lib/components/library-filter/library-filter.component.d.ts +47 -0
  128. package/lib/components/library-filter/library-filter.component.d.ts.map +1 -0
  129. package/lib/components/library-list/library-list.component.d.ts +32 -0
  130. package/lib/components/library-list/library-list.component.d.ts.map +1 -0
  131. package/lib/components/library-player/library-player.component.d.ts +24 -0
  132. package/lib/components/library-player/library-player.component.d.ts.map +1 -0
  133. package/lib/components/manage-collaborator/manage-collaborator.component.d.ts +75 -0
  134. package/lib/components/manage-collaborator/manage-collaborator.component.d.ts.map +1 -0
  135. package/lib/components/meta-form/meta-form.component.d.ts +51 -0
  136. package/lib/components/meta-form/meta-form.component.d.ts.map +1 -0
  137. package/lib/components/options/options.component.d.ts +53 -0
  138. package/lib/components/options/options.component.d.ts.map +1 -0
  139. package/lib/components/plain-tree/plain-tree.component.d.ts +20 -0
  140. package/lib/components/plain-tree/plain-tree.component.d.ts.map +1 -0
  141. package/lib/components/progress-status/progress-status.component.d.ts +25 -0
  142. package/lib/components/progress-status/progress-status.component.d.ts.map +1 -0
  143. package/lib/components/publish-checklist/publish-checklist.component.d.ts +23 -0
  144. package/lib/components/publish-checklist/publish-checklist.component.d.ts.map +1 -0
  145. package/lib/components/quality-params-modal/quality-params-modal.component.d.ts +24 -0
  146. package/lib/components/quality-params-modal/quality-params-modal.component.d.ts.map +1 -0
  147. package/lib/components/question/question.component.d.ts +215 -0
  148. package/lib/components/question/question.component.d.ts.map +1 -0
  149. package/lib/components/quml-player/quml-player.component.d.ts +26 -0
  150. package/lib/components/quml-player/quml-player.component.d.ts.map +1 -0
  151. package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts +31 -0
  152. package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts.map +1 -0
  153. package/lib/components/resource-reorder/resource-reorder.component.d.ts +45 -0
  154. package/lib/components/resource-reorder/resource-reorder.component.d.ts.map +1 -0
  155. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +13 -0
  156. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts.map +1 -0
  157. package/lib/components/template/template.component.d.ts +21 -0
  158. package/lib/components/template/template.component.d.ts.map +1 -0
  159. package/lib/components/term-and-condition/term-and-condition.component.d.ts +26 -0
  160. package/lib/components/term-and-condition/term-and-condition.component.d.ts.map +1 -0
  161. package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts +27 -0
  162. package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts.map +1 -0
  163. package/lib/interfaces/McqForm.d.ts +32 -0
  164. package/lib/interfaces/McqForm.d.ts.map +1 -0
  165. package/lib/interfaces/editor.d.ts +78 -0
  166. package/lib/interfaces/editor.d.ts.map +1 -0
  167. package/lib/interfaces/framework.d.ts +46 -0
  168. package/lib/interfaces/framework.d.ts.map +1 -0
  169. package/lib/interfaces/httpOptions.d.ts +35 -0
  170. package/lib/interfaces/httpOptions.d.ts.map +1 -0
  171. package/lib/interfaces/requestParam.d.ts +24 -0
  172. package/lib/interfaces/requestParam.d.ts.map +1 -0
  173. package/lib/interfaces/serverResponse.d.ts +38 -0
  174. package/lib/interfaces/serverResponse.d.ts.map +1 -0
  175. package/lib/pipes/sanitize-html.pipe.d.ts +11 -0
  176. package/lib/pipes/sanitize-html.pipe.d.ts.map +1 -0
  177. package/lib/services/config/config.service.d.ts +13 -0
  178. package/lib/services/config/config.service.d.ts.map +1 -0
  179. package/lib/services/data/data.service.d.ts +85 -0
  180. package/lib/services/data/data.service.d.ts.map +1 -0
  181. package/lib/services/dialcode/dialcode.service.d.ts +36 -0
  182. package/lib/services/dialcode/dialcode.service.d.ts.map +1 -0
  183. package/lib/services/editor/editor.service.d.ts +150 -0
  184. package/lib/services/editor/editor.service.d.ts.map +1 -0
  185. package/lib/services/framework/framework.service.d.ts +35 -0
  186. package/lib/services/framework/framework.service.d.ts.map +1 -0
  187. package/lib/services/helper/helper.service.d.ts +41 -0
  188. package/lib/services/helper/helper.service.d.ts.map +1 -0
  189. package/lib/services/player/player.service.d.ts +33 -0
  190. package/lib/services/player/player.service.d.ts.map +1 -0
  191. package/lib/services/public-data/public-data.service.d.ts +15 -0
  192. package/lib/services/public-data/public-data.service.d.ts.map +1 -0
  193. package/lib/services/question/question.service.d.ts +30 -0
  194. package/lib/services/question/question.service.d.ts.map +1 -0
  195. package/lib/services/telemetry/telemetry.service.d.ts +45 -0
  196. package/lib/services/telemetry/telemetry.service.d.ts.map +1 -0
  197. package/lib/services/toaster/toaster.service.d.ts +50 -0
  198. package/lib/services/toaster/toaster.service.d.ts.map +1 -0
  199. package/lib/services/tree/tree.service.d.ts +51 -0
  200. package/lib/services/tree/tree.service.d.ts.map +1 -0
  201. package/package.json +32 -0
  202. package/project-sunbird-sunbird-collection-editor.d.ts.map +1 -0
  203. package/public-api.d.ts +4 -0
  204. 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=