@glowgreen/gg-questionnaire-v2 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/glowgreen-gg-questionnaire-v2.umd.js +2102 -0
- package/bundles/glowgreen-gg-questionnaire-v2.umd.js.map +1 -0
- package/bundles/glowgreen-gg-questionnaire-v2.umd.min.js +2 -0
- package/bundles/glowgreen-gg-questionnaire-v2.umd.min.js.map +1 -0
- package/esm2015/glowgreen-gg-questionnaire-v2.js +11 -0
- package/esm2015/lib/enums/condition-relationship.enum.js +11 -0
- package/esm2015/lib/enums/condition-type.enum.js +15 -0
- package/esm2015/lib/enums/input-type.enum.js +20 -0
- package/esm2015/lib/enums/question-type.enum.js +17 -0
- package/esm2015/lib/enums/repeater-question-type.enum.js +11 -0
- package/esm2015/lib/enums/validation-type.enum.js +15 -0
- package/esm2015/lib/gg-questionnaire-v2.module.js +41 -0
- package/esm2015/lib/interfaces/attachment.js +15 -0
- package/esm2015/lib/interfaces/checklist-item.js +15 -0
- package/esm2015/lib/interfaces/condition-group.js +15 -0
- package/esm2015/lib/interfaces/condition.js +17 -0
- package/esm2015/lib/interfaces/question.js +41 -0
- package/esm2015/lib/interfaces/questionnaire-options.js +21 -0
- package/esm2015/lib/interfaces/questionnaire.js +15 -0
- package/esm2015/lib/interfaces/repeater-question.js +27 -0
- package/esm2015/lib/interfaces/section.js +19 -0
- package/esm2015/lib/interfaces/select-option.js +15 -0
- package/esm2015/lib/interfaces/validator.js +15 -0
- package/esm2015/lib/services/filter.service.js +258 -0
- package/esm2015/lib/services/form-constructor.service.js +245 -0
- package/esm2015/lib/services/questionnaire.service.js +644 -0
- package/esm2015/public_api.js +16 -0
- package/esm5/glowgreen-gg-questionnaire-v2.js +11 -0
- package/esm5/lib/enums/condition-relationship.enum.js +11 -0
- package/esm5/lib/enums/condition-type.enum.js +15 -0
- package/esm5/lib/enums/input-type.enum.js +20 -0
- package/esm5/lib/enums/question-type.enum.js +17 -0
- package/esm5/lib/enums/repeater-question-type.enum.js +11 -0
- package/esm5/lib/enums/validation-type.enum.js +15 -0
- package/esm5/lib/gg-questionnaire-v2.module.js +49 -0
- package/esm5/lib/interfaces/attachment.js +15 -0
- package/esm5/lib/interfaces/checklist-item.js +15 -0
- package/esm5/lib/interfaces/condition-group.js +15 -0
- package/esm5/lib/interfaces/condition.js +17 -0
- package/esm5/lib/interfaces/question.js +41 -0
- package/esm5/lib/interfaces/questionnaire-options.js +21 -0
- package/esm5/lib/interfaces/questionnaire.js +15 -0
- package/esm5/lib/interfaces/repeater-question.js +27 -0
- package/esm5/lib/interfaces/section.js +19 -0
- package/esm5/lib/interfaces/select-option.js +15 -0
- package/esm5/lib/interfaces/validator.js +15 -0
- package/esm5/lib/services/filter.service.js +445 -0
- package/esm5/lib/services/form-constructor.service.js +460 -0
- package/esm5/lib/services/questionnaire.service.js +943 -0
- package/esm5/public_api.js +16 -0
- package/fesm2015/glowgreen-gg-questionnaire-v2.js +1194 -0
- package/fesm2015/glowgreen-gg-questionnaire-v2.js.map +1 -0
- package/fesm5/glowgreen-gg-questionnaire-v2.js +1897 -0
- package/fesm5/glowgreen-gg-questionnaire-v2.js.map +1 -0
- package/glowgreen-gg-questionnaire-v2.d.ts +6 -0
- package/glowgreen-gg-questionnaire-v2.metadata.json +1 -0
- package/lib/enums/condition-relationship.enum.d.ts +4 -0
- package/lib/enums/condition-type.enum.d.ts +8 -0
- package/lib/enums/input-type.enum.d.ts +13 -0
- package/lib/enums/question-type.enum.d.ts +10 -0
- package/lib/enums/repeater-question-type.enum.d.ts +4 -0
- package/lib/enums/validation-type.enum.d.ts +8 -0
- package/lib/gg-questionnaire-v2.module.d.ts +5 -0
- package/lib/interfaces/attachment.d.ts +4 -0
- package/lib/interfaces/checklist-item.d.ts +4 -0
- package/lib/interfaces/condition-group.d.ts +6 -0
- package/lib/interfaces/condition.d.ts +6 -0
- package/lib/interfaces/question.d.ts +24 -0
- package/lib/interfaces/questionnaire-options.d.ts +7 -0
- package/lib/interfaces/questionnaire.d.ts +5 -0
- package/lib/interfaces/repeater-question.d.ts +15 -0
- package/lib/interfaces/section.d.ts +8 -0
- package/lib/interfaces/select-option.d.ts +4 -0
- package/lib/interfaces/validator.d.ts +5 -0
- package/lib/services/filter.service.d.ts +62 -0
- package/lib/services/form-constructor.service.d.ts +78 -0
- package/lib/services/questionnaire.service.d.ts +163 -0
- package/package.json +21 -0
- package/public_api.d.ts +17 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview added by tsickle
|
|
3
|
+
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
4
|
+
*/
|
|
5
|
+
import { Injectable } from '@angular/core';
|
|
6
|
+
import { FormBuilder, Validators } from '@angular/forms';
|
|
7
|
+
import { QuestionType } from '../enums/question-type.enum';
|
|
8
|
+
import { FilterService } from './filter.service';
|
|
9
|
+
import { ValidationType } from '../enums/validation-type.enum';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/forms";
|
|
12
|
+
import * as i2 from "./filter.service";
|
|
13
|
+
export class FormConstructorService {
|
|
14
|
+
/**
|
|
15
|
+
* @param {?} fb
|
|
16
|
+
* @param {?} filterService
|
|
17
|
+
*/
|
|
18
|
+
constructor(fb, filterService) {
|
|
19
|
+
this.fb = fb;
|
|
20
|
+
this.filterService = filterService;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Constructs a form group based on the questionnaire data.
|
|
24
|
+
* This form group has been filtered down based on the conditions of the sections and questions.
|
|
25
|
+
* @author Will Poulson
|
|
26
|
+
* @param {?} questionnaire The questionnaire data to build the form group on.
|
|
27
|
+
* @param {?} currentQuestionnaireForm
|
|
28
|
+
* @param {?=} skipFilter
|
|
29
|
+
* @return {?} A filted form group.
|
|
30
|
+
*/
|
|
31
|
+
generateFormsForQuestionnaire(questionnaire, currentQuestionnaireForm, skipFilter) {
|
|
32
|
+
/** @type {?} */
|
|
33
|
+
const sections = skipFilter ?
|
|
34
|
+
questionnaire.sections :
|
|
35
|
+
this.filterService.filterSections(questionnaire.sections, currentQuestionnaireForm);
|
|
36
|
+
/** @type {?} */
|
|
37
|
+
const questionnaireForms = this.generateFormsForSections(sections, currentQuestionnaireForm);
|
|
38
|
+
return { sections: sections, forms: questionnaireForms };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @private
|
|
42
|
+
* @param {?} sections
|
|
43
|
+
* @param {?} currentQuestionnaireForm
|
|
44
|
+
* @return {?}
|
|
45
|
+
*/
|
|
46
|
+
generateFormsForSections(sections, currentQuestionnaireForm) {
|
|
47
|
+
/** @type {?} */
|
|
48
|
+
const questionnaireForms = this.fb.group({});
|
|
49
|
+
for (const section of sections) {
|
|
50
|
+
/** @type {?} */
|
|
51
|
+
const sectionForms = this.generateFormsForSection(section, currentQuestionnaireForm);
|
|
52
|
+
questionnaireForms.addControl(section.name, sectionForms);
|
|
53
|
+
}
|
|
54
|
+
return questionnaireForms;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Constructs a form group based on the section data.
|
|
58
|
+
* This form group has been filtered down based on the conditions of the questions.
|
|
59
|
+
* @author Will Poulson
|
|
60
|
+
* @private
|
|
61
|
+
* @param {?} section The section data to build the form group on.
|
|
62
|
+
* @param {?} currentQuestionnaireForm
|
|
63
|
+
* @return {?} A filtered form group.
|
|
64
|
+
*/
|
|
65
|
+
generateFormsForSection(section, currentQuestionnaireForm) {
|
|
66
|
+
/** @type {?} */
|
|
67
|
+
const sectionForms = this.fb.group({});
|
|
68
|
+
for (const question of section.questions) {
|
|
69
|
+
/** @type {?} */
|
|
70
|
+
const questionControl = this.generateControlForQuestion(question, section, currentQuestionnaireForm);
|
|
71
|
+
sectionForms.addControl(question.name, questionControl);
|
|
72
|
+
}
|
|
73
|
+
return sectionForms;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Constructs an astract form control based on the question data.
|
|
77
|
+
* @author Will Poulson
|
|
78
|
+
* @private
|
|
79
|
+
* @param {?} question The question data to build the abstract control on.
|
|
80
|
+
* @param {?} section
|
|
81
|
+
* @param {?} currentQuestionnaireForm
|
|
82
|
+
* @return {?} An abstract control.
|
|
83
|
+
*/
|
|
84
|
+
generateControlForQuestion(question, section, currentQuestionnaireForm) {
|
|
85
|
+
/** @type {?} */
|
|
86
|
+
const convertedValidators = this.convertValidators(question.validators);
|
|
87
|
+
switch (question.type) {
|
|
88
|
+
case QuestionType.Repeater:
|
|
89
|
+
/** @type {?} */
|
|
90
|
+
const currentArray = currentQuestionnaireForm ? ((/** @type {?} */ (currentQuestionnaireForm.get([section.name, question.name])))) : false;
|
|
91
|
+
/** @type {?} */
|
|
92
|
+
const newArray = currentArray ? currentArray.controls : [];
|
|
93
|
+
return this.fb.array(newArray, convertedValidators);
|
|
94
|
+
case QuestionType.Checklist:
|
|
95
|
+
return this.generateGroupForChecklist(question, convertedValidators);
|
|
96
|
+
default:
|
|
97
|
+
return this.fb.control(null, { validators: convertedValidators, updateOn: 'blur' });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Generates the form group for a checklist question.
|
|
102
|
+
* @author Will Poulson
|
|
103
|
+
* @private
|
|
104
|
+
* @param {?} question The question. Must be of type checklist or else null is returned.
|
|
105
|
+
* @param {?} convertedValidators
|
|
106
|
+
* @return {?} A form group.
|
|
107
|
+
*/
|
|
108
|
+
generateGroupForChecklist(question, convertedValidators) {
|
|
109
|
+
if (question.type !== QuestionType.Checklist || question.checklistItems.length === 0) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
/** @type {?} */
|
|
113
|
+
const checklistForms = this.fb.group({}, convertedValidators);
|
|
114
|
+
for (const checklistItem of question.checklistItems) {
|
|
115
|
+
/** @type {?} */
|
|
116
|
+
const checklistItemControl = this.fb.control(false, { updateOn: 'blur' });
|
|
117
|
+
checklistForms.addControl(checklistItem.name, checklistItemControl);
|
|
118
|
+
}
|
|
119
|
+
return checklistForms;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Generates the form template for a repeater question.
|
|
123
|
+
* @author Will Poulson
|
|
124
|
+
* @param {?} question The question. Must be of type repeater or else null is returned.
|
|
125
|
+
* @return {?} A form group.
|
|
126
|
+
*/
|
|
127
|
+
generateFormsForRepeater(question) {
|
|
128
|
+
if (question.type !== QuestionType.Repeater || question.repeaterQuestions.length === 0) {
|
|
129
|
+
console.log('Question isnt a repeater or has no questions, returning null');
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
/** @type {?} */
|
|
133
|
+
const repeaterForms = this.fb.group({});
|
|
134
|
+
for (const repeaterQuestion of question.repeaterQuestions) {
|
|
135
|
+
/** @type {?} */
|
|
136
|
+
const repeaterQuestionControl = this.generateControlForRepeaterQuestion(repeaterQuestion);
|
|
137
|
+
repeaterForms.addControl(repeaterQuestion.name, repeaterQuestionControl);
|
|
138
|
+
}
|
|
139
|
+
return repeaterForms;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Generates a control for a repeaters question.
|
|
143
|
+
* @author Will Poulson
|
|
144
|
+
* @private
|
|
145
|
+
* @param {?} repeaterQuestion A repeater question.
|
|
146
|
+
* @return {?} An abstract control.
|
|
147
|
+
*/
|
|
148
|
+
generateControlForRepeaterQuestion(repeaterQuestion) {
|
|
149
|
+
/** @type {?} */
|
|
150
|
+
const convertedValidators = this.convertValidators(repeaterQuestion.validators);
|
|
151
|
+
return this.fb.control(null, { validators: convertedValidators, updateOn: 'blur' });
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Converts an array of validators into form validators.
|
|
155
|
+
* @author Will Poulson
|
|
156
|
+
* @private
|
|
157
|
+
* @param {?} validators The uncoverted array of validators.
|
|
158
|
+
* @return {?} A convered array of form validators.
|
|
159
|
+
*/
|
|
160
|
+
convertValidators(validators) {
|
|
161
|
+
if (!validators || validators.length === 0) {
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
/** @type {?} */
|
|
165
|
+
const convertedValidators = [];
|
|
166
|
+
for (const validator of validators) {
|
|
167
|
+
/** @type {?} */
|
|
168
|
+
const convertedValidator = this.convertValidator(validator);
|
|
169
|
+
if (convertedValidator) {
|
|
170
|
+
convertedValidators.push(convertedValidator);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return convertedValidators;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Converts a single validator into a form validator.
|
|
177
|
+
* @author Will Poulson
|
|
178
|
+
* @private
|
|
179
|
+
* @param {?} validator The unconverted validator.
|
|
180
|
+
* @return {?} A converted form validator.
|
|
181
|
+
*/
|
|
182
|
+
convertValidator(validator) {
|
|
183
|
+
switch (validator.type) {
|
|
184
|
+
case ValidationType.Required:
|
|
185
|
+
return Validators.required;
|
|
186
|
+
default:
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Constructs the forms for repeaters from saved state.
|
|
192
|
+
* @param {?} savedState The saved state to load.
|
|
193
|
+
* @param {?} sections The sections already generated by the form constructor.
|
|
194
|
+
* @param {?} currentQuestionnaireForm
|
|
195
|
+
* @return {?}
|
|
196
|
+
*/
|
|
197
|
+
constructRepeaterFromsFromState(savedState, sections, currentQuestionnaireForm) {
|
|
198
|
+
for (const section of sections) {
|
|
199
|
+
for (const question of section.questions) {
|
|
200
|
+
if (question.type !== QuestionType.Repeater) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
/** @type {?} */
|
|
204
|
+
const repeaterArray = savedState[section.name][question.name];
|
|
205
|
+
if (!repeaterArray || repeaterArray.length === 0) {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
/** @type {?} */
|
|
209
|
+
const repeaterFormArray = (/** @type {?} */ (currentQuestionnaireForm.get([section.name, question.name])));
|
|
210
|
+
if (repeaterFormArray.controls.length === repeaterArray.length) {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
for (const repeaterItem of repeaterArray) {
|
|
214
|
+
/** @type {?} */
|
|
215
|
+
const repeaterItemTemplate = this.generateFormsForRepeater(question);
|
|
216
|
+
repeaterFormArray.push(repeaterItemTemplate);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
FormConstructorService.decorators = [
|
|
223
|
+
{ type: Injectable, args: [{
|
|
224
|
+
providedIn: 'root'
|
|
225
|
+
},] }
|
|
226
|
+
];
|
|
227
|
+
/** @nocollapse */
|
|
228
|
+
FormConstructorService.ctorParameters = () => [
|
|
229
|
+
{ type: FormBuilder },
|
|
230
|
+
{ type: FilterService }
|
|
231
|
+
];
|
|
232
|
+
/** @nocollapse */ FormConstructorService.ngInjectableDef = i0.defineInjectable({ factory: function FormConstructorService_Factory() { return new FormConstructorService(i0.inject(i1.FormBuilder), i0.inject(i2.FilterService)); }, token: FormConstructorService, providedIn: "root" });
|
|
233
|
+
if (false) {
|
|
234
|
+
/**
|
|
235
|
+
* @type {?}
|
|
236
|
+
* @private
|
|
237
|
+
*/
|
|
238
|
+
FormConstructorService.prototype.fb;
|
|
239
|
+
/**
|
|
240
|
+
* @type {?}
|
|
241
|
+
* @private
|
|
242
|
+
*/
|
|
243
|
+
FormConstructorService.prototype.filterService;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jb25zdHJ1Y3Rvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdsb3dncmVlbi9nZy1xdWVzdGlvbm5haXJlLXYyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2Zvcm0tY29uc3RydWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUF3RCxVQUFVLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUkxSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWpELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7OztBQVEvRCxNQUFNLE9BQU8sc0JBQXNCOzs7OztJQUVqQyxZQUNVLEVBQWUsRUFDZixhQUE0QjtRQUQ1QixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2Ysa0JBQWEsR0FBYixhQUFhLENBQWU7SUFDbEMsQ0FBQzs7Ozs7Ozs7OztJQVNFLDZCQUE2QixDQUNsQyxhQUE0QixFQUM1Qix3QkFBbUMsRUFDbkMsVUFBb0I7O2NBRWQsUUFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQzNCLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLHdCQUF3QixDQUFDOztjQUMvRSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFFLHdCQUF3QixDQUFDO1FBQzVGLE9BQU8sRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBQyxDQUFDO0lBQ3pELENBQUM7Ozs7Ozs7SUFFTyx3QkFBd0IsQ0FBQyxRQUF3QixFQUFFLHdCQUFtQzs7Y0FDdEYs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VixVQUFVLEVBQUUsTUFBTTthQUNuQjs7OztZQWRRLFdBQVc7WUFLWCxhQUFhOzs7Ozs7OztJQWFsQixvQ0FBdUI7Ozs7O0lBQ3ZCLCtDQUFvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTZWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zZWN0aW9uJztcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9xdWVzdGlvbic7XG5pbXBvcnQgeyBRdWVzdGlvbm5haXJlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9xdWVzdGlvbm5haXJlJztcbmltcG9ydCB7IFF1ZXN0aW9uVHlwZSB9IGZyb20gJy4uL2VudW1zL3F1ZXN0aW9uLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9maWx0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3ZhbGlkYXRvcic7XG5pbXBvcnQgeyBWYWxpZGF0aW9uVHlwZSB9IGZyb20gJy4uL2VudW1zL3ZhbGlkYXRpb24tdHlwZS5lbnVtJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFJlcGVhdGVyUXVlc3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcGVhdGVyLXF1ZXN0aW9uJztcbmltcG9ydCB7IENoZWNrbGlzdEl0ZW0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NoZWNrbGlzdC1pdGVtJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbnN0cnVjdG9yU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBmaWx0ZXJTZXJ2aWNlOiBGaWx0ZXJTZXJ2aWNlXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBmb3JtIGdyb3VwIGJhc2VkIG9uIHRoZSBxdWVzdGlvbm5haXJlIGRhdGEuXG4gICAqIFRoaXMgZm9ybSBncm91cCBoYXMgYmVlbiBmaWx0ZXJlZCBkb3duIGJhc2VkIG9uIHRoZSBjb25kaXRpb25zIG9mIHRoZSBzZWN0aW9ucyBhbmQgcXVlc3Rpb25zLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25uYWlyZSBUaGUgcXVlc3Rpb25uYWlyZSBkYXRhIHRvIGJ1aWxkIHRoZSBmb3JtIGdyb3VwIG9uLlxuICAgKiBAcmV0dXJucyBBIGZpbHRlZCBmb3JtIGdyb3VwLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlRm9ybXNGb3JRdWVzdGlvbm5haXJlKFxuICAgIHF1ZXN0aW9ubmFpcmU6IFF1ZXN0aW9ubmFpcmUsXG4gICAgY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtOiBGb3JtR3JvdXAsXG4gICAgc2tpcEZpbHRlcj86IGJvb2xlYW5cbiAgKToge3NlY3Rpb25zOiBBcnJheTxTZWN0aW9uPjsgZm9ybXM6IEZvcm1Hcm91cH0ge1xuICAgIGNvbnN0IHNlY3Rpb25zID0gc2tpcEZpbHRlciA/XG4gICAgICBxdWVzdGlvbm5haXJlLnNlY3Rpb25zIDpcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJTZWN0aW9ucyhxdWVzdGlvbm5haXJlLnNlY3Rpb25zLCBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0pO1xuICAgIGNvbnN0IHF1ZXN0aW9ubmFpcmVGb3JtcyA9IHRoaXMuZ2VuZXJhdGVGb3Jtc0ZvclNlY3Rpb25zKHNlY3Rpb25zLCBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0pO1xuICAgIHJldHVybiB7c2VjdGlvbnM6IHNlY3Rpb25zLCBmb3JtczogcXVlc3Rpb25uYWlyZUZvcm1zfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVGb3Jtc0ZvclNlY3Rpb25zKHNlY3Rpb25zOiBBcnJheTxTZWN0aW9uPiwgY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtOiBGb3JtR3JvdXApIHtcbiAgICBjb25zdCBxdWVzdGlvbm5haXJlRm9ybXM6IEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgY29uc3Qgc2VjdGlvbkZvcm1zID0gdGhpcy5nZW5lcmF0ZUZvcm1zRm9yU2VjdGlvbihzZWN0aW9uLCBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0pO1xuICAgICAgcXVlc3Rpb25uYWlyZUZvcm1zLmFkZENvbnRyb2woc2VjdGlvbi5uYW1lLCBzZWN0aW9uRm9ybXMpO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25uYWlyZUZvcm1zO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBmb3JtIGdyb3VwIGJhc2VkIG9uIHRoZSBzZWN0aW9uIGRhdGEuXG4gICAqIFRoaXMgZm9ybSBncm91cCBoYXMgYmVlbiBmaWx0ZXJlZCBkb3duIGJhc2VkIG9uIHRoZSBjb25kaXRpb25zIG9mIHRoZSBxdWVzdGlvbnMuXG4gICAqIEBwYXJhbSBzZWN0aW9uIFRoZSBzZWN0aW9uIGRhdGEgdG8gYnVpbGQgdGhlIGZvcm0gZ3JvdXAgb24uXG4gICAqIEByZXR1cm5zIEEgZmlsdGVyZWQgZm9ybSBncm91cC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVGb3Jtc0ZvclNlY3Rpb24oc2VjdGlvbjogU2VjdGlvbiwgY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtOiBGb3JtR3JvdXApOiBGb3JtR3JvdXAge1xuICAgIGNvbnN0IHNlY3Rpb25Gb3JtczogRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBzZWN0aW9uLnF1ZXN0aW9ucykge1xuICAgICAgY29uc3QgcXVlc3Rpb25Db250cm9sID0gdGhpcy5nZW5lcmF0ZUNvbnRyb2xGb3JRdWVzdGlvbihxdWVzdGlvbiwgc2VjdGlvbiwgY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtKTtcbiAgICAgIHNlY3Rpb25Gb3Jtcy5hZGRDb250cm9sKHF1ZXN0aW9uLm5hbWUsIHF1ZXN0aW9uQ29udHJvbCk7XG4gICAgfVxuICAgIHJldHVybiBzZWN0aW9uRm9ybXM7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBhc3RyYWN0IGZvcm0gY29udHJvbCBiYXNlZCBvbiB0aGUgcXVlc3Rpb24gZGF0YS5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIFRoZSBxdWVzdGlvbiBkYXRhIHRvIGJ1aWxkIHRoZSBhYnN0cmFjdCBjb250cm9sIG9uLlxuICAgKiBAcmV0dXJucyBBbiBhYnN0cmFjdCBjb250cm9sLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNvbnRyb2xGb3JRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24sIHNlY3Rpb246IFNlY3Rpb24sIGN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybTogRm9ybUdyb3VwKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRWYWxpZGF0b3JzID0gdGhpcy5jb252ZXJ0VmFsaWRhdG9ycyhxdWVzdGlvbi52YWxpZGF0b3JzKTtcbiAgICBzd2l0Y2ggKHF1ZXN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgUXVlc3Rpb25UeXBlLlJlcGVhdGVyOlxuICAgICAgICBjb25zdCBjdXJyZW50QXJyYXkgPSBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0gPyAoY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmdldChbc2VjdGlvbi5uYW1lLCBxdWVzdGlvbi5uYW1lXSkgYXMgRm9ybUFycmF5KSA6IGZhbHNlO1xuICAgICAgICBjb25zdCBuZXdBcnJheSA9IGN1cnJlbnRBcnJheSA/IGN1cnJlbnRBcnJheS5jb250cm9scyA6IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5mYi5hcnJheShuZXdBcnJheSwgY29udmVydGVkVmFsaWRhdG9ycyk7XG4gICAgICBjYXNlIFF1ZXN0aW9uVHlwZS5DaGVja2xpc3Q6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlR3JvdXBGb3JDaGVja2xpc3QocXVlc3Rpb24sIGNvbnZlcnRlZFZhbGlkYXRvcnMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZmIuY29udHJvbChudWxsLCB7IHZhbGlkYXRvcnM6IGNvbnZlcnRlZFZhbGlkYXRvcnMsIHVwZGF0ZU9uOiAnYmx1cicgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgZm9ybSBncm91cCBmb3IgYSBjaGVja2xpc3QgcXVlc3Rpb24uXG4gICAqIEBwYXJhbSBxdWVzdGlvbiBUaGUgcXVlc3Rpb24uIE11c3QgYmUgb2YgdHlwZSBjaGVja2xpc3Qgb3IgZWxzZSBudWxsIGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBBIGZvcm0gZ3JvdXAuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlR3JvdXBGb3JDaGVja2xpc3QocXVlc3Rpb246IFF1ZXN0aW9uLCBjb252ZXJ0ZWRWYWxpZGF0b3JzKSB7XG4gICAgaWYgKHF1ZXN0aW9uLnR5cGUgIT09IFF1ZXN0aW9uVHlwZS5DaGVja2xpc3QgfHwgcXVlc3Rpb24uY2hlY2tsaXN0SXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjaGVja2xpc3RGb3JtczogRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSwgY29udmVydGVkVmFsaWRhdG9ycyk7XG4gICAgZm9yIChjb25zdCBjaGVja2xpc3RJdGVtIG9mIHF1ZXN0aW9uLmNoZWNrbGlzdEl0ZW1zKSB7XG4gICAgICBjb25zdCBjaGVja2xpc3RJdGVtQ29udHJvbCA9IHRoaXMuZmIuY29udHJvbChmYWxzZSwgeyB1cGRhdGVPbjogJ2JsdXInIH0pO1xuICAgICAgY2hlY2tsaXN0Rm9ybXMuYWRkQ29udHJvbChjaGVja2xpc3RJdGVtLm5hbWUsIGNoZWNrbGlzdEl0ZW1Db250cm9sKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrbGlzdEZvcm1zO1xuICB9XG5cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSBmb3JtIHRlbXBsYXRlIGZvciBhIHJlcGVhdGVyIHF1ZXN0aW9uLlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gVGhlIHF1ZXN0aW9uLiBNdXN0IGJlIG9mIHR5cGUgcmVwZWF0ZXIgb3IgZWxzZSBudWxsIGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBBIGZvcm0gZ3JvdXAuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVGb3Jtc0ZvclJlcGVhdGVyKHF1ZXN0aW9uOiBRdWVzdGlvbik6IEZvcm1Hcm91cCB7XG4gICAgaWYgKHF1ZXN0aW9uLnR5cGUgIT09IFF1ZXN0aW9uVHlwZS5SZXBlYXRlciB8fCBxdWVzdGlvbi5yZXBlYXRlclF1ZXN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdRdWVzdGlvbiBpc250IGEgcmVwZWF0ZXIgb3IgaGFzIG5vIHF1ZXN0aW9ucywgcmV0dXJuaW5nIG51bGwnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcGVhdGVyRm9ybXM6IEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIGZvciAoY29uc3QgcmVwZWF0ZXJRdWVzdGlvbiBvZiBxdWVzdGlvbi5yZXBlYXRlclF1ZXN0aW9ucykge1xuICAgICAgY29uc3QgcmVwZWF0ZXJRdWVzdGlvbkNvbnRyb2wgPSB0aGlzLmdlbmVyYXRlQ29udHJvbEZvclJlcGVhdGVyUXVlc3Rpb24ocmVwZWF0ZXJRdWVzdGlvbik7XG4gICAgICByZXBlYXRlckZvcm1zLmFkZENvbnRyb2wocmVwZWF0ZXJRdWVzdGlvbi5uYW1lLCByZXBlYXRlclF1ZXN0aW9uQ29udHJvbCk7XG4gICAgfVxuICAgIHJldHVybiByZXBlYXRlckZvcm1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIGNvbnRyb2wgZm9yIGEgcmVwZWF0ZXJzIHF1ZXN0aW9uLlxuICAgKiBAcGFyYW0gcmVwZWF0ZXJRdWVzdGlvbiBBIHJlcGVhdGVyIHF1ZXN0aW9uLlxuICAgKiBAcmV0dXJucyBBbiBhYnN0cmFjdCBjb250cm9sLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNvbnRyb2xGb3JSZXBlYXRlclF1ZXN0aW9uKHJlcGVhdGVyUXVlc3Rpb246IFJlcGVhdGVyUXVlc3Rpb24pOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIGNvbnN0IGNvbnZlcnRlZFZhbGlkYXRvcnMgPSB0aGlzLmNvbnZlcnRWYWxpZGF0b3JzKHJlcGVhdGVyUXVlc3Rpb24udmFsaWRhdG9ycyk7XG4gICAgcmV0dXJuIHRoaXMuZmIuY29udHJvbChudWxsLCB7IHZhbGlkYXRvcnM6IGNvbnZlcnRlZFZhbGlkYXRvcnMsIHVwZGF0ZU9uOiAnYmx1cicgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gYXJyYXkgb2YgdmFsaWRhdG9ycyBpbnRvIGZvcm0gdmFsaWRhdG9ycy5cbiAgICogQHBhcmFtIHZhbGlkYXRvcnMgVGhlIHVuY292ZXJ0ZWQgYXJyYXkgb2YgdmFsaWRhdG9ycy5cbiAgICogQHJldHVybnMgQSBjb252ZXJlZCBhcnJheSBvZiBmb3JtIHZhbGlkYXRvcnMuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRWYWxpZGF0b3JzKHZhbGlkYXRvcnM6IEFycmF5PFZhbGlkYXRvcj4pOiBBcnJheTxWYWxpZGF0b3JGbj4ge1xuICAgIGlmICghdmFsaWRhdG9ycyB8fCB2YWxpZGF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBjb252ZXJ0ZWRWYWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiB2YWxpZGF0b3JzKSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZWRWYWxpZGF0b3IgPSB0aGlzLmNvbnZlcnRWYWxpZGF0b3IodmFsaWRhdG9yKTtcbiAgICAgIGlmIChjb252ZXJ0ZWRWYWxpZGF0b3IpIHtcbiAgICAgICAgY29udmVydGVkVmFsaWRhdG9ycy5wdXNoKGNvbnZlcnRlZFZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0ZWRWYWxpZGF0b3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgc2luZ2xlIHZhbGlkYXRvciBpbnRvIGEgZm9ybSB2YWxpZGF0b3IuXG4gICAqIEBwYXJhbSB2YWxpZGF0b3IgVGhlIHVuY29udmVydGVkIHZhbGlkYXRvci5cbiAgICogQHJldHVybnMgQSBjb252ZXJ0ZWQgZm9ybSB2YWxpZGF0b3IuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRWYWxpZGF0b3IodmFsaWRhdG9yOiBWYWxpZGF0b3IpOiBWYWxpZGF0b3JGbiB8IG51bGwge1xuICAgIHN3aXRjaCAodmFsaWRhdG9yLnR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRhdGlvblR5cGUuUmVxdWlyZWQ6XG4gICAgICAgIHJldHVybiBWYWxpZGF0b3JzLnJlcXVpcmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdGhlIGZvcm1zIGZvciByZXBlYXRlcnMgZnJvbSBzYXZlZCBzdGF0ZS5cbiAgICogQHBhcmFtIHNhdmVkU3RhdGUgVGhlIHNhdmVkIHN0YXRlIHRvIGxvYWQuXG4gICAqIEBwYXJhbSBzZWN0aW9ucyBUaGUgc2VjdGlvbnMgYWxyZWFkeSBnZW5lcmF0ZWQgYnkgdGhlIGZvcm0gY29uc3RydWN0b3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0UmVwZWF0ZXJGcm9tc0Zyb21TdGF0ZShzYXZlZFN0YXRlOiBhbnksIHNlY3Rpb25zOiBBcnJheTxTZWN0aW9uPiwgY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtOiBGb3JtR3JvdXApIHtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgcXVlc3Rpb24gb2Ygc2VjdGlvbi5xdWVzdGlvbnMpIHtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLnR5cGUgIT09IFF1ZXN0aW9uVHlwZS5SZXBlYXRlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVwZWF0ZXJBcnJheSA9IHNhdmVkU3RhdGVbc2VjdGlvbi5uYW1lXVtxdWVzdGlvbi5uYW1lXTtcbiAgICAgICAgaWYgKCFyZXBlYXRlckFycmF5IHx8IHJlcGVhdGVyQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXBlYXRlckZvcm1BcnJheSA9IGN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS5nZXQoW3NlY3Rpb24ubmFtZSwgcXVlc3Rpb24ubmFtZV0pIGFzIEZvcm1BcnJheTtcblxuICAgICAgICBpZiAocmVwZWF0ZXJGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09PSByZXBlYXRlckFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZXBlYXRlckl0ZW0gb2YgcmVwZWF0ZXJBcnJheSkge1xuICAgICAgICAgIGNvbnN0IHJlcGVhdGVySXRlbVRlbXBsYXRlID0gdGhpcy5nZW5lcmF0ZUZvcm1zRm9yUmVwZWF0ZXIocXVlc3Rpb24pO1xuICAgICAgICAgIHJlcGVhdGVyRm9ybUFycmF5LnB1c2gocmVwZWF0ZXJJdGVtVGVtcGxhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|