@qbs-origin/origin-form 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/lib/action-step-handler.mjs +163 -0
- package/esm2022/lib/auth-client.service.mjs +69 -0
- package/esm2022/lib/enums/label.keys.mjs +721 -0
- package/esm2022/lib/form-css.helper.mjs +367 -0
- package/esm2022/lib/formly/baseFormlyControlComponent.mjs +52 -0
- package/esm2022/lib/formly/baseFormlyStepComponent.mjs +59 -0
- package/esm2022/lib/formly/custom-section-separator.component.mjs +32 -0
- package/esm2022/lib/formly/form-section-separator.component.mjs +36 -0
- package/esm2022/lib/formly/formly-action.mjs +56 -0
- package/esm2022/lib/formly/formly-checkbox/formly-checkbox.component.mjs +52 -0
- package/esm2022/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.mjs +261 -0
- package/esm2022/lib/formly/formly-download-documents/formly-download-documents.component.mjs +126 -0
- package/esm2022/lib/formly/formly-enrol-card/formly-enrol-card.component.mjs +120 -0
- package/esm2022/lib/formly/formly-field-stepper/formly-field-stepper.component.mjs +762 -0
- package/esm2022/lib/formly/formly-generate-documents/formly-generate-documents.component.mjs +57 -0
- package/esm2022/lib/formly/formly-identification.component.mjs +84 -0
- package/esm2022/lib/formly/formly-open-banking/formly-open-banking.component.mjs +590 -0
- package/esm2022/lib/formly/formly-paragraph/formly-paragraph.component.mjs +35 -0
- package/esm2022/lib/formly/formly-radio/formly-radio-component.mjs +49 -0
- package/esm2022/lib/formly/formly-row-fille.mjs +12 -0
- package/esm2022/lib/formly/formly-scan-id/formly-scan-id.component.mjs +284 -0
- package/esm2022/lib/formly/formly-sign/formly-sign.component.mjs +173 -0
- package/esm2022/lib/formly/formly-upload-documents/formly-upload-documents.component.mjs +198 -0
- package/esm2022/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.mjs +124 -0
- package/esm2022/lib/formly/formly-view-documents/formly-view-documents.component.mjs +245 -0
- package/esm2022/lib/formly/formly-view-offers/formly-view-offers.component.mjs +160 -0
- package/esm2022/lib/model-population.helper.mjs +265 -0
- package/esm2022/lib/models/application-type.model.mjs +12 -0
- package/esm2022/lib/models/application.model.mjs +30 -0
- package/esm2022/lib/models/auth/users.model.mjs +2 -0
- package/esm2022/lib/models/dictionary.model.mjs +20 -0
- package/esm2022/lib/models/flux.model.mjs +105 -0
- package/esm2022/lib/models/forms.model.mjs +572 -0
- package/esm2022/lib/models/label-info.model.mjs +2 -0
- package/esm2022/lib/models/label.model.mjs +2 -0
- package/esm2022/lib/models/language.model.mjs +3 -0
- package/esm2022/lib/models/list.model.mjs +2 -0
- package/esm2022/lib/models/partner.model.mjs +3 -0
- package/esm2022/lib/models/treeview.model.mjs +15 -0
- package/esm2022/lib/origin-form-auth.service.mjs +40 -0
- package/esm2022/lib/origin-form-config.model.mjs +2 -0
- package/esm2022/lib/origin-form-token.interceptor.mjs +35 -0
- package/esm2022/lib/origin-form.component.mjs +2391 -0
- package/esm2022/lib/origin-form.module.mjs +479 -0
- package/esm2022/lib/origin-form.service.mjs +14 -0
- package/esm2022/lib/others/check-list.database.mjs +55 -0
- package/esm2022/lib/others/config-service.mjs +42 -0
- package/esm2022/lib/others/dictionary-label-info.mjs +3 -0
- package/esm2022/lib/others/environment-type.mjs +21 -0
- package/esm2022/lib/others/external-link.directive.mjs +49 -0
- package/esm2022/lib/others/flux-helper.mjs +1397 -0
- package/esm2022/lib/others/picker.component.mjs +119 -0
- package/esm2022/lib/others/translation.pipe.mjs +21 -0
- package/esm2022/lib/others/translations-helper.mjs +258 -0
- package/esm2022/lib/others/utils.mjs +272 -0
- package/esm2022/lib/services/applicationData.service.mjs +145 -0
- package/esm2022/lib/services/auth-http.service.mjs +80 -0
- package/esm2022/lib/services/dialog.service.mjs +56 -0
- package/esm2022/lib/services/dictionary.service.mjs +198 -0
- package/esm2022/lib/services/forms.service.mjs +47 -0
- package/esm2022/lib/services/labels.service.mjs +29 -0
- package/esm2022/lib/services/language.service.mjs +24 -0
- package/esm2022/lib/services/open-banking.service.mjs +194 -0
- package/esm2022/lib/services/origin-form-signalr-handler.service.mjs +107 -0
- package/esm2022/lib/services/origin-form-signalr.service.mjs +105 -0
- package/esm2022/lib/services/otp.service.mjs +28 -0
- package/esm2022/lib/services/proxy.service.mjs +79 -0
- package/esm2022/lib/services/scroll-to-error.service.mjs +369 -0
- package/esm2022/lib/services/translation.service.mjs +27 -0
- package/esm2022/lib/shared-components/confirmation.component.mjs +34 -0
- package/esm2022/lib/shared-components/dictionaries-tree.component.mjs +301 -0
- package/esm2022/lib/shared-components/grid.component.mjs +241 -0
- package/esm2022/lib/shared-components/treeview/treeview.component.mjs +224 -0
- package/esm2022/lib/theme-css.mjs +2254 -0
- package/esm2022/lib/theme-injector.service.mjs +26 -0
- package/esm2022/public-api.mjs +4 -0
- package/esm2022/qbs-origin-origin-form.mjs +5 -0
- package/fesm2022/qbs-origin-origin-form.mjs +15215 -0
- package/fesm2022/qbs-origin-origin-form.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/action-step-handler.d.ts +49 -0
- package/lib/auth-client.service.d.ts +17 -0
- package/lib/enums/label.keys.d.ts +720 -0
- package/lib/form-css.helper.d.ts +28 -0
- package/lib/formly/baseFormlyControlComponent.d.ts +25 -0
- package/lib/formly/baseFormlyStepComponent.d.ts +29 -0
- package/lib/formly/custom-section-separator.component.d.ts +6 -0
- package/lib/formly/form-section-separator.component.d.ts +10 -0
- package/lib/formly/formly-action.d.ts +13 -0
- package/lib/formly/formly-checkbox/formly-checkbox.component.d.ts +15 -0
- package/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.d.ts +45 -0
- package/lib/formly/formly-download-documents/formly-download-documents.component.d.ts +22 -0
- package/lib/formly/formly-enrol-card/formly-enrol-card.component.d.ts +114 -0
- package/lib/formly/formly-field-stepper/formly-field-stepper.component.d.ts +79 -0
- package/lib/formly/formly-generate-documents/formly-generate-documents.component.d.ts +17 -0
- package/lib/formly/formly-identification.component.d.ts +19 -0
- package/lib/formly/formly-open-banking/formly-open-banking.component.d.ts +119 -0
- package/lib/formly/formly-paragraph/formly-paragraph.component.d.ts +10 -0
- package/lib/formly/formly-radio/formly-radio-component.d.ts +15 -0
- package/lib/formly/formly-row-fille.d.ts +6 -0
- package/lib/formly/formly-scan-id/formly-scan-id.component.d.ts +41 -0
- package/lib/formly/formly-sign/formly-sign.component.d.ts +36 -0
- package/lib/formly/formly-upload-documents/formly-upload-documents.component.d.ts +25 -0
- package/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.d.ts +79 -0
- package/lib/formly/formly-view-documents/formly-view-documents.component.d.ts +33 -0
- package/lib/formly/formly-view-offers/formly-view-offers.component.d.ts +23 -0
- package/lib/model-population.helper.d.ts +8 -0
- package/lib/models/application-type.model.d.ts +27 -0
- package/lib/models/application.model.d.ts +107 -0
- package/lib/models/auth/users.model.d.ts +20 -0
- package/lib/models/dictionary.model.d.ts +77 -0
- package/lib/models/flux.model.d.ts +101 -0
- package/lib/models/forms.model.d.ts +504 -0
- package/lib/models/label-info.model.d.ts +10 -0
- package/lib/models/label.model.d.ts +4 -0
- package/lib/models/language.model.d.ts +5 -0
- package/lib/models/list.model.d.ts +8 -0
- package/lib/models/partner.model.d.ts +12 -0
- package/lib/models/treeview.model.d.ts +17 -0
- package/lib/origin-form-auth.service.d.ts +15 -0
- package/lib/origin-form-config.model.d.ts +12 -0
- package/lib/origin-form-token.interceptor.d.ts +12 -0
- package/lib/origin-form.component.d.ts +231 -0
- package/lib/origin-form.module.d.ts +84 -0
- package/lib/origin-form.service.d.ts +6 -0
- package/lib/others/check-list.database.d.ts +16 -0
- package/lib/others/config-service.d.ts +22 -0
- package/lib/others/dictionary-label-info.d.ts +6 -0
- package/lib/others/environment-type.d.ts +8 -0
- package/lib/others/external-link.directive.d.ts +12 -0
- package/lib/others/flux-helper.d.ts +115 -0
- package/lib/others/picker.component.d.ts +36 -0
- package/lib/others/translation.pipe.d.ts +10 -0
- package/lib/others/translations-helper.d.ts +31 -0
- package/lib/others/utils.d.ts +37 -0
- package/lib/services/applicationData.service.d.ts +35 -0
- package/lib/services/auth-http.service.d.ts +21 -0
- package/lib/services/dialog.service.d.ts +20 -0
- package/lib/services/dictionary.service.d.ts +89 -0
- package/lib/services/forms.service.d.ts +17 -0
- package/lib/services/labels.service.d.ts +13 -0
- package/lib/services/language.service.d.ts +14 -0
- package/lib/services/open-banking.service.d.ts +137 -0
- package/lib/services/origin-form-signalr-handler.service.d.ts +29 -0
- package/lib/services/origin-form-signalr.service.d.ts +24 -0
- package/lib/services/otp.service.d.ts +22 -0
- package/lib/services/proxy.service.d.ts +29 -0
- package/lib/services/scroll-to-error.service.d.ts +54 -0
- package/lib/services/translation.service.d.ts +10 -0
- package/lib/shared-components/confirmation.component.d.ts +77 -0
- package/lib/shared-components/dictionaries-tree.component.d.ts +51 -0
- package/lib/shared-components/grid.component.d.ts +138 -0
- package/lib/shared-components/treeview/treeview.component.d.ts +121 -0
- package/lib/theme-css.d.ts +2 -0
- package/lib/theme-injector.service.d.ts +8 -0
- package/package.json +42 -0
- package/public-api.d.ts +3 -0
- package/schematics-compiled/collection.json +10 -0
- package/schematics-compiled/ng-add/index.d.ts +2 -0
- package/schematics-compiled/ng-add/index.js +67 -0
- package/schematics-compiled/ng-add/index.js.map +1 -0
- package/schematics-compiled/ng-add/schema.json +8 -0
- package/src/lib/assets/fonts/Figtree-Bold.ttf +0 -0
- package/src/lib/assets/fonts/Figtree-Light.ttf +0 -0
- package/src/lib/assets/fonts/Figtree-Regular.ttf +0 -0
- package/src/lib/assets/fonts/Sora-ExtraBold.ttf +0 -0
- package/src/lib/assets/fonts/Sora-Light.ttf +0 -0
- package/src/lib/assets/fonts/Sora-Regular.ttf +0 -0
- package/src/lib/assets/fonts/ttrounds-bold-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-bold-webfont.woff2 +0 -0
- package/src/lib/assets/fonts/ttrounds-regular-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-regular-webfont.woff2 +0 -0
- package/src/lib/assets/fonts/ttrounds-thin-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-thin-webfont.woff2 +0 -0
- package/src/lib/assets/images/flag/icon-flag-de.svg +10 -0
- package/src/lib/assets/images/flag/icon-flag-en.svg +1 -0
- package/src/lib/assets/images/flag/icon-flag-es.svg +11 -0
- package/src/lib/assets/images/flag/icon-flag-fr.svg +1 -0
- package/src/lib/assets/images/flag/icon-flag-ro.svg +11 -0
- package/src/lib/assets/images/flag/origin-form/new-id-card.png +0 -0
- package/src/lib/assets/images/flag/origin-form/old-id-card.png +0 -0
|
@@ -0,0 +1,1397 @@
|
|
|
1
|
+
import { FluxType, StepControlType, ManualInputControlType, SectionType, DimensionType, } from '../models/forms.model';
|
|
2
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
3
|
+
import { Injectable } from '@angular/core';
|
|
4
|
+
import { LabelKeys } from '../enums/label.keys';
|
|
5
|
+
import { TranslationsHelper } from './translations-helper';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "./translation.pipe";
|
|
8
|
+
export class FluxHelper {
|
|
9
|
+
constructor(translate) {
|
|
10
|
+
this.translate = translate;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate unique V1-compatible identifier
|
|
14
|
+
*/
|
|
15
|
+
generateUniqueId(prefix) {
|
|
16
|
+
// Match FluxV1 pattern: prefix_UUID
|
|
17
|
+
const uuid = uuidv4();
|
|
18
|
+
return prefix ? uuid : uuid;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create translations only for supported languages
|
|
22
|
+
*/
|
|
23
|
+
createTranslationsIfSupported(supportedLanguages, values) {
|
|
24
|
+
let list = [];
|
|
25
|
+
values.forEach((v) => {
|
|
26
|
+
const langId = supportedLanguages.find((lang) => lang.iso === v.iso)?.id;
|
|
27
|
+
if (langId && langId > 0) {
|
|
28
|
+
list.push({
|
|
29
|
+
languageId: langId,
|
|
30
|
+
languageIso: v.iso,
|
|
31
|
+
value: v.value,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return list;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a manual input control
|
|
39
|
+
*/
|
|
40
|
+
createManualInputControl(name, identifier, type, isMandatory = true, dimension = 50) {
|
|
41
|
+
return {
|
|
42
|
+
identifier,
|
|
43
|
+
type: StepControlType.ManualInput,
|
|
44
|
+
title: name,
|
|
45
|
+
canEdit: false,
|
|
46
|
+
canDepend: false,
|
|
47
|
+
isOnlyForConfig: false,
|
|
48
|
+
isPresentationControl: false,
|
|
49
|
+
dependentDictionary: {
|
|
50
|
+
isDictionaryDependent: false,
|
|
51
|
+
dictionaryControlIdentifier: '',
|
|
52
|
+
dependentValueIds: [],
|
|
53
|
+
},
|
|
54
|
+
isMandatory: false,
|
|
55
|
+
translations: [],
|
|
56
|
+
dimension,
|
|
57
|
+
dimensionType: DimensionType.Percentage,
|
|
58
|
+
autoDimension: false,
|
|
59
|
+
specificControlData: {
|
|
60
|
+
type,
|
|
61
|
+
isMandatory,
|
|
62
|
+
allowedCharacters: '',
|
|
63
|
+
maxCharacters: type === ManualInputControlType.Text ? 50 : undefined,
|
|
64
|
+
minValue: type === ManualInputControlType.Numeric ? 0 : undefined,
|
|
65
|
+
maxValue: type === ManualInputControlType.Numeric ? 9999999 : undefined,
|
|
66
|
+
allowOnlyFuture: false,
|
|
67
|
+
allowOnlyPast: false,
|
|
68
|
+
isSimpleValidation: false,
|
|
69
|
+
isApiValidation: false,
|
|
70
|
+
},
|
|
71
|
+
errorsTranslations: [],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create a paragraph control
|
|
76
|
+
*/
|
|
77
|
+
createParagraphControl(text, identifier, showValidations = false, isMandatory = false) {
|
|
78
|
+
return {
|
|
79
|
+
identifier,
|
|
80
|
+
type: StepControlType.Paragraph,
|
|
81
|
+
title: text,
|
|
82
|
+
canEdit: false,
|
|
83
|
+
canDepend: false,
|
|
84
|
+
isMandatory: false,
|
|
85
|
+
isPresentationControl: false,
|
|
86
|
+
dependentDictionary: {
|
|
87
|
+
isDictionaryDependent: false,
|
|
88
|
+
dictionaryControlIdentifier: '',
|
|
89
|
+
dependentValueIds: [],
|
|
90
|
+
},
|
|
91
|
+
translations: [],
|
|
92
|
+
isOnlyForConfig: false,
|
|
93
|
+
dimension: 100,
|
|
94
|
+
dimensionType: DimensionType.Percentage,
|
|
95
|
+
autoDimension: true,
|
|
96
|
+
specificControlData: {
|
|
97
|
+
descriptionTranslations: [],
|
|
98
|
+
showValidations,
|
|
99
|
+
isMandatory,
|
|
100
|
+
isMandatoryTranslations: [],
|
|
101
|
+
},
|
|
102
|
+
errorsTranslations: [],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Create a new row control
|
|
107
|
+
*/
|
|
108
|
+
createNewRowControl() {
|
|
109
|
+
return {
|
|
110
|
+
identifier: this.generateUniqueId('newrow'),
|
|
111
|
+
type: StepControlType.NewRow,
|
|
112
|
+
title: 'New Row',
|
|
113
|
+
canEdit: false,
|
|
114
|
+
canDepend: false,
|
|
115
|
+
isOnlyForConfig: false,
|
|
116
|
+
isPresentationControl: false,
|
|
117
|
+
dependentDictionary: {
|
|
118
|
+
isDictionaryDependent: false,
|
|
119
|
+
dictionaryControlIdentifier: '',
|
|
120
|
+
dependentValueIds: [],
|
|
121
|
+
},
|
|
122
|
+
isMandatory: false,
|
|
123
|
+
translations: [],
|
|
124
|
+
dimension: 100,
|
|
125
|
+
dimensionType: DimensionType.Percentage,
|
|
126
|
+
autoDimension: true,
|
|
127
|
+
specificControlData: {},
|
|
128
|
+
errorsTranslations: [],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Create KYC step with all default sections
|
|
133
|
+
*/
|
|
134
|
+
createKycStep(supportedLanguages) {
|
|
135
|
+
const stepName = this.translate.transform(LabelKeys.flux.identification);
|
|
136
|
+
const step = {
|
|
137
|
+
identifier: this.generateUniqueId(`${stepName} - KYC`),
|
|
138
|
+
name: stepName,
|
|
139
|
+
type: FluxType.Kyc,
|
|
140
|
+
sections: [],
|
|
141
|
+
isVisible: true,
|
|
142
|
+
config: {},
|
|
143
|
+
translations: TranslationsHelper.createKycTranslations(supportedLanguages),
|
|
144
|
+
panelOpenState: true,
|
|
145
|
+
buttons: [],
|
|
146
|
+
dependentDictionary: {
|
|
147
|
+
isDictionaryDependent: false,
|
|
148
|
+
dictionaryControlIdentifier: '',
|
|
149
|
+
dependentValueIds: [],
|
|
150
|
+
},
|
|
151
|
+
errorsTranslations: [],
|
|
152
|
+
hasNameAndDescription: true,
|
|
153
|
+
canDepend: true,
|
|
154
|
+
collapsed: false,
|
|
155
|
+
};
|
|
156
|
+
// Section 1: KYC Status
|
|
157
|
+
const statusSection = {
|
|
158
|
+
title: this.translate.transform(LabelKeys.flux.stepInfo.kycStatusTitle),
|
|
159
|
+
type: SectionType.Presentation,
|
|
160
|
+
controls: [
|
|
161
|
+
{
|
|
162
|
+
type: StepControlType.CheckBox,
|
|
163
|
+
identifier: 'IdentityValidationStatus',
|
|
164
|
+
title: this.translate.transform(LabelKeys.flux.stepInfo.validationStatus),
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
identifier: this.generateUniqueId(this.translate.transform(LabelKeys.flux.stepInfo.kycStatusTitle)),
|
|
168
|
+
};
|
|
169
|
+
// Section 2: Personal Information
|
|
170
|
+
const personData = [
|
|
171
|
+
'CNP',
|
|
172
|
+
'IDSeries',
|
|
173
|
+
'IDNumber',
|
|
174
|
+
'FirstName',
|
|
175
|
+
'LastName',
|
|
176
|
+
'Nationality',
|
|
177
|
+
'IDExpirationDate',
|
|
178
|
+
'IDValidity',
|
|
179
|
+
'Address',
|
|
180
|
+
'PlaceOfBirth',
|
|
181
|
+
'DateOfBirth',
|
|
182
|
+
];
|
|
183
|
+
const personControls = personData.map((item) => {
|
|
184
|
+
return {
|
|
185
|
+
type: StepControlType.ManualInput,
|
|
186
|
+
identifier: uuidv4(),
|
|
187
|
+
title: item,
|
|
188
|
+
specificControlData: {
|
|
189
|
+
type: ManualInputControlType.Text,
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
});
|
|
193
|
+
const personalSection = {
|
|
194
|
+
title: this.translate.transform(LabelKeys.flux.stepInfo.kycPersonTitle),
|
|
195
|
+
type: SectionType.Presentation,
|
|
196
|
+
controls: personControls,
|
|
197
|
+
identifier: this.generateUniqueId(this.translate.transform(LabelKeys.flux.stepInfo.kycPersonTitle)),
|
|
198
|
+
};
|
|
199
|
+
// Section 3: Validation Data
|
|
200
|
+
const validationSection = {
|
|
201
|
+
identifier: this.generateUniqueId(this.translate.transform(LabelKeys.flux.stepInfo.kycValidationTitle)),
|
|
202
|
+
title: this.translate.transform(LabelKeys.flux.stepInfo.kycValidationTitle),
|
|
203
|
+
controls: [
|
|
204
|
+
{
|
|
205
|
+
canEdit: true,
|
|
206
|
+
canDepend: false,
|
|
207
|
+
isOnlyForConfig: false,
|
|
208
|
+
type: StepControlType.ManualInput,
|
|
209
|
+
identifier: 'ClientPhoneNumber',
|
|
210
|
+
title: 'ClientPhoneNumber',
|
|
211
|
+
specificControlData: {
|
|
212
|
+
type: ManualInputControlType.Phone,
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
canEdit: true,
|
|
217
|
+
canDepend: false,
|
|
218
|
+
isOnlyForConfig: false,
|
|
219
|
+
type: StepControlType.ManualInput,
|
|
220
|
+
identifier: 'IdSnapshot',
|
|
221
|
+
title: 'IdSnapshot',
|
|
222
|
+
specificControlData: {
|
|
223
|
+
type: ManualInputControlType.Text,
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
canEdit: true,
|
|
228
|
+
canDepend: false,
|
|
229
|
+
isOnlyForConfig: false,
|
|
230
|
+
type: StepControlType.ManualInput,
|
|
231
|
+
identifier: 'FaceSnapshot',
|
|
232
|
+
title: 'FaceSnapshot',
|
|
233
|
+
specificControlData: {
|
|
234
|
+
type: ManualInputControlType.Text,
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
],
|
|
238
|
+
canDepend: true,
|
|
239
|
+
};
|
|
240
|
+
// Section 4: Address Information
|
|
241
|
+
const addressData = [
|
|
242
|
+
'DistrictName',
|
|
243
|
+
'CityName',
|
|
244
|
+
'StreetName',
|
|
245
|
+
'StreetNo',
|
|
246
|
+
'FlatNo',
|
|
247
|
+
'StairNo',
|
|
248
|
+
'FloorNo',
|
|
249
|
+
'ApartmentNo',
|
|
250
|
+
];
|
|
251
|
+
const addressControls = addressData.map((item) => {
|
|
252
|
+
return {
|
|
253
|
+
type: StepControlType.ManualInput,
|
|
254
|
+
identifier: uuidv4(),
|
|
255
|
+
title: item,
|
|
256
|
+
specificControlData: {
|
|
257
|
+
type: ManualInputControlType.Text,
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
});
|
|
261
|
+
const addressSection = {
|
|
262
|
+
identifier: this.generateUniqueId(this.translate.transform(LabelKeys.flux.stepInfo.kycAddressTitle)),
|
|
263
|
+
title: this.translate.transform(LabelKeys.flux.stepInfo.kycAddressTitle),
|
|
264
|
+
type: SectionType.Presentation,
|
|
265
|
+
controls: addressControls,
|
|
266
|
+
canDepend: true,
|
|
267
|
+
};
|
|
268
|
+
step.sections = [
|
|
269
|
+
statusSection,
|
|
270
|
+
personalSection,
|
|
271
|
+
validationSection,
|
|
272
|
+
addressSection,
|
|
273
|
+
];
|
|
274
|
+
return step;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Create Email Verification step
|
|
278
|
+
*/
|
|
279
|
+
createCheckEmailStep(supportedLanguages) {
|
|
280
|
+
const step = {
|
|
281
|
+
identifier: this.generateUniqueId('step'),
|
|
282
|
+
name: this.translate.transform(LabelKeys.flux.verifyEmail),
|
|
283
|
+
type: FluxType.Email,
|
|
284
|
+
sections: [],
|
|
285
|
+
isVisible: true,
|
|
286
|
+
config: {
|
|
287
|
+
collected: false,
|
|
288
|
+
componentCollected: '',
|
|
289
|
+
},
|
|
290
|
+
translations: TranslationsHelper.createCheckEmailTranslations(supportedLanguages),
|
|
291
|
+
panelOpenState: true,
|
|
292
|
+
buttons: [],
|
|
293
|
+
dependentDictionary: {
|
|
294
|
+
isDictionaryDependent: false,
|
|
295
|
+
dictionaryControlIdentifier: '',
|
|
296
|
+
dependentValueIds: [],
|
|
297
|
+
},
|
|
298
|
+
errorsTranslations: [],
|
|
299
|
+
hasNameAndDescription: true,
|
|
300
|
+
canDepend: true,
|
|
301
|
+
collapsed: false,
|
|
302
|
+
};
|
|
303
|
+
// Add email verification section
|
|
304
|
+
const section = {
|
|
305
|
+
identifier: `Sistem - Email_${this.generateUniqueId('sec')}`,
|
|
306
|
+
title: 'Sistem - Email',
|
|
307
|
+
type: SectionType.Presentation,
|
|
308
|
+
controls: [
|
|
309
|
+
{
|
|
310
|
+
canEdit: true,
|
|
311
|
+
canDepend: false,
|
|
312
|
+
isOnlyForConfig: false,
|
|
313
|
+
type: StepControlType.ManualInput,
|
|
314
|
+
identifier: 'validated-email',
|
|
315
|
+
title: 'Email Valid',
|
|
316
|
+
specificControlData: {
|
|
317
|
+
type: ManualInputControlType.Email,
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
],
|
|
321
|
+
canDepend: true,
|
|
322
|
+
};
|
|
323
|
+
step.sections = [section];
|
|
324
|
+
return step;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Create Phone Verification step
|
|
328
|
+
*/
|
|
329
|
+
createCheckPhoneStep(supportedLanguages) {
|
|
330
|
+
const step = {
|
|
331
|
+
identifier: this.generateUniqueId('step'),
|
|
332
|
+
name: this.translate.transform(LabelKeys.flux.verifyPhone),
|
|
333
|
+
type: FluxType.Phone,
|
|
334
|
+
sections: [],
|
|
335
|
+
isVisible: true,
|
|
336
|
+
config: {
|
|
337
|
+
collected: false,
|
|
338
|
+
componentCollected: '',
|
|
339
|
+
},
|
|
340
|
+
translations: TranslationsHelper.createCheckPhoneTranslations(supportedLanguages),
|
|
341
|
+
panelOpenState: true,
|
|
342
|
+
buttons: [],
|
|
343
|
+
dependentDictionary: {
|
|
344
|
+
isDictionaryDependent: false,
|
|
345
|
+
dictionaryControlIdentifier: '',
|
|
346
|
+
dependentValueIds: [],
|
|
347
|
+
},
|
|
348
|
+
errorsTranslations: [],
|
|
349
|
+
hasNameAndDescription: true,
|
|
350
|
+
canDepend: true,
|
|
351
|
+
collapsed: false,
|
|
352
|
+
};
|
|
353
|
+
// Add phone verification section
|
|
354
|
+
const section = {
|
|
355
|
+
identifier: `Sistem - Tel_${this.generateUniqueId('sec')}`,
|
|
356
|
+
title: 'Sistem - Tel',
|
|
357
|
+
type: SectionType.Presentation,
|
|
358
|
+
controls: [
|
|
359
|
+
{
|
|
360
|
+
canEdit: true,
|
|
361
|
+
canDepend: false,
|
|
362
|
+
isOnlyForConfig: false,
|
|
363
|
+
type: StepControlType.ManualInput,
|
|
364
|
+
identifier: 'validated-phone',
|
|
365
|
+
title: 'Nr tel Valid',
|
|
366
|
+
specificControlData: {
|
|
367
|
+
type: ManualInputControlType.Phone,
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
],
|
|
371
|
+
canDepend: true,
|
|
372
|
+
};
|
|
373
|
+
step.sections = [section];
|
|
374
|
+
return step;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Create ID Scan step
|
|
378
|
+
*/
|
|
379
|
+
createScanStep(supportedLanguages) {
|
|
380
|
+
const step = {
|
|
381
|
+
identifier: this.generateUniqueId('step'),
|
|
382
|
+
name: this.translate.transform(LabelKeys.flux.idScan),
|
|
383
|
+
type: FluxType.IdScan,
|
|
384
|
+
sections: [],
|
|
385
|
+
isVisible: true,
|
|
386
|
+
config: {
|
|
387
|
+
showUploadFileButton: true,
|
|
388
|
+
showTakePictureButton: true,
|
|
389
|
+
fileMaxSize: 5000,
|
|
390
|
+
fileFormats: '*.jpg,*.png',
|
|
391
|
+
},
|
|
392
|
+
translations: TranslationsHelper.createIdScanTranslations(supportedLanguages),
|
|
393
|
+
panelOpenState: true,
|
|
394
|
+
buttons: [],
|
|
395
|
+
dependentDictionary: {
|
|
396
|
+
isDictionaryDependent: false,
|
|
397
|
+
dictionaryControlIdentifier: '',
|
|
398
|
+
dependentValueIds: [],
|
|
399
|
+
},
|
|
400
|
+
errorsTranslations: [
|
|
401
|
+
{
|
|
402
|
+
code: 'invalidStatus',
|
|
403
|
+
translations: this.createTranslationsIfSupported(supportedLanguages, [
|
|
404
|
+
{ iso: 'en', value: 'Invalid status response' },
|
|
405
|
+
{ iso: 'ro', value: 'Raspuns status invalid' },
|
|
406
|
+
]),
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
code: 'invalidType',
|
|
410
|
+
translations: this.createTranslationsIfSupported(supportedLanguages, [
|
|
411
|
+
{ iso: 'en', value: 'Invalid type. Allowed formats are {formats}' },
|
|
412
|
+
{ iso: 'ro', value: 'Tip invalid. Formatul permis este {formats}' },
|
|
413
|
+
]),
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
code: 'maxSize',
|
|
417
|
+
translations: this.createTranslationsIfSupported(supportedLanguages, [
|
|
418
|
+
{
|
|
419
|
+
iso: 'en',
|
|
420
|
+
value: 'The selected file is too big. Max allowed size is {size}',
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
iso: 'ro',
|
|
424
|
+
value: 'Fișierul selectat este prea mare. Dimensiunea maximă este {size}',
|
|
425
|
+
},
|
|
426
|
+
]),
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
code: 'frontId',
|
|
430
|
+
translations: this.createTranslationsIfSupported(supportedLanguages, [
|
|
431
|
+
{
|
|
432
|
+
iso: 'en',
|
|
433
|
+
value: 'Please upload the front photo of your ID card.',
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
iso: 'ro',
|
|
437
|
+
value: 'Vă rugăm să urcați partea din față a documentului de identitate.',
|
|
438
|
+
},
|
|
439
|
+
]),
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
code: 'backId',
|
|
443
|
+
translations: this.createTranslationsIfSupported(supportedLanguages, [
|
|
444
|
+
{
|
|
445
|
+
iso: 'en',
|
|
446
|
+
value: 'Please upload the back photo of your ID card.',
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
iso: 'ro',
|
|
450
|
+
value: 'Vă rugăm să urcați partea din spate a documentului de identitate.',
|
|
451
|
+
},
|
|
452
|
+
]),
|
|
453
|
+
},
|
|
454
|
+
],
|
|
455
|
+
hasNameAndDescription: true,
|
|
456
|
+
canDepend: true,
|
|
457
|
+
collapsed: false,
|
|
458
|
+
};
|
|
459
|
+
// Match V1 ID Scan sections exactly
|
|
460
|
+
// Status section
|
|
461
|
+
const statusSection = {
|
|
462
|
+
identifier: this.generateUniqueId('ID SCAN Status'),
|
|
463
|
+
title: 'ID SCAN Status',
|
|
464
|
+
type: SectionType.Presentation,
|
|
465
|
+
controls: [
|
|
466
|
+
{
|
|
467
|
+
type: StepControlType.CheckBox,
|
|
468
|
+
identifier: this.generateUniqueId('ID SCAN Validation Status'),
|
|
469
|
+
title: 'ID SCAN Validation Status',
|
|
470
|
+
},
|
|
471
|
+
],
|
|
472
|
+
};
|
|
473
|
+
// Person data section
|
|
474
|
+
const personData = [
|
|
475
|
+
'CNP',
|
|
476
|
+
'IDSeries',
|
|
477
|
+
'IDNumber',
|
|
478
|
+
'FirstName',
|
|
479
|
+
'LastName',
|
|
480
|
+
'Nationality',
|
|
481
|
+
'IDExpirationDate',
|
|
482
|
+
'IDValidity',
|
|
483
|
+
'Address',
|
|
484
|
+
'PlaceOfBirth',
|
|
485
|
+
];
|
|
486
|
+
const personControls = personData.map((item) => {
|
|
487
|
+
return {
|
|
488
|
+
type: StepControlType.ManualInput,
|
|
489
|
+
identifier: this.generateUniqueId(item),
|
|
490
|
+
title: item,
|
|
491
|
+
specificControlData: {
|
|
492
|
+
type: ManualInputControlType.Text,
|
|
493
|
+
},
|
|
494
|
+
};
|
|
495
|
+
});
|
|
496
|
+
const personSection = {
|
|
497
|
+
identifier: this.generateUniqueId('ID SCAN Persoana'),
|
|
498
|
+
title: 'ID SCAN Persoana',
|
|
499
|
+
type: SectionType.Presentation,
|
|
500
|
+
controls: personControls,
|
|
501
|
+
};
|
|
502
|
+
step.sections = [statusSection, personSection];
|
|
503
|
+
return step;
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Create Sign step
|
|
507
|
+
*/
|
|
508
|
+
createSignStep(supportedLanguages) {
|
|
509
|
+
const step = {
|
|
510
|
+
identifier: this.generateUniqueId('step'),
|
|
511
|
+
name: this.translate.transform(LabelKeys.flux.sign),
|
|
512
|
+
type: FluxType.Sign,
|
|
513
|
+
sections: [],
|
|
514
|
+
isVisible: true,
|
|
515
|
+
config: {
|
|
516
|
+
signatureType: 'Electronic',
|
|
517
|
+
showConfirm: true,
|
|
518
|
+
companySign: false,
|
|
519
|
+
firstNameCollected: '',
|
|
520
|
+
lastNameCollected: '',
|
|
521
|
+
documents: [],
|
|
522
|
+
docsToSign: [],
|
|
523
|
+
},
|
|
524
|
+
translations: TranslationsHelper.createSignTranslations(supportedLanguages),
|
|
525
|
+
panelOpenState: true,
|
|
526
|
+
buttons: [],
|
|
527
|
+
dependentDictionary: {
|
|
528
|
+
isDictionaryDependent: false,
|
|
529
|
+
dictionaryControlIdentifier: '',
|
|
530
|
+
dependentValueIds: [],
|
|
531
|
+
},
|
|
532
|
+
errorsTranslations: [],
|
|
533
|
+
hasNameAndDescription: true,
|
|
534
|
+
canDepend: true,
|
|
535
|
+
collapsed: false,
|
|
536
|
+
};
|
|
537
|
+
// Add sign section
|
|
538
|
+
const section = {
|
|
539
|
+
identifier: this.generateUniqueId('sec'),
|
|
540
|
+
title: 'Document Signing',
|
|
541
|
+
type: SectionType.Presentation,
|
|
542
|
+
controls: [
|
|
543
|
+
this.createParagraphControl('Please sign the following documents', 'sign-instruction', false, false),
|
|
544
|
+
{
|
|
545
|
+
identifier: this.generateUniqueId('comp'),
|
|
546
|
+
type: StepControlType.ViewDocuments,
|
|
547
|
+
title: 'Documents to Sign',
|
|
548
|
+
canEdit: false,
|
|
549
|
+
canDepend: false,
|
|
550
|
+
isOnlyForConfig: false,
|
|
551
|
+
dimension: 100,
|
|
552
|
+
dimensionType: DimensionType.Percentage,
|
|
553
|
+
autoDimension: true,
|
|
554
|
+
isPresentationControl: false,
|
|
555
|
+
specificControlData: {
|
|
556
|
+
documents: [],
|
|
557
|
+
},
|
|
558
|
+
errorsTranslations: [],
|
|
559
|
+
dependentDictionary: {
|
|
560
|
+
isDictionaryDependent: false,
|
|
561
|
+
dictionaryControlIdentifier: '',
|
|
562
|
+
dependentValueIds: [],
|
|
563
|
+
},
|
|
564
|
+
isMandatory: false,
|
|
565
|
+
translations: [],
|
|
566
|
+
},
|
|
567
|
+
],
|
|
568
|
+
presentationControls: [],
|
|
569
|
+
isNavigationSection: false,
|
|
570
|
+
canDepend: false,
|
|
571
|
+
translations: [],
|
|
572
|
+
collapsed: false,
|
|
573
|
+
showSectionTitle: true,
|
|
574
|
+
showSectionSeparator: true,
|
|
575
|
+
};
|
|
576
|
+
step.sections = [section];
|
|
577
|
+
return step;
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Create Generate Documents step
|
|
581
|
+
*/
|
|
582
|
+
createGenerateDocumentsStep(supportedLanguages) {
|
|
583
|
+
const step = {
|
|
584
|
+
identifier: this.generateUniqueId('step'),
|
|
585
|
+
name: this.translate.transform(LabelKeys.flux.generateDocument),
|
|
586
|
+
type: FluxType.GenerateDocument,
|
|
587
|
+
sections: [],
|
|
588
|
+
isVisible: true,
|
|
589
|
+
config: {
|
|
590
|
+
generatedDocuments: [],
|
|
591
|
+
},
|
|
592
|
+
translations: TranslationsHelper.createGenerateDocumentsTranslations(supportedLanguages),
|
|
593
|
+
panelOpenState: true,
|
|
594
|
+
buttons: [],
|
|
595
|
+
dependentDictionary: {
|
|
596
|
+
isDictionaryDependent: false,
|
|
597
|
+
dictionaryControlIdentifier: '',
|
|
598
|
+
dependentValueIds: [],
|
|
599
|
+
},
|
|
600
|
+
errorsTranslations: [],
|
|
601
|
+
hasNameAndDescription: true,
|
|
602
|
+
canDepend: true,
|
|
603
|
+
collapsed: false,
|
|
604
|
+
};
|
|
605
|
+
// No default sections for generate documents
|
|
606
|
+
return step;
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Create Pause step
|
|
610
|
+
*/
|
|
611
|
+
createPauseStep(supportedLanguages) {
|
|
612
|
+
const stepName = this.translate.transform(LabelKeys.flux.pause);
|
|
613
|
+
const step = {
|
|
614
|
+
identifier: this.generateUniqueId(`${stepName} - Pause`),
|
|
615
|
+
name: stepName,
|
|
616
|
+
type: FluxType.Pause,
|
|
617
|
+
sections: [],
|
|
618
|
+
isVisible: true,
|
|
619
|
+
config: {},
|
|
620
|
+
translations: TranslationsHelper.createPauseTranslations(supportedLanguages),
|
|
621
|
+
panelOpenState: true,
|
|
622
|
+
buttons: [],
|
|
623
|
+
dependentDictionary: {
|
|
624
|
+
isDictionaryDependent: false,
|
|
625
|
+
dictionaryControlIdentifier: '',
|
|
626
|
+
dependentValueIds: [],
|
|
627
|
+
},
|
|
628
|
+
errorsTranslations: [],
|
|
629
|
+
hasNameAndDescription: true,
|
|
630
|
+
canDepend: true,
|
|
631
|
+
collapsed: false,
|
|
632
|
+
};
|
|
633
|
+
// Add pause message section
|
|
634
|
+
const section = {
|
|
635
|
+
identifier: this.generateUniqueId('sec'),
|
|
636
|
+
title: 'Flow Paused',
|
|
637
|
+
type: SectionType.Presentation,
|
|
638
|
+
controls: [
|
|
639
|
+
this.createParagraphControl('The workflow has been paused', 'pause-message', false, false),
|
|
640
|
+
],
|
|
641
|
+
presentationControls: [],
|
|
642
|
+
isNavigationSection: false,
|
|
643
|
+
canDepend: false,
|
|
644
|
+
translations: [],
|
|
645
|
+
collapsed: false,
|
|
646
|
+
showSectionTitle: true,
|
|
647
|
+
showSectionSeparator: true,
|
|
648
|
+
};
|
|
649
|
+
step.sections = [section];
|
|
650
|
+
return step;
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Create Action step
|
|
654
|
+
*/
|
|
655
|
+
createActionStep(supportedLanguages) {
|
|
656
|
+
const step = {
|
|
657
|
+
identifier: this.generateUniqueId('step'),
|
|
658
|
+
name: this.translate.transform(LabelKeys.flux.action),
|
|
659
|
+
type: FluxType.Action,
|
|
660
|
+
sections: [],
|
|
661
|
+
isVisible: true,
|
|
662
|
+
config: {
|
|
663
|
+
apiMethod: '',
|
|
664
|
+
apiPartners: [],
|
|
665
|
+
},
|
|
666
|
+
translations: TranslationsHelper.createActionTranslations(supportedLanguages),
|
|
667
|
+
panelOpenState: true,
|
|
668
|
+
buttons: [],
|
|
669
|
+
dependentDictionary: {
|
|
670
|
+
isDictionaryDependent: false,
|
|
671
|
+
dictionaryControlIdentifier: '',
|
|
672
|
+
dependentValueIds: [],
|
|
673
|
+
},
|
|
674
|
+
errorsTranslations: [],
|
|
675
|
+
hasNameAndDescription: true,
|
|
676
|
+
canDepend: true,
|
|
677
|
+
collapsed: false,
|
|
678
|
+
};
|
|
679
|
+
// No default sections for action step
|
|
680
|
+
return step;
|
|
681
|
+
}
|
|
682
|
+
/**
|
|
683
|
+
* Create Status step with default section
|
|
684
|
+
*/
|
|
685
|
+
createStatusStep(supportedLanguages) {
|
|
686
|
+
const step = {
|
|
687
|
+
identifier: this.generateUniqueId('step'),
|
|
688
|
+
name: this.translate.transform(LabelKeys.flux.status),
|
|
689
|
+
type: FluxType.Status,
|
|
690
|
+
sections: [],
|
|
691
|
+
isVisible: true,
|
|
692
|
+
config: {},
|
|
693
|
+
panelOpenState: true,
|
|
694
|
+
buttons: [],
|
|
695
|
+
translations: TranslationsHelper.createStatusTranslations(supportedLanguages),
|
|
696
|
+
dependentDictionary: {
|
|
697
|
+
isDictionaryDependent: false,
|
|
698
|
+
dictionaryControlIdentifier: '',
|
|
699
|
+
dependentValueIds: [],
|
|
700
|
+
},
|
|
701
|
+
errorsTranslations: [],
|
|
702
|
+
hasNameAndDescription: true,
|
|
703
|
+
canDepend: true,
|
|
704
|
+
collapsed: false,
|
|
705
|
+
};
|
|
706
|
+
// Add status selection section
|
|
707
|
+
const section = {
|
|
708
|
+
canDepend: true,
|
|
709
|
+
title: 'Status Sistem',
|
|
710
|
+
type: SectionType.Presentation,
|
|
711
|
+
controls: [
|
|
712
|
+
{
|
|
713
|
+
canEdit: true,
|
|
714
|
+
canDepend: false,
|
|
715
|
+
isOnlyForConfig: false,
|
|
716
|
+
type: StepControlType.NewRow,
|
|
717
|
+
identifier: 'select-status',
|
|
718
|
+
title: 'Flux',
|
|
719
|
+
specificControlData: {
|
|
720
|
+
type: ManualInputControlType.Text,
|
|
721
|
+
},
|
|
722
|
+
},
|
|
723
|
+
],
|
|
724
|
+
identifier: `Status Sistem_${this.generateUniqueId('sec')}`,
|
|
725
|
+
};
|
|
726
|
+
step.sections = [section];
|
|
727
|
+
return step;
|
|
728
|
+
}
|
|
729
|
+
/**
|
|
730
|
+
* Create Upload Document step
|
|
731
|
+
*/
|
|
732
|
+
createUploadDocumentStep(supportedLanguages) {
|
|
733
|
+
const step = {
|
|
734
|
+
identifier: this.generateUniqueId('step'),
|
|
735
|
+
name: this.translate.transform(LabelKeys.flux.uploadDocument),
|
|
736
|
+
type: FluxType.UploadDocument,
|
|
737
|
+
sections: [],
|
|
738
|
+
isVisible: true,
|
|
739
|
+
config: {},
|
|
740
|
+
panelOpenState: true,
|
|
741
|
+
buttons: [],
|
|
742
|
+
dependentDictionary: {
|
|
743
|
+
isDictionaryDependent: false,
|
|
744
|
+
dictionaryControlIdentifier: '',
|
|
745
|
+
dependentValueIds: [],
|
|
746
|
+
},
|
|
747
|
+
translations: [],
|
|
748
|
+
errorsTranslations: [],
|
|
749
|
+
hasNameAndDescription: true,
|
|
750
|
+
canDepend: true,
|
|
751
|
+
collapsed: false,
|
|
752
|
+
};
|
|
753
|
+
// Add upload section
|
|
754
|
+
const section = {
|
|
755
|
+
identifier: this.generateUniqueId('sec'),
|
|
756
|
+
title: 'Upload Documents',
|
|
757
|
+
type: SectionType.Collect,
|
|
758
|
+
controls: [
|
|
759
|
+
{
|
|
760
|
+
identifier: this.generateUniqueId('comp'),
|
|
761
|
+
type: StepControlType.UploadDocuments,
|
|
762
|
+
title: this.translate.transform(LabelKeys.flux.uploadDocument),
|
|
763
|
+
canEdit: false,
|
|
764
|
+
canDepend: false,
|
|
765
|
+
isOnlyForConfig: false,
|
|
766
|
+
isPresentationControl: false,
|
|
767
|
+
dimension: 100,
|
|
768
|
+
dimensionType: DimensionType.Percentage,
|
|
769
|
+
autoDimension: true,
|
|
770
|
+
specificControlData: {
|
|
771
|
+
documents: [],
|
|
772
|
+
fileMaxSize: 10000,
|
|
773
|
+
fileFormats: '*.pdf,*.jpg,*.png,*.doc,*.docx',
|
|
774
|
+
isMandatory: true,
|
|
775
|
+
},
|
|
776
|
+
errorsTranslations: [],
|
|
777
|
+
dependentDictionary: {
|
|
778
|
+
isDictionaryDependent: false,
|
|
779
|
+
dictionaryControlIdentifier: '',
|
|
780
|
+
dependentValueIds: [],
|
|
781
|
+
},
|
|
782
|
+
isMandatory: false,
|
|
783
|
+
translations: [],
|
|
784
|
+
},
|
|
785
|
+
],
|
|
786
|
+
presentationControls: [],
|
|
787
|
+
isNavigationSection: false,
|
|
788
|
+
canDepend: false,
|
|
789
|
+
translations: [],
|
|
790
|
+
collapsed: false,
|
|
791
|
+
showSectionTitle: true,
|
|
792
|
+
showSectionSeparator: true,
|
|
793
|
+
};
|
|
794
|
+
step.sections = [section];
|
|
795
|
+
return step;
|
|
796
|
+
}
|
|
797
|
+
/**
|
|
798
|
+
* Create Download Document step
|
|
799
|
+
*/
|
|
800
|
+
createDownloadDocumentStep(supportedLanguages) {
|
|
801
|
+
const step = {
|
|
802
|
+
identifier: this.generateUniqueId('step'),
|
|
803
|
+
name: this.translate.transform(LabelKeys.flux.downloadDocument),
|
|
804
|
+
type: FluxType.DownloadDocument,
|
|
805
|
+
sections: [],
|
|
806
|
+
isVisible: true,
|
|
807
|
+
config: {},
|
|
808
|
+
panelOpenState: true,
|
|
809
|
+
buttons: [],
|
|
810
|
+
dependentDictionary: {
|
|
811
|
+
isDictionaryDependent: false,
|
|
812
|
+
dictionaryControlIdentifier: '',
|
|
813
|
+
dependentValueIds: [],
|
|
814
|
+
},
|
|
815
|
+
translations: [],
|
|
816
|
+
errorsTranslations: [],
|
|
817
|
+
hasNameAndDescription: true,
|
|
818
|
+
canDepend: true,
|
|
819
|
+
collapsed: false,
|
|
820
|
+
};
|
|
821
|
+
// Add download section
|
|
822
|
+
const section = {
|
|
823
|
+
identifier: this.generateUniqueId('sec'),
|
|
824
|
+
title: 'Download Documents',
|
|
825
|
+
type: SectionType.Presentation,
|
|
826
|
+
controls: [
|
|
827
|
+
{
|
|
828
|
+
identifier: this.generateUniqueId('comp'),
|
|
829
|
+
type: StepControlType.DownloadDocuments,
|
|
830
|
+
title: this.translate.transform(LabelKeys.flux.downloadDocument),
|
|
831
|
+
canEdit: false,
|
|
832
|
+
canDepend: false,
|
|
833
|
+
isOnlyForConfig: false,
|
|
834
|
+
isPresentationControl: false,
|
|
835
|
+
dimension: 100,
|
|
836
|
+
dimensionType: DimensionType.Percentage,
|
|
837
|
+
autoDimension: true,
|
|
838
|
+
specificControlData: {
|
|
839
|
+
documents: [],
|
|
840
|
+
},
|
|
841
|
+
errorsTranslations: [],
|
|
842
|
+
dependentDictionary: {
|
|
843
|
+
isDictionaryDependent: false,
|
|
844
|
+
dictionaryControlIdentifier: '',
|
|
845
|
+
dependentValueIds: [],
|
|
846
|
+
},
|
|
847
|
+
isMandatory: false,
|
|
848
|
+
translations: [],
|
|
849
|
+
},
|
|
850
|
+
],
|
|
851
|
+
presentationControls: [],
|
|
852
|
+
isNavigationSection: false,
|
|
853
|
+
canDepend: false,
|
|
854
|
+
translations: [],
|
|
855
|
+
collapsed: false,
|
|
856
|
+
showSectionTitle: true,
|
|
857
|
+
showSectionSeparator: true,
|
|
858
|
+
};
|
|
859
|
+
step.sections = [section];
|
|
860
|
+
return step;
|
|
861
|
+
}
|
|
862
|
+
/**
|
|
863
|
+
* Create View Document step
|
|
864
|
+
*/
|
|
865
|
+
createViewDocumentStep(supportedLanguages) {
|
|
866
|
+
const step = {
|
|
867
|
+
identifier: this.generateUniqueId('step'),
|
|
868
|
+
name: this.translate.transform(LabelKeys.flux.viewDocument),
|
|
869
|
+
type: FluxType.ViewDocument,
|
|
870
|
+
sections: [],
|
|
871
|
+
isVisible: true,
|
|
872
|
+
config: {},
|
|
873
|
+
panelOpenState: true,
|
|
874
|
+
buttons: [],
|
|
875
|
+
dependentDictionary: {
|
|
876
|
+
isDictionaryDependent: false,
|
|
877
|
+
dictionaryControlIdentifier: '',
|
|
878
|
+
dependentValueIds: [],
|
|
879
|
+
},
|
|
880
|
+
translations: [],
|
|
881
|
+
errorsTranslations: [],
|
|
882
|
+
hasNameAndDescription: true,
|
|
883
|
+
canDepend: true,
|
|
884
|
+
collapsed: false,
|
|
885
|
+
};
|
|
886
|
+
// Add view section
|
|
887
|
+
const section = {
|
|
888
|
+
identifier: this.generateUniqueId('sec'),
|
|
889
|
+
title: 'View Documents',
|
|
890
|
+
type: SectionType.Presentation,
|
|
891
|
+
controls: [
|
|
892
|
+
{
|
|
893
|
+
identifier: this.generateUniqueId('comp'),
|
|
894
|
+
type: StepControlType.ViewDocuments,
|
|
895
|
+
title: this.translate.transform(LabelKeys.flux.viewDocument),
|
|
896
|
+
canEdit: false,
|
|
897
|
+
canDepend: false,
|
|
898
|
+
isOnlyForConfig: false,
|
|
899
|
+
isPresentationControl: false,
|
|
900
|
+
dimension: 100,
|
|
901
|
+
dimensionType: DimensionType.Percentage,
|
|
902
|
+
autoDimension: true,
|
|
903
|
+
specificControlData: {
|
|
904
|
+
documents: [],
|
|
905
|
+
},
|
|
906
|
+
errorsTranslations: [],
|
|
907
|
+
dependentDictionary: {
|
|
908
|
+
isDictionaryDependent: false,
|
|
909
|
+
dictionaryControlIdentifier: '',
|
|
910
|
+
dependentValueIds: [],
|
|
911
|
+
},
|
|
912
|
+
isMandatory: false,
|
|
913
|
+
translations: [],
|
|
914
|
+
},
|
|
915
|
+
],
|
|
916
|
+
presentationControls: [],
|
|
917
|
+
isNavigationSection: false,
|
|
918
|
+
canDepend: false,
|
|
919
|
+
translations: [],
|
|
920
|
+
collapsed: false,
|
|
921
|
+
showSectionTitle: true,
|
|
922
|
+
showSectionSeparator: true,
|
|
923
|
+
};
|
|
924
|
+
step.sections = [section];
|
|
925
|
+
return step;
|
|
926
|
+
}
|
|
927
|
+
/**
|
|
928
|
+
* Create View Offer step
|
|
929
|
+
*/
|
|
930
|
+
createViewOfferStep(supportedLanguages) {
|
|
931
|
+
const step = {
|
|
932
|
+
identifier: this.generateUniqueId('step'),
|
|
933
|
+
name: this.translate.transform(LabelKeys.flux.viewOffer),
|
|
934
|
+
type: FluxType.ViewOffer,
|
|
935
|
+
sections: [],
|
|
936
|
+
isVisible: true,
|
|
937
|
+
config: {},
|
|
938
|
+
panelOpenState: true,
|
|
939
|
+
buttons: [],
|
|
940
|
+
dependentDictionary: {
|
|
941
|
+
isDictionaryDependent: false,
|
|
942
|
+
dictionaryControlIdentifier: '',
|
|
943
|
+
dependentValueIds: [],
|
|
944
|
+
},
|
|
945
|
+
translations: TranslationsHelper.createViewOfferStepTranslations(supportedLanguages),
|
|
946
|
+
errorsTranslations: [],
|
|
947
|
+
hasNameAndDescription: true,
|
|
948
|
+
canDepend: true,
|
|
949
|
+
collapsed: false,
|
|
950
|
+
};
|
|
951
|
+
// No default sections for view offer
|
|
952
|
+
return step;
|
|
953
|
+
}
|
|
954
|
+
/**
|
|
955
|
+
* Create NETOPIA Payment step
|
|
956
|
+
*/
|
|
957
|
+
createNetopiaStep(supportedLanguages) {
|
|
958
|
+
const stepName = this.translate.transform(LabelKeys.flux.netopia);
|
|
959
|
+
const step = {
|
|
960
|
+
identifier: this.generateUniqueId(`${stepName} - NETOPIA`),
|
|
961
|
+
name: stepName,
|
|
962
|
+
type: FluxType.NETOPIA,
|
|
963
|
+
sections: [],
|
|
964
|
+
isVisible: true,
|
|
965
|
+
config: {},
|
|
966
|
+
panelOpenState: true,
|
|
967
|
+
buttons: [],
|
|
968
|
+
dependentDictionary: {
|
|
969
|
+
isDictionaryDependent: false,
|
|
970
|
+
dictionaryControlIdentifier: '',
|
|
971
|
+
dependentValueIds: [],
|
|
972
|
+
},
|
|
973
|
+
translations: TranslationsHelper.createPaymentsTranslations(supportedLanguages),
|
|
974
|
+
errorsTranslations: [],
|
|
975
|
+
hasNameAndDescription: true,
|
|
976
|
+
canDepend: true,
|
|
977
|
+
collapsed: false,
|
|
978
|
+
};
|
|
979
|
+
const section = {
|
|
980
|
+
identifier: this.generateUniqueId('sec'),
|
|
981
|
+
title: 'Netopia Payment',
|
|
982
|
+
type: SectionType.Presentation,
|
|
983
|
+
controls: [],
|
|
984
|
+
presentationControls: [],
|
|
985
|
+
isNavigationSection: false,
|
|
986
|
+
canDepend: false,
|
|
987
|
+
translations: [],
|
|
988
|
+
collapsed: false,
|
|
989
|
+
showSectionTitle: true,
|
|
990
|
+
showSectionSeparator: true,
|
|
991
|
+
};
|
|
992
|
+
step.sections = [section];
|
|
993
|
+
// No default sections for payment steps
|
|
994
|
+
return step;
|
|
995
|
+
}
|
|
996
|
+
/**
|
|
997
|
+
* Create EUPLATESC Payment step
|
|
998
|
+
*/
|
|
999
|
+
createEuplatescStep(supportedLanguages) {
|
|
1000
|
+
const stepName = this.translate.transform(LabelKeys.flux.euPlatesc);
|
|
1001
|
+
const step = {
|
|
1002
|
+
identifier: this.generateUniqueId(`${stepName} - EUPLATESC`),
|
|
1003
|
+
name: stepName,
|
|
1004
|
+
type: FluxType.EUPLATESC,
|
|
1005
|
+
sections: [],
|
|
1006
|
+
isVisible: true,
|
|
1007
|
+
config: {},
|
|
1008
|
+
translations: TranslationsHelper.createPaymentsTranslations(supportedLanguages),
|
|
1009
|
+
panelOpenState: true,
|
|
1010
|
+
buttons: [],
|
|
1011
|
+
dependentDictionary: {
|
|
1012
|
+
isDictionaryDependent: false,
|
|
1013
|
+
dictionaryControlIdentifier: '',
|
|
1014
|
+
dependentValueIds: [],
|
|
1015
|
+
},
|
|
1016
|
+
errorsTranslations: [],
|
|
1017
|
+
hasNameAndDescription: true,
|
|
1018
|
+
canDepend: true,
|
|
1019
|
+
collapsed: false,
|
|
1020
|
+
};
|
|
1021
|
+
const section = {
|
|
1022
|
+
identifier: this.generateUniqueId('sec'),
|
|
1023
|
+
title: 'EuPlatesc Payment',
|
|
1024
|
+
type: SectionType.Presentation,
|
|
1025
|
+
controls: [],
|
|
1026
|
+
presentationControls: [],
|
|
1027
|
+
isNavigationSection: false,
|
|
1028
|
+
canDepend: false,
|
|
1029
|
+
translations: [],
|
|
1030
|
+
collapsed: false,
|
|
1031
|
+
showSectionTitle: true,
|
|
1032
|
+
showSectionSeparator: true,
|
|
1033
|
+
};
|
|
1034
|
+
step.sections = [section];
|
|
1035
|
+
// No default sections for payment steps
|
|
1036
|
+
return step;
|
|
1037
|
+
}
|
|
1038
|
+
/**
|
|
1039
|
+
* Create Open Banking step with default sections and controls
|
|
1040
|
+
*/
|
|
1041
|
+
createOpenBankingStep(supportedLanguages) {
|
|
1042
|
+
const stepName = this.translate.transform(LabelKeys.flux.openBanking);
|
|
1043
|
+
const step = {
|
|
1044
|
+
identifier: this.generateUniqueId('step'),
|
|
1045
|
+
name: stepName,
|
|
1046
|
+
type: FluxType.OpenBanking,
|
|
1047
|
+
sections: [],
|
|
1048
|
+
isVisible: true,
|
|
1049
|
+
config: {
|
|
1050
|
+
// Field mappings
|
|
1051
|
+
accountNumberCollected: '',
|
|
1052
|
+
accountHolderCollected: '',
|
|
1053
|
+
emailCollected: '',
|
|
1054
|
+
psuIntermediaryId: '',
|
|
1055
|
+
// Bank settings
|
|
1056
|
+
showAllBanks: true,
|
|
1057
|
+
extractBankFromIBAN: false,
|
|
1058
|
+
countryCode: 'RO',
|
|
1059
|
+
// Transaction settings
|
|
1060
|
+
transactionPeriodMonths: 3,
|
|
1061
|
+
periodOfValidity: 90,
|
|
1062
|
+
tcAcceptedByDefault: true,
|
|
1063
|
+
redirectUrl: '',
|
|
1064
|
+
// Messages - will be initialized with translations
|
|
1065
|
+
initialMessageTranslations: this.createTranslationsIfSupported(supportedLanguages, [
|
|
1066
|
+
{
|
|
1067
|
+
iso: 'en',
|
|
1068
|
+
value: 'To continue, we need to verify your bank account information. Click Next to proceed.',
|
|
1069
|
+
},
|
|
1070
|
+
{
|
|
1071
|
+
iso: 'ro',
|
|
1072
|
+
value: 'Pentru a continua, trebuie să verificăm informațiile contului dvs. bancar. Faceți clic pe Următorul pentru a continua.',
|
|
1073
|
+
},
|
|
1074
|
+
]),
|
|
1075
|
+
waitingMessageTranslations: this.createTranslationsIfSupported(supportedLanguages, [
|
|
1076
|
+
{
|
|
1077
|
+
iso: 'en',
|
|
1078
|
+
value: 'Please wait while we retrieve your account information...',
|
|
1079
|
+
},
|
|
1080
|
+
{
|
|
1081
|
+
iso: 'ro',
|
|
1082
|
+
value: 'Vă rugăm să așteptați până când preluăm informațiile contului dvs...',
|
|
1083
|
+
},
|
|
1084
|
+
]),
|
|
1085
|
+
consentErrorMessageTranslations: this.createTranslationsIfSupported(supportedLanguages, [
|
|
1086
|
+
{
|
|
1087
|
+
iso: 'en',
|
|
1088
|
+
value: 'You must provide consent to continue. Please try again.',
|
|
1089
|
+
},
|
|
1090
|
+
{
|
|
1091
|
+
iso: 'ro',
|
|
1092
|
+
value: 'Trebuie să oferiți consimțământul pentru a continua. Vă rugăm să încercați din nou.',
|
|
1093
|
+
},
|
|
1094
|
+
]),
|
|
1095
|
+
completionMessageTranslations: this.createTranslationsIfSupported(supportedLanguages, [
|
|
1096
|
+
{ iso: 'en', value: 'Account information successfully retrieved.' },
|
|
1097
|
+
{
|
|
1098
|
+
iso: 'ro',
|
|
1099
|
+
value: 'Informațiile contului au fost preluate cu succes.',
|
|
1100
|
+
},
|
|
1101
|
+
]),
|
|
1102
|
+
retryButtonLabelTranslations: this.createTranslationsIfSupported(supportedLanguages, [
|
|
1103
|
+
{ iso: 'en', value: 'Retry' },
|
|
1104
|
+
{ iso: 'ro', value: 'Reîncearcă' },
|
|
1105
|
+
]),
|
|
1106
|
+
},
|
|
1107
|
+
translations: TranslationsHelper.createOpenBankingTranslations(supportedLanguages),
|
|
1108
|
+
panelOpenState: true,
|
|
1109
|
+
buttons: [],
|
|
1110
|
+
dependentDictionary: {
|
|
1111
|
+
isDictionaryDependent: false,
|
|
1112
|
+
dictionaryControlIdentifier: '',
|
|
1113
|
+
dependentValueIds: [],
|
|
1114
|
+
},
|
|
1115
|
+
errorsTranslations: [],
|
|
1116
|
+
hasNameAndDescription: true,
|
|
1117
|
+
canDepend: true,
|
|
1118
|
+
collapsed: false,
|
|
1119
|
+
};
|
|
1120
|
+
// Section 1: Consent Status
|
|
1121
|
+
const statusSection = {
|
|
1122
|
+
title: 'Consent Status',
|
|
1123
|
+
type: SectionType.Presentation,
|
|
1124
|
+
controls: [
|
|
1125
|
+
{
|
|
1126
|
+
type: StepControlType.CheckBox,
|
|
1127
|
+
identifier: 'OpenBankingConsentStatus',
|
|
1128
|
+
title: 'Consent Validated',
|
|
1129
|
+
specificControlData: {},
|
|
1130
|
+
},
|
|
1131
|
+
],
|
|
1132
|
+
identifier: this.generateUniqueId('Consent Status'),
|
|
1133
|
+
};
|
|
1134
|
+
// Section 2: Account Information
|
|
1135
|
+
const accountControls = [
|
|
1136
|
+
{
|
|
1137
|
+
type: StepControlType.ManualInput,
|
|
1138
|
+
identifier: 'OpenBankingEmail',
|
|
1139
|
+
title: 'Email',
|
|
1140
|
+
specificControlData: {
|
|
1141
|
+
type: ManualInputControlType.Email,
|
|
1142
|
+
},
|
|
1143
|
+
},
|
|
1144
|
+
{
|
|
1145
|
+
type: StepControlType.ManualInput,
|
|
1146
|
+
identifier: 'OpenBankingAccountNumber',
|
|
1147
|
+
title: 'Account Number',
|
|
1148
|
+
specificControlData: {
|
|
1149
|
+
type: ManualInputControlType.Text,
|
|
1150
|
+
},
|
|
1151
|
+
},
|
|
1152
|
+
{
|
|
1153
|
+
type: StepControlType.ManualInput,
|
|
1154
|
+
identifier: 'OpenBankingAccountHolder',
|
|
1155
|
+
title: 'Account Holder Name',
|
|
1156
|
+
specificControlData: {
|
|
1157
|
+
type: ManualInputControlType.Text,
|
|
1158
|
+
},
|
|
1159
|
+
},
|
|
1160
|
+
{
|
|
1161
|
+
type: StepControlType.ManualInput,
|
|
1162
|
+
identifier: 'OpenBankingBankCode',
|
|
1163
|
+
title: 'Bank Code',
|
|
1164
|
+
specificControlData: {
|
|
1165
|
+
type: ManualInputControlType.Text,
|
|
1166
|
+
},
|
|
1167
|
+
},
|
|
1168
|
+
{
|
|
1169
|
+
type: StepControlType.ManualInput,
|
|
1170
|
+
identifier: 'OpenBankingConsentId',
|
|
1171
|
+
title: 'Consent ID',
|
|
1172
|
+
specificControlData: {
|
|
1173
|
+
type: ManualInputControlType.Text,
|
|
1174
|
+
},
|
|
1175
|
+
},
|
|
1176
|
+
];
|
|
1177
|
+
const accountSection = {
|
|
1178
|
+
title: 'Account Information',
|
|
1179
|
+
type: SectionType.Presentation,
|
|
1180
|
+
controls: accountControls,
|
|
1181
|
+
identifier: this.generateUniqueId('Account Information'),
|
|
1182
|
+
};
|
|
1183
|
+
// Section 3: Accounts Retrieved
|
|
1184
|
+
const accountsDataControls = [
|
|
1185
|
+
{
|
|
1186
|
+
type: StepControlType.ManualInput,
|
|
1187
|
+
identifier: 'OpenBankingAccountsCount',
|
|
1188
|
+
title: 'Number of Accounts',
|
|
1189
|
+
specificControlData: {
|
|
1190
|
+
type: ManualInputControlType.Numeric,
|
|
1191
|
+
},
|
|
1192
|
+
},
|
|
1193
|
+
{
|
|
1194
|
+
type: StepControlType.ManualInput,
|
|
1195
|
+
identifier: 'OpenBankingAccountsData',
|
|
1196
|
+
title: 'Accounts Data (JSON)',
|
|
1197
|
+
specificControlData: {
|
|
1198
|
+
type: ManualInputControlType.TextArea,
|
|
1199
|
+
},
|
|
1200
|
+
},
|
|
1201
|
+
{
|
|
1202
|
+
type: StepControlType.ManualInput,
|
|
1203
|
+
identifier: 'OpenBankingTotalBalance',
|
|
1204
|
+
title: 'Total Balance',
|
|
1205
|
+
specificControlData: {
|
|
1206
|
+
type: ManualInputControlType.Numeric,
|
|
1207
|
+
},
|
|
1208
|
+
},
|
|
1209
|
+
];
|
|
1210
|
+
const accountsDataSection = {
|
|
1211
|
+
title: 'Retrieved Accounts',
|
|
1212
|
+
type: SectionType.Presentation,
|
|
1213
|
+
controls: accountsDataControls,
|
|
1214
|
+
identifier: this.generateUniqueId('Retrieved Accounts'),
|
|
1215
|
+
};
|
|
1216
|
+
// Section 4: Transactions Retrieved
|
|
1217
|
+
const transactionsControls = [
|
|
1218
|
+
{
|
|
1219
|
+
type: StepControlType.ManualInput,
|
|
1220
|
+
identifier: 'OpenBankingTransactionsCount',
|
|
1221
|
+
title: 'Number of Transactions',
|
|
1222
|
+
specificControlData: {
|
|
1223
|
+
type: ManualInputControlType.Numeric,
|
|
1224
|
+
},
|
|
1225
|
+
},
|
|
1226
|
+
{
|
|
1227
|
+
type: StepControlType.ManualInput,
|
|
1228
|
+
identifier: 'OpenBankingTransactionsData',
|
|
1229
|
+
title: 'Transactions Data (JSON)',
|
|
1230
|
+
specificControlData: {
|
|
1231
|
+
type: ManualInputControlType.TextArea,
|
|
1232
|
+
},
|
|
1233
|
+
},
|
|
1234
|
+
{
|
|
1235
|
+
type: StepControlType.ManualInput,
|
|
1236
|
+
identifier: 'OpenBankingTransactionsPeriod',
|
|
1237
|
+
title: 'Period (months)',
|
|
1238
|
+
specificControlData: {
|
|
1239
|
+
type: ManualInputControlType.Numeric,
|
|
1240
|
+
},
|
|
1241
|
+
},
|
|
1242
|
+
];
|
|
1243
|
+
const transactionsSection = {
|
|
1244
|
+
title: 'Retrieved Transactions',
|
|
1245
|
+
type: SectionType.Presentation,
|
|
1246
|
+
controls: transactionsControls,
|
|
1247
|
+
identifier: this.generateUniqueId('Retrieved Transactions'),
|
|
1248
|
+
};
|
|
1249
|
+
// Add all sections to the step
|
|
1250
|
+
step.sections = [
|
|
1251
|
+
statusSection,
|
|
1252
|
+
accountSection,
|
|
1253
|
+
accountsDataSection,
|
|
1254
|
+
transactionsSection,
|
|
1255
|
+
];
|
|
1256
|
+
return step;
|
|
1257
|
+
}
|
|
1258
|
+
/**
|
|
1259
|
+
* Create Custom step with navigation section
|
|
1260
|
+
*/
|
|
1261
|
+
createCustomStep(supportedLanguages) {
|
|
1262
|
+
const step = {
|
|
1263
|
+
identifier: this.generateUniqueId('step'),
|
|
1264
|
+
name: this.translate.transform(LabelKeys.flux.customStep),
|
|
1265
|
+
type: FluxType.Custom,
|
|
1266
|
+
sections: [],
|
|
1267
|
+
isVisible: true,
|
|
1268
|
+
config: {},
|
|
1269
|
+
translations: TranslationsHelper.createCustomStepTranslations(supportedLanguages),
|
|
1270
|
+
panelOpenState: true,
|
|
1271
|
+
buttons: [],
|
|
1272
|
+
dependentDictionary: {
|
|
1273
|
+
isDictionaryDependent: false,
|
|
1274
|
+
dictionaryControlIdentifier: '',
|
|
1275
|
+
dependentValueIds: [],
|
|
1276
|
+
},
|
|
1277
|
+
errorsTranslations: [],
|
|
1278
|
+
hasNameAndDescription: true,
|
|
1279
|
+
canDepend: true,
|
|
1280
|
+
collapsed: false,
|
|
1281
|
+
};
|
|
1282
|
+
// Add navigation section
|
|
1283
|
+
const navigationSection = {
|
|
1284
|
+
canDepend: true,
|
|
1285
|
+
title: 'Secțiune de Navigare',
|
|
1286
|
+
type: SectionType.Presentation,
|
|
1287
|
+
controls: [
|
|
1288
|
+
{
|
|
1289
|
+
canEdit: true,
|
|
1290
|
+
canDepend: false,
|
|
1291
|
+
isOnlyForConfig: false,
|
|
1292
|
+
type: StepControlType.Buttons,
|
|
1293
|
+
},
|
|
1294
|
+
],
|
|
1295
|
+
isNavigationSection: true,
|
|
1296
|
+
identifier: `Secțiune de Navigare_${this.generateUniqueId('sec')}`,
|
|
1297
|
+
};
|
|
1298
|
+
step.sections = [navigationSection];
|
|
1299
|
+
return step;
|
|
1300
|
+
}
|
|
1301
|
+
/**
|
|
1302
|
+
* Create Final step
|
|
1303
|
+
*/
|
|
1304
|
+
createFinalStep(supportedLanguages) {
|
|
1305
|
+
const step = {
|
|
1306
|
+
identifier: this.generateUniqueId('step'),
|
|
1307
|
+
name: this.translate.transform(LabelKeys.flux.finalStep),
|
|
1308
|
+
type: FluxType.Final,
|
|
1309
|
+
sections: [],
|
|
1310
|
+
isVisible: true,
|
|
1311
|
+
config: {},
|
|
1312
|
+
translations: [],
|
|
1313
|
+
panelOpenState: true,
|
|
1314
|
+
buttons: [],
|
|
1315
|
+
dependentDictionary: {
|
|
1316
|
+
isDictionaryDependent: false,
|
|
1317
|
+
dictionaryControlIdentifier: '',
|
|
1318
|
+
dependentValueIds: [],
|
|
1319
|
+
},
|
|
1320
|
+
errorsTranslations: [],
|
|
1321
|
+
hasNameAndDescription: true,
|
|
1322
|
+
canDepend: true,
|
|
1323
|
+
collapsed: false,
|
|
1324
|
+
};
|
|
1325
|
+
// Final step is like custom but without navigation
|
|
1326
|
+
return step;
|
|
1327
|
+
}
|
|
1328
|
+
/**
|
|
1329
|
+
* Main factory method to create any step type
|
|
1330
|
+
*/
|
|
1331
|
+
createFluxStep(type, supportedLanguages) {
|
|
1332
|
+
switch (type) {
|
|
1333
|
+
case FluxType.Kyc:
|
|
1334
|
+
return this.createKycStep(supportedLanguages);
|
|
1335
|
+
case FluxType.Email:
|
|
1336
|
+
return this.createCheckEmailStep(supportedLanguages);
|
|
1337
|
+
case FluxType.Phone:
|
|
1338
|
+
return this.createCheckPhoneStep(supportedLanguages);
|
|
1339
|
+
case FluxType.Sign:
|
|
1340
|
+
return this.createSignStep(supportedLanguages);
|
|
1341
|
+
case FluxType.Status:
|
|
1342
|
+
return this.createStatusStep(supportedLanguages);
|
|
1343
|
+
case FluxType.Custom:
|
|
1344
|
+
return this.createCustomStep(supportedLanguages);
|
|
1345
|
+
case FluxType.Pause:
|
|
1346
|
+
return this.createPauseStep(supportedLanguages);
|
|
1347
|
+
case FluxType.IdScan:
|
|
1348
|
+
return this.createScanStep(supportedLanguages);
|
|
1349
|
+
case FluxType.GenerateDocument:
|
|
1350
|
+
return this.createGenerateDocumentsStep(supportedLanguages);
|
|
1351
|
+
case FluxType.Action:
|
|
1352
|
+
return this.createActionStep(supportedLanguages);
|
|
1353
|
+
case FluxType.UploadDocument:
|
|
1354
|
+
return this.createUploadDocumentStep(supportedLanguages);
|
|
1355
|
+
case FluxType.DownloadDocument:
|
|
1356
|
+
return this.createDownloadDocumentStep(supportedLanguages);
|
|
1357
|
+
case FluxType.ViewDocument:
|
|
1358
|
+
return this.createViewDocumentStep(supportedLanguages);
|
|
1359
|
+
case FluxType.ViewOffer:
|
|
1360
|
+
return this.createViewOfferStep(supportedLanguages);
|
|
1361
|
+
case FluxType.Final:
|
|
1362
|
+
return this.createFinalStep(supportedLanguages);
|
|
1363
|
+
case FluxType.NETOPIA:
|
|
1364
|
+
return this.createNetopiaStep(supportedLanguages);
|
|
1365
|
+
case FluxType.EUPLATESC:
|
|
1366
|
+
return this.createEuplatescStep(supportedLanguages);
|
|
1367
|
+
case FluxType.OpenBanking:
|
|
1368
|
+
return this.createOpenBankingStep(supportedLanguages);
|
|
1369
|
+
default:
|
|
1370
|
+
console.error(`Unsupported FluxType: ${type}`);
|
|
1371
|
+
return null;
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
/**
|
|
1375
|
+
* Get document name by ID from form model
|
|
1376
|
+
* Static method to match FluxHelper usage pattern in forms.model.ts
|
|
1377
|
+
* @param documentId - The document ID to search for
|
|
1378
|
+
* @param formModel - The form model containing documents array
|
|
1379
|
+
* @returns The document name or empty string if not found
|
|
1380
|
+
*/
|
|
1381
|
+
static getDocumentNameById(documentId, formModel) {
|
|
1382
|
+
if (!formModel || !formModel.documents || !documentId) {
|
|
1383
|
+
return '';
|
|
1384
|
+
}
|
|
1385
|
+
const document = formModel.documents.find((d) => d.id === documentId);
|
|
1386
|
+
return document?.name || '';
|
|
1387
|
+
}
|
|
1388
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FluxHelper, deps: [{ token: i1.TranslatePipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1389
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FluxHelper, providedIn: 'root' }); }
|
|
1390
|
+
}
|
|
1391
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FluxHelper, decorators: [{
|
|
1392
|
+
type: Injectable,
|
|
1393
|
+
args: [{
|
|
1394
|
+
providedIn: 'root',
|
|
1395
|
+
}]
|
|
1396
|
+
}], ctorParameters: () => [{ type: i1.TranslatePipe }] });
|
|
1397
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1eC1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL290aGVycy9mbHV4LWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsV0FBVyxFQUVYLGFBQWEsR0FFZCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7QUFLM0QsTUFBTSxPQUFPLFVBQVU7SUFDckIsWUFBb0IsU0FBd0I7UUFBeEIsY0FBUyxHQUFULFNBQVMsQ0FBZTtJQUFHLENBQUM7SUFFaEQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLG9DQUFvQztRQUNwQyxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUN0QixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssNkJBQTZCLENBQ25DLGtCQUE4QixFQUM5QixNQUF3QztRQUV4QyxJQUFJLElBQUksR0FBZ0IsRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNuQixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FB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ZnJvbSAnLi4vbW9kZWxzL2xhbmd1YWdlLm1vZGVsJztcbmltcG9ydCB7IExhYmVsSW5mbyB9IGZyb20gJy4uL21vZGVscy9sYWJlbC1pbmZvLm1vZGVsJztcbmltcG9ydCB7XG4gIEZsdXhUeXBlLFxuICBTdGVwQ29udHJvbFR5cGUsXG4gIE1hbnVhbElucHV0Q29udHJvbFR5cGUsXG4gIFNlY3Rpb25UeXBlLFxuICBBcHBEb2N1bWVudCxcbiAgRGltZW5zaW9uVHlwZSxcbiAgRm9ybU1vZGVsLFxufSBmcm9tICcuLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5waXBlJztcbmltcG9ydCB7IExhYmVsS2V5cyB9IGZyb20gJy4uL2VudW1zL2xhYmVsLmtleXMnO1xuaW1wb3J0IHsgQ29udHJvbERhdGEsIFN0ZXBEYXRhLCBTZWN0aW9uRGF0YSB9IGZyb20gJy4uL21vZGVscy9mbHV4Lm1vZGVsJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uc0hlbHBlciB9IGZyb20gJy4vdHJhbnNsYXRpb25zLWhlbHBlcic7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBGbHV4SGVscGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVBpcGUpIHt9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHVuaXF1ZSBWMS1jb21wYXRpYmxlIGlkZW50aWZpZXJcbiAgICovXG4gIGdlbmVyYXRlVW5pcXVlSWQocHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIE1hdGNoIEZsdXhWMSBwYXR0ZXJuOiBwcmVmaXhfVVVJRFxuICAgIGNvbnN0IHV1aWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gcHJlZml4ID8gdXVpZCA6IHV1aWQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRyYW5zbGF0aW9ucyBvbmx5IGZvciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVRyYW5zbGF0aW9uc0lmU3VwcG9ydGVkKFxuICAgIHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSxcbiAgICB2YWx1ZXM6IHsgaXNvOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdXG4gICk6IExhYmVsSW5mb1tdIHtcbiAgICBsZXQgbGlzdDogTGFiZWxJbmZvW10gPSBbXTtcbiAgICB2YWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgY29uc3QgbGFuZ0lkID0gc3VwcG9ydGVkTGFuZ3VhZ2VzLmZpbmQoKGxhbmcpID0+IGxhbmcuaXNvID09PSB2Lmlzbyk/LmlkO1xuICAgICAgaWYgKGxhbmdJZCAmJiBsYW5nSWQgPiAwKSB7XG4gICAgICAgIGxpc3QucHVzaCh7XG4gICAgICAgICAgbGFuZ3VhZ2VJZDogbGFuZ0lkLFxuICAgICAgICAgIGxhbmd1YWdlSXNvOiB2LmlzbyxcbiAgICAgICAgICB2YWx1ZTogdi52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWFudWFsIGlucHV0IGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlTWFudWFsSW5wdXRDb250cm9sKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZSxcbiAgICBpc01hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsXG4gICAgZGltZW5zaW9uOiBudW1iZXIgPSA1MFxuICApOiBDb250cm9sRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICB0aXRsZTogbmFtZSxcbiAgICAgIGNhbkVkaXQ6IGZhbHNlLFxuICAgICAgY2FuRGVwZW5kOiBmYWxzZSxcbiAgICAgIGlzT25seUZvckNvbmZpZzogZmFsc2UsXG4gICAgICBpc1ByZXNlbnRhdGlvbkNvbnRyb2w6IGZhbHNlLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgaXNNYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGRpbWVuc2lvbixcbiAgICAgIGRpbWVuc2lvblR5cGU6IERpbWVuc2lvblR5cGUuUGVyY2VudGFnZSxcbiAgICAgIGF1dG9EaW1lbnNpb246IGZhbHNlLFxuICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICB0eXBlLFxuICAgICAgICBpc01hbmRhdG9yeSxcbiAgICAgICAgYWxsb3dlZENoYXJhY3RlcnM6ICcnLFxuICAgICAgICBtYXhDaGFyYWN0ZXJzOiB0eXBlID09PSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHQgPyA1MCA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWluVmFsdWU6IHR5cGUgPT09IE1hbnVhbElucHV0Q29udHJvbFR5cGUuTnVtZXJpYyA/IDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heFZhbHVlOiB0eXBlID09PSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLk51bWVyaWMgPyA5OTk5OTk5IDogdW5kZWZpbmVkLFxuICAgICAgICBhbGxvd09ubHlGdXR1cmU6IGZhbHNlLFxuICAgICAgICBhbGxvd09ubHlQYXN0OiBmYWxzZSxcbiAgICAgICAgaXNTaW1wbGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgaXNBcGlWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcGFyYWdyYXBoIGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUGFyYWdyYXBoQ29udHJvbChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHNob3dWYWxpZGF0aW9uczogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGlzTWFuZGF0b3J5OiBib29sZWFuID0gZmFsc2VcbiAgKTogQ29udHJvbERhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBpZGVudGlmaWVyLFxuICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLlBhcmFncmFwaCxcbiAgICAgIHRpdGxlOiB0ZXh0LFxuICAgICAgY2FuRWRpdDogZmFsc2UsXG4gICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgaXNNYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgaXNQcmVzZW50YXRpb25Db250cm9sOiBmYWxzZSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBpc09ubHlGb3JDb25maWc6IGZhbHNlLFxuICAgICAgZGltZW5zaW9uOiAxMDAsXG4gICAgICBkaW1lbnNpb25UeXBlOiBEaW1lbnNpb25UeXBlLlBlcmNlbnRhZ2UsXG4gICAgICBhdXRvRGltZW5zaW9uOiB0cnVlLFxuICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICBkZXNjcmlwdGlvblRyYW5zbGF0aW9uczogW10sXG4gICAgICAgIHNob3dWYWxpZGF0aW9ucyxcbiAgICAgICAgaXNNYW5kYXRvcnksXG4gICAgICAgIGlzTWFuZGF0b3J5VHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIH0sXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHJvdyBjb250cm9sXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU5ld1Jvd0NvbnRyb2woKTogQ29udHJvbERhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ25ld3JvdycpLFxuICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk5ld1JvdyxcbiAgICAgIHRpdGxlOiAnTmV3IFJvdycsXG4gICAgICBjYW5FZGl0OiBmYWxzZSxcbiAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICBpc09ubHlGb3JDb25maWc6IGZhbHNlLFxuICAgICAgaXNQcmVzZW50YXRpb25Db250cm9sOiBmYWxzZSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGlzTWFuZGF0b3J5OiBmYWxzZSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBkaW1lbnNpb246IDEwMCxcbiAgICAgIGRpbWVuc2lvblR5cGU6IERpbWVuc2lvblR5cGUuUGVyY2VudGFnZSxcbiAgICAgIGF1dG9EaW1lbnNpb246IHRydWUsXG4gICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7fSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgS1lDIHN0ZXAgd2l0aCBhbGwgZGVmYXVsdCBzZWN0aW9uc1xuICAgKi9cbiAgY3JlYXRlS3ljU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcE5hbWUgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXguaWRlbnRpZmljYXRpb24pO1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKGAke3N0ZXBOYW1lfSAtIEtZQ2ApLFxuICAgICAgbmFtZTogc3RlcE5hbWUsXG4gICAgICB0eXBlOiBGbHV4VHlwZS5LeWMsXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHt9LFxuICAgICAgdHJhbnNsYXRpb25zOlxuICAgICAgICBUcmFuc2xhdGlvbnNIZWxwZXIuY3JlYXRlS3ljVHJhbnNsYXRpb25zKHN1cHBvcnRlZExhbmd1YWdlcyksXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGhhc05hbWVBbmREZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIFNlY3Rpb24gMTogS1lDIFN0YXR1c1xuICAgIGNvbnN0IHN0YXR1c1NlY3Rpb246IFNlY3Rpb25EYXRhID0ge1xuICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNTdGF0dXNUaXRsZSksXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLkNoZWNrQm94LFxuICAgICAgICAgIGlkZW50aWZpZXI6ICdJZGVudGl0eVZhbGlkYXRpb25TdGF0dXMnLFxuICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oXG4gICAgICAgICAgICBMYWJlbEtleXMuZmx1eC5zdGVwSW5mby52YWxpZGF0aW9uU3RhdHVzXG4gICAgICAgICAgKSxcbiAgICAgICAgfSBhcyBDb250cm9sRGF0YSxcbiAgICAgIF0sXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNTdGF0dXNUaXRsZSlcbiAgICAgICksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIFNlY3Rpb24gMjogUGVyc29uYWwgSW5mb3JtYXRpb25cbiAgICBjb25zdCBwZXJzb25EYXRhID0gW1xuICAgICAgJ0NOUCcsXG4gICAgICAnSURTZXJpZXMnLFxuICAgICAgJ0lETnVtYmVyJyxcbiAgICAgICdGaXJzdE5hbWUnLFxuICAgICAgJ0xhc3ROYW1lJyxcbiAgICAgICdOYXRpb25hbGl0eScsXG4gICAgICAnSURFeHBpcmF0aW9uRGF0ZScsXG4gICAgICAnSURWYWxpZGl0eScsXG4gICAgICAnQWRkcmVzcycsXG4gICAgICAnUGxhY2VPZkJpcnRoJyxcbiAgICAgICdEYXRlT2ZCaXJ0aCcsXG4gICAgXTtcbiAgICBjb25zdCBwZXJzb25Db250cm9sczogQ29udHJvbERhdGFbXSA9IHBlcnNvbkRhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgIGlkZW50aWZpZXI6IHV1aWR2NCgpLFxuICAgICAgICB0aXRsZTogaXRlbSxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgQ29udHJvbERhdGE7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwZXJzb25hbFNlY3Rpb246IFNlY3Rpb25EYXRhID0ge1xuICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNQZXJzb25UaXRsZSksXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogcGVyc29uQ29udHJvbHMsXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNQZXJzb25UaXRsZSlcbiAgICAgICksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIFNlY3Rpb24gMzogVmFsaWRhdGlvbiBEYXRhXG4gICAgY29uc3QgdmFsaWRhdGlvblNlY3Rpb246IFNlY3Rpb25EYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXguc3RlcEluZm8ua3ljVmFsaWRhdGlvblRpdGxlKVxuICAgICAgKSxcbiAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oXG4gICAgICAgIExhYmVsS2V5cy5mbHV4LnN0ZXBJbmZvLmt5Y1ZhbGlkYXRpb25UaXRsZVxuICAgICAgKSxcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5FZGl0OiB0cnVlLFxuICAgICAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICAgICAgaXNPbmx5Rm9yQ29uZmlnOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgICAgaWRlbnRpZmllcjogJ0NsaWVudFBob25lTnVtYmVyJyxcbiAgICAgICAgICB0aXRsZTogJ0NsaWVudFBob25lTnVtYmVyJyxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlBob25lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgQ29udHJvbERhdGEsXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5FZGl0OiB0cnVlLFxuICAgICAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICAgICAgaXNPbmx5Rm9yQ29uZmlnOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgICAgaWRlbnRpZmllcjogJ0lkU25hcHNob3QnLFxuICAgICAgICAgIHRpdGxlOiAnSWRTbmFwc2hvdCcsXG4gICAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5UZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgQ29udHJvbERhdGEsXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5FZGl0OiB0cnVlLFxuICAgICAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICAgICAgaXNPbmx5Rm9yQ29uZmlnOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgICAgaWRlbnRpZmllcjogJ0ZhY2VTbmFwc2hvdCcsXG4gICAgICAgICAgdGl0bGU6ICdGYWNlU25hcHNob3QnLFxuICAgICAgICAgIHNwZWNpZmljQ29udHJvbERhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIENvbnRyb2xEYXRhLFxuICAgICAgXSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICB9IGFzIFNlY3Rpb25EYXRhO1xuXG4gICAgLy8gU2VjdGlvbiA0OiBBZGRyZXNzIEluZm9ybWF0aW9uXG4gICAgY29uc3QgYWRkcmVzc0RhdGEgPSBbXG4gICAgICAnRGlzdHJpY3ROYW1lJyxcbiAgICAgICdDaXR5TmFtZScsXG4gICAgICAnU3RyZWV0TmFtZScsXG4gICAgICAnU3RyZWV0Tm8nLFxuICAgICAgJ0ZsYXRObycsXG4gICAgICAnU3RhaXJObycsXG4gICAgICAnRmxvb3JObycsXG4gICAgICAnQXBhcnRtZW50Tm8nLFxuICAgIF07XG4gICAgY29uc3QgYWRkcmVzc0NvbnRyb2xzOiBDb250cm9sRGF0YVtdID0gYWRkcmVzc0RhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgIGlkZW50aWZpZXI6IHV1aWR2NCgpLFxuICAgICAgICB0aXRsZTogaXRlbSxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgQ29udHJvbERhdGE7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhZGRyZXNzU2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNBZGRyZXNzVGl0bGUpXG4gICAgICApLFxuICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNBZGRyZXNzVGl0bGUpLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IGFkZHJlc3NDb250cm9scyxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICB9IGFzIFNlY3Rpb25EYXRhO1xuXG4gICAgc3RlcC5zZWN0aW9ucyA9IFtcbiAgICAgIHN0YXR1c1NlY3Rpb24sXG4gICAgICBwZXJzb25hbFNlY3Rpb24sXG4gICAgICB2YWxpZGF0aW9uU2VjdGlvbixcbiAgICAgIGFkZHJlc3NTZWN0aW9uLFxuICAgIF07XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEVtYWlsIFZlcmlmaWNhdGlvbiBzdGVwXG4gICAqL1xuICBjcmVhdGVDaGVja0VtYWlsU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC52ZXJpZnlFbWFpbCksXG4gICAgICB0eXBlOiBGbHV4VHlwZS5FbWFpbCxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBjb2xsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBjb21wb25lbnRDb2xsZWN0ZWQ6ICcnLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczpcbiAgICAgICAgVHJhbnNsYXRpb25zSGVscGVyLmNyZWF0ZUNoZWNrRW1haWxUcmFuc2xhdGlvbnMoc3VwcG9ydGVkTGFuZ3VhZ2VzKSxcbiAgICAgIHBhbmVsT3BlblN0YXRlOiB0cnVlLFxuICAgICAgYnV0dG9uczogW10sXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiB7XG4gICAgICAgIGlzRGljdGlvbmFyeURlcGVuZGVudDogZmFsc2UsXG4gICAgICAgIGRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllcjogJycsXG4gICAgICAgIGRlcGVuZGVudFZhbHVlSWRzOiBbXSxcbiAgICAgIH0sXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgaGFzTmFtZUFuZERlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIGVtYWlsIHZlcmlmaWNhdGlvbiBzZWN0aW9uXG4gICAgY29uc3Qgc2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiBgU2lzdGVtIC0gRW1haWxfJHt0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpfWAsXG4gICAgICB0aXRsZTogJ1Npc3RlbSAtIEVtYWlsJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5FZGl0OiB0cnVlLFxuICAgICAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICAgICAgaXNPbmx5Rm9yQ29uZmlnOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgICAgaWRlbnRpZmllcjogJ3ZhbGlkYXRlZC1lbWFpbCcsXG4gICAgICAgICAgdGl0bGU6ICdFbWFpbCBWYWxpZCcsXG4gICAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5FbWFpbCxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIENvbnRyb2xEYXRhLFxuICAgICAgXSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICB9IGFzIFNlY3Rpb25EYXRhO1xuXG4gICAgc3RlcC5zZWN0aW9ucyA9IFtzZWN0aW9uXTtcbiAgICByZXR1cm4gc3RlcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgUGhvbmUgVmVyaWZpY2F0aW9uIHN0ZXBcbiAgICovXG4gIGNyZWF0ZUNoZWNrUGhvbmVTdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwOiBTdGVwRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc3RlcCcpLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LnZlcmlmeVBob25lKSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLlBob25lLFxuICAgICAgc2VjdGlvbnM6IFtdLFxuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3RlZDogZmFsc2UsXG4gICAgICAgIGNvbXBvbmVudENvbGxlY3RlZDogJycsXG4gICAgICB9LFxuICAgICAgdHJhbnNsYXRpb25zOlxuICAgICAgICBUcmFuc2xhdGlvbnNIZWxwZXIuY3JlYXRlQ2hlY2tQaG9uZVRyYW5zbGF0aW9ucyhzdXBwb3J0ZWRMYW5ndWFnZXMpLFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgcGhvbmUgdmVyaWZpY2F0aW9uIHNlY3Rpb25cbiAgICBjb25zdCBzZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IGBTaXN0ZW0gLSBUZWxfJHt0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpfWAsXG4gICAgICB0aXRsZTogJ1Npc3RlbSAtIFRlbCcsXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogW1xuICAgICAgICB7XG4gICAgICAgICAgY2FuRWRpdDogdHJ1ZSxcbiAgICAgICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgICAgIGlzT25seUZvckNvbmZpZzogZmFsc2UsXG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk1hbnVhbElucHV0LFxuICAgICAgICAgIGlkZW50aWZpZXI6ICd2YWxpZGF0ZWQtcGhvbmUnLFxuICAgICAgICAgIHRpdGxlOiAnTnIgdGVsIFZhbGlkJyxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlBob25lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgQ29udHJvbERhdGEsXG4gICAgICBdLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgIH0gYXMgU2VjdGlvbkRhdGE7XG5cbiAgICBzdGVwLnNlY3Rpb25zID0gW3NlY3Rpb25dO1xuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBJRCBTY2FuIHN0ZXBcbiAgICovXG4gIGNyZWF0ZVNjYW5TdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwOiBTdGVwRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc3RlcCcpLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LmlkU2NhbiksXG4gICAgICB0eXBlOiBGbHV4VHlwZS5JZFNjYW4sXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgc2hvd1VwbG9hZEZpbGVCdXR0b246IHRydWUsXG4gICAgICAgIHNob3dUYWtlUGljdHVyZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgZmlsZU1heFNpemU6IDUwMDAsXG4gICAgICAgIGZpbGVGb3JtYXRzOiAnKi5qcGcsKi5wbmcnLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczpcbiAgICAgICAgVHJhbnNsYXRpb25zSGVscGVyLmNyZWF0ZUlkU2NhblRyYW5zbGF0aW9ucyhzdXBwb3J0ZWRMYW5ndWFnZXMpLFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgY29kZTogJ2ludmFsaWRTdGF0dXMnLFxuICAgICAgICAgIHRyYW5zbGF0aW9uczogdGhpcy5jcmVhdGVUcmFuc2xhdGlvbnNJZlN1cHBvcnRlZChzdXBwb3J0ZWRMYW5ndWFnZXMsIFtcbiAgICAgICAgICAgIHsgaXNvOiAnZW4nLCB2YWx1ZTogJ0ludmFsaWQgc3RhdHVzIHJlc3BvbnNlJyB9LFxuICAgICAgICAgICAgeyBpc286ICdybycsIHZhbHVlOiAnUmFzcHVucyBzdGF0dXMgaW52YWxpZCcgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvZGU6ICdpbnZhbGlkVHlwZScsXG4gICAgICAgICAgdHJhbnNsYXRpb25zOiB0aGlzLmNyZWF0ZVRyYW5zbGF0aW9uc0lmU3VwcG9ydGVkKHN1cHBvcnRlZExhbmd1YWdlcywgW1xuICAgICAgICAgICAgeyBpc286ICdlbicsIHZhbHVlOiAnSW52YWxpZCB0eXBlLiBBbGxvd2VkIGZvcm1hdHMgYXJlIHtmb3JtYXRzfScgfSxcbiAgICAgICAgICAgIHsgaXNvOiAncm8nLCB2YWx1ZTogJ1RpcCBpbnZhbGlkLiBGb3JtYXR1bCBwZXJtaXMgZXN0ZSB7Zm9ybWF0c30nIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2RlOiAnbWF4U2l6ZScsXG4gICAgICAgICAgdHJhbnNsYXRpb25zOiB0aGlzLmNyZWF0ZVRyYW5zbGF0aW9uc0lmU3VwcG9ydGVkKHN1cHBvcnRlZExhbmd1YWdlcywgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc286ICdlbicsXG4gICAgICAgICAgICAgIHZhbHVlOiAnVGhlIHNlbGVjdGVkIGZpbGUgaXMgdG9vIGJpZy4gTWF4IGFsbG93ZWQgc2l6ZSBpcyB7c2l6ZX0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNvOiAncm8nLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAnRmnImWllcnVsIHNlbGVjdGF0IGVzdGUgcHJlYSBtYXJlLiBEaW1lbnNpdW5lYSBtYXhpbcSDIGVzdGUge3NpemV9JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2RlOiAnZnJvbnRJZCcsXG4gICAgICAgICAgdHJhbnNsYXRpb25zOiB0aGlzLmNyZWF0ZVRyYW5zbGF0aW9uc0lmU3VwcG9ydGVkKHN1cHBvcnRlZExhbmd1YWdlcywgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc286ICdlbicsXG4gICAgICAgICAgICAgIHZhbHVlOiAnUGxlYXNlIHVwbG9hZCB0aGUgZnJvbnQgcGhvdG8gb2YgeW91ciBJRCBjYXJkLicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc286ICdybycsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICdWxIMgcnVnxINtIHPEgyB1cmNhyJtpIHBhcnRlYSBkaW4gZmHIm8SDIGEgZG9jdW1lbnR1bHVpIGRlIGlkZW50aXRhdGUuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2RlOiAnYmFja0lkJyxcbiAgICAgICAgICB0cmFuc2xhdGlvbnM6IHRoaXMuY3JlYXRlVHJhbnNsYXRpb25zSWZTdXBwb3J0ZWQoc3VwcG9ydGVkTGFuZ3VhZ2VzLCBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlzbzogJ2VuJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdQbGVhc2UgdXBsb2FkIHRoZSBiYWNrIHBob3RvIG9mIHlvdXIgSUQgY2FyZC4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNvOiAncm8nLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAnVsSDIHJ1Z8SDbSBzxIMgdXJjYcibaSBwYXJ0ZWEgZGluIHNwYXRlIGEgZG9jdW1lbnR1bHVpIGRlIGlkZW50aXRhdGUuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgaGFzTmFtZUFuZERlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gTWF0Y2ggVjEgSUQgU2NhbiBzZWN0aW9ucyBleGFjdGx5XG4gICAgLy8gU3RhdHVzIHNlY3Rpb25cbiAgICBjb25zdCBzdGF0dXNTZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnSUQgU0NBTiBTdGF0dXMnKSxcbiAgICAgIHRpdGxlOiAnSUQgU0NBTiBTdGF0dXMnLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5DaGVja0JveCxcbiAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ0lEIFNDQU4gVmFsaWRhdGlvbiBTdGF0dXMnKSxcbiAgICAgICAgICB0aXRsZTogJ0lEIFNDQU4gVmFsaWRhdGlvbiBTdGF0dXMnLFxuICAgICAgICB9IGFzIENvbnRyb2xEYXRhLFxuICAgICAgXSxcbiAgICB9IGFzIFNlY3Rpb25EYXRhO1xuXG4gICAgLy8gUGVyc29uIGRhdGEgc2VjdGlvblxuICAgIGNvbnN0IHBlcnNvbkRhdGEgPSBbXG4gICAgICAnQ05QJyxcbiAgICAgICdJRFNlcmllcycsXG4gICAgICAnSUROdW1iZXInLFxuICAgICAgJ0ZpcnN0TmFtZScsXG4gICAgICAnTGFzdE5hbWUnLFxuICAgICAgJ05hdGlvbmFsaXR5JyxcbiAgICAgICdJREV4cGlyYXRpb25EYXRlJyxcbiAgICAgICdJRFZhbGlkaXR5JyxcbiAgICAgICdBZGRyZXNzJyxcbiAgICAgICdQbGFjZU9mQmlydGgnLFxuICAgIF07XG4gICAgY29uc3QgcGVyc29uQ29udHJvbHM6IENvbnRyb2xEYXRhW10gPSBwZXJzb25EYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk1hbnVhbElucHV0LFxuICAgICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoaXRlbSksXG4gICAgICAgIHRpdGxlOiBpdGVtLFxuICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5UZXh0LFxuICAgICAgICB9LFxuICAgICAgfSBhcyBDb250cm9sRGF0YTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHBlcnNvblNlY3Rpb246IFNlY3Rpb25EYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdJRCBTQ0FOIFBlcnNvYW5hJyksXG4gICAgICB0aXRsZTogJ0lEIFNDQU4gUGVyc29hbmEnLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IHBlcnNvbkNvbnRyb2xzLFxuICAgIH0gYXMgU2VjdGlvbkRhdGE7XG5cbiAgICBzdGVwLnNlY3Rpb25zID0gW3N0YXR1c1NlY3Rpb24sIHBlcnNvblNlY3Rpb25dO1xuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBTaWduIHN0ZXBcbiAgICovXG4gIGNyZWF0ZVNpZ25TdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwOiBTdGVwRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc3RlcCcpLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LnNpZ24pLFxuICAgICAgdHlwZTogRmx1eFR5cGUuU2lnbixcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBzaWduYXR1cmVUeXBlOiAnRWxlY3Ryb25pYycsXG4gICAgICAgIHNob3dDb25maXJtOiB0cnVlLFxuICAgICAgICBjb21wYW55U2lnbjogZmFsc2UsXG4gICAgICAgIGZpcnN0TmFtZUNvbGxlY3RlZDogJycsXG4gICAgICAgIGxhc3ROYW1lQ29sbGVjdGVkOiAnJyxcbiAgICAgICAgZG9jdW1lbnRzOiBbXSxcbiAgICAgICAgZG9jc1RvU2lnbjogW10sXG4gICAgICB9LFxuICAgICAgdHJhbnNsYXRpb25zOlxuICAgICAgICBUcmFuc2xhdGlvbnNIZWxwZXIuY3JlYXRlU2lnblRyYW5zbGF0aW9ucyhzdXBwb3J0ZWRMYW5ndWFnZXMpLFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc2lnbiBzZWN0aW9uXG4gICAgY29uc3Qgc2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpLFxuICAgICAgdGl0bGU6ICdEb2N1bWVudCBTaWduaW5nJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgIHRoaXMuY3JlYXRlUGFyYWdyYXBoQ29udHJvbChcbiAgICAgICAgICAnUGxlYXNlIHNpZ24gdGhlIGZvbGxvd2luZyBkb2N1bWVudHMnLFxuICAgICAgICAgICdzaWduLWluc3RydWN0aW9uJyxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApLFxuICAgICAgICB7XG4gICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdjb21wJyksXG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLlZpZXdEb2N1bWVudHMsXG4gICAgICAgICAgdGl0bGU6ICdEb2N1bWVudHMgdG8gU2lnbicsXG4gICAgICAgICAgY2FuRWRpdDogZmFsc2UsXG4gICAgICAgICAgY2FuRGVwZW5kOiBmYWxzZSxcbiAgICAgICAgICBpc09ubHlGb3JDb25maWc6IGZhbHNlLFxuICAgICAgICAgIGRpbWVuc2lvbjogMTAwLFxuICAgICAgICAgIGRpbWVuc2lvblR5cGU6IERpbWVuc2lvblR5cGUuUGVyY2VudGFnZSxcbiAgICAgICAgICBhdXRvRGltZW5zaW9uOiB0cnVlLFxuICAgICAgICAgIGlzUHJlc2VudGF0aW9uQ29udHJvbDogZmFsc2UsXG4gICAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgICAgZG9jdW1lbnRzOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllcjogJycsXG4gICAgICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpc01hbmRhdG9yeTogZmFsc2UsXG4gICAgICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBwcmVzZW50YXRpb25Db250cm9sczogW10sXG4gICAgICBpc05hdmlnYXRpb25TZWN0aW9uOiBmYWxzZSxcbiAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICB0cmFuc2xhdGlvbnM6IFtdLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgIHNob3dTZWN0aW9uVGl0bGU6IHRydWUsXG4gICAgICBzaG93U2VjdGlvblNlcGFyYXRvcjogdHJ1ZSxcbiAgICB9O1xuXG4gICAgc3RlcC5zZWN0aW9ucyA9IFtzZWN0aW9uXTtcbiAgICByZXR1cm4gc3RlcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgR2VuZXJhdGUgRG9jdW1lbnRzIHN0ZXBcbiAgICovXG4gIGNyZWF0ZUdlbmVyYXRlRG9jdW1lbnRzU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5nZW5lcmF0ZURvY3VtZW50KSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLkdlbmVyYXRlRG9jdW1lbnQsXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgZ2VuZXJhdGVkRG9jdW1lbnRzOiBbXSxcbiAgICAgIH0sXG4gICAgICB0cmFuc2xhdGlvbnM6XG4gICAgICAgIFRyYW5zbGF0aW9uc0hlbHBlci5jcmVhdGVHZW5lcmF0ZURvY3VtZW50c1RyYW5zbGF0aW9ucyhcbiAgICAgICAgICBzdXBwb3J0ZWRMYW5ndWFnZXNcbiAgICAgICAgKSxcbiAgICAgIHBhbmVsT3BlblN0YXRlOiB0cnVlLFxuICAgICAgYnV0dG9uczogW10sXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiB7XG4gICAgICAgIGlzRGljdGlvbmFyeURlcGVuZGVudDogZmFsc2UsXG4gICAgICAgIGRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllcjogJycsXG4gICAgICAgIGRlcGVuZGVudFZhbHVlSWRzOiBbXSxcbiAgICAgIH0sXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgaGFzTmFtZUFuZERlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gTm8gZGVmYXVsdCBzZWN0aW9ucyBmb3IgZ2VuZXJhdGUgZG9jdW1lbnRzXG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFBhdXNlIHN0ZXBcbiAgICovXG4gIGNyZWF0ZVBhdXNlU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcE5hbWUgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXgucGF1c2UpO1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKGAke3N0ZXBOYW1lfSAtIFBhdXNlYCksXG4gICAgICBuYW1lOiBzdGVwTmFtZSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLlBhdXNlLFxuICAgICAgc2VjdGlvbnM6IFtdLFxuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7fSxcbiAgICAgIHRyYW5zbGF0aW9uczpcbiAgICAgICAgVHJhbnNsYXRpb25zSGVscGVyLmNyZWF0ZVBhdXNlVHJhbnNsYXRpb25zKHN1cHBvcnRlZExhbmd1YWdlcyksXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGhhc05hbWVBbmREZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIEFkZCBwYXVzZSBtZXNzYWdlIHNlY3Rpb25cbiAgICBjb25zdCBzZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc2VjJyksXG4gICAgICB0aXRsZTogJ0Zsb3cgUGF1c2VkJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgIHRoaXMuY3JlYXRlUGFyYWdyYXBoQ29udHJvbChcbiAgICAgICAgICAnVGhlIHdvcmtmbG93IGhhcyBiZWVuIHBhdXNlZCcsXG4gICAgICAgICAgJ3BhdXNlLW1lc3NhZ2UnLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgcHJlc2VudGF0aW9uQ29udHJvbHM6IFtdLFxuICAgICAgaXNOYXZpZ2F0aW9uU2VjdGlvbjogZmFsc2UsXG4gICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICBzaG93U2VjdGlvblRpdGxlOiB0cnVlLFxuICAgICAgc2hvd1NlY3Rpb25TZXBhcmF0b3I6IHRydWUsXG4gICAgfTtcblxuICAgIHN0ZXAuc2VjdGlvbnMgPSBbc2VjdGlvbl07XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEFjdGlvbiBzdGVwXG4gICAqL1xuICBjcmVhdGVBY3Rpb25TdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwOiBTdGVwRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc3RlcCcpLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LmFjdGlvbiksXG4gICAgICB0eXBlOiBGbHV4VHlwZS5BY3Rpb24sXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgYXBpTWV0aG9kOiAnJyxcbiAgICAgICAgYXBpUGFydG5lcnM6IFtdLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczpcbiAgICAgICAgVHJhbnNsYXRpb25zSGVscGVyLmNyZWF0ZUFjdGlvblRyYW5zbGF0aW9ucyhzdXBwb3J0ZWRMYW5ndWFnZXMpLFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBObyBkZWZhdWx0IHNlY3Rpb25zIGZvciBhY3Rpb24gc3RlcFxuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBTdGF0dXMgc3RlcCB3aXRoIGRlZmF1bHQgc2VjdGlvblxuICAgKi9cbiAgY3JlYXRlU3RhdHVzU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGF0dXMpLFxuICAgICAgdHlwZTogRmx1eFR5cGUuU3RhdHVzLFxuICAgICAgc2VjdGlvbnM6IFtdLFxuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7fSxcbiAgICAgIHBhbmVsT3BlblN0YXRlOiB0cnVlLFxuICAgICAgYnV0dG9uczogW10sXG4gICAgICB0cmFuc2xhdGlvbnM6XG4gICAgICAgIFRyYW5zbGF0aW9uc0hlbHBlci5jcmVhdGVTdGF0dXNUcmFuc2xhdGlvbnMoc3VwcG9ydGVkTGFuZ3VhZ2VzKSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc3RhdHVzIHNlbGVjdGlvbiBzZWN0aW9uXG4gICAgY29uc3Qgc2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICB0aXRsZTogJ1N0YXR1cyBTaXN0ZW0nLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGNhbkVkaXQ6IHRydWUsXG4gICAgICAgICAgY2FuRGVwZW5kOiBmYWxzZSxcbiAgICAgICAgICBpc09ubHlGb3JDb25maWc6IGZhbHNlLFxuICAgICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5OZXdSb3csXG4gICAgICAgICAgaWRlbnRpZmllcjogJ3NlbGVjdC1zdGF0dXMnLFxuICAgICAgICAgIHRpdGxlOiAnRmx1eCcsXG4gICAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5UZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgQ29udHJvbERhdGEsXG4gICAgICBdLFxuICAgICAgaWRlbnRpZmllcjogYFN0YXR1cyBTaXN0ZW1fJHt0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpfWAsXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIHN0ZXAuc2VjdGlvbnMgPSBbc2VjdGlvbl07XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFVwbG9hZCBEb2N1bWVudCBzdGVwXG4gICAqL1xuICBjcmVhdGVVcGxvYWREb2N1bWVudFN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdKTogU3RlcERhdGEge1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdzdGVwJyksXG4gICAgICBuYW1lOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXgudXBsb2FkRG9jdW1lbnQpLFxuICAgICAgdHlwZTogRmx1eFR5cGUuVXBsb2FkRG9jdW1lbnQsXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHt9LFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgaGFzTmFtZUFuZERlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHVwbG9hZCBzZWN0aW9uXG4gICAgY29uc3Qgc2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpLFxuICAgICAgdGl0bGU6ICdVcGxvYWQgRG9jdW1lbnRzJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLkNvbGxlY3QsXG4gICAgICBjb250cm9sczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdjb21wJyksXG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLlVwbG9hZERvY3VtZW50cyxcbiAgICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LnVwbG9hZERvY3VtZW50KSxcbiAgICAgICAgICBjYW5FZGl0OiBmYWxzZSxcbiAgICAgICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgICAgIGlzT25seUZvckNvbmZpZzogZmFsc2UsXG4gICAgICAgICAgaXNQcmVzZW50YXRpb25Db250cm9sOiBmYWxzZSxcbiAgICAgICAgICBkaW1lbnNpb246IDEwMCxcbiAgICAgICAgICBkaW1lbnNpb25UeXBlOiBEaW1lbnNpb25UeXBlLlBlcmNlbnRhZ2UsXG4gICAgICAgICAgYXV0b0RpbWVuc2lvbjogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgICBkb2N1bWVudHM6IFtdLFxuICAgICAgICAgICAgZmlsZU1heFNpemU6IDEwMDAwLFxuICAgICAgICAgICAgZmlsZUZvcm1hdHM6ICcqLnBkZiwqLmpwZywqLnBuZywqLmRvYywqLmRvY3gnLFxuICAgICAgICAgICAgaXNNYW5kYXRvcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgICAgIGlzRGljdGlvbmFyeURlcGVuZGVudDogZmFsc2UsXG4gICAgICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaXNNYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcHJlc2VudGF0aW9uQ29udHJvbHM6IFtdLFxuICAgICAgaXNOYXZpZ2F0aW9uU2VjdGlvbjogZmFsc2UsXG4gICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICBzaG93U2VjdGlvblRpdGxlOiB0cnVlLFxuICAgICAgc2hvd1NlY3Rpb25TZXBhcmF0b3I6IHRydWUsXG4gICAgfTtcblxuICAgIHN0ZXAuc2VjdGlvbnMgPSBbc2VjdGlvbl07XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIERvd25sb2FkIERvY3VtZW50IHN0ZXBcbiAgICovXG4gIGNyZWF0ZURvd25sb2FkRG9jdW1lbnRTdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwOiBTdGVwRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc3RlcCcpLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LmRvd25sb2FkRG9jdW1lbnQpLFxuICAgICAgdHlwZTogRmx1eFR5cGUuRG93bmxvYWREb2N1bWVudCxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgZG93bmxvYWQgc2VjdGlvblxuICAgIGNvbnN0IHNlY3Rpb246IFNlY3Rpb25EYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdzZWMnKSxcbiAgICAgIHRpdGxlOiAnRG93bmxvYWQgRG9jdW1lbnRzJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ2NvbXAnKSxcbiAgICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuRG93bmxvYWREb2N1bWVudHMsXG4gICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5kb3dubG9hZERvY3VtZW50KSxcbiAgICAgICAgICBjYW5FZGl0OiBmYWxzZSxcbiAgICAgICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgICAgIGlzT25seUZvckNvbmZpZzogZmFsc2UsXG4gICAgICAgICAgaXNQcmVzZW50YXRpb25Db250cm9sOiBmYWxzZSxcbiAgICAgICAgICBkaW1lbnNpb246IDEwMCxcbiAgICAgICAgICBkaW1lbnNpb25UeXBlOiBEaW1lbnNpb25UeXBlLlBlcmNlbnRhZ2UsXG4gICAgICAgICAgYXV0b0RpbWVuc2lvbjogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgICBkb2N1bWVudHM6IFtdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiB7XG4gICAgICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgICAgIGRlcGVuZGVudFZhbHVlSWRzOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGlzTWFuZGF0b3J5OiBmYWxzZSxcbiAgICAgICAgICB0cmFuc2xhdGlvbnM6IFtdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHByZXNlbnRhdGlvbkNvbnRyb2xzOiBbXSxcbiAgICAgIGlzTmF2aWdhdGlvblNlY3Rpb246IGZhbHNlLFxuICAgICAgY2FuRGVwZW5kOiBmYWxzZSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgc2hvd1NlY3Rpb25UaXRsZTogdHJ1ZSxcbiAgICAgIHNob3dTZWN0aW9uU2VwYXJhdG9yOiB0cnVlLFxuICAgIH07XG5cbiAgICBzdGVwLnNlY3Rpb25zID0gW3NlY3Rpb25dO1xuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBWaWV3IERvY3VtZW50IHN0ZXBcbiAgICovXG4gIGNyZWF0ZVZpZXdEb2N1bWVudFN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdKTogU3RlcERhdGEge1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdzdGVwJyksXG4gICAgICBuYW1lOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXgudmlld0RvY3VtZW50KSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLlZpZXdEb2N1bWVudCxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgdmlldyBzZWN0aW9uXG4gICAgY29uc3Qgc2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpLFxuICAgICAgdGl0bGU6ICdWaWV3IERvY3VtZW50cycsXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdjb21wJyksXG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLlZpZXdEb2N1bWVudHMsXG4gICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC52aWV3RG9jdW1lbnQpLFxuICAgICAgICAgIGNhbkVkaXQ6IGZhbHNlLFxuICAgICAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICAgICAgaXNPbmx5Rm9yQ29uZmlnOiBmYWxzZSxcbiAgICAgICAgICBpc1ByZXNlbnRhdGlvbkNvbnRyb2w6IGZhbHNlLFxuICAgICAgICAgIGRpbWVuc2lvbjogMTAwLFxuICAgICAgICAgIGRpbWVuc2lvblR5cGU6IERpbWVuc2lvblR5cGUuUGVyY2VudGFnZSxcbiAgICAgICAgICBhdXRvRGltZW5zaW9uOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljQ29udHJvbERhdGE6IHtcbiAgICAgICAgICAgIGRvY3VtZW50czogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgICAgIGlzRGljdGlvbmFyeURlcGVuZGVudDogZmFsc2UsXG4gICAgICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaXNNYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcHJlc2VudGF0aW9uQ29udHJvbHM6IFtdLFxuICAgICAgaXNOYXZpZ2F0aW9uU2VjdGlvbjogZmFsc2UsXG4gICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICBzaG93U2VjdGlvblRpdGxlOiB0cnVlLFxuICAgICAgc2hvd1NlY3Rpb25TZXBhcmF0b3I6IHRydWUsXG4gICAgfTtcblxuICAgIHN0ZXAuc2VjdGlvbnMgPSBbc2VjdGlvbl07XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFZpZXcgT2ZmZXIgc3RlcFxuICAgKi9cbiAgY3JlYXRlVmlld09mZmVyU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC52aWV3T2ZmZXIpLFxuICAgICAgdHlwZTogRmx1eFR5cGUuVmlld09mZmVyLFxuICAgICAgc2VjdGlvbnM6IFtdLFxuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7fSxcbiAgICAgIHBhbmVsT3BlblN0YXRlOiB0cnVlLFxuICAgICAgYnV0dG9uczogW10sXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiB7XG4gICAgICAgIGlzRGljdGlvbmFyeURlcGVuZGVudDogZmFsc2UsXG4gICAgICAgIGRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllcjogJycsXG4gICAgICAgIGRlcGVuZGVudFZhbHVlSWRzOiBbXSxcbiAgICAgIH0sXG4gICAgICB0cmFuc2xhdGlvbnM6XG4gICAgICAgIFRyYW5zbGF0aW9uc0hlbHBlci5jcmVhdGVWaWV3T2ZmZXJTdGVwVHJhbnNsYXRpb25zKHN1cHBvcnRlZExhbmd1YWdlcyksXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgaGFzTmFtZUFuZERlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gTm8gZGVmYXVsdCBzZWN0aW9ucyBmb3IgdmlldyBvZmZlclxuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBORVRPUElBIFBheW1lbnQgc3RlcFxuICAgKi9cbiAgY3JlYXRlTmV0b3BpYVN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdKTogU3RlcERhdGEge1xuICAgIGNvbnN0IHN0ZXBOYW1lID0gdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4Lm5ldG9waWEpO1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKGAke3N0ZXBOYW1lfSAtIE5FVE9QSUFgKSxcbiAgICAgIG5hbWU6IHN0ZXBOYW1lLFxuICAgICAgdHlwZTogRmx1eFR5cGUuTkVUT1BJQSxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgdHJhbnNsYXRpb25zOlxuICAgICAgICBUcmFuc2xhdGlvbnNIZWxwZXIuY3JlYXRlUGF5bWVudHNUcmFuc2xhdGlvbnMoc3VwcG9ydGVkTGFuZ3VhZ2VzKSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCBzZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc2VjJyksXG4gICAgICB0aXRsZTogJ05ldG9waWEgUGF5bWVudCcsXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogW10sXG4gICAgICBwcmVzZW50YXRpb25Db250cm9sczogW10sXG4gICAgICBpc05hdmlnYXRpb25TZWN0aW9uOiBmYWxzZSxcbiAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICB0cmFuc2xhdGlvbnM6IFtdLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgIHNob3dTZWN0aW9uVGl0bGU6IHRydWUsXG4gICAgICBzaG93U2VjdGlvblNlcGFyYXRvcjogdHJ1ZSxcbiAgICB9O1xuICAgIHN0ZXAuc2VjdGlvbnMgPSBbc2VjdGlvbl07XG5cbiAgICAvLyBObyBkZWZhdWx0IHNlY3Rpb25zIGZvciBwYXltZW50IHN0ZXBzXG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEVVUExBVEVTQyBQYXltZW50IHN0ZXBcbiAgICovXG4gIGNyZWF0ZUV1cGxhdGVzY1N0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdKTogU3RlcERhdGEge1xuICAgIGNvbnN0IHN0ZXBOYW1lID0gdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LmV1UGxhdGVzYyk7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoYCR7c3RlcE5hbWV9IC0gRVVQTEFURVNDYCksXG4gICAgICBuYW1lOiBzdGVwTmFtZSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLkVVUExBVEVTQyxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgICB0cmFuc2xhdGlvbnM6XG4gICAgICAgIFRyYW5zbGF0aW9uc0hlbHBlci5jcmVhdGVQYXltZW50c1RyYW5zbGF0aW9ucyhzdXBwb3J0ZWRMYW5ndWFnZXMpLFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCBzZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc2VjJyksXG4gICAgICB0aXRsZTogJ0V1UGxhdGVzYyBQYXltZW50JyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBbXSxcbiAgICAgIHByZXNlbnRhdGlvbkNvbnRyb2xzOiBbXSxcbiAgICAgIGlzTmF2aWdhdGlvblNlY3Rpb246IGZhbHNlLFxuICAgICAgY2FuRGVwZW5kOiBmYWxzZSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgc2hvd1NlY3Rpb25UaXRsZTogdHJ1ZSxcbiAgICAgIHNob3dTZWN0aW9uU2VwYXJhdG9yOiB0cnVlLFxuICAgIH07XG4gICAgc3RlcC5zZWN0aW9ucyA9IFtzZWN0aW9uXTtcblxuICAgIC8vIE5vIGRlZmF1bHQgc2VjdGlvbnMgZm9yIHBheW1lbnQgc3RlcHNcbiAgICByZXR1cm4gc3RlcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgT3BlbiBCYW5raW5nIHN0ZXAgd2l0aCBkZWZhdWx0IHNlY3Rpb25zIGFuZCBjb250cm9sc1xuICAgKi9cbiAgY3JlYXRlT3BlbkJhbmtpbmdTdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwTmFtZSA9IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5vcGVuQmFua2luZyk7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHN0ZXBOYW1lLFxuICAgICAgdHlwZTogRmx1eFR5cGUuT3BlbkJhbmtpbmcsXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLy8gRmllbGQgbWFwcGluZ3NcbiAgICAgICAgYWNjb3VudE51bWJlckNvbGxlY3RlZDogJycsXG4gICAgICAgIGFjY291bnRIb2xkZXJDb2xsZWN0ZWQ6ICcnLFxuICAgICAgICBlbWFpbENvbGxlY3RlZDogJycsXG4gICAgICAgIHBzdUludGVybWVkaWFyeUlkOiAnJyxcblxuICAgICAgICAvLyBCYW5rIHNldHRpbmdzXG4gICAgICAgIHNob3dBbGxCYW5rczogdHJ1ZSxcbiAgICAgICAgZXh0cmFjdEJhbmtGcm9tSUJBTjogZmFsc2UsXG4gICAgICAgIGNvdW50cnlDb2RlOiAnUk8nLFxuXG4gICAgICAgIC8vIFRyYW5zYWN0aW9uIHNldHRpbmdzXG4gICAgICAgIHRyYW5zYWN0aW9uUGVyaW9kTW9udGhzOiAzLFxuICAgICAgICBwZXJpb2RPZlZhbGlkaXR5OiA5MCxcbiAgICAgICAgdGNBY2NlcHRlZEJ5RGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgcmVkaXJlY3RVcmw6ICcnLFxuXG4gICAgICAgIC8vIE1lc3NhZ2VzIC0gd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIHRyYW5zbGF0aW9uc1xuICAgICAgICBpbml0aWFsTWVzc2FnZVRyYW5zbGF0aW9uczogdGhpcy5jcmVhdGVUcmFuc2xhdGlvbnNJZlN1cHBvcnRlZChcbiAgICAgICAgICBzdXBwb3J0ZWRMYW5ndWFnZXMsXG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc286ICdlbicsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICdUbyBjb250aW51ZSwgd2UgbmVlZCB0byB2ZXJpZnkgeW91ciBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24uIENsaWNrIE5leHQgdG8gcHJvY2VlZC4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNvOiAncm8nLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAnUGVudHJ1IGEgY29udGludWEsIHRyZWJ1aWUgc8SDIHZlcmlmaWPEg20gaW5mb3JtYcibaWlsZSBjb250dWx1aSBkdnMuIGJhbmNhci4gRmFjZcibaSBjbGljIHBlIFVybcSDdG9ydWwgcGVudHJ1IGEgY29udGludWEuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXVxuICAgICAgICApLFxuICAgICAgICB3YWl0aW5nTWVzc2FnZVRyYW5zbGF0aW9uczogdGhpcy5jcmVhdGVUcmFuc2xhdGlvbnNJZlN1cHBvcnRlZChcbiAgICAgICAgICBzdXBwb3J0ZWRMYW5ndWFnZXMsXG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc286ICdlbicsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICdQbGVhc2Ugd2FpdCB3aGlsZSB3ZSByZXRyaWV2ZSB5b3VyIGFjY291bnQgaW5mb3JtYXRpb24uLi4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNvOiAncm8nLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAnVsSDIHJ1Z8SDbSBzxIMgYciZdGVwdGHIm2kgcMOibsSDIGPDom5kIHByZWx1xINtIGluZm9ybWHIm2lpbGUgY29udHVsdWkgZHZzLi4uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXVxuICAgICAgICApLFxuICAgICAgICBjb25zZW50RXJyb3JNZXNzYWdlVHJhbnNsYXRpb25zOiB0aGlzLmNyZWF0ZVRyYW5zbGF0aW9uc0lmU3VwcG9ydGVkKFxuICAgICAgICAgIHN1cHBvcnRlZExhbmd1YWdlcyxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlzbzogJ2VuJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdZb3UgbXVzdCBwcm92aWRlIGNvbnNlbnQgdG8gY29udGludWUuIFBsZWFzZSB0cnkgYWdhaW4uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlzbzogJ3JvJyxcbiAgICAgICAgICAgICAgdmFsdWU6XG4gICAgICAgICAgICAgICAgJ1RyZWJ1aWUgc8SDIG9mZXJpyJtpIGNvbnNpbcibxINtw6JudHVsIHBlbnRydSBhIGNvbnRpbnVhLiBWxIMgcnVnxINtIHPEgyDDrm5jZXJjYcibaSBkaW4gbm91LicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF1cbiAgICAgICAgKSxcbiAgICAgICAgY29tcGxldGlvbk1lc3NhZ2VUcmFuc2xhdGlvbnM6IHRoaXMuY3JlYXRlVHJhbnNsYXRpb25zSWZTdXBwb3J0ZWQoXG4gICAgICAgICAgc3VwcG9ydGVkTGFuZ3VhZ2VzLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgaXNvOiAnZW4nLCB2YWx1ZTogJ0FjY291bnQgaW5mb3JtYXRpb24gc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC4nIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlzbzogJ3JvJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdJbmZvcm1hyJtpaWxlIGNvbnR1bHVpIGF1IGZvc3QgcHJlbHVhdGUgY3Ugc3VjY2VzLicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF1cbiAgICAgICAgKSxcbiAgICAgICAgcmV0cnlCdXR0b25MYWJlbFRyYW5zbGF0aW9uczogdGhpcy5jcmVhdGVUcmFuc2xhdGlvbnNJZlN1cHBvcnRlZChcbiAgICAgICAgICBzdXBwb3J0ZWRMYW5ndWFnZXMsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyBpc286ICdlbicsIHZhbHVlOiAnUmV0cnknIH0sXG4gICAgICAgICAgICB7IGlzbzogJ3JvJywgdmFsdWU6ICdSZcOubmNlYXJjxIMnIH0sXG4gICAgICAgICAgXVxuICAgICAgICApLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczpcbiAgICAgICAgVHJhbnNsYXRpb25zSGVscGVyLmNyZWF0ZU9wZW5CYW5raW5nVHJhbnNsYXRpb25zKHN1cHBvcnRlZExhbmd1YWdlcyksXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGhhc05hbWVBbmREZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIFNlY3Rpb24gMTogQ29uc2VudCBTdGF0dXNcbiAgICBjb25zdCBzdGF0dXNTZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIHRpdGxlOiAnQ29uc2VudCBTdGF0dXMnLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5DaGVja0JveCxcbiAgICAgICAgICBpZGVudGlmaWVyOiAnT3BlbkJhbmtpbmdDb25zZW50U3RhdHVzJyxcbiAgICAgICAgICB0aXRsZTogJ0NvbnNlbnQgVmFsaWRhdGVkJyxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7fSxcbiAgICAgICAgfSBhcyBDb250cm9sRGF0YSxcbiAgICAgIF0sXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ0NvbnNlbnQgU3RhdHVzJyksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIFNlY3Rpb24gMjogQWNjb3VudCBJbmZvcm1hdGlvblxuICAgIGNvbnN0IGFjY291bnRDb250cm9sczogQ29udHJvbERhdGFbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk1hbnVhbElucHV0LFxuICAgICAgICBpZGVudGlmaWVyOiAnT3BlbkJhbmtpbmdFbWFpbCcsXG4gICAgICAgIHRpdGxlOiAnRW1haWwnLFxuICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5FbWFpbCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dCxcbiAgICAgICAgaWRlbnRpZmllcjogJ09wZW5CYW5raW5nQWNjb3VudE51bWJlcicsXG4gICAgICAgIHRpdGxlOiAnQWNjb3VudCBOdW1iZXInLFxuICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5UZXh0LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk1hbnVhbElucHV0LFxuICAgICAgICBpZGVudGlmaWVyOiAnT3BlbkJhbmtpbmdBY2NvdW50SG9sZGVyJyxcbiAgICAgICAgdGl0bGU6ICdBY2NvdW50IEhvbGRlciBOYW1lJyxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dCxcbiAgICAgICAgaWRlbnRpZmllcjogJ09wZW5CYW5raW5nQmFua0NvZGUnLFxuICAgICAgICB0aXRsZTogJ0JhbmsgQ29kZScsXG4gICAgICAgIHNwZWNpZmljQ29udHJvbERhdGE6IHtcbiAgICAgICAgICB0eXBlOiBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgIGlkZW50aWZpZXI6ICdPcGVuQmFua2luZ0NvbnNlbnRJZCcsXG4gICAgICAgIHRpdGxlOiAnQ29uc2VudCBJRCcsXG4gICAgICAgIHNwZWNpZmljQ29udHJvbERhdGE6IHtcbiAgICAgICAgICB0eXBlOiBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0gYXMgQ29udHJvbERhdGFbXTtcblxuICAgIGNvbnN0IGFjY291bnRTZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIHRpdGxlOiAnQWNjb3VudCBJbmZvcm1hdGlvbicsXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogYWNjb3VudENvbnRyb2xzLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdBY2NvdW50IEluZm9ybWF0aW9uJyksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIFNlY3Rpb24gMzogQWNjb3VudHMgUmV0cmlldmVkXG4gICAgY29uc3QgYWNjb3VudHNEYXRhQ29udHJvbHM6IENvbnRyb2xEYXRhW10gPSBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dCxcbiAgICAgICAgaWRlbnRpZmllcjogJ09wZW5CYW5raW5nQWNjb3VudHNDb3VudCcsXG4gICAgICAgIHRpdGxlOiAnTnVtYmVyIG9mIEFjY291bnRzJyxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuTnVtZXJpYyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dCxcbiAgICAgICAgaWRlbnRpZmllcjogJ09wZW5CYW5raW5nQWNjb3VudHNEYXRhJyxcbiAgICAgICAgdGl0bGU6ICdBY2NvdW50cyBEYXRhIChKU09OKScsXG4gICAgICAgIHNwZWNpZmljQ29udHJvbERhdGE6IHtcbiAgICAgICAgICB0eXBlOiBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHRBcmVhLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk1hbnVhbElucHV0LFxuICAgICAgICBpZGVudGlmaWVyOiAnT3BlbkJhbmtpbmdUb3RhbEJhbGFuY2UnLFxuICAgICAgICB0aXRsZTogJ1RvdGFsIEJhbGFuY2UnLFxuICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5OdW1lcmljLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdIGFzIENvbnRyb2xEYXRhW107XG5cbiAgICBjb25zdCBhY2NvdW50c0RhdGFTZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIHRpdGxlOiAnUmV0cmlldmVkIEFjY291bnRzJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBhY2NvdW50c0RhdGFDb250cm9scyxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnUmV0cmlldmVkIEFjY291bnRzJyksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIFNlY3Rpb24gNDogVHJhbnNhY3Rpb25zIFJldHJpZXZlZFxuICAgIGNvbnN0IHRyYW5zYWN0aW9uc0NvbnRyb2xzOiBDb250cm9sRGF0YVtdID0gW1xuICAgICAge1xuICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgIGlkZW50aWZpZXI6ICdPcGVuQmFua2luZ1RyYW5zYWN0aW9uc0NvdW50JyxcbiAgICAgICAgdGl0bGU6ICdOdW1iZXIgb2YgVHJhbnNhY3Rpb25zJyxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuTnVtZXJpYyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dCxcbiAgICAgICAgaWRlbnRpZmllcjogJ09wZW5CYW5raW5nVHJhbnNhY3Rpb25zRGF0YScsXG4gICAgICAgIHRpdGxlOiAnVHJhbnNhY3Rpb25zIERhdGEgKEpTT04pJyxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dEFyZWEsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgIGlkZW50aWZpZXI6ICdPcGVuQmFua2luZ1RyYW5zYWN0aW9uc1BlcmlvZCcsXG4gICAgICAgIHRpdGxlOiAnUGVyaW9kIChtb250aHMpJyxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuTnVtZXJpYyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSBhcyBDb250cm9sRGF0YVtdO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zU2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICB0aXRsZTogJ1JldHJpZXZlZCBUcmFuc2FjdGlvbnMnLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IHRyYW5zYWN0aW9uc0NvbnRyb2xzLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdSZXRyaWV2ZWQgVHJhbnNhY3Rpb25zJyksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIEFkZCBhbGwgc2VjdGlvbnMgdG8gdGhlIHN0ZXBcbiAgICBzdGVwLnNlY3Rpb25zID0gW1xuICAgICAgc3RhdHVzU2VjdGlvbixcbiAgICAgIGFjY291bnRTZWN0aW9uLFxuICAgICAgYWNjb3VudHNEYXRhU2VjdGlvbixcbiAgICAgIHRyYW5zYWN0aW9uc1NlY3Rpb24sXG4gICAgXTtcblxuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBDdXN0b20gc3RlcCB3aXRoIG5hdmlnYXRpb24gc2VjdGlvblxuICAgKi9cbiAgY3JlYXRlQ3VzdG9tU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5jdXN0b21TdGVwKSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLkN1c3RvbSxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgICB0cmFuc2xhdGlvbnM6XG4gICAgICAgIFRyYW5zbGF0aW9uc0hlbHBlci5jcmVhdGVDdXN0b21TdGVwVHJhbnNsYXRpb25zKHN1cHBvcnRlZExhbmd1YWdlcyksXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGhhc05hbWVBbmREZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIEFkZCBuYXZpZ2F0aW9uIHNlY3Rpb25cbiAgICBjb25zdCBuYXZpZ2F0aW9uU2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICB0aXRsZTogJ1NlY8ibaXVuZSBkZSBOYXZpZ2FyZScsXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogW1xuICAgICAgICB7XG4gICAgICAgICAgY2FuRWRpdDogdHJ1ZSxcbiAgICAgICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgICAgIGlzT25seUZvckNvbmZpZzogZmFsc2UsXG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLkJ1dHRvbnMsXG4gICAgICAgIH0gYXMgQ29udHJvbERhdGEsXG4gICAgICBdLFxuICAgICAgaXNOYXZpZ2F0aW9uU2VjdGlvbjogdHJ1ZSxcbiAgICAgIGlkZW50aWZpZXI6IGBTZWPIm2l1bmUgZGUgTmF2aWdhcmVfJHt0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpfWAsXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIHN0ZXAuc2VjdGlvbnMgPSBbbmF2aWdhdGlvblNlY3Rpb25dO1xuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBGaW5hbCBzdGVwXG4gICAqL1xuICBjcmVhdGVGaW5hbFN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdKTogU3RlcERhdGEge1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdzdGVwJyksXG4gICAgICBuYW1lOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXguZmluYWxTdGVwKSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLkZpbmFsLFxuICAgICAgc2VjdGlvbnM6IFtdLFxuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7fSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGhhc05hbWVBbmREZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIEZpbmFsIHN0ZXAgaXMgbGlrZSBjdXN0b20gYnV0IHdpdGhvdXQgbmF2aWdhdGlvblxuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIE1haW4gZmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFueSBzdGVwIHR5cGVcbiAgICovXG4gIGNyZWF0ZUZsdXhTdGVwKFxuICAgIHR5cGU6IEZsdXhUeXBlLFxuICAgIHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXVxuICApOiBTdGVwRGF0YSB8IG51bGwge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBGbHV4VHlwZS5LeWM6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUt5Y1N0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuRW1haWw6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNoZWNrRW1haWxTdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLlBob25lOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDaGVja1Bob25lU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXMpO1xuICAgICAgY2FzZSBGbHV4VHlwZS5TaWduOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWduU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXMpO1xuICAgICAgY2FzZSBGbHV4VHlwZS5TdGF0dXM6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YXR1c1N0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuQ3VzdG9tOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDdXN0b21TdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLlBhdXNlOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXVzZVN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuSWRTY2FuOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTY2FuU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXMpO1xuICAgICAgY2FzZSBGbHV4VHlwZS5HZW5lcmF0ZURvY3VtZW50OlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVHZW5lcmF0ZURvY3VtZW50c1N0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuQWN0aW9uOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVBY3Rpb25TdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLlVwbG9hZERvY3VtZW50OlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVVcGxvYWREb2N1bWVudFN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuRG93bmxvYWREb2N1bWVudDpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRG93bmxvYWREb2N1bWVudFN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuVmlld0RvY3VtZW50OlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVWaWV3RG9jdW1lbnRTdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLlZpZXdPZmZlcjpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmlld09mZmVyU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXMpO1xuICAgICAgY2FzZSBGbHV4VHlwZS5GaW5hbDpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRmluYWxTdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLk5FVE9QSUE6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ldG9waWFTdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLkVVUExBVEVTQzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRXVwbGF0ZXNjU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXMpO1xuICAgICAgY2FzZSBGbHV4VHlwZS5PcGVuQmFua2luZzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlT3BlbkJhbmtpbmdTdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKGBVbnN1cHBvcnRlZCBGbHV4VHlwZTogJHt0eXBlfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRvY3VtZW50IG5hbWUgYnkgSUQgZnJvbSBmb3JtIG1vZGVsXG4gICAqIFN0YXRpYyBtZXRob2QgdG8gbWF0Y2ggRmx1eEhlbHBlciB1c2FnZSBwYXR0ZXJuIGluIGZvcm1zLm1vZGVsLnRzXG4gICAqIEBwYXJhbSBkb2N1bWVudElkIC0gVGhlIGRvY3VtZW50IElEIHRvIHNlYXJjaCBmb3JcbiAgICogQHBhcmFtIGZvcm1Nb2RlbCAtIFRoZSBmb3JtIG1vZGVsIGNvbnRhaW5pbmcgZG9jdW1lbnRzIGFycmF5XG4gICAqIEByZXR1cm5zIFRoZSBkb2N1bWVudCBuYW1lIG9yIGVtcHR5IHN0cmluZyBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXREb2N1bWVudE5hbWVCeUlkKGRvY3VtZW50SWQ6IHN0cmluZywgZm9ybU1vZGVsOiBGb3JtTW9kZWwpOiBzdHJpbmcge1xuICAgIGlmICghZm9ybU1vZGVsIHx8ICFmb3JtTW9kZWwuZG9jdW1lbnRzIHx8ICFkb2N1bWVudElkKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jdW1lbnQgPSBmb3JtTW9kZWwuZG9jdW1lbnRzLmZpbmQoXG4gICAgICAoZDogQXBwRG9jdW1lbnQpID0+IGQuaWQgPT09IGRvY3VtZW50SWRcbiAgICApO1xuICAgIHJldHVybiBkb2N1bWVudD8ubmFtZSB8fCAnJztcbiAgfVxufVxuIl19
|