@sunbird-cb/tree-hierarchy 0.0.1-cbrelease-4.8.32 → 0.0.2-ang-17-20
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/fesm2022/sunbird-cb-tree-hierarchy.mjs +710 -189
- package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -1
- package/index.d.ts +1052 -3
- package/index.d.ts.map +1 -0
- package/package.json +13 -15
- package/sunbird-cb-tree-hierarchy-0.0.2-ang-17-20.tgz +0 -0
- package/esm2022/lib/components/action-bar/action-bar.component.mjs +0 -42
- package/esm2022/lib/components/approval/approval.component.mjs +0 -20
- package/esm2022/lib/components/approve-view/approve-view.component.mjs +0 -65
- package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +0 -45
- package/esm2022/lib/components/category-edit/category-edit-module/category-edit-module.component.mjs +0 -56
- package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +0 -75
- package/esm2022/lib/components/connector/connector.component.mjs +0 -60
- package/esm2022/lib/components/create-categories/create-categories.component.mjs +0 -84
- package/esm2022/lib/components/create-term/create-term.component.mjs +0 -848
- package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +0 -825
- package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +0 -224
- package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +0 -65
- package/esm2022/lib/components/term-card/term-card.component.mjs +0 -343
- package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +0 -357
- package/esm2022/lib/components/tree-view/tree-view.component.mjs +0 -862
- package/esm2022/lib/constants/app-constant.mjs +0 -40
- package/esm2022/lib/constants/data.mjs +0 -6972
- package/esm2022/lib/containers/config-framework/config-framework.component.mjs +0 -93
- package/esm2022/lib/containers/dashboard/dashboard.component.mjs +0 -15
- package/esm2022/lib/labels/strings.mjs +0 -40
- package/esm2022/lib/models/approval.model.mjs +0 -2
- package/esm2022/lib/models/connection-type.model.mjs +0 -2
- package/esm2022/lib/models/connection.model.mjs +0 -2
- package/esm2022/lib/models/framework.model.mjs +0 -2
- package/esm2022/lib/models/variable-type.model.mjs +0 -2
- package/esm2022/lib/pipes/order-by.pipe.mjs +0 -36
- package/esm2022/lib/services/approval.service.mjs +0 -48
- package/esm2022/lib/services/connection.service.mjs +0 -3
- package/esm2022/lib/services/connector.service.mjs +0 -287
- package/esm2022/lib/services/framework.service.mjs +0 -532
- package/esm2022/lib/services/local-connection.service.mjs +0 -76
- package/esm2022/lib/services/odcs.service.mjs +0 -24
- package/esm2022/lib/tree-hierarchy-routing.module.mjs +0 -44
- package/esm2022/lib/tree-hierarchy.component.mjs +0 -25
- package/esm2022/lib/tree-hierarchy.module.mjs +0 -146
- package/esm2022/lib/tree-hierarchy.service.mjs +0 -62
- package/esm2022/material.module.mjs +0 -200
- package/esm2022/public-api.mjs +0 -9
- package/esm2022/sunbird-cb-tree-hierarchy.mjs +0 -2
- package/lib/components/action-bar/action-bar.component.d.ts +0 -17
- package/lib/components/action-bar/action-bar.component.d.ts.map +0 -1
- package/lib/components/approval/approval.component.d.ts +0 -10
- package/lib/components/approval/approval.component.d.ts.map +0 -1
- package/lib/components/approve-view/approve-view.component.d.ts +0 -27
- package/lib/components/approve-view/approve-view.component.d.ts.map +0 -1
- package/lib/components/categories-preview/categories-preview.component.d.ts +0 -14
- package/lib/components/categories-preview/categories-preview.component.d.ts.map +0 -1
- package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts +0 -18
- package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts.map +0 -1
- package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts +0 -20
- package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts.map +0 -1
- package/lib/components/connector/connector.component.d.ts +0 -23
- package/lib/components/connector/connector.component.d.ts.map +0 -1
- package/lib/components/create-categories/create-categories.component.d.ts +0 -26
- package/lib/components/create-categories/create-categories.component.d.ts.map +0 -1
- package/lib/components/create-term/create-term.component.d.ts +0 -148
- package/lib/components/create-term/create-term.component.d.ts.map +0 -1
- package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts +0 -105
- package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts.map +0 -1
- package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +0 -46
- package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +0 -1
- package/lib/components/pending-approval/pending-approval.component.d.ts +0 -21
- package/lib/components/pending-approval/pending-approval.component.d.ts.map +0 -1
- package/lib/components/term-card/term-card.component.d.ts +0 -54
- package/lib/components/term-card/term-card.component.d.ts.map +0 -1
- package/lib/components/tree-column-view/tree-column-view.component.d.ts +0 -57
- package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +0 -1
- package/lib/components/tree-view/tree-view.component.d.ts +0 -103
- package/lib/components/tree-view/tree-view.component.d.ts.map +0 -1
- package/lib/constants/app-constant.d.ts +0 -44
- package/lib/constants/app-constant.d.ts.map +0 -1
- package/lib/constants/data.d.ts +0 -117
- package/lib/constants/data.d.ts.map +0 -1
- package/lib/containers/config-framework/config-framework.component.d.ts +0 -32
- package/lib/containers/config-framework/config-framework.component.d.ts.map +0 -1
- package/lib/containers/dashboard/dashboard.component.d.ts +0 -9
- package/lib/containers/dashboard/dashboard.component.d.ts.map +0 -1
- package/lib/labels/strings.d.ts +0 -40
- package/lib/labels/strings.d.ts.map +0 -1
- package/lib/models/approval.model.d.ts +0 -11
- package/lib/models/approval.model.d.ts.map +0 -1
- package/lib/models/connection-type.model.d.ts +0 -6
- package/lib/models/connection-type.model.d.ts.map +0 -1
- package/lib/models/connection.model.d.ts +0 -7
- package/lib/models/connection.model.d.ts.map +0 -1
- package/lib/models/framework.model.d.ts +0 -89
- package/lib/models/framework.model.d.ts.map +0 -1
- package/lib/models/variable-type.model.d.ts +0 -46
- package/lib/models/variable-type.model.d.ts.map +0 -1
- package/lib/pipes/order-by.pipe.d.ts +0 -10
- package/lib/pipes/order-by.pipe.d.ts.map +0 -1
- package/lib/services/approval.service.d.ts +0 -21
- package/lib/services/approval.service.d.ts.map +0 -1
- package/lib/services/connection.service.d.ts +0 -4
- package/lib/services/connection.service.d.ts.map +0 -1
- package/lib/services/connector.service.d.ts +0 -18
- package/lib/services/connector.service.d.ts.map +0 -1
- package/lib/services/framework.service.d.ts +0 -89
- package/lib/services/framework.service.d.ts.map +0 -1
- package/lib/services/local-connection.service.d.ts +0 -18
- package/lib/services/local-connection.service.d.ts.map +0 -1
- package/lib/services/odcs.service.d.ts +0 -11
- package/lib/services/odcs.service.d.ts.map +0 -1
- package/lib/tree-hierarchy-routing.module.d.ts +0 -8
- package/lib/tree-hierarchy-routing.module.d.ts.map +0 -1
- package/lib/tree-hierarchy.component.d.ts +0 -13
- package/lib/tree-hierarchy.component.d.ts.map +0 -1
- package/lib/tree-hierarchy.module.d.ts +0 -33
- package/lib/tree-hierarchy.module.d.ts.map +0 -1
- package/lib/tree-hierarchy.service.d.ts +0 -22
- package/lib/tree-hierarchy.service.d.ts.map +0 -1
- package/material.module.d.ts +0 -52
- package/material.module.d.ts.map +0 -1
- package/public-api.d.ts +0 -9
- package/public-api.d.ts.map +0 -1
- package/sunbird-cb-tree-hierarchy.d.ts.map +0 -1
package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs
DELETED
|
@@ -1,825 +0,0 @@
|
|
|
1
|
-
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { Validators } from '@angular/forms';
|
|
3
|
-
import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
|
|
4
|
-
import { labels } from '../../labels/strings';
|
|
5
|
-
import * as appConstants from '../../constants/app-constant';
|
|
6
|
-
import _ from 'lodash';
|
|
7
|
-
import { ConforamtionPopupComponent } from '../conforamtion-popup/conforamtion-popup.component';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/material/legacy-dialog";
|
|
10
|
-
import * as i2 from "../../services/framework.service";
|
|
11
|
-
import * as i3 from "@angular/forms";
|
|
12
|
-
import * as i4 from "@angular/material/legacy-snack-bar";
|
|
13
|
-
import * as i5 from "@angular/common";
|
|
14
|
-
import * as i6 from "@angular/material/core";
|
|
15
|
-
import * as i7 from "@angular/material/button";
|
|
16
|
-
import * as i8 from "@angular/material/legacy-chips";
|
|
17
|
-
import * as i9 from "@angular/material/dialog";
|
|
18
|
-
import * as i10 from "@angular/material/expansion";
|
|
19
|
-
import * as i11 from "@angular/material/icon";
|
|
20
|
-
import * as i12 from "@angular/material/input";
|
|
21
|
-
import * as i13 from "@angular/material/form-field";
|
|
22
|
-
import * as i14 from "@angular/material/menu";
|
|
23
|
-
import * as i15 from "@angular/material/progress-spinner";
|
|
24
|
-
import * as i16 from "@angular/material/radio";
|
|
25
|
-
import * as i17 from "@angular/material/select";
|
|
26
|
-
import * as i18 from "@angular/material/chips";
|
|
27
|
-
class CreateTermFromFrameworkComponent {
|
|
28
|
-
constructor(dialogRef, data, dialog, frameWorkService, fb, _snackBar) {
|
|
29
|
-
this.dialogRef = dialogRef;
|
|
30
|
-
this.data = data;
|
|
31
|
-
this.dialog = dialog;
|
|
32
|
-
this.frameWorkService = frameWorkService;
|
|
33
|
-
this.fb = fb;
|
|
34
|
-
this._snackBar = _snackBar;
|
|
35
|
-
this.app_strings = labels;
|
|
36
|
-
this.selectedTerm = {};
|
|
37
|
-
this.selectedTermArray = [];
|
|
38
|
-
this.isTermExist = false;
|
|
39
|
-
this.disableCreate = false;
|
|
40
|
-
this.disableMultiCreate = false;
|
|
41
|
-
this.disableUpdate = false;
|
|
42
|
-
this.kcmList = new Map();
|
|
43
|
-
this.allCompetency = [];
|
|
44
|
-
this.allCompetencyTheme = [];
|
|
45
|
-
this.filteredallCompetencyTheme = [];
|
|
46
|
-
this.allCompetencySubtheme = [];
|
|
47
|
-
this.filteredallCompetencySubTheme = [];
|
|
48
|
-
}
|
|
49
|
-
ngOnInit() {
|
|
50
|
-
this.environment = this.frameWorkService.getEnviroment();
|
|
51
|
-
this.getComptencyData();
|
|
52
|
-
this.kcmConfigData = this.frameWorkService.getConfigByFrameWorkId(this.environment.kcmFrameworkName);
|
|
53
|
-
this.competencyForm = this.fb.group({
|
|
54
|
-
compArea: ['', Validators.required],
|
|
55
|
-
compThemeFields: this.fb.array([this.createCompThemeFields()])
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
getComptencyData() {
|
|
59
|
-
this.frameWorkService.getFrameworkRead(this.environment.kcmFrameworkName).subscribe((data) => {
|
|
60
|
-
if (data.categories) {
|
|
61
|
-
this.formateData(data, this.environment.kcmFrameworkName);
|
|
62
|
-
this.selectedCardCompThemeData = '';
|
|
63
|
-
if (this.data && this.data.selectedParentTerms) {
|
|
64
|
-
this.data.selectedParentTerms.forEach((ele) => {
|
|
65
|
-
if (ele.category === "competency") {
|
|
66
|
-
this.selectedCardCompThemeData = ele;
|
|
67
|
-
let option = this.selectedCardCompThemeData.additionalProperties.competencyArea;
|
|
68
|
-
this.onSelectionArea(option);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}, ((_err) => {
|
|
74
|
-
this._snackBar.open(`KCM Framework read failed.`);
|
|
75
|
-
}));
|
|
76
|
-
}
|
|
77
|
-
formateData(response, frameworkId) {
|
|
78
|
-
(response.categories).forEach((a) => {
|
|
79
|
-
if (a.code !== undefined) {
|
|
80
|
-
this.kcmList.set(a.code, {
|
|
81
|
-
code: a.code,
|
|
82
|
-
identifier: a.identifier,
|
|
83
|
-
index: a.index,
|
|
84
|
-
name: a.name,
|
|
85
|
-
description: a.description,
|
|
86
|
-
config: this.frameWorkService.getConfigOfCategoryConfigByFrameWorkId(a.code, frameworkId),
|
|
87
|
-
children: (a.terms || []).map((c) => {
|
|
88
|
-
const associations = c.associations || [];
|
|
89
|
-
if (associations.length > 0) {
|
|
90
|
-
Object.assign(c, { children: associations });
|
|
91
|
-
}
|
|
92
|
-
return c;
|
|
93
|
-
})
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
this.kcmList.forEach((a) => {
|
|
98
|
-
if (a.code === _.get(this.kcmConfigData, 'config[0].category')) {
|
|
99
|
-
this.competencyArea = a;
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
createCompThemeFields() {
|
|
104
|
-
return this.fb.group({
|
|
105
|
-
competencyTheme: ['', [Validators.required]],
|
|
106
|
-
competencySubTheme: ['', [Validators.required]]
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
getCreateName(data) {
|
|
110
|
-
let popUpCategory = data.cardColInfo ? data.cardColInfo.name : data.columnInfo.name;
|
|
111
|
-
switch (popUpCategory) {
|
|
112
|
-
case 'Designation':
|
|
113
|
-
return `Create Competency Mapping`;
|
|
114
|
-
case 'Sub Theme':
|
|
115
|
-
if (data.openMode === 'view') {
|
|
116
|
-
return `View Competency ${popUpCategory}`;
|
|
117
|
-
}
|
|
118
|
-
return `Add Competency ${popUpCategory}`;
|
|
119
|
-
case 'Competency':
|
|
120
|
-
if (data.openMode === 'edit') {
|
|
121
|
-
return `Edit Competency Theme`;
|
|
122
|
-
}
|
|
123
|
-
else if (data.openMode === 'view') {
|
|
124
|
-
return `View Competency Theme`;
|
|
125
|
-
}
|
|
126
|
-
return `Create Competency Mapping`;
|
|
127
|
-
default: return '';
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
clearSelectedThemes(option) {
|
|
131
|
-
if (this.isThemeSelected) {
|
|
132
|
-
this.openConforamtionPopup(option);
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
this.onSelectionArea(option);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
get isThemeSelected() {
|
|
139
|
-
let hasValue = false;
|
|
140
|
-
if (this.competencyForm) {
|
|
141
|
-
const compThemeFields = this.competencyForm.get('compThemeFields');
|
|
142
|
-
if (compThemeFields) {
|
|
143
|
-
compThemeFields.controls.forEach((element) => {
|
|
144
|
-
if (element.get('competencyTheme')?.value || element.get('competencySubTheme')?.value) {
|
|
145
|
-
hasValue = true;
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return hasValue;
|
|
151
|
-
}
|
|
152
|
-
openConforamtionPopup(option) {
|
|
153
|
-
const dialogData = {
|
|
154
|
-
dialogType: 'warning',
|
|
155
|
-
descriptions: [
|
|
156
|
-
{
|
|
157
|
-
header: 'Are you sure you want to alter the competency area?',
|
|
158
|
-
headerClass: 'flex items-center justify-center text-blue textBold',
|
|
159
|
-
messages: [
|
|
160
|
-
{
|
|
161
|
-
msgClass: '',
|
|
162
|
-
msg: `This action will result in the loss of your currently added data`,
|
|
163
|
-
},
|
|
164
|
-
],
|
|
165
|
-
},
|
|
166
|
-
],
|
|
167
|
-
footerClass: 'items-center justify-center',
|
|
168
|
-
buttons: [
|
|
169
|
-
{
|
|
170
|
-
btnText: 'Cancel',
|
|
171
|
-
btnClass: 'btn-outline',
|
|
172
|
-
response: false,
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
btnText: 'Confirm',
|
|
176
|
-
btnClass: 'btn-full-success',
|
|
177
|
-
response: true,
|
|
178
|
-
},
|
|
179
|
-
],
|
|
180
|
-
};
|
|
181
|
-
const dialogRef = this.dialog.open(ConforamtionPopupComponent, {
|
|
182
|
-
data: dialogData,
|
|
183
|
-
autoFocus: false,
|
|
184
|
-
width: '600px',
|
|
185
|
-
maxWidth: '80vw',
|
|
186
|
-
maxHeight: '90vh',
|
|
187
|
-
disableClose: true,
|
|
188
|
-
});
|
|
189
|
-
dialogRef.afterClosed().subscribe((res) => {
|
|
190
|
-
if (res) {
|
|
191
|
-
this.onSelectionArea(option);
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
const compAreaControl = this.competencyForm.get('compArea');
|
|
195
|
-
if (compAreaControl) {
|
|
196
|
-
compAreaControl.setValue(this.seletedCompetencyArea);
|
|
197
|
-
compAreaControl.updateValueAndValidity();
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
onSelectionArea(option) {
|
|
203
|
-
this.competencyForm.reset();
|
|
204
|
-
while (this.compThemeFields.length !== 0) {
|
|
205
|
-
this.compThemeFields.removeAt(0);
|
|
206
|
-
}
|
|
207
|
-
this.compThemeFields.push(this.createCompThemeFields());
|
|
208
|
-
if ('theme' === this.kcmConfigData.config[1].category) {
|
|
209
|
-
this.seletedCompetencyArea = option;
|
|
210
|
-
const compAreaControl = this.competencyForm.get('compArea');
|
|
211
|
-
if (compAreaControl) {
|
|
212
|
-
compAreaControl.patchValue(option);
|
|
213
|
-
compAreaControl.updateValueAndValidity();
|
|
214
|
-
}
|
|
215
|
-
this.filteredallCompetencyTheme = [];
|
|
216
|
-
this.allCompetencyTheme = [];
|
|
217
|
-
if (option && option.children && option.children.length) {
|
|
218
|
-
let themeValue = this.kcmList.get(this.kcmConfigData.config[1].category);
|
|
219
|
-
option.children.forEach((ele) => {
|
|
220
|
-
if (ele.category === 'theme') {
|
|
221
|
-
let result = themeValue.children.findIndex((themeData) => {
|
|
222
|
-
if (ele.refId === themeData.refId) {
|
|
223
|
-
return themeData.children && themeData.children.length;
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
if (result >= 0) {
|
|
227
|
-
this.allCompetencyTheme.push(ele);
|
|
228
|
-
this.filteredallCompetencyTheme.push(ele);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
if (this.competencyArea && this.competencyArea.children) {
|
|
235
|
-
this.competencyArea.children.forEach((element) => {
|
|
236
|
-
if (element.code === option.code) {
|
|
237
|
-
this.seletedCompetencyArea = option;
|
|
238
|
-
if (element.children && element.children.length) {
|
|
239
|
-
element.children.forEach((ele) => {
|
|
240
|
-
if (ele.category === 'theme') {
|
|
241
|
-
this.allCompetencyTheme.push(ele);
|
|
242
|
-
this.filteredallCompetencyTheme.push(ele);
|
|
243
|
-
if (this.selectedCardCompThemeData.refId.toLowerCase() === ele.refId.toLowerCase()) {
|
|
244
|
-
let formArray = this.competencyForm.get('compThemeFields');
|
|
245
|
-
formArray.at(0).get('competencyTheme').patchValue(ele);
|
|
246
|
-
formArray.at(0).get('competencyTheme').updateValueAndValidity();
|
|
247
|
-
const compAreaControl = this.competencyForm.get('compArea');
|
|
248
|
-
if (compAreaControl) {
|
|
249
|
-
compAreaControl.patchValue(option);
|
|
250
|
-
compAreaControl.updateValueAndValidity();
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
addCompetencyTheme() {
|
|
263
|
-
if (this.data.mode === 'multi-create') {
|
|
264
|
-
this.compThemeFields.insert(0, this.createCompThemeFields());
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
removeCompFields(index) {
|
|
268
|
-
if (this.data.mode === 'multi-create') {
|
|
269
|
-
this.compThemeFields.removeAt(index);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
OnThemeSelection(event, _indexValue, optionData) {
|
|
273
|
-
const selectedTheme = event.source.value;
|
|
274
|
-
this.kcmList.forEach((ele) => {
|
|
275
|
-
if (selectedTheme.category === ele.code) {
|
|
276
|
-
if (ele.children && ele.children.length) {
|
|
277
|
-
ele.children.forEach((themeChild) => {
|
|
278
|
-
if (themeChild.identifier === selectedTheme.identifier) {
|
|
279
|
-
if (themeChild.children && themeChild.children.length) {
|
|
280
|
-
optionData['children'] = themeChild.children;
|
|
281
|
-
this.filteredallCompetencySubTheme = themeChild.children;
|
|
282
|
-
let matchedData = [];
|
|
283
|
-
if (this.data.childrenData && this.data.childrenData.category === "subtheme") {
|
|
284
|
-
matchedData = _.intersectionBy(themeChild.children, [this.data.childrenData], 'refId');
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
matchedData = _.intersectionBy(themeChild.children, this.selectedCardCompThemeData.children, 'refId');
|
|
288
|
-
}
|
|
289
|
-
let formArray = this.competencyForm.get('compThemeFields');
|
|
290
|
-
const competencySubThemeControl = formArray.at(_indexValue).get('competencySubTheme');
|
|
291
|
-
if (competencySubThemeControl) {
|
|
292
|
-
competencySubThemeControl.patchValue(matchedData);
|
|
293
|
-
competencySubThemeControl.updateValueAndValidity();
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
onTermRemove(termData, indexValue) {
|
|
303
|
-
let formArray = this.competencyForm.get('compThemeFields');
|
|
304
|
-
const compThemeControl = formArray.at(indexValue).get('competencySubTheme');
|
|
305
|
-
if (compThemeControl) {
|
|
306
|
-
const themes = compThemeControl.value;
|
|
307
|
-
if (themes) {
|
|
308
|
-
const index = themes.indexOf(termData);
|
|
309
|
-
if (index >= 0) {
|
|
310
|
-
themes.splice(index, 1);
|
|
311
|
-
compThemeControl.setValue(themes);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
OnSubThemeSelection(_event, _indexValue, _option) {
|
|
317
|
-
}
|
|
318
|
-
async multiCreate(form, _data) {
|
|
319
|
-
this.disableMultiCreate = true;
|
|
320
|
-
let counterSubTheme = 0;
|
|
321
|
-
let parentCategory = {};
|
|
322
|
-
let createdTerms = [];
|
|
323
|
-
let createdSubTheme = [];
|
|
324
|
-
if (form.valid) {
|
|
325
|
-
const themeFields = form && form.value && form.value.compThemeFields;
|
|
326
|
-
if (themeFields && themeFields.length) {
|
|
327
|
-
let localCompArea = { ...this.seletedCompetencyArea };
|
|
328
|
-
if (localCompArea.children && localCompArea.children.length) {
|
|
329
|
-
delete localCompArea.children;
|
|
330
|
-
}
|
|
331
|
-
if (localCompArea.associations && localCompArea.associations.length) {
|
|
332
|
-
delete localCompArea.associations;
|
|
333
|
-
}
|
|
334
|
-
for (let [index, objVal] of themeFields.entries()) {
|
|
335
|
-
parentCategory = {};
|
|
336
|
-
if (objVal['competencyTheme']) {
|
|
337
|
-
createdTerms = [];
|
|
338
|
-
let value = objVal['competencyTheme'];
|
|
339
|
-
const term = {
|
|
340
|
-
code: this.frameWorkService.getUuid(),
|
|
341
|
-
name: value.name,
|
|
342
|
-
description: value.description,
|
|
343
|
-
category: this.data.columnInfo.code,
|
|
344
|
-
status: appConstants.LIVE,
|
|
345
|
-
refId: value.refId || '',
|
|
346
|
-
refType: value.refType || '',
|
|
347
|
-
parents: [
|
|
348
|
-
{ identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.columnInfo.code}` }
|
|
349
|
-
],
|
|
350
|
-
additionalProperties: {
|
|
351
|
-
competencyArea: localCompArea,
|
|
352
|
-
timeStamp: new Date().getTime()
|
|
353
|
-
}
|
|
354
|
-
};
|
|
355
|
-
const requestBody = {
|
|
356
|
-
request: {
|
|
357
|
-
term: term
|
|
358
|
-
}
|
|
359
|
-
};
|
|
360
|
-
await this.frameWorkService.createTerm(this.data.frameworkId, this.data.columnInfo.code, requestBody).toPromise().then(async (res) => {
|
|
361
|
-
requestBody.request.term['identifier'] = res.result.node_id[0];
|
|
362
|
-
this.frameWorkService.selectionList.delete('competency');
|
|
363
|
-
parentCategory = requestBody.request.term;
|
|
364
|
-
createdTerms.push(requestBody.request.term);
|
|
365
|
-
const parentColumn = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
|
|
366
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumn.code);
|
|
367
|
-
await this.updateTermAssociationsMultiV2(createdTerms, parentCol);
|
|
368
|
-
let data = {
|
|
369
|
-
"selected": false,
|
|
370
|
-
"category": parentColumn.code,
|
|
371
|
-
"cardSubType": "minimal",
|
|
372
|
-
"isViewOnly": false,
|
|
373
|
-
"index": parentColumn.index,
|
|
374
|
-
"columnInfo": this.data.cardColInfo
|
|
375
|
-
};
|
|
376
|
-
const responseData12 = {
|
|
377
|
-
res: { term: [this.selectedTerm], created: true, multi: true },
|
|
378
|
-
index: this.data.columnInfo.index,
|
|
379
|
-
data: data,
|
|
380
|
-
type: 'multi-create'
|
|
381
|
-
};
|
|
382
|
-
this.frameWorkService.updateAfterAddOrEditSubject(responseData12);
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
if (objVal['competencySubTheme']) {
|
|
386
|
-
this.frameWorkService.selectionList.set(this.data.columnInfo.code, parentCategory);
|
|
387
|
-
let value = objVal['competencySubTheme'];
|
|
388
|
-
if (value && value.length) {
|
|
389
|
-
counterSubTheme = 0;
|
|
390
|
-
createdSubTheme = [];
|
|
391
|
-
for (let ele of value) {
|
|
392
|
-
const term = {
|
|
393
|
-
code: this.frameWorkService.getUuid(),
|
|
394
|
-
name: ele.name,
|
|
395
|
-
description: ele.description,
|
|
396
|
-
category: this.data.nextColInfo.code,
|
|
397
|
-
status: appConstants.LIVE,
|
|
398
|
-
refId: ele.refId || '',
|
|
399
|
-
refType: ele.refType || '',
|
|
400
|
-
parents: [
|
|
401
|
-
{ identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.nextColInfo.code}` }
|
|
402
|
-
],
|
|
403
|
-
additionalProperties: {
|
|
404
|
-
timeStamp: new Date().getTime()
|
|
405
|
-
}
|
|
406
|
-
};
|
|
407
|
-
const requestBody = {
|
|
408
|
-
request: {
|
|
409
|
-
term: term
|
|
410
|
-
}
|
|
411
|
-
};
|
|
412
|
-
let responseData = await this.crateTerm(this.data.frameworkId, this.data.nextColInfo.code, requestBody);
|
|
413
|
-
requestBody.request.term['identifier'] = responseData.result.node_id[0];
|
|
414
|
-
createdSubTheme.push(requestBody.request.term);
|
|
415
|
-
counterSubTheme++;
|
|
416
|
-
if ((counterSubTheme === objVal['competencySubTheme'].length)) {
|
|
417
|
-
const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.nextColInfo.code);
|
|
418
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
|
|
419
|
-
await this.updateTermAssociationsMultiV2(createdSubTheme, parentCol, index, themeFields.length);
|
|
420
|
-
if (index === themeFields.length - 1) {
|
|
421
|
-
this.frameWorkService.selectionList.delete('competency');
|
|
422
|
-
this.dialogClose({ term: this.selectedTermArray, created: true, multi: false, callUpdate: false });
|
|
423
|
-
this.disableMultiCreate = false;
|
|
424
|
-
this._snackBar.open(`Competency Mapping created successfully.`);
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
async crateTerm(frameworkId, colCode, requestBody) {
|
|
435
|
-
return new Promise(async (resolve) => {
|
|
436
|
-
this.frameWorkService.createTerm(frameworkId, colCode, requestBody).subscribe((res) => {
|
|
437
|
-
resolve(res);
|
|
438
|
-
}, ((_err) => {
|
|
439
|
-
this._snackBar.open(`Create Term failed.`);
|
|
440
|
-
}));
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
async updateTermAssociationsMultiV2(createdTerms, parentSelectedTerm, _runningIndex, _themFieldsLength) {
|
|
444
|
-
if (createdTerms && createdTerms.length) {
|
|
445
|
-
this.selectedTermArray = [];
|
|
446
|
-
let createdTermsIdentifiers = [];
|
|
447
|
-
this.selectedTermArray = createdTerms;
|
|
448
|
-
this.selectedTerm = createdTerms[createdTerms.length - 1];
|
|
449
|
-
for (let createdTerm of createdTerms) {
|
|
450
|
-
createdTermsIdentifiers.push({ identifier: createdTerm.identifier });
|
|
451
|
-
}
|
|
452
|
-
let associations = [];
|
|
453
|
-
let counter = 0;
|
|
454
|
-
if (!parentSelectedTerm) {
|
|
455
|
-
for (const [value] of this.frameWorkService.selectionList) {
|
|
456
|
-
const parent = value;
|
|
457
|
-
counter++;
|
|
458
|
-
associations = parent.children ? parent.children.map((c) => {
|
|
459
|
-
return c.identifier ? { identifier: c.identifier } : null;
|
|
460
|
-
}) : [];
|
|
461
|
-
associations = [...associations, ...createdTermsIdentifiers];
|
|
462
|
-
this.isTermExist = false;
|
|
463
|
-
const reguestBody = {
|
|
464
|
-
request: {
|
|
465
|
-
term: {
|
|
466
|
-
...(associations && associations.length) ? { associations: [...associations] } : null,
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
};
|
|
470
|
-
await this.callUpdateAssociationsV2(counter, parent, reguestBody);
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
else {
|
|
474
|
-
const parent = parentSelectedTerm;
|
|
475
|
-
associations = parent.children ? parent.children.map((c) => {
|
|
476
|
-
return c.identifier ? { identifier: c.identifier } : null;
|
|
477
|
-
}) : [];
|
|
478
|
-
associations = [...associations, ...createdTermsIdentifiers];
|
|
479
|
-
this.isTermExist = false;
|
|
480
|
-
const reguestBody = {
|
|
481
|
-
request: {
|
|
482
|
-
term: {
|
|
483
|
-
...(associations && associations.length) ? { associations: [...associations] } : null,
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
};
|
|
487
|
-
return await this.callUpdateAssociationsV2(counter, parent, reguestBody);
|
|
488
|
-
this.disableMultiCreate = false;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
async updateTermAssociationsMulti(createdTerms) {
|
|
493
|
-
if (createdTerms && createdTerms.length) {
|
|
494
|
-
for (let createdTerm of createdTerms) {
|
|
495
|
-
this.selectedTerm = createdTerm;
|
|
496
|
-
let associations = [];
|
|
497
|
-
let temp;
|
|
498
|
-
let counter = 0;
|
|
499
|
-
for (const [value] of this.frameWorkService.selectionList) {
|
|
500
|
-
const parent = value;
|
|
501
|
-
counter++;
|
|
502
|
-
temp = parent.children ? parent.children.filter((child) => child.identifier === this.selectedTerm.identifier) : null;
|
|
503
|
-
associations = parent.children ? parent.children.map((c) => {
|
|
504
|
-
return c.identifier ? { identifier: c.identifier } : null;
|
|
505
|
-
}) : [];
|
|
506
|
-
if (temp && temp.length) {
|
|
507
|
-
this.isTermExist = true;
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
|
-
else {
|
|
511
|
-
associations.push({ identifier: this.selectedTerm.identifier });
|
|
512
|
-
this.isTermExist = false;
|
|
513
|
-
const reguestBody = {
|
|
514
|
-
request: {
|
|
515
|
-
term: {
|
|
516
|
-
...(associations && associations.length) ? { associations: [...associations] } : null,
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
};
|
|
520
|
-
await this.callUpdateAssociations(counter, parent, reguestBody);
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
async callUpdateAssociationsV2(counter, parent, reguestBody) {
|
|
527
|
-
return new Promise(async (resolve) => {
|
|
528
|
-
this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(async () => {
|
|
529
|
-
parent['children'] = parent && parent.children ? [...parent.children, ...this.selectedTermArray] : this.selectedTermArray;
|
|
530
|
-
let listData = this.frameWorkService.list.get(this.data.columnInfo.code);
|
|
531
|
-
let differenceData = [];
|
|
532
|
-
if (listData && listData.children && listData.children.length) {
|
|
533
|
-
differenceData = _.differenceBy(this.selectedTermArray, listData.children, 'identifier');
|
|
534
|
-
}
|
|
535
|
-
else {
|
|
536
|
-
differenceData = this.selectedTermArray;
|
|
537
|
-
}
|
|
538
|
-
listData['associations'] = listData && listData.associations ? [...listData.associations, ...differenceData] : differenceData;
|
|
539
|
-
listData['children'] = listData && listData.children ? [...listData.children, ...differenceData] : differenceData;
|
|
540
|
-
this.frameWorkService.selectionList.forEach((selectedData) => {
|
|
541
|
-
let listData = this.frameWorkService.list.get(selectedData.category);
|
|
542
|
-
if (listData && listData.children && listData.children.length) {
|
|
543
|
-
this.updateLocalList(listData, parent, this.selectedTermArray);
|
|
544
|
-
}
|
|
545
|
-
});
|
|
546
|
-
if (counter === this.frameWorkService.selectionList.size) {
|
|
547
|
-
this.disableUpdate = false;
|
|
548
|
-
let returnValue = true;
|
|
549
|
-
resolve(true);
|
|
550
|
-
await returnValue;
|
|
551
|
-
}
|
|
552
|
-
else {
|
|
553
|
-
let returnValue = true;
|
|
554
|
-
resolve(true);
|
|
555
|
-
await returnValue;
|
|
556
|
-
}
|
|
557
|
-
}, (_err) => {
|
|
558
|
-
console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
|
|
559
|
-
this._snackBar.open(`Term Association failed.`);
|
|
560
|
-
this.disableMultiCreate = false;
|
|
561
|
-
});
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
async callUpdateAssociations(counter, parent, reguestBody) {
|
|
565
|
-
return new Promise(async (resolve) => {
|
|
566
|
-
this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(async () => {
|
|
567
|
-
if (counter === this.frameWorkService.selectionList.size) {
|
|
568
|
-
const found = parent.children ? parent.children.find((c) => c.identifier === this.selectedTerm.identifier) : false;
|
|
569
|
-
if (!found) {
|
|
570
|
-
parent.children ? parent.children.push(this.selectedTerm) : parent['children'] = [this.selectedTerm];
|
|
571
|
-
}
|
|
572
|
-
this.disableUpdate = false;
|
|
573
|
-
let returnValue = true;
|
|
574
|
-
resolve(true);
|
|
575
|
-
await returnValue;
|
|
576
|
-
}
|
|
577
|
-
else {
|
|
578
|
-
let returnValue = true;
|
|
579
|
-
resolve(true);
|
|
580
|
-
await returnValue;
|
|
581
|
-
}
|
|
582
|
-
}, (_err) => {
|
|
583
|
-
console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
|
|
584
|
-
});
|
|
585
|
-
});
|
|
586
|
-
}
|
|
587
|
-
updateTermData(form, data) {
|
|
588
|
-
this.disableUpdate = true;
|
|
589
|
-
const formData = {
|
|
590
|
-
...form.value
|
|
591
|
-
};
|
|
592
|
-
const updateData = {
|
|
593
|
-
formData,
|
|
594
|
-
updateTermData: data.childrenData
|
|
595
|
-
};
|
|
596
|
-
this.updateTermAssociations(updateData);
|
|
597
|
-
}
|
|
598
|
-
updateTermAssociations(updateData) {
|
|
599
|
-
let associations = [];
|
|
600
|
-
let temp;
|
|
601
|
-
let counter = 0;
|
|
602
|
-
this.frameWorkService.selectionList.forEach((parent) => {
|
|
603
|
-
counter++;
|
|
604
|
-
temp = parent.children ? parent.children.filter((child) => child.identifier === this.selectedTerm.identifier) : null;
|
|
605
|
-
associations = parent.children ? parent.children.map((c) => {
|
|
606
|
-
return c.identifier ? { identifier: c.identifier } : null;
|
|
607
|
-
}) : [];
|
|
608
|
-
if (temp && temp.length) {
|
|
609
|
-
this.isTermExist = true;
|
|
610
|
-
return;
|
|
611
|
-
}
|
|
612
|
-
else {
|
|
613
|
-
if (this.selectedTerm && this.selectedTerm.identifier) {
|
|
614
|
-
associations.push({ identifier: this.selectedTerm.identifier });
|
|
615
|
-
}
|
|
616
|
-
this.isTermExist = false;
|
|
617
|
-
const reguestBody = {
|
|
618
|
-
request: {
|
|
619
|
-
term: {
|
|
620
|
-
...(updateData && updateData.formData && updateData.updateTermData.code === parent.code) ? { ...updateData.formData } : null,
|
|
621
|
-
...(associations && associations.length) ? { associations: [...associations] } : null,
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
};
|
|
625
|
-
this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(() => {
|
|
626
|
-
if (counter === this.frameWorkService.selectionList.size) {
|
|
627
|
-
const value = (this.selectedTerm && this.selectedTerm.identifier) ? this.selectedTerm : (updateData) ? { ...updateData.updateTermData, ...updateData.formData } : {};
|
|
628
|
-
this.disableUpdate = false;
|
|
629
|
-
this.dialogClose({ term: { ...value }, created: true });
|
|
630
|
-
}
|
|
631
|
-
}, (_err) => {
|
|
632
|
-
console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
|
|
633
|
-
this._snackBar.open(`Term Association failed.`);
|
|
634
|
-
this.disableMultiCreate = false;
|
|
635
|
-
});
|
|
636
|
-
}
|
|
637
|
-
});
|
|
638
|
-
}
|
|
639
|
-
dialogClose(term) {
|
|
640
|
-
this.frameWorkService.publishFramework().subscribe(() => {
|
|
641
|
-
this.disableMultiCreate = false;
|
|
642
|
-
this.dialogRef.close(term);
|
|
643
|
-
}, (_err) => {
|
|
644
|
-
this.disableMultiCreate = false;
|
|
645
|
-
this.dialogRef.close(term);
|
|
646
|
-
this._snackBar.open(`Publish failed.`);
|
|
647
|
-
});
|
|
648
|
-
}
|
|
649
|
-
async multiCreateSubTheme(_form, data) {
|
|
650
|
-
this.disableMultiCreate = true;
|
|
651
|
-
let formArray = this.competencyForm.get('compThemeFields');
|
|
652
|
-
let selectedFormData = formArray.at(0).get('competencySubTheme').value;
|
|
653
|
-
let previousSubThemeData = data.childrenData.children;
|
|
654
|
-
let newlyAdded = [];
|
|
655
|
-
let removedExisting = [];
|
|
656
|
-
let createdSubTheme = [];
|
|
657
|
-
let counterSubTheme = 0;
|
|
658
|
-
newlyAdded = _.differenceBy(selectedFormData, previousSubThemeData, 'refId');
|
|
659
|
-
removedExisting = _.differenceBy(previousSubThemeData, selectedFormData, 'refId');
|
|
660
|
-
if (newlyAdded && newlyAdded.length) {
|
|
661
|
-
for (let val of newlyAdded) {
|
|
662
|
-
const term = {
|
|
663
|
-
code: this.frameWorkService.getUuid(),
|
|
664
|
-
name: val.name,
|
|
665
|
-
description: val.description,
|
|
666
|
-
category: this.data.columnInfo.code,
|
|
667
|
-
status: appConstants.LIVE,
|
|
668
|
-
refId: val.refId,
|
|
669
|
-
refType: val.refType,
|
|
670
|
-
parents: [
|
|
671
|
-
{ identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.columnInfo.code}` }
|
|
672
|
-
],
|
|
673
|
-
additionalProperties: {
|
|
674
|
-
timeStamp: new Date().getTime()
|
|
675
|
-
}
|
|
676
|
-
};
|
|
677
|
-
const requestBody = {
|
|
678
|
-
request: {
|
|
679
|
-
term: term
|
|
680
|
-
}
|
|
681
|
-
};
|
|
682
|
-
const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
|
|
683
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
|
|
684
|
-
let responseData = await this.crateTerm(this.data.frameworkId, this.data.columnInfo.code, requestBody);
|
|
685
|
-
requestBody.request.term['identifier'] = responseData.result.node_id[0];
|
|
686
|
-
createdSubTheme.push(requestBody.request.term);
|
|
687
|
-
counterSubTheme++;
|
|
688
|
-
if (counterSubTheme === newlyAdded.length) {
|
|
689
|
-
await this.updateTermAssociationsMultiV2(createdSubTheme, parentCol);
|
|
690
|
-
this.frameWorkService.updateFrameworkList(this.data.columnInfo.code, parentCol, createdSubTheme, 'create');
|
|
691
|
-
if (!(removedExisting && removedExisting.length)) {
|
|
692
|
-
this.dialogClose({ term: this.selectedTermArray, created: true, multi: true, callUpdate: false });
|
|
693
|
-
this.disableMultiCreate = false;
|
|
694
|
-
this._snackBar.open(`Competency theme updated successfully.`);
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
if (removedExisting && removedExisting.length) {
|
|
700
|
-
let removedTermsCollection = [];
|
|
701
|
-
for (let removedTerm of removedExisting) {
|
|
702
|
-
removedTermsCollection.push(removedTerm.code);
|
|
703
|
-
}
|
|
704
|
-
let subThemeRequest = {
|
|
705
|
-
"request": {
|
|
706
|
-
"contentIds": removedTermsCollection
|
|
707
|
-
}
|
|
708
|
-
};
|
|
709
|
-
await this.frameWorkService.retireMultipleTerm(this.data.frameworkId, this.data.columnInfo.code, subThemeRequest).toPromise().then(async () => {
|
|
710
|
-
const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
|
|
711
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
|
|
712
|
-
const sectionListchildrenList = _.differenceWith(parentCol.children, removedExisting, (a, b) => a.identifier === b.identifier);
|
|
713
|
-
const sectionListAssociationList = _.differenceWith(parentCol.associations, removedExisting, (a, b) => a.identifier === b.identifier);
|
|
714
|
-
parentCol['children'] = sectionListchildrenList;
|
|
715
|
-
parentCol['associations'] = sectionListAssociationList;
|
|
716
|
-
this.frameWorkService.updateFrameworkList(this.data.columnInfo.code, parentCol, removedExisting, 'delete');
|
|
717
|
-
this.dialogClose({ term: [], created: true, multi: true, callUpdate: false });
|
|
718
|
-
this.frameWorkService.currentSelection.next({ type: parentColumnConfigData.code, data: parentCol, cardRef: parentCol.cardRef });
|
|
719
|
-
this.disableMultiCreate = false;
|
|
720
|
-
this._snackBar.open(`Competency theme updated successfully.`);
|
|
721
|
-
});
|
|
722
|
-
}
|
|
723
|
-
this.disableMultiCreate = false;
|
|
724
|
-
}
|
|
725
|
-
onDisableTheme(option) {
|
|
726
|
-
const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
|
|
727
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
|
|
728
|
-
let result = -1;
|
|
729
|
-
if (parentCol && parentCol.children && parentCol.children.length) {
|
|
730
|
-
result = parentCol.children.findIndex((ele) => {
|
|
731
|
-
if ((ele.refType === 'theme') && (this.seletedCompetencyArea.code === ele.additionalProperties.competencyArea.code)) {
|
|
732
|
-
return ele.refId === option.refId;
|
|
733
|
-
}
|
|
734
|
-
return false;
|
|
735
|
-
});
|
|
736
|
-
}
|
|
737
|
-
if (result < 0) {
|
|
738
|
-
let formArray = this.competencyForm.get('compThemeFields');
|
|
739
|
-
result = formArray.value.findIndex((formEle) => {
|
|
740
|
-
if (formEle.competencyTheme && formEle.competencyTheme.refId) {
|
|
741
|
-
return formEle.competencyTheme.refId === option.refId;
|
|
742
|
-
}
|
|
743
|
-
return false;
|
|
744
|
-
});
|
|
745
|
-
}
|
|
746
|
-
return result >= 0 ? true : false;
|
|
747
|
-
}
|
|
748
|
-
updateLocalList(item, parent, selectedTermArray, updateType) {
|
|
749
|
-
if (item && item.children && item.children.length) {
|
|
750
|
-
if (updateType === 'delete') {
|
|
751
|
-
item.children.forEach((itmData) => {
|
|
752
|
-
if (itmData.identifier === parent.identifier) {
|
|
753
|
-
const associationList = _.differenceWith(itmData.associations, selectedTermArray, (a, b) => a.identifier === b.identifier);
|
|
754
|
-
const childrenList = _.differenceWith(itmData.children, selectedTermArray, (a, b) => a.identifier === b.identifier);
|
|
755
|
-
itmData['associations'] = associationList;
|
|
756
|
-
itmData['children'] = childrenList;
|
|
757
|
-
}
|
|
758
|
-
if (itmData.children) {
|
|
759
|
-
this.updateLocalList(itmData, parent, selectedTermArray, updateType);
|
|
760
|
-
}
|
|
761
|
-
});
|
|
762
|
-
}
|
|
763
|
-
else {
|
|
764
|
-
item.children.forEach((itmData) => {
|
|
765
|
-
if (itmData.identifier === parent.identifier) {
|
|
766
|
-
let differenceData = [];
|
|
767
|
-
if (itmData && itmData.children && itmData.children.length) {
|
|
768
|
-
differenceData = _.differenceBy(selectedTermArray, itmData.children, 'identifier');
|
|
769
|
-
}
|
|
770
|
-
else {
|
|
771
|
-
differenceData = selectedTermArray;
|
|
772
|
-
}
|
|
773
|
-
itmData['associations'] = itmData && itmData.associations ? [...itmData.associations, ...differenceData] : differenceData;
|
|
774
|
-
itmData['children'] = itmData && itmData.children ? [...itmData.children, ...differenceData] : differenceData;
|
|
775
|
-
}
|
|
776
|
-
if (itmData.children) {
|
|
777
|
-
this.updateLocalList(itmData, parent, selectedTermArray);
|
|
778
|
-
}
|
|
779
|
-
});
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
deleteTheme() {
|
|
784
|
-
this.disableMultiCreate = true;
|
|
785
|
-
const cardData = this.data.childrenData;
|
|
786
|
-
let removedListTerm = [];
|
|
787
|
-
removedListTerm.push(cardData.code);
|
|
788
|
-
let subThemeRequest = {
|
|
789
|
-
"request": {
|
|
790
|
-
"contentIds": removedListTerm
|
|
791
|
-
}
|
|
792
|
-
};
|
|
793
|
-
this.frameWorkService.retireMultipleTerm(this.frameWorkService.frameworkId, cardData.category, subThemeRequest).toPromise().then(async () => {
|
|
794
|
-
let removedExisting = [cardData];
|
|
795
|
-
const parentColumnConfigData = this.frameWorkService.getPreviousCategory(cardData.category);
|
|
796
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
|
|
797
|
-
const sectionListchildrenList = _.differenceWith(parentCol.children, removedExisting, (a, b) => a.identifier === b.identifier);
|
|
798
|
-
const sectionListAssociationList = _.differenceWith(parentCol.associations, removedExisting, (a, b) => a.identifier === b.identifier);
|
|
799
|
-
parentCol['children'] = sectionListchildrenList;
|
|
800
|
-
parentCol['associations'] = sectionListAssociationList;
|
|
801
|
-
this.frameWorkService.updateFrameworkList(cardData.category, parentCol, removedExisting, 'delete');
|
|
802
|
-
this.frameWorkService.currentSelection.next({ type: parentColumnConfigData.code, data: parentCol, cardRef: parentCol.cardRef });
|
|
803
|
-
this.dialogClose({});
|
|
804
|
-
this.disableMultiCreate = false;
|
|
805
|
-
this._snackBar.open(`Competency theme deleted successfully.`);
|
|
806
|
-
}, ((_err) => {
|
|
807
|
-
this.disableMultiCreate = false;
|
|
808
|
-
this._snackBar.open(`Competency theme delete failed.`);
|
|
809
|
-
}));
|
|
810
|
-
}
|
|
811
|
-
get compThemeFields() {
|
|
812
|
-
return this.competencyForm.get('compThemeFields');
|
|
813
|
-
}
|
|
814
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermFromFrameworkComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i1.MatLegacyDialog }, { token: i2.FrameworkService }, { token: i3.UntypedFormBuilder }, { token: i4.MatLegacySnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
815
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CreateTermFromFrameworkComponent, selector: "lib-create-term-from-framework", ngImport: i0, template: "\n<div class=\"\">\n <ng-container *ngIf=\"disableMultiCreate\">\n <div class=\"flex flex-col flex-1 w-100 absolute loader-bg items-center pt-5 text-center\">\n <mat-spinner class=\"display-inline-block mb-5\" [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n <!-- <p>{{loaderMsg}}</p> -->\n </div>\n </ng-container>\n <div class=\"dialogNew\">\n <div class=\"flex items-center justify-between\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <button type=\"button\" mat-icon-button i18n-aria-label aria-label=\"action items\"\n [matMenuTriggerFor]=\"cardMenu\" [matMenuTriggerData]=\"{'data':data}\" class=\"action-btn\">\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <ng-container *ngIf=\"term.category !== 'competency'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{frameWorkService.getConfig(term.category).labelName}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <ng-container *ngIf=\"competencyForm\">\n <form [formGroup]=\"competencyForm\">\n <div class=\"title-text\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\" aria-label=\"First name labe \">\n {{'Select Area'}}\n </label>\n <div class=\"mt-5\">\n <mat-radio-group class=\"competency-group\" aria-label=\"Select an option\" formControlName=\"compArea\">\n <mat-radio-button [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" class=\"learning-section\" [ngClass]=\"{'active-btn':item?.code === seletedCompetencyArea?.code}\"\n *ngFor=\"let item of competencyArea?.children\" [value]=\"item\" [checked]=\"item?.code === seletedCompetencyArea?.code\" (change)=\"clearSelectedThemes(item)\">{{item.name}}</mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <div class=\"flex flex-end mb-4\" >\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button type=\"button\" class=\"mat-button flex items-center create-accordion-btn\" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addCompetencyTheme()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add more\n <!-- {{data.columnInfo.name}} -->\n </button>\n </ng-container>\n </div>\n <mat-accordion formArrayName=\"compThemeFields\">\n <mat-expansion-panel *ngFor=\"let field of competencyForm?.get('compThemeFields')['controls']; let i = index; let isFirst = first\" \n class=\"margin-bottom-l comp-theme-fields\" [formGroupName]=\"i\" [expanded]=\"isFirst\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.name}} \n </mat-panel-title>\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeCompFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </ng-container>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n {{data.openMode !== 'view'? 'Select Competency Theme': 'Competency Theme Name'}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" placeholder=\"Choose the Competency Theme\" formControlName=\"competencyTheme\">\n <ng-container >\n <ng-container >\n <mat-option *ngFor=\"let option of filteredallCompetencyTheme\" [value]=\"option\" [disabled]=\"onDisableTheme(option) || data.openMode ==='view'\" \n (onSelectionChange)=\"OnThemeSelection($event, i, option)\" >{{option.name}}\n <ng-container *ngIf=\"option.refId\">\n <span class=\"ml-2 ref-id\">({{option.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n </ng-container>\n </mat-select>\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n </div>\n \n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n\n {{data.openMode !== 'view'? 'Select Competency Sub-Theme': 'Competency Sub-Theme Name'}}\n \n </label>\n <!-- <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencySubTheme\">\n <mat-option *ngFor=\"let option of filteredallCompetencySubTheme\" [value]=\"option\">{{option.name}}</mat-option>\n </mat-select>\n </mat-form-field> -->\n <!-- {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value |json}} -->\n <mat-form-field appearance=\"outline\" class=\"w-full field-height\" >\n <mat-select class=\" placeholder-text\" placeholder=\"Choose the Competency Sub-Theme\"\n formControlName=\"competencySubTheme\" multiple [disabled]=\"data.openMode ==='view'\" panelClass=\"full-width-panel\">\n <!-- [ngClass]=\"{'disbaledSelect':isHideData}\" -->\n <mat-select-trigger >\n <mat-chip-listbox>\n <!-- -->\n \n <mat-chip *ngFor=\"let item of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value\" \n (removed)=\"onTermRemove(item, i)\" [disabled]=\"data.openMode ==='view'\"\n [ngClass]=\"{'sub-theme-disable': data?.openMode ==='view'}\" [removable]=\"data?.openMode ==='view'? false: true\">\n <span >{{ item.name }}</span>\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n </mat-chip-listbox>\n </mat-select-trigger>\n <!-- {{competencyForm?.get('compThemeFields') |json}} -->\n <!-- <mat-optgroup>\n <mat-form-field floatLabel=\"never\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" (keydown.space)=\"$event.stopPropagation()\"\n formControlName=\"competencySubTheme\" matInput>\n </mat-form-field>\n </mat-optgroup> -->\n <mat-optgroup *ngIf=\"filteredallCompetencySubTheme.length === 0\">\n <div>No results found!</div>\n </mat-optgroup>\n <!-- <mat-option *ngFor=\"let option of requestObjData.preferredProvider\" [value]=\"option.providerName\">{{option.providerName}}</mat-option> -->\n <ng-container *ngFor=\"let option of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.children\">\n <mat-option \n [value]=\"option\" class=\"mat-option-list\">{{option?.name}}\n <ng-container *ngIf=\"option?.refId\">\n <span class=\"ml-2 ref-id\">({{option?.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n \n </mat-select>\n <!-- <mat-error *ngIf=\"requestForm.controls['providerText'].hasError('required')\">\n Please select up to five preferred providers for the request.\n </mat-error> -->\n </mat-form-field>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"competencyForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create' && data.openMode !=='view'\">\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(competencyForm, data)\">\n {{app_strings.create}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.columnInfo?.code === 'subtheme'\">\n <!-- <ng-container *ngIf=\"competencyForm?.get('compThemeFields')['controls'][0]['controls']?.competencySubTheme?.value?.length;else updateBtn\"> -->\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.update}}\n </button>\n <!-- </ng-container> -->\n \n <!-- <ng-template #updateBtn>\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.delete}}\n </button>\n </ng-template> -->\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(competencyForm, data)\"\n [disabled]=\"competencyForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </ng-container>\n </form>\n </ng-container>\n \n </div>\n \n \n <!-- Title of the popup -->\n <ng-template #modalTitle>\n <!-- <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{data.columnInfo.name === 'Theme' ? app_strings.addCompetency : app_strings.createNew}} {{data.columnInfo.name}}</div>\n </ng-container> -->\n <!-- {{data |json}} -->\n <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{getCreateName(data)}}</div>\n </ng-container>\n <!-- <ng-container *ngIf=\"data?.mode === 'view'\">\n <div class=\"dialog-title\" mat-dialog-title>View {{data.columnInfo.name}}</div>\n </ng-container> -->\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <div class=\"dialog-title\" mat-dialog-title>{{app_strings.edit}} {{data.columnInfo.name}}</div>\n </ng-container>\n </ng-template>\n</div>\n\n\n<mat-menu #cardMenu=\"matMenu\" class=\"menu-sec\">\n <ng-template matMenuContent let-rowData=\"data\" let-cardRef=\"cardRef\">\n <button (click)=\"deleteTheme()\"\n mat-menu-item name=\"channel-analytics-button\" class=\"ws-mat-primary-text\" i18n-aria-label\n aria-label=\"Analytics\">\n <mat-icon>delete</mat-icon>\n <span>Delete</span>\n </button>\n </ng-template>\n</mat-menu>", styles: [".gap-3{gap:1.25rem}.gap-4{gap:1.5rem}.row-divider{width:100%;border-top:1px solid rgba(0,0,0,.08);margin:1rem 0}.defaultForm{padding:16px;display:flex;gap:16px;flex-direction:column}.theme-actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:30px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialog .mat-dialog-title{padding:1em;margin-bottom:0;background:#00000014}.dialog .mat-form-field{padding:0;background:#fff;border-radius:2px}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:15px;margin-top:0;border-top:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix textarea{resize:none}.dialog .mat-form-field-disabled{background:#00000014}.dialog .actions{display:flex;flex-direction:row;justify-content:space-between;padding:0 1em 1em}.dialog .mat-error{padding:0 25px;margin-top:-10px}.dialogNew{padding:1rem}.dialogNew .mat-dialog-title{padding:1em 0;margin-bottom:0}.dialogNew .actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:16px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialogNew .mat-error{margin-top:-10px}.dialogNew .learning-section{padding:10px!important;border:1px solid rgba(0,0,0,.1803921569);border-radius:4px;margin-right:8px}.dialogNew .learning-section.active-btn{border:1px solid #1B4CA1!important}.learning-section.mat-radio-button .mat-radio-container .mat-radio-outer-circle{border-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-inner-circle{background-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#1b4ca1!important}.dialog-title{align-items:center;display:flex}.flex{display:flex}.flex-col{display:flex;flex-direction:column}.mr-5{margin-right:1.5rem}.flex-1{flex:1 1}.margin-remove-bottom{margin-bottom:0}::ng-deep .custom-dialog-container{max-height:90vh}::ng-deep .custom-dialog-container .mat-dialog-container{padding:0;border-radius:0;background:#00000014}@media only screen and (max-width: 1024px){::ng-deep .cdk-overlay-pane{width:40%!important}}@media only screen and (max-width: 992px){::ng-deep .cdk-overlay-pane{width:45%!important}}@media only screen and (max-width: 1024px){.dialog{font-size:12px}.dialog .dialog-title{font-size:24px;height:1em}.dialog button{font-size:12px;line-height:3.5em}.dialog .mat-raised-button{padding:0 3em}}.flex-align{align-items:center;justify-content:flex-start}::ng-deep mat-form-field .mat-form-field-infix .mat-form-field-label,::ng-deep mat-form-field .mat-form-field-infix .mat-select-value{line-height:normal!important}ws-widget-btn-page-back-admin{margin-left:-270px}.max-wid{max-width:400px}::ng-deep .mat-form-field.mat-focused .mat-form-field-label{color:#333232!important}.margin-right-10{margin-right:10px!important}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}::ng-deep .mat-tab-header{margin:0 3rem}.heading{color:#222}.heading.mt-10{margin-top:2.5rem!important}.img-column{flex:100px 0 0}.input-column{flex:auto}.radio-toolbar input[type=radio]{opacity:0;position:fixed;width:0}.radio-toolbar{padding:10px 0}.radio-toolbar label{display:inline-block;padding:7px 21px;font-size:14px;background:#fff 0% 0% no-repeat padding-box;border:1px solid #5F5F5F;border-radius:4px;margin:0 10px 10px 0;color:#5f5f5f;cursor:pointer;transition:all .125s ease-in-out}.radio-toolbar input[type=radio]:checked+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.radio-toolbar input[type=radio]:focus+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.mar{margin-left:30px;min-width:175px}.radio-toolbar label:hover{background:none;border-color:#0074b6;color:#0074b6}::ng-deep .mat-form-field{width:100%}::ng-deep .mat-form-field.full-width{max-width:100%}::ng-deep .mat-form-field.no-pb .mat-form-field-wrapper{padding-bottom:0}.combined-field{width:100%}.w-full-imp{width:100%!important}::ng-deep .full-width-panel{width:100%!important;min-width:300px}::ng-deep .full-width-panel .mat-option{white-space:normal}.btn-success{background-color:#0075b7!important;border-radius:4px;width:240px;box-shadow:none;margin-right:16px}.btn-success.btn-responsive{width:100%}.btn-success:disabled,.btn-success[disabled]{opacity:.6}.btn-danger{height:30px;width:30px}.color-danger{font-size:30px;height:30px;width:30px;color:#e44}::ng-deep .mat-form-field-outline{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline .mat-form-field-outline-start{border:1px solid rgba(112,112,112,.4117647059);border-radius:4px 0 0 4px;min-width:8px;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-gap{border:1px solid currentColor;border-radius:82px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-end{border:1px solid rgba(112,112,112,.4117647059);border-left-style:none;border-radius:0 4px 4px 0}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-start{border-radius:4px 0 0 4px;min-width:8px;border:1px solid currentColor;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:1px;border:1px solid currentColor;border-radius:4px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-end{border-width:1px;border-radius:0 4px 4px 0;border:1px solid currentColor;border-left-style:none}::ng-deep .mat-form-field-disabled .mat-form-field-outline{background:#ebebeb!important}::ng-deep .mat-form-field-infix{padding:0;margin:0;border:none}::ng-deep .mat-form-field-flex{min-height:40px;align-items:center}::ng-deep .mat-form-field-infix{padding:0;margin:8px 0 0;border:none}.form-label{color:#222;font-size:14px;margin-bottom:.5rem;font-weight:700;font-family:Lato}.form-input{font-size:14px;font-weight:400;font-family:Lato}input.mat-input-element{color:#5f5f5f}::ng-deep .mat-radio-group{padding-bottom:1.34375em}::ng-deep .mat-chip-list-wrapper{margin:0!important}::ng-deep .mat-chip{font-weight:400;background:#f1f9ff 0% 0% no-repeat padding-box!important;border-radius:12px!important;color:#0074b6!important}::ng-deep .mat-chip:hover{filter:brightness(90%)}::ng-deep .mat-chip .mat-chip-remove{opacity:1!important;color:#0074b6!important;border-radius:50%}::ng-deeptextarea .mat-input-element{padding:8px 0}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}::ng-deep .mat-checkbox .mat-checkbox-frame{border-radius:4px!important}::ng-deep .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:none!important}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label{font-size:18px;color:#222}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label-active .mat-tab-label-content{color:#0074b6}::ng-deep .mat-tab-label-container .mat-tab-list .mat-ink-bar{height:3px;background-color:#0074b6!important}.form-control{background:#fff 0% 0% no-repeat padding-box;border:1px solid rgba(112,112,112,.4117647059);border-radius:4px;display:block}.form-control::placeholder{color:#bebebe;font-size:14px}.form-control:focus{border:2px solid #0074b6;outline:none}.input-wrapper{flex:1;display:flex;flex-wrap:wrap;flex-direction:column}::ng-deep .mat-checkbox-inner-container{height:23px!important;width:23px!important}.flex-expand{flex:1!important}.heading{font-weight:600;font-family:Montserrat;font-size:1.25rem;display:block;padding:0px 0px 1rem 0}::ng-deep .multiselect-dropdown{margin-bottom:20px}::ng-deep .multiselect-dropdown .dropdown-btn{border:1px solid #ccc!important;width:92%!important}::ng-deep .multiselect-dropdown .dropdown-list .filter-textbox input{width:90%!important}.organisation{color:#212529;font-weight:700;font-size:14px;font-family:Lato}.org-name{height:50px;border:1px solid #e2e2e2;border-radius:5px;background-color:#ebebeb;font-size:14px}.add-designation{height:25px;color:#1b4ca1!important;font-weight:500;font-size:14px;font-family:Lato;cursor:pointer}.add-designation .add-icon{color:#1b4ca1!important;height:24px;width:24px;font-size:24px}.info-icon{width:14px;height:14px;font-size:14px;color:#a7a9ae!important}.themDesignation{max-height:90vh;overflow-y:auto}.designation-panel{margin-bottom:0!important;background-color:#eef1f7!important;border:1px solid #DBE0E9;box-shadow:none!important}.designation-panel .deletDesignation{font-size:18px;width:14px;height:14px;color:#5f6063}.designation-panel .saveDesignaton{color:#fff;height:40px;width:80px;background-color:#1b4ca1;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.designation-footer{padding:1rem;border-top:1px solid #efefef}.cancel{width:93px;height:40px;font-weight:700;font-size:14px;font-family:Lato;border:1px solid #eee;color:#363636}.addBtn{color:#fff!important;height:40px;width:80px;background-color:#1b4ca1!important;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}::ng-deep .mat-option.mat-selected:not(.mat-option-disabled){color:#000000de!important}::ng-deep .theme-igot.day-mode .mat-pseudo-checkbox-checked{background:#0074b6!important}::ng-deep .mat-select-panel .mat-option{line-height:1!important}.comp-theme-fields{background:#eef1f7!important;border:1px solid #DBE0E9!important}.create-accordion-btn{color:#1b4ca1!important;padding:0!important}.create-accordion-btn mat-icon{color:#1b4ca1}.ref-id{font-size:10px}::ng-deep .mat-select-panel{min-width:103%!important;margin-left:32px}.loader-bg{background:#ffffffcf;inset:0;transform:translate(-50% -50%);pointer-events:unset;z-index:999999;display:flex;align-items:center;justify-content:center}::ng-deep .mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.8!important;cursor:none;filter:brightness(90%)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.MatOptgroup, selector: "mat-optgroup", inputs: ["disabled"], exportAs: ["matOptgroup"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i8.MatLegacyChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i8.MatLegacyChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: i9.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i10.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i10.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i10.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i10.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i13.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i14.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i14.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i14.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i14.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i15.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i16.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i16.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i17.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i17.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i18.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "role", "id", "aria-label", "aria-description", "value", "removable", "highlighted"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i18.MatChipListbox, selector: "mat-chip-listbox", inputs: ["tabIndex", "multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "directive", type: i18.MatChipRemove, selector: "[matChipRemove]" }] }); }
|
|
816
|
-
}
|
|
817
|
-
export { CreateTermFromFrameworkComponent };
|
|
818
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermFromFrameworkComponent, decorators: [{
|
|
819
|
-
type: Component,
|
|
820
|
-
args: [{ selector: 'lib-create-term-from-framework', template: "\n<div class=\"\">\n <ng-container *ngIf=\"disableMultiCreate\">\n <div class=\"flex flex-col flex-1 w-100 absolute loader-bg items-center pt-5 text-center\">\n <mat-spinner class=\"display-inline-block mb-5\" [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n <!-- <p>{{loaderMsg}}</p> -->\n </div>\n </ng-container>\n <div class=\"dialogNew\">\n <div class=\"flex items-center justify-between\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <button type=\"button\" mat-icon-button i18n-aria-label aria-label=\"action items\"\n [matMenuTriggerFor]=\"cardMenu\" [matMenuTriggerData]=\"{'data':data}\" class=\"action-btn\">\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <ng-container *ngIf=\"term.category !== 'competency'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{frameWorkService.getConfig(term.category).labelName}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <ng-container *ngIf=\"competencyForm\">\n <form [formGroup]=\"competencyForm\">\n <div class=\"title-text\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\" aria-label=\"First name labe \">\n {{'Select Area'}}\n </label>\n <div class=\"mt-5\">\n <mat-radio-group class=\"competency-group\" aria-label=\"Select an option\" formControlName=\"compArea\">\n <mat-radio-button [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" class=\"learning-section\" [ngClass]=\"{'active-btn':item?.code === seletedCompetencyArea?.code}\"\n *ngFor=\"let item of competencyArea?.children\" [value]=\"item\" [checked]=\"item?.code === seletedCompetencyArea?.code\" (change)=\"clearSelectedThemes(item)\">{{item.name}}</mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <div class=\"flex flex-end mb-4\" >\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button type=\"button\" class=\"mat-button flex items-center create-accordion-btn\" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addCompetencyTheme()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add more\n <!-- {{data.columnInfo.name}} -->\n </button>\n </ng-container>\n </div>\n <mat-accordion formArrayName=\"compThemeFields\">\n <mat-expansion-panel *ngFor=\"let field of competencyForm?.get('compThemeFields')['controls']; let i = index; let isFirst = first\" \n class=\"margin-bottom-l comp-theme-fields\" [formGroupName]=\"i\" [expanded]=\"isFirst\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.name}} \n </mat-panel-title>\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeCompFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </ng-container>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n {{data.openMode !== 'view'? 'Select Competency Theme': 'Competency Theme Name'}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" placeholder=\"Choose the Competency Theme\" formControlName=\"competencyTheme\">\n <ng-container >\n <ng-container >\n <mat-option *ngFor=\"let option of filteredallCompetencyTheme\" [value]=\"option\" [disabled]=\"onDisableTheme(option) || data.openMode ==='view'\" \n (onSelectionChange)=\"OnThemeSelection($event, i, option)\" >{{option.name}}\n <ng-container *ngIf=\"option.refId\">\n <span class=\"ml-2 ref-id\">({{option.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n </ng-container>\n </mat-select>\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n </div>\n \n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n\n {{data.openMode !== 'view'? 'Select Competency Sub-Theme': 'Competency Sub-Theme Name'}}\n \n </label>\n <!-- <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencySubTheme\">\n <mat-option *ngFor=\"let option of filteredallCompetencySubTheme\" [value]=\"option\">{{option.name}}</mat-option>\n </mat-select>\n </mat-form-field> -->\n <!-- {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value |json}} -->\n <mat-form-field appearance=\"outline\" class=\"w-full field-height\" >\n <mat-select class=\" placeholder-text\" placeholder=\"Choose the Competency Sub-Theme\"\n formControlName=\"competencySubTheme\" multiple [disabled]=\"data.openMode ==='view'\" panelClass=\"full-width-panel\">\n <!-- [ngClass]=\"{'disbaledSelect':isHideData}\" -->\n <mat-select-trigger >\n <mat-chip-listbox>\n <!-- -->\n \n <mat-chip *ngFor=\"let item of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value\" \n (removed)=\"onTermRemove(item, i)\" [disabled]=\"data.openMode ==='view'\"\n [ngClass]=\"{'sub-theme-disable': data?.openMode ==='view'}\" [removable]=\"data?.openMode ==='view'? false: true\">\n <span >{{ item.name }}</span>\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n </mat-chip-listbox>\n </mat-select-trigger>\n <!-- {{competencyForm?.get('compThemeFields') |json}} -->\n <!-- <mat-optgroup>\n <mat-form-field floatLabel=\"never\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" (keydown.space)=\"$event.stopPropagation()\"\n formControlName=\"competencySubTheme\" matInput>\n </mat-form-field>\n </mat-optgroup> -->\n <mat-optgroup *ngIf=\"filteredallCompetencySubTheme.length === 0\">\n <div>No results found!</div>\n </mat-optgroup>\n <!-- <mat-option *ngFor=\"let option of requestObjData.preferredProvider\" [value]=\"option.providerName\">{{option.providerName}}</mat-option> -->\n <ng-container *ngFor=\"let option of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.children\">\n <mat-option \n [value]=\"option\" class=\"mat-option-list\">{{option?.name}}\n <ng-container *ngIf=\"option?.refId\">\n <span class=\"ml-2 ref-id\">({{option?.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n \n </mat-select>\n <!-- <mat-error *ngIf=\"requestForm.controls['providerText'].hasError('required')\">\n Please select up to five preferred providers for the request.\n </mat-error> -->\n </mat-form-field>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"competencyForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create' && data.openMode !=='view'\">\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(competencyForm, data)\">\n {{app_strings.create}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.columnInfo?.code === 'subtheme'\">\n <!-- <ng-container *ngIf=\"competencyForm?.get('compThemeFields')['controls'][0]['controls']?.competencySubTheme?.value?.length;else updateBtn\"> -->\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.update}}\n </button>\n <!-- </ng-container> -->\n \n <!-- <ng-template #updateBtn>\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.delete}}\n </button>\n </ng-template> -->\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(competencyForm, data)\"\n [disabled]=\"competencyForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </ng-container>\n </form>\n </ng-container>\n \n </div>\n \n \n <!-- Title of the popup -->\n <ng-template #modalTitle>\n <!-- <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{data.columnInfo.name === 'Theme' ? app_strings.addCompetency : app_strings.createNew}} {{data.columnInfo.name}}</div>\n </ng-container> -->\n <!-- {{data |json}} -->\n <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{getCreateName(data)}}</div>\n </ng-container>\n <!-- <ng-container *ngIf=\"data?.mode === 'view'\">\n <div class=\"dialog-title\" mat-dialog-title>View {{data.columnInfo.name}}</div>\n </ng-container> -->\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <div class=\"dialog-title\" mat-dialog-title>{{app_strings.edit}} {{data.columnInfo.name}}</div>\n </ng-container>\n </ng-template>\n</div>\n\n\n<mat-menu #cardMenu=\"matMenu\" class=\"menu-sec\">\n <ng-template matMenuContent let-rowData=\"data\" let-cardRef=\"cardRef\">\n <button (click)=\"deleteTheme()\"\n mat-menu-item name=\"channel-analytics-button\" class=\"ws-mat-primary-text\" i18n-aria-label\n aria-label=\"Analytics\">\n <mat-icon>delete</mat-icon>\n <span>Delete</span>\n </button>\n </ng-template>\n</mat-menu>", styles: [".gap-3{gap:1.25rem}.gap-4{gap:1.5rem}.row-divider{width:100%;border-top:1px solid rgba(0,0,0,.08);margin:1rem 0}.defaultForm{padding:16px;display:flex;gap:16px;flex-direction:column}.theme-actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:30px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialog .mat-dialog-title{padding:1em;margin-bottom:0;background:#00000014}.dialog .mat-form-field{padding:0;background:#fff;border-radius:2px}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:15px;margin-top:0;border-top:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix textarea{resize:none}.dialog .mat-form-field-disabled{background:#00000014}.dialog .actions{display:flex;flex-direction:row;justify-content:space-between;padding:0 1em 1em}.dialog .mat-error{padding:0 25px;margin-top:-10px}.dialogNew{padding:1rem}.dialogNew .mat-dialog-title{padding:1em 0;margin-bottom:0}.dialogNew .actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:16px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialogNew .mat-error{margin-top:-10px}.dialogNew .learning-section{padding:10px!important;border:1px solid rgba(0,0,0,.1803921569);border-radius:4px;margin-right:8px}.dialogNew .learning-section.active-btn{border:1px solid #1B4CA1!important}.learning-section.mat-radio-button .mat-radio-container .mat-radio-outer-circle{border-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-inner-circle{background-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#1b4ca1!important}.dialog-title{align-items:center;display:flex}.flex{display:flex}.flex-col{display:flex;flex-direction:column}.mr-5{margin-right:1.5rem}.flex-1{flex:1 1}.margin-remove-bottom{margin-bottom:0}::ng-deep .custom-dialog-container{max-height:90vh}::ng-deep .custom-dialog-container .mat-dialog-container{padding:0;border-radius:0;background:#00000014}@media only screen and (max-width: 1024px){::ng-deep .cdk-overlay-pane{width:40%!important}}@media only screen and (max-width: 992px){::ng-deep .cdk-overlay-pane{width:45%!important}}@media only screen and (max-width: 1024px){.dialog{font-size:12px}.dialog .dialog-title{font-size:24px;height:1em}.dialog button{font-size:12px;line-height:3.5em}.dialog .mat-raised-button{padding:0 3em}}.flex-align{align-items:center;justify-content:flex-start}::ng-deep mat-form-field .mat-form-field-infix .mat-form-field-label,::ng-deep mat-form-field .mat-form-field-infix .mat-select-value{line-height:normal!important}ws-widget-btn-page-back-admin{margin-left:-270px}.max-wid{max-width:400px}::ng-deep .mat-form-field.mat-focused .mat-form-field-label{color:#333232!important}.margin-right-10{margin-right:10px!important}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}::ng-deep .mat-tab-header{margin:0 3rem}.heading{color:#222}.heading.mt-10{margin-top:2.5rem!important}.img-column{flex:100px 0 0}.input-column{flex:auto}.radio-toolbar input[type=radio]{opacity:0;position:fixed;width:0}.radio-toolbar{padding:10px 0}.radio-toolbar label{display:inline-block;padding:7px 21px;font-size:14px;background:#fff 0% 0% no-repeat padding-box;border:1px solid #5F5F5F;border-radius:4px;margin:0 10px 10px 0;color:#5f5f5f;cursor:pointer;transition:all .125s ease-in-out}.radio-toolbar input[type=radio]:checked+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.radio-toolbar input[type=radio]:focus+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.mar{margin-left:30px;min-width:175px}.radio-toolbar label:hover{background:none;border-color:#0074b6;color:#0074b6}::ng-deep .mat-form-field{width:100%}::ng-deep .mat-form-field.full-width{max-width:100%}::ng-deep .mat-form-field.no-pb .mat-form-field-wrapper{padding-bottom:0}.combined-field{width:100%}.w-full-imp{width:100%!important}::ng-deep .full-width-panel{width:100%!important;min-width:300px}::ng-deep .full-width-panel .mat-option{white-space:normal}.btn-success{background-color:#0075b7!important;border-radius:4px;width:240px;box-shadow:none;margin-right:16px}.btn-success.btn-responsive{width:100%}.btn-success:disabled,.btn-success[disabled]{opacity:.6}.btn-danger{height:30px;width:30px}.color-danger{font-size:30px;height:30px;width:30px;color:#e44}::ng-deep .mat-form-field-outline{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline .mat-form-field-outline-start{border:1px solid rgba(112,112,112,.4117647059);border-radius:4px 0 0 4px;min-width:8px;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-gap{border:1px solid currentColor;border-radius:82px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-end{border:1px solid rgba(112,112,112,.4117647059);border-left-style:none;border-radius:0 4px 4px 0}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-start{border-radius:4px 0 0 4px;min-width:8px;border:1px solid currentColor;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:1px;border:1px solid currentColor;border-radius:4px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-end{border-width:1px;border-radius:0 4px 4px 0;border:1px solid currentColor;border-left-style:none}::ng-deep .mat-form-field-disabled .mat-form-field-outline{background:#ebebeb!important}::ng-deep .mat-form-field-infix{padding:0;margin:0;border:none}::ng-deep .mat-form-field-flex{min-height:40px;align-items:center}::ng-deep .mat-form-field-infix{padding:0;margin:8px 0 0;border:none}.form-label{color:#222;font-size:14px;margin-bottom:.5rem;font-weight:700;font-family:Lato}.form-input{font-size:14px;font-weight:400;font-family:Lato}input.mat-input-element{color:#5f5f5f}::ng-deep .mat-radio-group{padding-bottom:1.34375em}::ng-deep .mat-chip-list-wrapper{margin:0!important}::ng-deep .mat-chip{font-weight:400;background:#f1f9ff 0% 0% no-repeat padding-box!important;border-radius:12px!important;color:#0074b6!important}::ng-deep .mat-chip:hover{filter:brightness(90%)}::ng-deep .mat-chip .mat-chip-remove{opacity:1!important;color:#0074b6!important;border-radius:50%}::ng-deeptextarea .mat-input-element{padding:8px 0}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}::ng-deep .mat-checkbox .mat-checkbox-frame{border-radius:4px!important}::ng-deep .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:none!important}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label{font-size:18px;color:#222}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label-active .mat-tab-label-content{color:#0074b6}::ng-deep .mat-tab-label-container .mat-tab-list .mat-ink-bar{height:3px;background-color:#0074b6!important}.form-control{background:#fff 0% 0% no-repeat padding-box;border:1px solid rgba(112,112,112,.4117647059);border-radius:4px;display:block}.form-control::placeholder{color:#bebebe;font-size:14px}.form-control:focus{border:2px solid #0074b6;outline:none}.input-wrapper{flex:1;display:flex;flex-wrap:wrap;flex-direction:column}::ng-deep .mat-checkbox-inner-container{height:23px!important;width:23px!important}.flex-expand{flex:1!important}.heading{font-weight:600;font-family:Montserrat;font-size:1.25rem;display:block;padding:0px 0px 1rem 0}::ng-deep .multiselect-dropdown{margin-bottom:20px}::ng-deep .multiselect-dropdown .dropdown-btn{border:1px solid #ccc!important;width:92%!important}::ng-deep .multiselect-dropdown .dropdown-list .filter-textbox input{width:90%!important}.organisation{color:#212529;font-weight:700;font-size:14px;font-family:Lato}.org-name{height:50px;border:1px solid #e2e2e2;border-radius:5px;background-color:#ebebeb;font-size:14px}.add-designation{height:25px;color:#1b4ca1!important;font-weight:500;font-size:14px;font-family:Lato;cursor:pointer}.add-designation .add-icon{color:#1b4ca1!important;height:24px;width:24px;font-size:24px}.info-icon{width:14px;height:14px;font-size:14px;color:#a7a9ae!important}.themDesignation{max-height:90vh;overflow-y:auto}.designation-panel{margin-bottom:0!important;background-color:#eef1f7!important;border:1px solid #DBE0E9;box-shadow:none!important}.designation-panel .deletDesignation{font-size:18px;width:14px;height:14px;color:#5f6063}.designation-panel .saveDesignaton{color:#fff;height:40px;width:80px;background-color:#1b4ca1;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.designation-footer{padding:1rem;border-top:1px solid #efefef}.cancel{width:93px;height:40px;font-weight:700;font-size:14px;font-family:Lato;border:1px solid #eee;color:#363636}.addBtn{color:#fff!important;height:40px;width:80px;background-color:#1b4ca1!important;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}::ng-deep .mat-option.mat-selected:not(.mat-option-disabled){color:#000000de!important}::ng-deep .theme-igot.day-mode .mat-pseudo-checkbox-checked{background:#0074b6!important}::ng-deep .mat-select-panel .mat-option{line-height:1!important}.comp-theme-fields{background:#eef1f7!important;border:1px solid #DBE0E9!important}.create-accordion-btn{color:#1b4ca1!important;padding:0!important}.create-accordion-btn mat-icon{color:#1b4ca1}.ref-id{font-size:10px}::ng-deep .mat-select-panel{min-width:103%!important;margin-left:32px}.loader-bg{background:#ffffffcf;inset:0;transform:translate(-50% -50%);pointer-events:unset;z-index:999999;display:flex;align-items:center;justify-content:center}::ng-deep .mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.8!important;cursor:none;filter:brightness(90%)}\n"] }]
|
|
821
|
-
}], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
|
|
822
|
-
type: Inject,
|
|
823
|
-
args: [MAT_DIALOG_DATA]
|
|
824
|
-
}] }, { type: i1.MatLegacyDialog }, { type: i2.FrameworkService }, { type: i3.UntypedFormBuilder }, { type: i4.MatLegacySnackBar }]; } });
|
|
825
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RyZWUtaGllcmFyY2h5L3NyYy9saWIvY29tcG9uZW50cy9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBOEUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEgsT0FBTyxFQUFFLHNCQUFzQixJQUFJLGVBQWUsRUFBb0UsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5SixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHOUMsT0FBTyxLQUFLLFlBQVksTUFBTSw4QkFBOEIsQ0FBQztBQUc3RCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR2hHLE1BS2EsZ0NBQWdDO0lBZ0MzQyxZQUNTLFNBQXlELEVBQ2hDLElBQVMsRUFDakMsTUFBaUIsRUFDbEIsZ0JBQWtDLEVBQ2pDLEVBQXNCLEVBQ3RCLFNBQXNCO1FBTHZCLGNBQVMsR0FBVCxTQUFTLENBQWdEO1FBQ2hDLFNBQUksR0FBSixJQUFJLENBQUs7UUFDakMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNsQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2pDLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLGNBQVMsR0FBVCxTQUFTLENBQWE7UUFwQ2hDLGdCQUFXLEdBQUcsTUFBTSxDQUFDO1FBR3JCLGlCQUFZLEdBQVMsRUFBRSxDQUFDO1FBQ3hCLHNCQUFpQixHQUFTLEVBQUUsQ0FBQTtRQUs1QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQix1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFNL0IsWUFBTyxHQUFRLElBQUksR0FBRyxFQUFtQyxDQUFDO1FBSzFELGtCQUFhLEdBQU8sRUFBRSxDQUFBO1FBRXRCLHVCQUFrQixHQUFPLEVBQUUsQ0FBQTtRQUMzQiwrQkFBMEIsR0FBTyxFQUFFLENBQUE7UUFDbkMsMEJBQXFCLEdBQU8sRUFBRSxDQUFBO1FBQzlCLGtDQUE2QixHQUFPLEVBQUUsQ0FBQTtJQVNsQyxDQUFDO0lBRUwsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3hELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUNwRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2xDLFFBQVEsRUFBQyxDQUFDLEVBQUUsRUFBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2pDLGVBQWUsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7U0FDL0QsQ0FBQyxDQUFBO0lBRUosQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFDLEVBQUU7WUFDM0YsSUFBRyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUE7Z0JBQ3pELElBQUksQ0FBQyx5QkFBeUIsR0FBSSxFQUFFLENBQUE7Z0JBRXBDLElBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO29CQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO3dCQUNqRCxJQUFHLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxFQUFFOzRCQUNoQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsR0FBRyxDQUFBOzRCQUNwQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFBOzRCQUMvRSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFBO3lCQUM3QjtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjthQUVEO1FBQ0YsQ0FBQyxFQUFDLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUE7UUFDbkQsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsUUFBYSxFQUFFLFdBQW1CO1FBQzVDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUssRUFBRSxFQUFFO1lBQ3RDLElBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQ3ZCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtvQkFDWixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7b0JBQ3hCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztvQkFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7b0JBQ1osV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXO29CQUMxQixNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNDQUFzQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDO29CQUV6RixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUssRUFBRSxFQUFFO3dCQUN0QyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQTt3QkFDekMsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQTt5QkFDN0M7d0JBQ0QsT0FBTyxDQUFDLENBQUE7b0JBQ1YsQ0FBQyxDQUFDO2lCQUNILENBQUMsQ0FBQTthQUNIO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQzlCLElBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsb0JBQW9CLENBQUMsRUFBQztnQkFDNUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUE7YUFDeEI7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUdKLENBQUM7SUFHRCxxQkFBcUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQixlQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0Msa0JBQWtCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDL0MsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUdELGFBQWEsQ0FBQyxJQUFTO1FBQ25CLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQTtRQUNuRixRQUFPLGFBQWEsRUFBQztZQUNuQixLQUFLLGFBQWE7Z0JBQ2xCLE9BQU8sMkJBQTJCLENBQUM7WUFDbkMsS0FBSyxXQUFXO2dCQUNkLElBQUcsSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLEVBQUU7b0JBQzNCLE9BQU8sbUJBQW1CLGFBQWEsRUFBRSxDQUFBO2lCQUMxQztnQkFDSCxPQUFPLGtCQUFrQixhQUFhLEVBQUUsQ0FBQTtZQUN4QyxLQUFLLFlBQVk7Z0JBQ2YsSUFBRyxJQUFJLENBQUMsUUFBUSxLQUFLLE1BQU0sRUFBRTtvQkFDM0IsT0FBTyx1QkFBdUIsQ0FBQTtpQkFDL0I7cUJBQU0sSUFBRyxJQUFJLENBQUMsUUFBUSxLQUFLLE1BQU0sRUFBRTtvQkFDbEMsT0FBTyx1QkFBdUIsQ0FBQTtpQkFDL0I7Z0JBQ0QsT0FBTywyQkFBMkIsQ0FBQTtZQUNsQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtTQUNyQjtJQUNMLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFVO1FBQzVCLElBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN2QixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUE7U0FDbkM7YUFBTTtZQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7U0FDN0I7SUFDSCxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQTtRQUNwQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQXFCLENBQUM7WUFDdkYsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBVyxFQUFFLEVBQUU7b0JBQy9DLElBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsS0FBSyxFQUFFO3dCQUNwRixRQUFRLEdBQUcsSUFBSSxDQUFBO3FCQUNoQjtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7UUFDRCxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBRUQscUJBQXFCLENBQUMsTUFBVTtRQUM5QixNQUFNLFVBQVUsR0FBRztZQUNqQixVQUFVLEVBQUUsU0FBUztZQUNyQixZQUFZLEVBQUU7Z0JBQ1o7b0JBQ0UsTUFBTSxFQUFFLHFEQUFxRDtvQkFDN0QsV0FBVyxFQUFFLHFEQUFxRDtvQkFDbEUsUUFBUSxFQUFFO3dCQUNSOzRCQUNFLFFBQVEsRUFBRSxFQUFFOzRCQUNaLEdBQUcsRUFBRSxrRUFBa0U7eUJBQ3hFO3FCQUNGO2lCQUNGO2FBQ0Y7WUFDRCxXQUFXLEVBQUUsNkJBQTZCO1lBQzFDLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxPQUFPLEVBQUUsUUFBUTtvQkFDakIsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFFBQVEsRUFBRSxLQUFLO2lCQUNoQjtnQkFDRDtvQkFDRSxPQUFPLEVBQUUsU0FBUztvQkFDbEIsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsUUFBUSxFQUFFLElBQUk7aUJBQ2Y7YUFDRjtTQUNGLENBQUE7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUM3RCxJQUFJLEVBQUUsVUFBVTtZQUNoQixTQUFTLEVBQUUsS0FBSztZQUNoQixLQUFLLEVBQUUsT0FBTztZQUNkLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFlBQVksRUFBRSxJQUFJO1NBQ25CLENBQUMsQ0FBQTtRQUNGLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUM3QyxJQUFJLEdBQUcsRUFBRTtnQkFDUCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2FBQzdCO2lCQUFNO2dCQUNMLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLGVBQWUsRUFBRTtvQkFDbkIsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDckQsZUFBZSxDQUFDLHNCQUFzQixFQUFFLENBQUM7aUJBQzFDO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxlQUFlLENBQUMsTUFBVTtRQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzNCLE9BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFHLE9BQU8sS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUM7WUFDbkQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE1BQU0sQ0FBQTtZQUNuQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1RCxJQUFJLGVBQWUsRUFBRTtnQkFDbkIsZUFBZSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkMsZUFBZSxDQUFDLHNCQUFzQixFQUFFLENBQUM7YUFDMUM7WUFDRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsRUFBRSxDQUFBO1lBQ3BDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUE7WUFDNUIsSUFBRyxNQUFNLElBQUssTUFBTSxDQUFDLFFBQVEsSUFBSyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBQztnQkFDdkQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ3hFLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQ25DLElBQUcsR0FBRyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUc7d0JBQzFCLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBYyxFQUFHLEVBQUU7NEJBQzdELElBQUcsR0FBRyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsS0FBSyxFQUFFO2dDQUNoQyxPQUFPLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUE7NkJBQ3ZEO3dCQUNILENBQUMsQ0FBQyxDQUFBO3dCQUNGLElBQUcsTUFBTSxJQUFJLENBQUMsRUFBQzs0QkFDYixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBOzRCQUNqQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO3lCQUMxQztxQkFDRjtnQkFDTCxDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLElBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRTtvQkFDdEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBVyxFQUFFLEVBQUU7d0JBQ25ELElBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFOzRCQUMvQixJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFBOzRCQUNuQyxJQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0NBQzlDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7b0NBQ3BDLElBQUcsR0FBRyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUU7d0NBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7d0NBQ2pDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7d0NBRXpDLElBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFDOzRDQUNoRixJQUFJLFNBQVMsR0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBcUIsQ0FBQzs0Q0FDbkYsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7NENBQ3RELFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTs0Q0FDL0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7NENBQzVELElBQUksZUFBZSxFQUFFO2dEQUNuQixlQUFlLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dEQUNuQyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzs2Q0FDMUM7eUNBQ0Y7cUNBQ0Y7Z0NBQ0gsQ0FBQyxDQUFDLENBQUM7NkJBQ0o7eUJBQ0Y7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtTQUVGO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtZQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztTQUM5RDtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFhO1FBQzVCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQVUsRUFBRSxXQUFnQixFQUFFLFVBQWM7UUFFM0QsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUE7UUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFPLEVBQUUsRUFBRTtZQUMvQixJQUFHLGFBQWEsQ0FBQyxRQUFRLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRTtnQkFDdEMsSUFBRyxHQUFHLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO29CQUN0QyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQWUsRUFBRSxFQUFFO3dCQUN2QyxJQUFHLFVBQVUsQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLFVBQVUsRUFBRTs0QkFDckQsSUFBRyxVQUFVLENBQUMsUUFBUSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dDQUNwRCxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQTtnQ0FDNUMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUE7Z0NBRXZELElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQTtnQ0FDcEIsSUFBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFO29DQUM1RSxXQUFXLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztpQ0FDdEY7cUNBQU07b0NBQ04sV0FBVyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lDQUNyRztnQ0FDQSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBcUIsQ0FBQztnQ0FDL0UsTUFBTSx5QkFBeUIsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dDQUN0RixJQUFJLHlCQUF5QixFQUFFO29DQUM3Qix5QkFBeUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7b0NBQ2xELHlCQUF5QixDQUFDLHNCQUFzQixFQUFFLENBQUM7aUNBQ3BEOzZCQUNKO3lCQUNGO29CQUNILENBQUMsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7SUFFRCxZQUFZLENBQUMsUUFBYSxFQUFFLFVBQWtCO1FBQzVDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFxQixDQUFDO1FBQy9FLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQThCLENBQUE7UUFDeEcsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUE7WUFDckMsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDdEMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO29CQUNkLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO29CQUN2QixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7aUJBQ2xDO2FBQ0Y7U0FDRjtJQUVILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFXLEVBQUUsV0FBbUIsRUFBRSxPQUFZO0lBSWxFLENBQUM7SUFHRCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQVMsRUFBRSxLQUFVO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUE7UUFFOUIsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZCLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQTtRQUN2QixJQUFJLFlBQVksR0FBTyxFQUFFLENBQUE7UUFDekIsSUFBSSxlQUFlLEdBQUcsRUFBRSxDQUFBO1FBQ3hCLElBQUcsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNiLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFBO1lBQ3BFLElBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3BDLElBQUksYUFBYSxHQUFHLEVBQUMsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUMsQ0FBQTtnQkFDbkQsSUFBRyxhQUFhLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO29CQUMxRCxPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUE7aUJBQzlCO2dCQUNELElBQUcsYUFBYSxDQUFDLFlBQVksSUFBSSxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtvQkFDbEUsT0FBTyxhQUFhLENBQUMsWUFBWSxDQUFBO2lCQUNsQztnQkFHRCxLQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNoRCxjQUFjLEdBQUcsRUFBRSxDQUFBO29CQUNuQixJQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO3dCQUM1QixZQUFZLEdBQUUsRUFBRSxDQUFBO3dCQUNoQixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTt3QkFDckMsTUFBTSxJQUFJLEdBQTRCOzRCQUNwQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTs0QkFDckMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJOzRCQUNoQixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7NEJBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJOzRCQUNuQyxNQUFNLEVBQUUsWUFBWSxDQUFDLElBQUk7NEJBQ3pCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7NEJBQ3hCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUU7NEJBRTVCLE9BQU8sRUFBRTtnQ0FDUCxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFOzZCQUN0Rjs0QkFDRCxvQkFBb0IsRUFBRTtnQ0FDcEIsY0FBYyxFQUFFLGFBQWE7Z0NBQzdCLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRTs2QkFDaEM7eUJBQ0YsQ0FBQTt3QkFDRCxNQUFNLFdBQVcsR0FBTzs0QkFDdEIsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRSxJQUFJOzZCQUNYO3lCQUNGLENBQUE7d0JBQ0QsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQVEsRUFBRSxFQUFFOzRCQUN4SSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTs0QkFDOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7NEJBQ3hELGNBQWMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQTs0QkFDekMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBOzRCQUczQyxNQUFNLFlBQVksR0FBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7NEJBQzlGLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTs0QkFFL0UsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQUMsWUFBWSxFQUFDLFNBQVMsQ0FBQyxDQUFBOzRCQUc1RCxJQUFJLElBQUksR0FBRztnQ0FDVCxVQUFVLEVBQUUsS0FBSztnQ0FDakIsVUFBVSxFQUFFLFlBQVksQ0FBQyxJQUFJO2dDQUM3QixhQUFhLEVBQUUsU0FBUztnQ0FDeEIsWUFBWSxFQUFFLEtBQUs7Z0NBQ25CLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSztnQ0FDM0IsWUFBWSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVzs2QkFDcEMsQ0FBQTs0QkFDRCxNQUFNLGNBQWMsR0FBRztnQ0FDckIsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLElBQUksRUFBRTtnQ0FDN0QsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUs7Z0NBQ2pDLElBQUksRUFBRSxJQUFJO2dDQUNWLElBQUksRUFBRSxjQUFjOzZCQUNyQixDQUFBOzRCQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywyQkFBMkIsQ0FBQyxjQUFjLENBQUMsQ0FBQTt3QkFFdkUsQ0FBQyxDQUFDLENBQUE7cUJBQ0g7b0JBQ0QsSUFBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsRUFBRTt3QkFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFBO3dCQUVsRixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQTt3QkFDeEMsSUFBRyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTs0QkFDeEIsZUFBZSxHQUFHLENBQUMsQ0FBQTs0QkFDbkIsZUFBZSxHQUFHLEVBQUUsQ0FBQTs0QkFFbEIsS0FBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUU7Z0NBQ3RCLE1BQU0sSUFBSSxHQUE0QjtvQ0FDcEMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7b0NBQ3JDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtvQ0FDZCxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7b0NBQzVCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJO29DQUNwQyxNQUFNLEVBQUUsWUFBWSxDQUFDLElBQUk7b0NBQ3pCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7b0NBQ3RCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUU7b0NBQzFCLE9BQU8sRUFBRTt3Q0FDUCxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFO3FDQUN2RjtvQ0FDRCxvQkFBb0IsRUFBRTt3Q0FDcEIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFO3FDQUNoQztpQ0FDRixDQUFBO2dDQUNELE1BQU0sV0FBVyxHQUFPO29DQUN0QixPQUFPLEVBQUU7d0NBQ1AsSUFBSSxFQUFFLElBQUk7cUNBQ1g7aUNBQ0YsQ0FBQTtnQ0FHRCxJQUFJLFlBQVksR0FBUSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFBO2dDQUU1RyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQ0FDdkUsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2dDQUM5QyxlQUFlLEVBQUUsQ0FBQTtnQ0FDakIsSUFBRyxDQUFDLGVBQWUsS0FBSyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBQztvQ0FDM0QsTUFBTSxzQkFBc0IsR0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7b0NBQ3hHLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFBO29DQUV6RixNQUFNLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxlQUFlLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUE7b0NBQzlGLElBQUcsS0FBSyxLQUFLLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dDQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTt3Q0FDeEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO3dDQUNqRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFBO3dDQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFBO3FDQUNoRTtpQ0FDRjs2QkFFRjt5QkFDRjtxQkFDRjtpQkFFRjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBR0QsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFnQixFQUFFLE9BQVksRUFBRSxXQUFnQjtRQUM5RCxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsRUFBRTtZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFDLEVBQUU7Z0JBQ3hGLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNkLENBQUMsRUFBQyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQTtZQUM1QyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBSUQsS0FBSyxDQUFDLDZCQUE2QixDQUFDLFlBQW1CLEVBQUUsa0JBQXdCLEVBQUUsYUFBc0IsRUFBRSxpQkFBMEI7UUFDbkksSUFBRyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUN0QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFBO1lBRTNCLElBQUksdUJBQXVCLEdBQUcsRUFBRSxDQUFBO1lBQ2hDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUE7WUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRSxDQUFDLENBQUMsQ0FBQTtZQUN4RCxLQUFJLElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtnQkFDbkMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBO2FBQ3JFO1lBQ0QsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFBO1lBQ3JCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQTtZQUNmLElBQUcsQ0FBQyxrQkFBa0IsRUFBRTtnQkFDdEIsS0FBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBQztvQkFDdkQsTUFBTSxNQUFNLEdBQU8sS0FBSyxDQUFBO29CQUN4QixPQUFPLEVBQUUsQ0FBQTtvQkFDVCxZQUFZLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFLLEVBQUUsRUFBRTt3QkFDN0QsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtvQkFDNUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtvQkFDTCxZQUFZLEdBQUcsQ0FBQyxHQUFHLFlBQVksRUFBRSxHQUFHLHVCQUF1QixDQUFDLENBQUE7b0JBQzVELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO29CQUN4QixNQUFNLFdBQVcsR0FBRzt3QkFDbEIsT0FBTyxFQUFFOzRCQUNQLElBQUksRUFBRTtnQ0FDSixHQUFHLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7NkJBQ3BGO3lCQUNGO3FCQUNGLENBQUE7b0JBQ0QsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQTtpQkFrQnBFO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUE7Z0JBQ2pDLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUssRUFBRSxFQUFFO29CQUM3RCxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO2dCQUM1RCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO2dCQUNMLFlBQVksR0FBRyxDQUFDLEdBQUcsWUFBWSxFQUFFLEdBQUcsdUJBQXVCLENBQUMsQ0FBQTtnQkFDNUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7Z0JBQ3hCLE1BQU0sV0FBVyxHQUFHO29CQUNsQixPQUFPLEVBQUU7d0JBQ1AsSUFBSSxFQUFFOzRCQUNKLEdBQUcsQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTt5QkFDcEY7cUJBQ0Y7aUJBQ0YsQ0FBQTtnQkFDRCxPQUFPLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUE7Z0JBTXhFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7YUFJbEM7U0FDRjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsMkJBQTJCLENBQUMsWUFBbUI7UUFDbkQsSUFBRyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUV0QyxLQUFJLElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtnQkFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUE7Z0JBQy9CLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQTtnQkFDckIsSUFBSSxJQUFJLENBQUE7Z0JBQ1IsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFBO2dCQUdmLEtBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUM7b0JBQ3ZELE1BQU0sTUFBTSxHQUFPLEtBQUssQ0FBQTtvQkFDeEIsT0FBTyxFQUFFLENBQUE7b0JBQ1QsSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtvQkFDeEgsWUFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBSyxFQUFFLEVBQUU7d0JBQzdELE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7b0JBQzVELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7b0JBQ1AsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTt3QkFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7d0JBQ3ZCLE9BQU07cUJBQ1A7eUJBQU07d0JBQ0gsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUE7d0JBQy9ELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO3dCQUV0QixNQUFNLFdBQVcsR0FBRzs0QkFDbEIsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRTtvQ0FDSixHQUFHLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7aUNBQ3BGOzZCQUNGO3lCQUNGLENBQUE7d0JBQ0QsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQTtxQkFHcEU7aUJBQ0Y7YUFFRjtTQUNGO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxPQUFZLEVBQUUsTUFBVyxFQUFFLFdBQWdCO1FBQ3hFLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDdkgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBLENBQUMsQ0FBQSxJQUFJLENBQUMsaUJBQWlCLENBQUE7Z0JBQ3BILElBQUksUUFBUSxHQUFTLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUM5RSxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUE7Z0JBQ3ZCLElBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7b0JBQzVELGNBQWMsR0FBSSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO2lCQUMxRjtxQkFBTTtvQkFDTCxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFBO2lCQUN4QztnQkFDRCxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBLENBQUMsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUEsQ0FBQyxDQUFBLGNBQWMsQ0FBQTtnQkFDMUgsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFBLENBQUMsQ0FBQSxjQUFjLENBQUE7Z0JBRTlHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBaUIsRUFBQyxFQUFFO29CQUMvRCxJQUFJLFFBQVEsR0FBUyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7b0JBQzFFLElBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7d0JBQzVELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtxQkFDOUQ7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7Z0JBR0osSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7b0JBV3hELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFBO29CQUMxQixJQUFJLFdBQVcsR0FBUyxJQUFJLENBQUE7b0JBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDYixNQUFNLFdBQVcsQ0FBQTtpQkFDbEI7cUJBQU07b0JBQ0wsSUFBSSxXQUFXLEdBQVMsSUFBSSxDQUFBO29CQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQ2IsTUFBTSxXQUFXLENBQUE7aUJBQ2xCO1lBQ0gsQ0FBQyxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksaUNBQWlDLENBQUMsQ0FBQTtnQkFDakYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtnQkFDL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQTtZQUNqQyxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxPQUFZLEVBQUUsTUFBVyxFQUFFLFdBQWdCO1FBQ3RFLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDdkgsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7b0JBTXhELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBSyxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtvQkFDckgsSUFBRyxDQUFDLEtBQUssRUFBRTt3QkFDVCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtxQkFDckc7b0JBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUE7b0JBQzFCLElBQUksV0FBVyxHQUFTLElBQUksQ0FBQTtvQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUNiLE1BQU0sV0FBVyxDQUFBO2lCQUNsQjtxQkFBTTtvQkFDTCxJQUFJLFdBQVcsR0FBUyxJQUFJLENBQUE7b0JBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDYixNQUFNLFdBQVcsQ0FBQTtpQkFDbEI7WUFDSCxDQUFDLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxpQ0FBaUMsQ0FBQyxDQUFBO1lBQ25GLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVEsRUFBRSxJQUFTO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLE1BQU0sUUFBUSxHQUFHO1lBRWYsR0FBRyxJQUFJLENBQUMsS0FBSztTQUNkLENBQUE7UUFDRCxNQUFNLFVBQVUsR0FBRztZQUNqQixRQUFRO1lBQ1IsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZO1NBQ2xDLENBQUE7UUFDRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDekMsQ0FBQztJQUVELHNCQUFzQixDQUFDLFVBQWdCO1FBQ3JDLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQTtRQUNyQixJQUFJLElBQUksQ0FBQTtRQUNSLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQTtRQUVmLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDckQsT0FBTyxFQUFFLENBQUE7WUFDVCxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFTLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBQ3hILFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUssRUFBRSxFQUFFO2dCQUU3RCxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBQzVELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFDUCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtnQkFDdkIsT0FBTTthQUNQO2lCQUFNO2dCQUVMLElBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRTtvQkFDcEQsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUE7aUJBQ2hFO2dCQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO2dCQUN4QixNQUFNLFdBQVcsR0FBRztvQkFDbEIsT0FBTyxFQUFFO3dCQUNQLElBQUksRUFBRTs0QkFDSixHQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxRQUFRLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBQyxDQUFBLENBQUMsQ0FBQyxJQUFJOzRCQUN6SCxHQUFHLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7eUJBQ3BGO3FCQUNGO2lCQUNGLENBQUE7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDaEgsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7d0JBS3hELE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLEdBQUcsVUFBVSxDQUFDLGNBQWMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO3dCQUNsSyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTt3QkFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7cUJBQ3hEO2dCQUNILENBQUMsRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO29CQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLGlDQUFpQyxDQUFDLENBQUE7b0JBQ2pGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUE7b0JBQy9DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7Z0JBQ2pDLENBQUMsQ0FBQyxDQUFBO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFHRCxXQUFXLENBQUMsSUFBUztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3RELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDNUIsQ0FBQyxFQUFDLENBQUMsSUFBUSxFQUFDLEVBQUU7WUFDWixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFBO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDekMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBTUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQVUsRUFBRSxJQUFTO1FBQzdDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUE7UUFDOUIsSUFBSSxTQUFTLEdBQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQXFCLENBQUM7UUFDbkYsSUFBSSxnQkFBZ0IsR0FBUSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEtBQUssQ0FBQTtRQUMzRSxJQUFJLG9CQUFvQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFBO1FBQ3JELElBQUksVUFBVSxHQUFRLEVBQUUsQ0FBQTtRQUN4QixJQUFJLGVBQWUsR0FBTyxFQUFFLENBQUE7UUFDNUIsSUFBSSxlQUFlLEdBQUcsRUFBRSxDQUFBO1FBQ3hCLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQTtRQUd2QixVQUFVLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3RSxlQUFlLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRixJQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO1lBRWhDLEtBQUksSUFBSSxHQUFHLElBQUksVUFBVSxFQUFDO2dCQUN4QixNQUFNLElBQUksR0FBNEI7b0JBQ3RDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO29CQUNyQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7b0JBQ2QsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO29CQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSTtvQkFDbkMsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJO29CQUN6QixLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7b0JBQ2hCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztvQkFFcEIsT0FBTyxFQUFFO3dCQUNQLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUU7cUJBQ3RGO29CQUNELG9CQUFvQixFQUFFO3dCQUNwQixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUU7cUJBQ2hDO2lCQUNBLENBQUE7Z0JBQ0QsTUFBTSxXQUFXLEdBQU87b0JBQ3RCLE9BQU8sRUFBRTt3QkFDUCxJQUFJLEVBQUUsSUFBSTtxQkFDWDtpQkFDRixDQUFBO2dCQUVELE1BQU0sc0JBQXNCLEdBQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUN2RyxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFHekYsSUFBSSxZQUFZLEdBQVEsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQTtnQkFDM0csV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ3ZFLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDOUMsZUFBZSxFQUFFLENBQUE7Z0JBQ2pCLElBQUcsZUFBZSxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQUM7b0JBQ3ZDLE1BQU0sSUFBSSxDQUFDLDZCQUE2QixDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQTtvQkFFcEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFBO29CQUMxRyxJQUFHLENBQUMsQ0FBQyxlQUFlLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7d0JBQ2hHLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7d0JBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUE7cUJBQzlEO2lCQUNGO2FBQ0Y7U0FDSjtRQUVELElBQUcsZUFBZSxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUU7WUFDNUMsSUFBSSxzQkFBc0IsR0FBRyxFQUFFLENBQUE7WUFDL0IsS0FBSSxJQUFJLFdBQVcsSUFBSSxlQUFlLEVBQUU7Z0JBQ3RDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7YUFDOUM7WUFFQyxJQUFJLGVBQWUsR0FBRTtnQkFDbkIsU0FBUyxFQUFFO29CQUNULFlBQVksRUFBRSxzQkFBc0I7aUJBQ3JDO2FBQ0YsQ0FBQTtZQUVELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBRzVJLE1BQU0sc0JBQXNCLEdBQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUN2RyxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFJekYsTUFBTSx1QkFBdUIsR0FBUSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBSyxFQUFFLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdJLE1BQU0sMEJBQTBCLEdBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUssRUFBRSxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUVwSixTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsdUJBQXVCLENBQUE7Z0JBQy9DLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRywwQkFBMEIsQ0FBQTtnQkFHdEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFBO2dCQUUxRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7Z0JBQzVFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNoSSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFBO2dCQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFBO1lBRS9ELENBQUMsQ0FBQyxDQUFBO1NBQ0w7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFBO0lBQ2pDLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBVztRQUN4QixNQUFNLHNCQUFzQixHQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN2RyxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN6RixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUcsU0FBUyxJQUFJLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUM7WUFDOUQsTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxJQUFLLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN0SCxPQUFRLEdBQUcsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQTtpQkFDakM7Z0JBQ0QsT0FBTyxLQUFLLENBQUE7WUFDZCxDQUFDLENBQUMsQ0FBQTtTQUNIO1FBRUQsSUFBRyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQ1osSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQXFCLENBQUM7WUFDL0UsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0JBQ2xELElBQUcsT0FBTyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRTtvQkFDM0QsT0FBUSxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFBO2lCQUN2RDtnQkFDRCxPQUFPLEtBQUssQ0FBQTtZQUNkLENBQUMsQ0FBQyxDQUFDO1NBQ0g7UUFJRixPQUFPLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQSxDQUFDLENBQUMsS0FBSyxDQUFBO0lBQ2xDLENBQUM7SUFHRCxlQUFlLENBQUMsSUFBUyxFQUFFLE1BQVcsRUFBQyxpQkFBc0IsRUFBRSxVQUFlO1FBQzVFLElBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDaEQsSUFBRyxVQUFVLEtBQUssUUFBUSxFQUFDO2dCQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO29CQUNyQyxJQUFHLE9BQU8sQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLFVBQVUsRUFBRTt3QkFRM0MsTUFBTSxlQUFlLEdBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBSyxFQUFFLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ3hJLE1BQU0sWUFBWSxHQUFRLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUssRUFBRSxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUNsSSxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsZUFBZSxDQUFBO3dCQUN6QyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFBO3FCQUNuQztvQkFDRCxJQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUU7d0JBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBQyxpQkFBaUIsRUFBQyxVQUFVLENBQUMsQ0FBQTtxQkFDbkU7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7YUFDSDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO29CQUNyQyxJQUFHLE9BQU8sQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLFVBQVUsRUFBRTt3QkFDM0MsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFBO3dCQUN2QixJQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFOzRCQUN6RCxjQUFjLEdBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO3lCQUNwRjs2QkFBTTs0QkFDTCxjQUFjLEdBQUcsaUJBQWlCLENBQUE7eUJBQ25DO3dCQUVELE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQSxDQUFDLENBQUEsY0FBYyxDQUFBO3dCQUN0SCxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUEsQ0FBQyxDQUFBLGNBQWMsQ0FBQTtxQkFDM0c7b0JBQ0QsSUFBRyxPQUFPLENBQUMsUUFBUSxFQUFFO3dCQUNuQixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtxQkFDekQ7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7YUFDSDtTQUNGO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFBO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFBO1FBQ3ZDLElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQTtRQUN4QixlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuQyxJQUFJLGVBQWUsR0FBRTtZQUNuQixTQUFTLEVBQUU7Z0JBQ1QsWUFBWSxFQUFFLGVBQWU7YUFDOUI7U0FDRixDQUFBO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFFMUksSUFBSSxlQUFlLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNoQyxNQUFNLHNCQUFzQixHQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDL0YsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFekYsTUFBTSx1QkFBdUIsR0FBUSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBSyxFQUFFLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0ksTUFBTSwwQkFBMEIsR0FBUSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBSyxFQUFFLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFcEosU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLHVCQUF1QixDQUFBO1lBQy9DLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRywwQkFBMEIsQ0FBQTtZQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ2xHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQy9ILElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDcEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFBO1FBQy9ELENBQUMsRUFBQyxDQUFDLENBQUMsSUFBUyxFQUFDLEVBQUU7WUFDZCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFBO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7UUFDeEQsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7SUFLRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBcUIsQ0FBQztJQUN4RSxDQUFDOytHQXA4QlUsZ0NBQWdDLG9EQWtDakMsZUFBZTttR0FsQ2QsZ0NBQWdDLHNFQ3BCN0MsKzFpQkFtT1c7O1NEL01FLGdDQUFnQzs0RkFBaEMsZ0NBQWdDO2tCQUw1QyxTQUFTOytCQUNFLGdDQUFnQzs7MEJBc0N2QyxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUFycmF5LCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1BVF9MRUdBQ1lfRElBTE9HX0RBVEEgYXMgTUFUX0RJQUxPR19EQVRBLCBNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nLCBNYXRMZWdhY3lEaWFsb2dSZWYgYXMgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZyc7XG5pbXBvcnQgeyBNYXRMZWdhY3lTbmFja0JhciBhcyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXInO1xuaW1wb3J0IHsgbGFiZWxzIH0gZnJvbSAnLi4vLi4vbGFiZWxzL3N0cmluZ3MnO1xuaW1wb3J0IHsgRnJhbWV3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZyYW1ld29yay5zZXJ2aWNlJztcbmltcG9ydCB7IE5TRnJhbWV3b3JrIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZyYW1ld29yay5tb2RlbCc7XG5pbXBvcnQgKiBhcyBhcHBDb25zdGFudHMgZnJvbSAnLi4vLi4vY29uc3RhbnRzL2FwcC1jb25zdGFudCc7XG5pbXBvcnQgeyBDYXJkIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3ZhcmlhYmxlLXR5cGUubW9kZWwnO1xuLyogdHNsaW50OmRpc2FibGUgKi9cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcbi8vIGltcG9ydCB7IHJlc29sdmUgfSBmcm9tICd1cmwnO1xuaW1wb3J0IHsgQ29uZm9yYW10aW9uUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9jb25mb3JhbXRpb24tcG9wdXAvY29uZm9yYW10aW9uLXBvcHVwLmNvbXBvbmVudCc7XG4vKiB0c2xpbnQ6ZW5hYmxlICovXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yaycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ3JlYXRlVGVybUZyb21GcmFtZXdvcmtDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGFwcF9zdHJpbmdzID0gbGFiZWxzO1xuICBlbnZpcm9ubWVudDogYW55XG5cbiAgc2VsZWN0ZWRUZXJtOiBDYXJkID0ge307XG4gIHNlbGVjdGVkVGVybUFycmF5IDogYW55ID0gW11cbiAga2NtQ29uZmlnRGF0YTogYW55XG4gIHNlbGVjdGVkVGhlbWVEYXRhOiBhbnlcblxuXG4gIGlzVGVybUV4aXN0OiBib29sZWFuID0gZmFsc2U7XG4gIGRpc2FibGVDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlzYWJsZU11bHRpQ3JlYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIGRpc2FibGVVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuXG4gIGNvbXBldGVuY3lGb3JtITogVW50eXBlZEZvcm1Hcm91cFxuXG5cbiAga2NtTGlzdCA6IGFueT0gbmV3IE1hcDxzdHJpbmcsIE5TRnJhbWV3b3JrLklDb2x1bW5WaWV3PigpO1xuICAvLyBjYXRlZ29yaWVzSGFzaDogYW55XG4gIGNvbXBldGVuY3lBcmVhOiBhbnlcbiAgc2VsZWN0ZWRDYXJkQ29tcFRoZW1lRGF0YTogYW55XG5cbiAgYWxsQ29tcGV0ZW5jeTphbnlbXT1bXVxuICBzZWxldGVkQ29tcGV0ZW5jeUFyZWE6IGFueVxuICBhbGxDb21wZXRlbmN5VGhlbWU6YW55W109W11cbiAgZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWU6YW55W109W11cbiAgYWxsQ29tcGV0ZW5jeVN1YnRoZW1lOmFueVtdPVtdXG4gIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVN1YlRoZW1lOmFueVtdPVtdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENyZWF0ZVRlcm1Gcm9tRnJhbWV3b3JrQ29tcG9uZW50PixcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHB1YmxpYyBmcmFtZVdvcmtTZXJ2aWNlOiBGcmFtZXdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIF9zbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRFbnZpcm9tZW50KClcbiAgICB0aGlzLmdldENvbXB0ZW5jeURhdGEoKVxuICAgIHRoaXMua2NtQ29uZmlnRGF0YSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRDb25maWdCeUZyYW1lV29ya0lkKHRoaXMuZW52aXJvbm1lbnQua2NtRnJhbWV3b3JrTmFtZSlcbiAgICB0aGlzLmNvbXBldGVuY3lGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb21wQXJlYTpbJycsVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBjb21wVGhlbWVGaWVsZHM6IHRoaXMuZmIuYXJyYXkoW3RoaXMuY3JlYXRlQ29tcFRoZW1lRmllbGRzKCldKVxuICAgIH0pXG5cbiAgfVxuXG4gIGdldENvbXB0ZW5jeURhdGEoKXtcbiAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0RnJhbWV3b3JrUmVhZCh0aGlzLmVudmlyb25tZW50LmtjbUZyYW1ld29ya05hbWUpLnN1YnNjcmliZSgoZGF0YSk9PntcbiAgICAgaWYoZGF0YS5jYXRlZ29yaWVzKSB7XG4gICAgICB0aGlzLmZvcm1hdGVEYXRhKGRhdGEsIHRoaXMuZW52aXJvbm1lbnQua2NtRnJhbWV3b3JrTmFtZSlcbiAgICAgIHRoaXMuc2VsZWN0ZWRDYXJkQ29tcFRoZW1lRGF0YSA9ICAnJ1xuICAgICAgLy8gdG8gZG86IGNoYW5nZSBnZXR0aW5nIHNlbGVjdGVkUGFyZW50VGVybXMgdG8gZHluYW1pY1xuICAgICAgaWYodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5zZWxlY3RlZFBhcmVudFRlcm1zKSB7XG4gICAgICAgIHRoaXMuZGF0YS5zZWxlY3RlZFBhcmVudFRlcm1zLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYoZWxlLmNhdGVnb3J5ID09PSBcImNvbXBldGVuY3lcIikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENhcmRDb21wVGhlbWVEYXRhID0gZWxlXG4gICAgICAgICAgICBsZXQgb3B0aW9uID0gdGhpcy5zZWxlY3RlZENhcmRDb21wVGhlbWVEYXRhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmNvbXBldGVuY3lBcmVhXG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQXJlYShvcHRpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICB9XG4gICAgfSwoKF9lcnI6IGFueSkgPT4ge1xuICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgS0NNIEZyYW1ld29yayByZWFkIGZhaWxlZC5gKVxuICAgIH0pKVxuICB9XG5cbiAgZm9ybWF0ZURhdGEocmVzcG9uc2U6IGFueSwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xuICAgIChyZXNwb25zZS5jYXRlZ29yaWVzKS5mb3JFYWNoKChhOmFueSkgPT4ge1xuICAgICAgaWYoYS5jb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5rY21MaXN0LnNldChhLmNvZGUsIHtcbiAgICAgICAgICBjb2RlOiBhLmNvZGUsXG4gICAgICAgICAgaWRlbnRpZmllcjogYS5pZGVudGlmaWVyLFxuICAgICAgICAgIGluZGV4OiBhLmluZGV4LFxuICAgICAgICAgIG5hbWU6IGEubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYS5kZXNjcmlwdGlvbixcbiAgICAgICAgICBjb25maWc6IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRDb25maWdPZkNhdGVnb3J5Q29uZmlnQnlGcmFtZVdvcmtJZChhLmNvZGUsIGZyYW1ld29ya0lkKSxcbiAgICAgICAgICAvLyBjaGlsZHJlbjogKFsuLi5hLnRlcm1zLCAuLi5sb2NhbERhdGFdIHx8IFtdKS5tYXAoYyA9PiB7XG4gICAgICAgICAgY2hpbGRyZW46IChhLnRlcm1zIHx8IFtdKS5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3NvY2lhdGlvbnMgPSBjLmFzc29jaWF0aW9ucyB8fCBbXVxuICAgICAgICAgICAgaWYgKGFzc29jaWF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYywgeyBjaGlsZHJlbjogYXNzb2NpYXRpb25zIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5rY21MaXN0LmZvckVhY2goKGE6IGFueSkgPT4ge1xuICAgICAgaWYoYS5jb2RlID09PSBfLmdldCh0aGlzLmtjbUNvbmZpZ0RhdGEsICdjb25maWdbMF0uY2F0ZWdvcnknKSl7XG4gICAgICAgIHRoaXMuY29tcGV0ZW5jeUFyZWEgPSBhXG4gICAgICB9XG4gICAgfSlcbiAgICBcblxuICB9XG5cblxuICBjcmVhdGVDb21wVGhlbWVGaWVsZHMoKTpVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb21wZXRlbmN5VGhlbWU6WycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgY29tcGV0ZW5jeVN1YlRoZW1lOlsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXVxuICAgIH0pXG4gIH1cblxuXG4gIGdldENyZWF0ZU5hbWUoZGF0YTogYW55KSB7XG4gICAgICBsZXQgcG9wVXBDYXRlZ29yeSA9IGRhdGEuY2FyZENvbEluZm8gPyBkYXRhLmNhcmRDb2xJbmZvLm5hbWUgOiBkYXRhLmNvbHVtbkluZm8ubmFtZVxuICAgICAgc3dpdGNoKHBvcFVwQ2F0ZWdvcnkpe1xuICAgICAgICBjYXNlICdEZXNpZ25hdGlvbic6XG4gICAgICAgIHJldHVybiBgQ3JlYXRlIENvbXBldGVuY3kgTWFwcGluZ2A7XG4gICAgICAgIGNhc2UgJ1N1YiBUaGVtZSc6XG4gICAgICAgICAgaWYoZGF0YS5vcGVuTW9kZSA9PT0gJ3ZpZXcnKSB7XG4gICAgICAgICAgICByZXR1cm4gYFZpZXcgQ29tcGV0ZW5jeSAke3BvcFVwQ2F0ZWdvcnl9YFxuICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBBZGQgQ29tcGV0ZW5jeSAke3BvcFVwQ2F0ZWdvcnl9YFxuICAgICAgICBjYXNlICdDb21wZXRlbmN5JzpcbiAgICAgICAgICBpZihkYXRhLm9wZW5Nb2RlID09PSAnZWRpdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBgRWRpdCBDb21wZXRlbmN5IFRoZW1lYFxuICAgICAgICAgIH0gZWxzZSBpZihkYXRhLm9wZW5Nb2RlID09PSAndmlldycpIHtcbiAgICAgICAgICAgIHJldHVybiBgVmlldyBDb21wZXRlbmN5IFRoZW1lYFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYENyZWF0ZSBDb21wZXRlbmN5IE1hcHBpbmdgXG4gICAgICAgICAgZGVmYXVsdDogcmV0dXJuICcnXG4gICAgICB9XG4gIH1cblxuICBjbGVhclNlbGVjdGVkVGhlbWVzKG9wdGlvbjphbnkpe1xuICAgIGlmKHRoaXMuaXNUaGVtZVNlbGVjdGVkKSB7XG4gICAgICB0aGlzLm9wZW5Db25mb3JhbXRpb25Qb3B1cChvcHRpb24pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25TZWxlY3Rpb25BcmVhKG9wdGlvbilcbiAgICB9XG4gIH1cblxuICBnZXQgaXNUaGVtZVNlbGVjdGVkICgpIHtcbiAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZVxuICAgIGlmICh0aGlzLmNvbXBldGVuY3lGb3JtKSB7XG4gICAgICBjb25zdCBjb21wVGhlbWVGaWVsZHMgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcFRoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICAgIGlmIChjb21wVGhlbWVGaWVsZHMpIHtcbiAgICAgICAgY29tcFRoZW1lRmllbGRzLmNvbnRyb2xzLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICAgICAgaWYoZWxlbWVudC5nZXQoJ2NvbXBldGVuY3lUaGVtZScpPy52YWx1ZSB8fCBlbGVtZW50LmdldCgnY29tcGV0ZW5jeVN1YlRoZW1lJyk/LnZhbHVlKSB7XG4gICAgICAgICAgICBoYXNWYWx1ZSA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzVmFsdWVcbiAgfVxuXG4gIG9wZW5Db25mb3JhbXRpb25Qb3B1cChvcHRpb246YW55KSB7XG4gICAgY29uc3QgZGlhbG9nRGF0YSA9IHtcbiAgICAgIGRpYWxvZ1R5cGU6ICd3YXJuaW5nJyxcbiAgICAgIGRlc2NyaXB0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGFsdGVyIHRoZSBjb21wZXRlbmN5IGFyZWE/JyxcbiAgICAgICAgICBoZWFkZXJDbGFzczogJ2ZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtYmx1ZSB0ZXh0Qm9sZCcsXG4gICAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbXNnQ2xhc3M6ICcnLFxuICAgICAgICAgICAgICBtc2c6IGBUaGlzIGFjdGlvbiB3aWxsIHJlc3VsdCBpbiB0aGUgbG9zcyBvZiB5b3VyIGN1cnJlbnRseSBhZGRlZCBkYXRhYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBmb290ZXJDbGFzczogJ2l0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlcicsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBidG5UZXh0OiAnQ2FuY2VsJyxcbiAgICAgICAgICBidG5DbGFzczogJ2J0bi1vdXRsaW5lJyxcbiAgICAgICAgICByZXNwb25zZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBidG5UZXh0OiAnQ29uZmlybScsXG4gICAgICAgICAgYnRuQ2xhc3M6ICdidG4tZnVsbC1zdWNjZXNzJyxcbiAgICAgICAgICByZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZm9yYW10aW9uUG9wdXBDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICBtYXhXaWR0aDogJzgwdncnLFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgfSlcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25BcmVhKG9wdGlvbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbXBBcmVhQ29udHJvbCA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wQXJlYScpO1xuICAgICAgICBpZiAoY29tcEFyZWFDb250cm9sKSB7XG4gICAgICAgICAgY29tcEFyZWFDb250cm9sLnNldFZhbHVlKHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhKTtcbiAgICAgICAgICBjb21wQXJlYUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQXJlYShvcHRpb246YW55KXtcbiAgICB0aGlzLmNvbXBldGVuY3lGb3JtLnJlc2V0KClcbiAgICB3aGlsZSh0aGlzLmNvbXBUaGVtZUZpZWxkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuY29tcFRoZW1lRmllbGRzLnJlbW92ZUF0KDApO1xuICAgIH1cbiAgICB0aGlzLmNvbXBUaGVtZUZpZWxkcy5wdXNoKHRoaXMuY3JlYXRlQ29tcFRoZW1lRmllbGRzKCkpO1xuICAgIGlmKCd0aGVtZScgPT09IHRoaXMua2NtQ29uZmlnRGF0YS5jb25maWdbMV0uY2F0ZWdvcnkpe1xuICAgICAgdGhpcy5zZWxldGVkQ29tcGV0ZW5jeUFyZWEgPSBvcHRpb25cbiAgICAgIGNvbnN0IGNvbXBBcmVhQ29udHJvbCA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wQXJlYScpO1xuICAgICAgaWYgKGNvbXBBcmVhQ29udHJvbCkge1xuICAgICAgICBjb21wQXJlYUNvbnRyb2wucGF0Y2hWYWx1ZShvcHRpb24pO1xuICAgICAgICBjb21wQXJlYUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJlZGFsbENvbXBldGVuY3lUaGVtZSA9IFtdXG4gICAgICB0aGlzLmFsbENvbXBldGVuY3lUaGVtZSA9IFtdXG4gICAgICBpZihvcHRpb24gJiYgIG9wdGlvbi5jaGlsZHJlbiAmJiAgb3B0aW9uLmNoaWxkcmVuLmxlbmd0aCl7XG4gICAgICAgIGxldCB0aGVtZVZhbHVlID0gdGhpcy5rY21MaXN0LmdldCh0aGlzLmtjbUNvbmZpZ0RhdGEuY29uZmlnWzFdLmNhdGVnb3J5KVxuICAgICAgICBvcHRpb24uY2hpbGRyZW4uZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZihlbGUuY2F0ZWdvcnkgPT09ICd0aGVtZScgKSB7XG4gICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGVtZVZhbHVlLmNoaWxkcmVuLmZpbmRJbmRleCgodGhlbWVEYXRhIDphbnkgKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoZWxlLnJlZklkID09PSB0aGVtZURhdGEucmVmSWQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGVtZURhdGEuY2hpbGRyZW4gJiYgdGhlbWVEYXRhLmNoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgaWYocmVzdWx0ID49IDApe1xuICAgICAgICAgICAgICAgIHRoaXMuYWxsQ29tcGV0ZW5jeVRoZW1lLnB1c2goZWxlKVxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUucHVzaChlbGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZih0aGlzLmNvbXBldGVuY3lBcmVhICYmIHRoaXMuY29tcGV0ZW5jeUFyZWEuY2hpbGRyZW4pIHtcbiAgICAgICAgICB0aGlzLmNvbXBldGVuY3lBcmVhLmNoaWxkcmVuLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICAgICAgICBpZihlbGVtZW50LmNvZGUgPT09IG9wdGlvbi5jb2RlKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhID0gb3B0aW9uXG4gICAgICAgICAgICAgIGlmKGVsZW1lbnQuY2hpbGRyZW4gJiYgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNoaWxkcmVuLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZihlbGUuY2F0ZWdvcnkgPT09ICd0aGVtZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxDb21wZXRlbmN5VGhlbWUucHVzaChlbGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUucHVzaChlbGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIGRvOiAgdG8gYmUgY2hlY2sgYmFzZWQgb24gcmVmZiBpZFxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnNlbGVjdGVkQ2FyZENvbXBUaGVtZURhdGEucmVmSWQudG9Mb3dlckNhc2UoKSA9PT0gZWxlLnJlZklkLnRvTG93ZXJDYXNlKCkpe1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3JtQXJyYXk6YW55ID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUFycmF5LmF0KDApLmdldCgnY29tcGV0ZW5jeVRoZW1lJykucGF0Y2hWYWx1ZShlbGUpXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUFycmF5LmF0KDApLmdldCgnY29tcGV0ZW5jeVRoZW1lJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcEFyZWFDb250cm9sID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBBcmVhJyk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBBcmVhQ29udHJvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcEFyZWFDb250cm9sLnBhdGNoVmFsdWUob3B0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBBcmVhQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgfVxuICB9XG5cbiAgYWRkQ29tcGV0ZW5jeVRoZW1lKCl7XG4gICAgaWYgKHRoaXMuZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJykge1xuICAgICAgdGhpcy5jb21wVGhlbWVGaWVsZHMuaW5zZXJ0KDAsIHRoaXMuY3JlYXRlQ29tcFRoZW1lRmllbGRzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUNvbXBGaWVsZHMoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIHRoaXMuY29tcFRoZW1lRmllbGRzLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBPblRoZW1lU2VsZWN0aW9uKGV2ZW50OiBhbnksIF9pbmRleFZhbHVlOiBhbnksIG9wdGlvbkRhdGE6YW55KSB7XG4gICAgLy8gaWYgKGV2ZW50LmlzVXNlcklucHV0IHx8IHRoaXMuZGF0YS5vcGVuTW9kZSA9PT0gJ3ZpZXcnKSB7ICAgXG4gICAgY29uc3Qgc2VsZWN0ZWRUaGVtZSA9IGV2ZW50LnNvdXJjZS52YWx1ZVxuICAgIHRoaXMua2NtTGlzdC5mb3JFYWNoKChlbGU6YW55KSA9PiB7XG4gICAgICBpZihzZWxlY3RlZFRoZW1lLmNhdGVnb3J5ID09PSBlbGUuY29kZSkge1xuICAgICAgICBpZihlbGUuY2hpbGRyZW4gJiYgZWxlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgIGVsZS5jaGlsZHJlbi5mb3JFYWNoKCh0aGVtZUNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmKHRoZW1lQ2hpbGQuaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRUaGVtZS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIGlmKHRoZW1lQ2hpbGQuY2hpbGRyZW4gJiYgdGhlbWVDaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25EYXRhWydjaGlsZHJlbiddID0gdGhlbWVDaGlsZC5jaGlsZHJlblxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5U3ViVGhlbWUgPSB0aGVtZUNoaWxkLmNoaWxkcmVuIFxuICAgICAgICAgICAgICAgICAvLyB0byBkbzogIHRvIGJlIGNoZWNrIGJhc2VkIG9uIHJlZmYgaWRcbiAgICAgICAgICAgICAgICAgbGV0IG1hdGNoZWREYXRhID0gW11cbiAgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmNoaWxkcmVuRGF0YSAmJiB0aGlzLmRhdGEuY2hpbGRyZW5EYXRhLmNhdGVnb3J5ID09PSBcInN1YnRoZW1lXCIpIHtcbiAgICAgICAgICAgICAgICAgIG1hdGNoZWREYXRhID0gXy5pbnRlcnNlY3Rpb25CeSh0aGVtZUNoaWxkLmNoaWxkcmVuLFt0aGlzLmRhdGEuY2hpbGRyZW5EYXRhXSwgJ3JlZklkJyk7XG4gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkRGF0YSA9IF8uaW50ZXJzZWN0aW9uQnkodGhlbWVDaGlsZC5jaGlsZHJlbix0aGlzLnNlbGVjdGVkQ2FyZENvbXBUaGVtZURhdGEuY2hpbGRyZW4sICdyZWZJZCcpO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBsZXQgZm9ybUFycmF5ID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjb21wZXRlbmN5U3ViVGhlbWVDb250cm9sID0gZm9ybUFycmF5LmF0KF9pbmRleFZhbHVlKS5nZXQoJ2NvbXBldGVuY3lTdWJUaGVtZScpO1xuICAgICAgICAgICAgICAgICAgaWYgKGNvbXBldGVuY3lTdWJUaGVtZUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGV0ZW5jeVN1YlRoZW1lQ29udHJvbC5wYXRjaFZhbHVlKG1hdGNoZWREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcGV0ZW5jeVN1YlRoZW1lQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAvLyB9XG4gIH1cblxuICBvblRlcm1SZW1vdmUodGVybURhdGE6IGFueSwgaW5kZXhWYWx1ZTogbnVtYmVyKSB7XG4gICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIGNvbnN0IGNvbXBUaGVtZUNvbnRyb2wgPSBmb3JtQXJyYXkuYXQoaW5kZXhWYWx1ZSkuZ2V0KCdjb21wZXRlbmN5U3ViVGhlbWUnKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2wgfCBudWxsXG4gICAgaWYgKGNvbXBUaGVtZUNvbnRyb2wpIHtcbiAgICAgIGNvbnN0IHRoZW1lcyA9IGNvbXBUaGVtZUNvbnRyb2wudmFsdWVcbiAgICAgIGlmICh0aGVtZXMpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGVtZXMuaW5kZXhPZih0ZXJtRGF0YSlcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICB0aGVtZXMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgIGNvbXBUaGVtZUNvbnRyb2wuc2V0VmFsdWUodGhlbWVzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICB9XG5cbiAgT25TdWJUaGVtZVNlbGVjdGlvbihfZXZlbnQ6IGFueSwgX2luZGV4VmFsdWU6IG51bWJlciwgX29wdGlvbjogYW55KXtcbiAgICAvLyBsZXQgZm9ybUFycmF5ID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgLy8gY29uc3QgY29tcFRoZW1lQ29udHJvbCA9IGZvcm1BcnJheS5hdChpbmRleFZhbHVlKS5nZXQoJ2NvbXBldGVuY3lTdWJUaGVtZScpIGFzIFVudHlwZWRGb3JtQ29udHJvbCB8IG51bGxcbiAgICBcbiAgfVxuXG4gIC8vIGFkZCBmb3JtXG4gIGFzeW5jIG11bHRpQ3JlYXRlKGZvcm06IGFueSwgX2RhdGE6IGFueSkge1xuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gdHJ1ZVxuICAgIC8vIGxldCBjb3VudGVyVGhlbWUgPSAwXG4gICAgbGV0IGNvdW50ZXJTdWJUaGVtZSA9IDBcbiAgICBsZXQgcGFyZW50Q2F0ZWdvcnkgPSB7fVxuICAgIGxldCBjcmVhdGVkVGVybXM6YW55ID0gW11cbiAgICBsZXQgY3JlYXRlZFN1YlRoZW1lID0gW11cbiAgICBpZihmb3JtLnZhbGlkKSB7XG4gICAgICBjb25zdCB0aGVtZUZpZWxkcyA9IGZvcm0gJiYgZm9ybS52YWx1ZSAmJiBmb3JtLnZhbHVlLmNvbXBUaGVtZUZpZWxkc1xuICAgICAgaWYodGhlbWVGaWVsZHMgJiYgdGhlbWVGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgIGxldCBsb2NhbENvbXBBcmVhID0gey4uLnRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhfVxuICAgICAgICBpZihsb2NhbENvbXBBcmVhLmNoaWxkcmVuICYmIGxvY2FsQ29tcEFyZWEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgZGVsZXRlIGxvY2FsQ29tcEFyZWEuY2hpbGRyZW5cbiAgICAgICAgfVxuICAgICAgICBpZihsb2NhbENvbXBBcmVhLmFzc29jaWF0aW9ucyAmJiBsb2NhbENvbXBBcmVhLmFzc29jaWF0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICBkZWxldGUgbG9jYWxDb21wQXJlYS5hc3NvY2lhdGlvbnNcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZW1lRmllbGRzLmZvckVhY2goYXN5bmMgKG9ialZhbCwgdGhlbWVJbmRleCkgPT5cbiAgICAgICAgZm9yKGxldCBbaW5kZXgsIG9ialZhbF0gb2YgdGhlbWVGaWVsZHMuZW50cmllcygpKSB7XG4gICAgICAgICAgcGFyZW50Q2F0ZWdvcnkgPSB7fVxuICAgICAgICAgIGlmKG9ialZhbFsnY29tcGV0ZW5jeVRoZW1lJ10pIHtcbiAgICAgICAgICAgIGNyZWF0ZWRUZXJtcz0gW11cbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialZhbFsnY29tcGV0ZW5jeVRoZW1lJ11cbiAgICAgICAgICAgIGNvbnN0IHRlcm06IE5TRnJhbWV3b3JrLklDcmVhdGVUZXJtID0ge1xuICAgICAgICAgICAgICBjb2RlOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0VXVpZCgpLFxuICAgICAgICAgICAgICBuYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICAgICAgICBzdGF0dXM6IGFwcENvbnN0YW50cy5MSVZFLFxuICAgICAgICAgICAgICByZWZJZDogdmFsdWUucmVmSWQgfHwgJycsXG4gICAgICAgICAgICAgIHJlZlR5cGU6IHZhbHVlLnJlZlR5cGUgfHwgJycsXG4gICAgICAgICAgICAgIC8vIGFwcHJvdmFsU3RhdHVzOmFwcENvbnN0YW50cy5EUkFGVCxcbiAgICAgICAgICAgICAgcGFyZW50czogW1xuICAgICAgICAgICAgICAgIHsgaWRlbnRpZmllcjogYCR7dGhpcy5kYXRhLmZyYW1ld29ya0lkLnRvTG93ZXJDYXNlKCl9XyR7dGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZX1gIH1cbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICBjb21wZXRlbmN5QXJlYTogbG9jYWxDb21wQXJlYSxcbiAgICAgICAgICAgICAgICB0aW1lU3RhbXA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OmFueSA9IHtcbiAgICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICAgIHRlcm06IHRlcm1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmNyZWF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCByZXF1ZXN0Qm9keSkudG9Qcm9taXNlKCkudGhlbihhc3luYyAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtWydpZGVudGlmaWVyJ10gPSByZXMucmVzdWx0Lm5vZGVfaWRbMF1cbiAgICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZGVsZXRlKCdjb21wZXRlbmN5JylcbiAgICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnkgPSByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1cbiAgICAgICAgICAgICAgY3JlYXRlZFRlcm1zLnB1c2gocmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtKVxuICAgICAgICAgICAgICAvLyBjb3VudGVyVGhlbWUrK1xuXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbHVtbjogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgICAgICAgbGV0IHBhcmVudENvbDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbi5jb2RlKVxuICBcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGlWMihjcmVhdGVkVGVybXMscGFyZW50Q29sKVxuICAgICAgICAgICAgICAvLyAvLyBhd2FpdCB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aShjcmVhdGVkVGVybXMpXG5cbiAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICBcInNlbGVjdGVkXCI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IHBhcmVudENvbHVtbi5jb2RlLFxuICAgICAgICAgICAgICAgICAgICBcImNhcmRTdWJUeXBlXCI6IFwibWluaW1hbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImlzVmlld09ubHlcIjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIFwiaW5kZXhcIjogcGFyZW50Q29sdW1uLmluZGV4LFxuICAgICAgICAgICAgICAgICAgICBcImNvbHVtbkluZm9cIjogdGhpcy5kYXRhLmNhcmRDb2xJbmZvXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGExMiA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzOiB7IHRlcm06IFt0aGlzLnNlbGVjdGVkVGVybV0sIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUgfSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmluZGV4LFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbXVsdGktY3JlYXRlJ1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUFmdGVyQWRkT3JFZGl0U3ViamVjdChyZXNwb25zZURhdGExMilcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYob2JqVmFsWydjb21wZXRlbmN5U3ViVGhlbWUnXSkge1xuICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Quc2V0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHBhcmVudENhdGVnb3J5KVxuXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBvYmpWYWxbJ2NvbXBldGVuY3lTdWJUaGVtZSddXG4gICAgICAgICAgICBpZih2YWx1ZSAmJiB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY291bnRlclN1YlRoZW1lID0gMFxuICAgICAgICAgICAgICBjcmVhdGVkU3ViVGhlbWUgPSBbXVxuICAgICAgICAgICAgICAvLyB2YWx1ZS5mb3JFYWNoKGFzeW5jIChlbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcihsZXQgZWxlIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVybTogTlNGcmFtZXdvcmsuSUNyZWF0ZVRlcm0gPSB7XG4gICAgICAgICAgICAgICAgICBjb2RlOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0VXVpZCgpLFxuICAgICAgICAgICAgICAgICAgbmFtZTogZWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZWxlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZGF0YS5uZXh0Q29sSW5mby5jb2RlLFxuICAgICAgICAgICAgICAgICAgc3RhdHVzOiBhcHBDb25zdGFudHMuTElWRSxcbiAgICAgICAgICAgICAgICAgIHJlZklkOiBlbGUucmVmSWQgfHwgJycsXG4gICAgICAgICAgICAgICAgICByZWZUeXBlOiBlbGUucmVmVHlwZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgIHBhcmVudHM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBpZGVudGlmaWVyOiBgJHt0aGlzLmRhdGEuZnJhbWV3b3JrSWQudG9Mb3dlckNhc2UoKX1fJHt0aGlzLmRhdGEubmV4dENvbEluZm8uY29kZX1gIH1cbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICB0aW1lU3RhbXA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OmFueSA9IHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgdGVybTogdGVybVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2VEYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmNyYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHRoaXMuZGF0YS5uZXh0Q29sSW5mby5jb2RlLCByZXF1ZXN0Qm9keSlcblxuICAgICAgICAgICAgICAgIHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybVsnaWRlbnRpZmllciddID0gcmVzcG9uc2VEYXRhLnJlc3VsdC5ub2RlX2lkWzBdXG4gICAgICAgICAgICAgICAgY3JlYXRlZFN1YlRoZW1lLnB1c2gocmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtKVxuICAgICAgICAgICAgICAgIGNvdW50ZXJTdWJUaGVtZSsrXG4gICAgICAgICAgICAgICAgaWYoKGNvdW50ZXJTdWJUaGVtZSA9PT0gb2JqVmFsWydjb21wZXRlbmN5U3ViVGhlbWUnXS5sZW5ndGgpKXtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbHVtbkNvbmZpZ0RhdGE6YW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLm5leHRDb2xJbmZvLmNvZGUpXG4gICAgICAgICAgICAgICAgICBsZXQgcGFyZW50Q29sOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlKVxuICAgICAgXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aVYyKGNyZWF0ZWRTdWJUaGVtZSxwYXJlbnRDb2wsIGluZGV4LCB0aGVtZUZpZWxkcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICBpZihpbmRleCA9PT0gdGhlbWVGaWVsZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5kZWxldGUoJ2NvbXBldGVuY3knKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogdGhpcy5zZWxlY3RlZFRlcm1BcnJheSwgY3JlYXRlZDogdHJ1ZSwgbXVsdGk6ZmFsc2UsIGNhbGxVcGRhdGU6IGZhbHNlIH0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSBNYXBwaW5nIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBhc3luYyBjcmF0ZVRlcm0oZnJhbWV3b3JrSWQ6IGFueSwgY29sQ29kZTogYW55LCByZXF1ZXN0Qm9keTogYW55KXtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpPT57XG4gICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UuY3JlYXRlVGVybShmcmFtZXdvcmtJZCwgY29sQ29kZSwgcmVxdWVzdEJvZHkpLnN1YnNjcmliZSgocmVzOiBhbnkpPT57XG4gICAgICAgIHJlc29sdmUocmVzKVxuICAgICAgfSwoKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDcmVhdGUgVGVybSBmYWlsZWQuYClcbiAgICAgIH0pKVxuICAgIH0pXG4gIH1cblxuXG5cbiAgYXN5bmMgdXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpVjIoY3JlYXRlZFRlcm1zOiBhbnlbXSwgcGFyZW50U2VsZWN0ZWRUZXJtPzogYW55LCBfcnVubmluZ0luZGV4PzogbnVtYmVyLCBfdGhlbUZpZWxkc0xlbmd0aD86IG51bWJlcikge1xuICAgIGlmKGNyZWF0ZWRUZXJtcyAmJiBjcmVhdGVkVGVybXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGVybUFycmF5ID0gW11cbiAgICAgIC8vIGxldCBjcmVhdGVkVGVybXNDb3VudGVyID0gMFxuICAgICAgbGV0IGNyZWF0ZWRUZXJtc0lkZW50aWZpZXJzID0gW11cbiAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXkgPSBjcmVhdGVkVGVybXNcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gY3JlYXRlZFRlcm1zW2NyZWF0ZWRUZXJtcy5sZW5ndGggLTFdXG4gICAgICBmb3IobGV0IGNyZWF0ZWRUZXJtIG9mIGNyZWF0ZWRUZXJtcykge1xuICAgICAgICBjcmVhdGVkVGVybXNJZGVudGlmaWVycy5wdXNoKHsgaWRlbnRpZmllcjogY3JlYXRlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgICAgfVxuICAgICAgbGV0IGFzc29jaWF0aW9ucyA9IFtdXG4gICAgICBsZXQgY291bnRlciA9IDBcbiAgICAgIGlmKCFwYXJlbnRTZWxlY3RlZFRlcm0pIHtcbiAgICAgICAgZm9yKGNvbnN0IFt2YWx1ZV0gb2YgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Qpe1xuICAgICAgICAgIGNvbnN0IHBhcmVudDphbnkgPSB2YWx1ZVxuICAgICAgICAgIGNvdW50ZXIrK1xuICAgICAgICAgIGFzc29jaWF0aW9ucyA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYy5pZGVudGlmaWVyID8gIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyIH0gOiBudWxsXG4gICAgICAgICAgfSkgOiBbXVxuICAgICAgICAgICAgYXNzb2NpYXRpb25zID0gWy4uLmFzc29jaWF0aW9ucywgLi4uY3JlYXRlZFRlcm1zSWRlbnRpZmllcnNdXG4gICAgICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICAgICAgICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICAgICAgLi4uKGFzc29jaWF0aW9ucyAmJiBhc3NvY2lhdGlvbnMubGVuZ3RoKSA/IHthc3NvY2lhdGlvbnM6IFsuLi5hc3NvY2lhdGlvbnNdfSA6IG51bGwsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxVcGRhdGVBc3NvY2lhdGlvbnNWMihjb3VudGVyLCBwYXJlbnQsIHJlZ3Vlc3RCb2R5KVxuICAgICAgICAgIC8vIGNyZWF0ZWRUZXJtc0NvdW50ZXIrK1xuICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc0NvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgICAgIC8vIGlmKHJ1bm5pbmdJbmRleCA9PT0gdGhlbUZpZWxkc0xlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmRlbGV0ZSgnY29tcGV0ZW5jeScpXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IFt0aGlzLnNlbGVjdGVkVGVybV0sIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUsIGNhbGxVcGRhdGU6IGZhbHNlIH0pXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyAgICAgaWYoY3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5ID09PSAndGhlbWUnKXtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICdzdWJ0aGVtZScpeyAgICAgICAgIFxuXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgLy8gfVxuICAgICAgICB9IFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gcGFyZW50U2VsZWN0ZWRUZXJtXG4gICAgICAgIGFzc29jaWF0aW9ucyA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgICB9KSA6IFtdXG4gICAgICAgICAgYXNzb2NpYXRpb25zID0gWy4uLmFzc29jaWF0aW9ucywgLi4uY3JlYXRlZFRlcm1zSWRlbnRpZmllcnNdXG4gICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgICAgY29uc3QgcmVndWVzdEJvZHkgPSB7XG4gICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgICAuLi4oYXNzb2NpYXRpb25zICYmIGFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogWy4uLmFzc29jaWF0aW9uc119IDogbnVsbCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxsVXBkYXRlQXNzb2NpYXRpb25zVjIoY291bnRlciwgcGFyZW50LCByZWd1ZXN0Qm9keSlcblxuICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc0NvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgLy8gdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IFt0aGlzLnNlbGVjdGVkVGVybV0sIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUsIHN0b3BVcGRhdGU6IGZhbHNlIH0pXG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3N1YnRoZW1lJyl7ICAgXG4gICAgICAgICAgLy8gICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgIC8vIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGkoY3JlYXRlZFRlcm1zOiBhbnlbXSkge1xuICAgIGlmKGNyZWF0ZWRUZXJtcyAmJiBjcmVhdGVkVGVybXMubGVuZ3RoKSB7XG4gICAgICAvLyBsZXQgY3JlYXRlZFRlcm1zQ291bnRlciA9IDBcbiAgICAgIGZvcihsZXQgY3JlYXRlZFRlcm0gb2YgY3JlYXRlZFRlcm1zKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gY3JlYXRlZFRlcm1cbiAgICAgICAgbGV0IGFzc29jaWF0aW9ucyA9IFtdXG4gICAgICAgIGxldCB0ZW1wXG4gICAgICAgIGxldCBjb3VudGVyID0gMFxuICAgICAgICAvLyBsZXQgbG9jYWxJc0V4aXN0ID0gZmFsc2VcbiAgICAgICAgXG4gICAgICAgIGZvcihjb25zdCBbdmFsdWVdIG9mIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0KXtcbiAgICAgICAgICBjb25zdCBwYXJlbnQ6YW55ID0gdmFsdWVcbiAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICB0ZW1wID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbHRlcigoY2hpbGQ6YW55KSA9PiBjaGlsZC5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IG51bGxcbiAgICAgICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgICAgIH0pIDogW11cbiAgICAgICAgICBpZiAodGVtcCAmJiB0ZW1wLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgICAgICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgLy8gaWYoY3JlYXRlZFRlcm1zQ291bnRlciA9PT0gKGNyZWF0ZWRUZXJtcy5sZW5ndGgtMSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbFVwZGF0ZUFzc29jaWF0aW9ucyhjb3VudGVyLCBwYXJlbnQsIHJlZ3Vlc3RCb2R5KVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNyZWF0ZWRUZXJtc0NvdW50ZXIrK1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNhbGxVcGRhdGVBc3NvY2lhdGlvbnNWMihjb3VudGVyOiBhbnksIHBhcmVudDogYW55LCByZWd1ZXN0Qm9keTogYW55ICk6IFByb21pc2U8YW55PntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgICBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBwYXJlbnQgJiYgcGFyZW50LmNoaWxkcmVuID9bLi4ucGFyZW50LmNoaWxkcmVuLCAuLi50aGlzLnNlbGVjdGVkVGVybUFycmF5XTp0aGlzLnNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgICAgbGV0IGxpc3REYXRhIDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmxpc3QuZ2V0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgICAgICAgbGV0IGRpZmZlcmVuY2VEYXRhID0gW11cbiAgICAgICAgICBpZihsaXN0RGF0YSAmJiBsaXN0RGF0YS5jaGlsZHJlbiAmJiBsaXN0RGF0YS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpZmZlcmVuY2VEYXRhICA9IF8uZGlmZmVyZW5jZUJ5KHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXksbGlzdERhdGEuY2hpbGRyZW4sICdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpZmZlcmVuY2VEYXRhID0gdGhpcy5zZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICAgIH1cbiAgICAgICAgICBsaXN0RGF0YVsnYXNzb2NpYXRpb25zJ10gPSBsaXN0RGF0YSAmJiBsaXN0RGF0YS5hc3NvY2lhdGlvbnMgP1suLi5saXN0RGF0YS5hc3NvY2lhdGlvbnMsIC4uLmRpZmZlcmVuY2VEYXRhXTpkaWZmZXJlbmNlRGF0YVxuICAgICAgICAgIGxpc3REYXRhWydjaGlsZHJlbiddID0gbGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gP1suLi5saXN0RGF0YS5jaGlsZHJlbiwgLi4uZGlmZmVyZW5jZURhdGFdOmRpZmZlcmVuY2VEYXRhXG5cbiAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5mb3JFYWNoKChzZWxlY3RlZERhdGE6IGFueSk9PiB7XG4gICAgICAgICAgICBsZXQgbGlzdERhdGEgOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UubGlzdC5nZXQoc2VsZWN0ZWREYXRhLmNhdGVnb3J5KVxuICAgICAgICAgICAgaWYobGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gJiYgbGlzdERhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlTG9jYWxMaXN0KGxpc3REYXRhLHBhcmVudCwgdGhpcy5zZWxlY3RlZFRlcm1BcnJheSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSBcbiAgICAgICAgLy8gbGV0IHNlbGVjdGVkQ2FyZEluZm8gPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQodGhpcy5kYXRhLmNhcmRDb2xJbmZvLmNvZGUpXG4gICAgICAgIC8vIHRoaXMuZnJhbWVXb3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLm5leHQoeyB0eXBlOiBzZWxlY3RlZENhcmRJbmZvLmNvZGUsIGRhdGE6c2VsZWN0ZWRDYXJkSW5mbywgY2FyZFJlZjpzZWxlY3RlZENhcmRJbmZvLmNhcmRSZWYsIGlzVXBkYXRlOiB0cnVlfSlcbiAgICAgICAgaWYgKGNvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgICAvLyBzbyB0ZXJtIGlzIHNldCBmcm9tIGNoaWxkZGF0YSB3aGljaCBpcyByZWNlaXZlZCBmcm9tIHBhcmFtcyBpbiB1cGRhdGVEYXRhXG4gICAgICAgICAgLy8gY29uc3QgdmFsdWUgPSAodGhpcy5zZWxlY3RlZFRlcm0gJiYgdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgPyB0aGlzLnNlbGVjdGVkVGVybSA6IHt9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gY29uc3QgZm91bmQgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmluZChjPT4gYy5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IGZhbHNlXG4gICAgICAgICAgLy8gaWYoIWZvdW5kKSB7XG5cbiAgICAgICAgICAgIC8vIHBhcmVudFsnY2hpbGRyZW4nXSA9IHBhcmVudCAmJiBwYXJlbnQuY2hpbGRyZW4gP1suLi5wYXJlbnQuY2hpbGRyZW4sIC4uLnRoaXMuc2VsZWN0ZWRUZXJtQXJyYXldOnRoaXMuc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgICAgIC8vIHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMuc2VsZWN0ZWRUZXJtKSA6IHBhcmVudFsnY2hpbGRyZW4nXSA9IFt0aGlzLnNlbGVjdGVkVGVybV1cbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgOiBhbnkgPSB0cnVlXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIGF3YWl0IHJldHVyblZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHJldHVyblZhbHVlIDogYW55ID0gdHJ1ZVxuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICBhd2FpdCByZXR1cm5WYWx1ZVxuICAgICAgICB9XG4gICAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBUZXJtIEFzc29jaWF0aW9uIGZhaWxlZC5gKVxuICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBjYWxsVXBkYXRlQXNzb2NpYXRpb25zKGNvdW50ZXI6IGFueSwgcGFyZW50OiBhbnksIHJlZ3Vlc3RCb2R5OiBhbnkgKTogUHJvbWlzZTxhbnk+e1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgcGFyZW50LmNhdGVnb3J5LCBwYXJlbnQuY29kZSwgcmVndWVzdEJvZHkpLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChjb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFRlcm1bJ2Fzc29jaWF0aW9uUHJvcGVydGllcyddWydhcHByb3ZhbFN0YXR1cyddID0gJ0RyYWZ0JztcbiAgXG4gICAgICAgICAgLy8gdGhpcyB2YWx1ZSBpcyBmb3Igc2VsZWN0ZWQgdGVybSBpbiBjYXNlIG9mIGNyZWF0ZSBzY2VuYXJpbywgaW4gY2FzZSBvZiBlZGl0IHNjZW5hcmlvIHRoaXMgd29uJ3QgYmUgYXZhaWFibGUgXG4gICAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICAgIC8vIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiB7fVxuICAgICAgICAgIGNvbnN0IGZvdW5kID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbmQoKGM6YW55KT0+IGMuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBmYWxzZVxuICAgICAgICAgIGlmKCFmb3VuZCkge1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcy5zZWxlY3RlZFRlcm0pIDogcGFyZW50WydjaGlsZHJlbiddID0gW3RoaXMuc2VsZWN0ZWRUZXJtXVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSBmYWxzZVxuICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA6IGFueSA9IHRydWVcbiAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgYXdhaXQgcmV0dXJuVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgOiBhbnkgPSB0cnVlXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIGF3YWl0IHJldHVyblZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0sIChfZXJyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRWRpdCAke3RoaXMuZGF0YS5jb2x1bW5JbmZvLm5hbWV9IGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcmApXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB1cGRhdGVUZXJtRGF0YShmb3JtOmFueSwgZGF0YTogYW55KSB7XG4gICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gdHJ1ZVxuICAgIGNvbnN0IGZvcm1EYXRhID0ge1xuICAgICAgLy8gdXNlIHRoaXMgaWYgeW91IG5lZWQgZGlzYWJsZWQgZmllbGQgdmFsdWVzIDogZm9ybS5nZXRSYXdWYWx1ZSgpXG4gICAgICAuLi5mb3JtLnZhbHVlXG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZURhdGEgPSB7XG4gICAgICBmb3JtRGF0YSxcbiAgICAgIHVwZGF0ZVRlcm1EYXRhOiBkYXRhLmNoaWxkcmVuRGF0YVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnModXBkYXRlRGF0YSlcbiAgfVxuXG4gIHVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnModXBkYXRlRGF0YT86IGFueSkge1xuICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgIGxldCB0ZW1wXG4gICAgbGV0IGNvdW50ZXIgPSAwXG4gICAgLy8gbGV0IGxvY2FsSXNFeGlzdCA9IGZhbHNlXG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZm9yRWFjaCgocGFyZW50KSA9PiB7XG4gICAgICBjb3VudGVyKytcbiAgICAgIHRlbXAgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmlsdGVyKChjaGlsZDphbnkpID0+IGNoaWxkLmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIDogbnVsbFxuICAgICAgYXNzb2NpYXRpb25zID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgLy8gcmV0dXJuIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYy5hc3NvY2lhdGlvblByb3BlcnRpZXM/Yy5hc3NvY2lhdGlvblByb3BlcnRpZXMuYXBwcm92YWxTdGF0dXM6ICdEcmFmdCcgfVxuICAgICAgICByZXR1cm4gYy5pZGVudGlmaWVyID8gIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyIH0gOiBudWxsXG4gICAgICB9KSA6IFtdXG4gICAgICBpZiAodGVtcCAmJiB0ZW1wLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gdHJ1ZVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGFwcENvbnN0YW50cy5EUkFGVCB9KVxuICAgICAgICBpZih0aGlzLnNlbGVjdGVkVGVybSAmJiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgYXNzb2NpYXRpb25zLnB1c2goeyBpZGVudGlmaWVyOiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgLi4uKHVwZGF0ZURhdGEgJiYgdXBkYXRlRGF0YS5mb3JtRGF0YSAmJiB1cGRhdGVEYXRhLnVwZGF0ZVRlcm1EYXRhLmNvZGUgPT09IHBhcmVudC5jb2RlKSA/IHsuLi51cGRhdGVEYXRhLmZvcm1EYXRhfTogbnVsbCxcbiAgICAgICAgICAgICAgLi4uKGFzc29jaWF0aW9ucyAmJiBhc3NvY2lhdGlvbnMubGVuZ3RoKSA/IHthc3NvY2lhdGlvbnM6IFsuLi5hc3NvY2lhdGlvbnNdfSA6IG51bGwsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgcGFyZW50LmNhdGVnb3J5LCBwYXJlbnQuY29kZSwgcmVndWVzdEJvZHkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKGNvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRUZXJtWydhc3NvY2lhdGlvblByb3BlcnRpZXMnXVsnYXBwcm92YWxTdGF0dXMnXSA9ICdEcmFmdCc7XG5cbiAgICAgICAgICAgIC8vIHRoaXMgdmFsdWUgaXMgZm9yIHNlbGVjdGVkIHRlcm0gaW4gY2FzZSBvZiBjcmVhdGUgc2NlbmFyaW8sIGluIGNhc2Ugb2YgZWRpdCBzY2VuYXJpbyB0aGlzIHdvbid0IGJlIGF2YWlhYmxlIFxuICAgICAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAodGhpcy5zZWxlY3RlZFRlcm0gJiYgdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgPyB0aGlzLnNlbGVjdGVkVGVybSA6ICh1cGRhdGVEYXRhKSA/IHsuLi51cGRhdGVEYXRhLnVwZGF0ZVRlcm1EYXRhLCAuLi51cGRhdGVEYXRhLmZvcm1EYXRhfSA6IHt9XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHsgLi4udmFsdWUgfSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYFRlcm0gQXNzb2NpYXRpb24gZmFpbGVkLmApXG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG4gIGRpYWxvZ0Nsb3NlKHRlcm06IGFueSkge1xuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5wdWJsaXNoRnJhbWV3b3JrKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRlcm0pXG4gICAgfSwoX2VycjphbnkpPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGVybSlcbiAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYFB1Ymxpc2ggIGZhaWxlZC5gKVxuICAgIH0pO1xuICB9XG5cblxuXG5cblxuICBhc3luYyBtdWx0aUNyZWF0ZVN1YlRoZW1lKF9mb3JtOiBhbnksIGRhdGE6IGFueSkge1xuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gdHJ1ZVxuICAgIGxldCBmb3JtQXJyYXk6YW55ID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgbGV0IHNlbGVjdGVkRm9ybURhdGE6YW55ICA9IGZvcm1BcnJheS5hdCgwKS5nZXQoJ2NvbXBldGVuY3lTdWJUaGVtZScpLnZhbHVlXG4gICAgbGV0IHByZXZpb3VzU3ViVGhlbWVEYXRhID0gZGF0YS5jaGlsZHJlbkRhdGEuY2hpbGRyZW5cbiAgICBsZXQgbmV3bHlBZGRlZDogYW55ID0gW11cbiAgICBsZXQgcmVtb3ZlZEV4aXN0aW5nOmFueSA9IFtdXG4gICAgbGV0IGNyZWF0ZWRTdWJUaGVtZSA9IFtdXG4gICAgbGV0IGNvdW50ZXJTdWJUaGVtZSA9IDBcbiAgICAvLyBsZXQgY291bnRlclJldGlyZVN1YlRoZW1lID0gMFxuICAgIFxuICAgIG5ld2x5QWRkZWQgPSBfLmRpZmZlcmVuY2VCeShzZWxlY3RlZEZvcm1EYXRhLCBwcmV2aW91c1N1YlRoZW1lRGF0YSwgJ3JlZklkJyk7XG4gICAgcmVtb3ZlZEV4aXN0aW5nID0gXy5kaWZmZXJlbmNlQnkocHJldmlvdXNTdWJUaGVtZURhdGEsIHNlbGVjdGVkRm9ybURhdGEsICdyZWZJZCcpO1xuICAgIGlmKG5ld2x5QWRkZWQgJiYgbmV3bHlBZGRlZC5sZW5ndGgpIHtcbiAgICAgICAgLy8gbmV3bHlBZGRlZC5mb3JFYWNoKGFzeW5jICh2YWwsIGkpID0+e1xuICAgICAgICBmb3IobGV0IHZhbCBvZiBuZXdseUFkZGVkKXtcbiAgICAgICAgICBjb25zdCB0ZXJtOiBOU0ZyYW1ld29yay5JQ3JlYXRlVGVybSA9IHtcbiAgICAgICAgICBjb2RlOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0VXVpZCgpLFxuICAgICAgICAgIG5hbWU6IHZhbC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWwuZGVzY3JpcHRpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsXG4gICAgICAgICAgc3RhdHVzOiBhcHBDb25zdGFudHMuTElWRSxcbiAgICAgICAgICByZWZJZDogdmFsLnJlZklkLFxuICAgICAgICAgIHJlZlR5cGU6IHZhbC5yZWZUeXBlLFxuICAgICAgICAgIC8vIGFwcHJvdmFsU3RhdHVzOmFwcENvbnN0YW50cy5EUkFGVCxcbiAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICB7IGlkZW50aWZpZXI6IGAke3RoaXMuZGF0YS5mcmFtZXdvcmtJZC50b0xvd2VyQ2FzZSgpfV8ke3RoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGV9YCB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczoge1xuICAgICAgICAgICAgdGltZVN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVxdWVzdEJvZHk6YW55ID0ge1xuICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICB0ZXJtOiB0ZXJtXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcGFyZW50Q29sdW1uQ29uZmlnRGF0YTphbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgICAgICAgIGxldCBwYXJlbnRDb2w6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUpXG4gICAgICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgbGV0IHJlc3BvbnNlRGF0YTogYW55ID0gYXdhaXQgdGhpcy5jcmF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCByZXF1ZXN0Qm9keSlcbiAgICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1bJ2lkZW50aWZpZXInXSA9IHJlc3BvbnNlRGF0YS5yZXN1bHQubm9kZV9pZFswXVxuICAgICAgICAgIGNyZWF0ZWRTdWJUaGVtZS5wdXNoKHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybSlcbiAgICAgICAgICBjb3VudGVyU3ViVGhlbWUrK1xuICAgICAgICAgIGlmKGNvdW50ZXJTdWJUaGVtZSA9PT0gbmV3bHlBZGRlZC5sZW5ndGgpe1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGlWMihjcmVhdGVkU3ViVGhlbWUsIHBhcmVudENvbClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcGFyZW50Q29sLCBjcmVhdGVkU3ViVGhlbWUsICdjcmVhdGUnKVxuICAgICAgICAgICAgaWYoIShyZW1vdmVkRXhpc3RpbmcgJiYgcmVtb3ZlZEV4aXN0aW5nLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXksIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUsIGNhbGxVcGRhdGU6IGZhbHNlIH0pXG4gICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSB0aGVtZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgXG4gICAgaWYocmVtb3ZlZEV4aXN0aW5nICYmIHJlbW92ZWRFeGlzdGluZy5sZW5ndGgpIHtcbiAgICAgIGxldCByZW1vdmVkVGVybXNDb2xsZWN0aW9uID0gW11cbiAgICAgIGZvcihsZXQgcmVtb3ZlZFRlcm0gb2YgcmVtb3ZlZEV4aXN0aW5nKSB7XG4gICAgICAgIHJlbW92ZWRUZXJtc0NvbGxlY3Rpb24ucHVzaChyZW1vdmVkVGVybS5jb2RlKVxuICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHN1YlRoZW1lUmVxdWVzdCA9e1xuICAgICAgICAgIFwicmVxdWVzdFwiOiB7IFxuICAgICAgICAgICAgXCJjb250ZW50SWRzXCI6IHJlbW92ZWRUZXJtc0NvbGxlY3Rpb24gXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBhd2FpdCB0aGlzLmZyYW1lV29ya1NlcnZpY2UucmV0aXJlTXVsdGlwbGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgc3ViVGhlbWVSZXF1ZXN0KS50b1Byb21pc2UoKS50aGVuKGFzeW5jICgpID0+IHtcblxuICAgICAgICAgIC8vIGNvdW50ZXJSZXRpcmVTdWJUaGVtZSsrXG4gICAgICAgICAgY29uc3QgcGFyZW50Q29sdW1uQ29uZmlnRGF0YTphbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgICAgICAgIGxldCBwYXJlbnRDb2w6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUpXG5cbiAgICAgICAgICAvLyBsZXQgc2VjdGlvbkxpc3QgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlKVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHNlY3Rpb25MaXN0Y2hpbGRyZW5MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKHBhcmVudENvbC5jaGlsZHJlbiwgcmVtb3ZlZEV4aXN0aW5nLCAoYTphbnksIGI6IGFueSkgPT4gYS5pZGVudGlmaWVyID09PSBiLmlkZW50aWZpZXIpO1xuICAgICAgICAgIGNvbnN0IHNlY3Rpb25MaXN0QXNzb2NpYXRpb25MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKHBhcmVudENvbC5hc3NvY2lhdGlvbnMsIHJlbW92ZWRFeGlzdGluZywgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICAgICAgIFxuICAgICAgICAgIHBhcmVudENvbFsnY2hpbGRyZW4nXSA9IHNlY3Rpb25MaXN0Y2hpbGRyZW5MaXN0XG4gICAgICAgICAgcGFyZW50Q29sWydhc3NvY2lhdGlvbnMnXSA9IHNlY3Rpb25MaXN0QXNzb2NpYXRpb25MaXN0XG4gICAgXG5cbiAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlRnJhbWV3b3JrTGlzdCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCBwYXJlbnRDb2wsIHJlbW92ZWRFeGlzdGluZywgJ2RlbGV0ZScpXG5cbiAgICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogW10sIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUsIGNhbGxVcGRhdGU6IGZhbHNlIH0pXG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmN1cnJlbnRTZWxlY3Rpb24ubmV4dCh7IHR5cGU6IHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSwgZGF0YTogcGFyZW50Q29sLCBjYXJkUmVmOiBwYXJlbnRDb2wuY2FyZFJlZiB9KTtcbiAgICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSB0aGVtZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICB9XG5cbiAgb25EaXNhYmxlVGhlbWUob3B0aW9uOiBhbnkpe1xuICAgIGNvbnN0IHBhcmVudENvbHVtbkNvbmZpZ0RhdGE6YW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICBsZXQgcGFyZW50Q29sOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlKVxuICAgIGxldCByZXN1bHQgPSAtMVxuICAgIGlmKHBhcmVudENvbCAmJiBwYXJlbnRDb2wuY2hpbGRyZW4gJiYgcGFyZW50Q29sLmNoaWxkcmVuLmxlbmd0aCl7XG4gICAgICByZXN1bHQgPSBwYXJlbnRDb2wuY2hpbGRyZW4uZmluZEluZGV4KChlbGU6IGFueSkgPT4ge1xuICAgICAgICBpZiggKGVsZS5yZWZUeXBlID09PSAndGhlbWUnKSAgJiYgKHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhLmNvZGUgPT09IGVsZS5hZGRpdGlvbmFsUHJvcGVydGllcy5jb21wZXRlbmN5QXJlYS5jb2RlKSkge1xuICAgICAgICByZXR1cm4gIGVsZS5yZWZJZCA9PT0gb3B0aW9uLnJlZklkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmKHJlc3VsdCA8IDApe1xuICAgICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgcmVzdWx0ID0gZm9ybUFycmF5LnZhbHVlLmZpbmRJbmRleCgoZm9ybUVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmKGZvcm1FbGUuY29tcGV0ZW5jeVRoZW1lICYmIGZvcm1FbGUuY29tcGV0ZW5jeVRoZW1lLnJlZklkICl7XG4gICAgICAgICAgcmV0dXJuICBmb3JtRWxlLmNvbXBldGVuY3lUaGVtZS5yZWZJZCA9PT0gb3B0aW9uLnJlZklkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9KTtcbiAgICAgfVxuIFxuICAgIC8vIFxuICAgIFxuICAgIHJldHVybiByZXN1bHQgPj0gMCA/IHRydWU6IGZhbHNlXG4gIH1cblxuXG4gIHVwZGF0ZUxvY2FsTGlzdChpdGVtOiBhbnksIHBhcmVudDogYW55LHNlbGVjdGVkVGVybUFycmF5OiBhbnksIHVwZGF0ZVR5cGU/OmFueSkge1xuICAgIGlmKGl0ZW0gJiYgaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgaWYodXBkYXRlVHlwZSA9PT0gJ2RlbGV0ZScpe1xuICAgICAgICBpdGVtLmNoaWxkcmVuLmZvckVhY2goKGl0bURhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGlmKGl0bURhdGEuaWRlbnRpZmllciA9PT0gcGFyZW50LmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIC8vIGxldCBkaWZmZXJlbmNlRGF0YSA9IFtdXG4gICAgICAgICAgICAvLyBpZihpdG1EYXRhICYmIGl0bURhdGEuY2hpbGRyZW4gJiYgaXRtRGF0YS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vICAgZGlmZmVyZW5jZURhdGEgID0gXy5kaWZmZXJlbmNlQnkoaXRtRGF0YS5jaGlsZHJlbixzZWxlY3RlZFRlcm1BcnJheSwgJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgIGRpZmZlcmVuY2VEYXRhID0gc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGRpZmZlcmVuY2VEYXRhID0gdGhpcy5zZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICAgICAgY29uc3QgYXNzb2NpYXRpb25MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKGl0bURhdGEuYXNzb2NpYXRpb25zLHNlbGVjdGVkVGVybUFycmF5LCAoYTphbnksIGI6IGFueSkgPT4gYS5pZGVudGlmaWVyID09PSBiLmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKGl0bURhdGEuY2hpbGRyZW4sIHNlbGVjdGVkVGVybUFycmF5LCAoYTphbnksIGI6IGFueSkgPT4gYS5pZGVudGlmaWVyID09PSBiLmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgaXRtRGF0YVsnYXNzb2NpYXRpb25zJ10gPSBhc3NvY2lhdGlvbkxpc3RcbiAgICAgICAgICAgIGl0bURhdGFbJ2NoaWxkcmVuJ10gPSBjaGlsZHJlbkxpc3RcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoaXRtRGF0YS5jaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMb2NhbExpc3QoaXRtRGF0YSwgcGFyZW50LHNlbGVjdGVkVGVybUFycmF5LHVwZGF0ZVR5cGUpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5jaGlsZHJlbi5mb3JFYWNoKChpdG1EYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZihpdG1EYXRhLmlkZW50aWZpZXIgPT09IHBhcmVudC5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBsZXQgZGlmZmVyZW5jZURhdGEgPSBbXVxuICAgICAgICAgICAgaWYoaXRtRGF0YSAmJiBpdG1EYXRhLmNoaWxkcmVuICYmIGl0bURhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGRpZmZlcmVuY2VEYXRhICA9IF8uZGlmZmVyZW5jZUJ5KHNlbGVjdGVkVGVybUFycmF5LGl0bURhdGEuY2hpbGRyZW4sICdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkaWZmZXJlbmNlRGF0YSA9IHNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkaWZmZXJlbmNlRGF0YSA9IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgICAgIGl0bURhdGFbJ2Fzc29jaWF0aW9ucyddID0gaXRtRGF0YSAmJiBpdG1EYXRhLmFzc29jaWF0aW9ucyA/Wy4uLml0bURhdGEuYXNzb2NpYXRpb25zLCAuLi5kaWZmZXJlbmNlRGF0YV06ZGlmZmVyZW5jZURhdGFcbiAgICAgICAgICAgIGl0bURhdGFbJ2NoaWxkcmVuJ10gPSBpdG1EYXRhICYmIGl0bURhdGEuY2hpbGRyZW4gP1suLi5pdG1EYXRhLmNoaWxkcmVuLCAuLi5kaWZmZXJlbmNlRGF0YV06ZGlmZmVyZW5jZURhdGFcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoaXRtRGF0YS5jaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMb2NhbExpc3QoaXRtRGF0YSwgcGFyZW50LCBzZWxlY3RlZFRlcm1BcnJheSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlVGhlbWUoKSB7XG4gICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSB0cnVlXG4gICAgY29uc3QgY2FyZERhdGEgPSB0aGlzLmRhdGEuY2hpbGRyZW5EYXRhXG4gICAgbGV0IHJlbW92ZWRMaXN0VGVybSA9IFtdXG4gICAgcmVtb3ZlZExpc3RUZXJtLnB1c2goY2FyZERhdGEuY29kZSlcbiAgICBsZXQgc3ViVGhlbWVSZXF1ZXN0ID17XG4gICAgICBcInJlcXVlc3RcIjogeyBcbiAgICAgICAgXCJjb250ZW50SWRzXCI6IHJlbW92ZWRMaXN0VGVybVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UucmV0aXJlTXVsdGlwbGVUZXJtKHRoaXMuZnJhbWVXb3JrU2VydmljZS5mcmFtZXdvcmtJZCwgY2FyZERhdGEuY2F0ZWdvcnksIHN1YlRoZW1lUmVxdWVzdCkudG9Qcm9taXNlKCkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBcbiAgICAgIGxldCByZW1vdmVkRXhpc3RpbmcgPSBbY2FyZERhdGFdXG4gICAgICBjb25zdCBwYXJlbnRDb2x1bW5Db25maWdEYXRhOmFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KGNhcmREYXRhLmNhdGVnb3J5KVxuICAgICAgbGV0IHBhcmVudENvbDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSlcbiAgICBcbiAgICAgIGNvbnN0IHNlY3Rpb25MaXN0Y2hpbGRyZW5MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKHBhcmVudENvbC5jaGlsZHJlbiwgcmVtb3ZlZEV4aXN0aW5nLCAoYTphbnksIGI6IGFueSkgPT4gYS5pZGVudGlmaWVyID09PSBiLmlkZW50aWZpZXIpO1xuICAgICAgY29uc3Qgc2VjdGlvbkxpc3RBc3NvY2lhdGlvbkxpc3Q6IGFueSA9IF8uZGlmZmVyZW5jZVdpdGgocGFyZW50Q29sLmFzc29jaWF0aW9ucywgcmVtb3ZlZEV4aXN0aW5nLCAoYTphbnksIGI6IGFueSkgPT4gYS5pZGVudGlmaWVyID09PSBiLmlkZW50aWZpZXIpO1xuICAgIFxuICAgICAgcGFyZW50Q29sWydjaGlsZHJlbiddID0gc2VjdGlvbkxpc3RjaGlsZHJlbkxpc3RcbiAgICAgIHBhcmVudENvbFsnYXNzb2NpYXRpb25zJ10gPSBzZWN0aW9uTGlzdEFzc29jaWF0aW9uTGlzdFxuICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QoY2FyZERhdGEuY2F0ZWdvcnksIHBhcmVudENvbCwgcmVtb3ZlZEV4aXN0aW5nLCAnZGVsZXRlJylcbiAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLm5leHQoeyB0eXBlOiBwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUsIGRhdGE6IHBhcmVudENvbCwgY2FyZFJlZjogcGFyZW50Q29sLmNhcmRSZWYgfSlcbiAgICAgIHRoaXMuZGlhbG9nQ2xvc2Uoe30pXG4gICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5IHRoZW1lIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgfSwoKF9lcnI6IGFueSk9PiB7XG4gICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5IHRoZW1lIGRlbGV0ZSBmYWlsZWQuYClcbiAgICB9KSlcbiAgfVxuXG5cbiAgLy8gZ2V0dGVyIG1ldGhvZHNcblxuICBnZXQgY29tcFRoZW1lRmllbGRzKCk6IFVudHlwZWRGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcFRoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgfVxuXG59XG4iLCJcbjxkaXYgY2xhc3M9XCJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzYWJsZU11bHRpQ3JlYXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtMSB3LTEwMCBhYnNvbHV0ZSBsb2FkZXItYmcgaXRlbXMtY2VudGVyIHB0LTUgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8bWF0LXNwaW5uZXIgY2xhc3M9XCJkaXNwbGF5LWlubGluZS1ibG9jayBtYi01XCIgW2RpYW1ldGVyXT1cIjUwXCIgW3N0cm9rZVdpZHRoXT1cIjNcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgIDwhLS0gPHA+e3tsb2FkZXJNc2d9fTwvcD4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nTmV3XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9kYWxUaXRsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiYWN0aW9uIGl0ZW1zXCJcbiAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJjYXJkTWVudVwiIFttYXRNZW51VHJpZ2dlckRhdGFdPVwieydkYXRhJzpkYXRhfVwiIGNsYXNzPVwiYWN0aW9uLWJ0blwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0ZXJtIG9mIGRhdGE/LnNlbGVjdGVkUGFyZW50VGVybXNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGVybS5jYXRlZ29yeSAhPT0gJ2NvbXBldGVuY3knXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsXCIgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZyYW1lV29ya1NlcnZpY2UuZ2V0Q29uZmlnKHRlcm0uY2F0ZWdvcnkpLmxhYmVsTmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgbmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlcm0ubmFtZVwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tcGV0ZW5jeUZvcm1cIj5cbiAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY29tcGV0ZW5jeUZvcm1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmUgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydTZWxlY3QgQXJlYSd9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBjbGFzcz1cImNvbXBldGVuY3ktZ3JvdXBcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIG9wdGlvblwiIGZvcm1Db250cm9sTmFtZT1cImNvbXBBcmVhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gIFtkaXNhYmxlZF09XCJkYXRhPy5jb2x1bW5JbmZvPy5jb2RlID09PSAnc3VidGhlbWUnIHx8IGRhdGEub3Blbk1vZGUgPT09J3ZpZXcnXCIgY2xhc3M9XCJsZWFybmluZy1zZWN0aW9uXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtYnRuJzppdGVtPy5jb2RlID09PSBzZWxldGVkQ29tcGV0ZW5jeUFyZWE/LmNvZGV9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jeUFyZWE/LmNoaWxkcmVuXCIgW3ZhbHVlXT1cIml0ZW1cIiBbY2hlY2tlZF09XCJpdGVtPy5jb2RlID09PSBzZWxldGVkQ29tcGV0ZW5jeUFyZWE/LmNvZGVcIiAoY2hhbmdlKT1cImNsZWFyU2VsZWN0ZWRUaGVtZXMoaXRlbSlcIj57e2l0ZW0ubmFtZX19PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1lbmQgbWItNFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8uY29sdW1uSW5mbz8uY29kZSAhPT0gJ3N1YnRoZW1lJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1hdC1idXR0b24gZmxleCBpdGVtcy1jZW50ZXIgY3JlYXRlLWFjY29yZGlvbi1idG5cIiAqbmdJZj1cImRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIiAoY2xpY2spPVwiYWRkQ29tcGV0ZW5jeVRoZW1lKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTIgbWF0LWljb24tY3VzdG9tIFwiPmFkZF9jaXJjbGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgbW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB7e2RhdGEuY29sdW1uSW5mby5uYW1lfX0gIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hY2NvcmRpb24gZm9ybUFycmF5TmFtZT1cImNvbXBUaGVtZUZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXTsgbGV0IGkgPSBpbmRleDsgbGV0IGlzRmlyc3QgPSBmaXJzdFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWFyZ2luLWJvdHRvbS1sIGNvbXAtdGhlbWUtZmllbGRzXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIFtleHBhbmRlZF09XCJpc0ZpcnN0XCI+ICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVtpXVsnY29udHJvbHMnXT8uY29tcGV0ZW5jeVRoZW1lPy52YWx1ZT8ubmFtZX19IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8uY29sdW1uSW5mbz8uY29kZSAhPT0gJ3N1YnRoZW1lJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJkYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ29tcEZpZWxkcyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uLWN1c3RvbSBcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyIG1hcmdpbi10b3Atc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2RhdGEub3Blbk1vZGUgIT09ICd2aWV3Jz8gJ1NlbGVjdCBDb21wZXRlbmN5IFRoZW1lJzogJ0NvbXBldGVuY3kgVGhlbWUgTmFtZSd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Rpc2FibGVkXT1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgPT09ICdzdWJ0aGVtZScgfHwgZGF0YS5vcGVuTW9kZSA9PT0ndmlldydcIiBwbGFjZWhvbGRlcj1cIkNob29zZSB0aGUgQ29tcGV0ZW5jeSBUaGVtZVwiIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lUaGVtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWVcIiAgW3ZhbHVlXT1cIm9wdGlvblwiIFtkaXNhYmxlZF09XCJvbkRpc2FibGVUaGVtZShvcHRpb24pIHx8IGRhdGEub3Blbk1vZGUgPT09J3ZpZXcnXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0aW9uQ2hhbmdlKT1cIk9uVGhlbWVTZWxlY3Rpb24oJGV2ZW50LCBpLCBvcHRpb24pXCIgID57e29wdGlvbi5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uLnJlZklkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yIHJlZi1pZFwiPih7e29wdGlvbi5yZWZJZH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmbmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuPVwiRmlyc3QgTmFtZSBsYWJlbHxMYWJlbCB3aGljaCBleHBsYWlucyB0aGUgdXNlciB0byBlbnRlciBmaXJzdCBuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2RhdGEub3Blbk1vZGUgIT09ICd2aWV3Jz8gJ1NlbGVjdCBDb21wZXRlbmN5IFN1Yi1UaGVtZSc6ICdDb21wZXRlbmN5IFN1Yi1UaGVtZSBOYW1lJ319XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJDaG9vc2UgdGhlIENvbXBldGVuY3kgVGhlbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJjb21wZXRlbmN5U3ViVGhlbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVN1YlRoZW1lXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLm5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ge3tjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVtpXVsnY29udHJvbHMnXT8uY29tcGV0ZW5jeVN1YlRoZW1lPy52YWx1ZSB8anNvbn19IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbCBmaWVsZC1oZWlnaHRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cIiBwbGFjZWhvbGRlci10ZXh0XCIgcGxhY2Vob2xkZXI9XCJDaG9vc2UgdGhlIENvbXBldGVuY3kgU3ViLVRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVN1YlRoZW1lXCIgbXVsdGlwbGUgW2Rpc2FibGVkXT1cImRhdGEub3Blbk1vZGUgPT09J3ZpZXcnXCIgcGFuZWxDbGFzcz1cImZ1bGwtd2lkdGgtcGFuZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBbbmdDbGFzc109XCJ7J2Rpc2JhbGVkU2VsZWN0Jzppc0hpZGVEYXRhfVwiIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdGJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVtpXVsnY29udHJvbHMnXT8uY29tcGV0ZW5jeVN1YlRoZW1lPy52YWx1ZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWQpPVwib25UZXJtUmVtb3ZlKGl0ZW0sIGkpXCIgW2Rpc2FibGVkXT1cImRhdGEub3Blbk1vZGUgPT09J3ZpZXcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc3ViLXRoZW1lLWRpc2FibGUnOiBkYXRhPy5vcGVuTW9kZSA9PT0ndmlldyd9XCIgIFtyZW1vdmFibGVdPVwiZGF0YT8ub3Blbk1vZGUgPT09J3ZpZXcnPyBmYWxzZTogdHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiA+e3sgaXRlbS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZT5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWxpc3Rib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHt7Y29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJykgfGpzb259fSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LW9wdGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwibmV2ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjc2VhcmNoIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVN1YlRoZW1lXCIgbWF0SW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwICpuZ0lmPVwiZmlsdGVyZWRhbGxDb21wZXRlbmN5U3ViVGhlbWUubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5ObyByZXN1bHRzIGZvdW5kITwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHJlcXVlc3RPYmpEYXRhLnByZWZlcnJlZFByb3ZpZGVyXCIgW3ZhbHVlXT1cIm9wdGlvbi5wcm92aWRlck5hbWVcIj57e29wdGlvbi5wcm92aWRlck5hbWV9fTwvbWF0LW9wdGlvbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVtpXVsnY29udHJvbHMnXT8uY29tcGV0ZW5jeVRoZW1lPy52YWx1ZT8uY2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIiBjbGFzcz1cIm1hdC1vcHRpb24tbGlzdFwiPnt7b3B0aW9uPy5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbj8ucmVmSWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMiByZWYtaWRcIj4oe3tvcHRpb24/LnJlZklkfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtZXJyb3IgKm5nSWY9XCJyZXF1ZXN0Rm9ybS5jb250cm9sc1sncHJvdmlkZXJUZXh0J10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIHNlbGVjdCB1cCB0byBmaXZlIHByZWZlcnJlZCBwcm92aWRlcnMgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvb3RlciBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkaWFsb2dDbG9zZSgnJylcIj57e2FwcF9zdHJpbmdzLmNhbmNlbH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnICYmIGRhdGEub3Blbk1vZGUgIT09J3ZpZXcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbXBldGVuY3lGb3JtPy5pbnZhbGlkXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MuY3JlYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScgJiYgZGF0YS5vcGVuTW9kZSAhPT0ndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgIT09ICdzdWJ0aGVtZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbXBldGVuY3lGb3JtLmludmFsaWQgfHwgZGlzYWJsZU11bHRpQ3JlYXRlXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiIChjbGljayk9XCJtdWx0aUNyZWF0ZShjb21wZXRlbmN5Rm9ybSwgZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwX3N0cmluZ3MuY3JlYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgPT09ICdzdWJ0aGVtZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBldGVuY3lGb3JtPy5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpWydjb250cm9scyddWzBdWydjb250cm9scyddPy5jb21wZXRlbmN5U3ViVGhlbWU/LnZhbHVlPy5sZW5ndGg7ZWxzZSB1cGRhdGVCdG5cIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbXBldGVuY3lGb3JtLmludmFsaWQgfHwgZGlzYWJsZU11bHRpQ3JlYXRlXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiIChjbGljayk9XCJtdWx0aUNyZWF0ZVN1YlRoZW1lKGNvbXBldGVuY3lGb3JtLCBkYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwX3N0cmluZ3MudXBkYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy10ZW1wbGF0ZSAjdXBkYXRlQnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb21wZXRlbmN5Rm9ybS5pbnZhbGlkIHx8IGRpc2FibGVNdWx0aUNyZWF0ZVwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIiAoY2xpY2spPVwibXVsdGlDcmVhdGVTdWJUaGVtZShjb21wZXRlbmN5Rm9ybSwgZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLmRlbGV0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdlZGl0JyAmJiBkYXRhLm9wZW5Nb2RlICE9PSd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVUZXJtRGF0YShjb21wZXRlbmN5Rm9ybSwgZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbXBldGVuY3lGb3JtPy5pbnZhbGlkIHx8IGRpc2FibGVVcGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MudXBkYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgIDwvZGl2PlxuICAgIFxuICAgIFxuICAgIDwhLS0gVGl0bGUgb2YgdGhlIHBvcHVwIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjbW9kYWxUaXRsZT5cbiAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZScgfHwgZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPnt7ZGF0YS5jb2x1bW5JbmZvLm5hbWUgPT09ICdUaGVtZScgPyBhcHBfc3RyaW5ncy5hZGRDb21wZXRlbmN5IDogYXBwX3N0cmluZ3MuY3JlYXRlTmV3fX0ge3tkYXRhLmNvbHVtbkluZm8ubmFtZX19PC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cbiAgICAgICAgPCEtLSB7e2RhdGEgfGpzb259fSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnIHx8IGRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT57e2dldENyZWF0ZU5hbWUoZGF0YSl9fTwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ3ZpZXcnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT5WaWV3IHt7ZGF0YS5jb2x1bW5JbmZvLm5hbWV9fTwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPnt7YXBwX3N0cmluZ3MuZWRpdH19IHt7ZGF0YS5jb2x1bW5JbmZvLm5hbWV9fTwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cblxuPG1hdC1tZW51ICNjYXJkTWVudT1cIm1hdE1lbnVcIiBjbGFzcz1cIm1lbnUtc2VjXCI+XG4gICAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50IGxldC1yb3dEYXRhPVwiZGF0YVwiIGxldC1jYXJkUmVmPVwiY2FyZFJlZlwiPlxuICAgICAgICA8YnV0dG9uICAoY2xpY2spPVwiZGVsZXRlVGhlbWUoKVwiXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtIG5hbWU9XCJjaGFubmVsLWFuYWx5dGljcy1idXR0b25cIiBjbGFzcz1cIndzLW1hdC1wcmltYXJ5LXRleHRcIiBpMThuLWFyaWEtbGFiZWxcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBbmFseXRpY3NcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+RGVsZXRlPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT4iXX0=
|