@csmart/ngc-smart-victim 0.1.7 → 1.13.0
Sign up to get free protection for your applications and to get access to all the features.
- package/csmart-ngc-smart-victim.d.ts +1 -15
- package/esm2020/csmart-ngc-smart-victim.mjs +5 -0
- package/esm2020/lib/caseNote/caseNote.component.mjs +185 -0
- package/esm2020/lib/common-dialog/common-dialog.component.mjs +23 -0
- package/esm2020/lib/common-dialog/common-dialog.module.mjs +38 -0
- package/esm2020/lib/common-dialog/common-dialog.service.mjs +33 -0
- package/esm2020/lib/contact/contact.component.mjs +140 -0
- package/esm2020/lib/intake.service.mjs +57 -0
- package/esm2020/lib/safetyPlan/serviceProvider.component.mjs +115 -0
- package/esm2020/lib/safetyPlan/victimSafetyPlan.component.mjs +116 -0
- package/esm2020/lib/safetyPlan/victimSafetyPlanDetail.component.mjs +340 -0
- package/esm2020/lib/shared/app.shared.module.mjs +213 -0
- package/esm2020/lib/shared/directives/phone-mask.directive.mjs +114 -0
- package/esm2020/lib/shared/validators/date.validator.mjs +59 -0
- package/esm2020/lib/shared/validators/index.mjs +2 -0
- package/esm2020/lib/smart-victim-delete-confirm.component.mjs +53 -0
- package/esm2020/lib/smart-victim-detail/smart-victim-detail.component.mjs +958 -0
- package/esm2020/lib/smart-victim.component.mjs +310 -0
- package/esm2020/lib/smart-victim.model.mjs +132 -0
- package/esm2020/lib/smart-victim.module.mjs +138 -0
- package/esm2020/lib/smart-victim.service.mjs +347 -0
- package/esm2020/lib/victim-routing.module.mjs +42 -0
- package/esm2020/lib/victimSearch/VictimSearchFilter.mjs +3 -0
- package/esm2020/lib/victimSearch/victimSearchForm.component.mjs +38 -0
- package/esm2020/public-api.mjs +12 -0
- package/fesm2015/csmart-ngc-smart-victim.mjs +3221 -0
- package/fesm2015/csmart-ngc-smart-victim.mjs.map +1 -0
- package/fesm2020/csmart-ngc-smart-victim.mjs +3210 -0
- package/fesm2020/csmart-ngc-smart-victim.mjs.map +1 -0
- package/lib/caseNote/caseNote.component.d.ts +6 -2
- package/lib/common-dialog/common-dialog.component.d.ts +4 -1
- package/lib/common-dialog/common-dialog.module.d.ts +6 -0
- package/lib/common-dialog/common-dialog.service.d.ts +4 -1
- package/lib/contact/contact.component.d.ts +4 -1
- package/lib/intake.service.d.ts +3 -0
- package/lib/safetyPlan/serviceProvider.component.d.ts +4 -1
- package/lib/safetyPlan/victimSafetyPlan.component.d.ts +7 -2
- package/lib/safetyPlan/victimSafetyPlanDetail.component.d.ts +7 -2
- package/lib/shared/app.shared.module.d.ts +30 -0
- package/lib/shared/directives/phone-mask.directive.d.ts +5 -2
- package/lib/smart-victim-delete-confirm.component.d.ts +3 -0
- package/lib/smart-victim-detail/smart-victim-detail.component.d.ts +9 -4
- package/lib/smart-victim.component.d.ts +8 -3
- package/lib/smart-victim.module.d.ts +47 -0
- package/lib/smart-victim.service.d.ts +3 -0
- package/lib/victim-routing.module.d.ts +5 -0
- package/lib/victimSearch/victimSearchForm.component.d.ts +3 -0
- package/package.json +28 -18
- package/public-api.d.ts +4 -0
- package/bundles/csmart-ngc-smart-victim.umd.js +0 -6434
- package/bundles/csmart-ngc-smart-victim.umd.js.map +0 -1
- package/bundles/csmart-ngc-smart-victim.umd.min.js +0 -16
- package/bundles/csmart-ngc-smart-victim.umd.min.js.map +0 -1
- package/csmart-ngc-smart-victim.metadata.json +0 -1
- package/esm2015/csmart-ngc-smart-victim.js +0 -25
- package/esm2015/lib/caseNote/caseNote.component.js +0 -349
- package/esm2015/lib/common-dialog/common-dialog.component.js +0 -46
- package/esm2015/lib/common-dialog/common-dialog.module.js +0 -32
- package/esm2015/lib/common-dialog/common-dialog.service.js +0 -63
- package/esm2015/lib/contact/contact.component.js +0 -232
- package/esm2015/lib/intake.service.js +0 -183
- package/esm2015/lib/safetyPlan/serviceProvider.component.js +0 -130
- package/esm2015/lib/safetyPlan/victimSafetyPlan.component.js +0 -257
- package/esm2015/lib/safetyPlan/victimSafetyPlanDetail.component.js +0 -556
- package/esm2015/lib/shared/app.shared.module.js +0 -81
- package/esm2015/lib/shared/directives/phone-mask.directive.js +0 -168
- package/esm2015/lib/shared/validators/date.validator.js +0 -108
- package/esm2015/lib/shared/validators/index.js +0 -7
- package/esm2015/lib/smart-victim-delete-confirm.component.js +0 -61
- package/esm2015/lib/smart-victim-detail/smart-victim-detail.component.js +0 -1410
- package/esm2015/lib/smart-victim.component.js +0 -476
- package/esm2015/lib/smart-victim.model.js +0 -631
- package/esm2015/lib/smart-victim.module.js +0 -84
- package/esm2015/lib/smart-victim.service.js +0 -792
- package/esm2015/lib/victim-routing.module.js +0 -40
- package/esm2015/lib/victimSearch/VictimSearchFilter.js +0 -20
- package/esm2015/lib/victimSearch/victimSearchForm.component.js +0 -59
- package/esm2015/public-api.js +0 -13
- package/esm5/csmart-ngc-smart-victim.js +0 -25
- package/esm5/lib/caseNote/caseNote.component.js +0 -372
- package/esm5/lib/common-dialog/common-dialog.component.js +0 -48
- package/esm5/lib/common-dialog/common-dialog.module.js +0 -36
- package/esm5/lib/common-dialog/common-dialog.service.js +0 -75
- package/esm5/lib/contact/contact.component.js +0 -285
- package/esm5/lib/intake.service.js +0 -194
- package/esm5/lib/safetyPlan/serviceProvider.component.js +0 -99
- package/esm5/lib/safetyPlan/victimSafetyPlan.component.js +0 -306
- package/esm5/lib/safetyPlan/victimSafetyPlanDetail.component.js +0 -628
- package/esm5/lib/shared/app.shared.module.js +0 -85
- package/esm5/lib/shared/directives/phone-mask.directive.js +0 -184
- package/esm5/lib/shared/validators/date.validator.js +0 -108
- package/esm5/lib/shared/validators/index.js +0 -7
- package/esm5/lib/smart-victim-delete-confirm.component.js +0 -51
- package/esm5/lib/smart-victim-detail/smart-victim-detail.component.js +0 -1502
- package/esm5/lib/smart-victim.component.js +0 -528
- package/esm5/lib/smart-victim.model.js +0 -541
- package/esm5/lib/smart-victim.module.js +0 -84
- package/esm5/lib/smart-victim.service.js +0 -1063
- package/esm5/lib/victim-routing.module.js +0 -44
- package/esm5/lib/victimSearch/VictimSearchFilter.js +0 -24
- package/esm5/lib/victimSearch/victimSearchForm.component.js +0 -70
- package/esm5/public-api.js +0 -13
- package/fesm2015/csmart-ngc-smart-victim.js +0 -5690
- package/fesm2015/csmart-ngc-smart-victim.js.map +0 -1
- package/fesm5/csmart-ngc-smart-victim.js +0 -6211
- package/fesm5/csmart-ngc-smart-victim.js.map +0 -1
@@ -1,556 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview added by tsickle
|
3
|
-
* Generated from: lib/safetyPlan/victimSafetyPlanDetail.component.ts
|
4
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
5
|
-
*/
|
6
|
-
import { Component } from '@angular/core';
|
7
|
-
import { NgcSmartVictimService } from '../smart-victim.service';
|
8
|
-
import { FormControl, FormBuilder, Validators } from '@angular/forms';
|
9
|
-
import { MatSnackBar, MatTableDataSource, MatDialog } from '@angular/material';
|
10
|
-
import { CommonDialogService } from '.././common-dialog/common-dialog.service';
|
11
|
-
import { HttpClient } from '@angular/common/http';
|
12
|
-
import { Router, ActivatedRoute } from '@angular/router';
|
13
|
-
import { dateValidator } from '../shared/validators';
|
14
|
-
import { SeriveProviderComponent } from '../safetyPlan/serviceProvider.component';
|
15
|
-
export class VictimSafetyPlanDetailComponent {
|
16
|
-
/**
|
17
|
-
* @param {?} dialog
|
18
|
-
* @param {?} _victimServicesComponent
|
19
|
-
* @param {?} http
|
20
|
-
* @param {?} snackBar
|
21
|
-
* @param {?} route
|
22
|
-
* @param {?} router
|
23
|
-
* @param {?} commonDialogService
|
24
|
-
* @param {?} formBuilder
|
25
|
-
*/
|
26
|
-
constructor(dialog, _victimServicesComponent, http, snackBar, route, router, commonDialogService, formBuilder) {
|
27
|
-
this.dialog = dialog;
|
28
|
-
this._victimServicesComponent = _victimServicesComponent;
|
29
|
-
this.http = http;
|
30
|
-
this.snackBar = snackBar;
|
31
|
-
this.route = route;
|
32
|
-
this.router = router;
|
33
|
-
this.commonDialogService = commonDialogService;
|
34
|
-
this.formBuilder = formBuilder;
|
35
|
-
this.editSafetyPlan = (/** @type {?} */ ({}));
|
36
|
-
this.providerListCollection = [];
|
37
|
-
this.serviceCheck = [];
|
38
|
-
this.victimServiceStatusHistoriesDataSource = new MatTableDataSource();
|
39
|
-
this.initForm();
|
40
|
-
}
|
41
|
-
/**
|
42
|
-
* @private
|
43
|
-
* @return {?}
|
44
|
-
*/
|
45
|
-
initForm() {
|
46
|
-
this.spForm = this.formBuilder.group({
|
47
|
-
serviceGoal: new FormControl('', Validators.compose([
|
48
|
-
Validators.required
|
49
|
-
])),
|
50
|
-
goalStatus: new FormControl('', Validators.compose([
|
51
|
-
Validators.required
|
52
|
-
])),
|
53
|
-
goalStatusDate: new FormControl('', Validators.compose([
|
54
|
-
Validators.required, dateValidator()
|
55
|
-
])),
|
56
|
-
comment: new FormControl('', Validators.required)
|
57
|
-
});
|
58
|
-
this.spForm.markAsPristine();
|
59
|
-
this.spForm.markAsUntouched();
|
60
|
-
}
|
61
|
-
/**
|
62
|
-
* @return {?}
|
63
|
-
*/
|
64
|
-
ngOnInit() {
|
65
|
-
/** @type {?} */
|
66
|
-
var data = this.route.snapshot.data;
|
67
|
-
this.loginStaff = data.loginStaff;
|
68
|
-
this.staffId = this.loginStaff.staffId;
|
69
|
-
this.sub = this.route.params.subscribe((/**
|
70
|
-
* @param {?} params
|
71
|
-
* @return {?}
|
72
|
-
*/
|
73
|
-
params => {
|
74
|
-
this.victimServiceId = params['victimServiceId'];
|
75
|
-
this.victimId = params['victimId'];
|
76
|
-
}));
|
77
|
-
this.hiddenAddNewFlag = false;
|
78
|
-
this.isDisplay = false;
|
79
|
-
this._victimServicesComponent.getVictimServiceTypes().subscribe((/**
|
80
|
-
* @param {?} items
|
81
|
-
* @return {?}
|
82
|
-
*/
|
83
|
-
(items) => {
|
84
|
-
this.victimServiceTypes = items;
|
85
|
-
}));
|
86
|
-
this._victimServicesComponent.getVictimServiceStatus().subscribe((/**
|
87
|
-
* @param {?} items
|
88
|
-
* @return {?}
|
89
|
-
*/
|
90
|
-
(items) => {
|
91
|
-
this.victimServiceStatus = items;
|
92
|
-
}));
|
93
|
-
this._victimServicesComponent.getVictim(this.victimId).subscribe((/**
|
94
|
-
* @param {?} items
|
95
|
-
* @return {?}
|
96
|
-
*/
|
97
|
-
(items) => {
|
98
|
-
this.victimName = items.firstName + ', ' + items.lastName;
|
99
|
-
}));
|
100
|
-
//---------------graphQL--------------------------------------
|
101
|
-
// this.getVictimServiceTypeProgramProviders().subscribe(result => {
|
102
|
-
// this.providerList = result;
|
103
|
-
// });
|
104
|
-
// console.log('this.victimServiceId');
|
105
|
-
// console.log(this.victimServiceId);
|
106
|
-
if (this.victimServiceId != 0) {
|
107
|
-
this._victimServicesComponent.getVictimServices(this.victimServiceId).subscribe((/**
|
108
|
-
* @param {?} victimSafetyPlans
|
109
|
-
* @return {?}
|
110
|
-
*/
|
111
|
-
victimSafetyPlans => {
|
112
|
-
console.log('victimSafetyPlans');
|
113
|
-
console.log(victimSafetyPlans);
|
114
|
-
this.editSafetyPlan = victimSafetyPlans[0];
|
115
|
-
this.victimId = victimSafetyPlans[0].victimId;
|
116
|
-
console.log('this.editSafetyPlan');
|
117
|
-
console.log(this.editSafetyPlan);
|
118
|
-
// console.log('this.editSafetyPlan.goal');
|
119
|
-
// console.log(this.editSafetyPlan.goal);
|
120
|
-
// console.log('this.editSafetyPlan[0].goal');
|
121
|
-
// console.log(this.editSafetyPlan[0].goal);
|
122
|
-
}));
|
123
|
-
this._victimServicesComponent.getServiceStatusHistories(this.victimServiceId).subscribe((/**
|
124
|
-
* @param {?} victimServiceStatusHistories
|
125
|
-
* @return {?}
|
126
|
-
*/
|
127
|
-
victimServiceStatusHistories => {
|
128
|
-
// this.victimServiceStatusHistories = victimServiceStatusHistories;
|
129
|
-
this.victimServiceStatusHistoriesDataSource.data = victimServiceStatusHistories;
|
130
|
-
}));
|
131
|
-
}
|
132
|
-
this.loadProvider();
|
133
|
-
}
|
134
|
-
//pass in id
|
135
|
-
/**
|
136
|
-
* @param {?} providerListCollectionKey
|
137
|
-
* @param {?} serviceTypeName
|
138
|
-
* @param {?} event
|
139
|
-
* @return {?}
|
140
|
-
*/
|
141
|
-
isInArray(providerListCollectionKey, serviceTypeName, event) {
|
142
|
-
console.log('providerListCollectionKey');
|
143
|
-
console.log(providerListCollectionKey);
|
144
|
-
console.log('serviceTypeName');
|
145
|
-
console.log(serviceTypeName);
|
146
|
-
console.log('event.source.value');
|
147
|
-
console.log(event.checked);
|
148
|
-
if (event.checked == true) {
|
149
|
-
for (let j = 0; j < this.providerListCollection.length; j++) {
|
150
|
-
if (providerListCollectionKey == this.providerListCollection[j].groupId) {
|
151
|
-
this.providerListCollection[j].isDisplay = !this.providerListCollection[j].isDisplay;
|
152
|
-
/** @type {?} */
|
153
|
-
const dialogRef = this.dialog.open(SeriveProviderComponent, {
|
154
|
-
width: '500px',
|
155
|
-
data: (/** @type {?} */ ({
|
156
|
-
serviceType: serviceTypeName,
|
157
|
-
serviceTypeId: providerListCollectionKey,
|
158
|
-
providerCollections: [...this.providerListCollection],
|
159
|
-
})),
|
160
|
-
panelClass: 'formFieldWidth480',
|
161
|
-
});
|
162
|
-
dialogRef.afterClosed().subscribe((/**
|
163
|
-
* @param {?} result
|
164
|
-
* @return {?}
|
165
|
-
*/
|
166
|
-
(result) => {
|
167
|
-
console.log('The dialog was closed');
|
168
|
-
console.log(result);
|
169
|
-
if (result) {
|
170
|
-
console.log('The dialog was closed, inside result');
|
171
|
-
this.savePlanProvider(providerListCollectionKey, result.voteeProviderId);
|
172
|
-
}
|
173
|
-
}));
|
174
|
-
// return;
|
175
|
-
}
|
176
|
-
}
|
177
|
-
} //if event.checked == true
|
178
|
-
//this.router.navigate(['saftyPlanDetail', this.victimServiceId, this.victimId ]);
|
179
|
-
}
|
180
|
-
/**
|
181
|
-
* @return {?}
|
182
|
-
*/
|
183
|
-
loadProvider() {
|
184
|
-
this.providerListCollection = [];
|
185
|
-
this._victimServicesComponent.getvVictimServiceTypeProgramProviders()
|
186
|
-
.subscribe((/**
|
187
|
-
* @param {?} providerList
|
188
|
-
* @return {?}
|
189
|
-
*/
|
190
|
-
(providerList) => {
|
191
|
-
if (providerList) {
|
192
|
-
/** @type {?} */
|
193
|
-
let providers = Object.create(null);
|
194
|
-
for (let i = 0; i < providerList.length; i++) {
|
195
|
-
if (!providers[providerList[i].victimServiceTypeId]) {
|
196
|
-
providers[providerList[i].victimServiceTypeId] = [];
|
197
|
-
if (this.editSafetyPlan.vVictimServiceDetails != null) {
|
198
|
-
for (let j = 0; j < this.editSafetyPlan.vVictimServiceDetails.length; j++) {
|
199
|
-
if (providerList[i].victimServiceTypeId == this.editSafetyPlan.vVictimServiceDetails[j].victimServiceId.toString()) {
|
200
|
-
this.isDisplay = true;
|
201
|
-
}
|
202
|
-
}
|
203
|
-
}
|
204
|
-
this.providerListCollection.push({ groupId: providerList[i].victimServiceTypeId, isDisplay: this.isDisplay, collection: providers[providerList[i].victimServiceTypeId] });
|
205
|
-
}
|
206
|
-
providers[providerList[i].victimServiceTypeId].push(providerList[i]);
|
207
|
-
}
|
208
|
-
}
|
209
|
-
}));
|
210
|
-
}
|
211
|
-
//---------------graphQL--------------------------------------
|
212
|
-
// getVictimServiceTypeProgramProviders(): Observable<VictimServiceTypeProgramProviderModel[]> {
|
213
|
-
// const queryString = `
|
214
|
-
// {
|
215
|
-
// findVictimServiceTypeProgramProviders {
|
216
|
-
// data {
|
217
|
-
// victimServiceTypeProgramProviderId
|
218
|
-
// victimServiceType
|
219
|
-
// victimProgramProvider
|
220
|
-
// }
|
221
|
-
// }
|
222
|
-
// }`;
|
223
|
-
// return this.http.post<any>(environment.smartApiUrl, { query: queryString })
|
224
|
-
// .map(result => {
|
225
|
-
// return result.data.findVictimServiceTypeProgramProviders.data;
|
226
|
-
// });
|
227
|
-
// }
|
228
|
-
/**
|
229
|
-
* @param {?} victimServiceTypeId
|
230
|
-
* @return {?}
|
231
|
-
*/
|
232
|
-
evaluateSelection(victimServiceTypeId) {
|
233
|
-
if (this.editSafetyPlan.vVictimServiceDetails) {
|
234
|
-
return this.editSafetyPlan.vVictimServiceDetails.findIndex((/**
|
235
|
-
* @param {?} r
|
236
|
-
* @return {?}
|
237
|
-
*/
|
238
|
-
r => r.victimServiceTypeId === victimServiceTypeId)) >= 0;
|
239
|
-
}
|
240
|
-
}
|
241
|
-
/**
|
242
|
-
* @param {?} victimServiceTypeId
|
243
|
-
* @param {?} victimProgramProviderId
|
244
|
-
* @return {?}
|
245
|
-
*/
|
246
|
-
savePlanProvider(victimServiceTypeId, victimProgramProviderId) {
|
247
|
-
console.log('savePlanProvider');
|
248
|
-
console.log(victimServiceTypeId);
|
249
|
-
console.log(victimProgramProviderId);
|
250
|
-
if (victimProgramProviderId === "" || victimProgramProviderId === null || victimProgramProviderId === undefined) {
|
251
|
-
this.snackBar.open('Please pick a program on the drop down list !', '', { duration: 120, });
|
252
|
-
// alert('Please pick a program on the drop down list !');
|
253
|
-
}
|
254
|
-
else {
|
255
|
-
if (this.victimServiceId == 0) {
|
256
|
-
//insert
|
257
|
-
console.log('insert new plan');
|
258
|
-
/** @type {?} */
|
259
|
-
const safetyPlan = {
|
260
|
-
victimId: this.victimId,
|
261
|
-
fullName: null,
|
262
|
-
victimServiceId: 0,
|
263
|
-
goal: this.editSafetyPlan.goal,
|
264
|
-
comment: this.editSafetyPlan.comment,
|
265
|
-
modifiedBy: this.staffId,
|
266
|
-
victimServiceStatusId: null,
|
267
|
-
status: null,
|
268
|
-
startDate: null,
|
269
|
-
vVictimServiceDetails: null,
|
270
|
-
victimName: null
|
271
|
-
};
|
272
|
-
this._victimServicesComponent.addSafetyPlan(safetyPlan).subscribe((/**
|
273
|
-
* @param {?} itms
|
274
|
-
* @return {?}
|
275
|
-
*/
|
276
|
-
(itms) => {
|
277
|
-
/** @type {?} */
|
278
|
-
const victimServiceStatus = {
|
279
|
-
victimServiceStatusHistoryId: 0,
|
280
|
-
victimServiceId: itms.victimServiceId,
|
281
|
-
victimServiceStatusId: this.editSafetyPlan.victimServiceStatusId,
|
282
|
-
startDate: this.editSafetyPlan.startDate,
|
283
|
-
modifiedBy: this.staffId,
|
284
|
-
comment: 'test add safety plan'
|
285
|
-
};
|
286
|
-
this._victimServicesComponent.addVictimServiceStatus(victimServiceStatus).subscribe((/**
|
287
|
-
* @return {?}
|
288
|
-
*/
|
289
|
-
() => {
|
290
|
-
console.log('check itms.victimServiceId iniside add victim serive status');
|
291
|
-
console.log(itms.victimServiceId);
|
292
|
-
/** @type {?} */
|
293
|
-
const victimServiceDetail = {
|
294
|
-
victimServiceId: itms.victimServiceId,
|
295
|
-
victimServiceDetailId: 0,
|
296
|
-
victimServiceTypeId: victimServiceTypeId,
|
297
|
-
victimProgramProviderId: victimProgramProviderId,
|
298
|
-
modifiedBy: this.staffId,
|
299
|
-
victimProgramProvider: null
|
300
|
-
};
|
301
|
-
console.log('add plan provider here at insert');
|
302
|
-
this._victimServicesComponent.addPlanProvider(victimServiceDetail).subscribe((/**
|
303
|
-
* @return {?}
|
304
|
-
*/
|
305
|
-
() => {
|
306
|
-
this.router.navigate(['saftyPlanDetail', itms.victimServiceId, this.victimId]);
|
307
|
-
}));
|
308
|
-
}));
|
309
|
-
}));
|
310
|
-
}
|
311
|
-
else //update
|
312
|
-
{
|
313
|
-
/** @type {?} */
|
314
|
-
const victimServiceDetail = {
|
315
|
-
victimServiceId: this.victimServiceId,
|
316
|
-
victimServiceDetailId: 0,
|
317
|
-
victimServiceTypeId: victimServiceTypeId,
|
318
|
-
victimProgramProviderId: victimProgramProviderId,
|
319
|
-
modifiedBy: this.staffId,
|
320
|
-
victimProgramProvider: null
|
321
|
-
};
|
322
|
-
console.log('add plan provider here at update');
|
323
|
-
this._victimServicesComponent.addPlanProvider(victimServiceDetail).subscribe((/**
|
324
|
-
* @return {?}
|
325
|
-
*/
|
326
|
-
() => {
|
327
|
-
this.router.navigate(['saftyPlanDetail', this.victimServiceId, this.victimId]);
|
328
|
-
}));
|
329
|
-
}
|
330
|
-
}
|
331
|
-
}
|
332
|
-
/**
|
333
|
-
* @param {?} victimProgramProviderId
|
334
|
-
* @return {?}
|
335
|
-
*/
|
336
|
-
deleteProvider(victimProgramProviderId) {
|
337
|
-
this.commonDialogService
|
338
|
-
.confirm('', 'Do you want to delete this provider?', 'Yes', 'No')
|
339
|
-
.subscribe((/**
|
340
|
-
* @param {?} res
|
341
|
-
* @return {?}
|
342
|
-
*/
|
343
|
-
res => {
|
344
|
-
this.result = res;
|
345
|
-
if (this.result) {
|
346
|
-
this._victimServicesComponent.deleteProvider(victimProgramProviderId, this.staffId)
|
347
|
-
.subscribe((/**
|
348
|
-
* @param {?} result
|
349
|
-
* @return {?}
|
350
|
-
*/
|
351
|
-
result => {
|
352
|
-
this.snackBar.open('delete provider Successfully !', '', {
|
353
|
-
duration: 3000,
|
354
|
-
});
|
355
|
-
location.reload();
|
356
|
-
}));
|
357
|
-
}
|
358
|
-
}));
|
359
|
-
// location.reload();
|
360
|
-
}
|
361
|
-
/**
|
362
|
-
* @return {?}
|
363
|
-
*/
|
364
|
-
saveSafetyPlan() {
|
365
|
-
if (this.editSafetyPlan.victimServiceId === undefined) {
|
366
|
-
/** @type {?} */
|
367
|
-
const safetyPlan = {
|
368
|
-
victimId: this.victimId,
|
369
|
-
fullName: null,
|
370
|
-
victimServiceId: 0,
|
371
|
-
goal: this.editSafetyPlan.goal,
|
372
|
-
comment: this.editSafetyPlan.comment,
|
373
|
-
modifiedBy: this.staffId,
|
374
|
-
victimServiceStatusId: null,
|
375
|
-
status: null,
|
376
|
-
startDate: null,
|
377
|
-
vVictimServiceDetails: null,
|
378
|
-
victimName: null
|
379
|
-
};
|
380
|
-
this._victimServicesComponent.addSafetyPlan(safetyPlan).subscribe((/**
|
381
|
-
* @param {?} itms
|
382
|
-
* @return {?}
|
383
|
-
*/
|
384
|
-
(itms) => {
|
385
|
-
/** @type {?} */
|
386
|
-
const victimServiceStatus = {
|
387
|
-
victimServiceStatusHistoryId: 0,
|
388
|
-
victimServiceId: itms.victimServiceId,
|
389
|
-
victimServiceStatusId: this.editSafetyPlan.victimServiceStatusId,
|
390
|
-
startDate: this.editSafetyPlan.startDate,
|
391
|
-
modifiedBy: this.staffId,
|
392
|
-
comment: 'test add safety Plan'
|
393
|
-
};
|
394
|
-
this._victimServicesComponent.addVictimServiceStatus(victimServiceStatus).subscribe((/**
|
395
|
-
* @param {?} resp
|
396
|
-
* @return {?}
|
397
|
-
*/
|
398
|
-
resp => {
|
399
|
-
this.snackBar.open('Insert status successfully!', '', {
|
400
|
-
duration: 3000,
|
401
|
-
});
|
402
|
-
}));
|
403
|
-
this.router.navigate(['saftyPlanDetail', itms.victimServiceId, this.victimId]);
|
404
|
-
}));
|
405
|
-
}
|
406
|
-
else {
|
407
|
-
// this.editSafetyPlan.modifiedBy=this.loginStaff.staffId;
|
408
|
-
this.editSafetyPlan.modifiedBy = this.staffId;
|
409
|
-
this._victimServicesComponent.updateSafetyPlan(this.editSafetyPlan).subscribe((/**
|
410
|
-
* @param {?} resp
|
411
|
-
* @return {?}
|
412
|
-
*/
|
413
|
-
resp => {
|
414
|
-
// this.snackBar.open('update Successfully!', '', {
|
415
|
-
// duration: 3000,
|
416
|
-
// });
|
417
|
-
// this.snackBar.open('update Successfully!', '', {
|
418
|
-
// duration: 3000,
|
419
|
-
// });
|
420
|
-
/** @type {?} */
|
421
|
-
const victimServiceStatus = {
|
422
|
-
victimServiceStatusHistoryId: 0,
|
423
|
-
victimServiceId: this.editSafetyPlan.victimServiceId.toString(),
|
424
|
-
victimServiceStatusId: this.editSafetyPlan.victimServiceStatusId,
|
425
|
-
startDate: this.editSafetyPlan.startDate,
|
426
|
-
modifiedBy: this.staffId,
|
427
|
-
comment: 'test update safety Plan'
|
428
|
-
};
|
429
|
-
this._victimServicesComponent.addVictimServiceStatus(victimServiceStatus).subscribe();
|
430
|
-
this.router.navigate(['saftyPlanDetail', this.editSafetyPlan.victimServiceId, this.victimId]);
|
431
|
-
}));
|
432
|
-
}
|
433
|
-
}
|
434
|
-
/**
|
435
|
-
* @return {?}
|
436
|
-
*/
|
437
|
-
back() {
|
438
|
-
console.log('this.victimId');
|
439
|
-
console.log(this.victimId);
|
440
|
-
this.router.navigate(['saftyPlan', this.victimId]);
|
441
|
-
}
|
442
|
-
}
|
443
|
-
VictimSafetyPlanDetailComponent.decorators = [
|
444
|
-
{ type: Component, args: [{
|
445
|
-
template: "<mat-card>\r\n <mat-card-header>\r\n \r\n </mat-card-header>\r\n <mat-card-content>\r\n <mat-toolbar color=\"primary\">\r\n <h4 class=\"card-header\" style=\"display: inline-block;\">Safety Plan</h4>\r\n </mat-toolbar>\r\n \r\n \r\n <div class='container'>\r\n <form [formGroup]=\"spForm\" #spDetailForm=\"ngForm\" >\r\n \r\n \r\n <div class=\"row\" ><b>Victim Name:</b> {{victimName}} </div>\r\n \r\n\r\n <div class=\"row\" > \r\n <mat-form-field >\r\n <mat-label>Goal:</mat-label>\r\n <input matInput formControlName=\"serviceGoal\" [(ngModel)]=\"editSafetyPlan.goal\" >\r\n </mat-form-field>\r\n \r\n </div>\r\n \r\n \r\n \r\n \r\n \r\n \r\n <div class=\"row\"> \r\n <mat-form-field>\r\n <mat-label>Goal Status:</mat-label>\r\n <mat-select formControlName=\"goalStatus\" [(ngModel)]=\"editSafetyPlan.victimServiceStatusId\" >\r\n \r\n <mat-option *ngFor=\" let victimServiceStatu of victimServiceStatus\" [value]=\"victimServiceStatu.victimServiceStatusId\" >{{victimServiceStatu.name}}</mat-option>\r\n \r\n </mat-select> \r\n </mat-form-field>\r\n </div>\r\n \r\n\r\n \r\n \r\n <div class=\"row\"> \r\n \r\n <mat-form-field>\r\n <mat-label>Goal Status Date:</mat-label>\r\n <input matInput \r\n formControlName=\"goalStatusDate\" \r\n [matDatepicker]=\"goalStatusDate\" \r\n placeholder=\"Choose a date\" [(ngModel)]=\"editSafetyPlan.startDate\" \r\n (click)=\"goalStatusDate.open()\" \r\n >\r\n \r\n <mat-datepicker-toggle matSuffix [for]=\"goalStatusDate\"></mat-datepicker-toggle>\r\n <mat-datepicker #goalStatusDate></mat-datepicker> \r\n </mat-form-field> \r\n\r\n\r\n <div class=\"help-block\" \r\n *ngIf=\"spForm.get('goalStatusDate').hasError('date') \r\n && (spForm.get('goalStatusDate').dirty || spForm.get('goalStatusDate').touched)\">\r\n <mat-error>Future Date is <strong>not allowed</strong> for goal status date</mat-error>\r\n </div>\r\n </div>\r\n\r\n \r\n <div class=\"row\" > \r\n <!-- <mat-form-field style=\"width: 200px;\"> -->\r\n <!-- <mat-label>Comment:</mat-label> \r\n <textarea mdInput \r\n class=\"textarea-content\"\r\n [(ngModel)]=\"editSafetyPlan.comment\"\r\n formControlName=\"comment\" \r\n cdkTextareaAutosize\r\n #autosize=\"cdkTextareaAutosize\"\r\n cdkAutosizeMinRows=\"8\"\r\n cdkAutosizeMaxRows=\"12\"\r\n >\r\n </textarea> -->\r\n <!-- </mat-form-field> -->\r\n\r\n\r\n\r\n <mat-form-field style=\"width: 400px;\">\r\n <mat-label>Comment:</mat-label>\r\n <textarea \r\n class=\"textarea-content\"\r\n matInput \r\n placeholder=\"\" \r\n formControlName=\"comment\" \r\n [(ngModel)]=\"editSafetyPlan.comment\"\r\n cdkTextareaAutosize\r\n #autosize=\"cdkTextareaAutosize\"\r\n cdkAutosizeMinRows=\"8\"\r\n cdkAutosizeMaxRows=\"12\">\r\n </textarea> \r\n\r\n \r\n </mat-form-field>\r\n\r\n </div>\r\n\r\n </form>\r\n </div><!--end form-->\r\n \r\n \r\n <br>\r\n\r\n <div class=\"row\"><b>Need and provider:</b><br> (click on a check box to select provider information)\r\n \r\n <mat-list>\r\n <mat-list-item *ngFor=\"let serviceType of victimServiceTypes; let i=index\" >\r\n <mat-checkbox class=\"example-margin\" name=\"victimService\" color =\"primary\" [checked]=\"evaluateSelection(serviceType.victimServiceTypeId)\" (change)=\"isInArray(serviceType.victimServiceTypeId,serviceType.name, $event);\" > {{serviceType.name}}</mat-checkbox>\r\n <div> </div>\r\n <div *ngFor=\"let provider of providerListCollection; let pi = index\" >\r\n <!-- <div *ngIf=\"provider.isDisplay && serviceType.victimServiceTypeId == provider.groupId \" class=\"Row\">\r\n \r\n <div class=\"serviceSelect\"> -->\r\n <!-- <mat-form-field> -->\r\n <!-- <mat-select name=\"provider\" id=\"provider.groupId\" [(ngModel)]=\"providerId\" > -->\r\n <!-- <mat-select name=\"provider\" id=\"provider.groupId\" [(value)]=\"providerId\" > \r\n <mat-option *ngFor=\" let providerOption of provider.collection\" [value]=\"providerOption.victimProgramProviderId\" >{{providerOption.victimProgramProvider}}</mat-option>\r\n </mat-select> -->\r\n <!-- </mat-form-field> -->\r\n \r\n <!-- </div>\r\n\r\n <div class=\"serviceButton\">\r\n <button mat-raised-button color=\"primary\" (click)=\"savePlanProvider(serviceType.victimServiceTypeId ,providerId)\">Add Provider</button>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div *ngFor=\" let serviceprovider of editSafetyPlan.vVictimServiceDetails\" >\r\n \r\n <div *ngIf=\"serviceType.victimServiceTypeId===serviceprovider.victimServiceTypeId\" class=\"Row\" >\r\n <!-- . {{ serviceprovider.victimProgramProvider}}<button mat-raised-button color=\"primary\" (click)=\"deleteProvider(serviceprovider.victimServiceDetailId)\">Delete</button> <br> -->\r\n <div class=\"serviceSelect\" >\r\n . {{ serviceprovider.victimProgramProvider}}\r\n </div>\r\n <div class=\"serviceButton\">\r\n <button mat-raised-button color=\"primary\" (click)=\"deleteProvider(serviceprovider.victimServiceDetailId)\">Delete</button> \r\n </div>\r\n \r\n </div>\r\n \r\n </div>\r\n \r\n </mat-list-item> \r\n \r\n </mat-list>\r\n </div>\r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n \r\n \r\n <!-- <div class='row' >\r\n <div class='col-md-5 desc-label'><b>Victim Name:</b> {{victimName}} </div>\r\n <div class='col-md-7'> \r\n \r\n </div> \r\n </div> -->\r\n <!-- <div class='row' >\r\n <div class='col-md-5 desc-label'><b>Goal:<font color=\"red\">*</font></b></div>\r\n <div class='col-md-7'> \r\n <mat-form-field >\r\n <input matInput name=\"serviceGoal\" [(ngModel)]=\"editSafetyPlan.goal\" required placeholder=\"\">\r\n </mat-form-field>\r\n </div> \r\n </div>\r\n\r\n <div class='row' >\r\n <div class='col-md-5 desc-label'><b>Goal Status:<font color=\"red\">*</font></b></div>\r\n <div class='col-md-7'> \r\n <mat-select name=\"goalStatus\" [style.width]=\"'50%'\" [(ngModel)]=\"editSafetyPlan.victimServiceStatusId\" required>\r\n <mat-option *ngFor=\" let victimServiceStatu of victimServiceStatus\" [value]=\"victimServiceStatu.victimServiceStatusId\" >{{victimServiceStatu.name}}</mat-option>\r\n </mat-select>\r\n </div> \r\n </div>\r\n \r\n <div class='row' >\r\n <div class='col-md-5 desc-label'><b>Goal Status Date:<font color=\"red\">*</font></b></div>\r\n <div class='col-md-7'> \r\n <input matInput name=\"goalStatusDate\" [matDatepicker]=\"goalStatusDate\" placeholder=\"Choose a date\" [(ngModel)]=\"editSafetyPlan.startDate\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"goalStatusDate\"></mat-datepicker-toggle>\r\n <mat-datepicker #goalStatusDate></mat-datepicker> \r\n </div> \r\n </div>\r\n \r\n <div class='row' >\r\n <div class='col-md-5 desc-label'><b>Comment:</b></div>\r\n <div class='col-md-7'> \r\n <textarea mdInput placeholder=\"\" rows=\"10\" cols=\"50\" name=\"comment\" [(ngModel)]=\"editSafetyPlan.comment\"></textarea> \r\n </div> \r\n </div> -->\r\n\r\n \r\n <div class='row' >\r\n <div class='col-md-12 text-center'>\r\n <!-- <button type=\"button\" class=\"btn btn-default btn-small\" (click)=\"print()\">Print</button> -->\r\n <button mat-raised-button color=\"primary\" (click)=\"saveSafetyPlan()\" [disabled]=\"!spForm.valid\">Save</button>\r\n <!-- <button mat-raised-button color=\"primary\" (click)=\"commondialogRef.close()\">Cancel</button> -->\r\n <button mat-raised-button color=\"primary\" (click)=\"back()\">Back</button>\r\n </div> \r\n </div> \r\n\r\n <!--status hisotry-->\r\n \r\n <mat-table #table [dataSource]=\"victimServiceStatusHistoriesDataSource\" class=\"example-table\">\r\n <ng-container matColumnDef=\"startDate\">\r\n <mat-header-cell *matHeaderCellDef class=\"example-header-cell\">Start Date</mat-header-cell>\r\n <mat-cell *matCellDef=\"let row\" class=\"example-cell\"> {{row.startDate | date}} </mat-cell>\r\n </ng-container>\r\n\r\n\r\n <ng-container matColumnDef=\"victimServiceStatusId\">\r\n <mat-header-cell *matHeaderCellDef class=\"example-header-cell\">Status</mat-header-cell>\r\n <mat-cell *matCellDef=\"let row\" class=\"example-cell\"> {{row.victimServiceStatusId}} </mat-cell>\r\n </ng-container>\r\n \r\n \r\n <ng-container matColumnDef=\"comment\">\r\n <mat-header-cell *matHeaderCellDef class=\"example-header-cell\">Comment</mat-header-cell>\r\n <mat-cell *matCellDef=\"let row\" class=\"example-cell\"> {{row.comment}} </mat-cell>\r\n </ng-container>\r\n <mat-header-row *matHeaderRowDef=\"[ 'startDate', 'victimServiceStatusId', 'comment']\" class=\"example-header-row\"></mat-header-row>\r\n <mat-row *matRowDef=\"let row; columns:[ 'startDate', 'victimServiceStatusId', 'comment'];\" class=\"example-row\"></mat-row>\r\n </mat-table>\r\n\r\n \r\n \r\n\r\n</mat-card-content>\r\n</mat-card>",
|
446
|
-
providers: [CommonDialogService],
|
447
|
-
styles: ["div.serviceSelect{width:500px}div.serviceButton{width:20%}.container{margin:16px;display:-ms-grid;display:grid;-ms-grid-columns:(1fr)[2];grid-template-columns:repeat(2,1fr);grid-gap:10px;grid-auto-rows:minmax(50px,auto);justify-items:stretch}.app-class .mat-list-item{height:auto}.textarea-content{width:500px}"]
|
448
|
-
}] }
|
449
|
-
];
|
450
|
-
/** @nocollapse */
|
451
|
-
VictimSafetyPlanDetailComponent.ctorParameters = () => [
|
452
|
-
{ type: MatDialog },
|
453
|
-
{ type: NgcSmartVictimService },
|
454
|
-
{ type: HttpClient },
|
455
|
-
{ type: MatSnackBar },
|
456
|
-
{ type: ActivatedRoute },
|
457
|
-
{ type: Router },
|
458
|
-
{ type: CommonDialogService },
|
459
|
-
{ type: FormBuilder }
|
460
|
-
];
|
461
|
-
if (false) {
|
462
|
-
/** @type {?} */
|
463
|
-
VictimSafetyPlanDetailComponent.prototype.hiddenAddNewFlag;
|
464
|
-
/** @type {?} */
|
465
|
-
VictimSafetyPlanDetailComponent.prototype.safetyPlans;
|
466
|
-
/** @type {?} */
|
467
|
-
VictimSafetyPlanDetailComponent.prototype.safetyPlan;
|
468
|
-
/** @type {?} */
|
469
|
-
VictimSafetyPlanDetailComponent.prototype.editSafetyPlan;
|
470
|
-
/** @type {?} */
|
471
|
-
VictimSafetyPlanDetailComponent.prototype.errorMessage;
|
472
|
-
/** @type {?} */
|
473
|
-
VictimSafetyPlanDetailComponent.prototype.contactTypes;
|
474
|
-
/** @type {?} */
|
475
|
-
VictimSafetyPlanDetailComponent.prototype.contactPurposes;
|
476
|
-
/** @type {?} */
|
477
|
-
VictimSafetyPlanDetailComponent.prototype.victimServiceTypes;
|
478
|
-
/** @type {?} */
|
479
|
-
VictimSafetyPlanDetailComponent.prototype.victimSafetyPlans;
|
480
|
-
/** @type {?} */
|
481
|
-
VictimSafetyPlanDetailComponent.prototype.victimServiceStatus;
|
482
|
-
/** @type {?} */
|
483
|
-
VictimSafetyPlanDetailComponent.prototype.providerList;
|
484
|
-
/** @type {?} */
|
485
|
-
VictimSafetyPlanDetailComponent.prototype.providerListCollection;
|
486
|
-
/** @type {?} */
|
487
|
-
VictimSafetyPlanDetailComponent.prototype.victimServiceDetail;
|
488
|
-
/** @type {?} */
|
489
|
-
VictimSafetyPlanDetailComponent.prototype.indx;
|
490
|
-
/** @type {?} */
|
491
|
-
VictimSafetyPlanDetailComponent.prototype.serviceCheck;
|
492
|
-
/** @type {?} */
|
493
|
-
VictimSafetyPlanDetailComponent.prototype.victimName;
|
494
|
-
/** @type {?} */
|
495
|
-
VictimSafetyPlanDetailComponent.prototype.isDisplay;
|
496
|
-
/** @type {?} */
|
497
|
-
VictimSafetyPlanDetailComponent.prototype.staffId;
|
498
|
-
/** @type {?} */
|
499
|
-
VictimSafetyPlanDetailComponent.prototype.victimId;
|
500
|
-
/** @type {?} */
|
501
|
-
VictimSafetyPlanDetailComponent.prototype.victimServiceId;
|
502
|
-
/** @type {?} */
|
503
|
-
VictimSafetyPlanDetailComponent.prototype.offenderId;
|
504
|
-
/** @type {?} */
|
505
|
-
VictimSafetyPlanDetailComponent.prototype.loginStaff;
|
506
|
-
/**
|
507
|
-
* @type {?}
|
508
|
-
* @private
|
509
|
-
*/
|
510
|
-
VictimSafetyPlanDetailComponent.prototype.sub;
|
511
|
-
/** @type {?} */
|
512
|
-
VictimSafetyPlanDetailComponent.prototype.result;
|
513
|
-
/** @type {?} */
|
514
|
-
VictimSafetyPlanDetailComponent.prototype.victimServiceStatusHistoriesDataSource;
|
515
|
-
/** @type {?} */
|
516
|
-
VictimSafetyPlanDetailComponent.prototype.providerId;
|
517
|
-
/** @type {?} */
|
518
|
-
VictimSafetyPlanDetailComponent.prototype.selected;
|
519
|
-
/** @type {?} */
|
520
|
-
VictimSafetyPlanDetailComponent.prototype.spForm;
|
521
|
-
/** @type {?} */
|
522
|
-
VictimSafetyPlanDetailComponent.prototype.dialog;
|
523
|
-
/**
|
524
|
-
* @type {?}
|
525
|
-
* @private
|
526
|
-
*/
|
527
|
-
VictimSafetyPlanDetailComponent.prototype._victimServicesComponent;
|
528
|
-
/**
|
529
|
-
* @type {?}
|
530
|
-
* @private
|
531
|
-
*/
|
532
|
-
VictimSafetyPlanDetailComponent.prototype.http;
|
533
|
-
/** @type {?} */
|
534
|
-
VictimSafetyPlanDetailComponent.prototype.snackBar;
|
535
|
-
/**
|
536
|
-
* @type {?}
|
537
|
-
* @private
|
538
|
-
*/
|
539
|
-
VictimSafetyPlanDetailComponent.prototype.route;
|
540
|
-
/**
|
541
|
-
* @type {?}
|
542
|
-
* @private
|
543
|
-
*/
|
544
|
-
VictimSafetyPlanDetailComponent.prototype.router;
|
545
|
-
/**
|
546
|
-
* @type {?}
|
547
|
-
* @private
|
548
|
-
*/
|
549
|
-
VictimSafetyPlanDetailComponent.prototype.commonDialogService;
|
550
|
-
/**
|
551
|
-
* @type {?}
|
552
|
-
* @private
|
553
|
-
*/
|
554
|
-
VictimSafetyPlanDetailComponent.prototype.formBuilder;
|
555
|
-
}
|
556
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmljdGltU2FmZXR5UGxhbkRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY3NtYXJ0L25nYy1zbWFydC12aWN0aW0vIiwic291cmNlcyI6WyJsaWIvc2FmZXR5UGxhbi92aWN0aW1TYWZldHlQbGFuRGV0YWlsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQWEsV0FBVyxFQUFDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSWhGLE9BQU8sRUFBRSxXQUFXLEVBQUMsa0JBQWtCLEVBQUMsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0UsT0FBTyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFVBQVUsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLGFBQWEsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQTtBQVVoRixNQUFNLE9BQU8sK0JBQStCOzs7Ozs7Ozs7OztJQWtDMUMsWUFDUyxNQUFpQixFQUNoQix3QkFBK0MsRUFDL0MsSUFBZ0IsRUFDakIsUUFBcUIsRUFDcEIsS0FBcUIsRUFDckIsTUFBYyxFQUNkLG1CQUF3QyxFQUN4QyxXQUF3QjtRQVB6QixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2hCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBdUI7UUFDL0MsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQ3BCLFVBQUssR0FB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LFVBQVU7WUFGVixXQUFXO1lBSUgsY0FBYztZQUF0QixNQUFNO1lBSE4sbUJBQW1CO1lBTEssV0FBVzs7OztJQXlCMUMsMkRBQTBCOztJQUMxQixzREFBZ0M7O0lBQ2hDLHFEQUE2Qjs7SUFDN0IseURBQXdEOztJQUN4RCx1REFBcUI7O0lBQ3JCLHVEQUFvQjs7SUFDcEIsMERBQXVCOztJQUN2Qiw2REFBMEI7O0lBQzFCLDREQUFzQzs7SUFDdEMsOERBQTJCOztJQUMzQix1REFBc0Q7O0lBQ3RELGlFQUF3RDs7SUFDeEQsOERBQTJDOztJQUMzQywrQ0FBUzs7SUFDVCx1REFBa0I7O0lBQ2xCLHFEQUFtQjs7SUFDbkIsb0RBQW1COztJQUNuQixrREFBZ0I7O0lBQ2hCLG1EQUFpQjs7SUFDakIsMERBQXdCOztJQUN4QixxREFBbUI7O0lBQ25CLHFEQUF1Qjs7Ozs7SUFDdkIsOENBQWlCOztJQUNqQixpREFBWTs7SUFDWixpRkFBa0U7O0lBQ2xFLHFEQUFtQjs7SUFDbkIsbURBQWlCOztJQUdqQixpREFBa0I7O0lBR2hCLGlEQUF3Qjs7Ozs7SUFDeEIsbUVBQXVEOzs7OztJQUN2RCwrQ0FBd0I7O0lBQ3hCLG1EQUE0Qjs7Ozs7SUFDNUIsZ0RBQTZCOzs7OztJQUM3QixpREFBc0I7Ozs7O0lBQ3RCLDhEQUFnRDs7Ozs7SUFDaEQsc0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5nY1NtYXJ0VmljdGltU2VydmljZSB9IGZyb20gJy4uL3NtYXJ0LXZpY3RpbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVmljdGltU2FmZXR5UGxhbixWaWN0aW1TZXJ2aWNlRGV0YWlsLFxyXG4gIFZpY3RpbVNlcnZpY2VTdGF0dXNIaXN0b3J5LFZpY3RpbVNlcnZpY2VUeXBlUHJvZ3JhbVByb3ZpZGVyTW9kZWwsXHJcbiAgUHJvdmlkZXJMaXN0Q29sbGVjdGlvbk1vZGVsIH0gZnJvbSAnLi4vc21hcnQtdmljdGltLm1vZGVsJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIsTWF0VGFibGVEYXRhU291cmNlLE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcclxuaW1wb3J0IHsgQ29tbW9uRGlhbG9nU2VydmljZX0gZnJvbSAnLi4vLi9jb21tb24tZGlhbG9nL2NvbW1vbi1kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTZWxlY3RlZE9mZmVuZGVyLCBMb2dpblN0YWZmIH0gZnJvbSAnQGNzbWFydC9uZ2Mtc21hcnQtY29yZSc7XHJcbmltcG9ydCB7IGRhdGVWYWxpZGF0b3IsIHBhc3NEYXRlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2hhcmVkL3ZhbGlkYXRvcnMnO1xyXG5pbXBvcnQgeyB0eXBlU291cmNlU3BhbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcclxuaW1wb3J0IHsgU2VyaXZlUHJvdmlkZXJDb21wb25lbnR9IGZyb20gJy4uL3NhZmV0eVBsYW4vc2VydmljZVByb3ZpZGVyLmNvbXBvbmVudCdcclxuaW1wb3J0IHsgUHJvdmlkZXJzRGlhbG9nRGF0YX0gZnJvbSAnLi4vc21hcnQtdmljdGltLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlVXJsOiAnLi92aWN0aW1TYWZldHlQbGFuRGV0YWlsLmNvbXBvbmVudC5odG1sJyxcclxuICBwcm92aWRlcnM6IFtDb21tb25EaWFsb2dTZXJ2aWNlXSxcclxuICBzdHlsZVVybHM6IFsnLi92aWN0aW1TYWZldHlQbGFuLmNvbXBvbmVudC5jc3MnXVxyXG4gXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgVmljdGltU2FmZXR5UGxhbkRldGFpbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG5cclxuICBoaWRkZW5BZGROZXdGbGFnOiBib29sZWFuO1xyXG4gIHNhZmV0eVBsYW5zOiBWaWN0aW1TYWZldHlQbGFuW107XHJcbiAgc2FmZXR5UGxhbjogVmljdGltU2FmZXR5UGxhbjtcclxuICBlZGl0U2FmZXR5UGxhbjogVmljdGltU2FmZXR5UGxhbiA9IDxWaWN0aW1TYWZldHlQbGFuPnt9O1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gIGNvbnRhY3RUeXBlczogYW55W107XHJcbiAgY29udGFjdFB1cnBvc2VzOiBhbnlbXTtcclxuICB2aWN0aW1TZXJ2aWNlVHlwZXM6IGFueVtdO1xyXG4gIHZpY3RpbVNhZmV0eVBsYW5zOiBWaWN0aW1TYWZldHlQbGFuW107XHJcbiAgdmljdGltU2VydmljZVN0YXR1czogYW55W107XHJcbiAgcHJvdmlkZXJMaXN0OiBWaWN0aW1TZXJ2aWNlVHlwZVByb2dyYW1Qcm92aWRlck1vZGVsW107XHJcbiAgcHJvdmlkZXJMaXN0Q29sbGVjdGlvbjpQcm92aWRlckxpc3RDb2xsZWN0aW9uTW9kZWxbXT1bXTtcclxuICB2aWN0aW1TZXJ2aWNlRGV0YWlsOiBWaWN0aW1TZXJ2aWNlRGV0YWlsW107XHJcbiAgaW5keDphbnk7XHJcbiAgc2VydmljZUNoZWNrID0gW107XHJcbiAgdmljdGltTmFtZTogc3RyaW5nO1xyXG4gIGlzRGlzcGxheTogYm9vbGVhbjtcclxuICBzdGFmZklkOiBudW1iZXI7XHJcbiAgdmljdGltSWQ6IG51bWJlcjtcclxuICB2aWN0aW1TZXJ2aWNlSWQ6IG51bWJlcjtcclxuICBvZmZlbmRlcklkOiBudW1iZXI7XHJcbiAgbG9naW5TdGFmZjogTG9naW5TdGFmZjtcclxuICBwcml2YXRlIHN1YjogYW55O1xyXG4gIHJlc3VsdDogYW55O1xyXG4gIHZpY3RpbVNlcnZpY2VTdGF0dXNIaXN0b3JpZXNEYXRhU291cmNlPSBuZXcgIE1hdFRhYmxlRGF0YVNvdXJjZSgpO1xyXG4gIHByb3ZpZGVySWQ6IHN0cmluZztcclxuICBzZWxlY3RlZDogc3RyaW5nO1xyXG5cclxuXHJcbiAgc3BGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBfdmljdGltU2VydmljZXNDb21wb25lbnQ6IE5nY1NtYXJ0VmljdGltU2VydmljZSxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHB1YmxpYyBzbmFja0JhcjogTWF0U25hY2tCYXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGNvbW1vbkRpYWxvZ1NlcnZpY2U6IENvbW1vbkRpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgICBcclxuICApIHtcclxuXHJcbiAgICB0aGlzLmluaXRGb3JtKCk7XHJcbiAgIH1cclxuXHJcbiAgIHByaXZhdGUgaW5pdEZvcm0oKSB7XHJcblxyXG5cdFxyXG5cdFx0XHR0aGlzLnNwRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICAgIHNlcnZpY2VHb2FsOiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMuY29tcG9zZShbXHJcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkXHRcdCAgXSkpLFxyXG4gICAgICAgICAgZ29hbFN0YXR1czogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1xyXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkXHRcdCAgXSkpLFxyXG4gICAgICAgICAgZ29hbFN0YXR1c0RhdGU6IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtcclxuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxkYXRlVmFsaWRhdG9yKClcdFx0ICBdKSksXHJcbiAgICAgICAgICBjb21tZW50OiBuZXcgRm9ybUNvbnRyb2woJycsVmFsaWRhdG9ycy5yZXF1aXJlZClcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuc3BGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgIHRoaXMuc3BGb3JtLm1hcmtBc1VudG91Y2hlZCgpO1xyXG4gICAgICBcclxuICAgIH1cclxuIFxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIFxyXG5cclxuICAgIHZhciBkYXRhID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhO1xyXG4gICAgdGhpcy5sb2dpblN0YWZmID0gZGF0YS5sb2dpblN0YWZmO1xyXG4gICAgdGhpcy5zdGFmZklkID0gIHRoaXMubG9naW5TdGFmZi5zdGFmZklkO1xyXG5cclxuICAgIHRoaXMuc3ViID0gdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XHJcbiAgICAgIHRoaXMudmljdGltU2VydmljZUlkID0gcGFyYW1zWyd2aWN0aW1TZXJ2aWNlSWQnXTtcclxuICAgICAgdGhpcy52aWN0aW1JZCA9IHBhcmFtc1sndmljdGltSWQnXTtcclxuIFxyXG4gICAgfSk7XHJcbiAgIFxyXG4gICAgdGhpcy5oaWRkZW5BZGROZXdGbGFnID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzRGlzcGxheSA9IGZhbHNlO1xyXG4gICBcclxuIFxyXG5cclxuICAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5nZXRWaWN0aW1TZXJ2aWNlVHlwZXMoKS5zdWJzY3JpYmUoXHJcbiAgICAgIChpdGVtczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy52aWN0aW1TZXJ2aWNlVHlwZXMgPSBpdGVtcztcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5nZXRWaWN0aW1TZXJ2aWNlU3RhdHVzKCkuc3Vic2NyaWJlKFxyXG4gICAgICAoaXRlbXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudmljdGltU2VydmljZVN0YXR1cyA9IGl0ZW1zO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuX3ZpY3RpbVNlcnZpY2VzQ29tcG9uZW50LmdldFZpY3RpbSh0aGlzLnZpY3RpbUlkKS5zdWJzY3JpYmUoXHJcbiAgICAgIChpdGVtczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy52aWN0aW1OYW1lID0gaXRlbXMuZmlyc3ROYW1lICsgJywgJyArIGl0ZW1zLmxhc3ROYW1lO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuIFxyXG4gICAgIFxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tZ3JhcGhRTC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIC8vIHRoaXMuZ2V0VmljdGltU2VydmljZVR5cGVQcm9ncmFtUHJvdmlkZXJzKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIC8vIHRoaXMucHJvdmlkZXJMaXN0ID0gcmVzdWx0O1xyXG4gICAgICAvLyB9KTtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMudmljdGltU2VydmljZUlkJyk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudmljdGltU2VydmljZUlkKTtcclxuICAgICBcclxuICAgIGlmICh0aGlzLnZpY3RpbVNlcnZpY2VJZCE9MCl7XHJcbiAgICAgIHRoaXMuX3ZpY3RpbVNlcnZpY2VzQ29tcG9uZW50LmdldFZpY3RpbVNlcnZpY2VzKHRoaXMudmljdGltU2VydmljZUlkKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgdmljdGltU2FmZXR5UGxhbnMgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ3ZpY3RpbVNhZmV0eVBsYW5zJyk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyh2aWN0aW1TYWZldHlQbGFucyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5lZGl0U2FmZXR5UGxhbiA9IHZpY3RpbVNhZmV0eVBsYW5zWzBdO1xyXG4gICAgICAgICAgdGhpcy52aWN0aW1JZCA9ICB2aWN0aW1TYWZldHlQbGFuc1swXS52aWN0aW1JZDtcclxuICAgICAgICBcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmVkaXRTYWZldHlQbGFuJyk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmVkaXRTYWZldHlQbGFuKTtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmVkaXRTYWZldHlQbGFuLmdvYWwnKTtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZWRpdFNhZmV0eVBsYW4uZ29hbCk7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygndGhpcy5lZGl0U2FmZXR5UGxhblswXS5nb2FsJyk7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmVkaXRTYWZldHlQbGFuWzBdLmdvYWwpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5nZXRTZXJ2aWNlU3RhdHVzSGlzdG9yaWVzKHRoaXMudmljdGltU2VydmljZUlkKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgdmljdGltU2VydmljZVN0YXR1c0hpc3RvcmllcyA9PiB7XHJcbiAgICAgICAgLy8gdGhpcy52aWN0aW1TZXJ2aWNlU3RhdHVzSGlzdG9yaWVzID0gdmljdGltU2VydmljZVN0YXR1c0hpc3RvcmllcztcclxuICAgICAgICB0aGlzLnZpY3RpbVNlcnZpY2VTdGF0dXNIaXN0b3JpZXNEYXRhU291cmNlLmRhdGEgPSB2aWN0aW1TZXJ2aWNlU3RhdHVzSGlzdG9yaWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkUHJvdmlkZXIoKTtcclxuIFxyXG4gIH1cclxuICAvL3Bhc3MgaW4gaWRcclxuaXNJbkFycmF5KHByb3ZpZGVyTGlzdENvbGxlY3Rpb25LZXk6c3RyaW5nLCBzZXJ2aWNlVHlwZU5hbWU6IHN0cmluZywgZXZlbnQpe1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdwcm92aWRlckxpc3RDb2xsZWN0aW9uS2V5Jyk7XHJcbiAgICBjb25zb2xlLmxvZyhwcm92aWRlckxpc3RDb2xsZWN0aW9uS2V5KTtcclxuXHJcblxyXG4gICAgY29uc29sZS5sb2coJ3NlcnZpY2VUeXBlTmFtZScpO1xyXG4gICAgY29uc29sZS5sb2coc2VydmljZVR5cGVOYW1lKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnZXZlbnQuc291cmNlLnZhbHVlJyk7XHJcbiAgICBjb25zb2xlLmxvZyhldmVudC5jaGVja2VkKTtcclxuXHJcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCA9PSB0cnVlKXtcclxuXHJcbiAgICAgIGZvcihsZXQgaj0wO2o8dGhpcy5wcm92aWRlckxpc3RDb2xsZWN0aW9uLmxlbmd0aDtqKyspe1xyXG4gICAgICAgIGlmKHByb3ZpZGVyTGlzdENvbGxlY3Rpb25LZXk9PXRoaXMucHJvdmlkZXJMaXN0Q29sbGVjdGlvbltqXS5ncm91cElkKXtcclxuICAgICAgICAgIHRoaXMucHJvdmlkZXJMaXN0Q29sbGVjdGlvbltqXS5pc0Rpc3BsYXk9IXRoaXMucHJvdmlkZXJMaXN0Q29sbGVjdGlvbltqXS5pc0Rpc3BsYXk7XHJcblxyXG4gICAgIFxyXG5cclxuICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihTZXJpdmVQcm92aWRlckNvbXBvbmVudCwge1xyXG4gICAgICAgICAgd2lkdGg6ICc1MDBweCcsXHJcbiAgICAgICAgICBkYXRhOiA8UHJvdmlkZXJzRGlhbG9nRGF0YT57XHJcbiAgICAgICAgICBcclxuICAgICAgICAgICBzZXJ2aWNlVHlwZTpzZXJ2aWNlVHlwZU5hbWUsXHJcbiAgICAgICAgICAgc2VydmljZVR5cGVJZDogcHJvdmlkZXJMaXN0Q29sbGVjdGlvbktleSxcclxuICAgICAgICAgICBwcm92aWRlckNvbGxlY3Rpb25zOiBbLi4udGhpcy5wcm92aWRlckxpc3RDb2xsZWN0aW9uXSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwYW5lbENsYXNzOiAnZm9ybUZpZWxkV2lkdGg0ODAnLFxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdUaGUgZGlhbG9nIHdhcyBjbG9zZWQnKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XHJcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUaGUgZGlhbG9nIHdhcyBjbG9zZWQsIGluc2lkZSByZXN1bHQnKTtcclxuICAgICAgICAgICAgdGhpcy5zYXZlUGxhblByb3ZpZGVyKHByb3ZpZGVyTGlzdENvbGxlY3Rpb25LZXkscmVzdWx0LnZvdGVlUHJvdmlkZXJJZCk7XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICB9KTtcclxuICBcclxuICAgICAgICAgLy8gcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0vL2lmIGV2ZW50LmNoZWNrZWQgPT0gdHJ1ZVxyXG4gICAgIC8vdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydzYWZ0eVBsYW5EZXRhaWwnLCB0aGlzLnZpY3RpbVNlcnZpY2VJZCwgIHRoaXMudmljdGltSWQgXSk7IFxyXG4gICAgICBcclxuICB9XHJcblxyXG5sb2FkUHJvdmlkZXIoKXsgXHJcblxyXG4gdGhpcy5wcm92aWRlckxpc3RDb2xsZWN0aW9uPVtdO1xyXG4gICAgdGhpcy5fdmljdGltU2VydmljZXNDb21wb25lbnQuZ2V0dlZpY3RpbVNlcnZpY2VUeXBlUHJvZ3JhbVByb3ZpZGVycygpXHJcbiAgICAgLnN1YnNjcmliZShcclxuICAgICAgKHByb3ZpZGVyTGlzdDpWaWN0aW1TZXJ2aWNlVHlwZVByb2dyYW1Qcm92aWRlck1vZGVsW10gKT0+eyBcclxuICAgICAgICBpZihwcm92aWRlckxpc3Qpe1xyXG4gICBcclxuICAgICAgICAgIGxldCBwcm92aWRlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gICAgICAgICAgZm9yKGxldCBpPTA7aTxwcm92aWRlckxpc3QubGVuZ3RoO2krKyl7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoIXByb3ZpZGVyc1twcm92aWRlckxpc3RbaV0udmljdGltU2VydmljZVR5cGVJZF0pIHtcclxuICAgICAgICAgICAgICBwcm92aWRlcnNbcHJvdmlkZXJMaXN0W2ldLnZpY3RpbVNlcnZpY2VUeXBlSWRdID0gW107XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICBpZiAoIHRoaXMuZWRpdFNhZmV0eVBsYW4udlZpY3RpbVNlcnZpY2VEZXRhaWxzICE9IG51bGwgKXtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8dGhpcy5lZGl0U2FmZXR5UGxhbi52VmljdGltU2VydmljZURldGFpbHMubGVuZ3RoOyBqKyspe1xyXG4gICAgICAgICAgICAgICAgaWYgKCBwcm92aWRlckxpc3RbaV0udmljdGltU2VydmljZVR5cGVJZCA9PSB0aGlzLmVkaXRTYWZldHlQbGFuLnZWaWN0aW1TZXJ2aWNlRGV0YWlsc1tqXS52aWN0aW1TZXJ2aWNlSWQudG9TdHJpbmcoKSApe1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmlzRGlzcGxheSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5wcm92aWRlckxpc3RDb2xsZWN0aW9uLnB1c2goeyBncm91cElkOiBwcm92aWRlckxpc3RbaV0udmljdGltU2VydmljZVR5cGVJZCxpc0Rpc3BsYXk6dGhpcy5pc0Rpc3BsYXksIGNvbGxlY3Rpb246IHByb3ZpZGVyc1twcm92aWRlckxpc3RbaV0udmljdGltU2VydmljZVR5cGVJZF0gfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHByb3ZpZGVyc1twcm92aWRlckxpc3RbaV0udmljdGltU2VydmljZVR5cGVJZF0ucHVzaChwcm92aWRlckxpc3RbaV0pO1xyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICBcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcblxyXG4gIH1cclxuLy8tLS0tLS0tLS0tLS0tLS1ncmFwaFFMLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gICBnZXRWaWN0aW1TZXJ2aWNlVHlwZVByb2dyYW1Qcm92aWRlcnMoKTogT2JzZXJ2YWJsZTxWaWN0aW1TZXJ2aWNlVHlwZVByb2dyYW1Qcm92aWRlck1vZGVsW10+IHtcclxuLy8gICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gYFxyXG4vLyAgICAgICAgIHtcclxuLy8gICAgICAgICAgIGZpbmRWaWN0aW1TZXJ2aWNlVHlwZVByb2dyYW1Qcm92aWRlcnMge1xyXG4vLyAgICAgICAgICAgICAgICAgZGF0YSB7XHJcbi8vICAgICAgICAgICAgICAgICAgIHZpY3RpbVNlcnZpY2VUeXBlUHJvZ3JhbVByb3ZpZGVySWRcclxuLy8gICAgICAgICAgICAgICAgICAgdmljdGltU2VydmljZVR5cGVcclxuLy8gICAgICAgICAgICAgICAgICAgdmljdGltUHJvZ3JhbVByb3ZpZGVyXHJcbi8vICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgIH1gO1xyXG4gXHJcbi8vICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihlbnZpcm9ubWVudC5zbWFydEFwaVVybCwgeyBxdWVyeTogcXVlcnlTdHJpbmcgfSlcclxuLy8gICAgICAgICAubWFwKHJlc3VsdCA9PiB7XHJcbi8vICAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhLmZpbmRWaWN0aW1TZXJ2aWNlVHlwZVByb2dyYW1Qcm92aWRlcnMuZGF0YTtcclxuLy8gICAgIH0pO1xyXG4vLyB9XHJcblxyXG4gIGV2YWx1YXRlU2VsZWN0aW9uKHZpY3RpbVNlcnZpY2VUeXBlSWQ6IHN0cmluZykge1xyXG4gICBpZiAodGhpcy5lZGl0U2FmZXR5UGxhbi52VmljdGltU2VydmljZURldGFpbHMpIHtcclxuICAgIHJldHVybiB0aGlzLmVkaXRTYWZldHlQbGFuLnZWaWN0aW1TZXJ2aWNlRGV0YWlscy5maW5kSW5kZXgociA9PiByLnZpY3RpbVNlcnZpY2VUeXBlSWQgPT09IHZpY3RpbVNlcnZpY2VUeXBlSWQpID49IDA7XHJcbiAgIH1cclxuICB9XHJcblxyXG5cclxuc2F2ZVBsYW5Qcm92aWRlcih2aWN0aW1TZXJ2aWNlVHlwZUlkOiBzdHJpbmcsdmljdGltUHJvZ3JhbVByb3ZpZGVySWQ6IHN0cmluZyl7XHJcblxyXG4gIGNvbnNvbGUubG9nKCdzYXZlUGxhblByb3ZpZGVyJyk7XHJcbiAgY29uc29sZS5sb2codmljdGltU2VydmljZVR5cGVJZCk7XHJcbiAgY29uc29sZS5sb2codmljdGltUHJvZ3JhbVByb3ZpZGVySWQpO1xyXG5cclxuICBpZiAodmljdGltUHJvZ3JhbVByb3ZpZGVySWQgPT09IFwiXCIgfHwgdmljdGltUHJvZ3JhbVByb3ZpZGVySWQ9PT0gbnVsbCB8fCB2aWN0aW1Qcm9ncmFtUHJvdmlkZXJJZCA9PT0gdW5kZWZpbmVkKXtcclxuICBcclxuICAgIHRoaXMuc25hY2tCYXIub3BlbignUGxlYXNlIHBpY2sgYSBwcm9ncmFtIG9uIHRoZSBkcm9wIGRvd24gbGlzdCAhJywgJycsIHsgZHVyYXRpb246IDEyMCx9KTtcclxuICAgLy8gYWxlcnQoJ1BsZWFzZSBwaWNrIGEgcHJvZ3JhbSBvbiB0aGUgZHJvcCBkb3duIGxpc3QgIScpO1xyXG5cclxuICB9ZWxzZVxyXG4gIHtcclxuICAgIFxyXG4gIGlmICggdGhpcy52aWN0aW1TZXJ2aWNlSWQgPT0gMCl7XHJcbiAgIC8vaW5zZXJ0XHJcbiAgIGNvbnNvbGUubG9nKCdpbnNlcnQgbmV3IHBsYW4nKTtcclxuICAgY29uc3Qgc2FmZXR5UGxhbjogVmljdGltU2FmZXR5UGxhbiA9IHtcclxuICAgIHZpY3RpbUlkOnRoaXMudmljdGltSWQsXHJcbiAgICBmdWxsTmFtZTogbnVsbCxcclxuICAgIHZpY3RpbVNlcnZpY2VJZDogMCxcclxuICAgIGdvYWw6dGhpcy5lZGl0U2FmZXR5UGxhbi5nb2FsLFxyXG4gICAgY29tbWVudDogdGhpcy5lZGl0U2FmZXR5UGxhbi5jb21tZW50LFxyXG4gICAgbW9kaWZpZWRCeTp0aGlzLnN0YWZmSWQsXHJcbiAgICB2aWN0aW1TZXJ2aWNlU3RhdHVzSWQ6IG51bGwsXHJcbiAgICBzdGF0dXM6IG51bGwsXHJcbiAgICBzdGFydERhdGU6IG51bGwsXHJcbiAgICB2VmljdGltU2VydmljZURldGFpbHM6IG51bGwsXHJcbiAgICB2aWN0aW1OYW1lOiBudWxsXHJcbn07XHJcbnRoaXMuX3ZpY3RpbVNlcnZpY2VzQ29tcG9uZW50LmFkZFNhZmV0eVBsYW4oc2FmZXR5UGxhbikuc3Vic2NyaWJlKFxyXG4gIChpdG1zOmFueSk9PntcclxuICAgIGNvbnN0IHZpY3RpbVNlcnZpY2VTdGF0dXM6IFZpY3RpbVNlcnZpY2VTdGF0dXNIaXN0b3J5PSB7XHJcbiAgICAgIHZpY3RpbVNlcnZpY2VTdGF0dXNIaXN0b3J5SWQ6MCxcclxuICAgICAgdmljdGltU2VydmljZUlkOiBpdG1zLnZpY3RpbVNlcnZpY2VJZCxcclxuICAgICAgdmljdGltU2VydmljZVN0YXR1c0lkOiB0aGlzLmVkaXRTYWZldHlQbGFuLnZpY3RpbVNlcnZpY2VTdGF0dXNJZCAsXHJcbiAgICAgIHN0YXJ0RGF0ZTogdGhpcy5lZGl0U2FmZXR5UGxhbi5zdGFydERhdGUsXHJcbiAgICAgIG1vZGlmaWVkQnk6dGhpcy5zdGFmZklkLFxyXG4gICAgICBjb21tZW50Oid0ZXN0IGFkZCBzYWZldHkgcGxhbidcclxuICAgICAgfTtcclxuXHJcbiAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5hZGRWaWN0aW1TZXJ2aWNlU3RhdHVzKHZpY3RpbVNlcnZpY2VTdGF0dXMpLnN1YnNjcmliZShcclxuIFxyXG4gICAgICAoKSA9PntcclxuICAgICAgICBjb25zb2xlLmxvZygnY2hlY2sgaXRtcy52aWN0aW1TZXJ2aWNlSWQgaW5pc2lkZSBhZGQgdmljdGltIHNlcml2ZSBzdGF0dXMnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhpdG1zLnZpY3RpbVNlcnZpY2VJZCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHZpY3RpbVNlcnZpY2VEZXRhaWw6IFZpY3RpbVNlcnZpY2VEZXRhaWwgPSB7XHJcbiAgICAgICAgICB2aWN0aW1TZXJ2aWNlSWQ6IGl0bXMudmljdGltU2VydmljZUlkLFxyXG4gICAgICAgICAgdmljdGltU2VydmljZURldGFpbElkOiAwLFxyXG4gICAgICAgICAgdmljdGltU2VydmljZVR5cGVJZDogdmljdGltU2VydmljZVR5cGVJZCxcclxuICAgICAgICAgIHZpY3RpbVByb2dyYW1Qcm92aWRlcklkOiB2aWN0aW1Qcm9ncmFtUHJvdmlkZXJJZCxcclxuICAgICAgICAgIG1vZGlmaWVkQnk6IHRoaXMuc3RhZmZJZCxcclxuICAgICAgICAgIHZpY3RpbVByb2dyYW1Qcm92aWRlcjogbnVsbFxyXG4gICAgICAgIH07XHJcbiAgICBcclxuICAgICAgICBjb25zb2xlLmxvZygnYWRkIHBsYW4gcHJvdmlkZXIgaGVyZSBhdCBpbnNlcnQnKTtcclxuICAgIFxyXG4gICAgICAgIHRoaXMuX3ZpY3RpbVNlcnZpY2VzQ29tcG9uZW50LmFkZFBsYW5Qcm92aWRlcih2aWN0aW1TZXJ2aWNlRGV0YWlsKS5zdWJzY3JpYmUoXHJcblxyXG4gICAgICAgICAgKCkgPT57XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnc2FmdHlQbGFuRGV0YWlsJywgIGl0bXMudmljdGltU2VydmljZUlkLCAgdGhpcy52aWN0aW1JZCBdKTsgXHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICApO1xyXG5cclxuICAgICAgfVxyXG4gICAgICk7XHJcbiAgIFxyXG4gIFxyXG4gIFxyXG4gIH1cclxuXHJcblxyXG4pO1xyXG4gIH1cclxuICBlbHNlLy91cGRhdGVcclxuICAgIHtcclxuICAgICAgY29uc3QgdmljdGltU2VydmljZURldGFpbDogVmljdGltU2VydmljZURldGFpbCA9IHtcclxuICAgICAgICB2aWN0aW1TZXJ2aWNlSWQ6IHRoaXMudmljdGltU2VydmljZUlkLFxyXG4gICAgICAgIHZpY3RpbVNlcnZpY2VEZXRhaWxJZDogMCxcclxuICAgICAgICB2aWN0aW1TZXJ2aWNlVHlwZUlkOiB2aWN0aW1TZXJ2aWNlVHlwZUlkLFxyXG4gICAgICAgIHZpY3RpbVByb2dyYW1Qcm92aWRlcklkOiB2aWN0aW1Qcm9ncmFtUHJvdmlkZXJJZCxcclxuICAgICAgICBtb2RpZmllZEJ5OiB0aGlzLnN0YWZmSWQsXHJcbiAgICAgICAgdmljdGltUHJvZ3JhbVByb3ZpZGVyOiBudWxsXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnNvbGUubG9nKCdhZGQgcGxhbiBwcm92aWRlciBoZXJlIGF0IHVwZGF0ZScpO1xyXG4gICAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5hZGRQbGFuUHJvdmlkZXIodmljdGltU2VydmljZURldGFpbCkuc3Vic2NyaWJlKFxyXG5cclxuICAgICAgICAoKSA9PntcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydzYWZ0eVBsYW5EZXRhaWwnLCAgdGhpcy52aWN0aW1TZXJ2aWNlSWQsICB0aGlzLnZpY3RpbUlkIF0pOyBcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuXHJcblxyXG4gIGRlbGV0ZVByb3ZpZGVyKHZpY3RpbVByb2dyYW1Qcm92aWRlcklkOiBzdHJpbmcpe1xyXG5cclxuICAgIHRoaXMuY29tbW9uRGlhbG9nU2VydmljZVxyXG4gICAgLmNvbmZpcm0oJycsICdEbyB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBwcm92aWRlcj8nLCAnWWVzJywgJ05vJylcclxuICAgIC5zdWJzY3JpYmUocmVzID0+IHt0aGlzLnJlc3VsdCA9ICByZXM7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0KSB7XHJcbiAgICAgICAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5kZWxldGVQcm92aWRlcih2aWN0aW1Qcm9ncmFtUHJvdmlkZXJJZCwgdGhpcy5zdGFmZklkKVxyXG4gICAgICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ2RlbGV0ZSBwcm92aWRlciBTdWNjZXNzZnVsbHkgIScsICcnLCB7XHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICB9KTtcclxuIFxyXG4gICAgLy8gbG9jYXRpb24ucmVsb2FkKCk7XHJcblxyXG4gIH1cclxuc2F2ZVNhZmV0eVBsYW4oKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVkaXRTYWZldHlQbGFuLnZpY3RpbVNlcnZpY2VJZCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuICAgICAgICAgIGNvbnN0IHNhZmV0eVBsYW46IFZpY3RpbVNhZmV0eVBsYW4gPSB7XHJcbiAgICAgICAgICAgIHZpY3RpbUlkOiB0aGlzLnZpY3RpbUlkLFxyXG4gICAgICAgICAgICBmdWxsTmFtZTogbnVsbCxcclxuICAgICAgICAgICAgdmljdGltU2VydmljZUlkOiAwLFxyXG4gICAgICAgICAgICBnb2FsOnRoaXMuZWRpdFNhZmV0eVBsYW4uZ29hbCxcclxuICAgICAgICAgICAgY29tbWVudDogdGhpcy5lZGl0U2FmZXR5UGxhbi5jb21tZW50LFxyXG4gICAgICAgICAgICBtb2RpZmllZEJ5OnRoaXMuc3RhZmZJZCxcclxuICAgICAgICAgICAgdmljdGltU2VydmljZVN0YXR1c0lkOiBudWxsLFxyXG4gICAgICAgICAgICBzdGF0dXM6IG51bGwsXHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogbnVsbCxcclxuICAgICAgICAgICAgdlZpY3RpbVNlcnZpY2VEZXRhaWxzOiBudWxsLFxyXG4gICAgICAgICAgICB2aWN0aW1OYW1lOiBudWxsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5hZGRTYWZldHlQbGFuKHNhZmV0eVBsYW4pLnN1YnNjcmliZShcclxuICAgICAgICAgIChpdG1zOmFueSk9PntcclxuICAgICAgICAgICAgY29uc3QgdmljdGltU2VydmljZVN0YXR1czogVmljdGltU2VydmljZVN0YXR1c0hpc3Rvcnk9IHtcclxuICAgICAgICAgICAgICB2aWN0aW1TZXJ2aWNlU3RhdHVzSGlzdG9yeUlkOjAsXHJcbiAgICAgICAgICAgICAgdmljdGltU2VydmljZUlkOiBpdG1zLnZpY3RpbVNlcnZpY2VJZCxcclxuICAgICAgICAgICAgICB2aWN0aW1TZXJ2aWNlU3RhdHVzSWQ6IHRoaXMuZWRpdFNhZmV0eVBsYW4udmljdGltU2VydmljZVN0YXR1c0lkICxcclxuICAgICAgICAgICAgICBzdGFydERhdGU6IHRoaXMuZWRpdFNhZmV0eVBsYW4uc3RhcnREYXRlLFxyXG4gICAgICAgICAgICAgIG1vZGlmaWVkQnk6dGhpcy5zdGFmZklkLFxyXG4gICAgICAgICAgICAgIGNvbW1lbnQ6J3Rlc3QgYWRkIHNhZmV0eSBQbGFuJ1xyXG4gICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5hZGRWaWN0aW1TZXJ2aWNlU3RhdHVzKHZpY3RpbVNlcnZpY2VTdGF0dXMpLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICByZXNwPT57XHJcbiAgICAgICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0luc2VydCBzdGF0dXMgc3VjY2Vzc2Z1bGx5IScsICcnLCB7XHJcbiAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBcclxuICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ3NhZnR5UGxhbkRldGFpbCcsICBpdG1zLnZpY3RpbVNlcnZpY2VJZCwgIHRoaXMudmljdGltSWQgXSk7IFxyXG4gICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHRoaXMuZWRpdFNhZmV0eVBsYW4ubW9kaWZpZWRCeT10aGlzLmxvZ2luU3RhZmYuc3RhZmZJZDtcclxuICAgICAgdGhpcy5lZGl0U2FmZXR5UGxhbi5tb2RpZmllZEJ5ID10aGlzLnN0YWZmSWQ7XHJcbiAgICAgIHRoaXMuX3ZpY3RpbVNlcnZpY2VzQ29tcG9uZW50LnVwZGF0ZVNhZmV0eVBsYW4odGhpcy5lZGl0U2FmZXR5UGxhbikuc3Vic2NyaWJlKFxyXG4gICAgICAgIHJlc3A9PntcclxuICAgICAgICAgICAgLy8gIHRoaXMuc25hY2tCYXIub3BlbigndXBkYXRlIFN1Y2Nlc3NmdWxseSEnLCAnJywge1xyXG4gICAgICAgICAgICAvLyAgZHVyYXRpb246IDMwMDAsXHJcbiAgICAgICAgICAgIC8vICAgICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgICAgICAgICBjb25zdCB2aWN0aW1TZXJ2aWNlU3RhdHVzOiBWaWN0aW1TZXJ2aWNlU3RhdHVzSGlzdG9yeT0ge1xyXG4gICAgICAgICAgICAgIHZpY3RpbVNlcnZpY2VTdGF0dXNIaXN0b3J5SWQ6MCxcclxuICAgICAgICAgICAgICB2aWN0aW1TZXJ2aWNlSWQ6IHRoaXMuZWRpdFNhZmV0eVBsYW4udmljdGltU2VydmljZUlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgdmljdGltU2VydmljZVN0YXR1c0lkOiB0aGlzLmVkaXRTYWZldHlQbGFuLnZpY3RpbVNlcnZpY2VTdGF0dXNJZCAsXHJcbiAgICAgICAgICAgICAgc3RhcnREYXRlOiB0aGlzLmVkaXRTYWZldHlQbGFuLnN0YXJ0RGF0ZSxcclxuICAgICAgICAgICAgICBtb2RpZmllZEJ5OnRoaXMuc3RhZmZJZCxcclxuICAgICAgICAgICAgICBjb21tZW50Oid0ZXN0IHVwZGF0ZSBzYWZldHkgUGxhbidcclxuICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdmljdGltU2VydmljZXNDb21wb25lbnQuYWRkVmljdGltU2VydmljZVN0YXR1cyh2aWN0aW1TZXJ2aWNlU3RhdHVzKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgIFxyXG4gICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnc2FmdHlQbGFuRGV0YWlsJywgIHRoaXMuZWRpdFNhZmV0eVBsYW4udmljdGltU2VydmljZUlkLCAgdGhpcy52aWN0aW1JZCBdKTsgXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0gXHJcbiAgfVxyXG5cclxuICBiYWNrKCl7XHJcbiAgICBjb25zb2xlLmxvZygndGhpcy52aWN0aW1JZCcpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy52aWN0aW1JZCk7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ3NhZnR5UGxhbicsIHRoaXMudmljdGltSWRdKTsgXHJcbiAgfVxyXG4gXHJcblxyXG59XHJcblxyXG4iXX0=
|