@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
|
@@ -1,862 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { CreateTermComponent } from '../create-term/create-term.component';
|
|
3
|
-
import { ConnectorComponent } from '../connector/connector.component';
|
|
4
|
-
import { defaultConfig, headerLineConfig } from '../../constants/app-constant';
|
|
5
|
-
import { labels } from '../../labels/strings';
|
|
6
|
-
import { CreateTermFromFrameworkComponent } from '../create-term-from-framework/create-term-from-framework.component';
|
|
7
|
-
import { OrgHierarchyAddModalComponent } from '../org-hierarchy-add-modal/org-hierarchy-add-modal.component';
|
|
8
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
-
import { ConforamtionPopupComponent } from '../conforamtion-popup/conforamtion-popup.component';
|
|
10
|
-
import { CategoryEditModuleComponent } from '../category-edit/category-edit-module/category-edit-module.component';
|
|
11
|
-
import _ from 'lodash';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "../../services/framework.service";
|
|
14
|
-
import * as i2 from "../../services/local-connection.service";
|
|
15
|
-
import * as i3 from "@angular/material/legacy-dialog";
|
|
16
|
-
import * as i4 from "../../services/approval.service";
|
|
17
|
-
import * as i5 from "@angular/material/legacy-snack-bar";
|
|
18
|
-
import * as i6 from "../../services/connector.service";
|
|
19
|
-
import * as i7 from "../../tree-hierarchy.service";
|
|
20
|
-
import * as i8 from "@angular/common";
|
|
21
|
-
import * as i9 from "@angular/material/button";
|
|
22
|
-
import * as i10 from "@angular/material/icon";
|
|
23
|
-
import * as i11 from "../tree-column-view/tree-column-view.component";
|
|
24
|
-
import * as i12 from "../action-bar/action-bar.component";
|
|
25
|
-
class TreeViewComponent {
|
|
26
|
-
constructor(frameworkService, localSvc, dialog, approvalService, _snackBar, connectorSvc, cdr, treeHierarchySvc, changeDetector) {
|
|
27
|
-
this.frameworkService = frameworkService;
|
|
28
|
-
this.localSvc = localSvc;
|
|
29
|
-
this.dialog = dialog;
|
|
30
|
-
this.approvalService = approvalService;
|
|
31
|
-
this._snackBar = _snackBar;
|
|
32
|
-
this.connectorSvc = connectorSvc;
|
|
33
|
-
this.cdr = cdr;
|
|
34
|
-
this.treeHierarchySvc = treeHierarchySvc;
|
|
35
|
-
this.changeDetector = changeDetector;
|
|
36
|
-
this.approvalList = [];
|
|
37
|
-
this.isApprovalView = false;
|
|
38
|
-
this.workFlowStatus = '';
|
|
39
|
-
this.sentForApprove = new EventEmitter();
|
|
40
|
-
this.loaderEnable = new EventEmitter();
|
|
41
|
-
this.manageOrg = new EventEmitter();
|
|
42
|
-
this.mapping = {};
|
|
43
|
-
this.heightLighted = [];
|
|
44
|
-
this.localList = [];
|
|
45
|
-
this.showPublish = false;
|
|
46
|
-
this.newTermSubscription = undefined;
|
|
47
|
-
this.loaded = {};
|
|
48
|
-
this.showActionBar = false;
|
|
49
|
-
this.approvalRequiredTerms = [];
|
|
50
|
-
this.draftTerms = [];
|
|
51
|
-
this.isLoading = false;
|
|
52
|
-
this.categoryList = [];
|
|
53
|
-
this.app_strings = labels;
|
|
54
|
-
this.isHideBtnEna = true;
|
|
55
|
-
this.columnId = '';
|
|
56
|
-
this.isFraworkLoading = true;
|
|
57
|
-
}
|
|
58
|
-
ngOnInit() {
|
|
59
|
-
this.draftTerms = this.approvalList;
|
|
60
|
-
this.init();
|
|
61
|
-
this.showActionBar = this.isApprovalView ? true : false;
|
|
62
|
-
this.frameworkService.afterAddOrEditSubject.subscribe(responseData => {
|
|
63
|
-
if (responseData && responseData.res && responseData.data) {
|
|
64
|
-
this.refreshData(responseData);
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
this.isEnableds();
|
|
68
|
-
}
|
|
69
|
-
ngOnChanges() {
|
|
70
|
-
}
|
|
71
|
-
ngAfterContentChecked() {
|
|
72
|
-
this.cdr.detectChanges();
|
|
73
|
-
}
|
|
74
|
-
init() {
|
|
75
|
-
this.initConfig();
|
|
76
|
-
this.frameworkService.getFrameworkInfo((this.orgSelectedData) ? this.orgSelectedData : '', (this.childOrgData) ? this.childOrgData : '').subscribe(() => {
|
|
77
|
-
this.connectorSvc.removeAllLines();
|
|
78
|
-
this.frameworkService.categoriesHash.value.forEach((cat) => {
|
|
79
|
-
this.loaded[cat.code] = true;
|
|
80
|
-
});
|
|
81
|
-
this.isLoading = false;
|
|
82
|
-
setTimeout(() => {
|
|
83
|
-
this.makeFirstTermSelected();
|
|
84
|
-
}, 500);
|
|
85
|
-
}, (err) => {
|
|
86
|
-
console.error('error in fetching framework', err);
|
|
87
|
-
});
|
|
88
|
-
this.loaderSubscription = this.treeHierarchySvc.loaderState$.subscribe(data => {
|
|
89
|
-
this.loaderEnable.emit(data);
|
|
90
|
-
this.changeDetector.detectChanges();
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
refreshData(resData) {
|
|
94
|
-
const res = resData.res;
|
|
95
|
-
if (res && res.created) {
|
|
96
|
-
this.showPublish = true;
|
|
97
|
-
}
|
|
98
|
-
if (res.multi && Array.isArray(res.term) && res.term.length) {
|
|
99
|
-
res.term = res.term[0];
|
|
100
|
-
}
|
|
101
|
-
this.loaded[res.term.category] = false;
|
|
102
|
-
const parentColumn = this.frameworkService.getPreviousCategory(res.term.category);
|
|
103
|
-
res.parent = null;
|
|
104
|
-
if (parentColumn) {
|
|
105
|
-
res.parent = this.frameworkService.selectionList.get(parentColumn.code);
|
|
106
|
-
if (resData.type === 'update') {
|
|
107
|
-
res.parent.children[res.parent.children.findIndex((el) => el.identifier === res.term.identifier)] = res.term;
|
|
108
|
-
this.loaded[res.term.category] = true;
|
|
109
|
-
res.term.selected = false;
|
|
110
|
-
this.frameworkService.selectionList.delete(res.term.category);
|
|
111
|
-
this.frameworkService.insertUpdateDeleteNotifier.next({ action: res.term.category, type: 'update', data: res.term });
|
|
112
|
-
this.updateFinalList({ selectedTerm: res.term, isSelected: true, parentData: res.parent, colIndex: resData.index }, 'update');
|
|
113
|
-
res.term.selected = true;
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
if (!res.multi) {
|
|
117
|
-
res.parent.children ? res.parent.children.push(res.term) : res.parent['children'] = [res.term];
|
|
118
|
-
}
|
|
119
|
-
this.updateFinalList({ selectedTerm: res.term, isSelected: false, parentData: res.parent, colIndex: resData.index });
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
makeFirstTermSelected() {
|
|
124
|
-
const firstListItem = this.frameworkService.list.entries().next().value;
|
|
125
|
-
if (firstListItem && firstListItem.length >= 2) {
|
|
126
|
-
if (firstListItem[1] && firstListItem[1].children && firstListItem[1].children.length) {
|
|
127
|
-
const firstTerm = firstListItem[1].children[0];
|
|
128
|
-
const cardRef = document.getElementById(firstTerm.name);
|
|
129
|
-
firstTerm.selected = true;
|
|
130
|
-
this.frameworkService.cardClkData = firstTerm;
|
|
131
|
-
this.frameworkService.CurrentCardClk.next(firstTerm.category);
|
|
132
|
-
this.frameworkService.currentSelection.next({ type: firstTerm.category, data: firstTerm, cardRef });
|
|
133
|
-
this.isFraworkLoading = false;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
updateTaxonomyTerm(data) {
|
|
138
|
-
if (data && data.selectedTerm && data.selectedTerm.category) {
|
|
139
|
-
if (!data.isUpdate) {
|
|
140
|
-
this.updateFinalList(data);
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
this.updateFinalList(data, 'update');
|
|
144
|
-
}
|
|
145
|
-
this.updateSelection(data.selectedTerm.category, data.selectedTerm.code);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
updateSelection(category, selectedTermCode) {
|
|
149
|
-
const categoryData = this.frameworkService.list.get(category);
|
|
150
|
-
if (categoryData && categoryData.children) {
|
|
151
|
-
categoryData.children.map(item => {
|
|
152
|
-
item.selected = selectedTermCode === item.code ? true : false;
|
|
153
|
-
return item;
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
updateFinalList(data, type) {
|
|
158
|
-
if (data.isSelected) {
|
|
159
|
-
this.frameworkService.selectionList.set(data.selectedTerm.category, data.selectedTerm);
|
|
160
|
-
const next = this.frameworkService.getNextCategory(data.selectedTerm.category);
|
|
161
|
-
if (next && next.code) {
|
|
162
|
-
this.frameworkService.selectionList.delete(next.code);
|
|
163
|
-
}
|
|
164
|
-
this.frameworkService.insertUpdateDeleteNotifier.next({ action: data.selectedTerm.category, type: type ? type : 'select', data: data.selectedTerm });
|
|
165
|
-
}
|
|
166
|
-
if (data.colIndex === 0 && !data.isSelected) {
|
|
167
|
-
this.isLoading = true;
|
|
168
|
-
setTimeout(() => {
|
|
169
|
-
this.init();
|
|
170
|
-
}, 3000);
|
|
171
|
-
}
|
|
172
|
-
setTimeout(() => {
|
|
173
|
-
this.loaded[data.selectedTerm.category] = true;
|
|
174
|
-
}, 100);
|
|
175
|
-
}
|
|
176
|
-
isEnabled(columnCode) {
|
|
177
|
-
return !!this.frameworkService.selectionList.get(columnCode);
|
|
178
|
-
}
|
|
179
|
-
isEnableds() {
|
|
180
|
-
if (this.frameworkService.CurrentCardClk) {
|
|
181
|
-
this.frameworkService.CurrentCardClk.subscribe((item) => {
|
|
182
|
-
const dataCode = this.frameworkService.getNextCategory(item);
|
|
183
|
-
if (dataCode && dataCode.code) {
|
|
184
|
-
this.dataConfig = this.frameworkService.getConfig(dataCode.code);
|
|
185
|
-
}
|
|
186
|
-
if (dataCode) {
|
|
187
|
-
this.configCodeBtn = dataCode.code;
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
openCreateTermDialog(column, colIndex) {
|
|
193
|
-
if (!this.isEnabled(column.code)) {
|
|
194
|
-
const nextCat = column.code;
|
|
195
|
-
const nextNextCat = this.frameworkService.getNextCategory(nextCat);
|
|
196
|
-
if (nextCat) {
|
|
197
|
-
const selectedTerms = this.frameworkService.getPreviousSelectedTerms(nextCat);
|
|
198
|
-
const colInfo = Array.from(this.frameworkService.list.values()).filter(l => l.code === nextCat);
|
|
199
|
-
let nextColInfo = [];
|
|
200
|
-
if (nextNextCat && nextNextCat.code) {
|
|
201
|
-
nextColInfo = Array.from(this.frameworkService.list.values()).filter(l => l.code === nextNextCat.code);
|
|
202
|
-
}
|
|
203
|
-
let dialog;
|
|
204
|
-
if (this.environment && this.environment.frameworkType === 'MDO_DESIGNATION') {
|
|
205
|
-
dialog = this.dialog.open(CreateTermFromFrameworkComponent, {
|
|
206
|
-
data: {
|
|
207
|
-
mode: 'multi-create',
|
|
208
|
-
columnInfo: colInfo && colInfo.length ? colInfo[0] : [],
|
|
209
|
-
nextColInfo: nextColInfo && nextColInfo.length ? nextColInfo[0] : [],
|
|
210
|
-
frameworkId: this.frameworkService.getFrameworkId(),
|
|
211
|
-
selectedparents: this.heightLighted,
|
|
212
|
-
colIndex: nextCat.index,
|
|
213
|
-
selectedParentTerms: selectedTerms
|
|
214
|
-
},
|
|
215
|
-
width: '800px',
|
|
216
|
-
panelClass: 'custom-dialog-container',
|
|
217
|
-
position: { top: '50px' }
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
dialog = this.dialog.open(CreateTermComponent, {
|
|
222
|
-
data: {
|
|
223
|
-
mode: 'multi-create',
|
|
224
|
-
columnInfo: colInfo && colInfo.length ? colInfo[0] : [],
|
|
225
|
-
frameworkId: this.frameworkService.getFrameworkId(),
|
|
226
|
-
selectedparents: this.heightLighted,
|
|
227
|
-
colIndex: nextCat.index,
|
|
228
|
-
selectedParentTerms: selectedTerms
|
|
229
|
-
},
|
|
230
|
-
width: '800px',
|
|
231
|
-
panelClass: 'custom-dialog-container',
|
|
232
|
-
position: { top: '50px' }
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
dialog.afterClosed().subscribe((res) => {
|
|
236
|
-
if (!res) {
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
if (res && res.created) {
|
|
240
|
-
this.showPublish = true;
|
|
241
|
-
}
|
|
242
|
-
const data = this.frameworkService.cardClkData;
|
|
243
|
-
const responseData = {
|
|
244
|
-
res,
|
|
245
|
-
index: nextCat.index,
|
|
246
|
-
data,
|
|
247
|
-
type: 'multi-create'
|
|
248
|
-
};
|
|
249
|
-
if (!(res && res.stopUpdate)) {
|
|
250
|
-
this.frameworkService.updateAfterAddOrEditSubject(responseData);
|
|
251
|
-
}
|
|
252
|
-
this.loaded[res.term.category] = false;
|
|
253
|
-
const parentColumn = this.frameworkService.getPreviousCategory(res.term[0].category);
|
|
254
|
-
res.parent = null;
|
|
255
|
-
if (parentColumn) {
|
|
256
|
-
res.parent = this.frameworkService.selectionList.get(parentColumn.code);
|
|
257
|
-
res.parent.children ? res.parent.children.push(res.term[0]) : res.parent['children'] = [res.term[0]];
|
|
258
|
-
}
|
|
259
|
-
this.updateFinalList({ selectedTerm: res.term[0], isSelected: false, parentData: res.parent, colIndex: colIndex });
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
openOrganizationDialog(column, _index, typeSelected) {
|
|
265
|
-
const treeListData = this.frameworkService.getPreviousSelectedTerms(column.code);
|
|
266
|
-
const dialog = this.dialog.open(OrgHierarchyAddModalComponent, {
|
|
267
|
-
data: {
|
|
268
|
-
previous: treeListData,
|
|
269
|
-
currentData: column,
|
|
270
|
-
selectedOrgData: this.orgSelectedData,
|
|
271
|
-
type: typeSelected
|
|
272
|
-
},
|
|
273
|
-
autoFocus: true,
|
|
274
|
-
restoreFocus: true,
|
|
275
|
-
position: { right: '0' },
|
|
276
|
-
height: '100vh',
|
|
277
|
-
width: '50%',
|
|
278
|
-
panelClass: 'right-side-modal',
|
|
279
|
-
maxWidth: '100vw'
|
|
280
|
-
});
|
|
281
|
-
dialog.afterClosed().subscribe(async (_res) => {
|
|
282
|
-
if (_res && _res.type === 'add') {
|
|
283
|
-
this.treeHierarchySvc.setLoaderState(true);
|
|
284
|
-
this.createTerms(_res.selectedOrg, column);
|
|
285
|
-
}
|
|
286
|
-
else if (_res && _res.type === 'update') {
|
|
287
|
-
if (_res.paparentSelectedOrg) {
|
|
288
|
-
await this.updateParentAssociation(_res.paparentSelectedOrg, _res.currentTerm);
|
|
289
|
-
}
|
|
290
|
-
if (_res.selectedOrg && _res.selectedOrg.length > 0) {
|
|
291
|
-
this.treeHierarchySvc.setLoaderState(true);
|
|
292
|
-
this.createTerms(_res.selectedOrg, column);
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
this.publishFramework({
|
|
296
|
-
id: this.orgSelectedData.orgHierarchyFrameworkId || '',
|
|
297
|
-
category: ''
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
get list() {
|
|
304
|
-
return Array.from(this.frameworkService.list.values());
|
|
305
|
-
}
|
|
306
|
-
drawHeaderLine(len) {
|
|
307
|
-
const options = { ...defaultConfig, ...headerLineConfig };
|
|
308
|
-
for (let i = 1; i <= len; i++) {
|
|
309
|
-
const startEle = document.querySelector(`#box${i}count`);
|
|
310
|
-
const endEle = document.querySelector(`#box${i}Header`);
|
|
311
|
-
if (startEle && endEle) {
|
|
312
|
-
new LeaderLine(startEle, endEle, options);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
getColumn(columnCode) {
|
|
317
|
-
return this.frameworkService.list.get(columnCode);
|
|
318
|
-
}
|
|
319
|
-
newConnection() {
|
|
320
|
-
const dialog = this.dialog.open(ConnectorComponent, {
|
|
321
|
-
data: {},
|
|
322
|
-
width: '90%',
|
|
323
|
-
});
|
|
324
|
-
dialog.afterClosed().subscribe((res) => {
|
|
325
|
-
if ((res.source === 'online' && res.data.endpoint) || (res.source === 'offline')) {
|
|
326
|
-
this.localSvc.localStorage = res;
|
|
327
|
-
this.init();
|
|
328
|
-
}
|
|
329
|
-
else if (res.source === 'online' && !res.data.endpoint) {
|
|
330
|
-
this.localSvc.localStorage = res;
|
|
331
|
-
this.init();
|
|
332
|
-
}
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
updateDraftStatusTerms(event) {
|
|
336
|
-
if (event.checked) {
|
|
337
|
-
this.draftTerms.push(event.term);
|
|
338
|
-
}
|
|
339
|
-
else {
|
|
340
|
-
this.draftTerms = this.draftTerms.filter(d => event.term.identifier !== d.identifier);
|
|
341
|
-
}
|
|
342
|
-
this.showActionBar = this.draftTerms.length > 0 ? true : false;
|
|
343
|
-
}
|
|
344
|
-
getNoOfCards(event) {
|
|
345
|
-
if (this.categoryList.length > 0 && event.category !== '') {
|
|
346
|
-
let index = this.categoryList.findIndex((obj) => obj.category == event.category);
|
|
347
|
-
if (index > -1) {
|
|
348
|
-
this.categoryList.splice(index);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
if (event.category == '') {
|
|
352
|
-
this.categoryList[this.categoryList.length - 1].count = 0;
|
|
353
|
-
}
|
|
354
|
-
this.categoryList.push(event);
|
|
355
|
-
}
|
|
356
|
-
getCount(code) {
|
|
357
|
-
const allCategories = Array.from(this.frameworkService.list.values());
|
|
358
|
-
const currentCategoryIndex = allCategories.findIndex(cat => cat.code === code);
|
|
359
|
-
for (let i = 0; i < currentCategoryIndex; i++) {
|
|
360
|
-
const prevCategoryCode = allCategories[i].code;
|
|
361
|
-
const hasPrevSelection = this.frameworkService.selectionList.has(prevCategoryCode);
|
|
362
|
-
if (!hasPrevSelection) {
|
|
363
|
-
return 0;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
let count = 0;
|
|
367
|
-
const prevCategory = this.frameworkService.getPreviousCategory(code);
|
|
368
|
-
if (prevCategory) {
|
|
369
|
-
const prevSelectedTerm = this.frameworkService.selectionList.get(prevCategory.code);
|
|
370
|
-
if (prevSelectedTerm) {
|
|
371
|
-
if (prevSelectedTerm.children && prevSelectedTerm.children.length > 0) {
|
|
372
|
-
count = prevSelectedTerm.children.filter((child) => !child.isDeleted && child.status !== 'Retired' &&
|
|
373
|
-
(child.category === code || (child.associations &&
|
|
374
|
-
child.associations.some((assoc) => assoc.category === code)))).length;
|
|
375
|
-
return count;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
return 0;
|
|
379
|
-
}
|
|
380
|
-
const categoryData = this.frameworkService.list.get(code);
|
|
381
|
-
if (categoryData && categoryData.children) {
|
|
382
|
-
count = categoryData.children.filter((child) => !child.isDeleted && child.status !== 'Retired').length;
|
|
383
|
-
}
|
|
384
|
-
return count;
|
|
385
|
-
}
|
|
386
|
-
sendForApproval() {
|
|
387
|
-
if (!this.isApprovalView) {
|
|
388
|
-
let parentList = [];
|
|
389
|
-
this.list.forEach(ele => {
|
|
390
|
-
const t = ele.children.filter((term) => term.selected === true);
|
|
391
|
-
if (t[0]) {
|
|
392
|
-
parentList.push(t[0]);
|
|
393
|
-
}
|
|
394
|
-
});
|
|
395
|
-
const req = {
|
|
396
|
-
updateFieldValues: [...parentList, ...this.draftTerms]
|
|
397
|
-
};
|
|
398
|
-
this.approvalService.createApproval(req).subscribe(() => {
|
|
399
|
-
this.frameworkService.removeOldLine();
|
|
400
|
-
this._snackBar.open('Terms successfully sent for Approval.', 'cancel');
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
else {
|
|
404
|
-
this.sentForApprove.emit(this.draftTerms);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
closeActionBar(_e) {
|
|
408
|
-
this.showActionBar = false;
|
|
409
|
-
}
|
|
410
|
-
initConfig() {
|
|
411
|
-
if (this.environment) {
|
|
412
|
-
this.frameworkService.updateEnvironment(this.environment);
|
|
413
|
-
this.frameworkService.setConfig(this.taxonomyConfig);
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
ngOnDestroy() {
|
|
417
|
-
this.frameworkService.removeOldLine();
|
|
418
|
-
}
|
|
419
|
-
getNextCat(data) {
|
|
420
|
-
if (data && data.code) {
|
|
421
|
-
const nextCat = this.frameworkService.getNextCategory(data.code);
|
|
422
|
-
return nextCat;
|
|
423
|
-
}
|
|
424
|
-
return null;
|
|
425
|
-
}
|
|
426
|
-
isCurrentOrNextTerm(_column, index) {
|
|
427
|
-
if (!this.frameworkService.currentSelection.value) {
|
|
428
|
-
return index === 0;
|
|
429
|
-
}
|
|
430
|
-
const currentCategory = this.frameworkService.currentSelection.value.type;
|
|
431
|
-
if (!currentCategory) {
|
|
432
|
-
return index === 0;
|
|
433
|
-
}
|
|
434
|
-
let currentIndex = -1;
|
|
435
|
-
for (let i = 0; i < this.list.length; i++) {
|
|
436
|
-
if (this.list[i].code === currentCategory) {
|
|
437
|
-
currentIndex = i;
|
|
438
|
-
break;
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
if (currentIndex === -1) {
|
|
442
|
-
return index === 0;
|
|
443
|
-
}
|
|
444
|
-
return index === currentIndex || index === currentIndex + 1;
|
|
445
|
-
}
|
|
446
|
-
shouldShowSvgBorderWrapper(column, index) {
|
|
447
|
-
if (this.isCurrentOrNextTerm(column, index) && this.getCount(column.code) === 0) {
|
|
448
|
-
return true;
|
|
449
|
-
}
|
|
450
|
-
return false;
|
|
451
|
-
}
|
|
452
|
-
async createTerms(selectedList, column) {
|
|
453
|
-
const frameworkData = {
|
|
454
|
-
id: this.orgSelectedData.orgHierarchyFrameworkId || '',
|
|
455
|
-
category: column.code || '',
|
|
456
|
-
};
|
|
457
|
-
let createdNodeId = [];
|
|
458
|
-
for await (const ele of selectedList) {
|
|
459
|
-
const requestBody = {
|
|
460
|
-
request: {
|
|
461
|
-
term: {
|
|
462
|
-
name: ele.orgName || '',
|
|
463
|
-
description: ele.description || '',
|
|
464
|
-
code: uuidv4(),
|
|
465
|
-
additionalProperties: {
|
|
466
|
-
orgId: ele.identifier || ''
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
};
|
|
471
|
-
const createTremsRes = await this.treeHierarchySvc.createTerm(requestBody, frameworkData).toPromise().catch(err => {
|
|
472
|
-
console.error('Error in creating term', err);
|
|
473
|
-
});
|
|
474
|
-
if (createTremsRes && createTremsRes.result && createTremsRes.result.node_id) {
|
|
475
|
-
createdNodeId.push(createTremsRes.result.node_id[0]);
|
|
476
|
-
}
|
|
477
|
-
else {
|
|
478
|
-
this._snackBar.open('Error in creating term', 'cancel');
|
|
479
|
-
this.treeHierarchySvc.setLoaderState(false);
|
|
480
|
-
return;
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
if (createdNodeId.length === selectedList.length) {
|
|
484
|
-
if (column.index > 1) {
|
|
485
|
-
await this.updateAssociation(createdNodeId, frameworkData, column);
|
|
486
|
-
}
|
|
487
|
-
this.publishFramework(frameworkData);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
async updateAssociation(nodeId, frameworkData, column) {
|
|
491
|
-
const prev = this.frameworkService.getPreviousCategory(column.code);
|
|
492
|
-
let prevTrem = this.frameworkService.getPreviousSelectedTerms(column.code);
|
|
493
|
-
const tempFrameData = _.cloneDeep(this.frameworkService.completeResponse);
|
|
494
|
-
const requestBody = {
|
|
495
|
-
request: {
|
|
496
|
-
term: {
|
|
497
|
-
associations: []
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
};
|
|
501
|
-
if (prev && prevTrem) {
|
|
502
|
-
prevTrem = prevTrem.find((ele) => ele.category === prev.code);
|
|
503
|
-
prevTrem = tempFrameData.categories.find((ele) => ele.code === prev.code).terms.find((ele) => ele.code === prevTrem.code);
|
|
504
|
-
if (prevTrem && prevTrem.associations && prevTrem.associations.length > 0) {
|
|
505
|
-
prevTrem.associations.forEach((ele) => {
|
|
506
|
-
requestBody.request.term.associations.push({
|
|
507
|
-
identifier: ele.identifier
|
|
508
|
-
});
|
|
509
|
-
});
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
if (nodeId && nodeId.length > 0) {
|
|
513
|
-
nodeId.forEach((ele) => {
|
|
514
|
-
requestBody.request.term.associations.push({
|
|
515
|
-
identifier: ele
|
|
516
|
-
});
|
|
517
|
-
});
|
|
518
|
-
}
|
|
519
|
-
frameworkData.category = prevTrem.category || '';
|
|
520
|
-
const nodeIdParts = prevTrem.identifier.split('_');
|
|
521
|
-
const codeId = nodeIdParts[nodeIdParts.length - 1];
|
|
522
|
-
const updateAssociationRes = await this.treeHierarchySvc.updateFrameworkAssociation(requestBody, frameworkData, codeId).toPromise().catch(err => {
|
|
523
|
-
console.error('Error in updating association', err);
|
|
524
|
-
});
|
|
525
|
-
if (updateAssociationRes && updateAssociationRes.result && updateAssociationRes.result.node_id) {
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
publishFramework(frameworkData) {
|
|
529
|
-
this.treeHierarchySvc.publishFreamework(frameworkData).subscribe((res) => {
|
|
530
|
-
if (res && res.result && res.result.publishStatus) {
|
|
531
|
-
setTimeout(() => {
|
|
532
|
-
this._snackBar.open(`Organization hierarchy updated successfully`);
|
|
533
|
-
this.treeHierarchySvc.setLoaderState(false);
|
|
534
|
-
this.init();
|
|
535
|
-
}, 5000);
|
|
536
|
-
}
|
|
537
|
-
else {
|
|
538
|
-
this._snackBar.open('Error in publishing framework', 'cancel');
|
|
539
|
-
this.treeHierarchySvc.setLoaderState(false);
|
|
540
|
-
}
|
|
541
|
-
}, (err) => {
|
|
542
|
-
console.error('Error in publishing framework', err);
|
|
543
|
-
this.treeHierarchySvc.setLoaderState(false);
|
|
544
|
-
});
|
|
545
|
-
}
|
|
546
|
-
removeConnection(data) {
|
|
547
|
-
const association = this.getSelectedTermsAssociation(data.children.code);
|
|
548
|
-
let count = 0;
|
|
549
|
-
if (association && association.length > 0) {
|
|
550
|
-
association.forEach((assoc) => {
|
|
551
|
-
if (assoc.ids && assoc.ids.length > 0) {
|
|
552
|
-
count += assoc.ids.length;
|
|
553
|
-
}
|
|
554
|
-
});
|
|
555
|
-
}
|
|
556
|
-
if (count > 0) {
|
|
557
|
-
const dialogData = {
|
|
558
|
-
dialogType: 'warning',
|
|
559
|
-
descriptions: [
|
|
560
|
-
{
|
|
561
|
-
header: `${count || 0} Organisation${count > 1 ? 's' : ''} will be removed from organisation hierarchy.`,
|
|
562
|
-
headerClass: 'flex items-center justify-center text-blue',
|
|
563
|
-
messages: [
|
|
564
|
-
{
|
|
565
|
-
msgClass: 'text-blue margin-bottom-s',
|
|
566
|
-
msg: `Do you want to proceed?`,
|
|
567
|
-
},
|
|
568
|
-
],
|
|
569
|
-
},
|
|
570
|
-
],
|
|
571
|
-
footerClass: 'items-center justify-center',
|
|
572
|
-
buttons: [
|
|
573
|
-
{
|
|
574
|
-
btnText: 'No',
|
|
575
|
-
btnClass: 'btn-common btn-secondary',
|
|
576
|
-
response: false,
|
|
577
|
-
},
|
|
578
|
-
{
|
|
579
|
-
btnText: 'Yes',
|
|
580
|
-
btnClass: 'btn-common btn-primary',
|
|
581
|
-
response: true,
|
|
582
|
-
},
|
|
583
|
-
],
|
|
584
|
-
};
|
|
585
|
-
const dialogRef = this.dialog.open(ConforamtionPopupComponent, {
|
|
586
|
-
data: dialogData,
|
|
587
|
-
autoFocus: false,
|
|
588
|
-
width: '600px',
|
|
589
|
-
maxWidth: '80vw',
|
|
590
|
-
maxHeight: '90vh',
|
|
591
|
-
disableClose: true,
|
|
592
|
-
});
|
|
593
|
-
dialogRef.afterClosed().subscribe((res) => {
|
|
594
|
-
if (res) {
|
|
595
|
-
this.retireTermFunction(association);
|
|
596
|
-
}
|
|
597
|
-
});
|
|
598
|
-
}
|
|
599
|
-
else {
|
|
600
|
-
this._snackBar.open(`Error in removing the organisation`, 'cancel');
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
async retireTermFunction(association) {
|
|
604
|
-
let count = 0;
|
|
605
|
-
this.treeHierarchySvc.setLoaderState(true);
|
|
606
|
-
for await (const ele of association) {
|
|
607
|
-
const requestBody = {
|
|
608
|
-
request: {
|
|
609
|
-
contentIds: ele.ids
|
|
610
|
-
}
|
|
611
|
-
};
|
|
612
|
-
const frameworkObj = {
|
|
613
|
-
id: this.frameworkService.completeResponse.code,
|
|
614
|
-
category: ele.category || '',
|
|
615
|
-
};
|
|
616
|
-
const retireRes = await this.treeHierarchySvc.retireTerm(requestBody, frameworkObj).toPromise().catch((_err) => {
|
|
617
|
-
this.treeHierarchySvc.setLoaderState(false);
|
|
618
|
-
this._snackBar.open(`Failed to remove connection.`, 'cancel');
|
|
619
|
-
});
|
|
620
|
-
if (retireRes && retireRes.params && retireRes.params.status?.toLowerCase() === 'successful') {
|
|
621
|
-
let orgId = null;
|
|
622
|
-
const findOrgId = (children, targetCode) => {
|
|
623
|
-
for (const child of children) {
|
|
624
|
-
if (child?.code === targetCode) {
|
|
625
|
-
return child?.additionalProperties?.orgId || null;
|
|
626
|
-
}
|
|
627
|
-
if (child?.children && child?.children?.length > 0) {
|
|
628
|
-
const found = findOrgId(child?.children, targetCode);
|
|
629
|
-
if (found)
|
|
630
|
-
return found;
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
return null;
|
|
634
|
-
};
|
|
635
|
-
if (ele.ids && ele.ids.length > 0) {
|
|
636
|
-
const completeData = _.cloneDeep(this.frameworkService?.completeResponse);
|
|
637
|
-
if (completeData && completeData?.categories) {
|
|
638
|
-
for (const category of completeData?.categories) {
|
|
639
|
-
if (category?.terms) {
|
|
640
|
-
orgId = findOrgId(category?.terms, ele?.ids[0]);
|
|
641
|
-
if (orgId)
|
|
642
|
-
break;
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
const orgUpdateBody = {
|
|
648
|
-
orgId: orgId,
|
|
649
|
-
parentPathId: ""
|
|
650
|
-
};
|
|
651
|
-
await this.treeHierarchySvc.orgContentUpdate(orgUpdateBody).toPromise().catch((_err) => {
|
|
652
|
-
console.log('Error in org content update', _err);
|
|
653
|
-
});
|
|
654
|
-
count += 1;
|
|
655
|
-
}
|
|
656
|
-
else {
|
|
657
|
-
this.treeHierarchySvc.setLoaderState(false);
|
|
658
|
-
this._snackBar.open(`Failed to remove connection.`, 'cancel');
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
if (count === association.length) {
|
|
662
|
-
await this.publishFramework({
|
|
663
|
-
id: this.frameworkService.completeResponse.code,
|
|
664
|
-
});
|
|
665
|
-
}
|
|
666
|
-
else {
|
|
667
|
-
this.treeHierarchySvc.setLoaderState(false);
|
|
668
|
-
this._snackBar.open(`Failed to remove connection.`, 'cancel');
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
cardActionEmit(event) {
|
|
672
|
-
switch (event.action) {
|
|
673
|
-
case 'remove-term':
|
|
674
|
-
this.removeConnection(event.data);
|
|
675
|
-
break;
|
|
676
|
-
case 'update-hierarchy':
|
|
677
|
-
this.openOrganizationDialog(this.list[this.list.findIndex((item) => item.code === event.data.category) + 1], '', 'update');
|
|
678
|
-
break;
|
|
679
|
-
case 'manage-org':
|
|
680
|
-
this.manageOrg.emit(event.data.children);
|
|
681
|
-
break;
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
editCategoryName(column, index) {
|
|
685
|
-
const dialog = this.dialog.open(CategoryEditModuleComponent, {
|
|
686
|
-
data: {
|
|
687
|
-
columnInfo: column,
|
|
688
|
-
frameworkId: this.frameworkService.getFrameworkId(),
|
|
689
|
-
colIndex: index
|
|
690
|
-
},
|
|
691
|
-
width: '800px',
|
|
692
|
-
panelClass: 'category-edit-container',
|
|
693
|
-
position: { top: '50px' }
|
|
694
|
-
});
|
|
695
|
-
dialog.afterClosed().subscribe((res) => {
|
|
696
|
-
if (res) {
|
|
697
|
-
const requestBody = {
|
|
698
|
-
frameworkId: this.frameworkService.getFrameworkId(),
|
|
699
|
-
categoryCode: res.column.columnData.code,
|
|
700
|
-
categoryName: res.column.formData.categoryName,
|
|
701
|
-
categoryDescription: res.column.formData.categotyDescription || ''
|
|
702
|
-
};
|
|
703
|
-
this.updateCategory(requestBody);
|
|
704
|
-
}
|
|
705
|
-
});
|
|
706
|
-
}
|
|
707
|
-
getSelectedTermsAssociation(categoryCode) {
|
|
708
|
-
let tempData = [];
|
|
709
|
-
const completeData = _.cloneDeep(this.frameworkService.completeResponse);
|
|
710
|
-
if (completeData && completeData.categories && completeData.categories.length > 0) {
|
|
711
|
-
completeData.categories.forEach((category, catIndex) => {
|
|
712
|
-
if (category.terms && category.terms.length > 0) {
|
|
713
|
-
category.terms.forEach((term) => {
|
|
714
|
-
if (term.code === categoryCode) {
|
|
715
|
-
tempData.push({
|
|
716
|
-
name: term.name,
|
|
717
|
-
category: term.category,
|
|
718
|
-
ids: [term.code],
|
|
719
|
-
nextCategory: term.children ? term.children[0].category : '',
|
|
720
|
-
assocIds: []
|
|
721
|
-
});
|
|
722
|
-
if (term.associations && term.associations.length > 0) {
|
|
723
|
-
term.associations.forEach((assoc) => {
|
|
724
|
-
const getIndex = tempData.findIndex((item) => item.ids && item.ids.includes(term.code));
|
|
725
|
-
tempData[getIndex]['assocIds'].push(assoc.code);
|
|
726
|
-
});
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
});
|
|
730
|
-
}
|
|
731
|
-
if (catIndex > 0 && category.terms && category.terms.length > 0) {
|
|
732
|
-
category.terms.forEach((term) => {
|
|
733
|
-
tempData.forEach((item) => {
|
|
734
|
-
if (item.nextCategory === term.category && item.assocIds.includes(term.code)) {
|
|
735
|
-
const pushData = {
|
|
736
|
-
name: term.name,
|
|
737
|
-
category: term.category,
|
|
738
|
-
ids: [term.code],
|
|
739
|
-
nextCategory: term.children ? term.children[0].category : '',
|
|
740
|
-
assocIds: []
|
|
741
|
-
};
|
|
742
|
-
if (term.associations && term.associations.length > 0) {
|
|
743
|
-
term.associations.forEach((assoc) => {
|
|
744
|
-
pushData['assocIds'].push(assoc.code);
|
|
745
|
-
});
|
|
746
|
-
}
|
|
747
|
-
tempData.push(pushData);
|
|
748
|
-
}
|
|
749
|
-
});
|
|
750
|
-
});
|
|
751
|
-
}
|
|
752
|
-
});
|
|
753
|
-
}
|
|
754
|
-
return tempData;
|
|
755
|
-
}
|
|
756
|
-
async updateCategory(event) {
|
|
757
|
-
const requestBody = {
|
|
758
|
-
request: {
|
|
759
|
-
category: {
|
|
760
|
-
name: event.categoryName || '',
|
|
761
|
-
description: event.categoryDescription || '',
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
};
|
|
765
|
-
const frameworkObj = {
|
|
766
|
-
id: event.frameworkId,
|
|
767
|
-
category: event.categoryCode
|
|
768
|
-
};
|
|
769
|
-
this.treeHierarchySvc.setLoaderState(true);
|
|
770
|
-
const updateCatRes = await this.treeHierarchySvc.updateCategory(requestBody, frameworkObj).toPromise().catch((_err) => {
|
|
771
|
-
this.treeHierarchySvc.setLoaderState(false);
|
|
772
|
-
if (_err && _err.error && _err.error.params && _err.error.params.errMsg) {
|
|
773
|
-
this._snackBar.open(`${_err.error.params.errMsg}`);
|
|
774
|
-
}
|
|
775
|
-
});
|
|
776
|
-
if (updateCatRes && updateCatRes.params && updateCatRes.params.status.toLowerCase() === 'successful') {
|
|
777
|
-
await this.publishFramework(frameworkObj);
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
async updateParentAssociation(selectedParent, currentTerm) {
|
|
781
|
-
const framworkData = _.cloneDeep(this.frameworkService.completeResponse);
|
|
782
|
-
const parentCategoryData = framworkData.categories.find((cat) => cat.code === selectedParent.category);
|
|
783
|
-
if (parentCategoryData && parentCategoryData.terms && parentCategoryData.terms.length > 0) {
|
|
784
|
-
const currentParentTerm = parentCategoryData.terms.find((term) => {
|
|
785
|
-
if (term.associations && term.associations.length > 0) {
|
|
786
|
-
return term.associations.some((assoc) => assoc.code === currentTerm.code);
|
|
787
|
-
}
|
|
788
|
-
});
|
|
789
|
-
if (currentParentTerm) {
|
|
790
|
-
const updateOldParentAssociation = {
|
|
791
|
-
request: {
|
|
792
|
-
term: {
|
|
793
|
-
associations: []
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
};
|
|
797
|
-
currentParentTerm.associations.forEach((assoc) => {
|
|
798
|
-
if (assoc.code !== currentTerm.code) {
|
|
799
|
-
updateOldParentAssociation.request.term.associations.push({ identifier: assoc.identifier });
|
|
800
|
-
}
|
|
801
|
-
});
|
|
802
|
-
await this.updateHierarchyAssocication(updateOldParentAssociation, framworkData.identifier, currentParentTerm);
|
|
803
|
-
}
|
|
804
|
-
selectedParent = parentCategoryData.terms.find((term) => term.code === selectedParent.code);
|
|
805
|
-
const updateNewParentAssociation = {
|
|
806
|
-
request: {
|
|
807
|
-
term: {
|
|
808
|
-
associations: []
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
};
|
|
812
|
-
if (selectedParent && selectedParent.associations && selectedParent.associations.length > 0) {
|
|
813
|
-
selectedParent.associations.forEach((assoc) => {
|
|
814
|
-
updateNewParentAssociation.request.term.associations.push({ identifier: assoc.identifier });
|
|
815
|
-
});
|
|
816
|
-
}
|
|
817
|
-
updateNewParentAssociation.request.term.associations.push({ identifier: currentTerm.identifier });
|
|
818
|
-
await this.updateHierarchyAssocication(updateNewParentAssociation, framworkData.identifier, selectedParent);
|
|
819
|
-
}
|
|
820
|
-
}
|
|
821
|
-
async updateHierarchyAssocication(requestBody, frameworkId, termData) {
|
|
822
|
-
this.treeHierarchySvc.setLoaderState(true);
|
|
823
|
-
await this.treeHierarchySvc.updateFrameworkAssociation(requestBody, { id: frameworkId, category: termData.category }, termData.code).toPromise().catch((err) => {
|
|
824
|
-
console.error('Error in updating association', err);
|
|
825
|
-
this.treeHierarchySvc.setLoaderState(false);
|
|
826
|
-
this._snackBar.open(`Error in updating association`, 'cancel');
|
|
827
|
-
});
|
|
828
|
-
}
|
|
829
|
-
checkChildOrg() {
|
|
830
|
-
return (this.childOrgData?.rootOrgId !== this.orgSelectedData?.id || this.userRolesData?.has('mdo_admin')) ? true : false;
|
|
831
|
-
}
|
|
832
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeViewComponent, deps: [{ token: i1.FrameworkService }, { token: i2.LocalConnectionService }, { token: i3.MatLegacyDialog }, { token: i4.ApprovalService }, { token: i5.MatLegacySnackBar }, { token: i6.ConnectorService }, { token: i0.ChangeDetectorRef }, { token: i7.TreeHierarchyService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
833
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TreeViewComponent, selector: "lib-tree-view", inputs: { approvalList: "approvalList", isApprovalView: "isApprovalView", workFlowStatus: "workFlowStatus", environment: "environment", taxonomyConfig: "taxonomyConfig", orgSelectedData: "orgSelectedData", childOrgData: "childOrgData", userRolesData: "userRolesData" }, outputs: { sentForApprove: "sentForApprove", loaderEnable: "loaderEnable", manageOrg: "manageOrg" }, usesOnChanges: true, ngImport: i0, template: "<!-- <div class=\"flex flex-1 connectionSettings\">\n <button mat-raised-button color=\"accent\" (click)=\"newConnection()\">\n <mat-icon>{{app_strings.build}}</mat-icon>\n </button>\n</div> -->\n\n<div *ngIf=\"list && list.length > 0\" class=\"flex heightFix overflow-container\" id=\"treeViewContainer\">\n <ng-container *ngFor=\"let column of list; let i = index;\">\n <div class=\"flex-1 flex-col col-container containers{{list.length}}\" id=\"box{{i+1}}Container\">\n <div class=\"category-heading-sticky\">\n <div class=\"category-heading-container\">\n <div class='category-header'>\n <div class=\"category-header-items w-full flex padding-remove\" id=\"box{{i}}Header\">\n <span class=\"flex gap-1 mat-body-1\">\n <ng-container *ngIf=\"column?.config?.iconEnabled\">\n <mat-icon [ngStyle]=\"{'color':column.config.color}\">{{column.config.icon}}</mat-icon>\n </ng-container>\n <!-- {{column.name}} -->\n {{column?.config?.categoryDisplayName || column.name }}\n <ng-container *ngIf=\"i != 0 && categoryList?.length > 0; else firstColumn\">\n <ng-container *ngIf=\"column.index !== 1\">\n <span class=\"count\">({{getCount(column.code)}})</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"column?.config?.levelNameEdit && !checkChildOrg()\">\n <button mat-icon-button type=\"button\" class=\"edit-btn flex\" (click)=\"editCategoryName(column, i)\">\n <mat-icon>edit</mat-icon>\n </button>\n </ng-container>\n </span>\n <ng-template #firstColumn>\n <span *ngIf=\"i == 0\" id=\"box{{i+1}}count\" class=\"count\">({{column.children.length}})</span>\n </ng-template>\n <ng-container class=\"\" *ngIf=\"column?.config?.createBtnEnabled && !column?.config?.addOrgEnabled && !checkChildOrg()\">\n <button mat-button class=\"add-btn margin-left-auto\" [ngClass]=\"{'button-enabled': configCodeBtn== column?.code, 'button-disabled': configCodeBtn!== column?.code}\"\n (click)=\"openCreateTermDialog(column, i)\" type=\"button\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"column?.config?.addOrgEnabled && !column?.config?.createBtnEnabled && !checkChildOrg()\">\n <button mat-button class=\"add-btn margin-left-auto\" (click)=\"openOrganizationDialog(column, i, 'add')\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <div class=\"arrow\" id=\"box{{i+1}}count\"></div>\n </div>\n </div>\n <!-- <div>\n Put search button here in future\n </div> -->\n </div>\n </div>\n <div class=\"padding-x2 cat-columns container-box\" id=\"box{{i+1}}\">\n <ng-container *ngIf=\"column?.children && column?.children.length > 0\">\n <lib-tree-column-view *ngIf=\"loaded[column.code]\" #selectedTaxonomyTerm [column]=\"column\"\n [containerId]=\"'box'+(i+1)\" [childOrg]=\"childOrgData\" [isChildOrg]=\"checkChildOrg()\" (updateTaxonomyTerm)=\"updateTaxonomyTerm($event)\"\n (updateTermList)=\"updateDraftStatusTerms($event)\" (cardsCount)=\"getNoOfCards($event)\" \n (retireTermData)=\"removeConnection($event)\" (cardAction)=\"cardActionEmit($event)\">\n </lib-tree-column-view>\n </ng-container>\n <ng-container *ngIf=\"shouldShowSvgBorderWrapper(column, i) && !checkChildOrg()\">\n <div class=\"svg-border-wrapper\">\n <svg width=\"100%\" height=\"100%\">\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"none\" stroke=\"#1B213352\" stroke-width=\"2\" \n stroke-dasharray=\"20, 10\" rx=\"10\" ry=\"10\"/>\n </svg>\n <div class=\"content flex flex-col w-full\">\n <div class=\"icon-container\">\n <mat-icon svgIcon=\"frac-no-connection\"></mat-icon>\n </div>\n <label>Select an organization to add or see further connections</label>\n <button mat-button class=\"add-btn\" (click)=\"openOrganizationDialog(column, i, 'add')\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <lib-action-bar *ngIf=\"showActionBar\" [actionType]=\"isApprovalView\" [configType]=\"workFlowStatus\"\n (sendApproval)=\"sendForApproval()\" (closeAction)=\"closeActionBar($event)\"></lib-action-bar>\n</div>\n<div *ngIf=\"!(list && list.length > 0 ) && isFraworkLoading\" class=\"flex heightFix \">\n <h1 i18n>{{app_strings.loading}}</h1>\n</div>", styles: [".connectionSettings{flex-direction:row-reverse;z-index:40;position:fixed;padding:0 4px 4px 0;bottom:0;right:0}.flex{display:flex}.w-full{width:100%;align-items:center;display:flex}.w-full.addCardButton{padding:.25em .8em;text-align:left;border:2px dotted #b1b1b1;color:#666;border-radius:8px}.w-full.addCardButton .mat-icon{position:absolute;top:0%;right:3%;height:100%;display:flex;align-items:center}.w-full .button-enabled{opacity:1;pointer-events:auto}.w-full .button-disabled{opacity:.5;pointer-events:none}.w-full.addCardButtonNew{padding:8px 12px;text-align:center;border-radius:24px;height:24px;background:#1b4ca1;color:#fff!important}.w-full.addCardButtonNew .mat-icon-custom{font-size:21px}.w-full.addCardButtonNew:disabled{opacity:.6}.mb1{margin-bottom:1em}flex-center{flex-wrap:nowrap;align-items:start;justify-content:center}.flex-1{flex:1}.felx-col{flex-direction:column}.padding-x2{padding:0 2.5em}.heightFix{height:100%;width:100%;justify-content:space-around;position:relative}.cat-columns{position:relative;height:inherit}.col-container{display:flex;flex-direction:column;height:inherit;min-width:350px;max-width:300px}.category-heading-sticky{position:sticky;top:0;z-index:10;width:100%;background-color:#fff;margin-bottom:16px}.category-heading-container{box-sizing:content-box;position:relative;display:block;padding:2px 2.5em}.category-heading-container .category-header{display:flex;align-items:center}.category-heading-container .category-header-items{display:flex;align-items:center;padding:0 10px}.category-heading-container .category-header h4{padding:0 10px;color:#00000080}.category-heading-container .category-header .count{padding:0 2px}.category-heading-container .category-header .category-header-items{font-size:12px;font-weight:600;font-family:Lato;color:#7c7c7c}.cat-columns:hover{overflow-y:scroll}.container-box{overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none;height:calc(100% - 70px)}.container-box::-webkit-scrollbar{width:0;height:0}.spinner{position:fixed;display:flex;top:50%;left:50%}.arrow{left:30px;position:relative}@media only screen and (max-width: 1024px){::ng-deep mat-checkbox .mat-checkbox-inner-container{height:.8em;width:.8em}}@media only screen and (max-width: 1024px){.containers4{max-width:250px;font-size:10px}.containers5{max-width:230px}.containers6{max-width:150px}.containers7{max-width:100px}.w-full{height:3.5em}.w-full.mat-stroked-button{font-size:8px}.padding-x2,.category-heading-container{padding:0 2em}mat-icon{font-size:12px;width:1.25em;height:1.25em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .5em;line-height:2em}}@media only screen and (max-width: 992px){.containers4{max-width:220px;font-size:9px}.padding-x2,.category-heading-container{padding:0 1.5em}}@media only screen and (max-width: 768px){.containers4{max-width:165px;font-size:8px}.w-full{height:2.5em}.padding-x2,.category-heading-container{padding:0 1em}mat-icon{font-size:8px;width:1em;height:1em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .3em;line-height:1.5em}}.add-btn{height:24px;background:#1b4ca1;color:#fff!important;display:flex;flex-direction:row-reverse;justify-content:space-between;border-radius:12px}.overflow-container{width:100%;max-width:calc(100vw - 340px);overflow-x:auto;overflow-y:hidden;white-space:nowrap}.svg-border-wrapper{position:relative;width:100%;height:95%;min-height:100px}.svg-border-wrapper .content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center}.content{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;text-align:center}.content label{max-width:90%;margin:10px 0;font-size:16px;line-height:1.4;color:#000000b3;white-space:normal;word-wrap:break-word;font-weight:700}.icon-container{background:#0000000a;position:relative;width:40px;height:40px;border-radius:5px}.icon-container mat-icon{width:30px;height:30px;margin:auto;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.edit-btn{width:24px;height:24px;padding:0;display:flex;align-items:center;justify-content:center;position:relative}.edit-btn mat-icon{font-size:16px;position:absolute;top:50%;height:16px;left:50%;width:16px;transform:translate(-50%,-50%)}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i9.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: i9.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.TreeColumnViewComponent, selector: "lib-tree-column-view", inputs: ["column", "containerId", "isChildOrg", "childOrg"], outputs: ["updateTaxonomyTerm", "updateTermList", "cardsCount", "cardAction"] }, { kind: "component", type: i12.ActionBarComponent, selector: "lib-action-bar", inputs: ["actionType", "configType"], outputs: ["sendApproval", "closeAction"] }] }); }
|
|
834
|
-
}
|
|
835
|
-
export { TreeViewComponent };
|
|
836
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeViewComponent, decorators: [{
|
|
837
|
-
type: Component,
|
|
838
|
-
args: [{ selector: 'lib-tree-view', template: "<!-- <div class=\"flex flex-1 connectionSettings\">\n <button mat-raised-button color=\"accent\" (click)=\"newConnection()\">\n <mat-icon>{{app_strings.build}}</mat-icon>\n </button>\n</div> -->\n\n<div *ngIf=\"list && list.length > 0\" class=\"flex heightFix overflow-container\" id=\"treeViewContainer\">\n <ng-container *ngFor=\"let column of list; let i = index;\">\n <div class=\"flex-1 flex-col col-container containers{{list.length}}\" id=\"box{{i+1}}Container\">\n <div class=\"category-heading-sticky\">\n <div class=\"category-heading-container\">\n <div class='category-header'>\n <div class=\"category-header-items w-full flex padding-remove\" id=\"box{{i}}Header\">\n <span class=\"flex gap-1 mat-body-1\">\n <ng-container *ngIf=\"column?.config?.iconEnabled\">\n <mat-icon [ngStyle]=\"{'color':column.config.color}\">{{column.config.icon}}</mat-icon>\n </ng-container>\n <!-- {{column.name}} -->\n {{column?.config?.categoryDisplayName || column.name }}\n <ng-container *ngIf=\"i != 0 && categoryList?.length > 0; else firstColumn\">\n <ng-container *ngIf=\"column.index !== 1\">\n <span class=\"count\">({{getCount(column.code)}})</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"column?.config?.levelNameEdit && !checkChildOrg()\">\n <button mat-icon-button type=\"button\" class=\"edit-btn flex\" (click)=\"editCategoryName(column, i)\">\n <mat-icon>edit</mat-icon>\n </button>\n </ng-container>\n </span>\n <ng-template #firstColumn>\n <span *ngIf=\"i == 0\" id=\"box{{i+1}}count\" class=\"count\">({{column.children.length}})</span>\n </ng-template>\n <ng-container class=\"\" *ngIf=\"column?.config?.createBtnEnabled && !column?.config?.addOrgEnabled && !checkChildOrg()\">\n <button mat-button class=\"add-btn margin-left-auto\" [ngClass]=\"{'button-enabled': configCodeBtn== column?.code, 'button-disabled': configCodeBtn!== column?.code}\"\n (click)=\"openCreateTermDialog(column, i)\" type=\"button\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"column?.config?.addOrgEnabled && !column?.config?.createBtnEnabled && !checkChildOrg()\">\n <button mat-button class=\"add-btn margin-left-auto\" (click)=\"openOrganizationDialog(column, i, 'add')\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <div class=\"arrow\" id=\"box{{i+1}}count\"></div>\n </div>\n </div>\n <!-- <div>\n Put search button here in future\n </div> -->\n </div>\n </div>\n <div class=\"padding-x2 cat-columns container-box\" id=\"box{{i+1}}\">\n <ng-container *ngIf=\"column?.children && column?.children.length > 0\">\n <lib-tree-column-view *ngIf=\"loaded[column.code]\" #selectedTaxonomyTerm [column]=\"column\"\n [containerId]=\"'box'+(i+1)\" [childOrg]=\"childOrgData\" [isChildOrg]=\"checkChildOrg()\" (updateTaxonomyTerm)=\"updateTaxonomyTerm($event)\"\n (updateTermList)=\"updateDraftStatusTerms($event)\" (cardsCount)=\"getNoOfCards($event)\" \n (retireTermData)=\"removeConnection($event)\" (cardAction)=\"cardActionEmit($event)\">\n </lib-tree-column-view>\n </ng-container>\n <ng-container *ngIf=\"shouldShowSvgBorderWrapper(column, i) && !checkChildOrg()\">\n <div class=\"svg-border-wrapper\">\n <svg width=\"100%\" height=\"100%\">\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"none\" stroke=\"#1B213352\" stroke-width=\"2\" \n stroke-dasharray=\"20, 10\" rx=\"10\" ry=\"10\"/>\n </svg>\n <div class=\"content flex flex-col w-full\">\n <div class=\"icon-container\">\n <mat-icon svgIcon=\"frac-no-connection\"></mat-icon>\n </div>\n <label>Select an organization to add or see further connections</label>\n <button mat-button class=\"add-btn\" (click)=\"openOrganizationDialog(column, i, 'add')\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <lib-action-bar *ngIf=\"showActionBar\" [actionType]=\"isApprovalView\" [configType]=\"workFlowStatus\"\n (sendApproval)=\"sendForApproval()\" (closeAction)=\"closeActionBar($event)\"></lib-action-bar>\n</div>\n<div *ngIf=\"!(list && list.length > 0 ) && isFraworkLoading\" class=\"flex heightFix \">\n <h1 i18n>{{app_strings.loading}}</h1>\n</div>", styles: [".connectionSettings{flex-direction:row-reverse;z-index:40;position:fixed;padding:0 4px 4px 0;bottom:0;right:0}.flex{display:flex}.w-full{width:100%;align-items:center;display:flex}.w-full.addCardButton{padding:.25em .8em;text-align:left;border:2px dotted #b1b1b1;color:#666;border-radius:8px}.w-full.addCardButton .mat-icon{position:absolute;top:0%;right:3%;height:100%;display:flex;align-items:center}.w-full .button-enabled{opacity:1;pointer-events:auto}.w-full .button-disabled{opacity:.5;pointer-events:none}.w-full.addCardButtonNew{padding:8px 12px;text-align:center;border-radius:24px;height:24px;background:#1b4ca1;color:#fff!important}.w-full.addCardButtonNew .mat-icon-custom{font-size:21px}.w-full.addCardButtonNew:disabled{opacity:.6}.mb1{margin-bottom:1em}flex-center{flex-wrap:nowrap;align-items:start;justify-content:center}.flex-1{flex:1}.felx-col{flex-direction:column}.padding-x2{padding:0 2.5em}.heightFix{height:100%;width:100%;justify-content:space-around;position:relative}.cat-columns{position:relative;height:inherit}.col-container{display:flex;flex-direction:column;height:inherit;min-width:350px;max-width:300px}.category-heading-sticky{position:sticky;top:0;z-index:10;width:100%;background-color:#fff;margin-bottom:16px}.category-heading-container{box-sizing:content-box;position:relative;display:block;padding:2px 2.5em}.category-heading-container .category-header{display:flex;align-items:center}.category-heading-container .category-header-items{display:flex;align-items:center;padding:0 10px}.category-heading-container .category-header h4{padding:0 10px;color:#00000080}.category-heading-container .category-header .count{padding:0 2px}.category-heading-container .category-header .category-header-items{font-size:12px;font-weight:600;font-family:Lato;color:#7c7c7c}.cat-columns:hover{overflow-y:scroll}.container-box{overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none;height:calc(100% - 70px)}.container-box::-webkit-scrollbar{width:0;height:0}.spinner{position:fixed;display:flex;top:50%;left:50%}.arrow{left:30px;position:relative}@media only screen and (max-width: 1024px){::ng-deep mat-checkbox .mat-checkbox-inner-container{height:.8em;width:.8em}}@media only screen and (max-width: 1024px){.containers4{max-width:250px;font-size:10px}.containers5{max-width:230px}.containers6{max-width:150px}.containers7{max-width:100px}.w-full{height:3.5em}.w-full.mat-stroked-button{font-size:8px}.padding-x2,.category-heading-container{padding:0 2em}mat-icon{font-size:12px;width:1.25em;height:1.25em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .5em;line-height:2em}}@media only screen and (max-width: 992px){.containers4{max-width:220px;font-size:9px}.padding-x2,.category-heading-container{padding:0 1.5em}}@media only screen and (max-width: 768px){.containers4{max-width:165px;font-size:8px}.w-full{height:2.5em}.padding-x2,.category-heading-container{padding:0 1em}mat-icon{font-size:8px;width:1em;height:1em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .3em;line-height:1.5em}}.add-btn{height:24px;background:#1b4ca1;color:#fff!important;display:flex;flex-direction:row-reverse;justify-content:space-between;border-radius:12px}.overflow-container{width:100%;max-width:calc(100vw - 340px);overflow-x:auto;overflow-y:hidden;white-space:nowrap}.svg-border-wrapper{position:relative;width:100%;height:95%;min-height:100px}.svg-border-wrapper .content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center}.content{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;text-align:center}.content label{max-width:90%;margin:10px 0;font-size:16px;line-height:1.4;color:#000000b3;white-space:normal;word-wrap:break-word;font-weight:700}.icon-container{background:#0000000a;position:relative;width:40px;height:40px;border-radius:5px}.icon-container mat-icon{width:30px;height:30px;margin:auto;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.edit-btn{width:24px;height:24px;padding:0;display:flex;align-items:center;justify-content:center;position:relative}.edit-btn mat-icon{font-size:16px;position:absolute;top:50%;height:16px;left:50%;width:16px;transform:translate(-50%,-50%)}\n"] }]
|
|
839
|
-
}], ctorParameters: function () { return [{ type: i1.FrameworkService }, { type: i2.LocalConnectionService }, { type: i3.MatLegacyDialog }, { type: i4.ApprovalService }, { type: i5.MatLegacySnackBar }, { type: i6.ConnectorService }, { type: i0.ChangeDetectorRef }, { type: i7.TreeHierarchyService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { approvalList: [{
|
|
840
|
-
type: Input
|
|
841
|
-
}], isApprovalView: [{
|
|
842
|
-
type: Input
|
|
843
|
-
}], workFlowStatus: [{
|
|
844
|
-
type: Input
|
|
845
|
-
}], environment: [{
|
|
846
|
-
type: Input
|
|
847
|
-
}], taxonomyConfig: [{
|
|
848
|
-
type: Input
|
|
849
|
-
}], orgSelectedData: [{
|
|
850
|
-
type: Input
|
|
851
|
-
}], childOrgData: [{
|
|
852
|
-
type: Input
|
|
853
|
-
}], userRolesData: [{
|
|
854
|
-
type: Input
|
|
855
|
-
}], sentForApprove: [{
|
|
856
|
-
type: Output
|
|
857
|
-
}], loaderEnable: [{
|
|
858
|
-
type: Output
|
|
859
|
-
}], manageOrg: [{
|
|
860
|
-
type: Output
|
|
861
|
-
}] } });
|
|
862
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90cmVlLWhpZXJhcmNoeS9zcmMvbGliL2NvbXBvbmVudHMvdHJlZS12aWV3L3RyZWUtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUtdmlldy90cmVlLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFBZ0MsTUFBTSxlQUFlLENBQUM7QUFHN0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFPdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQztBQUN0SCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUU3RyxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNuQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNoRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzRUFBc0UsQ0FBQztBQUNuSCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBR3ZCLE1BS2EsaUJBQWlCO0lBOEI1QixZQUFvQixnQkFBa0MsRUFDNUMsUUFBZ0MsRUFDakMsTUFBaUIsRUFDaEIsZUFBZ0MsRUFDaEMsU0FBc0IsRUFDdEIsWUFBOEIsRUFDOUIsR0FBc0IsRUFDdEIsZ0JBQXNDLEVBQ3RDLGNBQWlDO1FBUnZCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDNUMsYUFBUSxHQUFSLFFBQVEsQ0FBd0I7UUFDakMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNoQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBa0I7UUFDOUIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFzQjtRQUN0QyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFyQ2xDLGlCQUFZLEdBQWdCLEVBQUUsQ0FBQztRQUMvQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxtQkFBYyxHQUFXLEVBQUUsQ0FBQztRQU0zQixtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUE7UUFDeEMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFBO1FBQ3RDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFBO1FBQzdDLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixrQkFBYSxHQUFHLEVBQUUsQ0FBQTtRQUNsQixjQUFTLEdBQUcsRUFBRSxDQUFBO1FBQ2QsZ0JBQVcsR0FBWSxLQUFLLENBQUE7UUFDNUIsd0JBQW1CLEdBQTZCLFNBQVMsQ0FBQTtRQUN6RCxXQUFNLEdBQVEsRUFBRSxDQUFBO1FBQ2hCLGtCQUFhLEdBQVksS0FBSyxDQUFBO1FBQzlCLDBCQUFxQixHQUFHLEVBQUUsQ0FBQTtRQUMxQixlQUFVLEdBQWdCLEVBQUUsQ0FBQztRQUM3QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGlCQUFZLEdBQU8sRUFBRSxDQUFDO1FBQ3RCLGdCQUFXLEdBQVEsTUFBTSxDQUFDO1FBQzFCLGlCQUFZLEdBQVUsSUFBSSxDQUFDO1FBQzNCLGFBQVEsR0FBVSxFQUFFLENBQUM7UUFHckIscUJBQWdCLEdBQUcsSUFBSSxDQUFBO0lBV25CLENBQUM7SUFFTCxRQUFRO1FBQ04sSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNYLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFBLENBQUMsQ0FBQSxLQUFLLENBQUM7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNuRSxJQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3hELElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUE7YUFDL0I7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBRUQsV0FBVztJQUVYLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUEsSUFBSTtRQUNGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN0SixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFBO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFO2dCQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUE7WUFDOUIsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtZQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUVYLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1lBQ2pDLENBQUMsRUFBQyxHQUFHLENBQUMsQ0FBQTtRQUNWLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUNuRCxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FDcEUsSUFBSSxDQUFDLEVBQUU7WUFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3JDLENBQUMsQ0FDRixDQUFBO0lBRUgsQ0FBQztJQUNELFdBQVcsQ0FBQyxPQUFZO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUE7UUFDdkIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtZQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtTQUN4QjtRQUNELElBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBQztZQUN6RCxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDdkI7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFBO1FBRXRDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2pGLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFBO1FBQ2pCLElBQUksWUFBWSxFQUFFO1lBQ2hCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3ZFLElBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUM7Z0JBRTNCLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUksR0FBRyxDQUFDLElBQUksQ0FBQTtnQkFZakgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQTtnQkFDdEMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO2dCQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO2dCQUNuSCxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFBO2dCQUM1SCxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7YUFNMUI7aUJBQU07Z0JBQ0wsSUFBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUM7b0JBQ1osR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7aUJBQzdGO2dCQUNELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUUsQ0FBQTthQUNySDtTQUNGO0lBRUgsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQVksQ0FBQTtRQUM5RSxJQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBQztZQUM1QyxJQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUNwRixNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBUSxDQUFBO2dCQUNyRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFFdkQsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7Z0JBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQzdELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7Z0JBQ25HLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7YUFDOUI7U0FDRjtJQUNILENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUE4RDtRQUMvRSxJQUFHLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO1lBQzFELElBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFDO2dCQUNoQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO2FBQzNCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO2FBQ3JDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFFO0lBQ0gsQ0FBQztJQUNELGVBQWUsQ0FBQyxRQUFnQixFQUFFLGdCQUF3QjtRQUN4RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5RCxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFO1lBQ3pDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFnQixLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO2dCQUM3RCxPQUFPLElBQUksQ0FBQTtZQUNiLENBQUMsQ0FBQyxDQUFBO1NBQ0g7SUFDSCxDQUFDO0lBR0QsZUFBZSxDQUFDLElBQWlGLEVBQUUsSUFBVTtRQUUzRyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFFbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM5RSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7YUFDdEQ7WUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQTtTQUNySjtRQUNELElBQUcsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLFVBQVUsQ0FBQyxHQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ2IsQ0FBQyxFQUFDLElBQUksQ0FBQyxDQUFBO1NBQ1I7UUFDRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQTtRQUtoRCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFVixDQUFDO0lBQ0QsU0FBUyxDQUFDLFVBQWtCO1FBQzFCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRCxVQUFVO1FBRVYsSUFBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFDO1lBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFDLEVBQUU7Z0JBQ3RELE1BQU0sUUFBUSxHQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2hFLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUM7b0JBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7aUJBQ2pFO2dCQUNGLElBQUcsUUFBUSxFQUFDO29CQUNYLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQTtpQkFDbEM7WUFDRCxDQUFDLENBQUMsQ0FBQTtTQUNKO0lBR0QsQ0FBQztJQVdELG9CQUFvQixDQUFDLE1BQVcsRUFBRSxRQUFhO1FBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFBO1lBQzNCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDbEUsSUFBRyxPQUFPLEVBQUU7Z0JBQ1YsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUM3RSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBRSxDQUFBO2dCQUNoRyxJQUFJLFdBQVcsR0FBUSxFQUFFLENBQUE7Z0JBQ3pCLElBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUU7b0JBQ2xDLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxJQUFJLENBQUUsQ0FBQTtpQkFDeEc7Z0JBQ0QsSUFBSSxNQUFXLENBQUE7Z0JBQ2YsSUFBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxLQUFLLGlCQUFpQixFQUFDO29CQUMxRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEVBQUU7d0JBQzFELElBQUksRUFBRTs0QkFDSixJQUFJLEVBQUMsY0FBYzs0QkFFbkIsVUFBVSxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7NEJBQ3ZELFdBQVcsRUFBRSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFOzRCQUNwRSxXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRTs0QkFDbkQsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhOzRCQUNuQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUs7NEJBRXZCLG1CQUFtQixFQUFFLGFBQWE7eUJBQ25DO3dCQUNELEtBQUssRUFBRSxPQUFPO3dCQUNkLFVBQVUsRUFBRSx5QkFBeUI7d0JBQ3JDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUU7cUJBQzFCLENBQUMsQ0FBQTtpQkFDSDtxQkFBTTtvQkFDTCxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7d0JBUzdDLElBQUksRUFBRTs0QkFDSixJQUFJLEVBQUMsY0FBYzs0QkFDbkIsVUFBVSxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7NEJBQ3ZELFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFOzRCQUNuRCxlQUFlLEVBQUUsSUFBSSxDQUFDLGFBQWE7NEJBQ25DLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSzs0QkFFdkIsbUJBQW1CLEVBQUUsYUFBYTt5QkFDbkM7d0JBQ0QsS0FBSyxFQUFFLE9BQU87d0JBQ2QsVUFBVSxFQUFFLHlCQUF5Qjt3QkFDckMsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRTtxQkFDMUIsQ0FBQyxDQUFBO2lCQUNIO2dCQUNELE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDMUMsSUFBRyxDQUFDLEdBQUcsRUFBRTt3QkFDUCxPQUFPO3FCQUNSO29CQUVELElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7d0JBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO3FCQUN4QjtvQkFDRixNQUFNLElBQUksR0FBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFBO29CQUU5QyxNQUFNLFlBQVksR0FBRzt3QkFDbkIsR0FBRzt3QkFDSCxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7d0JBQ3BCLElBQUk7d0JBQ0osSUFBSSxFQUFFLGNBQWM7cUJBQ3JCLENBQUE7b0JBQ0QsSUFBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBQzt3QkFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFBO3FCQUNoRTtvQkFHRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFBO29CQUV0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtvQkFDcEYsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUE7b0JBQ2pCLElBQUksWUFBWSxFQUFFO3dCQUNoQixHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTt3QkFDdkUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7cUJBQ25HO29CQUNELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO2dCQUNuSCxDQUFDLENBQUMsQ0FBQTthQUNIO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsTUFBVyxFQUFFLE1BQVcsRUFBRSxZQUFvQjtRQUNuRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2hGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQzdELElBQUksRUFBRTtnQkFDSixRQUFRLEVBQUUsWUFBWTtnQkFDdEIsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtnQkFDckMsSUFBSSxFQUFFLFlBQVk7YUFDbkI7WUFDRCxTQUFTLEVBQUUsSUFBSTtZQUNmLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDeEIsTUFBTSxFQUFFLE9BQU87WUFDZixLQUFLLEVBQUUsS0FBSztZQUNaLFVBQVUsRUFBRSxrQkFBa0I7WUFDOUIsUUFBUSxFQUFFLE9BQU87U0FDbEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBUyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQTthQUMzQztpQkFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDekMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7b0JBQzVCLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ2hGO2dCQUNELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ25ELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQTtpQkFDM0M7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDO3dCQUNwQixFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsSUFBSSxFQUFFO3dCQUN4RCxRQUFRLEVBQUUsRUFBRTtxQkFBQyxDQUFDLENBQUE7aUJBQ2Y7YUFDRjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDeEQsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFXO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLEVBQUMsR0FBRyxhQUFhLEVBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFBO1FBQ3ZELEtBQUksSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsSUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDeEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDdkQsSUFBRyxRQUFRLElBQUksTUFBTSxFQUFFO2dCQUNyQixJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzNDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsU0FBUyxDQUFDLFVBQWtCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVELGFBQWE7UUFDWCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUNsRCxJQUFJLEVBQUUsRUFBRTtZQUNSLEtBQUssRUFBRSxLQUFLO1NBRWIsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQW9CLEVBQUUsRUFBRTtZQUN0RCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLEVBQUU7Z0JBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQTtnQkFDaEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO2FBQ1o7aUJBQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUE7Z0JBQ2hDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTthQUNaO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsc0JBQXNCLENBQUMsS0FBVTtRQUMvQixJQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQy9CO2FBQU07WUFDUCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1NBQ3RGO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLElBQUksQ0FBQSxDQUFDLENBQUEsS0FBSyxDQUFBO0lBQzFELENBQUM7SUFFRCxZQUFZLENBQUMsS0FBUztRQUNwQixJQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLEVBQUUsRUFBRTtZQUN4RCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckYsSUFBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDakM7U0FDRjtRQUNELElBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFZO1FBRW5CLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sb0JBQW9CLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7UUFHL0UsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG9CQUFvQixFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMvQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFHbkYsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNyQixPQUFPLENBQUMsQ0FBQzthQUNWO1NBQ0Y7UUFHRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFHZCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckUsSUFBSSxZQUFZLEVBQUU7WUFDaEIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEYsSUFBSSxnQkFBZ0IsRUFBRTtnQkFFcEIsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3JFLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FDdEQsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUzt3QkFDOUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZOzRCQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ3BFLENBQUMsTUFBTSxDQUFDO29CQUVULE9BQU8sS0FBSyxDQUFDO2lCQUNkO2FBQ0Y7WUFHRCxPQUFPLENBQUMsQ0FBQztTQUNWO1FBR0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsSUFBSSxZQUFZLElBQUksWUFBWSxDQUFDLFFBQVEsRUFBRTtZQUN6QyxLQUFLLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUNsRCxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQy9DLENBQUMsTUFBTSxDQUFDO1NBQ1Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUM7WUFDcEIsSUFBSSxVQUFVLEdBQVEsRUFBRSxDQUFBO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN0QixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQTtnQkFDcEUsSUFBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUM7b0JBQ04sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtpQkFDdEI7WUFDSCxDQUFDLENBQUMsQ0FBQTtZQUNGLE1BQU0sR0FBRyxHQUFHO2dCQUNWLGlCQUFpQixFQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQ3RELENBQUE7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUE7Z0JBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ3hFLENBQUMsQ0FBQyxDQUFBO1NBQ0w7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtTQUMxQztJQUVILENBQUM7SUFFRCxjQUFjLENBQUMsRUFBTTtRQUNuQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUcsSUFBSSxDQUFDLFdBQVcsRUFBQztZQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3REO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUM7SUFLMUMsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFTO1FBQ2xCLElBQUcsSUFBSSxJQUFLLElBQUksQ0FBQyxJQUFJLEVBQUM7WUFDcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDaEUsT0FBTyxPQUFPLENBQUE7U0FDZjtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELG1CQUFtQixDQUFDLE9BQVksRUFBRSxLQUFhO1FBRTdDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO1lBQ2pELE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQztTQUNwQjtRQUdELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzFFLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDcEIsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDO1NBQ3BCO1FBR0QsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssZUFBZSxFQUFFO2dCQUN6QyxZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixNQUFNO2FBQ1A7U0FDRjtRQUdELElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQztTQUNwQjtRQUdELE9BQU8sS0FBSyxLQUFLLFlBQVksSUFBSSxLQUFLLEtBQUssWUFBWSxHQUFHLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsMEJBQTBCLENBQUMsTUFBVyxFQUFFLEtBQWE7UUFDbkQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMvRSxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFnQixFQUFFLE1BQVU7UUFDNUMsTUFBTSxhQUFhLEdBQUc7WUFDcEIsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsdUJBQXVCLElBQUksRUFBRTtZQUN0RCxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFO1NBQzVCLENBQUE7UUFDRCxJQUFJLGFBQWEsR0FBTyxFQUFFLENBQUE7UUFDMUIsSUFBSSxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFO1lBQ3BDLE1BQU0sV0FBVyxHQUFHO2dCQUNsQixPQUFPLEVBQUU7b0JBQ0wsSUFBSSxFQUFFO3dCQUNKLElBQUksRUFBRSxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUU7d0JBQ3ZCLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVyxJQUFJLEVBQUU7d0JBQ2xDLElBQUksRUFBRSxNQUFNLEVBQUU7d0JBQ2Qsb0JBQW9CLEVBQUU7NEJBQ3BCLEtBQUssRUFBRSxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUU7eUJBQzVCO3FCQUNGO2lCQUNGO2FBQ0YsQ0FBQTtZQUNILE1BQU0sY0FBYyxHQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNwSCxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDNUUsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3REO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QyxPQUFPO2FBQ1I7U0FDRjtRQUNELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ2hELElBQUksTUFBTSxDQUFDLEtBQUssR0FBRSxDQUFDLEVBQUU7Z0JBQ25CLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDcEU7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQVcsRUFBRSxhQUFrQixFQUFFLE1BQVc7UUFDbEUsTUFBTSxJQUFJLEdBQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RSxJQUFJLFFBQVEsR0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlFLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDekUsTUFBTSxXQUFXLEdBQU87WUFDdEIsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRTtvQkFDSixZQUFZLEVBQUUsRUFBRTtpQkFDakI7YUFDRjtTQUNGLENBQUE7UUFDRCxJQUFJLElBQUksSUFBSSxRQUFRLEVBQUU7WUFDcEIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2pFLFFBQVEsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDakksSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pFLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBTyxFQUFFLEVBQUU7b0JBQ3RDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7d0JBQzNDLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtxQkFDM0IsQ0FBQyxDQUFBO2dCQUNKLENBQUMsQ0FBQyxDQUFBO2FBQ0g7U0FDRjtRQUNELElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFPLEVBQUUsRUFBRTtnQkFDekIsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDekMsVUFBVSxFQUFFLEdBQUc7aUJBQ2hCLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1NBQ0g7UUFDRCxhQUFhLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2pELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sb0JBQW9CLEdBQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbEosT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksb0JBQW9CLElBQUksb0JBQW9CLENBQUMsTUFBTSxJQUFJLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7U0FFL0Y7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsYUFBa0I7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFO1lBQzNFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7Z0JBQ2pELFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsNkNBQTZDLENBQUMsQ0FBQztvQkFDbkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNkLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNWO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzdDO1FBQ0gsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBUztRQUN4QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUE7UUFDYixJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ2pDLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3JDLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQTtpQkFDMUI7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO1FBQ0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLFVBQVUsRUFBRSxTQUFTO2dCQUNyQixZQUFZLEVBQUU7b0JBQ1o7d0JBQ0UsTUFBTSxFQUFFLEdBQUcsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSwrQ0FBK0M7d0JBQ3hHLFdBQVcsRUFBRSw0Q0FBNEM7d0JBQ3pELFFBQVEsRUFBRTs0QkFDUjtnQ0FDRSxRQUFRLEVBQUUsMkJBQTJCO2dDQUNyQyxHQUFHLEVBQUUseUJBQXlCOzZCQUMvQjt5QkFDRjtxQkFDRjtpQkFDRjtnQkFDRCxXQUFXLEVBQUUsNkJBQTZCO2dCQUMxQyxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsT0FBTyxFQUFFLElBQUk7d0JBQ2IsUUFBUSxFQUFFLDBCQUEwQjt3QkFDcEMsUUFBUSxFQUFFLEtBQUs7cUJBQ2hCO29CQUNEO3dCQUNFLE9BQU8sRUFBRSxLQUFLO3dCQUNkLFFBQVEsRUFBRSx3QkFBd0I7d0JBQ2xDLFFBQVEsRUFBRSxJQUFJO3FCQUNmO2lCQUNGO2FBQ0YsQ0FBQTtZQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO2dCQUM3RCxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLEtBQUssRUFBRSxPQUFPO2dCQUNkLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixTQUFTLEVBQUUsTUFBTTtnQkFDakIsWUFBWSxFQUFFLElBQUk7YUFDbkIsQ0FBQyxDQUFBO1lBQ0YsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLEdBQUcsRUFBRTtvQkFDUCxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUE7aUJBQ3JDO1lBQ0gsQ0FBQyxDQUFDLENBQUE7U0FDSDthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsb0NBQW9DLEVBQUUsUUFBUSxDQUFDLENBQUE7U0FDcEU7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFdBQWdCO1FBQ3ZDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQTtRQUNiLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDMUMsSUFBSSxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFO1lBQ25DLE1BQU0sV0FBVyxHQUFHO2dCQUNsQixPQUFPLEVBQUU7b0JBQ1AsVUFBVSxFQUFFLEdBQUcsQ0FBQyxHQUFHO2lCQUNwQjthQUNGLENBQUE7WUFDRCxNQUFNLFlBQVksR0FBRztnQkFDbkIsRUFBRSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJO2dCQUMvQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFO2FBQzdCLENBQUE7WUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNsSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUMvRCxDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssWUFBWSxFQUFFO2dCQUU1RixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ2pCLE1BQU0sU0FBUyxHQUFHLENBQUMsUUFBZSxFQUFFLFVBQWtCLEVBQWlCLEVBQUU7b0JBQ3ZFLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFO3dCQUM1QixJQUFJLEtBQUssRUFBRSxJQUFJLEtBQUssVUFBVSxFQUFFOzRCQUM5QixPQUFPLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDO3lCQUNuRDt3QkFDRCxJQUFJLEtBQUssRUFBRSxRQUFRLElBQUksS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUNsRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQzs0QkFDckQsSUFBSSxLQUFLO2dDQUFFLE9BQU8sS0FBSyxDQUFDO3lCQUN6QjtxQkFDRjtvQkFDRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDLENBQUM7Z0JBR0YsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDakMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztvQkFDMUUsSUFBSSxZQUFZLElBQUksWUFBWSxFQUFFLFVBQVUsRUFBRTt3QkFDNUMsS0FBSyxNQUFNLFFBQVEsSUFBSSxZQUFZLEVBQUUsVUFBVSxFQUFFOzRCQUMvQyxJQUFJLFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0NBQ25CLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ2hELElBQUksS0FBSztvQ0FBRSxNQUFNOzZCQUNsQjt5QkFDRjtxQkFDRjtpQkFDRjtnQkFHRCxNQUFNLGFBQWEsR0FBRztvQkFDcEIsS0FBSyxFQUFFLEtBQUs7b0JBQ1osWUFBWSxFQUFFLEVBQUU7aUJBQ2pCLENBQUE7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7b0JBQzFGLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQ2xELENBQUMsQ0FBQyxDQUFBO2dCQUNGLEtBQUssSUFBSSxDQUFDLENBQUE7YUFDWDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxRQUFRLENBQUMsQ0FBQTthQUM5RDtTQUNGO1FBQ0QsSUFBSSxLQUFLLEtBQUssV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUNoQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDMUIsRUFBRSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJO2FBQ2hELENBQUMsQ0FBQTtTQUNIO2FBQU07WUFDTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLFFBQVEsQ0FBQyxDQUFBO1NBQzlEO0lBQ0gsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFTO1FBQ3RCLFFBQU8sS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNuQixLQUFLLGFBQWE7Z0JBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsTUFBTTtZQUNSLEtBQUssa0JBQWtCO2dCQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDOUgsTUFBTTtZQUNOLEtBQUssWUFBWTtnQkFDZixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNO1NBQ1g7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBVSxFQUFFLEtBQVM7UUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUU7WUFDM0QsSUFBSSxFQUFFO2dCQUNKLFVBQVUsRUFBRSxNQUFNO2dCQUNsQixXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRTtnQkFDbkQsUUFBUSxFQUFFLEtBQUs7YUFDaEI7WUFDRCxLQUFLLEVBQUUsT0FBTztZQUNkLFVBQVUsRUFBRSx5QkFBeUI7WUFDckMsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRTtTQUMxQixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDMUMsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsTUFBTSxXQUFXLEdBQUc7b0JBQ2xCLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFO29CQUNuRCxZQUFZLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSTtvQkFDeEMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVk7b0JBQzlDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixJQUFJLEVBQUU7aUJBQ25FLENBQUE7Z0JBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELDJCQUEyQixDQUFDLFlBQW9CO1FBQzlDLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUN2QixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pFLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxVQUFVLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pGLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBYSxFQUFFLFFBQWEsRUFBRSxFQUFFO2dCQUMvRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMvQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO3dCQUNuQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFOzRCQUM5QixRQUFRLENBQUMsSUFBSSxDQUFDO2dDQUNaLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQ0FDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0NBQ3ZCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0NBQ2hCLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FDNUQsUUFBUSxFQUFFLEVBQUU7NkJBQ2IsQ0FBQyxDQUFDOzRCQUNILElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0NBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7b0NBQ3ZDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7b0NBQzNGLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO2dDQUNqRCxDQUFDLENBQUMsQ0FBQTs2QkFDSDt5QkFDRjtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ2pFLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7d0JBQ25DLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTs0QkFDN0IsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dDQUM1RSxNQUFNLFFBQVEsR0FBTztvQ0FDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO29DQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQ0FDdkIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztvQ0FDaEIsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO29DQUM1RCxRQUFRLEVBQUUsRUFBRTtpQ0FDYixDQUFBO2dDQUNELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0NBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7d0NBQ3ZDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO29DQUN2QyxDQUFDLENBQUMsQ0FBQTtpQ0FDSDtnQ0FDRCxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzZCQUN6Qjt3QkFDSCxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztpQkFDSjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFVO1FBQzdCLE1BQU0sV0FBVyxHQUFHO1lBQ2xCLE9BQU8sRUFBRTtnQkFDUCxRQUFRLEVBQUU7b0JBQ1IsSUFBSSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRTtvQkFDOUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxFQUFFO2lCQUM3QzthQUNGO1NBQ0YsQ0FBQTtRQUNELE1BQU0sWUFBWSxHQUFHO1lBQ25CLEVBQUUsRUFBRSxLQUFLLENBQUMsV0FBVztZQUNyQixRQUFRLEVBQUUsS0FBSyxDQUFDLFlBQVk7U0FDN0IsQ0FBQTtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUN6SCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO2dCQUN2RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7YUFDbkQ7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssWUFBWSxFQUFFO1lBQ3BHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFBO1NBQzFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxjQUFtQixFQUFFLFdBQWdCO1FBQ2pFLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDekUsTUFBTSxrQkFBa0IsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUcsSUFBSSxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDekYsTUFBTSxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ3BFLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3JELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNoRjtZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxpQkFBaUIsRUFBRTtnQkFDckIsTUFBTSwwQkFBMEIsR0FBTztvQkFDckMsT0FBTyxFQUFFO3dCQUNQLElBQUksRUFBRTs0QkFDSixZQUFZLEVBQUUsRUFBRTt5QkFDakI7cUJBQ0Y7aUJBQ0YsQ0FBQTtnQkFDRCxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7b0JBQ3BELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsSUFBSSxFQUFFO3dCQUNuQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUE7cUJBQzFGO2dCQUNILENBQUMsQ0FBQyxDQUFBO2dCQUNGLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLDBCQUEwQixFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTthQUMvRztZQUNELGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRyxNQUFNLDBCQUEwQixHQUFPO2dCQUNyQyxPQUFPLEVBQUU7b0JBQ1AsSUFBSSxFQUFFO3dCQUNKLFlBQVksRUFBRSxFQUFFO3FCQUNqQjtpQkFDRjthQUNGLENBQUE7WUFDRCxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsWUFBWSxJQUFJLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDM0YsY0FBYyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtvQkFDakQsMEJBQTBCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUMsQ0FBQyxDQUFBO2dCQUMzRixDQUFDLENBQUMsQ0FBQTthQUNIO1lBQ0QsMEJBQTBCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLDBCQUEwQixFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDN0c7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLDJCQUEyQixDQUFDLFdBQWdCLEVBQUUsV0FBZ0IsRUFBRSxRQUFhO1FBQ2pGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNsSyxPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUMzSCxDQUFDOytHQXo2QlUsaUJBQWlCO21HQUFqQixpQkFBaUIsNmJDNUI5Qiw0b05BZ0dNOztTRHBFTyxpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxlQUFlOzBXQUtoQixZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGcmFtZXdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZnJhbWV3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xuaW1wb3J0IHsgQ3JlYXRlVGVybUNvbXBvbmVudCB9IGZyb20gJy4uL2NyZWF0ZS10ZXJtL2NyZWF0ZS10ZXJtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb25uZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9jb25uZWN0b3IvY29ubmVjdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2NhbENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbG9jYWwtY29ubmVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElDb25uZWN0aW9uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9jb25uZWN0aW9uLXR5cGUubW9kZWwnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb25uZWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29ubmVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwcm92YWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwcm92YWwuc2VydmljZSc7XG5pbXBvcnQgeyBNYXRMZWdhY3lTbmFja0JhciBhcyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXInO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZywgaGVhZGVyTGluZUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9hcHAtY29uc3RhbnQnO1xuaW1wb3J0IHsgbGFiZWxzIH0gZnJvbSAnLi4vLi4vbGFiZWxzL3N0cmluZ3MnO1xuaW1wb3J0IHsgQ2FyZCB9IGZyb20gJy4uLy4uL21vZGVscy92YXJpYWJsZS10eXBlLm1vZGVsJztcbmltcG9ydCB7IENyZWF0ZVRlcm1Gcm9tRnJhbWV3b3JrQ29tcG9uZW50IH0gZnJvbSAnLi4vY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsvY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsuY29tcG9uZW50JztcbmltcG9ydCB7IE9yZ0hpZXJhcmNoeUFkZE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vb3JnLWhpZXJhcmNoeS1hZGQtbW9kYWwvb3JnLWhpZXJhcmNoeS1hZGQtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IFRyZWVIaWVyYXJjaHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdHJlZS1oaWVyYXJjaHkuc2VydmljZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJ1xuaW1wb3J0IHsgQ29uZm9yYW10aW9uUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9jb25mb3JhbXRpb24tcG9wdXAvY29uZm9yYW10aW9uLXBvcHVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYXRlZ29yeUVkaXRNb2R1bGVDb21wb25lbnQgfSBmcm9tICcuLi9jYXRlZ29yeS1lZGl0L2NhdGVnb3J5LWVkaXQtbW9kdWxlL2NhdGVnb3J5LWVkaXQtbW9kdWxlLmNvbXBvbmVudCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5kZWNsYXJlIHZhciBMZWFkZXJMaW5lOiBhbnk7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdHJlZS12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RyZWUtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RyZWUtdmlldy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBhcHByb3ZhbExpc3Q6IEFycmF5PENhcmQ+ID0gW107XG4gIEBJbnB1dCgpIGlzQXBwcm92YWxWaWV3OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHdvcmtGbG93U3RhdHVzOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZW52aXJvbm1lbnQ6YW55O1xuICBASW5wdXQoKSB0YXhvbm9teUNvbmZpZzogYW55O1xuICBASW5wdXQoKSBvcmdTZWxlY3RlZERhdGE6IGFueTtcbiAgQElucHV0KCkgY2hpbGRPcmdEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIHVzZXJSb2xlc0RhdGE6IGFueTtcbiAgQE91dHB1dCgpIHNlbnRGb3JBcHByb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KClcbiAgQE91dHB1dCgpIGxvYWRlckVuYWJsZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBPdXRwdXQoKSBtYW5hZ2VPcmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBtYXBwaW5nID0ge307XG4gIGhlaWdodExpZ2h0ZWQgPSBbXVxuICBsb2NhbExpc3QgPSBbXVxuICBzaG93UHVibGlzaDogYm9vbGVhbiA9IGZhbHNlXG4gIG5ld1Rlcm1TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICBsb2FkZWQ6IGFueSA9IHt9XG4gIHNob3dBY3Rpb25CYXI6IGJvb2xlYW4gPSBmYWxzZVxuICBhcHByb3ZhbFJlcXVpcmVkVGVybXMgPSBbXVxuICBkcmFmdFRlcm1zOiBBcnJheTxDYXJkPiA9IFtdO1xuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2F0ZWdvcnlMaXN0OmFueSA9IFtdO1xuICBhcHBfc3RyaW5nczogYW55ID0gbGFiZWxzO1xuICBpc0hpZGVCdG5FbmE6Ym9vbGVhbiA9dHJ1ZTtcbiAgY29sdW1uSWQ6c3RyaW5nID0gJyc7XG4gIGNvbmZpZ0NvZGVCdG46YW55O1xuICBkYXRhQ29uZmlnOmFueVxuICBpc0ZyYXdvcmtMb2FkaW5nID0gdHJ1ZVxuICBsb2FkZXJTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb25cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmcmFtZXdvcmtTZXJ2aWNlOiBGcmFtZXdvcmtTZXJ2aWNlLCBcbiAgICBwcml2YXRlIGxvY2FsU3ZjOiBMb2NhbENvbm5lY3Rpb25TZXJ2aWNlLCBcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csIFxuICAgIHByaXZhdGUgYXBwcm92YWxTZXJ2aWNlOiBBcHByb3ZhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgY29ubmVjdG9yU3ZjOiBDb25uZWN0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRyZWVIaWVyYXJjaHlTdmM6IFRyZWVIaWVyYXJjaHlTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZHJhZnRUZXJtcyA9IHRoaXMuYXBwcm92YWxMaXN0O1xuICAgIHRoaXMuaW5pdCgpXG4gICAgdGhpcy5zaG93QWN0aW9uQmFyID0gdGhpcy5pc0FwcHJvdmFsVmlldz90cnVlOmZhbHNlO1xuICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5hZnRlckFkZE9yRWRpdFN1YmplY3Quc3Vic2NyaWJlKHJlc3BvbnNlRGF0YSA9PiB7XG4gICAgICBpZihyZXNwb25zZURhdGEgJiYgcmVzcG9uc2VEYXRhLnJlcyAmJiByZXNwb25zZURhdGEuZGF0YSkge1xuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKHJlc3BvbnNlRGF0YSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuaXNFbmFibGVkcygpXG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gfSBcblxuICBpbml0KCkge1xuICAgIHRoaXMuaW5pdENvbmZpZygpO1xuICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRGcmFtZXdvcmtJbmZvKCh0aGlzLm9yZ1NlbGVjdGVkRGF0YSkgPyB0aGlzLm9yZ1NlbGVjdGVkRGF0YSA6ICcnLCAodGhpcy5jaGlsZE9yZ0RhdGEpID8gdGhpcy5jaGlsZE9yZ0RhdGEgOiAnJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdG9yU3ZjLnJlbW92ZUFsbExpbmVzKClcbiAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5jYXRlZ29yaWVzSGFzaC52YWx1ZS5mb3JFYWNoKChjYXQ6YW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGVkW2NhdC5jb2RlXSA9IHRydWVcbiAgICAgIH0pXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gIHRoaXMuZHJhd0hlYWRlckxpbmUocmVzLnJlc3VsdC5mcmFtZXdvcmsuY2F0ZWdvcmllcy5sZW5ndGgpOyAgXG4gICAgICAgICAgICAgdGhpcy5tYWtlRmlyc3RUZXJtU2VsZWN0ZWQoKVxuICAgICAgICB9LDUwMClcbiAgICB9LCAoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBpbiBmZXRjaGluZyBmcmFtZXdvcmsnLCBlcnIpXG4gICAgfSlcblxuICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uID0gdGhpcy50cmVlSGllcmFyY2h5U3ZjLmxvYWRlclN0YXRlJC5zdWJzY3JpYmUoXG4gICAgICBkYXRhID0+IHtcbiAgICAgICAgdGhpcy5sb2FkZXJFbmFibGUuZW1pdChkYXRhKVxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKVxuICAgICAgfSxcbiAgICApXG4gIFxuICB9XG4gIHJlZnJlc2hEYXRhKHJlc0RhdGE6IGFueSkge1xuICAgIGNvbnN0IHJlcyA9IHJlc0RhdGEucmVzXG4gICAgaWYgKHJlcyAmJiByZXMuY3JlYXRlZCkge1xuICAgICAgdGhpcy5zaG93UHVibGlzaCA9IHRydWVcbiAgICB9XG4gICAgaWYocmVzLm11bHRpICYmIEFycmF5LmlzQXJyYXkocmVzLnRlcm0pICYmIHJlcy50ZXJtLmxlbmd0aCl7XG4gICAgICByZXMudGVybSA9IHJlcy50ZXJtWzBdXG4gICAgfSBcbiAgICB0aGlzLmxvYWRlZFtyZXMudGVybS5jYXRlZ29yeV0gPSBmYWxzZVxuICAgIC8vIHdhaXRcbiAgICBjb25zdCBwYXJlbnRDb2x1bW4gPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeShyZXMudGVybS5jYXRlZ29yeSlcbiAgICByZXMucGFyZW50ID0gbnVsbFxuICAgIGlmIChwYXJlbnRDb2x1bW4pIHtcbiAgICAgIHJlcy5wYXJlbnQgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uLmNvZGUpXG4gICAgICBpZihyZXNEYXRhLnR5cGUgPT09ICd1cGRhdGUnKXtcbiAgICAgICAgXG4gICAgICAgIHJlcy5wYXJlbnQuY2hpbGRyZW5bcmVzLnBhcmVudC5jaGlsZHJlbi5maW5kSW5kZXgoKGVsOiBhbnkpID0+IGVsLmlkZW50aWZpZXIgPT09IHJlcy50ZXJtLmlkZW50aWZpZXIpXSA9ICByZXMudGVybVxuICAgICAgICAvLyB0aGlzLmZyYW1ld29ya1NlcnZpY2UubGlzdC5nZXQocmVzLnBhcmVudC5jYXRlZ29yeSkuY2hpbGRyZW4gPSBbLi4ucmVzLnBhcmVudC5jaGlsZHJlbl1cbiAgICAgICAgXG4gICAgICAgIFxuXG4gICAgICAgIC8vIHRoaXMuZnJhbWV3b3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLm5leHQoeyB0eXBlOiByZXMudGVybS5jYXRlZ29yeSwgZGF0YTogcmVzLnRlcm0uY2hpbGRyZW4sIGNhcmRSZWY6cmVzRGF0YS5jYXJkUmVmIH0pXG4gICAgICAgIC8vIHRoaXMudXBkYXRlU2VsZWN0aW9uKHJlcy50ZXJtLmNhdGVnb3J5LCByZXMudGVybS5jb2RlKTtcbiAgICAgICAgLy8gdGhpcy51cGRhdGVTZWxlY3Rpb24ocmVzLnBhcmVudC5jYXRlZ29yeSwgcmVzLnBhcmVudC5jb2RlKTtcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmN1cnJlbnRTZWxlY3Rpb24ubmV4dCh7IHR5cGU6IHJlcy50ZXJtLmNhdGVnb3J5LCBkYXRhOiByZXMudGVybS5jaGlsZHJlbiwgY2FyZFJlZjpyZXNEYXRhLmNhcmRSZWYgfSlcbiAgICAgICAgLy8gfSwgMTAwKTtcbiAgICAgICAgLy8gdGhpcy51cGRhdGVGaW5hbExpc3QoeyBzZWxlY3RlZFRlcm06IHJlcy50ZXJtLCBpc1NlbGVjdGVkOiB0cnVlLCBwYXJlbnREYXRhOiByZXMucGFyZW50LCBjb2xJbmRleDpyZXNEYXRhLmluZGV4IH0pXG4gICAgICAgICB0aGlzLmxvYWRlZFtyZXMudGVybS5jYXRlZ29yeV0gPSB0cnVlXG4gICAgICAgIHJlcy50ZXJtLnNlbGVjdGVkID0gZmFsc2VcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZGVsZXRlKHJlcy50ZXJtLmNhdGVnb3J5KVxuICAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmluc2VydFVwZGF0ZURlbGV0ZU5vdGlmaWVyLm5leHQoeyBhY3Rpb246IHJlcy50ZXJtLmNhdGVnb3J5LCB0eXBlOid1cGRhdGUnLCBkYXRhOiByZXMudGVybSB9KVxuICAgICAgICAgdGhpcy51cGRhdGVGaW5hbExpc3QoeyBzZWxlY3RlZFRlcm06IHJlcy50ZXJtLCBpc1NlbGVjdGVkOiB0cnVlLCBwYXJlbnREYXRhOiByZXMucGFyZW50LCBjb2xJbmRleDpyZXNEYXRhLmluZGV4IH0sICd1cGRhdGUnKVxuICAgICAgICAgcmVzLnRlcm0uc2VsZWN0ZWQgPSB0cnVlXG4gICAgICAgIC8vIGNvbnN0IG5leHQgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0TmV4dENhdGVnb3J5KHJlcy50ZXJtLmNhdGVnb3J5KVxuICAgICAgICBcbiAgICAgICAgLy8gICBpZiAobmV4dCAmJiBuZXh0LmNvZGUpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmRlbGV0ZShuZXh0LmNvZGUpXG4gICAgICAgIC8vICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYoIXJlcy5tdWx0aSl7XG4gICAgICAgICAgcmVzLnBhcmVudC5jaGlsZHJlbj8gcmVzLnBhcmVudC5jaGlsZHJlbi5wdXNoKHJlcy50ZXJtKSA6cmVzLnBhcmVudFsnY2hpbGRyZW4nXSA9IFtyZXMudGVybV1cbiAgICAgICAgfSBcbiAgICAgICAgdGhpcy51cGRhdGVGaW5hbExpc3QoeyBzZWxlY3RlZFRlcm06IHJlcy50ZXJtLCBpc1NlbGVjdGVkOiBmYWxzZSwgcGFyZW50RGF0YTogcmVzLnBhcmVudCwgY29sSW5kZXg6cmVzRGF0YS5pbmRleCB9LClcbiAgICAgIH1cbiAgICB9XG4gICBcbiAgfVxuXG4gIG1ha2VGaXJzdFRlcm1TZWxlY3RlZCgpIHtcbiAgICBjb25zdCBmaXJzdExpc3RJdGVtID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZW50cmllcygpLm5leHQoKS52YWx1ZSBhcyBhbnlcbiAgICBpZihmaXJzdExpc3RJdGVtICYmIGZpcnN0TGlzdEl0ZW0ubGVuZ3RoID49IDIpe1xuICAgICAgaWYoZmlyc3RMaXN0SXRlbVsxXSAmJiBmaXJzdExpc3RJdGVtWzFdLmNoaWxkcmVuICYmIGZpcnN0TGlzdEl0ZW1bMV0uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0VGVybSA9IGZpcnN0TGlzdEl0ZW1bMV0uY2hpbGRyZW5bMF0gYXMgYW55XG4gICAgICAgIGNvbnN0IGNhcmRSZWYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaXJzdFRlcm0ubmFtZSlcbiAgICAgICAgLy8gdGhpcy5jYXRlZ29yeUxpc3QgPSBbXVxuICAgICAgICBmaXJzdFRlcm0uc2VsZWN0ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5jYXJkQ2xrRGF0YSA9IGZpcnN0VGVybTtcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLkN1cnJlbnRDYXJkQ2xrLm5leHQoZmlyc3RUZXJtLmNhdGVnb3J5KVxuICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogZmlyc3RUZXJtLmNhdGVnb3J5LCBkYXRhOiBmaXJzdFRlcm0sIGNhcmRSZWYgfSlcbiAgICAgICAgdGhpcy5pc0ZyYXdvcmtMb2FkaW5nID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVUYXhvbm9teVRlcm0oZGF0YTogeyBzZWxlY3RlZFRlcm06IGFueSwgaXNTZWxlY3RlZDogYm9vbGVhbiwgaXNVcGRhdGU/OmFueX0pIHtcbiAgICBpZihkYXRhICYmIGRhdGEuc2VsZWN0ZWRUZXJtICYmIGRhdGEuc2VsZWN0ZWRUZXJtLmNhdGVnb3J5KSB7XG4gICAgICBpZighZGF0YS5pc1VwZGF0ZSl7XG4gICAgICAgIHRoaXMudXBkYXRlRmluYWxMaXN0KGRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbmFsTGlzdChkYXRhLCAndXBkYXRlJylcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKGRhdGEuc2VsZWN0ZWRUZXJtLmNhdGVnb3J5LCBkYXRhLnNlbGVjdGVkVGVybS5jb2RlKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlU2VsZWN0aW9uKGNhdGVnb3J5OiBzdHJpbmcsIHNlbGVjdGVkVGVybUNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IGNhdGVnb3J5RGF0YSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LmdldChjYXRlZ29yeSk7XG4gICAgaWYgKGNhdGVnb3J5RGF0YSAmJiBjYXRlZ29yeURhdGEuY2hpbGRyZW4pIHtcbiAgICAgIGNhdGVnb3J5RGF0YS5jaGlsZHJlbi5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSBzZWxlY3RlZFRlcm1Db2RlID09PSBpdGVtLmNvZGUgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLy9uZWVkIHRvIHJlZmFjdG9yIGF0IGhlaWdoIGxldmVsXG4gIHVwZGF0ZUZpbmFsTGlzdChkYXRhOiB7IHNlbGVjdGVkVGVybTogYW55LCBpc1NlbGVjdGVkOiBib29sZWFuLCBwYXJlbnREYXRhPzogYW55LCBjb2xJbmRleD86IGFueX0sIHR5cGU/OiBhbnkpIHtcbiAgICBcbiAgICBpZiAoZGF0YS5pc1NlbGVjdGVkKSB7XG4gICAgICAvLyBkYXRhLnNlbGVjdGVkVGVybS5zZWxlY3RlZCA9IGRhdGEuaXNTZWxlY3RlZFxuICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Quc2V0KGRhdGEuc2VsZWN0ZWRUZXJtLmNhdGVnb3J5LCBkYXRhLnNlbGVjdGVkVGVybSk7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldE5leHRDYXRlZ29yeShkYXRhLnNlbGVjdGVkVGVybS5jYXRlZ29yeSlcbiAgICAgIGlmIChuZXh0ICYmIG5leHQuY29kZSkge1xuICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5kZWxldGUobmV4dC5jb2RlKVxuICAgICAgfVxuICAgICAgLy8gbm90aWZ5IG5leHRcbiAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5pbnNlcnRVcGRhdGVEZWxldGVOb3RpZmllci5uZXh0KHsgYWN0aW9uOiBkYXRhLnNlbGVjdGVkVGVybS5jYXRlZ29yeSwgdHlwZTogdHlwZSA/IHR5cGUgOiAnc2VsZWN0JywgZGF0YTogZGF0YS5zZWxlY3RlZFRlcm0gfSlcbiAgICB9IFxuICAgIGlmKGRhdGEuY29sSW5kZXggPT09IDAgJiYgIWRhdGEuaXNTZWxlY3RlZCkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKT0+IHtcbiAgICAgICAgdGhpcy5pbml0KClcbiAgICAgIH0sMzAwMClcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRlZFtkYXRhLnNlbGVjdGVkVGVybS5jYXRlZ29yeV0gPSB0cnVlXG4gICAgICAvLyBpZih0eXBlICYmIHR5cGUgPT09ICd1cGRhdGUnKXtcbiAgICAgIC8vICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZGVsZXRlKGRhdGEuc2VsZWN0ZWRUZXJtLmNhdGVnb3J5KTtcbiAgICAgIC8vICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmN1cnJlbnRTZWxlY3Rpb24ubmV4dCh7IHR5cGU6IGRhdGEucGFyZW50RGF0YS5jYXRlZ29yeSwgZGF0YTogZGF0YS5wYXJlbnREYXRhLmNoaWxkcmVuIH0pXG4gICAgICAvLyB9XG4gICAgfSwgMTAwKTtcblxuICB9XG4gIGlzRW5hYmxlZChjb2x1bW5Db2RlOiBzdHJpbmcpOiBib29sZWFuIHsgICAgXG4gICAgcmV0dXJuICEhdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KGNvbHVtbkNvZGUpXG4gIH1cblxuICBpc0VuYWJsZWRzKCkge1xuICAvLyAgcmV0dXJuIHRoaXMuZnJhbWV3b3JrU2VydmljZS5jYXJkQ2xrRGF0YVxuICBpZih0aGlzLmZyYW1ld29ya1NlcnZpY2UuQ3VycmVudENhcmRDbGspe1xuICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5DdXJyZW50Q2FyZENsay5zdWJzY3JpYmUoKGl0ZW0pPT57XG4gICAgIGNvbnN0IGRhdGFDb2RlOiBhbnkgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0TmV4dENhdGVnb3J5KGl0ZW0pXG4gICAgICBpZiAoZGF0YUNvZGUgJiYgZGF0YUNvZGUuY29kZSl7XG4gICAgICAgIHRoaXMuZGF0YUNvbmZpZyA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRDb25maWcoZGF0YUNvZGUuY29kZSlcbiAgICAgIH1cbiAgICAgaWYoZGF0YUNvZGUpe1xuICAgICAgdGhpcy5jb25maWdDb2RlQnRuID0gZGF0YUNvZGUuY29kZVxuICAgICB9XG4gICAgIH0pXG4gIH1cbiAgXG4gIFxuICB9XG5cbiAgLy8gZ2V0YnRuRW5hYmxlRm4oX2l0ZW06IGFueSkge1xuICAvLyAgIGNvbnN0IGFsbFNlbGVjdGVkVGVybTogYW55ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldEFsbFNlbGVjdGVkVGVybXMoKVxuICAvLyAgIGlmIChhbGxTZWxlY3RlZFRlcm0gJiYgYWxsU2VsZWN0ZWRUZXJtLmxlbmd0aCAmJiBhbGxTZWxlY3RlZFRlcm0uZmlsdGVyKCh0OiBhbnkpID0+IHQuY2F0ZWdvcnkgPT09IF9pdGVtLmNvZGUpLmxlbmd0aCA+IDApIHtcbiAgLy8gICAgIHJldHVybiB0cnVlXG4gIC8vICAgfVxuICAvLyAgIHJldHVybiBmYWxzZVxuICAvLyB9XG5cblxuICBvcGVuQ3JlYXRlVGVybURpYWxvZyhjb2x1bW46IGFueSwgY29sSW5kZXg6IGFueSkge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQoY29sdW1uLmNvZGUpKSB7XG4gICAgICBjb25zdCBuZXh0Q2F0ID0gY29sdW1uLmNvZGVcbiAgICAgIGNvbnN0IG5leHROZXh0Q2F0ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldE5leHRDYXRlZ29yeShuZXh0Q2F0KVxuICAgICAgaWYobmV4dENhdCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZFRlcm1zID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldFByZXZpb3VzU2VsZWN0ZWRUZXJtcyhuZXh0Q2F0KVxuICAgICAgICBjb25zdCBjb2xJbmZvID0gQXJyYXkuZnJvbSh0aGlzLmZyYW1ld29ya1NlcnZpY2UubGlzdC52YWx1ZXMoKSkuZmlsdGVyKGwgPT4gbC5jb2RlID09PSBuZXh0Q2F0IClcbiAgICAgICAgbGV0IG5leHRDb2xJbmZvOiBhbnkgPSBbXVxuICAgICAgICBpZihuZXh0TmV4dENhdCAmJiBuZXh0TmV4dENhdC5jb2RlKSB7XG4gICAgICAgICAgbmV4dENvbEluZm8gPSBBcnJheS5mcm9tKHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LnZhbHVlcygpKS5maWx0ZXIobCA9PiBsLmNvZGUgPT09IG5leHROZXh0Q2F0LmNvZGUgKVxuICAgICAgICB9XG4gICAgICAgIGxldCBkaWFsb2c6IGFueVxuICAgICAgICBpZih0aGlzLmVudmlyb25tZW50ICYmIHRoaXMuZW52aXJvbm1lbnQuZnJhbWV3b3JrVHlwZSA9PT0gJ01ET19ERVNJR05BVElPTicpe1xuICAgICAgICAgIGRpYWxvZyA9IHRoaXMuZGlhbG9nLm9wZW4oQ3JlYXRlVGVybUZyb21GcmFtZXdvcmtDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IHsgXG4gICAgICAgICAgICAgIG1vZGU6J211bHRpLWNyZWF0ZScsXG4gICAgICAgICAgICAgIC8vIGNhcmRDb2xJbmZvOiB0aGlzLmRhdGEuY29sdW1uSW5mbyxcbiAgICAgICAgICAgICAgY29sdW1uSW5mbzogY29sSW5mbyAmJiBjb2xJbmZvLmxlbmd0aCA/IGNvbEluZm9bMF0gOiBbXSxcbiAgICAgICAgICAgICAgbmV4dENvbEluZm86IG5leHRDb2xJbmZvICYmIG5leHRDb2xJbmZvLmxlbmd0aCA/IG5leHRDb2xJbmZvWzBdIDogW10sXG4gICAgICAgICAgICAgIGZyYW1ld29ya0lkOiB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0RnJhbWV3b3JrSWQoKSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRwYXJlbnRzOiB0aGlzLmhlaWdodExpZ2h0ZWQsXG4gICAgICAgICAgICAgIGNvbEluZGV4OiBuZXh0Q2F0LmluZGV4LFxuICAgICAgICAgICAgICAvLyBjaGlsZHJlbkRhdGE6IGRhdGEuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHNlbGVjdGVkUGFyZW50VGVybXM6IHNlbGVjdGVkVGVybXNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aWR0aDogJzgwMHB4JyxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6ICdjdXN0b20tZGlhbG9nLWNvbnRhaW5lcicsXG4gICAgICAgICAgICBwb3NpdGlvbjogeyB0b3A6ICc1MHB4JyB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaWFsb2cgPSB0aGlzLmRpYWxvZy5vcGVuKENyZWF0ZVRlcm1Db21wb25lbnQsIHtcbiAgICAgICAgICAgIC8vIGRhdGE6IHtcbiAgICAgICAgICAgIC8vICAgbW9kZTonY3JlYXRlJyxcbiAgICAgICAgICAgIC8vICAgY29sdW1uSW5mbzogY29sdW1uLFxuICAgICAgICAgICAgLy8gICBmcmFtZXdvcmtJZDogdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldEZyYW1ld29ya0lkKCksXG4gICAgICAgICAgICAvLyAgIHNlbGVjdGVkcGFyZW50czogdGhpcy5oZWlnaHRMaWdodGVkLFxuICAgICAgICAgICAgLy8gICBjb2xJbmRleDogY29sSW5kZXgsXG4gICAgICAgICAgICAvLyAgIHNlbGVjdGVkUGFyZW50VGVybXM6IHNlbGVjdGVkVGVybXNcbiAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICBkYXRhOiB7IFxuICAgICAgICAgICAgICBtb2RlOidtdWx0aS1jcmVhdGUnLFxuICAgICAgICAgICAgICBjb2x1bW5JbmZvOiBjb2xJbmZvICYmIGNvbEluZm8ubGVuZ3RoID8gY29sSW5mb1swXSA6IFtdLFxuICAgICAgICAgICAgICBmcmFtZXdvcmtJZDogdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldEZyYW1ld29ya0lkKCksXG4gICAgICAgICAgICAgIHNlbGVjdGVkcGFyZW50czogdGhpcy5oZWlnaHRMaWdodGVkLFxuICAgICAgICAgICAgICBjb2xJbmRleDogbmV4dENhdC5pbmRleCxcbiAgICAgICAgICAgICAgLy8gY2hpbGRyZW5EYXRhOiBkYXRhLmNoaWxkcmVuLFxuICAgICAgICAgICAgICBzZWxlY3RlZFBhcmVudFRlcm1zOiBzZWxlY3RlZFRlcm1zXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2lkdGg6ICc4MDBweCcsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiAnY3VzdG9tLWRpYWxvZy1jb250YWluZXInLFxuICAgICAgICAgICAgcG9zaXRpb246IHsgdG9wOiAnNTBweCcgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgZGlhbG9nLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmKCFyZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jcmVhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQdWJsaXNoID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgIGNvbnN0IGRhdGEgID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmNhcmRDbGtEYXRhXG4gICAgICAgICBcbiAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSB7XG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICBpbmRleDogbmV4dENhdC5pbmRleCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICB0eXBlOiAnbXVsdGktY3JlYXRlJ1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZighKHJlcyAmJiByZXMuc3RvcFVwZGF0ZSkpe1xuICAgICAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnVwZGF0ZUFmdGVyQWRkT3JFZGl0U3ViamVjdChyZXNwb25zZURhdGEpXG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIFxuICAgICAgICAgIHRoaXMubG9hZGVkW3Jlcy50ZXJtLmNhdGVnb3J5XSA9IGZhbHNlXG4gICAgICAgICAgLy8gd2FpdFxuICAgICAgICAgIGNvbnN0IHBhcmVudENvbHVtbiA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KHJlcy50ZXJtWzBdLmNhdGVnb3J5KVxuICAgICAgICAgIHJlcy5wYXJlbnQgPSBudWxsXG4gICAgICAgICAgaWYgKHBhcmVudENvbHVtbikge1xuICAgICAgICAgICAgcmVzLnBhcmVudCA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW4uY29kZSlcbiAgICAgICAgICAgIHJlcy5wYXJlbnQuY2hpbGRyZW4/IHJlcy5wYXJlbnQuY2hpbGRyZW4ucHVzaChyZXMudGVybVswXSkgOnJlcy5wYXJlbnRbJ2NoaWxkcmVuJ10gPSBbcmVzLnRlcm1bMF1dXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlRmluYWxMaXN0KHsgc2VsZWN0ZWRUZXJtOiByZXMudGVybVswXSwgaXNTZWxlY3RlZDogZmFsc2UsIHBhcmVudERhdGE6IHJlcy5wYXJlbnQsIGNvbEluZGV4OmNvbEluZGV4IH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3Blbk9yZ2FuaXphdGlvbkRpYWxvZyhjb2x1bW46IGFueSwgX2luZGV4OiBhbnksIHR5cGVTZWxlY3RlZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdHJlZUxpc3REYXRhID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldFByZXZpb3VzU2VsZWN0ZWRUZXJtcyhjb2x1bW4uY29kZSkgICAgIFxuICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMuZGlhbG9nLm9wZW4oT3JnSGllcmFyY2h5QWRkTW9kYWxDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcHJldmlvdXM6IHRyZWVMaXN0RGF0YSxcbiAgICAgICAgY3VycmVudERhdGE6IGNvbHVtbixcbiAgICAgICAgc2VsZWN0ZWRPcmdEYXRhOiB0aGlzLm9yZ1NlbGVjdGVkRGF0YSxcbiAgICAgICAgdHlwZTogdHlwZVNlbGVjdGVkXG4gICAgICB9LFxuICAgICAgYXV0b0ZvY3VzOiB0cnVlLFxuICAgICAgcmVzdG9yZUZvY3VzOiB0cnVlLFxuICAgICAgcG9zaXRpb246IHsgcmlnaHQ6ICcwJyB9LFxuICAgICAgaGVpZ2h0OiAnMTAwdmgnLFxuICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgcGFuZWxDbGFzczogJ3JpZ2h0LXNpZGUtbW9kYWwnLFxuICAgICAgbWF4V2lkdGg6ICcxMDB2dydcbiAgICB9KTtcbiAgICBcbiAgICBkaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoYXN5bmMgKF9yZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAoX3JlcyAmJiBfcmVzLnR5cGUgPT09ICdhZGQnKSB7XG4gICAgICAgICAgdGhpcy50cmVlSGllcmFyY2h5U3ZjLnNldExvYWRlclN0YXRlKHRydWUpO1xuICAgICAgICAgIHRoaXMuY3JlYXRlVGVybXMoX3Jlcy5zZWxlY3RlZE9yZywgY29sdW1uKVxuICAgICAgICB9IGVsc2UgaWYgKF9yZXMgJiYgX3Jlcy50eXBlID09PSAndXBkYXRlJykge1xuICAgICAgICAgIGlmIChfcmVzLnBhcGFyZW50U2VsZWN0ZWRPcmcpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlUGFyZW50QXNzb2NpYXRpb24oX3Jlcy5wYXBhcmVudFNlbGVjdGVkT3JnLCBfcmVzLmN1cnJlbnRUZXJtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKF9yZXMuc2VsZWN0ZWRPcmcgJiYgX3Jlcy5zZWxlY3RlZE9yZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVRlcm1zKF9yZXMuc2VsZWN0ZWRPcmcsIGNvbHVtbilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wdWJsaXNoRnJhbWV3b3JrKHtcbiAgICAgICAgICAgICAgaWQ6IHRoaXMub3JnU2VsZWN0ZWREYXRhLm9yZ0hpZXJhcmNoeUZyYW1ld29ya0lkIHx8ICcnLFxuICAgICAgICAgICAgY2F0ZWdvcnk6ICcnfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldCBsaXN0KCk6IGFueVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmZyYW1ld29ya1NlcnZpY2UubGlzdC52YWx1ZXMoKSlcbiAgfVxuICBcbiAgZHJhd0hlYWRlckxpbmUobGVuOiBudW1iZXIpe1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7Li4uZGVmYXVsdENvbmZpZywuLi5oZWFkZXJMaW5lQ29uZmlnIH1cbiAgICBmb3IobGV0IGk9MTsgaTw9bGVuOyBpKyspe1xuICAgICAgY29uc3Qgc3RhcnRFbGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjYm94JHtpfWNvdW50YClcbiAgICAgIGNvbnN0IGVuZEVsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNib3gke2l9SGVhZGVyYClcbiAgICAgIGlmKHN0YXJ0RWxlICYmIGVuZEVsZSkge1xuICAgICAgICBuZXcgTGVhZGVyTGluZShzdGFydEVsZSwgZW5kRWxlLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDb2x1bW4oY29sdW1uQ29kZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LmdldChjb2x1bW5Db2RlKVxuICB9XG4gIFxuICBuZXdDb25uZWN0aW9uKCkgeyBcbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLmRpYWxvZy5vcGVuKENvbm5lY3RvckNvbXBvbmVudCwge1xuICAgICAgZGF0YToge30sXG4gICAgICB3aWR0aDogJzkwJScsXG4gICAgICAvLyBwYW5lbENsYXNzOiAnY3VzdG9tLWRpYWxvZy1jb250YWluZXInIFxuICAgIH0pXG4gICAgZGlhbG9nLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXM6IElDb25uZWN0aW9uVHlwZSkgPT4ge1xuICAgICAgaWYgKChyZXMuc291cmNlID09PSAnb25saW5lJyAmJiByZXMuZGF0YS5lbmRwb2ludCkgfHwgKHJlcy5zb3VyY2UgPT09ICdvZmZsaW5lJykpIHtcbiAgICAgICAgdGhpcy5sb2NhbFN2Yy5sb2NhbFN0b3JhZ2UgPSByZXNcbiAgICAgICAgdGhpcy5pbml0KClcbiAgICAgIH0gZWxzZSBpZiAocmVzLnNvdXJjZSA9PT0gJ29ubGluZScgJiYgIXJlcy5kYXRhLmVuZHBvaW50KSB7XG4gICAgICAgIHRoaXMubG9jYWxTdmMubG9jYWxTdG9yYWdlID0gcmVzXG4gICAgICAgIHRoaXMuaW5pdCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZURyYWZ0U3RhdHVzVGVybXMoZXZlbnQ6IGFueSl7XG4gICAgaWYoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5kcmFmdFRlcm1zLnB1c2goZXZlbnQudGVybSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyYWZ0VGVybXMgPSB0aGlzLmRyYWZ0VGVybXMuZmlsdGVyKGQgPT4gZXZlbnQudGVybS5pZGVudGlmaWVyICE9PSBkLmlkZW50aWZpZXIpXG4gICAgfVxuICAgIHRoaXMuc2hvd0FjdGlvbkJhciA9IHRoaXMuZHJhZnRUZXJtcy5sZW5ndGg+MD90cnVlOmZhbHNlXG4gIH1cblxuICBnZXROb09mQ2FyZHMoZXZlbnQ6YW55KSB7XG4gICAgaWYodGhpcy5jYXRlZ29yeUxpc3QubGVuZ3RoID4gMCAmJiBldmVudC5jYXRlZ29yeSAhPT0gJycpIHtcbiAgICAgIGxldCBpbmRleCA9IHRoaXMuY2F0ZWdvcnlMaXN0LmZpbmRJbmRleCgob2JqOmFueSkgPT4gb2JqLmNhdGVnb3J5ID09IGV2ZW50LmNhdGVnb3J5KTtcbiAgICAgIGlmKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5jYXRlZ29yeUxpc3Quc3BsaWNlKGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYoZXZlbnQuY2F0ZWdvcnkgPT0gJycpIHtcbiAgICAgIHRoaXMuY2F0ZWdvcnlMaXN0W3RoaXMuY2F0ZWdvcnlMaXN0Lmxlbmd0aC0xXS5jb3VudCA9IDA7XG4gICAgfVxuICAgIHRoaXMuY2F0ZWdvcnlMaXN0LnB1c2goZXZlbnQpO1xuICB9XG4gIFxuICBnZXRDb3VudChjb2RlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIEdldCBhbGwgcHJldmlvdXMgY2F0ZWdvcmllcyB0byBkZXRlcm1pbmUgaWYgdGhleSBoYXZlIHNlbGVjdGlvbnNcbiAgICBjb25zdCBhbGxDYXRlZ29yaWVzID0gQXJyYXkuZnJvbSh0aGlzLmZyYW1ld29ya1NlcnZpY2UubGlzdC52YWx1ZXMoKSk7XG4gICAgY29uc3QgY3VycmVudENhdGVnb3J5SW5kZXggPSBhbGxDYXRlZ29yaWVzLmZpbmRJbmRleChjYXQgPT4gY2F0LmNvZGUgPT09IGNvZGUpO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIGFsbCBwcmV2aW91cyBjYXRlZ29yaWVzIGhhdmUgc2VsZWN0ZWQgdGVybXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnRDYXRlZ29yeUluZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IHByZXZDYXRlZ29yeUNvZGUgPSBhbGxDYXRlZ29yaWVzW2ldLmNvZGU7XG4gICAgICBjb25zdCBoYXNQcmV2U2VsZWN0aW9uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuaGFzKHByZXZDYXRlZ29yeUNvZGUpO1xuICAgICAgXG4gICAgICAvLyBJZiBhbnkgcHJldmlvdXMgY2F0ZWdvcnkgZG9lc24ndCBoYXZlIGEgc2VsZWN0aW9uLCByZXR1cm4gMFxuICAgICAgaWYgKCFoYXNQcmV2U2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBOb3cgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGNvdW50IHNpbmNlIGFsbCBwcmV2aW91cyBsZXZlbHMgYXJlIHNlbGVjdGVkXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBcbiAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgc2VsZWN0ZWQgdGVybSBmb3IgcGFyZW50IGNhdGVnb3J5IHRoYXQgaGFzIGNoaWxkcmVuIGZvciB0aGlzIGNhdGVnb3J5XG4gICAgY29uc3QgcHJldkNhdGVnb3J5ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkoY29kZSk7XG4gICAgaWYgKHByZXZDYXRlZ29yeSkge1xuICAgICAgY29uc3QgcHJldlNlbGVjdGVkVGVybSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwcmV2Q2F0ZWdvcnkuY29kZSk7XG4gICAgICBpZiAocHJldlNlbGVjdGVkVGVybSkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgc2VsZWN0ZWQgcGFyZW50IHRlcm0sIGNvdW50IGl0cyBjaGlsZHJlbiBmb3IgdGhpcyBjYXRlZ29yeVxuICAgICAgICBpZiAocHJldlNlbGVjdGVkVGVybS5jaGlsZHJlbiAmJiBwcmV2U2VsZWN0ZWRUZXJtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb3VudCA9IHByZXZTZWxlY3RlZFRlcm0uY2hpbGRyZW4uZmlsdGVyKChjaGlsZDogYW55KSA9PiBcbiAgICAgICAgICAgICFjaGlsZC5pc0RlbGV0ZWQgJiYgY2hpbGQuc3RhdHVzICE9PSAnUmV0aXJlZCcgJiYgXG4gICAgICAgICAgICAoY2hpbGQuY2F0ZWdvcnkgPT09IGNvZGUgfHwgKGNoaWxkLmFzc29jaWF0aW9ucyAmJiBcbiAgICAgICAgICAgICBjaGlsZC5hc3NvY2lhdGlvbnMuc29tZSgoYXNzb2M6IGFueSkgPT4gYXNzb2MuY2F0ZWdvcnkgPT09IGNvZGUpKSlcbiAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgbm8gc2VsZWN0aW9uIGV4aXN0cyBmb3IgdGhlIHBhcmVudCwgZG9uJ3Qgc2hvdyBjb3VudHNcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBsZXZlbCwgd2UgY2FuIHNob3cgYWxsIHRlcm1zXG4gICAgY29uc3QgY2F0ZWdvcnlEYXRhID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZ2V0KGNvZGUpO1xuICAgIGlmIChjYXRlZ29yeURhdGEgJiYgY2F0ZWdvcnlEYXRhLmNoaWxkcmVuKSB7XG4gICAgICBjb3VudCA9IGNhdGVnb3J5RGF0YS5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOiBhbnkpID0+IFxuICAgICAgICAhY2hpbGQuaXNEZWxldGVkICYmIGNoaWxkLnN0YXR1cyAhPT0gJ1JldGlyZWQnXG4gICAgICApLmxlbmd0aDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgc2VuZEZvckFwcHJvdmFsKCl7XG4gICAgaWYoIXRoaXMuaXNBcHByb3ZhbFZpZXcpe1xuICAgICAgICBsZXQgcGFyZW50TGlzdDogYW55ID0gW11cbiAgICAgICAgdGhpcy5saXN0LmZvckVhY2goZWxlID0+IHtcbiAgICAgICAgICBjb25zdCB0ID0gZWxlLmNoaWxkcmVuLmZpbHRlcigodGVybTogYW55KSA9PiB0ZXJtLnNlbGVjdGVkID09PSB0cnVlKVxuICAgICAgICAgIGlmKHRbMF0pe1xuICAgICAgICAgICAgcGFyZW50TGlzdC5wdXNoKHRbMF0pXG4gICAgICAgICAgfSBcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgIHVwZGF0ZUZpZWxkVmFsdWVzOlsuLi5wYXJlbnRMaXN0LCAuLi50aGlzLmRyYWZ0VGVybXNdXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHByb3ZhbFNlcnZpY2UuY3JlYXRlQXBwcm92YWwocmVxKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5yZW1vdmVPbGRMaW5lKClcbiAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKCdUZXJtcyBzdWNjZXNzZnVsbHkgc2VudCBmb3IgQXBwcm92YWwuJywgJ2NhbmNlbCcpXG4gICAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VudEZvckFwcHJvdmUuZW1pdCh0aGlzLmRyYWZ0VGVybXMpXG4gICAgfVxuICAgXG4gIH1cblxuICBjbG9zZUFjdGlvbkJhcihfZTphbnkpeyBcbiAgICB0aGlzLnNob3dBY3Rpb25CYXIgPSBmYWxzZTtcbiAgfVxuXG4gIGluaXRDb25maWcoKSB7XG4gICAgaWYodGhpcy5lbnZpcm9ubWVudCl7XG4gICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UudXBkYXRlRW52aXJvbm1lbnQodGhpcy5lbnZpcm9ubWVudCk7XG4gICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2V0Q29uZmlnKHRoaXMudGF4b25vbXlDb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCl7XG4gICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UucmVtb3ZlT2xkTGluZSgpO1xuICAgICAgLy8gdGhpcy5lbnZpcm9ubWVudCA9IG51bGxcbiAgICAgIC8vIHRoaXMuZnJhbWV3b3JrU2VydmljZS5yZXNldEFuZEZyZXNoKClcbiAgICAgIC8vIHRoaXMuY29ubmVjdG9yU3ZjLnJlbW92ZUFsbExpbmVzKClcbiAgICAgIC8vIHRoaXMuY29ubmVjdG9yU3ZjLnVwZGF0ZUNvbm5lY3RvcnNNYXAoe30pXG4gIH1cblxuICBnZXROZXh0Q2F0KGRhdGE6IGFueSkge1xuICAgIGlmKGRhdGEgICYmIGRhdGEuY29kZSl7XG4gICAgICBjb25zdCBuZXh0Q2F0ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldE5leHRDYXRlZ29yeShkYXRhLmNvZGUpXG4gICAgICByZXR1cm4gbmV4dENhdFxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaXNDdXJyZW50T3JOZXh0VGVybShfY29sdW1uOiBhbnksIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIGN1cnJlbnQgc2VsZWN0aW9uLCBvbmx5IGVuYWJsZSB0aGUgZmlyc3QgY29sdW1uXG4gICAgaWYgKCF0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi52YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4ID09PSAwO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgY2F0ZWdvcnkgZnJvbSB0aGUgY3VycmVudFNlbGVjdGlvblxuICAgIGNvbnN0IGN1cnJlbnRDYXRlZ29yeSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLnZhbHVlLnR5cGU7XG4gICAgaWYgKCFjdXJyZW50Q2F0ZWdvcnkpIHtcbiAgICAgIHJldHVybiBpbmRleCA9PT0gMDtcbiAgICB9XG4gICAgXG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgYWN0aXZlIGNvbHVtblxuICAgIGxldCBjdXJyZW50SW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMubGlzdFtpXS5jb2RlID09PSBjdXJyZW50Q2F0ZWdvcnkpIHtcbiAgICAgICAgY3VycmVudEluZGV4ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgdGhlIGN1cnJlbnQgaW5kZXgsIG9ubHkgZW5hYmxlIHRoZSBmaXJzdCBjb2x1bW5cbiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGluZGV4ID09PSAwO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbmFibGUgdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGUgbmV4dCBvbmVcbiAgICByZXR1cm4gaW5kZXggPT09IGN1cnJlbnRJbmRleCB8fCBpbmRleCA9PT0gY3VycmVudEluZGV4ICsgMTtcbiAgfVxuXG4gIHNob3VsZFNob3dTdmdCb3JkZXJXcmFwcGVyKGNvbHVtbjogYW55LCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNDdXJyZW50T3JOZXh0VGVybShjb2x1bW4sIGluZGV4KSAmJiB0aGlzLmdldENvdW50KGNvbHVtbi5jb2RlKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVRlcm1zKHNlbGVjdGVkTGlzdDphbnksIGNvbHVtbjphbnkpIHtcbiAgICBjb25zdCBmcmFtZXdvcmtEYXRhID0ge1xuICAgICAgaWQ6IHRoaXMub3JnU2VsZWN0ZWREYXRhLm9yZ0hpZXJhcmNoeUZyYW1ld29ya0lkIHx8ICcnLFxuICAgICAgY2F0ZWdvcnk6IGNvbHVtbi5jb2RlIHx8ICcnLFxuICAgIH1cbiAgICBsZXQgY3JlYXRlZE5vZGVJZDphbnkgPSBbXVxuICAgIGZvciBhd2FpdCAoY29uc3QgZWxlIG9mIHNlbGVjdGVkTGlzdCkgeyBcbiAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICB0ZXJtOiB7XG4gICAgICAgICAgICAgIG5hbWU6IGVsZS5vcmdOYW1lIHx8ICcnLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZWxlLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICAgICAgICBjb2RlOiB1dWlkdjQoKSxcbiAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICBvcmdJZDogZWxlLmlkZW50aWZpZXIgfHwgJydcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgY29uc3QgY3JlYXRlVHJlbXNSZXM6YW55ID0gYXdhaXQgdGhpcy50cmVlSGllcmFyY2h5U3ZjLmNyZWF0ZVRlcm0ocmVxdWVzdEJvZHksIGZyYW1ld29ya0RhdGEpLnRvUHJvbWlzZSgpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGNyZWF0aW5nIHRlcm0nLCBlcnIpO1xuICAgICAgfSlcbiAgICAgIGlmIChjcmVhdGVUcmVtc1JlcyAmJiBjcmVhdGVUcmVtc1Jlcy5yZXN1bHQgJiYgY3JlYXRlVHJlbXNSZXMucmVzdWx0Lm5vZGVfaWQpIHtcbiAgICAgICAgY3JlYXRlZE5vZGVJZC5wdXNoKGNyZWF0ZVRyZW1zUmVzLnJlc3VsdC5ub2RlX2lkWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oJ0Vycm9yIGluIGNyZWF0aW5nIHRlcm0nLCAnY2FuY2VsJyk7XG4gICAgICAgIHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5zZXRMb2FkZXJTdGF0ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNyZWF0ZWROb2RlSWQubGVuZ3RoID09PSBzZWxlY3RlZExpc3QubGVuZ3RoKSB7XG4gICAgICBpZiAoY29sdW1uLmluZGV4ID4xKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQXNzb2NpYXRpb24oY3JlYXRlZE5vZGVJZCwgZnJhbWV3b3JrRGF0YSwgY29sdW1uKTtcbiAgICAgIH0gXG4gICAgICB0aGlzLnB1Ymxpc2hGcmFtZXdvcmsoZnJhbWV3b3JrRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlQXNzb2NpYXRpb24obm9kZUlkOiBhbnksIGZyYW1ld29ya0RhdGE6IGFueSwgY29sdW1uOiBhbnkpIHtcbiAgICBjb25zdCBwcmV2OmFueSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KGNvbHVtbi5jb2RlKTtcbiAgICBsZXQgcHJldlRyZW06YW55ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldFByZXZpb3VzU2VsZWN0ZWRUZXJtcyhjb2x1bW4uY29kZSlcbiAgICBjb25zdCB0ZW1wRnJhbWVEYXRhID0gXy5jbG9uZURlZXAodGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmNvbXBsZXRlUmVzcG9uc2UpXG4gICAgY29uc3QgcmVxdWVzdEJvZHk6YW55ID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICB0ZXJtOiB7XG4gICAgICAgICAgYXNzb2NpYXRpb25zOiBbXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBcbiAgICBpZiAocHJldiAmJiBwcmV2VHJlbSkge1xuICAgICAgcHJldlRyZW0gPSBwcmV2VHJlbS5maW5kKChlbGU6YW55KSA9PiBlbGUuY2F0ZWdvcnkgPT09IHByZXYuY29kZSlcbiAgICAgIHByZXZUcmVtID0gdGVtcEZyYW1lRGF0YS5jYXRlZ29yaWVzLmZpbmQoKGVsZTphbnkpID0+IGVsZS5jb2RlID09PSBwcmV2LmNvZGUpLnRlcm1zLmZpbmQoKGVsZTphbnkpID0+IGVsZS5jb2RlID09PSBwcmV2VHJlbS5jb2RlKVxuICAgICAgaWYgKHByZXZUcmVtICYmIHByZXZUcmVtLmFzc29jaWF0aW9ucyAmJiBwcmV2VHJlbS5hc3NvY2lhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcmV2VHJlbS5hc3NvY2lhdGlvbnMuZm9yRWFjaCgoZWxlOmFueSkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtLmFzc29jaWF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IGVsZS5pZGVudGlmaWVyXG4gICAgICAgICAgfSlcbiAgICAgICAgfSkgXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlSWQgJiYgbm9kZUlkLmxlbmd0aCA+IDApIHtcbiAgICAgIG5vZGVJZC5mb3JFYWNoKChlbGU6YW55KSA9PiB7XG4gICAgICAgIHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybS5hc3NvY2lhdGlvbnMucHVzaCh7XG4gICAgICAgICAgaWRlbnRpZmllcjogZWxlXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBmcmFtZXdvcmtEYXRhLmNhdGVnb3J5ID0gcHJldlRyZW0uY2F0ZWdvcnkgfHwgJyc7XG4gICAgY29uc3Qgbm9kZUlkUGFydHMgPSBwcmV2VHJlbS5pZGVudGlmaWVyLnNwbGl0KCdfJyk7XG4gICAgY29uc3QgY29kZUlkID0gbm9kZUlkUGFydHNbbm9kZUlkUGFydHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdXBkYXRlQXNzb2NpYXRpb25SZXM6YW55ID0gYXdhaXQgdGhpcy50cmVlSGllcmFyY2h5U3ZjLnVwZGF0ZUZyYW1ld29ya0Fzc29jaWF0aW9uKHJlcXVlc3RCb2R5LCBmcmFtZXdvcmtEYXRhLCBjb2RlSWQpLnRvUHJvbWlzZSgpLmNhdGNoKGVyciA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiB1cGRhdGluZyBhc3NvY2lhdGlvbicsIGVycik7XG4gICAgfSlcbiAgICBpZiAodXBkYXRlQXNzb2NpYXRpb25SZXMgJiYgdXBkYXRlQXNzb2NpYXRpb25SZXMucmVzdWx0ICYmIHVwZGF0ZUFzc29jaWF0aW9uUmVzLnJlc3VsdC5ub2RlX2lkKSB7XG4gICAgICAvLyB0aGlzLnB1Ymxpc2hGcmFtZXdvcmsoZnJhbWV3b3JrRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGlzaEZyYW1ld29yayhmcmFtZXdvcmtEYXRhOiBhbnkpIHtcbiAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMucHVibGlzaEZyZWFtZXdvcmsoZnJhbWV3b3JrRGF0YSkuc3Vic2NyaWJlKChyZXM6YW55KSA9PiB7XG4gICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5wdWJsaXNoU3RhdHVzKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYE9yZ2FuaXphdGlvbiBoaWVyYXJjaHkgdXBkYXRlZCBzdWNjZXNzZnVsbHlgKTtcbiAgICAgICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICB9LCA1MDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oJ0Vycm9yIGluIHB1Ymxpc2hpbmcgZnJhbWV3b3JrJywgJ2NhbmNlbCcpO1xuICAgICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIChlcnIpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIHB1Ymxpc2hpbmcgZnJhbWV3b3JrJywgZXJyKTtcbiAgICAgIHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5zZXRMb2FkZXJTdGF0ZShmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVDb25uZWN0aW9uKGRhdGE6IGFueSkge1xuICAgIGNvbnN0IGFzc29jaWF0aW9uID0gdGhpcy5nZXRTZWxlY3RlZFRlcm1zQXNzb2NpYXRpb24oZGF0YS5jaGlsZHJlbi5jb2RlKTtcbiAgICBsZXQgY291bnQgPSAwXG4gICAgaWYgKGFzc29jaWF0aW9uICYmIGFzc29jaWF0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIGFzc29jaWF0aW9uLmZvckVhY2goKGFzc29jOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGFzc29jLmlkcyAmJiBhc3NvYy5pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvdW50ICs9IGFzc29jLmlkcy5sZW5ndGhcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgY29uc3QgZGlhbG9nRGF0YSA9IHtcbiAgICAgICAgZGlhbG9nVHlwZTogJ3dhcm5pbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoZWFkZXI6IGAke2NvdW50IHx8IDB9IE9yZ2FuaXNhdGlvbiR7Y291bnQgPiAxID8gJ3MnIDogJyd9IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIG9yZ2FuaXNhdGlvbiBoaWVyYXJjaHkuYCxcbiAgICAgICAgICAgIGhlYWRlckNsYXNzOiAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1ibHVlJyxcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtc2dDbGFzczogJ3RleHQtYmx1ZSBtYXJnaW4tYm90dG9tLXMnLFxuICAgICAgICAgICAgICAgIG1zZzogYERvIHlvdSB3YW50IHRvIHByb2NlZWQ/YCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZm9vdGVyQ2xhc3M6ICdpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXInLFxuICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnRuVGV4dDogJ05vJyxcbiAgICAgICAgICAgIGJ0bkNsYXNzOiAnYnRuLWNvbW1vbiBidG4tc2Vjb25kYXJ5JyxcbiAgICAgICAgICAgIHJlc3BvbnNlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ0blRleHQ6ICdZZXMnLFxuICAgICAgICAgICAgYnRuQ2xhc3M6ICdidG4tY29tbW9uIGJ0bi1wcmltYXJ5JyxcbiAgICAgICAgICAgIHJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZvcmFtdGlvblBvcHVwQ29tcG9uZW50LCB7XG4gICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgICBtYXhXaWR0aDogJzgwdncnLFxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJyxcbiAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIHRoaXMucmV0aXJlVGVybUZ1bmN0aW9uKGFzc29jaWF0aW9uKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBFcnJvciBpbiByZW1vdmluZyB0aGUgb3JnYW5pc2F0aW9uYCwgJ2NhbmNlbCcpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0aXJlVGVybUZ1bmN0aW9uKGFzc29jaWF0aW9uOiBhbnkpIHsgIFxuICAgIGxldCBjb3VudCA9IDAgIFxuICAgIHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5zZXRMb2FkZXJTdGF0ZSh0cnVlKVxuICAgIGZvciBhd2FpdCAoY29uc3QgZWxlIG9mIGFzc29jaWF0aW9uKSB7XG4gICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIGNvbnRlbnRJZHM6IGVsZS5pZHNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZnJhbWV3b3JrT2JqID0ge1xuICAgICAgICBpZDogdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmNvbXBsZXRlUmVzcG9uc2UuY29kZSxcbiAgICAgICAgY2F0ZWdvcnk6IGVsZS5jYXRlZ29yeSB8fCAnJyxcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJldGlyZVJlcyA9IGF3YWl0IHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5yZXRpcmVUZXJtKHJlcXVlc3RCb2R5LCBmcmFtZXdvcmtPYmopLnRvUHJvbWlzZSgpLmNhdGNoKChfZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50cmVlSGllcmFyY2h5U3ZjLnNldExvYWRlclN0YXRlKGZhbHNlKVxuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBGYWlsZWQgdG8gcmVtb3ZlIGNvbm5lY3Rpb24uYCwgJ2NhbmNlbCcpXG4gICAgICB9KVxuICAgICAgaWYgKHJldGlyZVJlcyAmJiByZXRpcmVSZXMucGFyYW1zICYmIHJldGlyZVJlcy5wYXJhbXMuc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAnc3VjY2Vzc2Z1bCcpIHtcbiAgICAgICAgLy8gRmluZCBvcmdJZCBmcm9tIGRhdGEgc3RydWN0dXJlIGJ5IG1hdGNoaW5nIGNvZGUgd2l0aCBlbGUuaWRzXG4gICAgICAgIGxldCBvcmdJZCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGZpbmRPcmdJZCA9IChjaGlsZHJlbjogYW55W10sIHRhcmdldENvZGU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZD8uY29kZSA9PT0gdGFyZ2V0Q29kZSkge1xuICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ/LmFkZGl0aW9uYWxQcm9wZXJ0aWVzPy5vcmdJZCB8fCBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoaWxkPy5jaGlsZHJlbiAmJiBjaGlsZD8uY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSBmaW5kT3JnSWQoY2hpbGQ/LmNoaWxkcmVuLCB0YXJnZXRDb2RlKTtcbiAgICAgICAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gU2VhcmNoIGZvciBvcmdJZCB1c2luZyB0aGUgZmlyc3QgaWQgZnJvbSBlbGUuaWRzXG4gICAgICAgIGlmIChlbGUuaWRzICYmIGVsZS5pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlRGF0YSA9IF8uY2xvbmVEZWVwKHRoaXMuZnJhbWV3b3JrU2VydmljZT8uY29tcGxldGVSZXNwb25zZSk7XG4gICAgICAgICAgaWYgKGNvbXBsZXRlRGF0YSAmJiBjb21wbGV0ZURhdGE/LmNhdGVnb3JpZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgY29tcGxldGVEYXRhPy5jYXRlZ29yaWVzKSB7XG4gICAgICAgICAgICAgIGlmIChjYXRlZ29yeT8udGVybXMpIHtcbiAgICAgICAgICAgICAgICBvcmdJZCA9IGZpbmRPcmdJZChjYXRlZ29yeT8udGVybXMsIGVsZT8uaWRzWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAob3JnSWQpIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDYWxsIG9yZ0NvbnRlbnRVcGRhdGUgQVBJIGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCByZXRpcmVcbiAgICAgICAgY29uc3Qgb3JnVXBkYXRlQm9keSA9IHtcbiAgICAgICAgICBvcmdJZDogb3JnSWQsXG4gICAgICAgICAgcGFyZW50UGF0aElkOiBcIlwiXG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy50cmVlSGllcmFyY2h5U3ZjLm9yZ0NvbnRlbnRVcGRhdGUob3JnVXBkYXRlQm9keSkudG9Qcm9taXNlKCkuY2F0Y2goKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiBvcmcgY29udGVudCB1cGRhdGUnLCBfZXJyKVxuICAgICAgICB9KVxuICAgICAgICBjb3VudCArPSAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUoZmFsc2UpXG4gICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYEZhaWxlZCB0byByZW1vdmUgY29ubmVjdGlvbi5gLCAnY2FuY2VsJylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSBhc3NvY2lhdGlvbi5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucHVibGlzaEZyYW1ld29yayh7XG4gICAgICAgIGlkOiB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY29tcGxldGVSZXNwb25zZS5jb2RlLFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmVlSGllcmFyY2h5U3ZjLnNldExvYWRlclN0YXRlKGZhbHNlKVxuICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgRmFpbGVkIHRvIHJlbW92ZSBjb25uZWN0aW9uLmAsICdjYW5jZWwnKVxuICAgIH1cbiAgfVxuXG4gIGNhcmRBY3Rpb25FbWl0KGV2ZW50OmFueSkge1xuICAgIHN3aXRjaChldmVudC5hY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3JlbW92ZS10ZXJtJzpcbiAgICAgICAgICB0aGlzLnJlbW92ZUNvbm5lY3Rpb24oZXZlbnQuZGF0YSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3VwZGF0ZS1oaWVyYXJjaHknOlxuICAgICAgICAgIHRoaXMub3Blbk9yZ2FuaXphdGlvbkRpYWxvZyh0aGlzLmxpc3RbdGhpcy5saXN0LmZpbmRJbmRleCgoaXRlbTphbnkpID0+IGl0ZW0uY29kZSA9PT0gZXZlbnQuZGF0YS5jYXRlZ29yeSkgKzFdLCAnJywgJ3VwZGF0ZScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ21hbmFnZS1vcmcnOlxuICAgICAgICAgICAgdGhpcy5tYW5hZ2VPcmcuZW1pdChldmVudC5kYXRhLmNoaWxkcmVuKTtcbiAgICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBlZGl0Q2F0ZWdvcnlOYW1lKGNvbHVtbjphbnksIGluZGV4OmFueSkge1xuICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0ZWdvcnlFZGl0TW9kdWxlQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGNvbHVtbkluZm86IGNvbHVtbixcbiAgICAgICAgZnJhbWV3b3JrSWQ6IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRGcmFtZXdvcmtJZCgpLFxuICAgICAgICBjb2xJbmRleDogaW5kZXhcbiAgICAgIH0sXG4gICAgICB3aWR0aDogJzgwMHB4JyxcbiAgICAgIHBhbmVsQ2xhc3M6ICdjYXRlZ29yeS1lZGl0LWNvbnRhaW5lcicsXG4gICAgICBwb3NpdGlvbjogeyB0b3A6ICc1MHB4JyB9XG4gICAgfSlcbiAgICBkaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIGZyYW1ld29ya0lkOiB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0RnJhbWV3b3JrSWQoKSxcbiAgICAgICAgICBjYXRlZ29yeUNvZGU6IHJlcy5jb2x1bW4uY29sdW1uRGF0YS5jb2RlLFxuICAgICAgICAgIGNhdGVnb3J5TmFtZTogcmVzLmNvbHVtbi5mb3JtRGF0YS5jYXRlZ29yeU5hbWUsXG4gICAgICAgICAgY2F0ZWdvcnlEZXNjcmlwdGlvbjogcmVzLmNvbHVtbi5mb3JtRGF0YS5jYXRlZ290eURlc2NyaXB0aW9uIHx8ICcnXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVDYXRlZ29yeShyZXF1ZXN0Qm9keSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGdldFNlbGVjdGVkVGVybXNBc3NvY2lhdGlvbihjYXRlZ29yeUNvZGU6IHN0cmluZykge1xuICAgIGxldCB0ZW1wRGF0YTogYW55ID0gW107XG4gICAgY29uc3QgY29tcGxldGVEYXRhID0gXy5jbG9uZURlZXAodGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmNvbXBsZXRlUmVzcG9uc2UpO1xuICAgIGlmIChjb21wbGV0ZURhdGEgJiYgY29tcGxldGVEYXRhLmNhdGVnb3JpZXMgJiYgY29tcGxldGVEYXRhLmNhdGVnb3JpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29tcGxldGVEYXRhLmNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnk6IGFueSwgY2F0SW5kZXg6IGFueSkgPT4ge1xuICAgICAgICBpZiAoY2F0ZWdvcnkudGVybXMgJiYgY2F0ZWdvcnkudGVybXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNhdGVnb3J5LnRlcm1zLmZvckVhY2goKHRlcm06IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRlcm0uY29kZSA9PT0gY2F0ZWdvcnlDb2RlKSB7XG4gICAgICAgICAgICAgIHRlbXBEYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IHRlcm0ubmFtZSxcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogdGVybS5jYXRlZ29yeSxcbiAgICAgICAgICAgICAgICBpZHM6IFt0ZXJtLmNvZGVdLFxuICAgICAgICAgICAgICAgIG5leHRDYXRlZ29yeTogdGVybS5jaGlsZHJlbiA/IHRlcm0uY2hpbGRyZW5bMF0uY2F0ZWdvcnkgOiAnJyxcbiAgICAgICAgICAgICAgICBhc3NvY0lkczogW11cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmICh0ZXJtLmFzc29jaWF0aW9ucyAmJiB0ZXJtLmFzc29jaWF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGVybS5hc3NvY2lhdGlvbnMuZm9yRWFjaCgoYXNzb2M6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0SW5kZXggPSB0ZW1wRGF0YS5maW5kSW5kZXgoKGl0ZW06YW55KSA9PiBpdGVtLmlkcyAmJiBpdGVtLmlkcy5pbmNsdWRlcyh0ZXJtLmNvZGUpKVxuICAgICAgICAgICAgICAgICAgdGVtcERhdGFbZ2V0SW5kZXhdWydhc3NvY0lkcyddLnB1c2goYXNzb2MuY29kZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gaWYgKGNhdEluZGV4ID4gMCAmJiBjYXRlZ29yeS50ZXJtcyAmJiBjYXRlZ29yeS50ZXJtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY2F0ZWdvcnkudGVybXMuZm9yRWFjaCgodGVybTogYW55KSA9PiB7XG4gICAgICAgICAgICB0ZW1wRGF0YS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGl0ZW0ubmV4dENhdGVnb3J5ID09PSB0ZXJtLmNhdGVnb3J5ICYmIGl0ZW0uYXNzb2NJZHMuaW5jbHVkZXModGVybS5jb2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHB1c2hEYXRhOmFueSA9IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHRlcm0ubmFtZSxcbiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiB0ZXJtLmNhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgaWRzOiBbdGVybS5jb2RlXSxcbiAgICAgICAgICAgICAgICAgIG5leHRDYXRlZ29yeTogdGVybS5jaGlsZHJlbiA/IHRlcm0uY2hpbGRyZW5bMF0uY2F0ZWdvcnkgOiAnJyxcbiAgICAgICAgICAgICAgICAgIGFzc29jSWRzOiBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGVybS5hc3NvY2lhdGlvbnMgJiYgdGVybS5hc3NvY2lhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdGVybS5hc3NvY2lhdGlvbnMuZm9yRWFjaCgoYXNzb2M6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwdXNoRGF0YVsnYXNzb2NJZHMnXS5wdXNoKGFzc29jLmNvZGUpXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0ZW1wRGF0YS5wdXNoKHB1c2hEYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcERhdGE7XG4gIH1cblxuICBhc3luYyB1cGRhdGVDYXRlZ29yeShldmVudDogYW55KSB7XG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgICAgbmFtZTogZXZlbnQuY2F0ZWdvcnlOYW1lIHx8ICcnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5jYXRlZ29yeURlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGZyYW1ld29ya09iaiA9IHtcbiAgICAgIGlkOiBldmVudC5mcmFtZXdvcmtJZCxcbiAgICAgIGNhdGVnb3J5OiBldmVudC5jYXRlZ29yeUNvZGVcbiAgICB9XG4gICAgdGhpcy50cmVlSGllcmFyY2h5U3ZjLnNldExvYWRlclN0YXRlKHRydWUpOyAgICBcbiAgICBjb25zdCB1cGRhdGVDYXRSZXMgPSBhd2FpdCB0aGlzLnRyZWVIaWVyYXJjaHlTdmMudXBkYXRlQ2F0ZWdvcnkocmVxdWVzdEJvZHksIGZyYW1ld29ya09iaikudG9Qcm9taXNlKCkuY2F0Y2goKF9lcnI6IGFueSkgPT4ge1xuICAgICAgdGhpcy50cmVlSGllcmFyY2h5U3ZjLnNldExvYWRlclN0YXRlKGZhbHNlKTtcbiAgICAgIGlmIChfZXJyICYmIF9lcnIuZXJyb3IgJiYgX2Vyci5lcnJvci5wYXJhbXMgJiYgX2Vyci5lcnJvci5wYXJhbXMuZXJyTXNnKSB7XG4gICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYCR7X2Vyci5lcnJvci5wYXJhbXMuZXJyTXNnfWApXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAodXBkYXRlQ2F0UmVzICYmIHVwZGF0ZUNhdFJlcy5wYXJhbXMgJiYgdXBkYXRlQ2F0UmVzLnBhcmFtcy5zdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ3N1Y2Nlc3NmdWwnKSB7XG4gICAgICBhd2FpdCB0aGlzLnB1Ymxpc2hGcmFtZXdvcmsoZnJhbWV3b3JrT2JqKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVBhcmVudEFzc29jaWF0aW9uKHNlbGVjdGVkUGFyZW50OiBhbnksIGN1cnJlbnRUZXJtOiBhbnkpIHtcbiAgICBjb25zdCBmcmFtd29ya0RhdGEgPSBfLmNsb25lRGVlcCh0aGlzLmZyYW1ld29ya1NlcnZpY2UuY29tcGxldGVSZXNwb25zZSk7XG4gICAgY29uc3QgcGFyZW50Q2F0ZWdvcnlEYXRhID0gZnJhbXdvcmtEYXRhLmNhdGVnb3JpZXMuZmluZCgoY2F0OiBhbnkpID0+IGNhdC5jb2RlID09PSBzZWxlY3RlZFBhcmVudC5jYXRlZ29yeSk7XG4gICAgaWYgKHBhcmVudENhdGVnb3J5RGF0YSAmJiBwYXJlbnRDYXRlZ29yeURhdGEudGVybXMgJiYgcGFyZW50Q2F0ZWdvcnlEYXRhLnRlcm1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRQYXJlbnRUZXJtID0gcGFyZW50Q2F0ZWdvcnlEYXRhLnRlcm1zLmZpbmQoKHRlcm06IGFueSkgPT4ge1xuICAgICAgICBpZiAodGVybS5hc3NvY2lhdGlvbnMgJiYgdGVybS5hc3NvY2lhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0ZXJtLmFzc29jaWF0aW9ucy5zb21lKChhc3NvYzogYW55KSA9PiBhc3NvYy5jb2RlID09PSBjdXJyZW50VGVybS5jb2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoY3VycmVudFBhcmVudFRlcm0pIHtcbiAgICAgICAgY29uc3QgdXBkYXRlT2xkUGFyZW50QXNzb2NpYXRpb246YW55ID0ge1xuICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgYXNzb2NpYXRpb25zOiBbXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50UGFyZW50VGVybS5hc3NvY2lhdGlvbnMuZm9yRWFjaCgoYXNzb2M6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChhc3NvYy5jb2RlICE9PSBjdXJyZW50VGVybS5jb2RlKSB7XG4gICAgICAgICAgICB1cGRhdGVPbGRQYXJlbnRBc3NvY2lhdGlvbi5yZXF1ZXN0LnRlcm0uYXNzb2NpYXRpb25zLnB1c2goe2lkZW50aWZpZXI6IGFzc29jLmlkZW50aWZpZXJ9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVIaWVyYXJjaHlBc3NvY2ljYXRpb24odXBkYXRlT2xkUGFyZW50QXNzb2NpYXRpb24sIGZyYW13b3JrRGF0YS5pZGVudGlmaWVyLCBjdXJyZW50UGFyZW50VGVybSlcbiAgICAgIH1cbiAgICAgIHNlbGVjdGVkUGFyZW50ID0gcGFyZW50Q2F0ZWdvcnlEYXRhLnRlcm1zLmZpbmQoKHRlcm06IGFueSkgPT4gdGVybS5jb2RlID09PSBzZWxlY3RlZFBhcmVudC5jb2RlKTtcbiAgICAgIGNvbnN0IHVwZGF0ZU5ld1BhcmVudEFzc29jaWF0aW9uOmFueSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgIGFzc29jaWF0aW9uczogW11cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3RlZFBhcmVudCAmJiBzZWxlY3RlZFBhcmVudC5hc3NvY2lhdGlvbnMgJiYgc2VsZWN0ZWRQYXJlbnQuYXNzb2NpYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2VsZWN0ZWRQYXJlbnQuYXNzb2NpYXRpb25zLmZvckVhY2goKGFzc29jOiBhbnkpID0+IHtcbiAgICAgICAgICB1cGRhdGVOZXdQYXJlbnRBc3NvY2lhdGlvbi5yZXF1ZXN0LnRlcm0uYXNzb2NpYXRpb25zLnB1c2goe2lkZW50aWZpZXI6IGFzc29jLmlkZW50aWZpZXJ9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgdXBkYXRlTmV3UGFyZW50QXNzb2NpYXRpb24ucmVxdWVzdC50ZXJtLmFzc29jaWF0aW9ucy5wdXNoKHtpZGVudGlmaWVyOiBjdXJyZW50VGVybS5pZGVudGlmaWVyfSk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZUhpZXJhcmNoeUFzc29jaWNhdGlvbih1cGRhdGVOZXdQYXJlbnRBc3NvY2lhdGlvbiwgZnJhbXdvcmtEYXRhLmlkZW50aWZpZXIsIHNlbGVjdGVkUGFyZW50KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVIaWVyYXJjaHlBc3NvY2ljYXRpb24ocmVxdWVzdEJvZHk6IGFueSwgZnJhbWV3b3JrSWQ6IGFueSwgdGVybURhdGE6IGFueSkge1xuICAgIHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5zZXRMb2FkZXJTdGF0ZSh0cnVlKTtcbiAgICBhd2FpdCB0aGlzLnRyZWVIaWVyYXJjaHlTdmMudXBkYXRlRnJhbWV3b3JrQXNzb2NpYXRpb24ocmVxdWVzdEJvZHksIHsgaWQ6IGZyYW1ld29ya0lkLCBjYXRlZ29yeTogdGVybURhdGEuY2F0ZWdvcnkgfSwgdGVybURhdGEuY29kZSkudG9Qcm9taXNlKCkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiB1cGRhdGluZyBhc3NvY2lhdGlvbicsIGVycik7XG4gICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUoZmFsc2UpO1xuICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgRXJyb3IgaW4gdXBkYXRpbmcgYXNzb2NpYXRpb25gLCAnY2FuY2VsJyk7XG4gICAgfSk7XG4gIH1cblxuICBjaGVja0NoaWxkT3JnKCkge1xuICAgIHJldHVybiAodGhpcy5jaGlsZE9yZ0RhdGE/LnJvb3RPcmdJZCAhPT0gdGhpcy5vcmdTZWxlY3RlZERhdGE/LmlkIHx8IHRoaXMudXNlclJvbGVzRGF0YT8uaGFzKCdtZG9fYWRtaW4nKSkgPyB0cnVlIDogZmFsc2VcbiAgfVxufSIsIjwhLS0gPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGNvbm5lY3Rpb25TZXR0aW5nc1wiPlxuICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiAoY2xpY2spPVwibmV3Q29ubmVjdGlvbigpXCI+XG4gICAgICAgIDxtYXQtaWNvbj57e2FwcF9zdHJpbmdzLmJ1aWxkfX08L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuPC9kaXY+IC0tPlxuXG48ZGl2ICpuZ0lmPVwibGlzdCAmJiBsaXN0Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImZsZXggaGVpZ2h0Rml4IG92ZXJmbG93LWNvbnRhaW5lclwiIGlkPVwidHJlZVZpZXdDb250YWluZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgbGlzdDsgbGV0IGkgPSBpbmRleDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbCBjb2wtY29udGFpbmVyIGNvbnRhaW5lcnN7e2xpc3QubGVuZ3RofX1cIiBpZD1cImJveHt7aSsxfX1Db250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1oZWFkaW5nLXN0aWNreVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1oZWFkaW5nLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjYXRlZ29yeS1oZWFkZXInPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWhlYWRlci1pdGVtcyB3LWZ1bGwgZmxleCBwYWRkaW5nLXJlbW92ZVwiIGlkPVwiYm94e3tpfX1IZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXggZ2FwLTEgbWF0LWJvZHktMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uPy5jb25maWc/Lmljb25FbmFibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW25nU3R5bGVdPVwieydjb2xvcic6Y29sdW1uLmNvbmZpZy5jb2xvcn1cIj57e2NvbHVtbi5jb25maWcuaWNvbn19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ge3tjb2x1bW4ubmFtZX19IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbHVtbj8uY29uZmlnPy5jYXRlZ29yeURpc3BsYXlOYW1lIHx8IGNvbHVtbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpICE9IDAgJiYgY2F0ZWdvcnlMaXN0Py5sZW5ndGggPiAwOyBlbHNlIGZpcnN0Q29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmluZGV4ICE9PSAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3VudFwiPih7e2dldENvdW50KGNvbHVtbi5jb2RlKX19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbj8uY29uZmlnPy5sZXZlbE5hbWVFZGl0ICYmICFjaGVja0NoaWxkT3JnKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImVkaXQtYnRuIGZsZXhcIiAoY2xpY2spPVwiZWRpdENhdGVnb3J5TmFtZShjb2x1bW4sIGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZmlyc3RDb2x1bW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaSA9PSAwXCIgaWQ9XCJib3h7e2krMX19Y291bnRcIiBjbGFzcz1cImNvdW50XCI+KHt7Y29sdW1uLmNoaWxkcmVuLmxlbmd0aH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgY2xhc3M9XCJcIiAqbmdJZj1cImNvbHVtbj8uY29uZmlnPy5jcmVhdGVCdG5FbmFibGVkICYmICFjb2x1bW4/LmNvbmZpZz8uYWRkT3JnRW5hYmxlZCAmJiAhY2hlY2tDaGlsZE9yZygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cImFkZC1idG4gbWFyZ2luLWxlZnQtYXV0b1wiIFtuZ0NsYXNzXT1cInsnYnV0dG9uLWVuYWJsZWQnOiBjb25maWdDb2RlQnRuPT0gY29sdW1uPy5jb2RlLCAnYnV0dG9uLWRpc2FibGVkJzogY29uZmlnQ29kZUJ0biE9PSBjb2x1bW4/LmNvZGV9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ3JlYXRlVGVybURpYWxvZyhjb2x1bW4sIGkpXCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWFyZ2luLXJlbW92ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwX3N0cmluZ3MuYWRkfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4/LmNvbmZpZz8uYWRkT3JnRW5hYmxlZCAmJiAhY29sdW1uPy5jb25maWc/LmNyZWF0ZUJ0bkVuYWJsZWQgJiYgIWNoZWNrQ2hpbGRPcmcoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJhZGQtYnRuIG1hcmdpbi1sZWZ0LWF1dG9cIiAoY2xpY2spPVwib3Blbk9yZ2FuaXphdGlvbkRpYWxvZyhjb2x1bW4sIGksICdhZGQnKVwiIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydidXR0b24tZW5hYmxlZCc6IGlzQ3VycmVudE9yTmV4dFRlcm0oY29sdW1uLCBpKSwgJ2J1dHRvbi1kaXNhYmxlZCc6ICFpc0N1cnJlbnRPck5leHRUZXJtKGNvbHVtbiwgaSl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BZGQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXJnaW4tcmVtb3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcHBfc3RyaW5ncy5hZGR9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93XCIgaWQ9XCJib3h7e2krMX19Y291bnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgUHV0IHNlYXJjaCBidXR0b24gaGVyZSBpbiBmdXR1cmVcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFkZGluZy14MiBjYXQtY29sdW1ucyBjb250YWluZXItYm94XCIgaWQ9XCJib3h7e2krMX19XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbj8uY2hpbGRyZW4gJiYgY29sdW1uPy5jaGlsZHJlbi5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItdHJlZS1jb2x1bW4tdmlldyAqbmdJZj1cImxvYWRlZFtjb2x1bW4uY29kZV1cIiAjc2VsZWN0ZWRUYXhvbm9teVRlcm0gW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICBbY29udGFpbmVySWRdPVwiJ2JveCcrKGkrMSlcIiBbY2hpbGRPcmddPVwiY2hpbGRPcmdEYXRhXCIgW2lzQ2hpbGRPcmddPVwiY2hlY2tDaGlsZE9yZygpXCIgKHVwZGF0ZVRheG9ub215VGVybSk9XCJ1cGRhdGVUYXhvbm9teVRlcm0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICh1cGRhdGVUZXJtTGlzdCk9XCJ1cGRhdGVEcmFmdFN0YXR1c1Rlcm1zKCRldmVudClcIiAoY2FyZHNDb3VudCk9XCJnZXROb09mQ2FyZHMoJGV2ZW50KVwiIFxuICAgICAgICAgICAgICAgICAgICAocmV0aXJlVGVybURhdGEpPVwicmVtb3ZlQ29ubmVjdGlvbigkZXZlbnQpXCIgKGNhcmRBY3Rpb24pPVwiY2FyZEFjdGlvbkVtaXQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvbGliLXRyZWUtY29sdW1uLXZpZXc+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3VsZFNob3dTdmdCb3JkZXJXcmFwcGVyKGNvbHVtbiwgaSkgJiYgIWNoZWNrQ2hpbGRPcmcoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ZnLWJvcmRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzFCMjEzMzUyXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCIyMCwgMTBcIiByeD1cIjEwXCIgcnk9XCIxMFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQgZmxleCBmbGV4LWNvbCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJmcmFjLW5vLWNvbm5lY3Rpb25cIj48L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWxlY3QgYW4gb3JnYW5pemF0aW9uIHRvIGFkZCBvciBzZWUgZnVydGhlciBjb25uZWN0aW9uczwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwiYWRkLWJ0blwiIChjbGljayk9XCJvcGVuT3JnYW5pemF0aW9uRGlhbG9nKGNvbHVtbiwgaSwgJ2FkZCcpXCIgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYnV0dG9uLWVuYWJsZWQnOiBpc0N1cnJlbnRPck5leHRUZXJtKGNvbHVtbiwgaSksICdidXR0b24tZGlzYWJsZWQnOiAhaXNDdXJyZW50T3JOZXh0VGVybShjb2x1bW4sIGkpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BZGQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hcmdpbi1yZW1vdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwX3N0cmluZ3MuYWRkfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bGliLWFjdGlvbi1iYXIgKm5nSWY9XCJzaG93QWN0aW9uQmFyXCIgW2FjdGlvblR5cGVdPVwiaXNBcHByb3ZhbFZpZXdcIiBbY29uZmlnVHlwZV09XCJ3b3JrRmxvd1N0YXR1c1wiXG4gICAgICAgIChzZW5kQXBwcm92YWwpPVwic2VuZEZvckFwcHJvdmFsKClcIiAoY2xvc2VBY3Rpb24pPVwiY2xvc2VBY3Rpb25CYXIoJGV2ZW50KVwiPjwvbGliLWFjdGlvbi1iYXI+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCIhKGxpc3QgJiYgbGlzdC5sZW5ndGggPiAwICkgJiYgaXNGcmF3b3JrTG9hZGluZ1wiIGNsYXNzPVwiZmxleCBoZWlnaHRGaXggXCI+XG4gICAgPGgxIGkxOG4+e3thcHBfc3RyaW5ncy5sb2FkaW5nfX08L2gxPlxuPC9kaXY+Il19
|