@vgroup/dialbox 0.6.30 → 0.6.32
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/esm2020/lib/components/call-progress/call-progress.component.mjs +383 -673
- package/esm2020/lib/dialbox.component.mjs +35 -71
- package/esm2020/lib/dialbox.module.mjs +1 -1
- package/esm2020/lib/service/extension.service.mjs +14 -3
- package/esm2020/public-api.mjs +1 -1
- package/fesm2015/vgroup-dialbox.mjs +424 -699
- package/fesm2015/vgroup-dialbox.mjs.map +1 -1
- package/fesm2020/vgroup-dialbox.mjs +429 -744
- package/fesm2020/vgroup-dialbox.mjs.map +1 -1
- package/lib/components/call-progress/call-progress.component.d.ts +17 -7
- package/lib/dialbox.component.d.ts +4 -1
- package/lib/service/extension.service.d.ts +1 -0
- package/package.json +1 -1
|
@@ -12,9 +12,6 @@ import * as i4 from "../../service/incomeing-call-socket.service";
|
|
|
12
12
|
import * as i5 from "@angular/common";
|
|
13
13
|
import * as i6 from "@angular/forms";
|
|
14
14
|
export class CallProgressComponent {
|
|
15
|
-
// audioURL:any = '/projects/dialbox/src/lib/shared/incoming_call.mp3';
|
|
16
|
-
// /projects/dialbox/src/lib/shared/incoming_call.mp3
|
|
17
|
-
// incomingAudio!: HTMLAudioElement;
|
|
18
15
|
constructor(extensionService, cdr, twilioService, ipService, incomeingCallSocketService) {
|
|
19
16
|
this.extensionService = extensionService;
|
|
20
17
|
this.cdr = cdr;
|
|
@@ -40,7 +37,6 @@ export class CallProgressComponent {
|
|
|
40
37
|
this.isOutgoingCall = true;
|
|
41
38
|
// Incoming call variables
|
|
42
39
|
this.incomingCallDiv = false;
|
|
43
|
-
//@Output() showCallProgressEvent: EventEmitter<void> = new EventEmitter<void>();
|
|
44
40
|
this.incomingCallInitiated = new EventEmitter();
|
|
45
41
|
this.isLoadershow = new EventEmitter();
|
|
46
42
|
this.endIncomingCallEvent = new EventEmitter();
|
|
@@ -73,14 +69,15 @@ export class CallProgressComponent {
|
|
|
73
69
|
this.conferenceCallList = [];
|
|
74
70
|
this.isIncomingCallBtnDisable = false;
|
|
75
71
|
this.isNewAddedCall = false;
|
|
76
|
-
this.
|
|
72
|
+
this.deviceNumberList = [];
|
|
73
|
+
this.ourNumberInfo = {};
|
|
74
|
+
this.currentConferenceCall = {};
|
|
75
|
+
this.isReasonChecked = false;
|
|
76
|
+
this.leaveReason = '';
|
|
77
77
|
this.isMinimised = false;
|
|
78
|
+
this.showDisconnectModal = false;
|
|
78
79
|
console.log('Call Progress Component');
|
|
79
80
|
this.call = this.twilioService.call;
|
|
80
|
-
// this.incomingAudio = this.createAudioFromBase64(
|
|
81
|
-
// INCOMING_CALL_AUDIO_BASE64,
|
|
82
|
-
// 'audio/mpeg' // use audio/wav if needed
|
|
83
|
-
// );
|
|
84
81
|
}
|
|
85
82
|
ngOnInit() {
|
|
86
83
|
console.log('Call Progress Component ngOnInit');
|
|
@@ -103,6 +100,7 @@ export class CallProgressComponent {
|
|
|
103
100
|
catch (e) {
|
|
104
101
|
console.error('Error subscribing to incoming calls:', e);
|
|
105
102
|
}
|
|
103
|
+
this.deviceNumberList = this.callerIdList.map((res) => res.number);
|
|
106
104
|
this.GetContactsList();
|
|
107
105
|
}
|
|
108
106
|
ngOnChanges(changes) {
|
|
@@ -134,102 +132,78 @@ export class CallProgressComponent {
|
|
|
134
132
|
this.startCall(changes['callData'].currentValue);
|
|
135
133
|
}
|
|
136
134
|
}
|
|
137
|
-
if (changes['newIncomingCallsList']?.currentValue) {
|
|
135
|
+
if (changes['newIncomingCallsList']?.currentValue?.length || changes['newIncomingCallsList']?.previousValue?.length) {
|
|
138
136
|
if (this.newIncomingCallsList?.length) {
|
|
139
|
-
|
|
137
|
+
if (!this.deviceNumberList?.length) {
|
|
138
|
+
this.deviceNumberList = this.callerIdList.map((res) => res.number);
|
|
139
|
+
}
|
|
140
140
|
this.newIncomingCallsList.forEach((callInfo, i) => {
|
|
141
141
|
this.conferenceId = i == 0 ? this.newIncomingCallsList[i].conferenceId : this.conferenceId;
|
|
142
|
-
let
|
|
143
|
-
|
|
142
|
+
let ourNumberInfo = this.newIncomingCallsList[i].participants.find((resData) => ((this.deviceNumberList.includes(resData?.from) && resData?.to == 'c2c_softphone_client') || (this.deviceNumberList.includes(resData?.to) && resData?.direction == 'incoming-call')) && !resData?.isLeft);
|
|
143
|
+
this.isMute = !ourNumberInfo?.isHold ? ourNumberInfo?.isMute : this.isMute;
|
|
144
|
+
if (ourNumberInfo?.id) {
|
|
144
145
|
this.newIncomingCallsList[i].participants.forEach(async (res) => {
|
|
145
|
-
if (res?.to == 'c2c_softphone_client' &&
|
|
146
|
+
if (res?.to == 'c2c_softphone_client' && !res?.isLeft) {
|
|
146
147
|
this.hostnumber = res;
|
|
147
148
|
}
|
|
148
149
|
else {
|
|
149
150
|
let contact = {};
|
|
150
151
|
if (this.contacts?.length) {
|
|
151
|
-
contact = this.contacts.find((resData) => resData?.numbersList[0]?.number == (res
|
|
152
|
+
contact = this.contacts.find((resData) => resData?.numbersList[0]?.number == (res?.direction == "incoming-call" ? res?.from : res?.to));
|
|
152
153
|
}
|
|
153
|
-
if (this.currentCallList
|
|
154
|
-
let index = this.currentCallList.findIndex((item) => item
|
|
154
|
+
if (this.currentCallList?.length > 0) {
|
|
155
|
+
let index = this.currentCallList.findIndex((item) => item?.id == res?.id);
|
|
155
156
|
if (index == -1 && !res.isLeft) {
|
|
156
157
|
this.currentCallList.push({
|
|
157
158
|
...res,
|
|
158
|
-
img: res
|
|
159
|
-
isIncomingCall: res
|
|
160
|
-
isHold: res
|
|
159
|
+
img: res?.direction == "incoming-call" ? res?.toImage : res?.fromImage || contact?.image || 'assets/images/user.jpg',
|
|
160
|
+
isIncomingCall: res?.direction == "incoming-call",
|
|
161
|
+
isHold: res?.isHold,
|
|
162
|
+
isConferenceHold: ourNumberInfo?.isHold || false,
|
|
161
163
|
isMute: false,
|
|
162
|
-
isConference: res.isConference,
|
|
163
|
-
isAcceptCall: res
|
|
164
|
+
isConference: res?.isConference || this.isConference,
|
|
165
|
+
isAcceptCall: res?.direction == "incoming-call" ? this.getStatus(res) : true,
|
|
164
166
|
dial: true,
|
|
165
|
-
phone: res
|
|
166
|
-
participantId: res
|
|
167
|
-
conferenceSid: callInfo
|
|
168
|
-
name: res
|
|
169
|
-
time: this.getTimeDifference(res
|
|
167
|
+
phone: res?.direction == "incoming-call" ? res?.from : res?.to,
|
|
168
|
+
participantId: res?.id,
|
|
169
|
+
conferenceSid: callInfo?.conferenceSid,
|
|
170
|
+
name: res?.name || res?.fromName || res?.toName,
|
|
171
|
+
time: this.getTimeDifference(res?.joinedAt || new Date().toUTCString()),
|
|
170
172
|
});
|
|
171
173
|
if (this.showContactsPanel) {
|
|
172
|
-
this.getAllParticipants(this.currentCall
|
|
174
|
+
this.getAllParticipants(this.currentCall?.conferenceSid);
|
|
173
175
|
this.applyFilter();
|
|
174
176
|
}
|
|
175
177
|
}
|
|
176
|
-
else if (index != -1 && res
|
|
178
|
+
else if (index != -1 && res?.isLeft) {
|
|
177
179
|
if (this.currentCallList[index]?.id == this.currentCall?.id) {
|
|
178
180
|
this.currentCallList.splice(index, 1);
|
|
179
|
-
this.currentCall = this.currentCallList
|
|
180
|
-
if (this.currentCall?.isHold && !this.currentCall?.isConference) {
|
|
181
|
-
await this.onholdOrUnholdParticipant({
|
|
182
|
-
participantId: [this.currentCall?.participantId],
|
|
183
|
-
conferenceId: this.currentCall?.conferenceId,
|
|
184
|
-
hold: false,
|
|
185
|
-
mute: this.currentCall?.mute || false,
|
|
186
|
-
conference: this.currentCall?.isConference
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
else if (this.currentCall?.isHold && this.currentCall?.isConference) {
|
|
190
|
-
let conferenceCalllist = this.currentCallList.filter((item) => item.isConference && item.conferenceId == this.currentCall?.conferenceId);
|
|
191
|
-
if (conferenceCalllist.length > 0) {
|
|
192
|
-
// await this.onholdOrUnholdParticipant({
|
|
193
|
-
// participantId: conferenceCalllist.map((item: any) => item.participantId),
|
|
194
|
-
// conferenceId: conferenceCalllist[0]?.conferenceId,
|
|
195
|
-
// hold: false,
|
|
196
|
-
// mute: this.currentCall?.mute || false,
|
|
197
|
-
// conference: this.currentCall?.isConference || false
|
|
198
|
-
// });
|
|
199
|
-
await this.onholdOrUnholdParticipant({
|
|
200
|
-
participantId: [this.hostnumber?.participantId],
|
|
201
|
-
conferenceId: this.currentCall?.conferenceId,
|
|
202
|
-
hold: false,
|
|
203
|
-
mute: this.currentCall?.mute || false,
|
|
204
|
-
conference: this.currentCall?.isConference
|
|
205
|
-
});
|
|
206
|
-
this.isConferenceCallHold = false;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
181
|
+
this.currentCall = this.currentCallList?.length > 0 ? this.currentCallList[0] : {};
|
|
209
182
|
}
|
|
210
183
|
else {
|
|
211
184
|
this.currentCallList.splice(index, 1);
|
|
212
185
|
}
|
|
213
186
|
if (this.showContactsPanel) {
|
|
214
|
-
this.getAllParticipants(this.currentCall
|
|
187
|
+
this.getAllParticipants(this.currentCall?.conferenceSid);
|
|
215
188
|
this.applyFilter();
|
|
216
189
|
}
|
|
217
190
|
}
|
|
218
191
|
else if (index != -1) {
|
|
219
192
|
this.currentCallList[index] = {
|
|
220
193
|
...res,
|
|
221
|
-
img: res
|
|
222
|
-
isIncomingCall: res
|
|
223
|
-
isHold: res
|
|
224
|
-
|
|
225
|
-
|
|
194
|
+
img: res?.direction == "incoming-call" ? res?.toImage : res?.fromImage || contact?.image || 'assets/images/user.jpg',
|
|
195
|
+
isIncomingCall: res?.direction == "incoming-call",
|
|
196
|
+
isHold: res?.isHold,
|
|
197
|
+
isConferenceHold: ourNumberInfo?.isHold || false,
|
|
198
|
+
isMute: res?.isMute,
|
|
199
|
+
isConference: res?.isConference || this.isConference,
|
|
226
200
|
isAcceptCall: res.direction == "incoming-call" ? this.getStatus(res) : true,
|
|
227
201
|
dial: true,
|
|
228
|
-
phone: res
|
|
229
|
-
participantId: res
|
|
230
|
-
conferenceSid: callInfo
|
|
231
|
-
name: res
|
|
232
|
-
time: this.getTimeDifference(res
|
|
202
|
+
phone: res?.direction == "incoming-call" ? res?.from : res?.to,
|
|
203
|
+
participantId: res?.id,
|
|
204
|
+
conferenceSid: callInfo?.conferenceSid,
|
|
205
|
+
name: res?.name || res?.fromName || res?.toName,
|
|
206
|
+
time: this.getTimeDifference(res?.joinedAt || new Date().toUTCString()),
|
|
233
207
|
};
|
|
234
208
|
}
|
|
235
209
|
}
|
|
@@ -238,16 +212,17 @@ export class CallProgressComponent {
|
|
|
238
212
|
...res,
|
|
239
213
|
img: res.direction == "incoming-call" ? res?.toImage : res?.fromImage || contact?.image || 'assets/images/user.jpg',
|
|
240
214
|
isIncomingCall: res.direction == "incoming-call",
|
|
241
|
-
isHold: res
|
|
242
|
-
|
|
215
|
+
isHold: res?.isHold,
|
|
216
|
+
isConferenceHold: ourNumberInfo?.isHold || false,
|
|
217
|
+
isMute: res?.isMute,
|
|
243
218
|
isConference: res.isConference,
|
|
244
219
|
isAcceptCall: res.direction == "incoming-call" ? this.getStatus(res) : true,
|
|
245
220
|
dial: true,
|
|
246
221
|
phone: res.direction == "incoming-call" ? res?.from : res?.to,
|
|
247
222
|
participantId: res.id,
|
|
248
|
-
conferenceSid: callInfo
|
|
249
|
-
name: res
|
|
250
|
-
time: this.getTimeDifference(res
|
|
223
|
+
conferenceSid: callInfo?.conferenceSid,
|
|
224
|
+
name: res?.name || res?.fromName || res?.toName,
|
|
225
|
+
time: this.getTimeDifference(res?.joinedAt || new Date().toUTCString()),
|
|
251
226
|
});
|
|
252
227
|
if (this.currentCallList?.length == 1) {
|
|
253
228
|
this.currentCall = this.currentCallList[0];
|
|
@@ -282,80 +257,78 @@ export class CallProgressComponent {
|
|
|
282
257
|
});
|
|
283
258
|
let validValues = new Set(this.newIncomingCallsList.flatMap((item) => item?.participants.map((val) => val?.id)));
|
|
284
259
|
this.currentCallList = this.currentCallList.filter((item) => validValues.has(item?.participantId));
|
|
285
|
-
this.currentCall = this.currentCallList.find((res) => this.currentCall?.participantId == res?.participantId);
|
|
286
|
-
let currentCall = this.currentCallList.filter((item) => item?.isAcceptCall && !item?.
|
|
260
|
+
this.currentCall = this.currentCallList.find((res) => this.currentCall?.participantId == res?.participantId && !res?.isConferenceHold);
|
|
261
|
+
let currentCall = this.currentCallList.filter((item) => item?.isAcceptCall && !item?.isConferenceHold);
|
|
262
|
+
this.currentConferenceCall = this.newIncomingCallsList.find((item) => {
|
|
263
|
+
return item?.participants?.find((participant) => {
|
|
264
|
+
return ((this.deviceNumberList.includes(participant?.from) && participant?.to === 'c2c_softphone_client') || (this.deviceNumberList.includes(participant?.to) && participant?.direction == 'incoming-call')) && !participant?.isLeft && !participant?.isHold;
|
|
265
|
+
});
|
|
266
|
+
});
|
|
287
267
|
if (currentCall?.length == 1 && currentCall[0]?.id) {
|
|
288
268
|
this.currentCall = currentCall[0] || this.currentCallList[0];
|
|
289
269
|
}
|
|
290
|
-
else if (currentCall?.length > 1 && currentCall[
|
|
291
|
-
this.currentCall = currentCall[
|
|
270
|
+
else if (currentCall?.length > 1 && currentCall[1]?.isConference) {
|
|
271
|
+
this.currentCall = currentCall[1] || this.currentCallList[1];
|
|
292
272
|
this.isConference = true;
|
|
293
273
|
}
|
|
294
|
-
if (!this.
|
|
295
|
-
this.
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
274
|
+
if (!this.currentConferenceCall && !this.isNewAddedCall) {
|
|
275
|
+
// this.currentConferenceCall = this.newIncomingCallsList.find((item: any) => {
|
|
276
|
+
// return ((this.deviceNumberList.includes(item?.from) && item?.to === 'c2c_softphone_client') || this.deviceNumberList.includes(item?.to)) && !item?.isLeft && !item?.isHold
|
|
277
|
+
// });
|
|
278
|
+
// this.currentCall = this.currentCallList.find((res: any) => res?.participantId == this.currentCall?.participantId && res?.isAcceptCall && !res?.isConferenceHold)
|
|
279
|
+
// if (!this.currentConferenceCall?.id && this.currentCallList?.length) {
|
|
280
|
+
// this.currentConferenceCall = this.newIncomingCallsList.find((item: any) => {
|
|
281
|
+
// return ((this.deviceNumberList.includes(item?.from) && item?.to === 'c2c_softphone_client') || this.deviceNumberList.includes(item?.to)) && !item?.isLeft && item?.isHold
|
|
282
|
+
// });
|
|
283
|
+
// let calldetail = this.currentConferenceCall.find((resInfo: any) => ((this.deviceNumberList.includes(resInfo?.from) && resInfo?.to === 'c2c_softphone_client') || this.deviceNumberList.includes(resInfo?.to)) && !resInfo?.isLeft && resInfo?.isHold)
|
|
284
|
+
// if (calldetail?.isHold) {
|
|
285
|
+
// this.isConference = true;
|
|
286
|
+
// this.onholdOrUnholdParticipant({
|
|
287
|
+
// participantId: [calldetail?.id || calldetail?.participantId],
|
|
288
|
+
// conferenceId: calldetail?.conferenceId,
|
|
289
|
+
// hold: false,
|
|
290
|
+
// mute: calldetail?.mute || false,
|
|
291
|
+
// conference: calldetail?.isConference || false
|
|
292
|
+
// });
|
|
293
|
+
// }
|
|
294
|
+
// }
|
|
295
|
+
// if (!this.currentCall?.participantId) {
|
|
296
|
+
// this.currentCall = this.currentCallList[0];
|
|
297
|
+
// if (this.currentCallList[0]?.isConferenceHold && this.currentCallList[0]?.isConference) {
|
|
298
|
+
// this.isConference = true;
|
|
299
|
+
// this.onholdOrUnholdParticipant({
|
|
300
|
+
// participantId: [this.currentCall?.participantId],
|
|
301
|
+
// conferenceId: this.currentCall?.conferenceId,
|
|
302
|
+
// hold: false,
|
|
303
|
+
// mute: this.currentCall?.mute || false,
|
|
304
|
+
// conference: this.currentCall?.isConference || false
|
|
305
|
+
// });
|
|
306
|
+
// } else if (this.currentCall?.isConferenceHold) {
|
|
307
|
+
// this.onholdOrUnholdParticipant({
|
|
308
|
+
// participantId: [this.currentCall?.participantId],
|
|
309
|
+
// conferenceId: this.currentCall?.conferenceId,
|
|
310
|
+
// hold: false,
|
|
311
|
+
// mute: this.currentCall?.mute || false,
|
|
312
|
+
// conference: this.currentCall?.isConference || false
|
|
313
|
+
// });
|
|
314
|
+
// }
|
|
315
|
+
// }
|
|
316
|
+
let currentConferenceCallInfo = this.getCurrentCallInfo();
|
|
317
|
+
if (!currentConferenceCallInfo?.id) {
|
|
318
|
+
let holdCallInfo = this.newIncomingCallsList[0].participants.find((callInfo) => ((this.deviceNumberList.includes(callInfo?.from) && callInfo?.to === 'c2c_softphone_client')
|
|
319
|
+
|| (this.deviceNumberList.includes(callInfo?.to) && callInfo?.direction == 'incoming-call')) && !callInfo?.isLeft && callInfo?.isHold);
|
|
320
|
+
if (holdCallInfo?.id) {
|
|
320
321
|
this.onholdOrUnholdParticipant({
|
|
321
|
-
participantId: [
|
|
322
|
-
conferenceId:
|
|
322
|
+
participantId: [holdCallInfo?.id],
|
|
323
|
+
conferenceId: holdCallInfo?.conferenceId,
|
|
323
324
|
hold: false,
|
|
324
|
-
mute:
|
|
325
|
-
conference:
|
|
325
|
+
mute: holdCallInfo?.mute || false,
|
|
326
|
+
conference: holdCallInfo?.isConference || false
|
|
326
327
|
});
|
|
327
328
|
}
|
|
328
329
|
}
|
|
329
330
|
}
|
|
330
|
-
|
|
331
|
-
// this.currentCall = this.currentCallList.find((res: any)=> res?.participantId == this.currentCall?.participantId && res?.isAcceptCall && !res?.isHold)
|
|
332
|
-
// if(!this.currentCall?.participantId) {
|
|
333
|
-
// this.currentCall = this.currentCallList[0];
|
|
334
|
-
// if(this.currentCallList[0].isHold && this.currentCallList[0]?.isConference) {
|
|
335
|
-
// this.isConference = true;
|
|
336
|
-
// this.currentCallList.forEach((res) => {
|
|
337
|
-
// if (res.isConference && this.currentCall?.participantId) {
|
|
338
|
-
// this.onholdOrUnholdParticipant({
|
|
339
|
-
// participantId: [res.participantId],
|
|
340
|
-
// conferenceId: res?.conferenceId,
|
|
341
|
-
// hold: false,
|
|
342
|
-
// mute: res?.mute || false,
|
|
343
|
-
// conference: res?.isConference || false
|
|
344
|
-
// });
|
|
345
|
-
// }
|
|
346
|
-
// })
|
|
347
|
-
// } else {
|
|
348
|
-
// this.onholdOrUnholdParticipant({
|
|
349
|
-
// participantId: [this.currentCall?.participantId],
|
|
350
|
-
// conferenceId: this.currentCall?.conferenceId,
|
|
351
|
-
// hold: false,
|
|
352
|
-
// mute: this.currentCall?.mute || false,
|
|
353
|
-
// conference: this.currentCall?.isConference || false
|
|
354
|
-
// });
|
|
355
|
-
// }
|
|
356
|
-
// }
|
|
357
|
-
// } else {
|
|
358
|
-
// }
|
|
331
|
+
console.log(this.currentConferenceCall, 'currentConferenceCall');
|
|
359
332
|
console.log(this.leftParticipent, 'leftParticipent');
|
|
360
333
|
if (this.selectedUserInfo?.participantId) {
|
|
361
334
|
let selectedUser = this.currentCallList.find((item) => item?.id == this.selectedUserInfo?.participantId);
|
|
@@ -388,7 +361,7 @@ export class CallProgressComponent {
|
|
|
388
361
|
}
|
|
389
362
|
}
|
|
390
363
|
this.cdr.detectChanges();
|
|
391
|
-
let incomingData = this.currentCallList.find((res) => res?.isIncomingCall && !res?.isAcceptCall);
|
|
364
|
+
let incomingData = this.currentCallList.find((res) => res?.isIncomingCall && !res?.isAcceptCall && !res?.isLeft);
|
|
392
365
|
if (incomingData?.id && !this.isRinging) {
|
|
393
366
|
this.isRinging = this.incomeingCallSocketService.play();
|
|
394
367
|
}
|
|
@@ -398,9 +371,8 @@ export class CallProgressComponent {
|
|
|
398
371
|
console.log('currentCallList', this.currentCallList);
|
|
399
372
|
this.conferenceCallList = [];
|
|
400
373
|
this.conferenceCallList = [
|
|
401
|
-
...new Map(this.currentCallList.
|
|
374
|
+
...new Map(this.currentCallList.map(item => [item.conferenceId, item])).values()
|
|
402
375
|
];
|
|
403
|
-
// })
|
|
404
376
|
}
|
|
405
377
|
else if (!this.newIncomingCallsList?.length) {
|
|
406
378
|
this.isRinging = false;
|
|
@@ -423,6 +395,41 @@ export class CallProgressComponent {
|
|
|
423
395
|
}
|
|
424
396
|
;
|
|
425
397
|
}
|
|
398
|
+
if (changes['callAction']?.currentValue) {
|
|
399
|
+
this.deviceNumberList = this.callerIdList.map((res) => res.number);
|
|
400
|
+
this.rejoinHost(this.callAction);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
async rejoinHost(callInfo) {
|
|
404
|
+
try {
|
|
405
|
+
const rejoinParticipentInfo = callInfo?.participants.find((resData) => (this.deviceNumberList.includes(resData?.from) && resData?.to == 'c2c_softphone_client'));
|
|
406
|
+
this.showRingAnimation = true;
|
|
407
|
+
// 1️⃣ Get new token for same conference
|
|
408
|
+
const tokenData = await this.getOutgoingCallToken(callInfo?.conferenceId);
|
|
409
|
+
// 2️⃣ Reconnect device
|
|
410
|
+
const options = {
|
|
411
|
+
codecPreferences: ['opus', 'pcmu'],
|
|
412
|
+
closeProtection: true,
|
|
413
|
+
};
|
|
414
|
+
this.device = new Device(tokenData.token.value, options);
|
|
415
|
+
this.call = await this.device.connect({
|
|
416
|
+
params: {
|
|
417
|
+
From: rejoinParticipentInfo.from,
|
|
418
|
+
To: rejoinParticipentInfo.from,
|
|
419
|
+
Env: environment.abb,
|
|
420
|
+
Token: tokenData.token.id,
|
|
421
|
+
Ext: rejoinParticipentInfo.extNum,
|
|
422
|
+
conferenceId: rejoinParticipentInfo?.conferenceId
|
|
423
|
+
},
|
|
424
|
+
rtcConstraints: { audio: { deviceId: 'default' } },
|
|
425
|
+
});
|
|
426
|
+
this.twilioService.call = this.call;
|
|
427
|
+
this.setupEventListeners();
|
|
428
|
+
console.log('Rejoined successfully');
|
|
429
|
+
}
|
|
430
|
+
catch (error) {
|
|
431
|
+
console.error('Rejoin failed', error);
|
|
432
|
+
}
|
|
426
433
|
}
|
|
427
434
|
getStatus(res) {
|
|
428
435
|
if (res.direction == "incoming-call") {
|
|
@@ -537,6 +544,7 @@ export class CallProgressComponent {
|
|
|
537
544
|
}
|
|
538
545
|
else if (response.status == 201) {
|
|
539
546
|
this.isNewAddedCall = false;
|
|
547
|
+
this.isLoadershow.emit(false);
|
|
540
548
|
swal("Error", response.message.join("<br/>"), "error");
|
|
541
549
|
this.endCall();
|
|
542
550
|
}
|
|
@@ -558,8 +566,7 @@ export class CallProgressComponent {
|
|
|
558
566
|
conference: c.isConference || false
|
|
559
567
|
});
|
|
560
568
|
c.isMute = !c.isMute;
|
|
561
|
-
|
|
562
|
-
// this.filteredParticipentList = this.allParticipentList;
|
|
569
|
+
await this.getAllParticipants(c?.conferenceId);
|
|
563
570
|
this.cdr.detectChanges();
|
|
564
571
|
}
|
|
565
572
|
onHoldCall(c) {
|
|
@@ -584,25 +591,25 @@ export class CallProgressComponent {
|
|
|
584
591
|
});
|
|
585
592
|
}
|
|
586
593
|
async onEndCall(c, isAllCallEnd, isContect) {
|
|
587
|
-
if (!c?.isAcceptCall && !isContect && !isAllCallEnd) {
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
}
|
|
598
|
-
let participantId = isAllCallEnd ? 'all' : c.participantId;
|
|
599
|
-
|
|
594
|
+
// if (!c?.isAcceptCall && !isContect && !isAllCallEnd) {
|
|
595
|
+
// let index = this.currentCallList.findIndex((res) => res.participantId == c.participantId)
|
|
596
|
+
// await this.extensionService.getRemoveParticipants(this.currentCallList[index]?.participantId, this.currentCallList[index]?.conferenceId || 'no').subscribe((res) => {
|
|
597
|
+
// this.currentCallList.splice(index, 1)
|
|
598
|
+
// this.incomeingCallSocketService.pause();
|
|
599
|
+
// this.call?.disconnect();
|
|
600
|
+
// this.endIncomingCallEvent.emit(c);
|
|
601
|
+
// return false;
|
|
602
|
+
// })
|
|
603
|
+
// return false;
|
|
604
|
+
// }
|
|
605
|
+
let participantId = isAllCallEnd ? 'all' : c.participantId || c?.id;
|
|
606
|
+
const currentConferenceCallInfo = this.getCurrentCallInfo();
|
|
607
|
+
let conferenceId = c.conferenceId || currentConferenceCallInfo?.conferenceId;
|
|
600
608
|
let res = await this.getRemoveParticipants(participantId, conferenceId);
|
|
601
609
|
if (res?.status == 201 && res?.message == 'participant already left') {
|
|
602
610
|
this.cdr.detectChanges();
|
|
603
611
|
}
|
|
604
|
-
await this.getAllParticipants(
|
|
605
|
-
this.currentCallList = this.currentCallList.filter((res) => res.participantId !== c.participantId);
|
|
612
|
+
await this.getAllParticipants(conferenceId);
|
|
606
613
|
this.incomeingCallSocketService.pause();
|
|
607
614
|
this.endIncomingCallEvent.emit(c);
|
|
608
615
|
this.cdr.detectChanges();
|
|
@@ -697,15 +704,6 @@ export class CallProgressComponent {
|
|
|
697
704
|
catch (e) {
|
|
698
705
|
console.log('Error updating accept state:', e);
|
|
699
706
|
}
|
|
700
|
-
// Start recording if recordCall is true and call is accepted for 30 seconds
|
|
701
|
-
// if (this.recordCall) {
|
|
702
|
-
// setTimeout(() => {
|
|
703
|
-
// if (this.isRecording) return; // If already recording, skip
|
|
704
|
-
// this.startRecording();
|
|
705
|
-
// }, 30000);
|
|
706
|
-
// } else {
|
|
707
|
-
// this.stopRecording();
|
|
708
|
-
// }
|
|
709
707
|
});
|
|
710
708
|
this.call?.on('messageReceived', (message) => {
|
|
711
709
|
});
|
|
@@ -733,155 +731,74 @@ export class CallProgressComponent {
|
|
|
733
731
|
handleError(error) {
|
|
734
732
|
swal("Error", error, "error");
|
|
735
733
|
}
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
// // Unmute the resumed call
|
|
756
|
-
// this.call.mute(false);
|
|
757
|
-
// // Update UI with the resumed call info
|
|
758
|
-
// const fromNumber = this.call.parameters['From'];
|
|
759
|
-
// const callerName = this.call.customParameters?.get('name') || '-';
|
|
760
|
-
// const callerImg = this.call.customParameters?.get('image') || 'assets/images/user.jpg';
|
|
761
|
-
// this.callData = {
|
|
762
|
-
// ...this.callData,
|
|
763
|
-
// phone: fromNumber,
|
|
764
|
-
// displayNum: fromNumber,
|
|
765
|
-
// name: callerName,
|
|
766
|
-
// img: callerImg
|
|
767
|
-
// };
|
|
768
|
-
// // Restart timer for the resumed call
|
|
769
|
-
// this.startTimer();
|
|
770
|
-
// this.disbaleEndCallBtn = false;
|
|
771
|
-
// console.log('Held call is now active:', this.callData);
|
|
772
|
-
// this.cdr.detectChanges();
|
|
773
|
-
// } else {
|
|
774
|
-
// // No held call, completely end
|
|
775
|
-
// console.log('No held call, ending completely');
|
|
776
|
-
// this.endCallEvent.emit();
|
|
777
|
-
// this.maximiseDialpad();
|
|
778
|
-
// }
|
|
779
|
-
// }
|
|
734
|
+
endConfereneceCall(conf) {
|
|
735
|
+
this.selectedConf = conf;
|
|
736
|
+
if (this.deviceNumberList.includes(this.hostnumber?.from)) {
|
|
737
|
+
this.onCallDisconnected();
|
|
738
|
+
}
|
|
739
|
+
else {
|
|
740
|
+
if (conf?.conferenceId) {
|
|
741
|
+
let conference = this.newIncomingCallsList?.find((res) => res?.conferenceId == conf?.conferenceId);
|
|
742
|
+
let participentInfo = conference?.participants?.find((participant) => ((this.deviceNumberList.includes(participant?.from)
|
|
743
|
+
&& participant?.to === 'c2c_softphone_client') || (this.deviceNumberList.includes(participant?.to) && participant?.direction == 'incoming-call')) && !participant?.isLeft);
|
|
744
|
+
if (conference?.id) {
|
|
745
|
+
this.onEndCall(participentInfo);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
else {
|
|
749
|
+
this.endCall();
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
}
|
|
780
753
|
async endCall(isAllCallEnd) {
|
|
781
|
-
|
|
782
|
-
// console.log('Current call:', this.call?.parameters['From']);
|
|
783
|
-
console.log('Held call exists:', !!this.heldCall);
|
|
784
|
-
// Leaving conference state when ending current call action
|
|
785
|
-
this.isConference = false;
|
|
754
|
+
// this.isConference = false;
|
|
786
755
|
this.showRingAnimation = false;
|
|
787
756
|
if (isAllCallEnd) {
|
|
788
757
|
this.stopTimer();
|
|
789
758
|
this.onEndCall({}, isAllCallEnd);
|
|
790
|
-
// this.currentCallList = [];
|
|
791
759
|
if (!this.currentCallList?.length) {
|
|
792
760
|
this.endCallEvent.emit();
|
|
793
761
|
}
|
|
794
762
|
}
|
|
795
763
|
else {
|
|
796
|
-
this.
|
|
797
|
-
this.
|
|
798
|
-
if (this.currentCallList.length > 0) {
|
|
799
|
-
// this.currentCallList[0].isHold = false;
|
|
800
|
-
// this.currentCall = this.currentCallList[0];
|
|
801
|
-
await this.onholdOrUnholdParticipant({
|
|
802
|
-
participantId: [this.currentCall?.participantId],
|
|
803
|
-
conferenceId: this.currentCall?.conferenceId,
|
|
804
|
-
hold: false,
|
|
805
|
-
mute: this.currentCall?.mute || false,
|
|
806
|
-
isConference: this.currentCall?.isConference || false
|
|
807
|
-
});
|
|
808
|
-
}
|
|
809
|
-
else {
|
|
810
|
-
// this.currentCall = null;
|
|
811
|
-
// this.currentCallList = [];
|
|
812
|
-
this.endCallEvent.emit();
|
|
813
|
-
}
|
|
764
|
+
const currentConferenceCallInfo = this.getCurrentCallInfo();
|
|
765
|
+
this.onEndCall(currentConferenceCallInfo, isAllCallEnd);
|
|
814
766
|
}
|
|
815
767
|
if (this.call) {
|
|
816
768
|
this.call.disconnect();
|
|
817
769
|
this.call.reject();
|
|
818
|
-
// this.call = undefined;
|
|
819
770
|
}
|
|
820
|
-
// if (this.heldCall) {
|
|
821
|
-
// if (this.call) {
|
|
822
|
-
// // this.call.disconnect();
|
|
823
|
-
// // this.call = undefined;
|
|
824
|
-
// this.onEndCall(this.call?.callInfo, isAllCallEnd);
|
|
825
|
-
// }
|
|
826
|
-
// console.log('Resuming held call:', this.heldCall.parameters['From']);
|
|
827
|
-
// // Promote held call
|
|
828
|
-
// // this.call = this.heldCall;
|
|
829
|
-
// this.heldCall = undefined;
|
|
830
|
-
// // this.isCallOnHold = false;
|
|
831
|
-
// // this.incomingCallDiv = false; // Ensure UI renders
|
|
832
|
-
// // this.call.mute(false);
|
|
833
|
-
// // Update callData
|
|
834
|
-
// const fromNumber = this.call.parameters['From'];
|
|
835
|
-
// const callerName = this.call.customParameters?.get('name') || '-';
|
|
836
|
-
// const callerImg = this.call.customParameters?.get('image') || 'assets/images/user.jpg';
|
|
837
|
-
// this.callData = {
|
|
838
|
-
// phone: fromNumber,
|
|
839
|
-
// displayNum: fromNumber,
|
|
840
|
-
// name: callerName,
|
|
841
|
-
// img: callerImg
|
|
842
|
-
// };
|
|
843
|
-
// this.startTimer();
|
|
844
|
-
// this.disbaleEndCallBtn = false;
|
|
845
|
-
// // Force UI update
|
|
846
|
-
// setTimeout(() => this.cdr.detectChanges());
|
|
847
|
-
// console.log('Held call is now active:', this.callData);
|
|
848
|
-
// } else {
|
|
849
|
-
// console.log('No held call, ending completely');
|
|
850
|
-
// console.log('test6')
|
|
851
|
-
// this.endCallEvent.emit();
|
|
852
|
-
// if (this.call) {
|
|
853
|
-
// this.call.disconnect();
|
|
854
|
-
// this.onEndCall(this.call?.callInfo, isAllCallEnd);
|
|
855
|
-
// // this.call = undefined;
|
|
856
|
-
// }
|
|
857
|
-
// this.maximiseDialpad();
|
|
858
|
-
// }
|
|
859
771
|
}
|
|
860
772
|
async toggleMute(isConference) {
|
|
861
|
-
// await this.onMuteParticipant({
|
|
862
|
-
// participantId: [this.currentCall?.participantId],
|
|
863
|
-
// conferenceId: this.conferenceId,
|
|
864
|
-
// mute: !this.isMute,
|
|
865
|
-
// })
|
|
866
|
-
// this.call = this.heldCall
|
|
867
|
-
// this.toggleMic()
|
|
868
773
|
this.isMute = !this.isMute;
|
|
869
|
-
console.log('isMute', this.call, this.heldCall);
|
|
870
774
|
this.call?.mute(this.isMute);
|
|
871
|
-
|
|
775
|
+
const currentConferenceCallInfo = this.getCurrentCallInfo();
|
|
776
|
+
this.onMuteParticipant({
|
|
777
|
+
participantId: [currentConferenceCallInfo.participantId || currentConferenceCallInfo?.id],
|
|
778
|
+
conferenceId: currentConferenceCallInfo?.conferenceId,
|
|
779
|
+
hold: currentConferenceCallInfo.hold,
|
|
780
|
+
mute: !currentConferenceCallInfo?.isMute,
|
|
781
|
+
conference: currentConferenceCallInfo.isConference || false
|
|
782
|
+
});
|
|
872
783
|
this.currentCall.isMute = this.isMute;
|
|
873
|
-
// } else {
|
|
874
|
-
// }
|
|
875
784
|
}
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
785
|
+
// audioStream?: MediaStream;
|
|
786
|
+
// micOn = false;
|
|
787
|
+
// async toggleMic() {
|
|
788
|
+
// if (!this.audioStream) {
|
|
789
|
+
// // first time: request mic
|
|
790
|
+
// this.audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
791
|
+
// }
|
|
792
|
+
// this.micOn = !this.micOn;
|
|
793
|
+
// this.audioStream.getAudioTracks().forEach(track => {
|
|
794
|
+
// track.enabled = this.micOn; // false = muted, true = sending audio
|
|
795
|
+
// });
|
|
796
|
+
// }
|
|
797
|
+
getCurrentCallInfo() {
|
|
798
|
+
return this.newIncomingCallsList
|
|
799
|
+
.flatMap((callInfo) => callInfo.participants)
|
|
800
|
+
.find((participant) => ((this.deviceNumberList.includes(participant?.from) && participant?.to === 'c2c_softphone_client')
|
|
801
|
+
|| (this.deviceNumberList.includes(participant?.to) && participant?.direction == 'incoming-call')) && !participant?.isLeft && !participant?.isHold);
|
|
885
802
|
}
|
|
886
803
|
toggleKeypad() {
|
|
887
804
|
this.showKeypad = !this.showKeypad;
|
|
@@ -892,7 +809,6 @@ export class CallProgressComponent {
|
|
|
892
809
|
this.showContactsPanel = false;
|
|
893
810
|
return false;
|
|
894
811
|
}
|
|
895
|
-
// this.isAddRemoveParticipant = false;
|
|
896
812
|
this.showContactsPanel = !isClose;
|
|
897
813
|
this.getAllParticipants(callInfo?.conferenceSid);
|
|
898
814
|
this.filteredList = this.contacts;
|
|
@@ -901,30 +817,16 @@ export class CallProgressComponent {
|
|
|
901
817
|
this.searchText = '';
|
|
902
818
|
this.applyFilter();
|
|
903
819
|
}
|
|
904
|
-
addRemoveParticipant() {
|
|
905
|
-
// const conferenceSId = this.addRes?.conferenceSid;
|
|
820
|
+
async addRemoveParticipant() {
|
|
906
821
|
this.isAddRemoveParticipant = !this.isAddRemoveParticipant;
|
|
907
|
-
|
|
822
|
+
await this.getAllParticipants(this.currentCall.conferenceSid);
|
|
908
823
|
this.filteredParticipentList = this.allParticipentList;
|
|
909
824
|
}
|
|
910
825
|
async add(data) {
|
|
911
|
-
// if(data?.status != 'ringing'){
|
|
912
826
|
this.isIncomingCallBtnDisable = true;
|
|
913
827
|
this.conferenceId = this.twilioService.conferenceCallInfo.conferenceId;
|
|
914
828
|
if (this.currentCallList.length > 1 && this.currentCall?.isAcceptCall) {
|
|
915
829
|
if (this.currentCall?.isConference) {
|
|
916
|
-
// this.isConferenceCallHold = true;
|
|
917
|
-
// this.currentCallList.forEach((res) => {
|
|
918
|
-
// if (res.isConference) {
|
|
919
|
-
// this.onholdOrUnholdParticipant({
|
|
920
|
-
// participantId: [res.participantId],
|
|
921
|
-
// conferenceId: res?.conferenceId,
|
|
922
|
-
// hold: true,
|
|
923
|
-
// mute: res?.mute || false,
|
|
924
|
-
// conference: res.isConference || false
|
|
925
|
-
// });
|
|
926
|
-
// }
|
|
927
|
-
// })
|
|
928
830
|
this.onholdOrUnholdParticipant({
|
|
929
831
|
participantId: [this.hostnumber.participantId],
|
|
930
832
|
conferenceId: this.hostnumber?.conferenceId,
|
|
@@ -935,10 +837,6 @@ export class CallProgressComponent {
|
|
|
935
837
|
}
|
|
936
838
|
else {
|
|
937
839
|
this.isConferenceCallHold = false;
|
|
938
|
-
// const index = this.currentCallList.findIndex((item: any) => item.participantId == this.currentCall?.participantId);
|
|
939
|
-
// if (index != -1) {
|
|
940
|
-
// // this.currentCallList[index].isHold = true;
|
|
941
|
-
// }
|
|
942
840
|
await this.onholdOrUnholdParticipant({
|
|
943
841
|
participantId: this.currentCall?.isIncomingCall ? [this.currentCall?.id] : [this.currentCall?.participantId],
|
|
944
842
|
conferenceId: this.currentCall?.conferenceId,
|
|
@@ -946,22 +844,8 @@ export class CallProgressComponent {
|
|
|
946
844
|
mute: this.currentCall?.mute || false,
|
|
947
845
|
conference: this.currentCall?.isConference || false
|
|
948
846
|
});
|
|
949
|
-
// data.isHold = false;
|
|
950
847
|
}
|
|
951
848
|
}
|
|
952
|
-
// let incomingCallData = this.currentCallList.filter((item: any) => item.isIncomingCall && item.isAcceptCall);
|
|
953
|
-
// if (this.currentCallList.length > 1) {
|
|
954
|
-
// // this.call = await this.twilioService.connect('');
|
|
955
|
-
// this.twilioService.addIncomingParticipant(data?.id, this.twilioService.conferenceCallInfo.conferenceId).subscribe((res: any) => {
|
|
956
|
-
// console.log(res, 'bhhhhhhhhhhhhhhhhhhh')
|
|
957
|
-
// this.incomeingCallSocketService.isCurrentIncomingCallList.push(data?.id || data?.participantId);
|
|
958
|
-
// this.incomeingCallSocketService.pause();
|
|
959
|
-
// data.isAcceptCall = true;
|
|
960
|
-
// // this.currentCall = data;
|
|
961
|
-
// this.setIncomingCallStatus(data)
|
|
962
|
-
// })
|
|
963
|
-
// } else {
|
|
964
|
-
// this.currentCall = data;
|
|
965
849
|
let payload = {
|
|
966
850
|
recordId: data?.id,
|
|
967
851
|
ipAddress: '',
|
|
@@ -1023,7 +907,6 @@ export class CallProgressComponent {
|
|
|
1023
907
|
conference: true
|
|
1024
908
|
});
|
|
1025
909
|
this.callData = {
|
|
1026
|
-
// ...this.callData,
|
|
1027
910
|
phone: phoneNumber,
|
|
1028
911
|
displayNum: phoneNumber,
|
|
1029
912
|
name: contact?.name || `${contact?.firstName} ${contact?.lastName}` || phoneNumber,
|
|
@@ -1051,24 +934,12 @@ export class CallProgressComponent {
|
|
|
1051
934
|
conference: true
|
|
1052
935
|
});
|
|
1053
936
|
}
|
|
1054
|
-
else {
|
|
1055
|
-
await this.onholdOrUnholdParticipant({
|
|
1056
|
-
participantId: [c?.participantId],
|
|
1057
|
-
conferenceId: c.conferenceId,
|
|
1058
|
-
hold: true,
|
|
1059
|
-
mute: c?.mute || false,
|
|
1060
|
-
conference: c?.isConference || false
|
|
1061
|
-
});
|
|
1062
|
-
}
|
|
1063
937
|
});
|
|
1064
938
|
// Put current call on hold
|
|
1065
939
|
this.isCallOnHold = true;
|
|
1066
940
|
this.showContactsPanel = false;
|
|
1067
941
|
this.showRingAnimation = true;
|
|
1068
942
|
this.isConference = true;
|
|
1069
|
-
// const contactName = [contact?.firstName, contact?.middleName, contact?.lastName]
|
|
1070
|
-
// .filter(Boolean)
|
|
1071
|
-
// .join(' ');
|
|
1072
943
|
// Add participant to the conference
|
|
1073
944
|
let data = await this.addParticipantToCall({
|
|
1074
945
|
from: this.callData?.from || this.selectedCallerId?.number,
|
|
@@ -1100,9 +971,6 @@ export class CallProgressComponent {
|
|
|
1100
971
|
isConference: false
|
|
1101
972
|
};
|
|
1102
973
|
this.cdr.detectChanges();
|
|
1103
|
-
console.log(this.callData, 'this.callData');
|
|
1104
|
-
console.log('test111111');
|
|
1105
|
-
console.log("Participant added to conference:", phoneNumber);
|
|
1106
974
|
this.showRingAnimation = false;
|
|
1107
975
|
}
|
|
1108
976
|
}
|
|
@@ -1118,13 +986,6 @@ export class CallProgressComponent {
|
|
|
1118
986
|
if (isInvalid) {
|
|
1119
987
|
return false;
|
|
1120
988
|
}
|
|
1121
|
-
// this.isSavedContactDialled();
|
|
1122
|
-
// this.isPaymentDue = localStorage.getItem('paymentDue') === 'false' ? false : true;
|
|
1123
|
-
// if (this.isPaymentDue) {
|
|
1124
|
-
// swal('Warning', 'Please note that your payment is due, To continue on your services kindly subscribe to use uninterrupted services.');
|
|
1125
|
-
// return false;
|
|
1126
|
-
// }
|
|
1127
|
-
// this.isTrialPeriodOver = localStorage.getItem('trialOver') === 'false' ? false : true;
|
|
1128
989
|
let alreadyInCall = this.currentCallList.find((res) => res.to == number || res.from == number);
|
|
1129
990
|
if (alreadyInCall) {
|
|
1130
991
|
swal('Error', `Already ${number} number in this call.`);
|
|
@@ -1134,32 +995,10 @@ export class CallProgressComponent {
|
|
|
1134
995
|
swal('Error', 'You can not dial this number');
|
|
1135
996
|
return false;
|
|
1136
997
|
}
|
|
1137
|
-
// const hasPermission = await this.checkMicrophonePermission();
|
|
1138
|
-
// if (!hasPermission) {
|
|
1139
|
-
// await this.askForMicrophonePermission();
|
|
1140
|
-
// return false;
|
|
1141
|
-
// }
|
|
1142
|
-
// this.isLoadershow = true;
|
|
1143
|
-
// if (!this.selectedCallerId) {
|
|
1144
|
-
// this.shakeDedicatedBtn = true;
|
|
1145
|
-
// this.showDialAlert('Select a C2C number to call');
|
|
1146
|
-
// setTimeout(() => {
|
|
1147
|
-
// this.shakeDedicatedBtn = false;
|
|
1148
|
-
// }, 3000);
|
|
1149
|
-
// this.isLoadershow = false;
|
|
1150
|
-
// return false;
|
|
1151
|
-
// }
|
|
1152
|
-
// Clear displayNum if value is bound from previous call
|
|
1153
|
-
// this.callData.displayNum = '';
|
|
1154
|
-
// Get number to be dialed from backend
|
|
1155
998
|
let contact = this.contacts.find((contact) => {
|
|
1156
999
|
return contact.numbersList.some((num) => num.number === number);
|
|
1157
1000
|
});
|
|
1158
1001
|
number = await this.getToNumber(number);
|
|
1159
|
-
// if (this.terminateCall) {
|
|
1160
|
-
// this.terminateCall = false;
|
|
1161
|
-
// return;
|
|
1162
|
-
// }
|
|
1163
1002
|
// Update call data in a single operation
|
|
1164
1003
|
const callData = {
|
|
1165
1004
|
name: contact?.firstName,
|
|
@@ -1171,50 +1010,39 @@ export class CallProgressComponent {
|
|
|
1171
1010
|
from: this.selectedCallerId.number,
|
|
1172
1011
|
timestamp: new Date().toISOString()
|
|
1173
1012
|
};
|
|
1174
|
-
// console.log('dd10')
|
|
1175
|
-
// this.isCallInProgress = true;
|
|
1176
1013
|
console.log('call startted', callData);
|
|
1177
1014
|
if (isNewConference) {
|
|
1178
|
-
// if(this.currentCall.isConference) {
|
|
1179
1015
|
this.isNewAddedCall = true;
|
|
1180
|
-
let
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1016
|
+
let ourNumberInfo = {};
|
|
1017
|
+
let callInfo = this.newIncomingCallsList.find((callInfo, i) => this.currentCall.conferenceId == callInfo.conferenceId);
|
|
1018
|
+
if (callInfo) {
|
|
1019
|
+
ourNumberInfo = callInfo.participants.find((resData) => ((this.deviceNumberList.includes(resData?.from) && resData?.to == 'c2c_softphone_client') || (this.deviceNumberList.includes(resData?.to) && resData?.direction == 'incoming-call')) && !resData?.isLeft);
|
|
1020
|
+
}
|
|
1021
|
+
if (ourNumberInfo?.id) {
|
|
1022
|
+
console.log(ourNumberInfo, 'selfInfo');
|
|
1187
1023
|
await this.onholdOrUnholdParticipant({
|
|
1188
|
-
participantId:
|
|
1189
|
-
conferenceId:
|
|
1024
|
+
participantId: [ourNumberInfo?.id],
|
|
1025
|
+
conferenceId: ourNumberInfo?.conferenceId,
|
|
1190
1026
|
hold: true,
|
|
1191
|
-
mute:
|
|
1192
|
-
conference:
|
|
1027
|
+
mute: ourNumberInfo?.mute || false,
|
|
1028
|
+
conference: ourNumberInfo?.isConference || false
|
|
1193
1029
|
});
|
|
1194
|
-
|
|
1195
|
-
this.isConferenceCallHold = true;
|
|
1196
|
-
}
|
|
1030
|
+
this.isConferenceCallHold = true;
|
|
1197
1031
|
this.startCall(callData, isNewConference);
|
|
1198
1032
|
}
|
|
1199
1033
|
else {
|
|
1200
1034
|
this.startCall(callData, isNewConference);
|
|
1201
1035
|
}
|
|
1202
1036
|
this.searchText = '';
|
|
1203
|
-
// }
|
|
1204
1037
|
}
|
|
1205
1038
|
else {
|
|
1206
1039
|
this.searchText = '';
|
|
1207
1040
|
this.callContact(number, true);
|
|
1208
1041
|
}
|
|
1209
|
-
// this.callInitiated.emit({ ...this.callData });
|
|
1210
1042
|
return true;
|
|
1211
1043
|
}
|
|
1212
1044
|
catch (e) {
|
|
1213
|
-
// console.error('Error in initiateCall:', e);
|
|
1214
|
-
// this.isLoadershow = false;
|
|
1215
1045
|
this.showDialAlert('Failed to initiate call. Please try again.');
|
|
1216
|
-
// console.log('dd11')
|
|
1217
|
-
// this.isCallInProgress = false;
|
|
1218
1046
|
return false;
|
|
1219
1047
|
}
|
|
1220
1048
|
}
|
|
@@ -1264,192 +1092,131 @@ export class CallProgressComponent {
|
|
|
1264
1092
|
}
|
|
1265
1093
|
getAllParticipants(conferenceSid) {
|
|
1266
1094
|
this.extensionService.getAllParticipants(conferenceSid).subscribe((res) => {
|
|
1267
|
-
this.allParticipentList = res.participants;
|
|
1095
|
+
this.allParticipentList = res.participants.filter((resInfo) => !(resInfo?.to == 'c2c_softphone_client' && resInfo?.direction == 'incoming-call'));
|
|
1096
|
+
;
|
|
1268
1097
|
this.filteredParticipentList = this.allParticipentList;
|
|
1269
1098
|
this.applyFilter();
|
|
1270
|
-
// let index = this.contacts.findIndex((c:any)=> c?.numbersList[0]?.number == res?.to);
|
|
1271
|
-
// if(index > -1){
|
|
1272
|
-
// this.contacts[index].isCallOnHold = true;
|
|
1273
|
-
// }
|
|
1274
|
-
// else {
|
|
1275
|
-
// res['IsConnected'] = true;
|
|
1276
|
-
// this.contacts.push(res)
|
|
1277
|
-
// }
|
|
1278
1099
|
});
|
|
1279
1100
|
}
|
|
1280
|
-
// acceptConcurrentCall(incomingCall: any) {
|
|
1281
|
-
// if (!incomingCall) return;
|
|
1282
|
-
// // Put current call on hold instead of disconnecting
|
|
1283
|
-
// if (this.call) {
|
|
1284
|
-
// this.heldCall = this.call;
|
|
1285
|
-
// this.isCallOnHold = true;
|
|
1286
|
-
// // Mute the held call
|
|
1287
|
-
// this.heldCall.mute(true);
|
|
1288
|
-
// }
|
|
1289
|
-
// incomingCall.accept();
|
|
1290
|
-
// this.call = incomingCall;
|
|
1291
|
-
// this.callData.phone = incomingCall.parameters['From'];
|
|
1292
|
-
// this.callData.name = incomingCall.customParameters?.get('name') || '-';
|
|
1293
|
-
// this.callData.img = incomingCall.customParameters?.get('image') || 'assets/images/user.jpg';
|
|
1294
|
-
// this.isConcurrentIncoming = false;
|
|
1295
|
-
// this.incomingCallDiv = false;
|
|
1296
|
-
// this.disbaleEndCallBtn = false;
|
|
1297
|
-
// // Reset timer for new call
|
|
1298
|
-
// this.stopTimer();
|
|
1299
|
-
// this.startTimer();
|
|
1300
|
-
// this.cdr.detectChanges();
|
|
1301
|
-
// }
|
|
1302
|
-
acceptConcurrentCall(incomingCall) {
|
|
1303
|
-
if (!incomingCall)
|
|
1304
|
-
return;
|
|
1305
|
-
// Put current call on hold instead of disconnecting
|
|
1306
|
-
// if (this.call) {
|
|
1307
|
-
// // this.heldCall = this.call;
|
|
1308
|
-
// this.isCallOnHold = true;
|
|
1309
|
-
// // // Mute the held call
|
|
1310
|
-
// // this.heldCall.mute(true);
|
|
1311
|
-
// // }
|
|
1312
|
-
// // Accept the new call
|
|
1313
|
-
// incomingCall.accept();
|
|
1314
|
-
// this.call = incomingCall;
|
|
1315
|
-
// this.callData.phone = incomingCall.parameters['From'];
|
|
1316
|
-
// this.callData.name = incomingCall.customParameters?.get('name') || '-';
|
|
1317
|
-
// this.callData.img = incomingCall.customParameters?.get('image') || 'assets/images/user.jpg';
|
|
1318
|
-
// this.isConcurrentIncoming = false;
|
|
1319
|
-
// this.incomingCallDiv = false;
|
|
1320
|
-
// this.disbaleEndCallBtn = false;
|
|
1321
|
-
// // 🟢 Remove the accepted call from incoming list
|
|
1322
|
-
// this.newIncomingCallsList = (this.newIncomingCallsList || []).filter(
|
|
1323
|
-
// (c: any) => c?.parameters?.CallSid !== incomingCall?.parameters?.CallSid
|
|
1324
|
-
// );
|
|
1325
|
-
// this.incomingCallsNewInfo.emit(this.newIncomingCallsList);
|
|
1326
|
-
// // 🕒 Reset timer for new call
|
|
1327
|
-
// this.stopTimer();
|
|
1328
|
-
// this.startTimer();
|
|
1329
|
-
// this.cdr.detectChanges();
|
|
1330
|
-
}
|
|
1331
1101
|
async swapCalls(callInfo, isConferenceCall) {
|
|
1332
1102
|
// if (!this.heldCall || !this.call) return;
|
|
1333
1103
|
console.log(this.call, 'this.call');
|
|
1334
1104
|
console.log(this.heldCall, 'this.heldCall');
|
|
1335
1105
|
console.log(this.currentCallList, 'this.currentCallList');
|
|
1336
1106
|
console.log(callInfo, 'callInfo for swapCalls');
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
participantId: [c?.participantId],
|
|
1342
|
-
conferenceId: c.conferenceId,
|
|
1343
|
-
hold: true,
|
|
1344
|
-
mute: c?.mute || false,
|
|
1345
|
-
conference: c?.isConference || false
|
|
1346
|
-
});
|
|
1347
|
-
// this.isConferenceCallHold = true;
|
|
1348
|
-
}
|
|
1349
|
-
else if (isConferenceCall && c?.conferenceId == callInfo.conferenceId && c.isConference) {
|
|
1350
|
-
await this.onholdOrUnholdParticipant({
|
|
1351
|
-
participantId: [c?.participantId],
|
|
1352
|
-
conferenceId: c.conferenceId,
|
|
1353
|
-
hold: false,
|
|
1354
|
-
mute: c?.mute || false,
|
|
1355
|
-
conference: true
|
|
1356
|
-
});
|
|
1357
|
-
this.isConference = true;
|
|
1358
|
-
this.isConferenceCallHold = false;
|
|
1359
|
-
}
|
|
1360
|
-
else if (callInfo?.isHold && c?.participantId === callInfo?.participantId) {
|
|
1361
|
-
await this.onholdOrUnholdParticipant({
|
|
1362
|
-
participantId: [c?.participantId],
|
|
1363
|
-
conferenceId: c.conferenceId,
|
|
1364
|
-
hold: false,
|
|
1365
|
-
mute: c?.mute || false,
|
|
1366
|
-
conference: c?.isConference || false
|
|
1367
|
-
});
|
|
1368
|
-
}
|
|
1369
|
-
});
|
|
1370
|
-
}
|
|
1371
|
-
else if (isConferenceCall) {
|
|
1372
|
-
this.currentCallList.forEach(async (c) => {
|
|
1373
|
-
if (c?.isConference && callInfo?.conferenceId == c?.conferenceId) {
|
|
1107
|
+
this.newIncomingCallsList.forEach(async (c) => {
|
|
1108
|
+
if (c?.conferenceId == callInfo?.conferenceId) {
|
|
1109
|
+
let participantInfo = c.participants.find((resData) => ((this.deviceNumberList.includes(resData?.from) && resData?.to == 'c2c_softphone_client') || (this.deviceNumberList.includes(resData?.to) && resData?.direction == 'incoming-call')) && !resData?.isLeft);
|
|
1110
|
+
if (participantInfo?.id) {
|
|
1374
1111
|
await this.onholdOrUnholdParticipant({
|
|
1375
|
-
participantId: [
|
|
1376
|
-
conferenceId:
|
|
1112
|
+
participantId: [participantInfo?.id],
|
|
1113
|
+
conferenceId: participantInfo?.conferenceId,
|
|
1377
1114
|
hold: false,
|
|
1378
|
-
mute:
|
|
1379
|
-
conference:
|
|
1380
|
-
});
|
|
1381
|
-
}
|
|
1382
|
-
else {
|
|
1383
|
-
// c.isHold = true;
|
|
1384
|
-
await this.onholdOrUnholdParticipant({
|
|
1385
|
-
participantId: [c?.participantId],
|
|
1386
|
-
conferenceId: c.conferenceId,
|
|
1387
|
-
hold: true,
|
|
1388
|
-
mute: c?.mute || false,
|
|
1389
|
-
conference: c?.isConference || false
|
|
1115
|
+
mute: participantInfo?.mute || false,
|
|
1116
|
+
conference: participantInfo?.isConference || false
|
|
1390
1117
|
});
|
|
1118
|
+
// this.isConferenceCallHold = true;
|
|
1391
1119
|
}
|
|
1392
|
-
}
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
this.currentCallList.forEach(async (c) => {
|
|
1397
|
-
if (c?.participantId && !c?.isHold) {
|
|
1120
|
+
}
|
|
1121
|
+
else {
|
|
1122
|
+
let participantInfo = c.participants.find((resData) => ((this.deviceNumberList.includes(resData?.from) && resData?.to == 'c2c_softphone_client') || (this.deviceNumberList.includes(resData?.to) && resData?.direction == 'incoming-call')) && !resData?.isLeft);
|
|
1123
|
+
if (participantInfo?.id && !participantInfo?.isHold) {
|
|
1398
1124
|
await this.onholdOrUnholdParticipant({
|
|
1399
|
-
participantId: [
|
|
1400
|
-
conferenceId:
|
|
1125
|
+
participantId: [participantInfo?.id],
|
|
1126
|
+
conferenceId: participantInfo?.conferenceId,
|
|
1401
1127
|
hold: true,
|
|
1402
|
-
mute:
|
|
1403
|
-
conference:
|
|
1404
|
-
});
|
|
1405
|
-
}
|
|
1406
|
-
else if (callInfo?.isHold && c?.participantId === callInfo?.participantId) {
|
|
1407
|
-
await this.onholdOrUnholdParticipant({
|
|
1408
|
-
participantId: [c?.participantId],
|
|
1409
|
-
conferenceId: c.conferenceId,
|
|
1410
|
-
hold: false,
|
|
1411
|
-
mute: c?.mute || false,
|
|
1412
|
-
conference: c?.isConference || false
|
|
1128
|
+
mute: participantInfo?.mute || false,
|
|
1129
|
+
conference: participantInfo?.isConference || false
|
|
1413
1130
|
});
|
|
1131
|
+
// this.isConferenceCallHold = true;
|
|
1414
1132
|
}
|
|
1415
|
-
}
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
//
|
|
1429
|
-
//
|
|
1430
|
-
//
|
|
1431
|
-
//
|
|
1432
|
-
//
|
|
1433
|
-
//
|
|
1434
|
-
//
|
|
1435
|
-
//
|
|
1436
|
-
//
|
|
1437
|
-
//
|
|
1438
|
-
//
|
|
1439
|
-
//
|
|
1440
|
-
//
|
|
1441
|
-
//
|
|
1442
|
-
//
|
|
1443
|
-
//
|
|
1444
|
-
//
|
|
1445
|
-
//
|
|
1446
|
-
//
|
|
1447
|
-
//
|
|
1448
|
-
//
|
|
1449
|
-
//
|
|
1450
|
-
//
|
|
1451
|
-
//
|
|
1452
|
-
|
|
1133
|
+
}
|
|
1134
|
+
if (c?.isConference && !c?.isHold && this.currentCall?.conferenceId == c?.conferenceId) {
|
|
1135
|
+
await this.onholdOrUnholdParticipant({
|
|
1136
|
+
participantId: [c?.participantId],
|
|
1137
|
+
conferenceId: c.conferenceId,
|
|
1138
|
+
hold: true,
|
|
1139
|
+
mute: c?.mute || false,
|
|
1140
|
+
conference: c?.isConference || false
|
|
1141
|
+
});
|
|
1142
|
+
// this.isConferenceCallHold = true;
|
|
1143
|
+
}
|
|
1144
|
+
});
|
|
1145
|
+
// if (this.currentCall?.isConference) {
|
|
1146
|
+
// this.currentCallList.forEach(async (c: any) => {
|
|
1147
|
+
// if (c?.isConference && !c?.isHold && this.currentCall?.conferenceId == c?.conferenceId) {
|
|
1148
|
+
// await this.onholdOrUnholdParticipant({
|
|
1149
|
+
// participantId: [c?.participantId],
|
|
1150
|
+
// conferenceId: c.conferenceId,
|
|
1151
|
+
// hold: true,
|
|
1152
|
+
// mute: c?.mute || false,
|
|
1153
|
+
// conference: c?.isConference || false
|
|
1154
|
+
// });
|
|
1155
|
+
// // this.isConferenceCallHold = true;
|
|
1156
|
+
// } else if (isConferenceCall && c?.conferenceId == callInfo.conferenceId && c.isConference) {
|
|
1157
|
+
// await this.onholdOrUnholdParticipant({
|
|
1158
|
+
// participantId: [c?.participantId],
|
|
1159
|
+
// conferenceId: c.conferenceId,
|
|
1160
|
+
// hold: false,
|
|
1161
|
+
// mute: c?.mute || false,
|
|
1162
|
+
// conference: true
|
|
1163
|
+
// });
|
|
1164
|
+
// this.isConference = true;
|
|
1165
|
+
// this.isConferenceCallHold = false
|
|
1166
|
+
// } else if (callInfo?.isHold && c?.participantId === callInfo?.participantId) {
|
|
1167
|
+
// await this.onholdOrUnholdParticipant({
|
|
1168
|
+
// participantId: [c?.participantId],
|
|
1169
|
+
// conferenceId: c.conferenceId,
|
|
1170
|
+
// hold: false,
|
|
1171
|
+
// mute: c?.mute || false,
|
|
1172
|
+
// conference: c?.isConference || false
|
|
1173
|
+
// });
|
|
1174
|
+
// }
|
|
1175
|
+
// });
|
|
1176
|
+
// } else if (isConferenceCall) {
|
|
1177
|
+
// this.currentCallList.forEach(async (c: any) => {
|
|
1178
|
+
// if (c?.isConference && callInfo?.conferenceId == c?.conferenceId) {
|
|
1179
|
+
// await this.onholdOrUnholdParticipant({
|
|
1180
|
+
// participantId: [c?.participantId],
|
|
1181
|
+
// conferenceId: c.conferenceId,
|
|
1182
|
+
// hold: false,
|
|
1183
|
+
// mute: c?.mute || false,
|
|
1184
|
+
// conference: c?.isConference || false
|
|
1185
|
+
// });
|
|
1186
|
+
// } else {
|
|
1187
|
+
// // c.isHold = true;
|
|
1188
|
+
// await this.onholdOrUnholdParticipant({
|
|
1189
|
+
// participantId: [c?.participantId],
|
|
1190
|
+
// conferenceId: c.conferenceId,
|
|
1191
|
+
// hold: true,
|
|
1192
|
+
// mute: c?.mute || false,
|
|
1193
|
+
// conference: c?.isConference || false
|
|
1194
|
+
// });
|
|
1195
|
+
// }
|
|
1196
|
+
// });
|
|
1197
|
+
// } else {
|
|
1198
|
+
// this.isConferenceCallHold = false;
|
|
1199
|
+
// this.currentCallList.forEach(async (c: any) => {
|
|
1200
|
+
// if (c?.participantId && !c?.isHold) {
|
|
1201
|
+
// await this.onholdOrUnholdParticipant({
|
|
1202
|
+
// participantId: [c?.participantId],
|
|
1203
|
+
// conferenceId: c.conferenceId,
|
|
1204
|
+
// hold: true,
|
|
1205
|
+
// mute: c?.mute || false,
|
|
1206
|
+
// conference: c?.isConference || false
|
|
1207
|
+
// });
|
|
1208
|
+
// } else if (callInfo?.isHold && c?.participantId === callInfo?.participantId) {
|
|
1209
|
+
// await this.onholdOrUnholdParticipant({
|
|
1210
|
+
// participantId: [c?.participantId],
|
|
1211
|
+
// conferenceId: c.conferenceId,
|
|
1212
|
+
// hold: false,
|
|
1213
|
+
// mute: c?.mute || false,
|
|
1214
|
+
// conference: c?.isConference || false
|
|
1215
|
+
// });
|
|
1216
|
+
// }
|
|
1217
|
+
// });
|
|
1218
|
+
// }
|
|
1219
|
+
// console.log('this.currentCallList after swap', this.currentCallList);
|
|
1453
1220
|
this.cdr.detectChanges();
|
|
1454
1221
|
}
|
|
1455
1222
|
isMergeCallAllowed() {
|
|
@@ -1462,45 +1229,23 @@ export class CallProgressComponent {
|
|
|
1462
1229
|
this.currentCallList.forEach(async (c) => {
|
|
1463
1230
|
if (c.conferenceId == this.currentCall.conferenceId) {
|
|
1464
1231
|
if (c?.participantId) {
|
|
1465
|
-
//
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
});
|
|
1232
|
+
// await this.onholdOrUnholdParticipant({
|
|
1233
|
+
// participantId: [c?.participantId],
|
|
1234
|
+
// conferenceId: c.conferenceId,
|
|
1235
|
+
// hold: false,
|
|
1236
|
+
// mute: c?.mute || false,
|
|
1237
|
+
// conference: true
|
|
1238
|
+
// });
|
|
1473
1239
|
c.isConference = true;
|
|
1474
|
-
// } else if(c?.participantId && c.isIncomingCall){
|
|
1475
|
-
// await this.twilioService.addIncomingParticipant(c?.participantId, this.conferenceId).subscribe((data: any) => {
|
|
1476
|
-
// console.log(data,'bhhhhhhhhhhhhhhhhhhh')
|
|
1477
|
-
// })
|
|
1478
|
-
// c.isHold = false;
|
|
1479
|
-
// c.isConference = true;
|
|
1480
1240
|
}
|
|
1481
1241
|
this.isConferenceCallHold = false;
|
|
1482
1242
|
}
|
|
1483
1243
|
});
|
|
1484
|
-
// await this.onholdOrUnholdParticipant({
|
|
1485
|
-
// participantId: this.heldCall?.callInfo?.participantId,
|
|
1486
|
-
// conferenceId: this.conferenceId,
|
|
1487
|
-
// hold: false
|
|
1488
|
-
// });
|
|
1489
|
-
// this.heldCall.mute(false);
|
|
1490
|
-
// this.call.mute(false);
|
|
1491
1244
|
this.isCallOnHold = false;
|
|
1492
1245
|
this.isConference = true;
|
|
1493
1246
|
this.cdr.detectChanges();
|
|
1494
1247
|
}
|
|
1495
1248
|
}
|
|
1496
|
-
endHeldCall() {
|
|
1497
|
-
// if (this.heldCall) {
|
|
1498
|
-
// this.heldCall.disconnect();
|
|
1499
|
-
// this.heldCall = undefined;
|
|
1500
|
-
// this.isCallOnHold = false;
|
|
1501
|
-
// this.cdr.detectChanges();
|
|
1502
|
-
// }
|
|
1503
|
-
}
|
|
1504
1249
|
hasDetailedInfo(callData) {
|
|
1505
1250
|
if (!callData)
|
|
1506
1251
|
return false;
|
|
@@ -1519,57 +1264,6 @@ export class CallProgressComponent {
|
|
|
1519
1264
|
}
|
|
1520
1265
|
return false;
|
|
1521
1266
|
}
|
|
1522
|
-
// onClickExpand(data?: any): void {
|
|
1523
|
-
// if (this.selectedIncomingCall === data && this.isClickExpand) {
|
|
1524
|
-
// this.isClickExpand = false;
|
|
1525
|
-
// this.selectedIncomingCall = null;
|
|
1526
|
-
// // this.selectedIncomingCallInfo.emit({});
|
|
1527
|
-
// return;
|
|
1528
|
-
// }
|
|
1529
|
-
// this.isClickExpand = true;
|
|
1530
|
-
// this.selectedIncomingCall = data;
|
|
1531
|
-
// if (this.selectedIncomingCall) {
|
|
1532
|
-
// this.selectedIncomingCall['isClickExpand'] = true;
|
|
1533
|
-
// if (this.newIncomingCallsList && this.newIncomingCallsList.length > 0) {
|
|
1534
|
-
// this.newIncomingCallsList.forEach((call: any) => {
|
|
1535
|
-
// if (call !== this.selectedIncomingCall) {
|
|
1536
|
-
// call['isClickExpand'] = false;
|
|
1537
|
-
// }
|
|
1538
|
-
// });
|
|
1539
|
-
// }
|
|
1540
|
-
// // this.selectedIncomingCallInfo.emit(this.selectedIncomingCall);
|
|
1541
|
-
// if (!this.selectedIncomingCall.userInfo || this.selectedIncomingCall.userInfo.status == 201) {
|
|
1542
|
-
// // this.getUserInformation(this.selectedIncomingCall);
|
|
1543
|
-
// }
|
|
1544
|
-
// }
|
|
1545
|
-
// }
|
|
1546
|
-
// getUserInformation(incomingCallData: any) {
|
|
1547
|
-
// let data = this.fromEntries(Array.from(incomingCallData.customParameters.entries()));
|
|
1548
|
-
// this.extensionService.getUserInformation(data['twilioAuthId']).subscribe(
|
|
1549
|
-
// response => {
|
|
1550
|
-
// setTimeout(()=>{
|
|
1551
|
-
// incomingCallData['userInfo']=response
|
|
1552
|
-
// }, 5000)
|
|
1553
|
-
// }, error => {
|
|
1554
|
-
// console.error('Error starting recording', error);
|
|
1555
|
-
// });
|
|
1556
|
-
// }
|
|
1557
|
-
// rejectConcurrentCall(incomingCall: any) {
|
|
1558
|
-
// if (!incomingCall) return;
|
|
1559
|
-
// if (incomingCall.reject) {
|
|
1560
|
-
// incomingCall.reject();
|
|
1561
|
-
// }
|
|
1562
|
-
// if (incomingCall.disconnect) incomingCall.disconnect();
|
|
1563
|
-
// // Remove from list
|
|
1564
|
-
// this.newIncomingCallsList = (this.newIncomingCallsList || []).filter((c: any) => c?.parameters?.CallSid !== incomingCall?.parameters?.CallSid);
|
|
1565
|
-
// this.incomingCallsNewInfo.emit(this.newIncomingCallsList);
|
|
1566
|
-
// // If no more incoming, hide banner
|
|
1567
|
-
// if (!this.newIncomingCallsList || this.newIncomingCallsList.length === 0) {
|
|
1568
|
-
// this.isConcurrentIncoming = false;
|
|
1569
|
-
// this.incomingCallDiv = false;
|
|
1570
|
-
// }
|
|
1571
|
-
// this.cdr.detectChanges();
|
|
1572
|
-
// }
|
|
1573
1267
|
onCallInputs(num) {
|
|
1574
1268
|
try {
|
|
1575
1269
|
if (Number.isInteger(num) || num == '+' || num == '*' || num == '#') {
|
|
@@ -1601,13 +1295,10 @@ export class CallProgressComponent {
|
|
|
1601
1295
|
}
|
|
1602
1296
|
}
|
|
1603
1297
|
closeIncomingCall(data) {
|
|
1604
|
-
// this.incomingCallDiv = false;
|
|
1605
1298
|
if (data.show) {
|
|
1606
|
-
//this.showCallProgressEvent.emit()
|
|
1607
1299
|
// handle incoming call accepted
|
|
1608
1300
|
this.startTimer();
|
|
1609
1301
|
this.disbaleEndCallBtn = false;
|
|
1610
|
-
// this.call = data.call;
|
|
1611
1302
|
this.isConcurrentIncoming = false;
|
|
1612
1303
|
this.incomingCallDiv = false;
|
|
1613
1304
|
const incomingDetail = this.extensionService.getCallSid();
|
|
@@ -1656,9 +1347,6 @@ export class CallProgressComponent {
|
|
|
1656
1347
|
this.incomingCallSid = details.callSid;
|
|
1657
1348
|
this.incomingRecordCall = details.recordCall;
|
|
1658
1349
|
sid = this.incomingCallSid ? this.incomingCallSid : this.callSid || this.addRes?.conferenceSid;
|
|
1659
|
-
// if (!this.incomingRecordCall && !this.recordCall) {
|
|
1660
|
-
// return;
|
|
1661
|
-
// }
|
|
1662
1350
|
let payload = {
|
|
1663
1351
|
"conferenceId": this.currentCall?.conferenceId,
|
|
1664
1352
|
};
|
|
@@ -1672,9 +1360,6 @@ export class CallProgressComponent {
|
|
|
1672
1360
|
});
|
|
1673
1361
|
}
|
|
1674
1362
|
stopRecording() {
|
|
1675
|
-
// if (!this.incomingRecordCall && !this.recordCall) {
|
|
1676
|
-
// return;
|
|
1677
|
-
// }
|
|
1678
1363
|
this.isRecording = false;
|
|
1679
1364
|
this.isPaused = false;
|
|
1680
1365
|
if (this.timerSubscription) {
|
|
@@ -1767,19 +1452,10 @@ export class CallProgressComponent {
|
|
|
1767
1452
|
getUserInformation(id) {
|
|
1768
1453
|
this.extensionService.getUserInformation(id).subscribe((response) => {
|
|
1769
1454
|
console.log(response, 'userInformation');
|
|
1770
|
-
// this.selectedUserInfo = response.c2cInformation;
|
|
1771
|
-
// if(this.isClickExpand){
|
|
1772
|
-
// this.checkTextHeight();
|
|
1773
|
-
// }
|
|
1774
1455
|
}, error => {
|
|
1775
1456
|
console.error('Error starting recording', error);
|
|
1776
1457
|
});
|
|
1777
1458
|
}
|
|
1778
|
-
// incomingCallsNewList(data: any) {
|
|
1779
|
-
// console.log(data, 'newIncomingCallsListOUR')
|
|
1780
|
-
// this.newIncomingCallsList = data;
|
|
1781
|
-
// this.incomingCallsNewInfo.emit(this.newIncomingCallsList);
|
|
1782
|
-
// }
|
|
1783
1459
|
selectedIncomingCallInfo(data) {
|
|
1784
1460
|
this.selectedIncomingCall = data;
|
|
1785
1461
|
}
|
|
@@ -1853,14 +1529,9 @@ export class CallProgressComponent {
|
|
|
1853
1529
|
}
|
|
1854
1530
|
this.filteredList = this.contacts.filter((c) => {
|
|
1855
1531
|
return (c?.firstName || '').toLowerCase().includes(text) || (c?.lastName || '').toLowerCase().includes(text) ||
|
|
1856
|
-
(c?.middleName || '').toLowerCase().includes(text) || (c?.
|
|
1532
|
+
(c?.middleName || '').toLowerCase().includes(text) || (c?.nickName || '').toLowerCase().includes(text) ||
|
|
1857
1533
|
(c?.numbersList[0]?.number || '').toLowerCase().includes(text) || (c?.numbersList[1]?.number || '').toLowerCase().includes(text);
|
|
1858
1534
|
});
|
|
1859
|
-
// this.filteredParticipentList = this.allParticipentList.filter((c: any) => {
|
|
1860
|
-
// const name = (c.direction == 'outgoing-call' ? (c?.toName || '') : (c?.fromName || '')).toLowerCase();
|
|
1861
|
-
// const number = (c.direction == 'outgoing-call' ? ( c?.to || '') : (c?.from || '')).toLowerCase();
|
|
1862
|
-
// return name.includes(text) || number.includes(text);
|
|
1863
|
-
// });
|
|
1864
1535
|
this.filteredList.forEach((c) => {
|
|
1865
1536
|
let index = this.currentCallList.findIndex((cc) => cc?.phone == c?.numbersList[0]?.number || cc?.phone == c?.numbersList[1]?.number);
|
|
1866
1537
|
if (index > -1) {
|
|
@@ -1880,6 +1551,43 @@ export class CallProgressComponent {
|
|
|
1880
1551
|
toggleText() {
|
|
1881
1552
|
this.isExpanded = !this.isExpanded;
|
|
1882
1553
|
}
|
|
1554
|
+
// Call this when call disconnects
|
|
1555
|
+
onCallDisconnected() {
|
|
1556
|
+
this.showDisconnectModal = true;
|
|
1557
|
+
}
|
|
1558
|
+
endConference() {
|
|
1559
|
+
console.log('Conference Ended');
|
|
1560
|
+
this.showDisconnectModal = false;
|
|
1561
|
+
if (this.selectedConf?.conferenceId) {
|
|
1562
|
+
this.onEndCall(this.selectedConf, true);
|
|
1563
|
+
}
|
|
1564
|
+
else {
|
|
1565
|
+
this.endCall(true);
|
|
1566
|
+
}
|
|
1567
|
+
}
|
|
1568
|
+
leaveConference() {
|
|
1569
|
+
console.log('leaveTime', this.leaveReason);
|
|
1570
|
+
this.showDisconnectModal = false;
|
|
1571
|
+
if (this.isReasonChecked) {
|
|
1572
|
+
let payload = { conferenceId: this.selectedConf?.conferenceId || this.hostnumber?.conferenceId, time: this.convertHHMMToMinutes(this.leaveReason), timerDate: new Date().toString() };
|
|
1573
|
+
this.extensionService.setTimerForEndConferenceCall(payload).subscribe((res) => { });
|
|
1574
|
+
}
|
|
1575
|
+
if (this.selectedConf?.conferenceId) {
|
|
1576
|
+
let conference = this.newIncomingCallsList?.find((res) => res?.conferenceId == this.selectedConf?.conferenceId);
|
|
1577
|
+
let participentInfo = conference?.participants?.find((participant) => ((this.deviceNumberList.includes(participant?.from)
|
|
1578
|
+
&& participant?.to === 'c2c_softphone_client') || (this.deviceNumberList.includes(participant?.to) && participant?.direction == 'incoming-call')) && !participant?.isLeft);
|
|
1579
|
+
if (conference?.id) {
|
|
1580
|
+
this.onEndCall(participentInfo);
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
else {
|
|
1584
|
+
this.onEndCall(this.hostnumber);
|
|
1585
|
+
}
|
|
1586
|
+
}
|
|
1587
|
+
convertHHMMToMinutes(time) {
|
|
1588
|
+
const [hours, minutes] = time.split(':').map(Number);
|
|
1589
|
+
return (hours * 60) + minutes;
|
|
1590
|
+
}
|
|
1883
1591
|
ngOnDestroy() {
|
|
1884
1592
|
this.callData.dial = false;
|
|
1885
1593
|
if (this.timerSubscription) {
|
|
@@ -1888,10 +1596,10 @@ export class CallProgressComponent {
|
|
|
1888
1596
|
}
|
|
1889
1597
|
}
|
|
1890
1598
|
CallProgressComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CallProgressComponent, deps: [{ token: i1.ExtensionService }, { token: i0.ChangeDetectorRef }, { token: i2.TwilioService }, { token: i3.IpAddressService }, { token: i4.IncomeingCallSocketService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1891
|
-
CallProgressComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CallProgressComponent, selector: "lib-call-progress", inputs: { callData: "callData", selectedCallerId: "selectedCallerId", newIncomingCallData: "newIncomingCallData", newIncomingCallsList: "newIncomingCallsList", callerIdList: "callerIdList", deviceId: "deviceId", conferenceCallInfo: "conferenceCallInfo" }, outputs: { endCallEvent: "endCallEvent", incomingCallsNewInfo: "incomingCallsNewInfo", minimiseEvent: "minimiseEvent", incomingCallInitiated: "incomingCallInitiated", isLoadershow: "isLoadershow", endIncomingCallEvent: "endIncomingCallEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <!-- <ng-container *ngIf=\"!incomingCallDiv || isConcurrentIncoming || true\"> -->\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)\">\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isHold\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">Conference Call</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isHold }\" (click)=\"swapCalls(conf,true)\">\r\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endCall(true)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\r\n (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let heldCall of currentCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isHold && !heldCall?.isConference\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\r\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': heldCall?.isHold }\" (click)=\"swapCalls(heldCall)\">\r\n <span class=\"material-symbols-outlined\" title=\"{{heldCall?.isHold? 'Resume':'Hold'}}\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(heldCall)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" *ngIf=\"heldCall?.isIncomingCall\"\r\n (click)=\"onClickExpand(heldCall)\" [ngClass]=\"{'disabled': !heldCall?.businessNumber}\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n <!-- <button class=\"held-btn swap-btn\" (click)=\"swapCalls(heldCall)\" title=\"Swap calls\">\r\n <span class=\"material-symbols-outlined swap-icon\">swap_vert</span>\r\n </button> -->\r\n </div>\r\n </div>\r\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isIncomingCall && !heldCall?.isAcceptCall\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">phone_callback</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Incoming Call</span>\r\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\r\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"banner-btn receive-btn\" *ngIf=\"!heldCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"add(heldCall)\"> call </span>\r\n </button>\r\n <button class=\"call-btn-wrapper banner-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(heldCall)\"> call_end\r\n </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\r\n (click)=\"onClickExpand(heldCall)\" [ngClass]=\"{'disabled': !heldCall?.businessNumber}\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- Compact banners for concurrent incoming (one per call) -->\r\n <!-- <ng-container *ngIf=\"currentCallList.length > 1 && !currentCall?.id\">\r\n <div class=\"incoming-banners-container\" *ngIf=\"!isConference && currentCallList.length > 1\">\r\n <div class=\"\">\r\n <ng-container *ngFor=\"let inc of currentCallList; let i = index\">\r\n <div class=\"incoming-banner\" *ngIf=\"inc?.isIncomingCall && !inc?.isAcceptCall\"\r\n [ngStyle]=\"{ top: ((isCallOnHold && heldCall) ? 64 : 0) + (i * 70) + 'px' }\">\r\n <div class=\"incoming-banner-content\">\r\n <div class=\"incoming-info\">\r\n <span class=\"incom ing-label\">Incoming call</span>\r\n <div class=\"incoming-caller\">\r\n <span class=\"caller-name\">{{ inc?.userInfo?.c2cInformation?.name ||\r\n inc?.customParameters?.get('name') || '-' }}</span>\r\n <span class=\"caller-number\">{{ inc?.userInfo?.c2cInformation?.number ||\r\n inc?.parameters?.From || '' }}</span>\r\n </div>\r\n </div>\r\n <div class=\"incoming-actions\">\r\n <button class=\"banner-btn accept-btn\" (click)=\"add(inc)\">\r\n <span class=\"material-symbols-outlined\">call</span>\r\n </button>\r\n <button class=\"banner-btn reject-btn\" (click)=\"onEndCall(inc)\">\r\n <span class=\"material-symbols-outlined\">call_end</span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\r\n (click)=\"onClickExpand(inc)\" [ngClass]=\"{'disabled': !inc?.businessNumber}\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container> -->\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall \">\r\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\r\n Number'}}</span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img\" alt=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\" [disabled]=\"isIncomingCallBtnDisable\">\r\n <span class=\"material-symbols-outlined\" (click)=\"add(currentCallList[0])\"> call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(currentCallList[0])\"> call_end\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call --> \r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference)\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCall?.img\" alt=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.name || 'Unknown number'}}\r\n </h1>\r\n <p>{{currentCall?.phone }}</p>\r\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\r\n </div>\r\n\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\r\n [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\r\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\r\n [disabled]=\"isMergeCallAllowed() || currentCallList.length < 2\">\r\n <span>Merge</span>\r\n </button>\r\n </div>\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference && currentCall?.isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"call?.isConference\">\r\n <span *ngIf=\"i != 0\">&</span>\r\n {{call?.name ? call?.name : call?.phone || 'Unknown number'}}\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ timer }}</div>\r\n\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endCall(true)\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n <!-- </ng-container> -->\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"mb-2 user-info-section\" >\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">{{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\"/>\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}</div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Point Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Source Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\r\n <div class=\"contacts-header\">\r\n <div class=\"title\">Participent</div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#000000\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3\">\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"isDirectCallOptionShow && searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\" *ngIf=\"!c?.IsConnected\" title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\" *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(searchText, true)\" title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\">In This Call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <div class=\"contact-item\" *ngFor=\"let c of filteredParticipentList\">\r\n <ng-container *ngIf=\"c?.to == 'client' else participentInfo\">\r\n <img class=\"contact-avatar\" [src]=\"c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">You\r\n </div>\r\n <div class=\"contact-title\">{{ c?.from }}</div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.hold\"\r\n (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.hold ? 'Hold' : 'Resume'\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </ng-container>\r\n <ng-template #participentInfo>\r\n <img class=\"contact-avatar\" [src]=\"c?.direction == 'outgoing-call' ? c?.toImage : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.hold\"\r\n (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.hold ? 'Hold' : 'Resume'\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participent added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\"> \r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.IsConnected && false\">\r\n <img class=\"contact-avatar\" [src]=\"c?.img ? c?.img : 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\r\n </div>\r\n <button class=\"contact-call-btn\" (click)=\"callContact(c)\" *ngIf=\"!c?.IsConnected\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n <span class=\"label\">Call</span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\" *ngIf=\"c?.IsConnected\">\r\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\" *ngIf=\"c?.IsConnected\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let c of leftParticipent[currentCall?.conferenceId]\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"c.direction == 'outgoing-call' && c?.toImage ? c?.toImage : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c.direction == 'outgoing-call' ? c?.toName : c?.fromName || 'Unknown number'}}</div>\r\n <div class=\"contact-title\">{{c.direction == 'outgoing-call' ? c?.to : c?.from}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn \" (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from)\" >\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Add</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow:hidden}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none;margin-bottom:10px}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:9px;width:43px;height:43px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:-4px;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:40px;height:40px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1}.contact-name{font-weight:600;color:#111827}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:6px;background:#727070;color:#fff;border:none;border-radius:50%;padding:8px 9px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:6px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:8px 9px;cursor:pointer}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:8px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
1599
|
+
CallProgressComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CallProgressComponent, selector: "lib-call-progress", inputs: { callData: "callData", selectedCallerId: "selectedCallerId", newIncomingCallData: "newIncomingCallData", newIncomingCallsList: "newIncomingCallsList", callerIdList: "callerIdList", deviceId: "deviceId", callAction: "callAction", conferenceCallInfo: "conferenceCallInfo" }, outputs: { endCallEvent: "endCallEvent", incomingCallsNewInfo: "incomingCallsNewInfo", minimiseEvent: "minimiseEvent", incomingCallInitiated: "incomingCallInitiated", isLoadershow: "isLoadershow", endIncomingCallEvent: "endIncomingCallEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <!-- <ng-container *ngIf=\"!incomingCallDiv || isConcurrentIncoming || true\"> -->\r\n\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)\">\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isConferenceHold\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">Conference Call</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isConferenceHold }\"\r\n (click)=\"swapCalls(conf,true)\">\r\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(conf)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall \">\r\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\r\n Number'}}</span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img || 'assets/images/user.jpg'\" alt=\"\"\r\n width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown\r\n Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\"\r\n [disabled]=\"isIncomingCallBtnDisable\">\r\n <span class=\"material-symbols-outlined\" (click)=\"add(currentCallList[0])\"> call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(currentCallList[0])\"> call_end\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call -->\r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference) && currentCall?.isAcceptCall\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCall?.img || 'assets/images/user.jpg'\" alt=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.name || 'Unknown number'}}\r\n </h1>\r\n <p>{{currentCall?.phone }}</p>\r\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\r\n </div>\r\n\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\r\n [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <!-- <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\r\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\r\n [disabled]=\"isMergeCallAllowed() || currentCallList.length < 2\">\r\n <span>Merge</span>\r\n </button>\r\n </div> -->\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference && currentCall?.isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"!call?.isConferenceHold\">\r\n <span *ngIf=\"i != 0\">&</span>\r\n {{call?.name ? call?.name : call?.phone || 'Unknown number'}}\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ timer }}</div>\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n <!-- </ng-container> -->\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"mb-2 user-info-section\">\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">\r\n {{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container\r\n *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\" />\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}\r\n </div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See\r\n less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Point Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Source Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\r\n <div class=\"contacts-header\">\r\n <div>Participant</div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3 position-relative\">\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <div class=\"search-contacts-list\">\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length && isDirectCallOptionShow && searchText\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"CallToUnsavedNumber(searchText)\"\r\n title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\"\r\n title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\">In This Call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.isLeft\">\r\n <ng-container *ngIf=\"c?.to == 'client' else participentInfo\">\r\n <img class=\"contact-avatar\" [src]=\"c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">You\r\n </div>\r\n <div class=\"contact-title\">{{ c?.from }}</div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.hold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\"\r\n (click)=\"onHoldCall(c)\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.hold ? 'Hold' : 'Resume'\"> phone_paused\r\n </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </ng-container>\r\n <ng-template #participentInfo>\r\n <img class=\"contact-avatar\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' :\r\n c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.to != 'c2c_softphone_client'\">{{ c?.direction ==\r\n 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n <div class=\"contact-title\" *ngIf=\"c?.to == 'c2c_softphone_client'\">{{ c?.from ||\r\n 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.from == hostnumber?.from && c?.to == 'c2c_softphone_client'\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.hold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\"\r\n (click)=\"onHoldCall(c)\" *ngIf=\"c?.to != 'c2c_softphone_client'\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.hold ? 'Hold' : 'Resume'\"> phone_paused\r\n </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\"\r\n *ngIf=\"c?.to != 'c2c_softphone_client'\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall()\"\r\n *ngIf=\"c?.to == 'c2c_softphone_client' && deviceNumberList.includes(c?.from)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participant added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"c?.isLeft\">\r\n <img class=\"contact-avatar\"\r\n [src]=\"c.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c.direction == 'outgoing-call' ? c?.toName : c?.fromName || 'Unknown\r\n number'}}</div>\r\n <div class=\"contact-title\">{{c.direction == 'outgoing-call' ? c?.to : c?.from}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn \"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from)\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Add</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>\r\n<!-- Call Disconnect Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showDisconnectModal\">\r\n <div class=\"modal-content p-3\">\r\n <div class=\"contacts-header p-0 pb-2\">\r\n <h4 class=\"title mb-0\">Call Disconnected</h4>\r\n <div class=\"d-flex justify-content-between\">\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDisconnectModal = false\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"contant-body mb-2\">\r\n <p class=\"mt-2\">\r\n Exiting this call will not end the conference. The session will continue, and charges will incur to\r\n your\r\n account.\r\n </p>\r\n </div>\r\n <div class=\"button-group\">\r\n <div class=\"text-start d-flex align-items-center\">\r\n <label class=\"d-flex align-items-center mb-0 mr-2\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isReasonChecked\" class=\"me-2\" />\r\n </label>\r\n\r\n <input type=\"time\" class=\"form-control\" placeholder=\"Enter reason\" [(ngModel)]=\"leaveReason\"\r\n [disabled]=\"!isReasonChecked\" />\r\n </div>\r\n <button class=\"btn end-btn\" (click)=\"leaveConference()\">\r\n Leave\r\n </button>\r\n <button class=\"btn end-btn\" (click)=\"endConference()\">\r\n End All\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow:hidden}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none;margin-bottom:10px}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:-4px;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.modal-content .contacts-header{height:40px}.search-contacts-list{max-height:196px;overflow:auto;position:absolute;width:91%;background:white;z-index:1000}.contant-body p{font-size:14px;color:#5f6061}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:37px;height:37px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1}.contact-name{font-weight:600;color:#111827}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:5px;background:#727070;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:5px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.organizer-label{padding:1px 5px;font-size:11px;border-radius:10px;border:1px solid #a0a0a0;margin-top:2px;background:#fcfcfc}.custom-modal{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;justify-content:center;align-items:center;z-index:1000;border-radius:21px}.modal-content{background:#ffffff;padding:25px;border-radius:8px;width:350px;text-align:center}.title{margin-bottom:15px;color:#d9534f}.message{margin-bottom:20px}.button-group{display:flex;justify-content:space-between}.btn{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-weight:500}.end-btn{background-color:#dc3545;color:#fff;display:flex;align-items:center;font-size:13px}.leave-btn{background-color:#007bff;color:#fff}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center;margin-top:35px}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:8px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
1892
1600
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CallProgressComponent, decorators: [{
|
|
1893
1601
|
type: Component,
|
|
1894
|
-
args: [{ selector: 'lib-call-progress', template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <!-- <ng-container *ngIf=\"!incomingCallDiv || isConcurrentIncoming || true\"> -->\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)\">\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isHold\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">Conference Call</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isHold }\" (click)=\"swapCalls(conf,true)\">\r\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endCall(true)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\r\n (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let heldCall of currentCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isHold && !heldCall?.isConference\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\r\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': heldCall?.isHold }\" (click)=\"swapCalls(heldCall)\">\r\n <span class=\"material-symbols-outlined\" title=\"{{heldCall?.isHold? 'Resume':'Hold'}}\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(heldCall)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" *ngIf=\"heldCall?.isIncomingCall\"\r\n (click)=\"onClickExpand(heldCall)\" [ngClass]=\"{'disabled': !heldCall?.businessNumber}\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n <!-- <button class=\"held-btn swap-btn\" (click)=\"swapCalls(heldCall)\" title=\"Swap calls\">\r\n <span class=\"material-symbols-outlined swap-icon\">swap_vert</span>\r\n </button> -->\r\n </div>\r\n </div>\r\n <div class=\"held-call-content\" *ngIf=\"heldCall?.isIncomingCall && !heldCall?.isAcceptCall\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">phone_callback</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Incoming Call</span>\r\n <span class=\"held-name\">{{heldCall?.name || 'Unknown number'}}</span>\r\n <span class=\"held-number\">{{heldCall?.phone || ''}}</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"banner-btn receive-btn\" *ngIf=\"!heldCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"add(heldCall)\"> call </span>\r\n </button>\r\n <button class=\"call-btn-wrapper banner-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(heldCall)\"> call_end\r\n </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\r\n (click)=\"onClickExpand(heldCall)\" [ngClass]=\"{'disabled': !heldCall?.businessNumber}\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- Compact banners for concurrent incoming (one per call) -->\r\n <!-- <ng-container *ngIf=\"currentCallList.length > 1 && !currentCall?.id\">\r\n <div class=\"incoming-banners-container\" *ngIf=\"!isConference && currentCallList.length > 1\">\r\n <div class=\"\">\r\n <ng-container *ngFor=\"let inc of currentCallList; let i = index\">\r\n <div class=\"incoming-banner\" *ngIf=\"inc?.isIncomingCall && !inc?.isAcceptCall\"\r\n [ngStyle]=\"{ top: ((isCallOnHold && heldCall) ? 64 : 0) + (i * 70) + 'px' }\">\r\n <div class=\"incoming-banner-content\">\r\n <div class=\"incoming-info\">\r\n <span class=\"incom ing-label\">Incoming call</span>\r\n <div class=\"incoming-caller\">\r\n <span class=\"caller-name\">{{ inc?.userInfo?.c2cInformation?.name ||\r\n inc?.customParameters?.get('name') || '-' }}</span>\r\n <span class=\"caller-number\">{{ inc?.userInfo?.c2cInformation?.number ||\r\n inc?.parameters?.From || '' }}</span>\r\n </div>\r\n </div>\r\n <div class=\"incoming-actions\">\r\n <button class=\"banner-btn accept-btn\" (click)=\"add(inc)\">\r\n <span class=\"material-symbols-outlined\">call</span>\r\n </button>\r\n <button class=\"banner-btn reject-btn\" (click)=\"onEndCall(inc)\">\r\n <span class=\"material-symbols-outlined\">call_end</span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\"\r\n (click)=\"onClickExpand(inc)\" [ngClass]=\"{'disabled': !inc?.businessNumber}\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container> -->\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall \">\r\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\r\n Number'}}</span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img\" alt=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\" [disabled]=\"isIncomingCallBtnDisable\">\r\n <span class=\"material-symbols-outlined\" (click)=\"add(currentCallList[0])\"> call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(currentCallList[0])\"> call_end\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call --> \r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference)\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCall?.img\" alt=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.name || 'Unknown number'}}\r\n </h1>\r\n <p>{{currentCall?.phone }}</p>\r\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\r\n </div>\r\n\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\r\n [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\r\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\r\n [disabled]=\"isMergeCallAllowed() || currentCallList.length < 2\">\r\n <span>Merge</span>\r\n </button>\r\n </div>\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference && currentCall?.isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"call?.isConference\">\r\n <span *ngIf=\"i != 0\">&</span>\r\n {{call?.name ? call?.name : call?.phone || 'Unknown number'}}\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ timer }}</div>\r\n\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endCall(true)\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n <!-- </ng-container> -->\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"mb-2 user-info-section\" >\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">{{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\"/>\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}</div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Point Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Source Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\r\n <div class=\"contacts-header\">\r\n <div class=\"title\">Participent</div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#000000\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3\">\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"isDirectCallOptionShow && searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\" *ngIf=\"!c?.IsConnected\" title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\" *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(searchText, true)\" title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\">In This Call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <div class=\"contact-item\" *ngFor=\"let c of filteredParticipentList\">\r\n <ng-container *ngIf=\"c?.to == 'client' else participentInfo\">\r\n <img class=\"contact-avatar\" [src]=\"c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">You\r\n </div>\r\n <div class=\"contact-title\">{{ c?.from }}</div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.hold\"\r\n (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.hold ? 'Hold' : 'Resume'\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </ng-container>\r\n <ng-template #participentInfo>\r\n <img class=\"contact-avatar\" [src]=\"c?.direction == 'outgoing-call' ? c?.toImage : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' : c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\">{{ c?.direction == 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.hold\"\r\n (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.hold ? 'Hold' : 'Resume'\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participent added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\"> \r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.IsConnected && false\">\r\n <img class=\"contact-avatar\" [src]=\"c?.img ? c?.img : 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\r\n </div>\r\n <button class=\"contact-call-btn\" (click)=\"callContact(c)\" *ngIf=\"!c?.IsConnected\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n <span class=\"label\">Call</span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\" (click)=\"onHoldCall(c)\" *ngIf=\"c?.IsConnected\">\r\n <span class=\"material-symbols-outlined\" title=\"Hold\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\" *ngIf=\"c?.IsConnected\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let c of leftParticipent[currentCall?.conferenceId]\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"c.direction == 'outgoing-call' && c?.toImage ? c?.toImage : c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c.direction == 'outgoing-call' ? c?.toName : c?.fromName || 'Unknown number'}}</div>\r\n <div class=\"contact-title\">{{c.direction == 'outgoing-call' ? c?.to : c?.from}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn \" (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from)\" >\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Add</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow:hidden}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none;margin-bottom:10px}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:9px;width:43px;height:43px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:-4px;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:40px;height:40px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1}.contact-name{font-weight:600;color:#111827}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:6px;background:#727070;color:#fff;border:none;border-radius:50%;padding:8px 9px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:6px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:8px 9px;cursor:pointer}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:8px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}\n"] }]
|
|
1602
|
+
args: [{ selector: 'lib-call-progress', template: "<div class=\"d-flex\">\r\n <div class=\"call-container\" *ngIf=\"!isMinimised && currentCallList?.length\"\r\n [ngClass]=\"{'collops': isCollops, 'incoming-call-container': isClickExpand, 'contacts-open': showContactsPanel }\">\r\n <!-- <ng-container *ngIf=\"!incomingCallDiv || isConcurrentIncoming || true\"> -->\r\n\r\n <!-- All type Call Hold list -->\r\n <div class=\"held-call-banner\"\r\n *ngIf=\"currentCallList.length > 1 && !!currentCall && ((isConferenceCallHold || isConference) || !isConference)\">\r\n <ng-container *ngFor=\"let conf of conferenceCallList\">\r\n <div class=\"held-call-content\" *ngIf=\"conf?.isConferenceHold\">\r\n <div class=\"held-info\">\r\n <span class=\"material-symbols-outlined hold-icon\">pause_circle</span>\r\n <div class=\"held-caller\">\r\n <span class=\"held-label\">Hold</span>\r\n <span class=\"held-name\">Conference Call</span>\r\n </div>\r\n </div>\r\n <div class=\"held-actions\">\r\n <button class=\"conference-hold-contact\" [ngClass]=\"{ 'on-hold': conf?.isConferenceHold }\"\r\n (click)=\"swapCalls(conf,true)\">\r\n <span class=\"material-symbols-outlined\" title=\"{{'Hold'}}\"> phone_paused </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall(conf)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <div class=\"togglearrow-arrow me-2\" id=\"togglearrow\" (click)=\"toggleContactsPanel(conf)\">\r\n <i class=\"fa fa-angle-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- For single incoming call -->\r\n <div class=\"h-100 py-5\" style=\"display: flex; flex-direction: column;\"\r\n *ngIf=\"currentCallList.length === 1 && currentCallList[0]?.isIncomingCall && !currentCallList[0]?.isAcceptCall \">\r\n <div class=\"callToNum\">Incoming call on <br /><span>{{currentCallList[0]?.to || 'Unknown\r\n Number'}}</span>\r\n </div>\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCallList[0]?.img || 'assets/images/user.jpg'\" alt=\"\"\r\n width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1>{{ currentCallList[0]?.name ? currentCallList[0]?.name : currentCallList[0]?.phone || 'Unknown\r\n Number' }}</h1>\r\n <p *ngIf=\"!!currentCallList[0]?.name\">{{ currentCallList[0]?.phone }}</p>\r\n </div>\r\n\r\n <div class=\"call-action-btns mt-auto\">\r\n <button class=\"call-btn receive-btn\" *ngIf=\"!newIncomingCallsList[0]?.isCallConnected\"\r\n [disabled]=\"isIncomingCallBtnDisable\">\r\n <span class=\"material-symbols-outlined\" (click)=\"add(currentCallList[0])\"> call </span>\r\n </button>\r\n <button class=\"call-btn reject-btn\">\r\n <span class=\"material-symbols-outlined\" (click)=\"onEndCall(currentCallList[0])\"> call_end\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For single active call -->\r\n <div *ngIf=\"(!isConference || isConferenceCallHold) && (!!currentCall?.id && !currentCall?.isConference) && currentCall?.isAcceptCall\"\r\n [ngStyle]=\"{'display': 'flex', 'flex-direction': 'column', 'position': 'relative'}\" class=\"active-call\">\r\n\r\n <div class=\"call-animation\" [ngClass]=\"{'call-animation-play': showRingAnimation}\">\r\n <img class=\"avatar-img\" [src]=\"currentCall?.img || 'assets/images/user.jpg'\" alt=\"\" width=\"120\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 [ngStyle]=\"{'margin-top': showKeypad ? '0': '8px'}\">{{currentCall?.name || 'Unknown number'}}\r\n </h1>\r\n <p>{{currentCall?.phone }}</p>\r\n <h4 style=\"margin-top: 4px\">{{currentCall?.time || timer}}</h4>\r\n </div>\r\n\r\n <div class=\"record-action-btns\" *ngIf=\"!showKeypad\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\"\r\n [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"call-action-btns\" [ngStyle]=\"{'margin-top': showKeypad ? '0': '723x'}\">\r\n <!-- <div class=\"mb-3\" *ngIf=\"!incomingCallDiv || isConcurrentIncoming\">\r\n <button class=\"held-btn merge-btn\" (click)=\"mergeCalls()\" title=\"Merge calls\"\r\n [disabled]=\"isMergeCallAllowed() || currentCallList.length < 2\">\r\n <span>Merge</span>\r\n </button>\r\n </div> -->\r\n <div class=\"flex align-items-center justify-content-evenly mb-3\">\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"toggleMute()\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n\r\n </button>\r\n <button class=\"call-sec-btn mr-3\" [disabled]=\"!currentCall?.isAcceptCall\">\r\n <span class=\"material-symbols-outlined\" (click)=\"toggleKeypad()\"> transition_dissolve\r\n </span>\r\n </button>\r\n <button class=\"call-sec-btn\" [disabled]=\"!currentCall?.isAcceptCall\"\r\n (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div>\r\n <button class=\"call-btn end-call-btn\" [disabled]=\"!currentCall?.isAcceptCall\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- conference call view -->\r\n <div class=\"conference-call-view\" *ngIf=\"isConference && currentCall?.isConference\">\r\n <div class=\"conf-heading\">\r\n <span class=\"conf-icon material-symbols-outlined\"> groups </span>\r\n <span class=\"conf-title\">Conference Call</span>\r\n </div>\r\n\r\n <div class=\"scroll-container\">\r\n <div class=\"scroll-text conf-name\">\r\n <ng-container *ngFor=\"let call of currentCallList; let i = index\">\r\n <ng-container *ngIf=\"!call?.isConferenceHold\">\r\n <span *ngIf=\"i != 0\">&</span>\r\n {{call?.name ? call?.name : call?.phone || 'Unknown number'}}\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"conf-timer\">{{ timer }}</div>\r\n <div class=\"record-action-btns mt-auto\" *ngIf=\"!showKeypad\"\r\n [ngStyle]=\"{'margin-top': showKeypad ? '0': '20px'}\">\r\n <div class=\"record-btn-container\">\r\n <button class=\"record-btn start-stop\" *ngIf=\"!isRecording\"\r\n [ngClass]=\"{'recording': isRecording, 'stopped': !isRecording}\" (click)=\"toggleRecording()\"\r\n [title]=\"isRecording ? 'Stop Recording' : 'Start Recording'\">\r\n <span class=\"recording-icon\"></span>\r\n </button>\r\n <div class=\"pause-resume-btns\">\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isRecording && !isPaused\"\r\n (click)=\"pauseRecording()\">\r\n <span class=\"material-symbols-outlined\"> pause </span>\r\n </button>\r\n <button class=\"record-btn pause-resume\" *ngIf=\"isPaused\" (click)=\"resumeRecording()\">\r\n <span class=\"material-symbols-outlined\"> play_arrow </span>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isRecording\" class=\"timer-display\">\r\n {{ getFormattedTime() }}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showKeypad\" class=\"sendDigit mt-2\">\r\n <input type=\"text\" name=\"call-inputs\" id=\"call-input\" [(ngModel)]=\"callInput\"\r\n (keyup)=\"onCallInputEnter($event)\">\r\n <span class=\"material-symbols-outlined input-clear-btn\" *ngIf=\"callInput\"\r\n (click)=\"clearInputs()\">close_small</span>\r\n </div>\r\n <div class=\"btn-container justify-content-center\" *ngIf=\"showKeypad\">\r\n <div class=\"key-btn\" *ngFor=\"let key of keypadVal\" (click)=\"onCallInputs(key.num)\">\r\n {{key.num}}\r\n <span class=\"btn-albhabets\">{{key.text ? key.text : ' '}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"conf-actions\">\r\n <button class=\"circle-btn\" [ngClass]=\"{'active': isMute}\" (click)=\"toggleMute(true)\">\r\n <span class=\"material-symbols-outlined\"> {{ isMute ? 'mic_off' : 'mic' }} </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleKeypad()\">\r\n <span class=\"material-symbols-outlined\"> transition_dissolve </span>\r\n </button>\r\n <button class=\"circle-btn\" (click)=\"toggleContactsPanel(currentCall)\">\r\n <span class=\"material-symbols-outlined\"> groups_2 </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"conf-end\">\r\n <button class=\"circle-btn danger\" (click)=\"endConfereneceCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n <!-- </ng-container> -->\r\n </div>\r\n\r\n <!-- Incoming call user details shown in model -->\r\n <div class=\"call-container-model p-3 text-white model-content call-container\" *ngIf=\"isClickExpand\">\r\n <div class=\"mb-2 user-info-section\">\r\n <div class=\"text-center my-3\">\r\n <h3 class=\"text-white\">C2C -POINT {{selectedUserInfo?.pointName}}</h3>\r\n </div>\r\n <div class=\"mb-3\">\r\n <h5 class=\"text-white mb-1\">Name:</h5>\r\n <h4 class=\"text-white userName\">{{selectedUserInfo?.name}}</h4>\r\n </div>\r\n <div class=\"f-13\">\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Number:</div>\r\n <div class=\"\">{{selectedUserInfo?.number}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Extension:</div>\r\n <div class=\"ml-2\">{{selectedUserInfo?.extension}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Email: </div>\r\n <div>{{selectedUserInfo?.email}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2\">Subject:</div>\r\n <div class=\"ml-2 subject-text\" title=\"{{selectedUserInfo?.subject}}\">\r\n {{selectedUserInfo?.subject}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-12 mb-2\">\r\n <div class=\"me-2 mb-1\">Image:</div>\r\n <div class=\"text-ellipsis\">\r\n <ng-container\r\n *ngIf=\"selectedUserInfo?.image && selectedUserInfo?.image !== '-'; else noImage\">\r\n <img src=\"{{selectedUserInfo?.image}}\" alt=\"\" width=\"150\" class=\"ml-2\" />\r\n </ng-container>\r\n <ng-template #noImage>\r\n <span class=\"ml-2\">No Image Available</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\" mb-4\">\r\n <div class=\"\">\r\n <div class=\"mb-1\">Message:</div>\r\n <div>\r\n <div class=\"text-container\" [class.expanded]=\"isExpanded\">{{selectedUserInfo?.message}}\r\n </div>\r\n <small class=\"toggle-btn\" *ngIf=\"showButton\" (click)=\"toggleText()\">{{ isExpanded ? 'See\r\n less' : 'See more' }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Point Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.pointName}}</div>\r\n </div>\r\n <div class=\"col-6 mb-2\">\r\n <div class=\"mb-1\">Source Name:</div>\r\n <div class=\"\">{{selectedUserInfo?.sourceName}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- contact list panel -->\r\n <div class=\"contacts-panel\" *ngIf=\"showContactsPanel\">\r\n <div class=\"contacts-header\">\r\n <div>Participant</div>\r\n <div class=\"d-flex justify-content-between\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"toggleContactsPanel({}, true)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH INPUT (visible when isSearchVisible = true) -->\r\n <div class=\"search-bar p-3 position-relative\">\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchText\" (input)=\"applyFilter()\" />\r\n <div class=\"search-contacts-list\">\r\n <ng-container *ngFor=\"let c of filteredList\">\r\n <div class=\"contact-item\" *ngIf=\"searchText\">\r\n <img class=\"contact-avatar\" [src]=\"c?.img || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.firstName}} {{c?.middleName}} {{c?.lastName}}</div>\r\n <div class=\"contact-title\">{{ (c?.numbersList && c?.numbersList[0]?.number)}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"callContact(c)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(c?.numbersList[0]?.number, true)\"\r\n *ngIf=\"!c?.IsConnected\" title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!filteredList.length && isDirectCallOptionShow && searchText\">\r\n <div class=\"contact-item\">\r\n <img class=\"contact-avatar\" [src]=\"'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-title\">{{ searchText }}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn mr-2\" (click)=\"CallToUnsavedNumber(searchText)\"\r\n title=\"Add to conference call\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n </button>\r\n <button class=\"contact-call-btn\" (click)=\"CallToUnsavedNumber(searchText, true)\"\r\n title=\"New Call\">\r\n <span class=\"material-symbols-outlined\"> call </span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"contacts-list\">\r\n <div class=\"px-2\">\r\n <h5 class=\"mb-0 title\">In This Call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"!c?.isLeft\">\r\n <ng-container *ngIf=\"c?.to == 'client' else participentInfo\">\r\n <img class=\"contact-avatar\" [src]=\"c?.fromImage || 'assets/images/user.jpg'\" alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">You\r\n </div>\r\n <div class=\"contact-title\">{{ c?.from }}</div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.hold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\"\r\n (click)=\"onHoldCall(c)\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.hold ? 'Hold' : 'Resume'\"> phone_paused\r\n </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </ng-container>\r\n <ng-template #participentInfo>\r\n <img class=\"contact-avatar\"\r\n [src]=\"c?.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c?.direction == 'outgoing-call' ? c?.toName || 'Unknown' :\r\n c?.fromName || 'Unknown'}}\r\n </div>\r\n <div class=\"contact-title\" *ngIf=\"c?.to != 'c2c_softphone_client'\">{{ c?.direction ==\r\n 'outgoing-call' ? c?.to || 'Unknown' : c?.from ||\r\n 'Unknown'}}</div>\r\n <div class=\"contact-title\" *ngIf=\"c?.to == 'c2c_softphone_client'\">{{ c?.from ||\r\n 'Unknown'}}</div>\r\n <div class=\"d-flex\" *ngIf=\"c?.from == hostnumber?.from && c?.to == 'c2c_softphone_client'\">\r\n <span class=\"organizer-label\">Organizer</span>\r\n </div>\r\n </div>\r\n <button class=\"mic-btn mr-2\" [disabled]=\"c?.hold\" (click)=\"onMuteUser(c)\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"c?.isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!c?.isMute\"> mic </span>\r\n </button>\r\n <button class=\"conference-hold-contact mr-2\" [ngClass]=\"{ 'on-hold': c?.hold }\"\r\n (click)=\"onHoldCall(c)\" *ngIf=\"c?.to != 'c2c_softphone_client'\">\r\n <span class=\"material-symbols-outlined\" [title]=\"!c?.hold ? 'Hold' : 'Resume'\"> phone_paused\r\n </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"onEndCall(c, false, true)\"\r\n *ngIf=\"c?.to != 'c2c_softphone_client'\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n <button class=\"conference-contact\" (click)=\"endConfereneceCall()\"\r\n *ngIf=\"c?.to == 'c2c_softphone_client' && deviceNumberList.includes(c?.from)\">\r\n <span class=\"material-symbols-outlined\" title=\"Call End\"> call_end </span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n <hr class=\"m-2\">\r\n <div class=\"mt-3 px-2\">\r\n <h5 class=\"mb-0 title\">Participant added to the call</h5>\r\n </div>\r\n <hr class=\"mb-2 mt-1\">\r\n <ng-container *ngFor=\"let c of filteredParticipentList\">\r\n <div class=\"contact-item\" *ngIf=\"c?.isLeft\">\r\n <img class=\"contact-avatar\"\r\n [src]=\"c.direction == 'outgoing-call' ? c?.toImage || 'assets/images/user.jpg' : c?.fromImage || 'assets/images/user.jpg'\"\r\n alt=\"\" />\r\n <div class=\"contact-info\">\r\n <div class=\"contact-name\">{{c.direction == 'outgoing-call' ? c?.toName : c?.fromName || 'Unknown\r\n number'}}</div>\r\n <div class=\"contact-title\">{{c.direction == 'outgoing-call' ? c?.to : c?.from}}</div>\r\n </div>\r\n <button class=\"contact-call-btn contact-add-btn \"\r\n (click)=\"CallToUnsavedNumber(c.direction == 'outgoing-call' ? c?.to : c?.from)\">\r\n <span class=\"material-symbols-outlined\"> add </span>\r\n <span class=\"label\">Add</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"min-call-container\" *ngIf=\"isMinimised\">\r\n <span class=\"material-symbols-outlined fullscreen\" (click)=\"maximiseDialpad()\"> open_in_full </span>\r\n <div style=\"display: flex; width: 100%\">\r\n <div>\r\n <div class=\"min-call-animation\" id=\"call-avatar\">\r\n <img class=\"min-avatar-img\" [src]=\"callData.img\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"min-callerDetails\">\r\n <div class=\"name\">\r\n {{callData.name}}\r\n </div>\r\n <p style=\"margin: 0\">{{callData.displayNum ? callData.displayNum : callData.phone }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"min-btn-container\">\r\n <div class=\"min-timer\">{{timer}}</div>\r\n <button class=\"min-call-sec-btn\" (click)=\"toggleMute()\" [disabled]=\"disbaleEndCallBtn\">\r\n <span class=\"material-symbols-outlined\" *ngIf=\"isMute\"> mic_off </span>\r\n <span class=\"material-symbols-outlined\" *ngIf=\"!isMute\"> mic </span>\r\n </button>\r\n <button class=\"min-call-btn end-call-btn\" [disabled]=\"disbaleEndCallBtn\" (click)=\"endCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n</div>\r\n<!-- Call Disconnect Modal -->\r\n<div class=\"custom-modal\" *ngIf=\"showDisconnectModal\">\r\n <div class=\"modal-content p-3\">\r\n <div class=\"contacts-header p-0 pb-2\">\r\n <h4 class=\"title mb-0\">Call Disconnected</h4>\r\n <div class=\"d-flex justify-content-between\">\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDisconnectModal = false\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\r\n fill=\"#000000\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"contant-body mb-2\">\r\n <p class=\"mt-2\">\r\n Exiting this call will not end the conference. The session will continue, and charges will incur to\r\n your\r\n account.\r\n </p>\r\n </div>\r\n <div class=\"button-group\">\r\n <div class=\"text-start d-flex align-items-center\">\r\n <label class=\"d-flex align-items-center mb-0 mr-2\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isReasonChecked\" class=\"me-2\" />\r\n </label>\r\n\r\n <input type=\"time\" class=\"form-control\" placeholder=\"Enter reason\" [(ngModel)]=\"leaveReason\"\r\n [disabled]=\"!isReasonChecked\" />\r\n </div>\r\n <button class=\"btn end-btn\" (click)=\"leaveConference()\">\r\n Leave\r\n </button>\r\n <button class=\"btn end-btn\" (click)=\"endConference()\">\r\n End All\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".call-container{width:385px;height:646px!important;margin:auto;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;justify-content:center;align-items:center;z-index:1000;flex-flow:column;overflow:hidden}.call-to-text{padding:6px 10px;border:1px solid #c2c2c2;border-radius:20px;font-size:13px}.collops{height:660px!important}.incoming-call-container{flex-flow:row!important}.active-call{width:385px!important}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.call-info-wrapper{height:20px;overflow-y:auto;background:white;transition:height 1s}.open-collops{height:180px!important}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;color:#fff;display:flex;flex-direction:column;align-items:center}.togglearrow-arrow{left:100%;background-color:#fff;width:25px;height:25px;text-align:center;cursor:pointer;border:1px solid #ccc;border-radius:50%;line-height:22px}.togglearrow-arrow.disabled{opacity:.3;cursor:not-allowed;pointer-events:none}.search-bar input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;outline:none;margin-bottom:10px}.togglearrow-arrow.disabled:hover{opacity:.3;cursor:not-allowed}.callerDetails h1{width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:12px 0 0;color:#fff;text-transform:capitalize;text-align:center}.callerDetails h4{margin:0;color:#fff}.tx-black,.title{color:#000!important}.callerDetails p{margin-top:-3px;margin-bottom:0;color:#fff}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}.receive-btn{background-color:#28a745!important;color:#fff!important}.receive-btn span{color:#fff!important}.scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;padding-left:100%;animation:scroll-left 12s linear infinite;font-size:16px}@keyframes scroll-left{0%{transform:translate(0)}to{transform:translate(-100%)}}.call-sec-btn span{color:#cccbcb}.call-btn{width:60px;height:60px;background-color:#fff;border-radius:30px;box-sizing:border-box;border:2px solid white;margin:0 16px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.btn-container{display:flex;flex-wrap:wrap;padding:0 30px}.key-btn{width:50px;height:50px;background-color:transparent;text-align:center;box-sizing:border-box;margin:0 18px;font-size:22px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#d3d3d3;cursor:pointer;opacity:.8}.call-action-btns{text-align:center}#call-input{background-color:transparent;border:none;outline:none;text-align:center;color:#fff}.sendDigit{position:relative;text-align:center;width:80%;margin:auto;background-color:#ffffff1a;padding:2px 0;border-radius:3px}.input-clear-btn{position:absolute;right:6px;color:#fff;cursor:pointer}#minimize-btn-div{position:absolute;right:14px;top:12px;z-index:10}.minimize-btn{color:#fff;cursor:pointer}.wave-container{position:absolute;bottom:-4px;overflow:hidden;width:100%}.waves{width:660px;position:relative;margin-bottom:-7px;height:40px;min-height:40px}.held-call-banner{position:absolute;top:0;left:0;right:0;background:#1644f09c;z-index:2100;box-shadow:0 4px 12px #0000004d;border-radius:0 0 16px 16px;max-height:220px;overflow-y:auto}.held-call-content{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:6px 6px 0;padding-bottom:6px;border-bottom:1px dotted #4b4b4b}.held-info{display:flex;align-items:center;gap:10px;flex:1}.hold-icon{font-size:24px;color:#fbbf24}.swap-icon{font-size:24px}.held-caller{display:flex;flex-direction:column;gap:2px}.held-label{font-size:10px;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.held-name{font-size:14px;font-weight:600;color:#fff}.held-number{font-size:13px;font-weight:500;color:#fff}.held-actions{display:flex;gap:8px;align-items:center}.held-btn{padding:6px 16px;border-radius:20px;border:none;font-size:13px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}.held-btn:hover{transform:scale(1.05);box-shadow:0 4px 12px #0003}.swap-btn{background:#3b82f6;color:#fff}.merge-btn{background:#10b981;color:#fff}.h-77px{height:77px}.incoming-banners-container{width:100%;padding:5px 8px;height:100%;gap:8px;overflow-y:auto}.call-container-model{width:385px!important;height:646px!important;margin:auto 0 0 1px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;box-sizing:border-box;position:relative;overflow:hidden;justify-content:center;align-items:center}.incoming-banner{top:0;left:0;width:100%;right:0;background:linear-gradient(135deg,#1e3a8a 0%,#3b82f6 100%);padding:12px 16px;z-index:2000;box-shadow:0 4px 12px #0003;border-radius:16px}.incoming-banner-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.incoming-info{flex:1;display:flex;flex-direction:column;gap:4px}.incoming-label{font-size:11px;color:#fffc;text-transform:uppercase;letter-spacing:.5px}.incoming-caller{display:flex;flex-direction:column;gap:2px}.caller-name{font-size:15px;font-weight:600;color:#fff}.caller-number{font-size:13px;color:#ffffffe6}.incoming-actions{display:flex;gap:8px;align-items:center}.banner-btn{width:44px;height:44px;border-radius:50%;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .2s}.banner-btn:hover{transform:scale(1.1)}.banner-btn .material-symbols-outlined{font-size:20px}.accept-btn{background:#10b981}.accept-btn .material-symbols-outlined{color:#fff}.reject-btn{background:#ef4444}.reject-btn .material-symbols-outlined{color:#fff}.contacts-panel{position:absolute;top:0;bottom:12px;width:340px;background:#ffffff;border-radius:16px;box-shadow:0 10px 25px #00000026;display:flex;flex-direction:column;overflow:hidden;height:40.4rem;left:24.1rem;z-index:1000000}.contacts-header{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid #f0f0f0}.modal-content .contacts-header{height:40px}.search-contacts-list{max-height:196px;overflow:auto;position:absolute;width:91%;background:white;z-index:1000}.contant-body p{font-size:14px;color:#5f6061}.contacts-header .title{font-weight:600}.contacts-header .back,.contacts-header .search{color:#9aa0a6;cursor:pointer}.disabled{opacity:.5;pointer-events:none}.contacts-list{padding:8px 8px 12px;overflow-y:auto}.contact-item{display:flex;align-items:center;padding:10px 8px;border-radius:10px}.contact-item:hover{background:#f7f9fc}.contact-avatar{width:37px;height:37px;border-radius:50%;object-fit:cover;margin-right:12px}.contact-info{flex:1}.contact-name{font-weight:600;color:#111827}.contact-title{font-size:12px;color:#6b7280}.contact-call-btn{display:inline-flex;align-items:center;gap:6px;background:#234de8;color:#fff;border:none;border-radius:16px;padding:8px;cursor:pointer}.contact-add-btn{background-color:#2ecc71!important}.conference-hold-contact{display:inline-flex;align-items:center;gap:5px;background:#727070;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.conference-hold-contact.on-hold{background:#28a745!important;color:#fff}.user-info-section{width:100%;height:100%;overflow-y:auto;overflow-x:hidden!important}.user-info-section::-webkit-scrollbar{display:none}.toggle-btn{cursor:pointer}.text-container{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s ease}.text-container.expanded{-webkit-line-clamp:unset}.userName{font-family:FontAwesome}.subject-text{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.conference-contact{display:inline-flex;align-items:center;gap:5px;background:#e14e4e;color:#fff;border:none;border-radius:50%;padding:7px;cursor:pointer}.organizer-label{padding:1px 5px;font-size:11px;border-radius:10px;border:1px solid #a0a0a0;margin-top:2px;background:#fcfcfc}.custom-modal{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;justify-content:center;align-items:center;z-index:1000;border-radius:21px}.modal-content{background:#ffffff;padding:25px;border-radius:8px;width:350px;text-align:center}.title{margin-bottom:15px;color:#d9534f}.message{margin-bottom:20px}.button-group{display:flex;justify-content:space-between}.btn{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-weight:500}.end-btn{background-color:#dc3545;color:#fff;display:flex;align-items:center;font-size:13px}.leave-btn{background-color:#007bff;color:#fff}.contact-call-btn .material-symbols-outlined{font-size:18px;color:#fff}.contact-call-btn .label{font-size:12px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}.animated-margin{transition:margin-top .5s ease}app-incoming-call{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1001}.min-call-container{width:320px;height:124px;border-radius:20px;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;display:flex;flex-direction:column;box-sizing:border-box;position:relative;overflow:hidden;margin:auto;align-items:center;padding:12px 16px;color:#fff}.min-call-animation{background:#fff;width:48px;height:48px;position:relative;margin:0 12px 0 auto;border-radius:100%;border:solid 2px #fff}.min-avatar-img{width:46px;height:46px;border-radius:100%;position:absolute;left:0;top:0}.min-callerDetails{color:#fff;display:flex;flex-direction:column;align-items:flex-start}.name{width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:20px;margin:0;color:#fff}.min-callerDetails p{margin:0;color:#fff}.min-btn-container{position:relative;display:flex;width:100%;justify-content:flex-start;align-items:center;margin-top:6px}.min-call-sec-btn{width:40px;height:40px;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:20px;display:flex;align-items:center;justify-content:center;margin-right:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226}.min-call-sec-btn span{color:#cccbcb}.min-call-btn{width:40px;height:40px;border-radius:20px;box-sizing:border-box;border:2px solid white;display:flex;align-items:center;justify-content:center}.fullscreen{position:absolute;right:18px;top:14px;color:#e8e8e8;font-size:18px;cursor:pointer}.btn-container{display:flex;flex-wrap:wrap;padding:0 24px}.dial-btn{width:40px;height:40px;background-color:transparent;text-align:center;box-sizing:border-box;margin:4px 25px;font-size:24px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#b5b5b5;cursor:pointer}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.min-timer{width:50px;font-size:18px;margin-right:10px;border-radius:4px;height:35px;display:flex;align-items:center}.record-action-btns{display:flex;flex-direction:column;align-items:center;margin-top:35px}.record-btn-container{position:relative}.record-btn{border:none;border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0 5px;position:relative;overflow:hidden}.record-btn.start-stop .recording-icon{width:50%;height:50%;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.record-btn.start-stop.recording .recording-icon{background-color:#000}.record-btn.start-stop.recording{border:3px solid #000}.record-btn.start-stop.stopped .recording-icon{background-color:red;border:3px solid #ff0000;border-radius:50%;position:absolute}.record-btn.start-stop.stopped{border:3px solid #ff0000}.record-btn.start-stop.stopped .recording-icon{width:40%;height:40%;border-radius:0;background-color:red}.pause-resume-btns{display:flex;flex-direction:column;align-items:center;margin-top:10px}.record-btn.pause-resume{border:none;border-radius:50%;width:50px;height:50px;background:white;display:flex;align-items:center;justify-content:center;margin:5px 0}.record-btn.pause-resume .material-symbols-outlined{font-size:20px;color:#000}.timer-display{font-size:1.2em;margin-top:10px;color:#000}.w-40{width:40%}.w-60{width:60%}.callToNum{color:#fff;font-weight:400;text-align:center}.callToNum span{font-weight:600}.conference-call-view{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:100%;padding:12px 16px 35px;color:#fff;height:100%}.conf-heading{display:flex;align-items:center;gap:8px;margin-top:8px}.conf-icon{color:#4579aa;font-size:32px;width:50px;height:50px;border:1px solid gray;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e1e1e1}.conf-title{font-weight:600;font-size:20px}.conf-name{margin-top:10px;font-size:17px;font-weight:600;text-align:center}.conf-timer{margin-top:4px;font-size:12px;opacity:.9}.conf-record{margin-top:14px}.record-stop-btn{width:44px;height:44px;border-radius:50%;border:none;background:#fff;display:flex;align-items:center;justify-content:center}.record-stop-btn .material-symbols-outlined{color:#e14e4e;font-size:28px}.conf-remove{margin-top:8px}.remove-btn{background:#ff0000!important;color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:12px;width:82px!important;height:auto}.conf-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:18px}.circle-btn{width:56px;height:56px;border-radius:50%;border:none;background:#000;display:flex;align-items:center;justify-content:center}.circle-btn .material-symbols-outlined{color:#fff;font-size:24px}.circle-btn.active{opacity:.85}.conf-end{margin-top:16px}.circle-btn.danger{background:#e14e4e}.circle-btn.danger .material-symbols-outlined{color:#fff}\n"] }]
|
|
1895
1603
|
}], ctorParameters: function () { return [{ type: i1.ExtensionService }, { type: i0.ChangeDetectorRef }, { type: i2.TwilioService }, { type: i3.IpAddressService }, { type: i4.IncomeingCallSocketService }]; }, propDecorators: { callData: [{
|
|
1896
1604
|
type: Input
|
|
1897
1605
|
}], selectedCallerId: [{
|
|
@@ -1904,6 +1612,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
1904
1612
|
type: Input
|
|
1905
1613
|
}], deviceId: [{
|
|
1906
1614
|
type: Input
|
|
1615
|
+
}], callAction: [{
|
|
1616
|
+
type: Input
|
|
1907
1617
|
}], conferenceCallInfo: [{
|
|
1908
1618
|
type: Input
|
|
1909
1619
|
}], endCallEvent: [{
|
|
@@ -1919,4 +1629,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
1919
1629
|
}], endIncomingCallEvent: [{
|
|
1920
1630
|
type: Output
|
|
1921
1631
|
}] } });
|
|
1922
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1wcm9ncmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2NvbXBvbmVudHMvY2FsbC1wcm9ncmVzcy9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDM0ksT0FBTyxFQUFRLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQXVCOUMsTUFBTSxPQUFPLHFCQUFxQjtJQThFaEMsdUVBQXVFO0lBQ3ZFLHFEQUFxRDtJQUNyRCxvQ0FBb0M7SUFFcEMsWUFBb0IsZ0JBQWtDLEVBQVUsR0FBc0IsRUFDNUUsYUFBNEIsRUFDNUIsU0FBMkIsRUFDM0IsMEJBQXNEO1FBSDVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUM1RSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQiwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBakZ2RCx5QkFBb0IsR0FBUSxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBUSxF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a0JBQWtCO3NCQUExQixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBb0JHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENhbGwsIERldmljZSB9IGZyb20gJ0B0d2lsaW8vdm9pY2Utc2RrJztcclxuaW1wb3J0IHsgRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvZXh0ZW5zaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUd2lsaW9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS90d2lsaW8uc2VydmljZSc7XHJcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50cyc7XHJcbmltcG9ydCBzd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcclxuaW1wb3J0IHsga2V5cGFkIH0gZnJvbSAnLi4vLi4vLi4va2V5cGFkJztcclxuaW1wb3J0IHsgaW50ZXJ2YWwsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBJTkNPTUlOR19DQUxMX0FVRElPX0JBU0U2NCB9IGZyb20gJy4vYXVkaW9fYmFzZTY0LmJhc2U2NCc7XHJcbmltcG9ydCB7IEluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9pbmNvbWVpbmctY2FsbC1zb2NrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IElwQWRkcmVzc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2lwLWFkZHJlc3Muc2VydmljZSc7XHJcblxyXG5cclxuaW50ZXJmYWNlIENhbGxEZXRhaWxzIHtcclxuICBjYWxsU2lkOiBzdHJpbmc7XHJcbiAgY2FsbFN0YXR1czogc3RyaW5nO1xyXG59XHJcbmludGVyZmFjZSBDYWxsU3RhdHVzUmVzcG9uc2Uge1xyXG4gIGNhbGxEZXRhaWxzOiBDYWxsRGV0YWlscztcclxuICByZXNwb25zZTogc3RyaW5nO1xyXG4gIGVycm9yVHlwZTogbnVtYmVyO1xyXG4gIG1lc3NhZ2U6IHN0cmluZztcclxuICBzdGF0dXM6IG51bWJlcjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItY2FsbC1wcm9ncmVzcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYWxsUHJvZ3Jlc3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgY2FsbERhdGE6IGFueTtcclxuICBASW5wdXQoKSBzZWxlY3RlZENhbGxlcklkOiBhbnk7XHJcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsRGF0YT86IENhbGw7XHJcbiAgQElucHV0KCkgbmV3SW5jb21pbmdDYWxsc0xpc3Q6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIGNhbGxlcklkTGlzdDogYW55ID0gW107XHJcbiAgQElucHV0KCkgZGV2aWNlSWQ6IGFueTtcclxuICBASW5wdXQoKSBjb25mZXJlbmNlQ2FsbEluZm86IGFueTtcclxuICB1c2VySWQ6IGFueTtcclxuICBAT3V0cHV0KCkgZW5kQ2FsbEV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGluY29taW5nQ2FsbHNOZXdJbmZvOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgbWluaW1pc2VFdmVudDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIGRldmljZT86IERldmljZTtcclxuICBjYWxsITogQ2FsbDtcclxuICBzaG93UmluZ0FuaW1hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRpbWVyOiBzdHJpbmcgPSAnMDA6MDAnO1xyXG4gIGludGVydmFsSWQ6IGFueTtcclxuICBzaG93S2V5cGFkOiBib29sZWFuID0gZmFsc2U7XHJcbiAga2V5cGFkVmFsID0ga2V5cGFkO1xyXG4gIGNhbGxJbnB1dDogc3RyaW5nID0gJyc7XHJcbiAgaXNNdXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGlzYmFsZUVuZENhbGxCdG46IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHNob3dDbGVhckJ0bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ29sbG9wcyA9IGZhbHNlO1xyXG4gIGN1cnJlbnRDYWxsOiBhbnk7XHJcbiAgLy8gQ29uZmVyZW5jZSBzdGF0ZSBmbGFnXHJcbiAgaXNDb25mZXJlbmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNPdXRnb2luZ0NhbGw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8vIEluY29taW5nIGNhbGwgdmFyaWFibGVzXHJcbiAgaW5jb21pbmdDYWxsRGl2OiBib29sZWFuID0gZmFsc2U7XHJcbiAgLy9AT3V0cHV0KCkgc2hvd0NhbGxQcm9ncmVzc0V2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGluY29taW5nQ2FsbEluaXRpYXRlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBpc0xvYWRlcnNob3c6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBAT3V0cHV0KCkgZW5kSW5jb21pbmdDYWxsRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBcclxuICAvLyBSZWNvcmRpbmcgdmFyaWFibGVzXHJcbiAgY2FsbFNpZDogYW55O1xyXG4gIGlzUmVjb3JkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNQYXVzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0aW1lclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcclxuICB0aW1lRWxhcHNlZCA9IDA7IC8vIGluIHNlY29uZHNcclxuICByZWNvcmRDYWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaW5jb21pbmdDYWxsU2lkOiBhbnk7XHJcbiAgY2FsbFN0YXR1czogc3RyaW5nID0gJ3JpbmdpbmcnO1xyXG4gIGluY29taW5nUmVjb3JkQ2FsbD86IGFueTtcclxuICBzZWxlY3RlZEluY29taW5nQ2FsbDogYW55O1xyXG4gIHNob3dDb250YWN0c1BhbmVsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNBZGRSZW1vdmVQYXJ0aWNpcGFudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ29uY3VycmVudEluY29taW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaGVsZENhbGw/OiBDYWxsO1xyXG4gIGlzQ2FsbE9uSG9sZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNvbnRhY3RzOiBhbnlbXSA9IFtdO1xyXG4gIGN1cnJlbnRDYWxsTGlzdDogYW55W10gPSBbXTtcclxuICBjb25mZXJlbmNlSWQ6IGFueTtcclxuICBhbGxQYXJ0aWNpcGVudExpc3Q6IGFueTtcclxuICBpc0NsaWNrRXhwYW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDYWxsSW5Qcm9ncmVzcyE6IGJvb2xlYW47XHJcbiAgaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdDogYW55ID0gW107XHJcbiAgaXNDb25mZXJlbmNlQ2FsbEhvbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzZWxlY3RlZFVzZXJJbmZvOiBhbnk7XHJcbiAgaXNTZWFyY2hWaXNpYmxlID0gZmFsc2U7XHJcbiAgaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIHNlYXJjaFRleHQgPSAnJztcclxuICBmaWx0ZXJlZExpc3Q6IGFueSA9IFtdO1xyXG4gIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0OiBhbnk7XHJcbiAgc2hvd0J1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUmluZ2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzRGlyZWN0Q2FsbE9wdGlvblNob3c6IGJvb2xlYW49IGZhbHNlO1xyXG4gIGRpYWxBbGVydCA9IHtcclxuICAgIG1zZzogJycsXHJcbiAgICBzaG93OiBmYWxzZVxyXG4gIH1cclxuICBsZWZ0UGFydGljaXBlbnQ6IGFueSA9IHt9O1xyXG4gIGNvbmZlcmVuY2VDYWxsTGlzdDogYW55W10gPSBbXTtcclxuICBpc0luY29taW5nQ2FsbEJ0bkRpc2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBob3N0bnVtYmVyOiBhbnk7XHJcbiAgaXNOZXdBZGRlZENhbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvLyBhdWRpb1VSTDphbnkgPSAnL3Byb2plY3RzL2RpYWxib3gvc3JjL2xpYi9zaGFyZWQvaW5jb21pbmdfY2FsbC5tcDMnO1xyXG4gIC8vIC9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvc2hhcmVkL2luY29taW5nX2NhbGwubXAzXHJcbiAgLy8gaW5jb21pbmdBdWRpbyE6IEhUTUxBdWRpb0VsZW1lbnQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXh0ZW5zaW9uU2VydmljZTogRXh0ZW5zaW9uU2VydmljZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBcclxuICAgIHByaXZhdGUgdHdpbGlvU2VydmljZTogVHdpbGlvU2VydmljZSxcclxuICAgIHByaXZhdGUgaXBTZXJ2aWNlOiBJcEFkZHJlc3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBpbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZTogSW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UgXHJcbiAgKSB7XHJcbiAgICBjb25zb2xlLmxvZygnQ2FsbCBQcm9ncmVzcyBDb21wb25lbnQnKTtcclxuICAgIHRoaXMuY2FsbCA9IHRoaXMudHdpbGlvU2VydmljZS5jYWxsO1xyXG4gICAgLy8gdGhpcy5pbmNvbWluZ0F1ZGlvID0gdGhpcy5jcmVhdGVBdWRpb0Zyb21CYXNlNjQoXHJcbiAgICAvLyAgICAgSU5DT01JTkdfQ0FMTF9BVURJT19CQVNFNjQsXHJcbiAgICAvLyAgICAgJ2F1ZGlvL21wZWcnIC8vIHVzZSBhdWRpby93YXYgaWYgbmVlZGVkXHJcbiAgICAvLyAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdDYWxsIFByb2dyZXNzIENvbXBvbmVudCBuZ09uSW5pdCcpO1xyXG4gICAgLy8gU3Vic2NyaWJlIHRvIGluY29taW5nIGNhbGxzIGZyb20gVHdpbGlvU2VydmljZVxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYodGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZCl7XHJcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLmV4dGVuc2lvblNlcnZpY2UudXNlcklkO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHdpbGlvU2VydmljZS5jdXJyZW50Q2FsbC5zdWJzY3JpYmUoKGluY29taW5nOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWluY29taW5nKSB7IHJldHVybjsgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdUd2lsaW9TZXJ2aWNlLmN1cnJlbnRDYWxsIGVtaXR0ZWQ6JywgaW5jb21pbmcpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdDb25jdXJyZW50IGluY29taW5nIGRldGVjdGVkIC0gc2hvd2luZyBiYW5uZXInKTtcclxuICAgICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3Vic2NyaWJpbmcgdG8gaW5jb21pbmcgY2FsbHM6JywgZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLkdldENvbnRhY3RzTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYodGhpcy51c2VySWQpe1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UudXNlcklkID0gdGhpcy51c2VySWQ7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snY2FsbERhdGEnXSkge1xyXG4gICAgICBpZiAoY2hhbmdlc1snY2FsbERhdGEnXS5jdXJyZW50VmFsdWU/LmlzSW5jb21pbmdDYWxsKSB7XHJcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZGlzcGxheU51bSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uZnJvbSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCd0ZXN0LXN0YXJ0Q2FsbDEyMycsIGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlKVxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XHJcbiAgICAgICAgICAgICAgICAgIC4uLmNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICBpZDogJzEyNScsXHJcbiAgICAgICAgICAgICAgICAgIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIGlzSG9sZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIGlzTXV0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgcGhvbmU6IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5waG9uZSxcclxuICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogJzEyMScsXHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5uYW1lIHx8IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5mcm9tTmFtZSB8fCBjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8udG9OYW1lIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLnRpbWVyLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnN0YXJ0Q2FsbChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWyduZXdJbmNvbWluZ0NhbGxzTGlzdCddPy5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgaWYgKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIGxldCBudW1iZXJMaXN0PSB0aGlzLmNhbGxlcklkTGlzdC5tYXAoKHJlczogYW55KSA9PiByZXMubnVtYmVyKTtcclxuICAgICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZvckVhY2goKGNhbGxJbmZvOiBhbnksIGk6IG51bWJlcik9PntcclxuICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUlkID0gaSA9PSAwID8gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFtpXS5jb25mZXJlbmNlSWQgOiB0aGlzLmNvbmZlcmVuY2VJZDtcclxuICAgICAgICAgIGxldCBvdXJOdW1iZXIgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0W2ldLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpPT5cclxuICAgICAgICAgICAgbnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tIHx8IHJlc0RhdGE/LnRvKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICBpZihvdXJOdW1iZXI/LmlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3RbaV0ucGFydGljaXBhbnRzLmZvckVhY2goYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYocmVzPy50byA9PSAnYzJjX3NvZnRwaG9uZV9jbGllbnQnICYmIG51bWJlckxpc3QuaW5jbHVkZXMocmVzPy5mcm9tKSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3RudW1iZXIgPSByZXM7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBjb250YWN0OiBhbnkgPSB7fVxyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5jb250YWN0cz8ubGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgICAgY29udGFjdCA9IHRoaXMuY29udGFjdHMuZmluZCgocmVzRGF0YSkgPT4gXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzRGF0YT8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciA9PSAocmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8uZnJvbSA6IHJlcz8udG8pXHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtLmlkID09IHJlcy5pZCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSAmJiAhcmVzLmlzTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1nOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy50b0ltYWdlIDogcmVzPy5mcm9tSW1hZ2UgfHwgY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0hvbGQ6IHJlcy5pc0hvbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc011dGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlOiByZXMuaXNDb25mZXJlbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNBY2NlcHRDYWxsOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gdGhpcy5nZXRTdGF0dXMocmVzKSA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGhvbmU6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZVNpZDogY2FsbEluZm8uY29uZmVyZW5jZVNpZCxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlcy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcy5qb2luZWRBdCB8fCBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZVNpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IC0xICYmIHJlcy5pc0xlZnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdPy5pZCA9PSB0aGlzLmN1cnJlbnRDYWxsPy5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAwID8gdGhpcy5jdXJyZW50Q2FsbExpc3RbMF0gOiB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsPy5pc0hvbGQgJiYgIXRoaXMuY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFt0aGlzLmN1cnJlbnRDYWxsPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlOiB0aGlzLmN1cnJlbnRDYWxsPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2U6IHRoaXMuY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50Q2FsbD8uaXNIb2xkICYmIHRoaXMuY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZmVyZW5jZUNhbGxsaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0uaXNDb25mZXJlbmNlICYmIGl0ZW0uY29uZmVyZW5jZUlkID09IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25mZXJlbmNlQ2FsbGxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBwYXJ0aWNpcGFudElkOiBjb25mZXJlbmNlQ2FsbGxpc3QubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0ucGFydGljaXBhbnRJZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25mZXJlbmNlSWQ6IGNvbmZlcmVuY2VDYWxsbGlzdFswXT8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgaG9sZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBtdXRlOiB0aGlzLmN1cnJlbnRDYWxsPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uZmVyZW5jZTogdGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFt0aGlzLmhvc3RudW1iZXI/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGU6IHRoaXMuY3VycmVudENhbGw/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlOiB0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5zaG93Q29udGFjdHNQYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlU2lkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgIC4uLnJlcyxcclxuICAgICAgICAgICAgICAgICAgICAgIGltZzogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8udG9JbWFnZSA6IHJlcz8uZnJvbUltYWdlIHx8IGNvbnRhY3Q/LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNIb2xkOiByZXMuaXNIb2xkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNNdXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZTogcmVzLmlzQ29uZmVyZW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHRoaXMuZ2V0U3RhdHVzKHJlcykgOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIHBob25lOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50byxcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHJlcy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvLmNvbmZlcmVuY2VTaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXMubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXMuam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIXJlcy5pc0xlZnQpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgIGltZzogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8udG9JbWFnZSA6IHJlcz8uZnJvbUltYWdlIHx8Y29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzSG9sZDogcmVzLmlzSG9sZCxcclxuICAgICAgICAgICAgICAgICAgICBpc011dGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZTogcmVzLmlzQ29uZmVyZW5jZSxcclxuICAgICAgICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHBob25lOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50byxcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiByZXMuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZVNpZDogY2FsbEluZm8uY29uZmVyZW5jZVNpZCxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXMubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IHRoaXMuZ2V0VGltZURpZmZlcmVuY2UocmVzLmpvaW5lZEF0IHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSksXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICBpZih0aGlzLmN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbMF1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmxlZnRQYXJ0aWNpcGVudFtjYWxsSW5mbz8uY29uZmVyZW5jZUlkXSA9IFsuLi5uZXcgTWFwKGNhbGxJbmZvPy5wYXJ0aWNpcGFudHMuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LmlzTGVmdCA9PT0gdHJ1ZSkubWFwKChpdGVtOiBhbnkpID0+IFtpdGVtPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gaXRlbT8udG8gfHwgJ1Vua25vd24nIDogaXRlbT8uZnJvbSwgaXRlbV0pKS52YWx1ZXMoKVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID17fVxyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUmluZ2luZykge1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmlzUmluZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jYWxsLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBsZXQgdmFsaWRWYWx1ZXMgPSBuZXcgU2V0KHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmxhdE1hcCgoaXRlbTogYW55KSA9PiBpdGVtPy5wYXJ0aWNpcGFudHMubWFwKCh2YWw6IGFueSkgPT4gdmFsPy5pZCkpKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiB2YWxpZFZhbHVlcy5oYXMoaXRlbT8ucGFydGljaXBhbnRJZCkpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSk9PiB0aGlzLmN1cnJlbnRDYWxsPy5wYXJ0aWNpcGFudElkID09IHJlcz8ucGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICBsZXQgY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbT8uaXNBY2NlcHRDYWxsICYmICFpdGVtPy5pc0hvbGQpO1xyXG4gICAgICAgICAgaWYoY3VycmVudENhbGw/Lmxlbmd0aCA9PSAxICYmIGN1cnJlbnRDYWxsWzBdPy5pZCl7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSBjdXJyZW50Q2FsbFswXSB8fCB0aGlzLmN1cnJlbnRDYWxsTGlzdFswXTtcclxuICAgICAgICAgIH1lbHNlIGlmKGN1cnJlbnRDYWxsPy5sZW5ndGggPiAxICYmIGN1cnJlbnRDYWxsWzBdPy5pc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IGN1cnJlbnRDYWxsWzBdIHx8IHRoaXMuY3VycmVudENhbGxMaXN0WzBdXHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgICBpZighdGhpcy5jdXJyZW50Q2FsbCAmJiAhdGhpcy5pc05ld0FkZGVkQ2FsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpPT4gcmVzPy5wYXJ0aWNpcGFudElkID09IHRoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWQgJiYgcmVzPy5pc0FjY2VwdENhbGwgJiYgIXJlcz8uaXNIb2xkKVxyXG4gICAgICAgICAgICBpZighdGhpcy5jdXJyZW50Q2FsbD8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFswXTtcclxuICAgICAgICAgICAgICBpZih0aGlzLmN1cnJlbnRDYWxsTGlzdFswXT8uaXNIb2xkICYmIHRoaXMuY3VycmVudENhbGxMaXN0WzBdPy5pc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFt0aGlzLmN1cnJlbnRDYWxsPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICBtdXRlOiB0aGlzLmN1cnJlbnRDYWxsPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICBjb25mZXJlbmNlOiB0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIGlmIChyZXMuaXNDb25mZXJlbmNlICYmIHRoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWQpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgcGFydGljaXBhbnRJZDogW3Jlcy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgICAgICAgIC8vICAgICAgIGNvbmZlcmVuY2VJZDogcmVzPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICBob2xkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIC8vICAgICAgIG11dGU6IHJlcz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgIC8vICAgICAgIGNvbmZlcmVuY2U6IHJlcz8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIH1cclxuICAgICAgICAgICAgICAgIC8vIH0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmKHRoaXMuY3VycmVudENhbGw/LmlzSG9sZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW3RoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgICAgICAgaG9sZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIG11dGU6IHRoaXMuY3VycmVudENhbGw/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2U6IHRoaXMuY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBlbHNlIGlmKCF0aGlzLmN1cnJlbnRDYWxsKSB7XHJcbiAgICAgICAgICAvLyAgIHRoaXMuY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSk9PiByZXM/LnBhcnRpY2lwYW50SWQgPT0gdGhpcy5jdXJyZW50Q2FsbD8ucGFydGljaXBhbnRJZCAmJiByZXM/LmlzQWNjZXB0Q2FsbCAmJiAhcmVzPy5pc0hvbGQpXHJcbiAgICAgICAgICAvLyAgIGlmKCF0aGlzLmN1cnJlbnRDYWxsPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgICAgICAvLyAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0WzBdO1xyXG4gICAgICAgICAgLy8gICAgIGlmKHRoaXMuY3VycmVudENhbGxMaXN0WzBdLmlzSG9sZCAmJiB0aGlzLmN1cnJlbnRDYWxsTGlzdFswXT8uaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgICAvLyAgICAgICB0aGlzLmlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgICAgICAgICAvLyAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKChyZXMpID0+IHtcclxuICAgICAgICAgIC8vICAgICAgICAgaWYgKHJlcy5pc0NvbmZlcmVuY2UgJiYgdGhpcy5jdXJyZW50Q2FsbD8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICAgICAgLy8gICAgICAgICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAvLyAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbcmVzLnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgLy8gICAgICAgICAgICAgY29uZmVyZW5jZUlkOiByZXM/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIC8vICAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgLy8gICAgICAgICAgICAgbXV0ZTogcmVzPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgLy8gICAgICAgICAgICAgY29uZmVyZW5jZTogcmVzPy5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgICAgICAgIC8vICAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gICAgICAgfSlcclxuICAgICAgICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gICAgICAgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIC8vICAgICAgICAgcGFydGljaXBhbnRJZDogW3RoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgLy8gICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIC8vICAgICAgICAgaG9sZDogZmFsc2UsXHJcbiAgICAgICAgICAvLyAgICAgICAgIG11dGU6IHRoaXMuY3VycmVudENhbGw/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAvLyAgICAgICAgIGNvbmZlcmVuY2U6IHRoaXMuY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgICAgLy8gICAgICAgfSk7XHJcbiAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgLy8gICB9XHJcbiAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgY29uc29sZS5sb2codGhpcy5sZWZ0UGFydGljaXBlbnQsICdsZWZ0UGFydGljaXBlbnQnKTtcclxuICAgICAgICAgIGlmKHRoaXMuc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCl7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFVzZXIgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0/LmlkID09IHRoaXMuc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICAgIGlmKHNlbGVjdGVkVXNlcil7XHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRVc2VyLklzVXNlckluZm9TaG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSBzZWxlY3RlZFVzZXI7XHJcbiAgICAgICAgICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBsZXQgaW5jb21pbmdDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtPy5idXNpbmVzc051bWJlcik7XHJcbiAgICAgICAgICAgICAgaWYoaW5jb21pbmdDYWxsPy5wYXJ0aWNpcGFudElkKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGluY29taW5nQ2FsbDtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuaXNDbGlja0V4cGFuZCl7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcmVzSW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gISFpdGVtPy5idXNpbmVzc051bWJlcik7XHJcbiAgICAgICAgICAgIGlmKHJlc0luZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0W3Jlc0luZGV4XS5Jc1VzZXJJbmZvU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbcmVzSW5kZXhdO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIGxldCBpbmNvbWluZ0RhdGE6IGFueSA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKHJlcyk9PiByZXM/LmlzSW5jb21pbmdDYWxsICYmICFyZXM/LmlzQWNjZXB0Q2FsbCk7XHJcbiAgICAgICAgICBpZihpbmNvbWluZ0RhdGE/LmlkICYmICF0aGlzLmlzUmluZ2luZyl7XHJcbiAgICAgICAgICAgIHRoaXMuaXNSaW5naW5nID0gdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wbGF5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmKCFpbmNvbWluZ0RhdGE/LmlkICYmIHRoaXMuaXNSaW5naW5nKXtcclxuICAgICAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnY3VycmVudENhbGxMaXN0JywgdGhpcy5jdXJyZW50Q2FsbExpc3QpO1xyXG4gICAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QgPSBbXTtcclxuICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUNhbGxMaXN0ID0gW1xyXG4gICAgICAgICAgICAuLi5uZXcgTWFwKHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0uaXNDb25mZXJlbmNlID09PSB0cnVlKS5tYXAoaXRlbSA9PiBbaXRlbS5jb25mZXJlbmNlSWQsIGl0ZW1dKSkudmFsdWVzKClcclxuICAgICAgICAgIF07XHJcbiAgICAgICAgLy8gfSlcclxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuaXNSaW5naW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QgPSBbXTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudENhbGwgPXt9XHJcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5pc1JpbmdpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGdldFN0YXR1cyhyZXM6IGFueSkge1xyXG4gICAgaWYgKHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UuaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdC5pbmNsdWRlcyhyZXMuaWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYocmVzLnN0YXR1cyA9PSAnYW5zd2VyZWQnICYmIHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEdldENvbnRhY3RzTGlzdCgpIHtcclxuICAgIGNvbnN0IHRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIHx8ICcnO1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnJlYWRDb250YWN0cyh0b2tlbikuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnQVBJIFJlc3BvbnNlOicsIHJlcyk7XHJcblxyXG4gICAgICAgIC8vIE5vdGU6IENhcGl0YWwgQiBpbiBwaG9uZUJvb2tcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5waG9uZUJvb2spIHtcclxuICAgICAgICAgIHRoaXMuY29udGFjdHMgPSByZXMucGhvbmVCb29rO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSByZXMucGhvbmVCb29rO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0NvbnRhY3RzIGFycmF5OicsIHRoaXMuY29udGFjdHMpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gcmVzO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSByZXM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY29udGFjdHMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ29udGFjdHMgYXJyYXk6JywgdGhpcy5jb250YWN0cyk7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjb250YWN0czonLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5jb250YWN0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGFkZFJlczogYW55O1xyXG4gIGFzeW5jIHN0YXJ0Q2FsbChjYWxsRGF0YTogYW55LCBpc05ld0NvbmZlcmVuY2U/OiBib29sZWFuKTpQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc29sZS5sb2coY2FsbERhdGEsICdjYWxsRGF0YScpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IHRydWU7XHJcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgY2hhbm5lbElkOiBlbnZpcm9ubWVudC5jaGFubmVsSWQsXHJcbiAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgdG86IGNhbGxEYXRhLnBob25lLFxyXG4gICAgICAgIGZyb21OdW1iZXI6IGNhbGxEYXRhLmZyb20sXHJcbiAgICAgICAgc2NvcGU6ICdsb2NhbCcsXHJcbiAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7XHJcbiAgICAgICAgICAgICAgYnVzaW5lc3NOdW1iZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGNhbGxTaWQ6JycsXHJcbiAgICAgICAgICAgICAgY2FsbFN0YXR1czonJyxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6JycsXHJcbiAgICAgICAgICAgICAgZGlhbDp0cnVlLFxyXG4gICAgICAgICAgICAgIGRpcmVjdGlvbjonb3V0Z29pbmctY2FsbCcsXHJcbiAgICAgICAgICAgICAgZm9yd2FyZGVkVG86JycsXHJcbiAgICAgICAgICAgICAgZnJvbTpjYWxsRGF0YS5mcm9tLFxyXG4gICAgICAgICAgICAgIGlkOid5eXVnZ2hqYicsXHJcbiAgICAgICAgICAgICAgaW1nOmNhbGxEYXRhLmltZyB8fCdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgICAgICBpc0FjY2VwdENhbGw6dHJ1ZSxcclxuICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgaXNIb2xkOmZhbHNlLFxyXG4gICAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOmZhbHNlLFxyXG4gICAgICAgICAgICAgIGlzTGVmdDpmYWxzZSxcclxuICAgICAgICAgICAgICBpc011dGU6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgam9pbmVkQXQ6JycsXHJcbiAgICAgICAgICAgICAgbmFtZTogY2FsbERhdGE/Lm5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDonJyxcclxuICAgICAgICAgICAgICBwaG9uZTpjYWxsRGF0YT8ucGhvbmUgfHwgJycsXHJcbiAgICAgICAgICAgICAgcm9sZTonY2FsbGVlJyxcclxuICAgICAgICAgICAgICBzdGF0dXM6JycsXHJcbiAgICAgICAgICAgICAgdGltZTonJyxcclxuICAgICAgICAgICAgICB0bzogY2FsbERhdGE/LnBob25lIHx8ICcnLFxyXG4gICAgICAgICAgICAgIHRvTmFtZTogY2FsbERhdGE/Lm5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgICAgdXNlcklkOnRoaXMudXNlcklkIHx8IGNhbGxEYXRhPy51c2VySWRcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5pbml0aWF0ZUNhbGwocGF5bG9hZCk7XHJcbiAgICAgIHRoaXMuY29uZmVyZW5jZUlkID0gcmVzcG9uc2U/LmNhbGxhdXRoPy5pZDtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICBjb25zdCB7IGlkOiBjYWxsQXV0aElkLCByZWNvcmRDYWxsIH0gPSBhd2FpdCB0aGlzLmdldENhbGxBdXRoSWQocmVzcG9uc2UpO1xyXG4gICAgICAgIC8vIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGNhbGxBdXRoSWQpXHJcbiAgICAgICAgdGhpcy5yZWNvcmRDYWxsID0gcmVjb3JkQ2FsbDsgLy8gU3RvcmUgdGhlIHJlY29yZENhbGwgdmFsdWVcclxuICAgICAgICBjb25zdCB0b2tlbkRhdGE6IGFueSA9IGF3YWl0IHRoaXMuZ2V0T3V0Z29pbmdDYWxsVG9rZW4oY2FsbEF1dGhJZCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0VG9EZXZpY2UodG9rZW5EYXRhLnRva2VuLCBjYWxsRGF0YSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2FsbFN0YXR1cyhjYWxsQXV0aElkKTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFJlcyA9IGF3YWl0IHRoaXMuYWRkUGFydGljaXBhbnRUb0NhbGwoe1xyXG4gICAgICAgICAgICAgIGZyb206IGNhbGxEYXRhPy5mcm9tLFxyXG4gICAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IGNhbGxEYXRhPy5waG9uZSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQsXHJcbiAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkZXJzaG93LmVtaXQoZmFsc2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnSW5pdGlhbCBwYXJ0aWNpcGFudElkOicsIHRoaXMuYWRkUmVzPy5wYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWRkaW5nIGluaXRpYWwgcGFydGljaXBhbnQ6JywgZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTAwMClcclxuICAgICAgICAvLyBQb2xsIHRoZSBzdGF0dXMgZm9yIDMwLTQ1IHNlY29uZHNcclxuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMjAxKSB7XHJcbiAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IGZhbHNlXHJcbiAgICAgICAgc3dhbChcIkVycm9yXCIsIHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxici8+XCIpLCBcImVycm9yXCIpO1xyXG4gICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcclxuICAgICAgY29uc29sZS5sb2coJ3Rlc3QzJylcclxuICAgICAgdGhpcy5lbmRDYWxsKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uTXV0ZVVzZXIoYzogYW55KSB7XHJcbiAgICB0aGlzLm9uTXV0ZVBhcnRpY2lwYW50KHtcclxuICAgICAgcGFydGljaXBhbnRJZDogW2MucGFydGljaXBhbnRJZF0sXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogYz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICBob2xkOiBjLmhvbGQsXHJcbiAgICAgIG11dGU6ICFjPy5pc011dGUsXHJcbiAgICAgIGNvbmZlcmVuY2U6IGMuaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICB9KVxyXG4gICAgYy5pc011dGUgPSAhYy5pc011dGU7XHJcbiAgICAvLyBhd2FpdCB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyhjPy5jb25mZXJlbmNlU2lkKTtcclxuICAgIC8vIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG9uSG9sZENhbGwoYzogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZyhjLCAnZHNkc2RzZHNkc2RzYWRzYScpO1xyXG4gICAgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgcGFydGljaXBhbnRJZDogW2MucGFydGljaXBhbnRJZF0sXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogYz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICBob2xkOiAhYy5ob2xkLFxyXG4gICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICBjb25mZXJlbmNlOiBjLmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgfSlcclxuICAgIGMuaG9sZCA9ICFjLmhvbGQ7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIGFzeW5jIG9uRW5kSW5jb21pbmdDYWxsKCkge1xyXG4gICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChyZXMpPT4gcmVzLnBhcnRpY2lwYW50SWQgPT0gdGhpcy5jdXJyZW50Q2FsbC5wYXJ0aWNpcGFudElkKTtcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRSZW1vdmVQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdPy5wYXJ0aWNpcGFudElkLCB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0/LmNvbmZlcmVuY2VJZCB8fCAnbm8nKS5zdWJzY3JpYmUoKHJlcyk9PntcclxuICAgICAgY29uc29sZS5sb2cocmVzKVxyXG4gICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgdGhpcy5lbmRJbmNvbWluZ0NhbGxFdmVudC5lbWl0KCk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBhc3luYyBvbkVuZENhbGwoYzogYW55LCBpc0FsbENhbGxFbmQ/OiBib29sZWFuLCBpc0NvbnRlY3Q/OiBib29sZWFuKSB7XHJcbiAgICBpZighYz8uaXNBY2NlcHRDYWxsICYmICFpc0NvbnRlY3QgJiYgIWlzQWxsQ2FsbEVuZCkge1xyXG4gICAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKHJlcyk9PiByZXMucGFydGljaXBhbnRJZCA9PSBjLnBhcnRpY2lwYW50SWQpXHJcbiAgICAgIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRSZW1vdmVQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdPy5wYXJ0aWNpcGFudElkLCB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0/LmNvbmZlcmVuY2VJZCB8fCAnbm8nKS5zdWJzY3JpYmUoKHJlcyk9PntcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgICAgIHRoaXMuY2FsbD8uZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIHRoaXMuZW5kSW5jb21pbmdDYWxsRXZlbnQuZW1pdChjKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGxldCBwYXJ0aWNpcGFudElkID0gaXNBbGxDYWxsRW5kID8gJ2FsbCcgOiBjLnBhcnRpY2lwYW50SWQ7XHJcbiAgICBsZXQgY29uZmVyZW5jZUlkID0gYy5jb25mZXJlbmNlSWQgfHwgdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQ7XHJcbiAgICBsZXQgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLmdldFJlbW92ZVBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudElkLCBjb25mZXJlbmNlSWQpO1xyXG4gICAgaWYgKHJlcz8uc3RhdHVzID09IDIwMSAmJiByZXM/Lm1lc3NhZ2UgPT0gJ3BhcnRpY2lwYW50IGFscmVhZHkgbGVmdCcpIHtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlU2lkKTtcclxuICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChyZXMpPT4gcmVzLnBhcnRpY2lwYW50SWQgIT09IGMucGFydGljaXBhbnRJZClcclxuICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgIHRoaXMuZW5kSW5jb21pbmdDYWxsRXZlbnQuZW1pdChjKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0aWF0ZUNhbGwocGF5bG9hZDogYW55KSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmluaXRpYXRlQ2FsbChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQocGF5bG9hZDogYW55KSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmhvbGRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYWRkUGFydGljaXBhbnRUb0NhbGwocGF5bG9hZDogYW55KSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmFkZFBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRDYWxsU3RhdHVzT2ZQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZDogYW55KSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTdGF0dXNPZlBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudElkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25NdXRlUGFydGljaXBhbnQocGF5bG9hZDogYW55KSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLm9uTXV0ZVBhcnRpY2lwYW50KHBheWxvYWQpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZDogYW55LCBjb25mZXJlbmNlSWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZCwgY29uZmVyZW5jZUlkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2FsbEF1dGhJZChyZXNwb25zZTogYW55KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogcmVzcG9uc2UuY2FsbGF1dGguaWQsXHJcbiAgICAgIHJlY29yZENhbGw6IHJlc3BvbnNlLmNhbGxhdXRoLnJlY29yZENhbGxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldE91dGdvaW5nQ2FsbFRva2VuKGNhbGxBdXRoSWQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDb25mZXJlbmNlQ2FsbFRva2VuKHsgYXV0aElkOiBjYWxsQXV0aElkIH0pLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0VG9EZXZpY2UodG9rZW46IGFueSwgY2FsbERhdGE6IGFueSkge1xyXG4gICAgY29uc3Qgb3B0aW9uczogYW55ID0ge1xyXG4gICAgICBjb2RlY1ByZWZlcmVuY2VzOiBbJ29wdXMnLCAncGNtdSddLFxyXG4gICAgICBjbG9zZVByb3RlY3Rpb246IHRydWUsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZGV2aWNlID0gbmV3IERldmljZSh0b2tlbi52YWx1ZSwgb3B0aW9ucyk7XHJcbiAgICB0aGlzLmNhbGwgPSBhd2FpdCB0aGlzLmRldmljZS5jb25uZWN0KHtcclxuICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgRnJvbTogY2FsbERhdGEuZnJvbSxcclxuICAgICAgICBUbzogY2FsbERhdGEucGhvbmUsXHJcbiAgICAgICAgRW52OiBlbnZpcm9ubWVudC5hYmIsXHJcbiAgICAgICAgVG9rZW46IHRva2VuLmlkLFxyXG4gICAgICAgIEV4dDogY2FsbERhdGEuZXh0TnVtXHJcbiAgICAgIH0sXHJcbiAgICAgIHJ0Y0NvbnN0cmFpbnRzOiB7IGF1ZGlvOiB7IGRldmljZUlkOiAnZGVmYXVsdCcgfSB9LFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnR3aWxpb1NlcnZpY2UuY2FsbCA9IHRoaXMuY2FsbDtcclxuICAgIGNvbnNvbGUubG9nKCd0ZXN0OTg5OTgxMTExMTEnLCB0aGlzLmNhbGwpO1xyXG4gICAgY29uc29sZS5sb2coJ3Rlc3RkZXZpY2UnLCB0aGlzLnR3aWxpb1NlcnZpY2UuZGV2aWNlKTtcclxuICAgIC8vIHRoaXMuY2FsbFsnY2FsbEluZm8nXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY2FsbERhdGEpKTtcclxuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xyXG5cclxuICAgIHRoaXMuc3RhcnRUaW1lcigpO1xyXG4gICAgdGhpcy5kZXZpY2U/Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbignZXJyb3InLCAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdkaXNjb25uZWN0JywgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygndGVzdC1kaXNjb25uZWN0JylcclxuICAgICAgdGhpcy5jYWxsPy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIC8vIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbigncmluZ2luZycsICgpID0+IHtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ3JlamVjdCcsICgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ3Rlc3Q1JylcclxuICAgICAgdGhpcy5lbmRDYWxsKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdhY2NlcHQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xyXG4gICAgICAvLyBFbnN1cmUgdGhlIGFjdGl2ZSBvdXRnb2luZyBjYWxsIGlzIG1hcmtlZCBhcyBhY2NlcHRlZCBzbyB0aGUgVUkgc3dpdGNoZXMgdG8gdGhlIGNvbm5lY3RlZCB2aWV3XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcGlkID0gdGhpcy5jYWxsRGF0YT8ucGFydGljaXBhbnRJZDtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmN1cnJlbnRDYWxsTGlzdCkgJiYgdGhpcy5jdXJyZW50Q2FsbExpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAvLyBjb25zdCBpZHggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGM6IGFueSkgPT4gKHBpZCAmJiBjPy5wYXJ0aWNpcGFudElkID09PSBwaWQpIHx8ICghcGlkICYmIGM/LnBob25lID09PSB0aGlzLmNhbGxEYXRhPy5waG9uZSkpO1xyXG4gICAgICAgICAgLy8gaWYgKGlkeCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3RbaWR4XS5pc0FjY2VwdENhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbaWR4XTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHVwZGF0aW5nIGFjY2VwdCBzdGF0ZTonLCBlKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBTdGFydCByZWNvcmRpbmcgaWYgcmVjb3JkQ2FsbCBpcyB0cnVlIGFuZCBjYWxsIGlzIGFjY2VwdGVkIGZvciAzMCBzZWNvbmRzXHJcbiAgICAgIC8vIGlmICh0aGlzLnJlY29yZENhbGwpIHtcclxuICAgICAgLy8gICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gICAgIGlmICh0aGlzLmlzUmVjb3JkaW5nKSByZXR1cm47IC8vIElmIGFscmVhZHkgcmVjb3JkaW5nLCBza2lwXHJcbiAgICAgIC8vICAgICB0aGlzLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICAgIC8vICAgfSwgMzAwMDApO1xyXG4gICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAvLyAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG4gICAgICAvLyB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2FsbD8ub24oJ21lc3NhZ2VSZWNlaXZlZCcsIChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydFRpbWVyKCkge1xyXG4gICAgbGV0IHNlY29uZHMgPSAwO1xyXG4gICAgdGhpcy5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBzZWNvbmRzKys7XHJcbiAgICAgIHRoaXMudGltZXIgPSB0aGlzLmZvcm1hdFRpbWUoc2Vjb25kcyk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0sIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdG9wVGltZXIoKSB7XHJcbiAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XHJcbiAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0VGltZSh0b3RhbFNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyA2MCk7XHJcbiAgICBjb25zdCBzZWNvbmRzID0gdG90YWxTZWNvbmRzICUgNjA7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5wYWQobWludXRlcyl9OiR7dGhpcy5wYWQoc2Vjb25kcyl9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFkKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHZhbHVlIDwgMTAgPyBgMCR7dmFsdWV9YCA6IGAke3ZhbHVlfWA7XHJcbiAgfVxyXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSkge1xyXG4gICAgc3dhbChcIkVycm9yXCIsIGVycm9yLCBcImVycm9yXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8gZW5kQ2FsbCgpIHtcclxuICAvLyAgIGNvbnNvbGUubG9nKCdlbmRDYWxsKCkgY2FsbGVkJyk7XHJcbiAgLy8gICBjb25zb2xlLmxvZygnQ3VycmVudCBjYWxsOicsIHRoaXMuY2FsbD8ucGFyYW1ldGVyc1snRnJvbSddKTtcclxuICAvLyAgIGNvbnNvbGUubG9nKCdIZWxkIGNhbGwgZXhpc3RzOicsICEhdGhpcy5oZWxkQ2FsbCk7XHJcblxyXG4gIC8vICAgLy8gRGlzY29ubmVjdCB0aGUgY3VycmVudCBhY3RpdmUgY2FsbFxyXG4gIC8vICAgaWYgKHRoaXMuY2FsbCkge1xyXG4gIC8vICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xyXG4gIC8vICAgICB0aGlzLmNhbGwgPSB1bmRlZmluZWQ7XHJcbiAgLy8gICB9XHJcblxyXG4gIC8vICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gIC8vICAgdGhpcy5zdG9wVGltZXIoKTtcclxuXHJcbiAgLy8gICAvLyBJZiB0aGVyZSdzIGEgaGVsZCBjYWxsLCBtYWtlIGl0IGFjdGl2ZVxyXG4gIC8vICAgaWYgKHRoaXMuaGVsZENhbGwpIHtcclxuICAvLyAgICAgY29uc29sZS5sb2coJ1Jlc3VtaW5nIGhlbGQgY2FsbDonLCB0aGlzLmhlbGRDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXSk7XHJcblxyXG4gIC8vICAgICAvLyBNYWtlIGhlbGQgY2FsbCB0aGUgYWN0aXZlIGNhbGxcclxuICAvLyAgICAgdGhpcy5jYWxsID0gdGhpcy5oZWxkQ2FsbDtcclxuICAvLyAgICAgdGhpcy5oZWxkQ2FsbCA9IHVuZGVmaW5lZDtcclxuICAvLyAgICAgLy8gdGhpcy5pc0NhbGxPbkhvbGQgPSBmYWxzZTtcclxuICAvLyAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSAhIXRoaXMuaGVsZENhbGw7XHJcblxyXG5cclxuICAvLyAgICAgLy8gVW5tdXRlIHRoZSByZXN1bWVkIGNhbGxcclxuICAvLyAgICAgdGhpcy5jYWxsLm11dGUoZmFsc2UpO1xyXG5cclxuICAvLyAgICAgLy8gVXBkYXRlIFVJIHdpdGggdGhlIHJlc3VtZWQgY2FsbCBpbmZvXHJcbiAgLy8gICAgIGNvbnN0IGZyb21OdW1iZXIgPSB0aGlzLmNhbGwucGFyYW1ldGVyc1snRnJvbSddO1xyXG4gIC8vICAgICBjb25zdCBjYWxsZXJOYW1lID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnbmFtZScpIHx8ICctJztcclxuICAvLyAgICAgY29uc3QgY2FsbGVySW1nID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XHJcblxyXG4gIC8vICAgICB0aGlzLmNhbGxEYXRhID0ge1xyXG4gIC8vICAgICAgIC4uLnRoaXMuY2FsbERhdGEsXHJcbiAgLy8gICAgICAgcGhvbmU6IGZyb21OdW1iZXIsXHJcbiAgLy8gICAgICAgZGlzcGxheU51bTogZnJvbU51bWJlcixcclxuICAvLyAgICAgICBuYW1lOiBjYWxsZXJOYW1lLFxyXG4gIC8vICAgICAgIGltZzogY2FsbGVySW1nXHJcbiAgLy8gICAgIH07XHJcblxyXG4gIC8vICAgICAvLyBSZXN0YXJ0IHRpbWVyIGZvciB0aGUgcmVzdW1lZCBjYWxsXHJcbiAgLy8gICAgIHRoaXMuc3RhcnRUaW1lcigpO1xyXG4gIC8vICAgICB0aGlzLmRpc2JhbGVFbmRDYWxsQnRuID0gZmFsc2U7XHJcblxyXG4gIC8vICAgICBjb25zb2xlLmxvZygnSGVsZCBjYWxsIGlzIG5vdyBhY3RpdmU6JywgdGhpcy5jYWxsRGF0YSk7XHJcbiAgLy8gICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIC8vIE5vIGhlbGQgY2FsbCwgY29tcGxldGVseSBlbmRcclxuICAvLyAgICAgY29uc29sZS5sb2coJ05vIGhlbGQgY2FsbCwgZW5kaW5nIGNvbXBsZXRlbHknKTtcclxuICAvLyAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gIC8vICAgICB0aGlzLm1heGltaXNlRGlhbHBhZCgpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgYXN5bmMgZW5kQ2FsbChpc0FsbENhbGxFbmQ/OiBib29sZWFuKSB7XHJcbiAgICBjb25zb2xlLmxvZygnZW5kQ2FsbCgpIGNhbGxlZCcpO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ0N1cnJlbnQgY2FsbDonLCB0aGlzLmNhbGw/LnBhcmFtZXRlcnNbJ0Zyb20nXSk7XHJcbiAgICBjb25zb2xlLmxvZygnSGVsZCBjYWxsIGV4aXN0czonLCAhIXRoaXMuaGVsZENhbGwpO1xyXG4gICAgLy8gTGVhdmluZyBjb25mZXJlbmNlIHN0YXRlIHdoZW4gZW5kaW5nIGN1cnJlbnQgY2FsbCBhY3Rpb25cclxuICAgIHRoaXMuaXNDb25mZXJlbmNlID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgaWYgKGlzQWxsQ2FsbEVuZCkge1xyXG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgICB0aGlzLm9uRW5kQ2FsbCh7fSwgaXNBbGxDYWxsRW5kKTtcclxuICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3QgPSBbXTtcclxuICAgICAgaWYoIXRoaXMuY3VycmVudENhbGxMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKHRoaXMuY3VycmVudENhbGwsIGlzQWxsQ2FsbEVuZCk7XHJcbiAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChjOiBhbnkpID0+IGM/LnBhcnRpY2lwYW50SWQgIT09IHRoaXMuY3VycmVudENhbGwucGFydGljaXBhbnRJZCk7XHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3RbMF0uaXNIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0WzBdO1xyXG4gICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbdGhpcy5jdXJyZW50Q2FsbD8ucGFydGljaXBhbnRJZF0sXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgbXV0ZTogdGhpcy5jdXJyZW50Q2FsbD8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIGlzQ29uZmVyZW5jZTogdGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbCA9IG51bGw7XHJcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jYWxsKSB7XHJcbiAgICAgICAgdGhpcy5jYWxsLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB0aGlzLmNhbGwucmVqZWN0KCk7XHJcbiAgICAgICAgLy8gdGhpcy5jYWxsID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgKHRoaXMuaGVsZENhbGwpIHtcclxuICAgIC8vICAgaWYgKHRoaXMuY2FsbCkge1xyXG4gICAgLy8gICAgIC8vIHRoaXMuY2FsbC5kaXNjb25uZWN0KCk7XHJcbiAgICAvLyAgICAgLy8gdGhpcy5jYWxsID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gICAgIHRoaXMub25FbmRDYWxsKHRoaXMuY2FsbD8uY2FsbEluZm8sIGlzQWxsQ2FsbEVuZCk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgY29uc29sZS5sb2coJ1Jlc3VtaW5nIGhlbGQgY2FsbDonLCB0aGlzLmhlbGRDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXSk7XHJcblxyXG4gICAgLy8gICAvLyBQcm9tb3RlIGhlbGQgY2FsbFxyXG4gICAgLy8gICAvLyB0aGlzLmNhbGwgPSB0aGlzLmhlbGRDYWxsO1xyXG4gICAgLy8gICB0aGlzLmhlbGRDYWxsID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gICAvLyB0aGlzLmlzQ2FsbE9uSG9sZCA9IGZhbHNlO1xyXG4gICAgLy8gICAvLyB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlOyAvLyBFbnN1cmUgVUkgcmVuZGVyc1xyXG5cclxuICAgIC8vICAgLy8gdGhpcy5jYWxsLm11dGUoZmFsc2UpO1xyXG5cclxuICAgIC8vICAgLy8gVXBkYXRlIGNhbGxEYXRhXHJcbiAgICAvLyAgIGNvbnN0IGZyb21OdW1iZXIgPSB0aGlzLmNhbGwucGFyYW1ldGVyc1snRnJvbSddO1xyXG4gICAgLy8gICBjb25zdCBjYWxsZXJOYW1lID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnbmFtZScpIHx8ICctJztcclxuICAgIC8vICAgY29uc3QgY2FsbGVySW1nID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XHJcblxyXG4gICAgLy8gICB0aGlzLmNhbGxEYXRhID0ge1xyXG4gICAgLy8gICAgIHBob25lOiBmcm9tTnVtYmVyLFxyXG4gICAgLy8gICAgIGRpc3BsYXlOdW06IGZyb21OdW1iZXIsXHJcbiAgICAvLyAgICAgbmFtZTogY2FsbGVyTmFtZSxcclxuICAgIC8vICAgICBpbWc6IGNhbGxlckltZ1xyXG4gICAgLy8gICB9O1xyXG5cclxuICAgIC8vICAgdGhpcy5zdGFydFRpbWVyKCk7XHJcbiAgICAvLyAgIHRoaXMuZGlzYmFsZUVuZENhbGxCdG4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyAgIC8vIEZvcmNlIFVJIHVwZGF0ZVxyXG4gICAgLy8gICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKSk7XHJcblxyXG4gICAgLy8gICBjb25zb2xlLmxvZygnSGVsZCBjYWxsIGlzIG5vdyBhY3RpdmU6JywgdGhpcy5jYWxsRGF0YSk7XHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZygnTm8gaGVsZCBjYWxsLCBlbmRpbmcgY29tcGxldGVseScpO1xyXG4gICAgLy8gICBjb25zb2xlLmxvZygndGVzdDYnKVxyXG4gICAgLy8gICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XHJcbiAgICAvLyAgIGlmICh0aGlzLmNhbGwpIHtcclxuICAgIC8vICAgICB0aGlzLmNhbGwuZGlzY29ubmVjdCgpO1xyXG4gICAgLy8gICAgIHRoaXMub25FbmRDYWxsKHRoaXMuY2FsbD8uY2FsbEluZm8sIGlzQWxsQ2FsbEVuZCk7XHJcbiAgICAvLyAgICAgLy8gdGhpcy5jYWxsID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHRoaXMubWF4aW1pc2VEaWFscGFkKCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuXHJcbiAgYXN5bmMgdG9nZ2xlTXV0ZShpc0NvbmZlcmVuY2U/OiBib29sZWFuKSB7XHJcbiAgICAvLyBhd2FpdCB0aGlzLm9uTXV0ZVBhcnRpY2lwYW50KHtcclxuICAgIC8vICAgcGFydGljaXBhbnRJZDogW3RoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgLy8gICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxyXG4gICAgLy8gICBtdXRlOiAhdGhpcy5pc011dGUsXHJcbiAgICAvLyB9KVxyXG4gICAgLy8gdGhpcy5jYWxsID0gdGhpcy5oZWxkQ2FsbFxyXG4gICAgLy8gdGhpcy50b2dnbGVNaWMoKVxyXG4gICAgdGhpcy5pc011dGUgPSAhdGhpcy5pc011dGU7XHJcbiAgICBjb25zb2xlLmxvZygnaXNNdXRlJywgdGhpcy5jYWxsLCB0aGlzLmhlbGRDYWxsKVxyXG4gICAgdGhpcy5jYWxsPy5tdXRlKHRoaXMuaXNNdXRlKTtcclxuICAgIC8vIGlmIChpc0NvbmZlcmVuY2UpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Q2FsbC5pc011dGUgPSB0aGlzLmlzTXV0ZTtcclxuICAgIC8vIH0gZWxzZSB7XHJcblxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgYXVkaW9TdHJlYW0/OiBNZWRpYVN0cmVhbTtcclxubWljT24gPSBmYWxzZTtcclxuXHJcbmFzeW5jIHRvZ2dsZU1pYygpIHtcclxuICBpZiAoIXRoaXMuYXVkaW9TdHJlYW0pIHtcclxuICAgIC8vIGZpcnN0IHRpbWU6IHJlcXVlc3QgbWljXHJcbiAgICB0aGlzLmF1ZGlvU3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyBhdWRpbzogdHJ1ZSB9KTtcclxuICB9XHJcblxyXG4gIHRoaXMubWljT24gPSAhdGhpcy5taWNPbjtcclxuXHJcbiAgdGhpcy5hdWRpb1N0cmVhbS5nZXRBdWRpb1RyYWNrcygpLmZvckVhY2godHJhY2sgPT4ge1xyXG4gICAgdHJhY2suZW5hYmxlZCA9IHRoaXMubWljT247ICAgLy8gZmFsc2UgPSBtdXRlZCwgdHJ1ZSA9IHNlbmRpbmcgYXVkaW9cclxuICB9KTtcclxufVxyXG4gIHRvZ2dsZUtleXBhZCgpIHtcclxuICAgIHRoaXMuc2hvd0tleXBhZCA9ICF0aGlzLnNob3dLZXlwYWQ7XHJcbiAgICB0aGlzLmNhbGxJbnB1dCA9ICcnO1xyXG4gIH1cclxuICB0b2dnbGVDb250YWN0c1BhbmVsKGNhbGxJbmZvPzogYW55LCBpc0Nsb3NlPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZihpc0Nsb3NlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5pc0FkZFJlbW92ZVBhcnRpY2lwYW50ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dDb250YWN0c1BhbmVsID0gIWlzQ2xvc2U7XHJcbiAgICB0aGlzLmdldEFsbFBhcnRpY2lwYW50cyhjYWxsSW5mbz8uY29uZmVyZW5jZVNpZCk7XHJcbiAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuY29udGFjdHM7XHJcbiAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q7XHJcbiAgICB0aGlzLmlzU2VhcmNoVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICBhZGRSZW1vdmVQYXJ0aWNpcGFudCgpIHtcclxuICAgIC8vIGNvbnN0IGNvbmZlcmVuY2VTSWQgPSB0aGlzLmFkZFJlcz8uY29uZmVyZW5jZVNpZDtcclxuICAgIHRoaXMuaXNBZGRSZW1vdmVQYXJ0aWNpcGFudCA9ICF0aGlzLmlzQWRkUmVtb3ZlUGFydGljaXBhbnQ7XHJcbiAgICB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZVNpZCk7XHJcbiAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGQoZGF0YT86IGFueSkge1xyXG4gICAgLy8gaWYoZGF0YT8uc3RhdHVzICE9ICdyaW5naW5nJyl7XHJcbiAgICB0aGlzLmlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLmNvbmZlcmVuY2VJZCA9IHRoaXMudHdpbGlvU2VydmljZS5jb25mZXJlbmNlQ2FsbEluZm8uY29uZmVyZW5jZUlkO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgdGhpcy5jdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICAvLyB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaCgocmVzKSA9PiB7XHJcbiAgICAgICAgLy8gICBpZiAocmVzLmlzQ29uZmVyZW5jZSkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgIC8vICAgICAgIHBhcnRpY2lwYW50SWQ6IFtyZXMucGFydGljaXBhbnRJZF0sXHJcbiAgICAgICAgLy8gICAgICAgY29uZmVyZW5jZUlkOiByZXM/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAvLyAgICAgICBob2xkOiB0cnVlLFxyXG4gICAgICAgIC8vICAgICAgIG11dGU6IHJlcz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAvLyAgICAgICBjb25mZXJlbmNlOiByZXMuaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH0pXHJcbiAgICAgICAgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFt0aGlzLmhvc3RudW1iZXIucGFydGljaXBhbnRJZF0sXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuaG9zdG51bWJlcj8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgIG11dGU6IHRoaXMuaG9zdG51bWJlcj8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIGNvbmZlcmVuY2U6IHRoaXMuaG9zdG51bWJlci5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgLy8gY29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5wYXJ0aWNpcGFudElkID09IHRoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWQpO1xyXG4gICAgICAgIC8vIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgIC8vICAgLy8gdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdLmlzSG9sZCA9IHRydWU7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiB0aGlzLmN1cnJlbnRDYWxsPy5pc0luY29taW5nQ2FsbCA/IFt0aGlzLmN1cnJlbnRDYWxsPy5pZF0gOiBbdGhpcy5jdXJyZW50Q2FsbD8ucGFydGljaXBhbnRJZF0sXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICBtdXRlOiB0aGlzLmN1cnJlbnRDYWxsPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgY29uZmVyZW5jZTogdGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gZGF0YS5pc0hvbGQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gbGV0IGluY29taW5nQ2FsbERhdGEgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5pc0luY29taW5nQ2FsbCAmJiBpdGVtLmlzQWNjZXB0Q2FsbCk7XHJcbiAgICAvLyBpZiAodGhpcy5jdXJyZW50Q2FsbExpc3QubGVuZ3RoID4gMSkge1xyXG4gICAgLy8gICAvLyB0aGlzLmNhbGwgPSBhd2FpdCB0aGlzLnR3aWxpb1NlcnZpY2UuY29ubmVjdCgnJyk7XHJcbiAgICAvLyAgIHRoaXMudHdpbGlvU2VydmljZS5hZGRJbmNvbWluZ1BhcnRpY2lwYW50KGRhdGE/LmlkLCB0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvLmNvbmZlcmVuY2VJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKHJlcywgJ2JoaGhoaGhoaGhoaGhoaGhoaGhoJylcclxuICAgIC8vICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLmlzQ3VycmVudEluY29taW5nQ2FsbExpc3QucHVzaChkYXRhPy5pZCB8fCBkYXRhPy5wYXJ0aWNpcGFudElkKTtcclxuICAgIC8vICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAvLyAgICAgZGF0YS5pc0FjY2VwdENhbGwgPSB0cnVlO1xyXG4gICAgLy8gICAgIC8vIHRoaXMuY3VycmVudENhbGwgPSBkYXRhO1xyXG4gICAgLy8gICAgIHRoaXMuc2V0SW5jb21pbmdDYWxsU3RhdHVzKGRhdGEpXHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gZGF0YTtcclxuICAgICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgcmVjb3JkSWQ6IGRhdGE/LmlkLFxyXG4gICAgICAgIGlwQWRkcmVzczogJycsXHJcbiAgICAgICAgaXBDb3VudHJ5OiAnJyxcclxuICAgICAgICBjYWxsU3RhdHVzOiAnYW5zd2VyZWQnLFxyXG4gICAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICAgIGNvbmZlcmVuY2VJZDogZGF0YT8uY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0SW5jb21pbmdDYWxsU3RhdHVzKHBheWxvYWQpLnN1YnNjcmliZShhc3luYyAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZihyZXMuc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5jYWxsID0gYXdhaXQgdGhpcy50d2lsaW9TZXJ2aWNlLmNvbm5lY3Qoe2NvbmZlcmVuY2VJZDpyZXMuY29uZmVyZW5jZUlkLCBjb25mZXJlbmNlTmFtZTogcmVzLmNvbmZlcmVuY2VOYW1lfSk7XHJcbiAgICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLmlzQ3VycmVudEluY29taW5nQ2FsbExpc3QucHVzaChkYXRhPy5pZCk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNhbGwsICdjYWxsQ29ubmVjdCcpO1xyXG4gICAgICAgICAgZGF0YS5pc0FjY2VwdENhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5pc0luY29taW5nQ2FsbEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChyZXMpPT4gcmVzLnBhcnRpY2lwYW50SWQgPT0gZGF0YS5wYXJ0aWNpcGFudElkKVxyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgICAgICAgc3dhbChcIkVycm9yXCIsIHJlcz8ubWVzc2FnZS5qb2luKFwiPGJyLz5cIiksIFwiZXJyb3JcIik7XHJcbiAgICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgICAgICB0aGlzLmlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdChkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG4gIGFzeW5jIGNhbGxDb250YWN0KGNvbnRhY3Q6IGFueSwgaXNVbnNhdmVkTnVtYmVyPzogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zb2xlLmxvZygnQWRkaW5nIHBhcnRpY2lwYW50OicsIGNvbnRhY3QpO1xyXG4gICAgY29uc29sZS5sb2coJ3RoaXMuY2FsbCcsIHRoaXMuY2FsbClcclxuICAgIGNvbnN0IHBob25lTnVtYmVyID0gaXNVbnNhdmVkTnVtYmVyID8gY29udGFjdCA6IGNvbnRhY3Q/Lm51bWJlcnNMaXN0Py5bMF0/Lm51bWJlciB8fCBjb250YWN0Py5waG9uZTtcclxuICAgIGxldCBhbHJlYWR5SW5DYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpPT4gcmVzLnRvID09IHBob25lTnVtYmVyIHx8IHJlcy5mcm9tID09IHBob25lTnVtYmVyKTtcclxuICAgICAgaWYoYWxyZWFkeUluQ2FsbCl7XHJcbiAgICAgICAgc3dhbCgnRXJyb3InLCBgQWxyZWFkeSAke3Bob25lTnVtYmVyfSBudW1iZXIgaW4gdGhpcyBjYWxsLmApO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgY29uc3QgY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChjOiBhbnkpID0+IGM/LnBob25lID09PSBwaG9uZU51bWJlcik7XHJcbiAgICBpZiAoIXBob25lTnVtYmVyIHx8IGN1cnJlbnRDYWxsKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHBob25lIG51bWJlciBmb3VuZCBmb3IgY29udGFjdCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgbGV0IGRhdGE6IGFueSA9IGF3YWl0IHRoaXMuYWRkUGFydGljaXBhbnRUb0NhbGwoe1xyXG4gICAgICAgICAgZnJvbTogdGhpcy5jYWxsRGF0YT8uZnJvbSA/IHRoaXMuY2FsbERhdGE/LmZyb20gOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcixcclxuICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudE51bWJlcjogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6ICB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlcklkLFxyXG4gICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgY291bnRyeWNvZGU6ICcnLFxyXG4gICAgICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWRcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtkYXRhPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6ICB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgaG9sZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgbXV0ZTogdGhpcy5jdXJyZW50Q2FsbD8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuY2FsbERhdGEgPSB7XHJcbiAgICAgICAgICAvLyAuLi50aGlzLmNhbGxEYXRhLFxyXG4gICAgICAgICAgcGhvbmU6IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgZGlzcGxheU51bTogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBuYW1lOiBjb250YWN0Py5uYW1lIHx8IGAke2NvbnRhY3Q/LmZpcnN0TmFtZX0gJHtjb250YWN0Py5sYXN0TmFtZX1gIHx8IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgaW1nOiBjb250YWN0Py5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogZGF0YT8ucGFydGljaXBhbnRJZCxcclxuICAgICAgICAgIGZyb206IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxyXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgIGlzTGVmdDogZmFsc2UsXHJcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlBhcnRpY2lwYW50IGFkZGVkIHRvIGNvbmZlcmVuY2U6XCIsIHBob25lTnVtYmVyKTtcclxuICAgICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoYz8ucGFydGljaXBhbnRJZCAmJiAhYz8uaXNIb2xkICYmIHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkID09IGM/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IGMuY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIG11dGU6IGM/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgY29uZmVyZW5jZTogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2U6IGM/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBQdXQgY3VycmVudCBjYWxsIG9uIGhvbGRcclxuICAgICAgICB0aGlzLmlzQ2FsbE9uSG9sZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93Q29udGFjdHNQYW5lbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAgICAgICAvLyBjb25zdCBjb250YWN0TmFtZSA9IFtjb250YWN0Py5maXJzdE5hbWUsIGNvbnRhY3Q/Lm1pZGRsZU5hbWUsIGNvbnRhY3Q/Lmxhc3ROYW1lXVxyXG4gICAgICAgIC8vICAgLmZpbHRlcihCb29sZWFuKVxyXG4gICAgICAgIC8vICAgLmpvaW4oJyAnKTtcclxuXHJcbiAgICAgICAgLy8gQWRkIHBhcnRpY2lwYW50IHRvIHRoZSBjb25mZXJlbmNlXHJcbiAgICAgICAgbGV0IGRhdGE6IGFueSA9IGF3YWl0IHRoaXMuYWRkUGFydGljaXBhbnRUb0NhbGwoe1xyXG4gICAgICAgICAgZnJvbTogdGhpcy5jYWxsRGF0YT8uZnJvbSB8fCB0aGlzLnNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcixcclxuICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudE51bWJlcjogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQsXHJcbiAgICAgICAgICBwcm94eTogJycsXHJcbiAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2RhdGE/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgbXV0ZTogZmFsc2UsXHJcbiAgICAgICAgICBjb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FsbERhdGEgPSB7XHJcbiAgICAgICAgICBwaG9uZTogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBkaXNwbGF5TnVtOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIG5hbWU6IGNvbnRhY3Q/Lm5hbWUgfHwgYCR7Y29udGFjdD8uZmlyc3ROYW1lfSAke2NvbnRhY3Q/Lmxhc3ROYW1lfWAgfHwgcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBpbWc6IGNvbnRhY3Q/LmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiBkYXRhPy5wYXJ0aWNpcGFudElkLFxyXG4gICAgICAgICAgZnJvbTogdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXHJcbiAgICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgICBpc0hvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgaXNMZWZ0OiBmYWxzZSxcclxuICAgICAgICAgIGlzQ29uZmVyZW5jZTogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNhbGxEYXRhLCAndGhpcy5jYWxsRGF0YScpXHJcbiAgICAgICAgY29uc29sZS5sb2coJ3Rlc3QxMTExMTEnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlBhcnRpY2lwYW50IGFkZGVkIHRvIGNvbmZlcmVuY2U6XCIsIHBob25lTnVtYmVyKTtcclxuICAgICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFkZGluZyBwYXJ0aWNpcGFudDonLCBlcnJvcik7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFzeW5jIENhbGxUb1Vuc2F2ZWROdW1iZXIobnVtYmVyOiBzdHJpbmcsIGlzTmV3Q29uZmVyZW5jZT86IGJvb2xlYW4pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKG51bWJlcik7XHJcbiAgICAgIGlmIChpc0ludmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5pc1NhdmVkQ29udGFjdERpYWxsZWQoKTtcclxuICBcclxuICAgICAgLy8gdGhpcy5pc1BheW1lbnREdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGF5bWVudER1ZScpID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgICAvLyBpZiAodGhpcy5pc1BheW1lbnREdWUpIHtcclxuICAgICAgLy8gICBzd2FsKCdXYXJuaW5nJywgJ1BsZWFzZSBub3RlIHRoYXQgeW91ciBwYXltZW50IGlzIGR1ZSwgVG8gY29udGludWUgb24geW91ciBzZXJ2aWNlcyBraW5kbHkgc3Vic2NyaWJlIHRvIHVzZSB1bmludGVycnVwdGVkIHNlcnZpY2VzLicpO1xyXG4gICAgICAvLyAgIHJldHVybiBmYWxzZTtcclxuICAgICAgLy8gfVxyXG4gIFxyXG4gICAgICAvLyB0aGlzLmlzVHJpYWxQZXJpb2RPdmVyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RyaWFsT3ZlcicpID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgICBsZXQgYWxyZWFkeUluQ2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbmQoKHJlczogYW55KT0+IHJlcy50byA9PSBudW1iZXIgfHwgcmVzLmZyb20gPT0gbnVtYmVyKTtcclxuICAgICAgaWYoYWxyZWFkeUluQ2FsbCl7XHJcbiAgICAgICAgc3dhbCgnRXJyb3InLCBgQWxyZWFkeSAke251bWJlcn0gbnVtYmVyIGluIHRoaXMgY2FsbC5gKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG51bWJlciA9PT0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aWxpb051bWJlcicpKSB7XHJcbiAgICAgICAgc3dhbCgnRXJyb3InLCAnWW91IGNhbiBub3QgZGlhbCB0aGlzIG51bWJlcicpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICAvLyBjb25zdCBoYXNQZXJtaXNzaW9uID0gYXdhaXQgdGhpcy5jaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XHJcbiAgICAgIC8vIGlmICghaGFzUGVybWlzc2lvbikge1xyXG4gICAgICAvLyAgIGF3YWl0IHRoaXMuYXNrRm9yTWljcm9waG9uZVBlcm1pc3Npb24oKTtcclxuICAgICAgLy8gICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIC8vIH1cclxuICBcclxuICAgICAgLy8gdGhpcy5pc0xvYWRlcnNob3cgPSB0cnVlO1xyXG4gICAgICAvLyBpZiAoIXRoaXMuc2VsZWN0ZWRDYWxsZXJJZCkge1xyXG4gICAgICAvLyAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSB0cnVlO1xyXG4gICAgICAvLyAgIHRoaXMuc2hvd0RpYWxBbGVydCgnU2VsZWN0IGEgQzJDIG51bWJlciB0byBjYWxsJyk7XHJcbiAgICAgIC8vICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2U7XHJcbiAgICAgIC8vICAgfSwgMzAwMCk7XHJcbiAgICAgIC8vICAgdGhpcy5pc0xvYWRlcnNob3cgPSBmYWxzZTtcclxuICAgICAgLy8gICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gQ2xlYXIgZGlzcGxheU51bSBpZiB2YWx1ZSBpcyBib3VuZCBmcm9tIHByZXZpb3VzIGNhbGxcclxuICAgICAgLy8gdGhpcy5jYWxsRGF0YS5kaXNwbGF5TnVtID0gJyc7XHJcbiAgICAgIFxyXG4gICAgICAvLyBHZXQgbnVtYmVyIHRvIGJlIGRpYWxlZCBmcm9tIGJhY2tlbmRcclxuICAgICAgbGV0IGNvbnRhY3QgPSAgdGhpcy5jb250YWN0cy5maW5kKChjb250YWN0OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gY29udGFjdC5udW1iZXJzTGlzdC5zb21lKChudW06IGFueSkgPT4gbnVtLm51bWJlciA9PT0gbnVtYmVyKVxyXG4gICAgICB9KTtcclxuICAgICAgbnVtYmVyID0gYXdhaXQgdGhpcy5nZXRUb051bWJlcihudW1iZXIpO1xyXG4gICAgICAvLyBpZiAodGhpcy50ZXJtaW5hdGVDYWxsKSB7XHJcbiAgICAgIC8vICAgdGhpcy50ZXJtaW5hdGVDYWxsID0gZmFsc2U7XHJcbiAgICAgIC8vICAgcmV0dXJuO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIFVwZGF0ZSBjYWxsIGRhdGEgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXHJcbiAgICAgIGNvbnN0IGNhbGxEYXRhID0ge1xyXG4gICAgICAgIG5hbWU6IGNvbnRhY3Q/LmZpcnN0TmFtZSxcclxuICAgICAgICBpbWc6IGNvbnRhY3Q/LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICBwaG9uZTogbnVtYmVyLFxyXG4gICAgICAgIGV4dE51bTonJyxcclxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgZGlhbDogdHJ1ZSxcclxuICAgICAgICBmcm9tOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxyXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbiAgICAgIH07XHJcbiAgXHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdkZDEwJylcclxuICAgICAgLy8gdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcclxuICAgICAgY29uc29sZS5sb2coJ2NhbGwgc3RhcnR0ZWQnLCBjYWxsRGF0YSk7XHJcbiAgICAgIGlmKGlzTmV3Q29uZmVyZW5jZSkge1xyXG4gICAgICAgIC8vIGlmKHRoaXMuY3VycmVudENhbGwuaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgbGV0IHBhcnRpY2lwZW50TGlzdDogc3RyaW5nW10gPSBbXVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goKHJlc0RhdGEpPT57XHJcbiAgICAgICAgICBpZighcmVzRGF0YS5pc0hvbGQgJiYgcmVzRGF0YT8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGVudExpc3QucHVzaChyZXNEYXRhPy5wYXJ0aWNpcGFudElkKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgaWYocGFydGljaXBlbnRMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHBhcnRpY2lwZW50TGlzdCxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgICAgbXV0ZTogdGhpcy5jdXJyZW50Q2FsbD8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZTogdGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmKHRoaXMuY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuc3RhcnRDYWxsKGNhbGxEYXRhLCBpc05ld0NvbmZlcmVuY2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0Q2FsbChjYWxsRGF0YSwgaXNOZXdDb25mZXJlbmNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgICAgIHRoaXMuY2FsbENvbnRhY3QobnVtYmVyLCB0cnVlKVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMuY2FsbEluaXRpYXRlZC5lbWl0KHsgLi4udGhpcy5jYWxsRGF0YSB9KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGluaXRpYXRlQ2FsbDonLCBlKTtcclxuICAgICAgLy8gdGhpcy5pc0xvYWRlcnNob3cgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdGYWlsZWQgdG8gaW5pdGlhdGUgY2FsbC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ2RkMTEnKVxyXG4gICAgICAvLyB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBhc3luYyBnZXRUb051bWJlcihkaWFsZWROdW1iZXI6IHN0cmluZykge1xyXG4gICAgaWYgKGRpYWxlZE51bWJlclswXSAhPT0gJysnKSB7XHJcbiAgICAgIC8vIHRoaXMgaXMgY2FzZSB3aGVuIHVzZXIgZ2VvbG9jYXRpb24gZGlhbCBjb2RlIGlzIG9uXHJcbiAgICAgIGxldCBpcEFkZHJlc3M6IGFueSA9IGF3YWl0IHRoaXMuaXBTZXJ2aWNlLmdldElwQWRkcmVzc0luZm8oKS50b1Byb21pc2UoKTtcclxuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLnR3aWxpb1NlcnZpY2UuZ2V0VG9OdW1iZXIoZGlhbGVkTnVtYmVyLGlwQWRkcmVzcy5hZGRyZXNzLmNvdW50cnlDb2RlKS50b1Byb21pc2UoKTtcclxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcz8udG9OdW1iZXJcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZGlhbGVkTnVtYmVyXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkaWFsZWROdW1iZXJcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGlzSW52YWxpZE51bWJlcihudW1iZXI6IHN0cmluZykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYobnVtYmVyID09ICcnKXtcclxuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdmFsaWROdW1iZXJQYXR0ZXJuID0gL15bK1xcZFxccygpLV0qJC87IC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCB2YWxpZCBjaGFyYWN0ZXJzXHJcbiAgICAgIGNvbnN0IHBob25lTnVtYmVyID0gbnVtYmVyO1xyXG4gICAgICBpZiAoIXZhbGlkTnVtYmVyUGF0dGVybi50ZXN0KHBob25lTnVtYmVyKSkge1xyXG4gICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XHJcbiAgICAgIHJldHVybiB0cnVlOyAvLyBSZXR1cm4gdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgbWVhbmluZyB0aGUgbnVtYmVyIGlzIGludmFsaWRcclxuICAgIH1cclxuICB9XHJcbiAgc2hvd0RpYWxBbGVydChtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGlhbEFsZXJ0ID0ge1xyXG4gICAgICBtc2c6IG1lc3NhZ2UsXHJcbiAgICAgIHNob3c6IHRydWVcclxuICAgIH07XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5kaWFsQWxlcnQuc2hvdyA9IGZhbHNlO1xyXG4gICAgfSwgMzAwMCk7XHJcbiAgfVxyXG5cclxuICBnZXRBbGxQYXJ0aWNpcGFudHMoY29uZmVyZW5jZVNpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0QWxsUGFydGljaXBhbnRzKGNvbmZlcmVuY2VTaWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5hbGxQYXJ0aWNpcGVudExpc3QgPSByZXMucGFydGljaXBhbnRzO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q7XHJcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgLy8gbGV0IGluZGV4ID0gdGhpcy5jb250YWN0cy5maW5kSW5kZXgoKGM6YW55KT0+IGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgPT0gcmVzPy50byk7XHJcbiAgICAgIC8vIGlmKGluZGV4ID4gLTEpe1xyXG4gICAgICAvLyAgIHRoaXMuY29udGFjdHNbaW5kZXhdLmlzQ2FsbE9uSG9sZCA9IHRydWU7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gZWxzZSB7XHJcbiAgICAgIC8vICAgcmVzWydJc0Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgICAgLy8gICB0aGlzLmNvbnRhY3RzLnB1c2gocmVzKVxyXG4gICAgICAvLyB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIGFjY2VwdENvbmN1cnJlbnRDYWxsKGluY29taW5nQ2FsbDogYW55KSB7XHJcbiAgLy8gICBpZiAoIWluY29taW5nQ2FsbCkgcmV0dXJuO1xyXG5cclxuICAvLyAgIC8vIFB1dCBjdXJyZW50IGNhbGwgb24gaG9sZCBpbnN0ZWFkIG9mIGRpc2Nvbm5lY3RpbmdcclxuICAvLyAgIGlmICh0aGlzLmNhbGwpIHtcclxuICAvLyAgICAgdGhpcy5oZWxkQ2FsbCA9IHRoaXMuY2FsbDtcclxuICAvLyAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSB0cnVlO1xyXG4gIC8vICAgICAvLyBNdXRlIHRoZSBoZWxkIGNhbGxcclxuICAvLyAgICAgdGhpcy5oZWxkQ2FsbC5tdXRlKHRydWUpO1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIGluY29taW5nQ2FsbC5hY2NlcHQoKTtcclxuICAvLyAgIHRoaXMuY2FsbCA9IGluY29taW5nQ2FsbDtcclxuICAvLyAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBpbmNvbWluZ0NhbGwucGFyYW1ldGVyc1snRnJvbSddO1xyXG4gIC8vICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gaW5jb21pbmdDYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnbmFtZScpIHx8ICctJztcclxuICAvLyAgIHRoaXMuY2FsbERhdGEuaW1nID0gaW5jb21pbmdDYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XHJcbiAgLy8gICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgLy8gICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xyXG4gIC8vICAgdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xyXG5cclxuICAvLyAgIC8vIFJlc2V0IHRpbWVyIGZvciBuZXcgY2FsbFxyXG4gIC8vICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAvLyAgIHRoaXMuc3RhcnRUaW1lcigpO1xyXG4gIC8vICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIC8vIH1cclxuXHJcblxyXG4gIGFjY2VwdENvbmN1cnJlbnRDYWxsKGluY29taW5nQ2FsbDogYW55KSB7XHJcbiAgICBpZiAoIWluY29taW5nQ2FsbCkgcmV0dXJuO1xyXG5cclxuXHJcbiAgICAvLyBQdXQgY3VycmVudCBjYWxsIG9uIGhvbGQgaW5zdGVhZCBvZiBkaXNjb25uZWN0aW5nXHJcbiAgICAvLyBpZiAodGhpcy5jYWxsKSB7XHJcbiAgICAvLyAvLyAgIHRoaXMuaGVsZENhbGwgPSB0aGlzLmNhbGw7XHJcbiAgICAvLyAgIHRoaXMuaXNDYWxsT25Ib2xkID0gdHJ1ZTtcclxuICAgIC8vIC8vICAgLy8gTXV0ZSB0aGUgaGVsZCBjYWxsXHJcbiAgICAvLyAvLyAgIHRoaXMuaGVsZENhbGwubXV0ZSh0cnVlKTtcclxuICAgIC8vIC8vIH1cclxuXHJcbiAgICAvLyAvLyBBY2NlcHQgdGhlIG5ldyBjYWxsXHJcbiAgICAvLyBpbmNvbWluZ0NhbGwuYWNjZXB0KCk7XHJcbiAgICAvLyB0aGlzLmNhbGwgPSBpbmNvbWluZ0NhbGw7XHJcbiAgICAvLyB0aGlzLmNhbGxEYXRhLnBob25lID0gaW5jb21pbmdDYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXTtcclxuICAgIC8vIHRoaXMuY2FsbERhdGEubmFtZSA9IGluY29taW5nQ2FsbC5jdXN0b21QYXJhbWV0ZXJzPy5nZXQoJ25hbWUnKSB8fCAnLSc7XHJcbiAgICAvLyB0aGlzLmNhbGxEYXRhLmltZyA9IGluY29taW5nQ2FsbC5jdXN0b21QYXJhbWV0ZXJzPy5nZXQoJ2ltYWdlJykgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xyXG4gICAgLy8gdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xyXG4gICAgLy8gdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSBmYWxzZTtcclxuICAgIC8vIHRoaXMuZGlzYmFsZUVuZENhbGxCdG4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyAvLyDwn5+iIFJlbW92ZSB0aGUgYWNjZXB0ZWQgY2FsbCBmcm9tIGluY29taW5nIGxpc3RcclxuICAgIC8vIHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgPSAodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCB8fCBbXSkuZmlsdGVyKFxyXG4gICAgLy8gICAoYzogYW55KSA9PiBjPy5wYXJhbWV0ZXJzPy5DYWxsU2lkICE9PSBpbmNvbWluZ0NhbGw/LnBhcmFtZXRlcnM/LkNhbGxTaWRcclxuICAgIC8vICk7XHJcbiAgICAvLyB0aGlzLmluY29taW5nQ2FsbHNOZXdJbmZvLmVtaXQodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCk7XHJcblxyXG4gICAgLy8gLy8g8J+VkiBSZXNldCB0aW1lciBmb3IgbmV3IGNhbGxcclxuICAgIC8vIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICAvLyB0aGlzLnN0YXJ0VGltZXIoKTtcclxuXHJcbiAgICAvLyB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBzd2FwQ2FsbHMoY2FsbEluZm86IGFueSxpc0NvbmZlcmVuY2VDYWxsPzogYm9vbGVhbikge1xyXG4gICAgLy8gaWYgKCF0aGlzLmhlbGRDYWxsIHx8ICF0aGlzLmNhbGwpIHJldHVybjtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuY2FsbCwgJ3RoaXMuY2FsbCcpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5oZWxkQ2FsbCwgJ3RoaXMuaGVsZENhbGwnKTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuY3VycmVudENhbGxMaXN0LCAndGhpcy5jdXJyZW50Q2FsbExpc3QnKTtcclxuICAgIGNvbnNvbGUubG9nKGNhbGxJbmZvLCAnY2FsbEluZm8gZm9yIHN3YXBDYWxscycpO1xyXG4gICAgaWYodGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlKXtcclxuICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGM/LmlzQ29uZmVyZW5jZSAmJiAhYz8uaXNIb2xkICYmIHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCA9PSBjPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBjLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgICAgbXV0ZTogYz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZTogYz8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZihpc0NvbmZlcmVuY2VDYWxsICYmIGM/LmNvbmZlcmVuY2VJZCA9PSBjYWxsSW5mby5jb25mZXJlbmNlSWQgJiYgYy5pc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBjLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgICAgaG9sZDogZmFsc2UsXHJcbiAgICAgICAgICAgIG11dGU6IGM/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2U6IHRydWVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IGZhbHNlXHJcbiAgICAgICAgfSBlbHNlIGlmIChjYWxsSW5mbz8uaXNIb2xkICYmIGM/LnBhcnRpY2lwYW50SWQgPT09IGNhbGxJbmZvPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25mZXJlbmNlOiBjPy5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYoaXNDb25mZXJlbmNlQ2FsbCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKGFzeW5jIChjOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoYz8uaXNDb25mZXJlbmNlICYmIGNhbGxJbmZvPy5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25mZXJlbmNlOiBjPy5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBjLmlzSG9sZCA9IHRydWU7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IGM/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2U6IGM/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZTtcclxuICAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoYz8ucGFydGljaXBhbnRJZCAmJiAhYz8uaXNIb2xkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICBob2xkOiB0cnVlLFxyXG4gICAgICAgICAgbXV0ZTogYz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIGNvbmZlcmVuY2U6IGM/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGNhbGxJbmZvPy5pc0hvbGQgJiYgYz8ucGFydGljaXBhbnRJZCA9PT0gY2FsbEluZm8/LnBhcnRpY2lwYW50SWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiBjLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgbXV0ZTogYz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIGNvbmZlcmVuY2U6IGM/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgICAvLyBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgLy8gICBwYXJ0aWNpcGFudElkOiB0aGlzLmNhbGw/LmNhbGxJbmZvPy5wYXJ0aWNpcGFudElkLFxyXG4gICAgLy8gICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxyXG4gICAgLy8gICBob2xkOiB0cnVlXHJcbiAgICAvLyB9KTtcclxuICAgIC8vIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAvLyAgIHBhcnRpY2lwYW50SWQ6IHRoaXMuaGVsZENhbGw/LmNhbGxJbmZvPy5wYXJ0aWNpcGFudElkLFxyXG4gICAgLy8gICBjb25mZXJlbmNlSWQ6IHRoaXMuY29uZmVyZW5jZUlkLFxyXG4gICAgLy8gICBob2xkOiBmYWxzZVxyXG4gICAgLy8gfSk7XHJcbiAgICBjb25zb2xlLmxvZygnU3dhcHBpbmcgY2FsbHMuLi4nKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdCZWZvcmUgc3dhcCAtIEFjdGl2ZSBjYWxsOicsIHRoaXMuY2FsbC5wYXJhbWV0ZXJzWydGcm9tJ10pO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ0JlZm9yZSBzd2FwIC0gSGVsZCBjYWxsOicsIHRoaXMuaGVsZENhbGwucGFyYW1ldGVyc1snRnJvbSddKTtcclxuXHJcbiAgICAvLyBTd2FwIHRoZSBjYWxsc1xyXG4gICAgLy8gY29uc3QgdGVtcCA9IHRoaXMuY2FsbDtcclxuICAgIC8vIHRoaXMuY2FsbCA9IHRoaXMuaGVsZENhbGw7XHJcbiAgICAvLyB0aGlzLmhlbGRDYWxsID0gdGVtcDtcclxuXHJcblxyXG4gICAgLy8gdGhpcy5jYWxsLm11dGUoZmFsc2UpO1xyXG4gICAgLy8gdGhpcy5oZWxkQ2FsbC5tdXRlKHRydWUpO1xyXG5cclxuICAgIC8vIFVwZGF0ZSBVSSB3aXRoIGFjdGl2ZSBjYWxsIGluZm8gLSBleHRyYWN0IGZyb20gY2FsbCBwYXJhbWV0ZXJzXHJcbiAgICAvLyBjb25zdCBmcm9tTnVtYmVyID0gdGhpcy5jYWxsLnBhcmFtZXRlcnNbJ0Zyb20nXTtcclxuICAgIC8vIGNvbnN0IGNhbGxlck5hbWUgPSB0aGlzLmNhbGwuY3VzdG9tUGFyYW1ldGVycz8uZ2V0KCduYW1lJykgfHwgJy0nO1xyXG4gICAgLy8gY29uc3QgY2FsbGVySW1nID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XHJcbiAgICAvLyBjb25zdCBkaXNwbGF5TnVtYmVyID0gdGhpcy5jYWxsLmN1c3RvbVBhcmFtZXRlcnM/LmdldCgnZGlzcGxheU51bWJlcicpIHx8ICctJztcclxuXHJcbiAgICAvLyBVcGRhdGUgY2FsbERhdGEgdG8gcmVmcmVzaCB0aGUgbWFpbiBVSVxyXG4gICAgLy8gdGhpcy5jYWxsRGF0YSA9IHtcclxuICAgIC8vICAgLi4udGhpcy5jYWxsRGF0YSxcclxuICAgIC8vICAgcGhvbmU6IGZyb21OdW1iZXIsXHJcbiAgICAvLyAgIGRpc3BsYXlOdW06IChkaXNwbGF5TnVtYmVyICYmIGRpc3BsYXlOdW1iZXIgIT09ICctJykgPyBkaXNwbGF5TnVtYmVyIDogZnJvbU51bWJlcixcclxuICAgIC8vICAgbmFtZTogKGNhbGxlck5hbWUgJiYgY2FsbGVyTmFtZSAhPT0gJy0nKSA/IGNhbGxlck5hbWUgOiAodGhpcy5jYWxsRGF0YT8ubmFtZSB8fCBmcm9tTnVtYmVyKSxcclxuICAgIC8vICAgaW1nOiBjYWxsZXJJbWcgfHwgdGhpcy5jYWxsRGF0YT8uaW1nIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1xyXG4gICAgLy8gfTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZygnQWZ0ZXIgc3dhcCAtIEFjdGl2ZSBjYWxsOicsIHRoaXMuY2FsbC5wYXJhbWV0ZXJzWydGcm9tJ10pO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ0FmdGVyIHN3YXAgLSBIZWxkIGNhbGw6JywgdGhpcy5oZWxkQ2FsbC5wYXJhbWV0ZXJzWydGcm9tJ10pO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ1VwZGF0ZWQgY2FsbERhdGE6JywgdGhpcy5jYWxsRGF0YSk7XHJcbiAgICBjb25zb2xlLmxvZygndGhpcy5jdXJyZW50Q2FsbExpc3QgYWZ0ZXIgc3dhcCcsIHRoaXMuY3VycmVudENhbGxMaXN0KTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGlzTWVyZ2VDYWxsQWxsb3dlZCgpIHtcclxuICAgIGxldCBtZXJnZUNhbGxMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChyZXMpPT5yZXMuY29uZmVyZW5jZUlkID09IHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkKTtcclxuICAgIHJldHVybiBtZXJnZUNhbGxMaXN0Lmxlbmd0aCA8PSAxO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbWVyZ2VDYWxscygpIHtcclxuICAgIC8vIE1lcmdlIGZ1bmN0aW9uYWxpdHkgLSB1bm11dGUgYm90aCBjYWxscyBmb3IgY29uZmVyZW5jZVxyXG4gICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgICAgICAgaWYoYy5jb25mZXJlbmNlSWQgPT0gdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgICAgIGlmIChjPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgICAgICAgIC8vIGMuaXNIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgICAgaG9sZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgbXV0ZTogYz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjLmlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vIH0gZWxzZSBpZihjPy5wYXJ0aWNpcGFudElkICYmIGMuaXNJbmNvbWluZ0NhbGwpe1xyXG4gICAgICAgICAgICAvLyAgIGF3YWl0IHRoaXMudHdpbGlvU2VydmljZS5hZGRJbmNvbWluZ1BhcnRpY2lwYW50KGM/LnBhcnRpY2lwYW50SWQsIHRoaXMuY29uZmVyZW5jZUlkKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAvLyAgICAgICBjb25zb2xlLmxvZyhkYXRhLCdiaGhoaGhoaGhoaGhoaGhoaGhoaCcpXHJcbiAgICAgICAgICAgIC8vICAgICB9KVxyXG4gICAgICAgICAgICAvLyAgIGMuaXNIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vICAgYy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIC8vIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgIC8vICAgcGFydGljaXBhbnRJZDogdGhpcy5oZWxkQ2FsbD8uY2FsbEluZm8/LnBhcnRpY2lwYW50SWQsXHJcbiAgICAgIC8vICAgY29uZmVyZW5jZUlkOiB0aGlzLmNvbmZlcmVuY2VJZCxcclxuICAgICAgLy8gICBob2xkOiBmYWxzZVxyXG4gICAgICAvLyB9KTtcclxuICAgICAgLy8gdGhpcy5oZWxkQ2FsbC5tdXRlKGZhbHNlKTtcclxuICAgICAgLy8gdGhpcy5jYWxsLm11dGUoZmFsc2UpO1xyXG4gICAgICB0aGlzLmlzQ2FsbE9uSG9sZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVuZEhlbGRDYWxsKCkge1xyXG4gICAgLy8gaWYgKHRoaXMuaGVsZENhbGwpIHtcclxuICAgIC8vICAgdGhpcy5oZWxkQ2FsbC5kaXNjb25uZWN0KCk7XHJcbiAgICAvLyAgIHRoaXMuaGVsZENhbGwgPSB1bmRlZmluZWQ7XHJcbiAgICAvLyAgIHRoaXMuaXNDYWxsT25Ib2xkID0gZmFsc2U7XHJcbiAgICAvLyAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG5cclxuICBoYXNEZXRhaWxlZEluZm8oY2FsbERhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFjYWxsRGF0YSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHVzZXJJbmZvIGV4aXN0cyBhbmQgaGFzIG1lYW5pbmdmdWwgZGF0YVxyXG4gICAgaWYgKGNhbGxEYXRhLnVzZXJJbmZvICYmIGNhbGxEYXRhLnVzZXJJbmZvLmMyY0luZm9ybWF0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBjYWxsRGF0YS51c2VySW5mby5jMmNJbmZvcm1hdGlvbjtcclxuICAgICAgcmV0dXJuICEhKFxyXG4gICAgICAgIGluZm8uc3ViamVjdCAmJiBpbmZvLnN1YmplY3QgIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8uZW1haWwgJiYgaW5mby5lbWFpbCAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5tZXNzYWdlICYmIGluZm8ubWVzc2FnZSAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5wb2ludE5hbWUgJiYgaW5mby5wb2ludE5hbWUgIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8uc291cmNlTmFtZSAmJiBpbmZvLnNvdXJjZU5hbWUgIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8uZXh0ZW5zaW9uICYmIGluZm8uZXh0ZW5zaW9uICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLnVybCB8fFxyXG4gICAgICAgIGluZm8ubGF0aXR1ZGUgfHxcclxuICAgICAgICBpbmZvLmxvbmdpdHVkZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIG9uQ2xpY2tFeHBhbmQoZGF0YT86IGFueSk6IHZvaWQge1xyXG4gIC8vICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwgPT09IGRhdGEgJiYgdGhpcy5pc0NsaWNrRXhwYW5kKSB7XHJcbiAgLy8gICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IGZhbHNlO1xyXG4gIC8vICAgICB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsID0gbnVsbDtcclxuICAvLyAgICAgLy8gdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbEluZm8uZW1pdCh7fSk7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IHRydWU7XHJcbiAgLy8gICB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsID0gZGF0YTtcclxuXHJcbiAgLy8gICBpZiAodGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCkge1xyXG4gIC8vICAgICB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsWydpc0NsaWNrRXhwYW5kJ10gPSB0cnVlO1xyXG5cclxuICAvLyAgICAgaWYgKHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgJiYgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5mb3JFYWNoKChjYWxsOiBhbnkpID0+IHtcclxuICAvLyAgICAgICAgIGlmIChjYWxsICE9PSB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsKSB7XHJcbiAgLy8gICAgICAgICAgIGNhbGxbJ2lzQ2xpY2tFeHBhbmQnXSA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcblxyXG4gIC8vICAgICAvLyB0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsSW5mby5lbWl0KHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpO1xyXG5cclxuICAvLyAgICAgaWYgKCF0aGlzLnNlbGVjdGVkSW5jb21pbmdDYWxsLnVzZXJJbmZvIHx8IHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwudXNlckluZm8uc3RhdHVzID09IDIwMSkge1xyXG4gIC8vICAgICAgIC8vIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXRVc2VySW5mb3JtYXRpb24oaW5jb21pbmdDYWxsRGF0YTogYW55KSB7XHJcbiAgLy8gICBsZXQgZGF0YSA9IHRoaXMuZnJvbUVudHJpZXMoQXJyYXkuZnJvbShpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZW50cmllcygpKSk7XHJcbiAgLy8gICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0VXNlckluZm9ybWF0aW9uKGRhdGFbJ3R3aWxpb0F1dGhJZCddKS5zdWJzY3JpYmUoXHJcbiAgLy8gICByZXNwb25zZSA9PiB7XHJcbiAgLy8gICAgIHNldFRpbWVvdXQoKCk9PntcclxuICAvLyAgICAgICBpbmNvbWluZ0NhbGxEYXRhWyd1c2VySW5mbyddPXJlc3BvbnNlXHJcbiAgLy8gICAgIH0sIDUwMDApXHJcbiAgLy8gICB9LCBlcnJvciA9PiB7XHJcbiAgLy8gICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN0YXJ0aW5nIHJlY29yZGluZycsIGVycm9yKTtcclxuICAvLyAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcmVqZWN0Q29uY3VycmVudENhbGwoaW5jb21pbmdDYWxsOiBhbnkpIHtcclxuXHJcbiAgLy8gICBpZiAoIWluY29taW5nQ2FsbCkgcmV0dXJuO1xyXG4gIC8vICAgaWYgKGluY29taW5nQ2FsbC5yZWplY3QpIHtcclxuICAvLyAgICAgaW5jb21pbmdDYWxsLnJlamVjdCgpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgaWYgKGluY29taW5nQ2FsbC5kaXNjb25uZWN0KSBpbmNvbWluZ0NhbGwuZGlzY29ubmVjdCgpO1xyXG4gIC8vICAgLy8gUmVtb3ZlIGZyb20gbGlzdFxyXG4gIC8vICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCA9ICh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0IHx8IFtdKS5maWx0ZXIoKGM6IGFueSkgPT4gYz8ucGFyYW1ldGVycz8uQ2FsbFNpZCAhPT0gaW5jb21pbmdDYWxsPy5wYXJhbWV0ZXJzPy5DYWxsU2lkKTtcclxuICAvLyAgIHRoaXMuaW5jb21pbmdDYWxsc05ld0luZm8uZW1pdCh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0KTtcclxuICAvLyAgIC8vIElmIG5vIG1vcmUgaW5jb21pbmcsIGhpZGUgYmFubmVyXHJcbiAgLy8gICBpZiAoIXRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QgfHwgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5sZW5ndGggPT09IDApIHtcclxuICAvLyAgICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xyXG4gIC8vICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIC8vIH1cclxuICBvbkNhbGxJbnB1dHMobnVtOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtID09ICcrJyB8fCBudW0gPT0gJyonIHx8IG51bSA9PSAnIycpIHtcclxuICAgICAgICBpZiAobnVtID09ICcjJykge1xyXG4gICAgICAgICAgbmV3IEF1ZGlvKGAvYXNzZXRzL2RpYWwtdG9uZXMvZHRtZi9kdG1mLWhhc2gtLm1wM2ApLnBsYXkoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG51bSA9PSAnKicpIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1zdGFyLS5tcDNgKS5wbGF5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi0ke251bX0tLm1wM2ApLnBsYXkoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2FsbElucHV0ID0gdGhpcy5jYWxsSW5wdXQgKyBTdHJpbmcobnVtKTtcclxuICAgICAgICB0aGlzLnNob3dDbGVhckJ0biA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHN0ciA9IFN0cmluZyhudW0pO1xyXG4gICAgICB0aGlzLmNhbGw/LnNlbmREaWdpdHMoc3RyKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG9uQ2FsbElucHV0RW50ZXIoZXY6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5jYWxsPy5zZW5kRGlnaXRzKFN0cmluZyhldi5rZXkpKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNsb3NlSW5jb21pbmdDYWxsKGRhdGE6IGFueSkge1xyXG4gICAgLy8gdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSBmYWxzZTtcclxuICAgIGlmIChkYXRhLnNob3cpIHtcclxuICAgICAgLy90aGlzLnNob3dDYWxsUHJvZ3Jlc3NFdmVudC5lbWl0KClcclxuICAgICAgLy8gaGFuZGxlIGluY29taW5nIGNhbGwgYWNjZXB0ZWRcclxuICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XHJcbiAgICAgIHRoaXMuZGlzYmFsZUVuZENhbGxCdG4gPSBmYWxzZTtcclxuICAgICAgLy8gdGhpcy5jYWxsID0gZGF0YS5jYWxsO1xyXG4gICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gZmFsc2U7XHJcblxyXG4gICAgICBjb25zdCBpbmNvbWluZ0RldGFpbCA9IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU2lkKCk7XHJcbiAgICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gaW5jb21pbmdEZXRhaWwucmVjb3JkQ2FsbDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmluY29taW5nUmVjb3JkQ2FsbCkge1xyXG4gICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gaW5jb21pbmcgY2FsbCByZWplY3RlZCBvciBhdXRvLWNhbmNlbGxlZFxyXG4gICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gZmFsc2U7XHJcbiAgICAgIC8vIElmIHRoZXJlIGlzIE5PIGFjdGl2ZSBjYWxsLCB0aGVuIHByb3BhZ2F0ZSBlbmQuIE90aGVyd2lzZSBrZWVwIG9uZ29pbmcgVUkuXHJcbiAgICAgIGlmICghdGhpcy5jYWxsIHx8IHRoaXMuY2FsbC5zdGF0dXMoKSAhPT0gJ29wZW4nKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3Rlc3Q3JylcclxuICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgY2xlYXJJbnB1dHMoKSB7XHJcbiAgICB0aGlzLmNhbGxJbnB1dCA9IHRoaXMuY2FsbElucHV0LnNsaWNlKDAsIC0xKTtcclxuICB9XHJcbiAgaXNNaW5pbWlzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtaW5pbWlzZURpYWxwYWQoKSB7XHJcbiAgICB0aGlzLm1pbmltaXNlRXZlbnQuZW1pdCh0cnVlKTtcclxuICAgIHRoaXMuaXNNaW5pbWlzZWQgPSB0cnVlO1xyXG4gIH1cclxuICBtYXhpbWlzZURpYWxwYWQoKSB7XHJcbiAgICB0aGlzLm1pbmltaXNlRXZlbnQuZW1pdChmYWxzZSk7XHJcbiAgICB0aGlzLmlzTWluaW1pc2VkID0gZmFsc2U7XHJcbiAgfVxyXG4gIHRvZ2dsZVJlY29yZGluZygpIHtcclxuICAgIGlmICh0aGlzLmlzUmVjb3JkaW5nKSB7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydFJlY29yZGluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGFydFJlY29yZGluZygpIHtcclxuICAgIGxldCBzaWQ7XHJcbiAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTaWQoKTtcclxuICAgIHRoaXMuaW5jb21pbmdDYWxsU2lkID0gZGV0YWlscy5jYWxsU2lkO1xyXG4gICAgdGhpcy5pbmNvbWluZ1JlY29yZENhbGwgPSBkZXRhaWxzLnJlY29yZENhbGw7XHJcbiAgICBzaWQgPSB0aGlzLmluY29taW5nQ2FsbFNpZCA/IHRoaXMuaW5jb21pbmdDYWxsU2lkIDogdGhpcy5jYWxsU2lkIHx8IHRoaXMuYWRkUmVzPy5jb25mZXJlbmNlU2lkO1xyXG5cclxuICAgIC8vIGlmICghdGhpcy5pbmNvbWluZ1JlY29yZENhbGwgJiYgIXRoaXMucmVjb3JkQ2FsbCkge1xyXG4gICAgLy8gICByZXR1cm47XHJcbiAgICAvLyB9XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgXCJjb25mZXJlbmNlSWRcIjogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgfVxyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxSZWNvcmRpbmcocGF5bG9hZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5pc1JlY29yZGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy50aW1lRWxhcHNlZCA9IDA7XHJcbiAgICAgIHRoaXMuc3RhcnRUaW1lcjEoKTtcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHN0b3BSZWNvcmRpbmcoKSB7XHJcbiAgICAvLyBpZiAoIXRoaXMuaW5jb21pbmdSZWNvcmRDYWxsICYmICF0aGlzLnJlY29yZENhbGwpIHtcclxuICAgIC8vICAgcmV0dXJuO1xyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5pc1JlY29yZGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwYXVzZVJlY29yZGluZygpIHtcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5wYXVzZU9yUmVzdW1lUmVjb3JkaW5nKHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCwgJ3BhdXNlJykuc3Vic2NyaWJlKFxyXG4gICAgICByZXNwb25zZSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nVGltZXIoKTtcclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGF1c2luZyByZWNvcmRpbmc6JywgZXJyb3IpO1xyXG4gICAgICAgIC8vIENvbnNpZGVyIHVwZGF0aW5nIHRoZSBVSSB0byBzaG93IHRoZSBlcnJvciBzdGF0ZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICByZXN1bWVSZWNvcmRpbmcoKSB7XHJcbiAgICAvLyBpZiAoIXRoaXMuaW5jb21pbmdSZWNvcmRDYWxsICYmICF0aGlzLnJlY29yZENhbGwpIHtcclxuICAgIC8vICAgcmV0dXJuOyAvLyBTa2lwIGlmIHJlY29yZGluZyBpcyBub3QgZW5hYmxlZFxyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnBhdXNlT3JSZXN1bWVSZWNvcmRpbmcodGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLCAncmVzdW1lJykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXJ0VGltZXIxKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlc3VtaW5nIHJlY29yZGluZycsIGVycm9yKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXRUaW1lRGlmZmVyZW5jZShpbnB1dFRpbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXN0VGltZSA9IG5ldyBEYXRlKGlucHV0VGltZSkuZ2V0VGltZSgpO1xyXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuXHJcbiAgICBsZXQgZGlmZiA9IE1hdGguZmxvb3IoKGN1cnJlbnRUaW1lIC0gcGFzdFRpbWUpIC8gMTAwMCk7IC8vIHRvdGFsIHNlY29uZHNcclxuXHJcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihkaWZmIC8gNjApO1xyXG4gICAgY29uc3Qgc2Vjb25kcyA9IGRpZmYgJSA2MDtcclxuXHJcbiAgICBjb25zdCBtbSA9IG1pbnV0ZXMgPCAxMCA/ICcwJyArIG1pbnV0ZXMgOiBtaW51dGVzO1xyXG4gICAgY29uc3Qgc3MgPSBzZWNvbmRzIDwgMTAgPyAnMCcgKyBzZWNvbmRzIDogc2Vjb25kcztcclxuXHJcbiAgICByZXR1cm4gYCR7bW19OiR7c3N9YDtcclxuICB9XHJcbiAgc3RhcnRUaW1lcjEoKSB7XHJcbiAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uID0gaW50ZXJ2YWwoMTAwMCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy50aW1lRWxhcHNlZCsrO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHN0b3BSZWNvcmRpbmdUaW1lcigpIHtcclxuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsgLy8gUGF1c2UgdGhlIHRpbWVyXHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7ICAgICAgICAvLyBPcHRpb25hbGx5IHJlc2V0IHRoZSBzdWJzY3JpcHRpb25cclxuICAgIH1cclxuICB9XHJcbiAgZ2V0Rm9ybWF0dGVkVGltZSgpIHtcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRoaXMudGltZUVsYXBzZWQgLyA2MCk7XHJcbiAgICBjb25zdCBzZWNvbmRzID0gdGhpcy50aW1lRWxhcHNlZCAlIDYwO1xyXG4gICAgcmV0dXJuIGAke21pbnV0ZXN9OiR7c2Vjb25kcyA8IDEwID8gJzAnIDogJyd9JHtzZWNvbmRzfWA7XHJcbiAgfVxyXG4gIHBvbGxDYWxsU3RhdHVzKGNhbGxBdXRoSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgbWF4VGltZSA9IDMwMDAwOyAvLyBQb2xsIGZvciB1cCB0byAzMCBzZWNvbmRzXHJcbiAgICBjb25zdCBwb2xsSW50ZXJ2YWwgPSAzMDAwOyAvLyBQb2xsIGV2ZXJ5IDMgc2Vjb25kc1xyXG4gICAgbGV0IGVsYXBzZWRUaW1lID0gMDtcclxuICAgIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XHJcbiAgICAgIGVsYXBzZWRUaW1lICs9IHBvbGxJbnRlcnZhbDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBzdGF0dXNSZXNwb25zZSA9IGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU3RhdHVzKGNhbGxBdXRoSWQpLnRvUHJvbWlzZSgpIGFzIENhbGxTdGF0dXNSZXNwb25zZTtcclxuICAgICAgICBpZiAoc3RhdHVzUmVzcG9uc2UgJiYgc3RhdHVzUmVzcG9uc2UuY2FsbERldGFpbHMpIHtcclxuICAgICAgICAgIHRoaXMuY2FsbFN0YXR1cyA9IHN0YXR1c1Jlc3BvbnNlLmNhbGxEZXRhaWxzLmNhbGxTdGF0dXM7XHJcbiAgICAgICAgICBpZiAodGhpcy5jYWxsU3RhdHVzID09PSAnaW4tcHJvZ3Jlc3MnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFNpZCA9IHN0YXR1c1Jlc3BvbnNlLmNhbGxEZXRhaWxzLmNhbGxTaWQ7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29yZENhbGwgJiYgIXRoaXMuaXNSZWNvcmRpbmcpIHtcclxuICAgICAgICAgICAgICB0aGlzLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYWxsU3RhdHVzID09PSAnY29tcGxldGVkJykge1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygndGVzdDEnKVxyXG4gICAgICAgICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2FsbFN0YXR1cyA9PT0gJ3JpbmdpbmcnKSB7XHJcbiAgICAgICAgICAgIC8vIENvbnRpbnVlIHBvbGxpbmc7IGRvIG5vdCBjbGVhciB0aGUgaW50ZXJ2YWwgeWV0XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGVsYXBzZWRUaW1lID49IG1heFRpbWUpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnTWF4IHBvbGxpbmcgdGltZSByZWFjaGVkLiBTdG9wcGluZyBwb2xsLicpO1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgIH1cclxuICAgIH0sIHBvbGxJbnRlcnZhbCk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VySW5mb3JtYXRpb24oaWQ6IGFueSkge1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihpZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLCAndXNlckluZm9ybWF0aW9uJyk7XHJcbiAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gcmVzcG9uc2UuYzJjSW5mb3JtYXRpb247XHJcbiAgICAgICAgLy8gaWYodGhpcy5pc0NsaWNrRXhwYW5kKXtcclxuICAgICAgICAvLyAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgLy8gaW5jb21pbmdDYWxsc05ld0xpc3QoZGF0YTogYW55KSB7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhkYXRhLCAnbmV3SW5jb21pbmdDYWxsc0xpc3RPVVInKVxyXG4gIC8vICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCA9IGRhdGE7XHJcbiAgLy8gICB0aGlzLmluY29taW5nQ2FsbHNOZXdJbmZvLmVtaXQodGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdCk7XHJcbiAgLy8gfVxyXG4gIHNlbGVjdGVkSW5jb21pbmdDYWxsSW5mbyhkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJbmNvbWluZ0NhbGwgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgZ2V0SG9sZENhbGxMaXN0KCl7XHJcbiAgICBsZXQgaG9sZExpc3Q6IGFueVtdID0gW107XHJcbiAgICBsZXQgaXNDb25mZXJlbmNlID0gZmFsc2U7XHJcbiAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAgICAgaWYoYz8uaXNIb2xkICYmICFjPy5pc0NvbmZlcmVuY2Upe1xyXG4gICAgICAgIGhvbGRMaXN0LnB1c2goYyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoYz8uaXNDb25mZXJlbmNlICYmICFpc0NvbmZlcmVuY2Upe1xyXG4gICAgICAgIGlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgICAgICAgY1snaXNDb25mZXJlbmNlQ2FsbEhvbGQnXSA9IHRydWU7XHJcbiAgICAgICAgaG9sZExpc3QucHVzaChjKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gaG9sZExpc3Q7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrRXhwYW5kKGRhdGE6IGFueSl7XHJcbiAgICBpZihkYXRhLmlkICE9IHRoaXMuc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCl7XHJcbiAgICAgIHRoaXMuaXNDbGlja0V4cGFuZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGRhdGE7XHJcbiAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSAhdGhpcy5pc0NsaWNrRXhwYW5kO1xyXG4gICAgICBpZih0aGlzLmlzQ2xpY2tFeHBhbmQpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSBkYXRhO1xyXG4gICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEluY29taW5nQ2FsbFN0YXR1cyhkYXRhOiBhbnkpIHtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICByZWNvcmRJZDogZGF0YT8uaWQsXHJcbiAgICAgIGlwQWRkcmVzczogJycsXHJcbiAgICAgIGlwQ291bnRyeTogJycsXHJcbiAgICAgIGNhbGxTdGF0dXM6ICdhbnN3ZXJlZCcsXHJcbiAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCB8fCBkYXRhLmNvbmZlcmVuY2VJZCB8fCAnbm8nXHJcbiAgICB9XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0SW5jb21pbmdDYWxsU3RhdHVzKHBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgY29uc29sZS5sb2cocmVzKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlYXJjaCgpIHtcclxuICB0aGlzLmlzU2VhcmNoVmlzaWJsZSA9ICF0aGlzLmlzU2VhcmNoVmlzaWJsZTtcclxuXHJcbiAgLy8gaWYgY2xvc2luZyBzZWFyY2gg4oCUIHJlc2V0IHJlc3VsdHNcclxuICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICBpZiAoIXRoaXMuaXNTZWFyY2hWaXNpYmxlKSB7XHJcbiAgICB0aGlzLmZpbHRlcmVkTGlzdCA9ICB0aGlzLmNvbnRhY3RzO1xyXG4gICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xyXG4gIH1cclxufVxyXG5cclxuYXBwbHlGaWx0ZXIoKSB7XHJcbiAgY29uc3QgdGV4dCA9IHRoaXMuc2VhcmNoVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICB0aGlzLmlzRGlyZWN0Q2FsbE9wdGlvblNob3cgPSAvXlxcKz9cXGQrJC8udGVzdCh0ZXh0KVxyXG4gIGlmICh0ZXh0Lmxlbmd0aCA8IDIpIHtcclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cztcclxuICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0LmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGNjOiBhbnkpID0+ICFjYz8uSXNDb25uZWN0ZWQgJiYgKGNjPy5waG9uZSA9PSBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyIHx8IGNjPy5waG9uZSA9PSBjPy5udW1iZXJzTGlzdFsxXT8ubnVtYmVyKSk7XHJcbiAgICAgIGlmKGluZGV4ID4gLTEpe1xyXG4gICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBjWydJc0Nvbm5lY3RlZCddID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cy5maWx0ZXIoKGM6IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gKGM/LmZpcnN0TmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSB8fCAoYz8ubGFzdE5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHwgXHJcbiAgICAgIChjPy5taWRkbGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8IChjPy5mdWxsTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSB8fCBcclxuICAgICAgKGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkgfHwgKGM/Lm51bWJlcnNMaXN0WzFdPy5udW1iZXIgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCk7XHJcbiAgICB9KTtcclxuICAgIC8vIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdC5maWx0ZXIoKGM6IGFueSkgPT4ge1xyXG4gICAgLy8gICBjb25zdCBuYW1lID0gKGMuZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IChjPy50b05hbWUgfHwgJycpIDogKGM/LmZyb21OYW1lIHx8ICcnKSkudG9Mb3dlckNhc2UoKTtcclxuICAgIC8vICAgY29uc3QgbnVtYmVyID0gKGMuZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/ICggYz8udG8gfHwgJycpIDogKGM/LmZyb20gfHwgJycpKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICByZXR1cm4gbmFtZS5pbmNsdWRlcyh0ZXh0KSB8fCBudW1iZXIuaW5jbHVkZXModGV4dCk7XHJcbiAgICAvLyB9KTtcclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0LmZvckVhY2goKGM6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGNjOiBhbnkpID0+IGNjPy5waG9uZSA9PSBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyIHx8IGNjPy5waG9uZSA9PSBjPy5udW1iZXJzTGlzdFsxXT8ubnVtYmVyKTtcclxuICAgICAgaWYoaW5kZXggPiAtMSl7XHJcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuY2hlY2tUZXh0SGVpZ2h0KCkge1xyXG4gIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRleHQtY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgaWYgKGVsPy5zY3JvbGxIZWlnaHQgPiBlbD8uY2xpZW50SGVpZ2h0KSB7XHJcbiAgICB0aGlzLnNob3dCdXR0b24gPSB0cnVlO1xyXG4gIH1cclxufVxyXG50b2dnbGVUZXh0KCkge1xyXG4gIHRoaXMuaXNFeHBhbmRlZCA9ICF0aGlzLmlzRXhwYW5kZWQ7XHJcbn1cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuY2FsbERhdGEuZGlhbCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMudGltZXJTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIjxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxsLWNvbnRhaW5lclwiICpuZ0lmPVwiIWlzTWluaW1pc2VkICYmIGN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2NvbGxvcHMnOiBpc0NvbGxvcHMsICdpbmNvbWluZy1jYWxsLWNvbnRhaW5lcic6IGlzQ2xpY2tFeHBhbmQsICdjb250YWN0cy1vcGVuJzogc2hvd0NvbnRhY3RzUGFuZWwgfVwiPlxyXG4gICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpbmNvbWluZ0NhbGxEaXYgfHwgaXNDb25jdXJyZW50SW5jb21pbmcgfHwgdHJ1ZVwiPiAtLT5cclxuICAgICAgICAgICAgPCEtLSBBbGwgdHlwZSBDYWxsIEhvbGQgbGlzdCAgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtYmFubmVyXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudENhbGxMaXN0Lmxlbmd0aCA+IDEgJiYgISFjdXJyZW50Q2FsbCAmJiAoKGlzQ29uZmVyZW5jZUNhbGxIb2xkIHx8IGlzQ29uZmVyZW5jZSkgfHwgIWlzQ29uZmVyZW5jZSlcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmYgb2YgY29uZmVyZW5jZUNhbGxMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbC1jb250ZW50XCIgKm5nSWY9XCJjb25mPy5pc0hvbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGhvbGQtaWNvblwiPnBhdXNlX2NpcmNsZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGxlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1sYWJlbFwiPkhvbGQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLW5hbWVcIj5Db25mZXJlbmNlIENhbGw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdFwiIFtuZ0NsYXNzXT1cInsgJ29uLWhvbGQnOiBjb25mPy5pc0hvbGQgfVwiIChjbGljayk9XCJzd2FwQ2FsbHMoY29uZix0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwie3snSG9sZCd9fVwiPiBwaG9uZV9wYXVzZWQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cImVuZENhbGwodHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZWFycm93LWFycm93IG1lLTJcIiBpZD1cInRvZ2dsZWFycm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjb25mKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhlbGRDYWxsIG9mIGN1cnJlbnRDYWxsTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtY29udGVudFwiICpuZ0lmPVwiaGVsZENhbGw/LmlzSG9sZCAmJiAhaGVsZENhbGw/LmlzQ29uZmVyZW5jZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaG9sZC1pY29uXCI+cGF1c2VfY2lyY2xlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+SG9sZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPnt7aGVsZENhbGw/Lm5hbWUgfHwgJ1Vua25vd24gbnVtYmVyJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1udW1iZXJcIj57e2hlbGRDYWxsPy5waG9uZSB8fCAnJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1ob2xkLWNvbnRhY3RcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogaGVsZENhbGw/LmlzSG9sZCB9XCIgKGNsaWNrKT1cInN3YXBDYWxscyhoZWxkQ2FsbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cInt7aGVsZENhbGw/LmlzSG9sZD8gJ1Jlc3VtZSc6J0hvbGQnfX1cIj4gcGhvbmVfcGF1c2VkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtY29udGFjdFwiIChjbGljayk9XCJvbkVuZENhbGwoaGVsZENhbGwpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJDYWxsIEVuZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGVhcnJvdy1hcnJvdyBtZS0yXCIgaWQ9XCJ0b2dnbGVhcnJvd1wiICpuZ0lmPVwiaGVsZENhbGw/LmlzSW5jb21pbmdDYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja0V4cGFuZChoZWxkQ2FsbClcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJzogIWhlbGRDYWxsPy5idXNpbmVzc051bWJlcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFuZ2xlLXJpZ2h0XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJoZWxkLWJ0biBzd2FwLWJ0blwiIChjbGljayk9XCJzd2FwQ2FsbHMoaGVsZENhbGwpXCIgdGl0bGU9XCJTd2FwIGNhbGxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHN3YXAtaWNvblwiPnN3YXBfdmVydDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbC1jb250ZW50XCIgKm5nSWY9XCJoZWxkQ2FsbD8uaXNJbmNvbWluZ0NhbGwgJiYgIWhlbGRDYWxsPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGhvbGQtaWNvblwiPnBob25lX2NhbGxiYWNrPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWxkLWxhYmVsXCI+SW5jb21pbmcgQ2FsbDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPnt7aGVsZENhbGw/Lm5hbWUgfHwgJ1Vua25vd24gbnVtYmVyJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1udW1iZXJcIj57e2hlbGRDYWxsPy5waG9uZSB8fCAnJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYmFubmVyLWJ0biByZWNlaXZlLWJ0blwiICpuZ0lmPVwiIWhlbGRDYWxsPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwiYWRkKGhlbGRDYWxsKVwiPiBjYWxsIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuLXdyYXBwZXIgYmFubmVyLWJ0biByZWplY3QtYnRuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChoZWxkQ2FsbClcIj4gY2FsbF9lbmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGVhcnJvdy1hcnJvdyBtZS0yXCIgaWQ9XCJ0b2dnbGVhcnJvd1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tFeHBhbmQoaGVsZENhbGwpXCIgW25nQ2xhc3NdPVwieydkaXNhYmxlZCc6ICFoZWxkQ2FsbD8uYnVzaW5lc3NOdW1iZXJ9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBDb21wYWN0IGJhbm5lcnMgZm9yIGNvbmN1cnJlbnQgaW5jb21pbmcgKG9uZSBwZXIgY2FsbCkgLS0+XHJcbiAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAxICYmICFjdXJyZW50Q2FsbD8uaWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1iYW5uZXJzLWNvbnRhaW5lclwiICpuZ0lmPVwiIWlzQ29uZmVyZW5jZSAmJiBjdXJyZW50Q2FsbExpc3QubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaW5jIG9mIGN1cnJlbnRDYWxsTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluY29taW5nLWJhbm5lclwiICpuZ0lmPVwiaW5jPy5pc0luY29taW5nQ2FsbCAmJiAhaW5jPy5pc0FjY2VwdENhbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgdG9wOiAoKGlzQ2FsbE9uSG9sZCAmJiBoZWxkQ2FsbCkgPyA2NCA6IDApICsgKGkgKiA3MCkgKyAncHgnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5jb21pbmctYmFubmVyLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluY29taW5nLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5jb20gaW5nLWxhYmVsXCI+SW5jb21pbmcgY2FsbDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1jYWxsZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhbGxlci1uYW1lXCI+e3sgaW5jPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/Lm5hbWUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jPy5jdXN0b21QYXJhbWV0ZXJzPy5nZXQoJ25hbWUnKSB8fCAnLScgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYWxsZXItbnVtYmVyXCI+e3sgaW5jPy51c2VySW5mbz8uYzJjSW5mb3JtYXRpb24/Lm51bWJlciB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmM/LnBhcmFtZXRlcnM/LkZyb20gfHwgJycgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYmFubmVyLWJ0biBhY2NlcHQtYnRuXCIgKGNsaWNrKT1cImFkZChpbmMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+Y2FsbDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhbm5lci1idG4gcmVqZWN0LWJ0blwiIChjbGljayk9XCJvbkVuZENhbGwoaW5jKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmNhbGxfZW5kPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlYXJyb3ctYXJyb3cgbWUtMlwiIGlkPVwidG9nZ2xlYXJyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrRXhwYW5kKGluYylcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJzogIWluYz8uYnVzaW5lc3NOdW1iZXJ9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvciBzaW5nbGUgaW5jb21pbmcgY2FsbCAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtMTAwIHB5LTVcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudENhbGxMaXN0Lmxlbmd0aCA9PT0gMSAmJiBjdXJyZW50Q2FsbExpc3RbMF0/LmlzSW5jb21pbmdDYWxsICYmICFjdXJyZW50Q2FsbExpc3RbMF0/LmlzQWNjZXB0Q2FsbCBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsVG9OdW1cIj5JbmNvbWluZyBjYWxsIG9uIDxiciAvPjxzcGFuPnt7Y3VycmVudENhbGxMaXN0WzBdPy50byB8fCAnVW5rbm93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXInfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvblwiIFtuZ0NsYXNzXT1cInsnY2FsbC1hbmltYXRpb24tcGxheSc6IHNob3dSaW5nQW5pbWF0aW9ufVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1nXCIgW3NyY109XCJjdXJyZW50Q2FsbExpc3RbMF0/LmltZ1wiIGFsdD1cIlwiIHdpZHRoPVwiMTIwXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDE+e3sgY3VycmVudENhbGxMaXN0WzBdPy5uYW1lID8gY3VycmVudENhbGxMaXN0WzBdPy5uYW1lIDogY3VycmVudENhbGxMaXN0WzBdPy5waG9uZSB8fCAnVW5rbm93biBOdW1iZXInIH19PC9oMT5cclxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIiEhY3VycmVudENhbGxMaXN0WzBdPy5uYW1lXCI+e3sgY3VycmVudENhbGxMaXN0WzBdPy5waG9uZSB9fTwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFjdGlvbi1idG5zIG10LWF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gcmVjZWl2ZS1idG5cIiAqbmdJZj1cIiFuZXdJbmNvbWluZ0NhbGxzTGlzdFswXT8uaXNDYWxsQ29ubmVjdGVkXCIgW2Rpc2FibGVkXT1cImlzSW5jb21pbmdDYWxsQnRuRGlzYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwiYWRkKGN1cnJlbnRDYWxsTGlzdFswXSlcIj4gY2FsbCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIHJlamVjdC1idG5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChjdXJyZW50Q2FsbExpc3RbMF0pXCI+IGNhbGxfZW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRm9yIHNpbmdsZSBhY3RpdmUgY2FsbCAtLT4gXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoIWlzQ29uZmVyZW5jZSB8fCBpc0NvbmZlcmVuY2VDYWxsSG9sZCkgJiYgKCEhY3VycmVudENhbGw/LmlkICYmICFjdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOiAnZmxleCcsICdmbGV4LWRpcmVjdGlvbic6ICdjb2x1bW4nLCAncG9zaXRpb24nOiAncmVsYXRpdmUnfVwiIGNsYXNzPVwiYWN0aXZlLWNhbGxcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hbmltYXRpb25cIiBbbmdDbGFzc109XCJ7J2NhbGwtYW5pbWF0aW9uLXBsYXknOiBzaG93UmluZ0FuaW1hdGlvbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiIFtzcmNdPVwiY3VycmVudENhbGw/LmltZ1wiIGFsdD1cIlwiIHdpZHRoPVwiMTIwXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDEgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzhweCd9XCI+e3tjdXJyZW50Q2FsbD8ubmFtZSB8fCAnVW5rbm93biBudW1iZXInfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPnt7Y3VycmVudENhbGw/LnBob25lIH19PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbi10b3A6IDRweFwiPnt7Y3VycmVudENhbGw/LnRpbWUgfHwgdGltZXJ9fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWFjdGlvbi1idG5zXCIgKm5nSWY9XCIhc2hvd0tleXBhZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzIwcHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYnRuLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBzdGFydC1zdG9wXCIgKm5nSWY9XCIhaXNSZWNvcmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydyZWNvcmRpbmcnOiBpc1JlY29yZGluZywgJ3N0b3BwZWQnOiAhaXNSZWNvcmRpbmd9XCIgKGNsaWNrKT1cInRvZ2dsZVJlY29yZGluZygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpc1JlY29yZGluZyA/ICdTdG9wIFJlY29yZGluZycgOiAnU3RhcnQgUmVjb3JkaW5nJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVjb3JkaW5nLWljb25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGF1c2UtcmVzdW1lLWJ0bnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNSZWNvcmRpbmcgJiYgIWlzUGF1c2VkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGF1c2VSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwYXVzZSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGxheV9hcnJvdyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzUmVjb3JkaW5nXCIgY2xhc3M9XCJ0aW1lci1kaXNwbGF5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZFRpbWUoKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0tleXBhZFwiIGNsYXNzPVwic2VuZERpZ2l0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNhbGwtaW5wdXRzXCIgaWQ9XCJjYWxsLWlucHV0XCIgWyhuZ01vZGVsKV09XCJjYWxsSW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwib25DYWxsSW5wdXRFbnRlcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGlucHV0LWNsZWFyLWJ0blwiICpuZ0lmPVwiY2FsbElucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFySW5wdXRzKClcIj5jbG9zZV9zbWFsbDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1jb250YWluZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwic2hvd0tleXBhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXktYnRuXCIgKm5nRm9yPVwibGV0IGtleSBvZiBrZXlwYWRWYWxcIiAoY2xpY2spPVwib25DYWxsSW5wdXRzKGtleS5udW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7a2V5Lm51bX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWFsYmhhYmV0c1wiPnt7a2V5LnRleHQgPyBrZXkudGV4dCA6ICcmbmJzcDsnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hY3Rpb24tYnRuc1wiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICc3MjN4J31cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwiIWluY29taW5nQ2FsbERpdiB8fCBpc0NvbmN1cnJlbnRJbmNvbWluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaGVsZC1idG4gbWVyZ2UtYnRuXCIgKGNsaWNrKT1cIm1lcmdlQ2FsbHMoKVwiIHRpdGxlPVwiTWVyZ2UgY2FsbHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTWVyZ2VDYWxsQWxsb3dlZCgpIHx8IGN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPCAyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5NZXJnZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1ldmVubHkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1zZWMtYnRuIG1yLTNcIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU11dGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJpc011dGVcIj4gbWljX29mZiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFpc011dGVcIj4gbWljIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1zZWMtYnRuIG1yLTNcIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIChjbGljayk9XCJ0b2dnbGVLZXlwYWQoKVwiPiB0cmFuc2l0aW9uX2Rpc3NvbHZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1zZWMtYnRuXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKGN1cnJlbnRDYWxsKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGdyb3Vwc18yIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biBlbmQtY2FsbC1idG5cIiBbZGlzYWJsZWRdPVwiIWN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVuZENhbGwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIGNvbmZlcmVuY2UgY2FsbCB2aWV3IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmVyZW5jZS1jYWxsLXZpZXdcIiAqbmdJZj1cImlzQ29uZmVyZW5jZSAmJiBjdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi1oZWFkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25mLWljb24gbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBncm91cHMgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29uZi10aXRsZVwiPkNvbmZlcmVuY2UgQ2FsbDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbC10ZXh0IGNvbmYtbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYWxsIG9mIGN1cnJlbnRDYWxsTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhbGw/LmlzQ29uZmVyZW5jZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaSAhPSAwXCI+Jjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbGw/Lm5hbWUgPyBjYWxsPy5uYW1lIDogY2FsbD8ucGhvbmUgfHwgJ1Vua25vd24gbnVtYmVyJ319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLXRpbWVyXCI+e3sgdGltZXIgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWFjdGlvbi1idG5zIG10LWF1dG9cIiAqbmdJZj1cIiFzaG93S2V5cGFkXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnMjBweCd9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1idG4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHN0YXJ0LXN0b3BcIiAqbmdJZj1cIiFpc1JlY29yZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3JlY29yZGluZyc6IGlzUmVjb3JkaW5nLCAnc3RvcHBlZCc6ICFpc1JlY29yZGluZ31cIiAoY2xpY2spPVwidG9nZ2xlUmVjb3JkaW5nKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImlzUmVjb3JkaW5nID8gJ1N0b3AgUmVjb3JkaW5nJyA6ICdTdGFydCBSZWNvcmRpbmcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlY29yZGluZy1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhdXNlLXJlc3VtZS1idG5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUmVjb3JkaW5nICYmICFpc1BhdXNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGF1c2UgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUGF1c2VkXCIgKGNsaWNrKT1cInJlc3VtZVJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBsYXlfYXJyb3cgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1JlY29yZGluZ1wiIGNsYXNzPVwidGltZXItZGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRGb3JtYXR0ZWRUaW1lKCkgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93S2V5cGFkXCIgY2xhc3M9XCJzZW5kRGlnaXQgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJjYWxsLWlucHV0c1wiIGlkPVwiY2FsbC1pbnB1dFwiIFsobmdNb2RlbCldPVwiY2FsbElucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cIm9uQ2FsbElucHV0RW50ZXIoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpbnB1dC1jbGVhci1idG5cIiAqbmdJZj1cImNhbGxJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhcklucHV0cygpXCI+Y2xvc2Vfc21hbGw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udGFpbmVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cInNob3dLZXlwYWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5LWJ0blwiICpuZ0Zvcj1cImxldCBrZXkgb2Yga2V5cGFkVmFsXCIgKGNsaWNrKT1cIm9uQ2FsbElucHV0cyhrZXkubnVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2tleS5udW19fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1hbGJoYWJldHNcIj57e2tleS50ZXh0ID8ga2V5LnRleHQgOiAnJm5ic3A7J319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmYtYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBpc011dGV9XCIgKGNsaWNrKT1cInRvZ2dsZU11dGUodHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHt7IGlzTXV0ZSA/ICdtaWNfb2ZmJyA6ICdtaWMnIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0blwiIChjbGljayk9XCJ0b2dnbGVLZXlwYWQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gdHJhbnNpdGlvbl9kaXNzb2x2ZSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjdXJyZW50Q2FsbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGdyb3Vwc18yIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuIGRhbmdlclwiIChjbGljayk9XCJlbmRDYWxsKHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2F2ZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3YXZlc1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDI0IDE1MCAyOFwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJub25lXCIgc2hhcGUtcmVuZGVyaW5nPVwiYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD1cImdlbnRsZS13YXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNLTE2MCA0NGMzMCAwIDU4LTE4IDg4LTE4cyA1OCAxOCA4OCAxOCA1OC0xOCA4OC0xOCA1OCAxOCA4OCAxOCB2NDRoLTM1MnpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8ZyBjbGFzcz1cInBhcmFsbGF4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCIwXCIgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC43KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCIzXCIgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC41KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCI3XCIgZmlsbD1cIiNmZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEluY29taW5nIGNhbGwgdXNlciBkZXRhaWxzIHNob3duIGluIG1vZGVsIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGwtY29udGFpbmVyLW1vZGVsIHAtMyB0ZXh0LXdoaXRlIG1vZGVsLWNvbnRlbnQgY2FsbC1jb250YWluZXJcIiAqbmdJZj1cImlzQ2xpY2tFeHBhbmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMiB1c2VyLWluZm8tc2VjdGlvblwiID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTNcIj5cclxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtd2hpdGVcIj5DMkMgLVBPSU5UIHt7c2VsZWN0ZWRVc2VySW5mbz8ucG9pbnROYW1lfX08L2gzPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cInRleHQtd2hpdGUgbWItMVwiPk5hbWU6PC9oNT5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cInRleHQtd2hpdGUgdXNlck5hbWVcIj57e3NlbGVjdGVkVXNlckluZm8/Lm5hbWV9fTwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZi0xM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5OdW1iZXI6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkVXNlckluZm8/Lm51bWJlcn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5FeHRlbnNpb246PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5leHRlbnNpb259fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+RW1haWw6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7c2VsZWN0ZWRVc2VySW5mbz8uZW1haWx9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+U3ViamVjdDo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTIgc3ViamVjdC10ZXh0XCIgdGl0bGU9XCJ7e3NlbGVjdGVkVXNlckluZm8/LnN1YmplY3R9fVwiPnt7c2VsZWN0ZWRVc2VySW5mbz8uc3ViamVjdH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTIgbWItMVwiPkltYWdlOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbGxpcHNpc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVXNlckluZm8/LmltYWdlICYmIHNlbGVjdGVkVXNlckluZm8/LmltYWdlICE9PSAnLSc7IGVsc2Ugbm9JbWFnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJ7e3NlbGVjdGVkVXNlckluZm8/LmltYWdlfX1cIiBhbHQ9XCJcIiB3aWR0aD1cIjE1MFwiICBjbGFzcz1cIm1sLTJcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ltYWdlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiPk5vIEltYWdlIEF2YWlsYWJsZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPk1lc3NhZ2U6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jb250YWluZXJcIiBbY2xhc3MuZXhwYW5kZWRdPVwiaXNFeHBhbmRlZFwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ubWVzc2FnZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0b2dnbGUtYnRuXCIgKm5nSWY9XCJzaG93QnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZVRleHQoKVwiPnt7IGlzRXhwYW5kZWQgPyAnU2VlIGxlc3MnIDogJ1NlZSBtb3JlJyB9fTwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5Qb2ludCBOYW1lOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5wb2ludE5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+U291cmNlIE5hbWU6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkVXNlckluZm8/LnNvdXJjZU5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBjb250YWN0IGxpc3QgcGFuZWwgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29udGFjdHMtcGFuZWxcIiAqbmdJZj1cInNob3dDb250YWN0c1BhbmVsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLWhlYWRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5QYXJ0aWNpcGVudDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICA8cD48L3A+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZGlhbC1jbG9zZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbCh7fSwgdHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNHB4XCIgZmlsbD1cIiMwMDAwMDBcIj48cGF0aCBkPVwibTI1Ni0yMDAtNTYtNTYgMjI0LTIyNC0yMjQtMjI0IDU2LTU2IDIyNCAyMjQgMjI0LTIyNCA1NiA1Ni0yMjQgMjI0IDIyNCAyMjQtNTYgNTYtMjI0LTIyNC0yMjQgMjI0WlwiLz48L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU0VBUkNIIElOUFVUICh2aXNpYmxlIHdoZW4gaXNTZWFyY2hWaXNpYmxlID0gdHJ1ZSkgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1iYXIgcC0zXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCIgKGlucHV0KT1cImFwcGx5RmlsdGVyKClcIiAvPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiICpuZ0lmPVwiaXNEaXJlY3RDYWxsT3B0aW9uU2hvdyAmJiBzZWFyY2hUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCJjPy5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIj57e2M/LmZpcnN0TmFtZX19IHt7Yz8ubWlkZGxlTmFtZX19IHt7Yz8ubGFzdE5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC10aXRsZVwiPnt7IChjPy5udW1iZXJzTGlzdCAmJiBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRhY3QtY2FsbC1idG4gY29udGFjdC1hZGQtYnRuIG1yLTJcIiAoY2xpY2spPVwiY2FsbENvbnRhY3QoYylcIiAqbmdJZj1cIiFjPy5Jc0Nvbm5lY3RlZFwiIHRpdGxlPVwiQWRkIHRvIGNvbmZlcmVuY2UgY2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0blwiIChjbGljayk9XCJDYWxsVG9VbnNhdmVkTnVtYmVyKGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIsIHRydWUpXCIgKm5nSWY9XCIhYz8uSXNDb25uZWN0ZWRcIiB0aXRsZT1cIk5ldyBDYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWx0ZXJlZExpc3QubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCJzZWFyY2hUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCInYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIj57eyBzZWFyY2hUZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRhY3QtY2FsbC1idG4gY29udGFjdC1hZGQtYnRuIG1yLTJcIiAoY2xpY2spPVwiY2FsbENvbnRhY3Qoc2VhcmNoVGV4dCwgdHJ1ZSlcIiB0aXRsZT1cIkFkZCB0byBjb25mZXJlbmNlIGNhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGFkZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRhY3QtY2FsbC1idG5cIiAoY2xpY2spPVwiQ2FsbFRvVW5zYXZlZE51bWJlcihzZWFyY2hUZXh0LCB0cnVlKVwiIHRpdGxlPVwiTmV3IENhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGwgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTAgdGl0bGVcIj5JbiBUaGlzIENhbGw8L2g1PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJtYi0yIG10LTFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZFBhcnRpY2lwZW50TGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjPy50byA9PSAnY2xpZW50JyBlbHNlIHBhcnRpY2lwZW50SW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiBbc3JjXT1cImM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCI+WW91XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgYz8uZnJvbSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pYy1idG4gbXItMlwiIFtkaXNhYmxlZF09XCJjPy5ob2xkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk11dGVVc2VyKGMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImM/LmlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiIWM/LmlzTXV0ZVwiPiBtaWMgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IG1yLTJcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogYz8uaG9sZCB9XCIgKGNsaWNrKT1cIm9uSG9sZENhbGwoYylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIFt0aXRsZV09XCIhYz8uaG9sZCA/ICdIb2xkJyA6ICdSZXN1bWUnXCI+IHBob25lX3BhdXNlZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChjLCBmYWxzZSwgdHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BhcnRpY2lwZW50SW5mbz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCJjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9JbWFnZSA6IGM/LmZyb21JbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9OYW1lIHx8ICdVbmtub3duJyA6IGM/LmZyb21OYW1lIHx8ICdVbmtub3duJ319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvIHx8ICdVbmtub3duJyA6IGM/LmZyb20gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5rbm93bid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pYy1idG4gbXItMlwiIFtkaXNhYmxlZF09XCJjPy5ob2xkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk11dGVVc2VyKGMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImM/LmlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiIWM/LmlzTXV0ZVwiPiBtaWMgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IG1yLTJcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogYz8uaG9sZCB9XCIgKGNsaWNrKT1cIm9uSG9sZENhbGwoYylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIFt0aXRsZV09XCIhYz8uaG9sZCA/ICdIb2xkJyA6ICdSZXN1bWUnXCI+IHBob25lX3BhdXNlZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChjLCBmYWxzZSwgdHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJtLTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zIHB4LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0wIHRpdGxlXCI+UGFydGljaXBlbnQgYWRkZWQgdG8gdGhlIGNhbGw8L2g1PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJtYi0yIG10LTFcIj4gIFxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZExpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCIhYz8uSXNDb25uZWN0ZWQgJiYgZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCIgW3NyY109XCJjPy5pbWcgPyBjPy5pbWcgOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tjPy5maXJzdE5hbWV9fSB7e2M/Lm1pZGRsZU5hbWV9fSB7e2M/Lmxhc3ROYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgKGM/Lm51bWJlcnNMaXN0ICYmIGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIpfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuXCIgKGNsaWNrKT1cImNhbGxDb250YWN0KGMpXCIgKm5nSWY9XCIhYz8uSXNDb25uZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5DYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbmZlcmVuY2UtaG9sZC1jb250YWN0IG1yLTJcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogYz8uaG9sZCB9XCIgKGNsaWNrKT1cIm9uSG9sZENhbGwoYylcIiAqbmdJZj1cImM/LklzQ29ubmVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkhvbGRcIj4gcGhvbmVfcGF1c2VkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwib25FbmRDYWxsKGMsIGZhbHNlLCB0cnVlKVwiICpuZ0lmPVwiYz8uSXNDb25uZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBsZWZ0UGFydGljaXBlbnRbY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiIFtzcmNdPVwiYy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIGM/LnRvSW1hZ2UgPyBjPy50b0ltYWdlIDogYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIj57e2MuZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvTmFtZSA6IGM/LmZyb21OYW1lIHx8ICdVbmtub3duIG51bWJlcid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIj57e2MuZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvIDogYz8uZnJvbX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGFjdC1jYWxsLWJ0biBjb250YWN0LWFkZC1idG4gXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoYy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG8gOiBjPy5mcm9tKVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBhZGQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPkFkZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtaW4tY2FsbC1jb250YWluZXJcIiAqbmdJZj1cImlzTWluaW1pc2VkXCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZnVsbHNjcmVlblwiIChjbGljayk9XCJtYXhpbWlzZURpYWxwYWQoKVwiPiBvcGVuX2luX2Z1bGwgPC9zcGFuPlxyXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IHdpZHRoOiAxMDAlXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi1jYWxsLWFuaW1hdGlvblwiIGlkPVwiY2FsbC1hdmF0YXJcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJtaW4tYXZhdGFyLWltZ1wiIFtzcmNdPVwiY2FsbERhdGEuaW1nXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi1jYWxsZXJEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7Y2FsbERhdGEubmFtZX19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOiAwXCI+e3tjYWxsRGF0YS5kaXNwbGF5TnVtID8gY2FsbERhdGEuZGlzcGxheU51bSA6IGNhbGxEYXRhLnBob25lIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1pbi1idG4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi10aW1lclwiPnt7dGltZXJ9fTwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJtaW4tY2FsbC1zZWMtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZU11dGUoKVwiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhaXNNdXRlXCI+IG1pYyA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pbi1jYWxsLWJ0biBlbmQtY2FsbC1idG5cIiBbZGlzYWJsZWRdPVwiZGlzYmFsZUVuZENhbGxCdG5cIiAoY2xpY2spPVwiZW5kQ2FsbCgpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
|
|
1632
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1wcm9ncmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvY29tcG9uZW50cy9jYWxsLXByb2dyZXNzL2NhbGwtcHJvZ3Jlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlhbGJveC9zcmMvbGliL2NvbXBvbmVudHMvY2FsbC1wcm9ncmVzcy9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDM0ksT0FBTyxFQUFRLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQXVCOUMsTUFBTSxPQUFPLHFCQUFxQjtJQXFGaEMsWUFBb0IsZ0JBQWtDLEVBQVUsR0FBc0IsRUFDNUUsYUFBNEIsRUFDNUIsU0FBMkIsRUFDM0IsMEJBQXNEO1FBSDVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUM1RSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQiwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBcEZ2RCx5QkFBb0IsR0FBUSxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFLdEIsaUJBQVksR0FBdUIsSUFBSSxZQUFZLEVB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TTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQW1CRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDYWxsLCBEZXZpY2UgfSBmcm9tICdAdHdpbGlvL3ZvaWNlLXNkayc7XHJcbmltcG9ydCB7IEV4dGVuc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2V4dGVuc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHdpbGlvU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvdHdpbGlvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudHMnO1xyXG5pbXBvcnQgc3dhbCBmcm9tICdzd2VldGFsZXJ0Mic7XHJcbmltcG9ydCB7IGtleXBhZCB9IGZyb20gJy4uLy4uLy4uL2tleXBhZCc7XHJcbmltcG9ydCB7IGludGVydmFsLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSU5DT01JTkdfQ0FMTF9BVURJT19CQVNFNjQgfSBmcm9tICcuL2F1ZGlvX2Jhc2U2NC5iYXNlNjQnO1xyXG5pbXBvcnQgeyBJbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvaW5jb21laW5nLWNhbGwtc29ja2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJcEFkZHJlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9pcC1hZGRyZXNzLnNlcnZpY2UnO1xyXG5cclxuXHJcbmludGVyZmFjZSBDYWxsRGV0YWlscyB7XHJcbiAgY2FsbFNpZDogc3RyaW5nO1xyXG4gIGNhbGxTdGF0dXM6IHN0cmluZztcclxufVxyXG5pbnRlcmZhY2UgQ2FsbFN0YXR1c1Jlc3BvbnNlIHtcclxuICBjYWxsRGV0YWlsczogQ2FsbERldGFpbHM7XHJcbiAgcmVzcG9uc2U6IHN0cmluZztcclxuICBlcnJvclR5cGU6IG51bWJlcjtcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgc3RhdHVzOiBudW1iZXI7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNhbGwtcHJvZ3Jlc3MnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYWxsLXByb2dyZXNzLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FsbFByb2dyZXNzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIGNhbGxEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRDYWxsZXJJZDogYW55O1xyXG4gIEBJbnB1dCgpIG5ld0luY29taW5nQ2FsbERhdGE/OiBDYWxsO1xyXG4gIEBJbnB1dCgpIG5ld0luY29taW5nQ2FsbHNMaXN0OiBhbnkgPSBbXTtcclxuICBASW5wdXQoKSBjYWxsZXJJZExpc3Q6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIGRldmljZUlkOiBhbnk7XHJcbiAgQElucHV0KCkgY2FsbEFjdGlvbjogYW55O1xyXG4gIEBJbnB1dCgpIGNvbmZlcmVuY2VDYWxsSW5mbzogYW55O1xyXG4gIHVzZXJJZDogYW55O1xyXG4gIEBPdXRwdXQoKSBlbmRDYWxsRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsc05ld0luZm86IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBtaW5pbWlzZUV2ZW50OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgZGV2aWNlPzogRGV2aWNlO1xyXG4gIGNhbGwhOiBDYWxsO1xyXG4gIHNob3dSaW5nQW5pbWF0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdGltZXI6IHN0cmluZyA9ICcwMDowMCc7XHJcbiAgaW50ZXJ2YWxJZDogYW55O1xyXG4gIHNob3dLZXlwYWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBrZXlwYWRWYWwgPSBrZXlwYWQ7XHJcbiAgY2FsbElucHV0OiBzdHJpbmcgPSAnJztcclxuICBpc011dGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaXNiYWxlRW5kQ2FsbEJ0bjogYm9vbGVhbiA9IHRydWU7XHJcbiAgc2hvd0NsZWFyQnRuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDb2xsb3BzID0gZmFsc2U7XHJcbiAgY3VycmVudENhbGw6IGFueTtcclxuICAvLyBDb25mZXJlbmNlIHN0YXRlIGZsYWdcclxuICBpc0NvbmZlcmVuY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc091dGdvaW5nQ2FsbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgLy8gSW5jb21pbmcgY2FsbCB2YXJpYWJsZXNcclxuICBpbmNvbWluZ0NhbGxEaXY6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsSW5pdGlhdGVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGlzTG9hZGVyc2hvdzogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIEBPdXRwdXQoKSBlbmRJbmNvbWluZ0NhbGxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvLyBSZWNvcmRpbmcgdmFyaWFibGVzXHJcbiAgY2FsbFNpZDogYW55O1xyXG4gIGlzUmVjb3JkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNQYXVzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0aW1lclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcclxuICB0aW1lRWxhcHNlZCA9IDA7IC8vIGluIHNlY29uZHNcclxuICByZWNvcmRDYWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaW5jb21pbmdDYWxsU2lkOiBhbnk7XHJcbiAgY2FsbFN0YXR1czogc3RyaW5nID0gJ3JpbmdpbmcnO1xyXG4gIGluY29taW5nUmVjb3JkQ2FsbD86IGFueTtcclxuICBzZWxlY3RlZEluY29taW5nQ2FsbDogYW55O1xyXG4gIHNob3dDb250YWN0c1BhbmVsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNBZGRSZW1vdmVQYXJ0aWNpcGFudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ29uY3VycmVudEluY29taW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaGVsZENhbGw/OiBDYWxsO1xyXG4gIGlzQ2FsbE9uSG9sZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNvbnRhY3RzOiBhbnlbXSA9IFtdO1xyXG4gIGN1cnJlbnRDYWxsTGlzdDogYW55W10gPSBbXTtcclxuICBjb25mZXJlbmNlSWQ6IGFueTtcclxuICBhbGxQYXJ0aWNpcGVudExpc3Q6IGFueTtcclxuICBpc0NsaWNrRXhwYW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDYWxsSW5Qcm9ncmVzcyE6IGJvb2xlYW47XHJcbiAgaXNDdXJyZW50SW5jb21pbmdDYWxsTGlzdDogYW55ID0gW107XHJcbiAgaXNDb25mZXJlbmNlQ2FsbEhvbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzZWxlY3RlZFVzZXJJbmZvOiBhbnk7XHJcbiAgaXNTZWFyY2hWaXNpYmxlID0gZmFsc2U7XHJcbiAgaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIHNlYXJjaFRleHQgPSAnJztcclxuICBmaWx0ZXJlZExpc3Q6IGFueSA9IFtdO1xyXG4gIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0OiBhbnk7XHJcbiAgc2hvd0J1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUmluZ2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzRGlyZWN0Q2FsbE9wdGlvblNob3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaWFsQWxlcnQgPSB7XHJcbiAgICBtc2c6ICcnLFxyXG4gICAgc2hvdzogZmFsc2VcclxuICB9XHJcbiAgbGVmdFBhcnRpY2lwZW50OiBhbnkgPSB7fTtcclxuICBjb25mZXJlbmNlQ2FsbExpc3Q6IGFueVtdID0gW107XHJcbiAgaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaG9zdG51bWJlcjogYW55O1xyXG4gIGlzTmV3QWRkZWRDYWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGV2aWNlTnVtYmVyTGlzdDogYW55ID0gW107XHJcbiAgb3VyTnVtYmVySW5mbzogYW55ID0ge307XHJcbiAgY3VycmVudENvbmZlcmVuY2VDYWxsOiBhbnkgPSB7fTtcclxuICBpc1JlYXNvbkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBsZWF2ZVJlYXNvbjogc3RyaW5nID0gJyc7XHJcbiAgc2VsZWN0ZWRDb25mOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXh0ZW5zaW9uU2VydmljZTogRXh0ZW5zaW9uU2VydmljZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSB0d2lsaW9TZXJ2aWNlOiBUd2lsaW9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBpcFNlcnZpY2U6IElwQWRkcmVzc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlOiBJbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZVxyXG4gICkge1xyXG4gICAgY29uc29sZS5sb2coJ0NhbGwgUHJvZ3Jlc3MgQ29tcG9uZW50Jyk7XHJcbiAgICB0aGlzLmNhbGwgPSB0aGlzLnR3aWxpb1NlcnZpY2UuY2FsbDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgY29uc29sZS5sb2coJ0NhbGwgUHJvZ3Jlc3MgQ29tcG9uZW50IG5nT25Jbml0Jyk7XHJcbiAgICAvLyBTdWJzY3JpYmUgdG8gaW5jb21pbmcgY2FsbHMgZnJvbSBUd2lsaW9TZXJ2aWNlXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZCkge1xyXG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLnVzZXJJZDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuY3VycmVudENhbGwuc3Vic2NyaWJlKChpbmNvbWluZzogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFpbmNvbWluZykgeyByZXR1cm47IH1cclxuICAgICAgICBjb25zb2xlLmxvZygnVHdpbGlvU2VydmljZS5jdXJyZW50Q2FsbCBlbWl0dGVkOicsIGluY29taW5nKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ29uY3VycmVudCBpbmNvbWluZyBkZXRlY3RlZCAtIHNob3dpbmcgYmFubmVyJyk7XHJcbiAgICAgICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN1YnNjcmliaW5nIHRvIGluY29taW5nIGNhbGxzOicsIGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kZXZpY2VOdW1iZXJMaXN0ID0gdGhpcy5jYWxsZXJJZExpc3QubWFwKChyZXM6IGFueSkgPT4gcmVzLm51bWJlcik7XHJcbiAgICB0aGlzLkdldENvbnRhY3RzTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKHRoaXMudXNlcklkKSB7XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS51c2VySWQgPSB0aGlzLnVzZXJJZDtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddKSB7XHJcbiAgICAgIGlmIChjaGFuZ2VzWydjYWxsRGF0YSddLmN1cnJlbnRWYWx1ZT8uaXNJbmNvbWluZ0NhbGwpIHtcclxuICAgICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5kaXNwbGF5TnVtIHx8IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5mcm9tKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3Rlc3Qtc3RhcnRDYWxsMTIzJywgY2hhbmdlc1snY2FsbERhdGEnXS5jdXJyZW50VmFsdWUpXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsbCA9IHtcclxuICAgICAgICAgIC4uLmNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlLFxyXG4gICAgICAgICAgaWQ6ICcxMjUnLFxyXG4gICAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgICBpc0hvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgaXNNdXRlOiBmYWxzZSxcclxuICAgICAgICAgIGlzQ29uZmVyZW5jZTogZmFsc2UsXHJcbiAgICAgICAgICBpc0FjY2VwdENhbGw6IHRydWUsXHJcbiAgICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgICAgcGhvbmU6IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy5waG9uZSxcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6ICcxMjEnLFxyXG4gICAgICAgICAgbmFtZTogY2hhbmdlc1snY2FsbERhdGEnXS5jdXJyZW50VmFsdWU/Lm5hbWUgfHwgY2hhbmdlc1snY2FsbERhdGEnXS5jdXJyZW50VmFsdWU/LmZyb21OYW1lIHx8IGNoYW5nZXNbJ2NhbGxEYXRhJ10uY3VycmVudFZhbHVlPy50b05hbWUgfHwgJycsXHJcbiAgICAgICAgICB0aW1lOiB0aGlzLnRpbWVyLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zdGFydENhbGwoY2hhbmdlc1snY2FsbERhdGEnXS5jdXJyZW50VmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snbmV3SW5jb21pbmdDYWxsc0xpc3QnXT8uY3VycmVudFZhbHVlPy5sZW5ndGggfHwgY2hhbmdlc1snbmV3SW5jb21pbmdDYWxsc0xpc3QnXT8ucHJldmlvdXNWYWx1ZT8ubGVuZ3RoKSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGV2aWNlTnVtYmVyTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmRldmljZU51bWJlckxpc3QgPSB0aGlzLmNhbGxlcklkTGlzdC5tYXAoKHJlczogYW55KSA9PiByZXMubnVtYmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5mb3JFYWNoKChjYWxsSW5mbzogYW55LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29uZmVyZW5jZUlkID0gaSA9PSAwID8gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFtpXS5jb25mZXJlbmNlSWQgOiB0aGlzLmNvbmZlcmVuY2VJZDtcclxuICAgICAgICAgIGxldCBvdXJOdW1iZXJJbmZvID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFtpXS5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy50byA9PSAnYzJjX3NvZnRwaG9uZV9jbGllbnQnKSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LnRvKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKSkgJiYgIXJlc0RhdGE/LmlzTGVmdFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgdGhpcy5pc011dGUgPSAhb3VyTnVtYmVySW5mbz8uaXNIb2xkID8gb3VyTnVtYmVySW5mbz8uaXNNdXRlIDogdGhpcy5pc011dGU7XHJcbiAgICAgICAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFtpXS5wYXJ0aWNpcGFudHMuZm9yRWFjaChhc3luYyAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocmVzPy50byA9PSAnYzJjX3NvZnRwaG9uZV9jbGllbnQnICYmICFyZXM/LmlzTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0bnVtYmVyID0gcmVzO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29udGFjdDogYW55ID0ge31cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhY3RzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgY29udGFjdCA9IHRoaXMuY29udGFjdHMuZmluZCgocmVzRGF0YSkgPT5cclxuICAgICAgICAgICAgICAgICAgICByZXNEYXRhPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyID09IChyZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8uZnJvbSA6IHJlcz8udG8pXHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbT8uaWQgPT0gcmVzPy5pZCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSAmJiAhcmVzLmlzTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1nOiByZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHJlcz8udG9JbWFnZSA6IHJlcz8uZnJvbUltYWdlIHx8IGNvbnRhY3Q/LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiByZXM/LmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIixcclxuICAgICAgICAgICAgICAgICAgICAgIGlzSG9sZDogcmVzPy5pc0hvbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2VIb2xkOiBvdXJOdW1iZXJJbmZvPy5pc0hvbGQgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc011dGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlOiByZXM/LmlzQ29uZmVyZW5jZSB8fCB0aGlzLmlzQ29uZmVyZW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyB0aGlzLmdldFN0YXR1cyhyZXMpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwaG9uZTogcmVzPy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnRJZDogcmVzPy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VTaWQ6IGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVzPy5uYW1lIHx8IHJlcz8uZnJvbU5hbWUgfHwgcmVzPy50b05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93Q29udGFjdHNQYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZVNpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IC0xICYmIHJlcz8uaXNMZWZ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XT8uaWQgPT0gdGhpcy5jdXJyZW50Q2FsbD8uaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGxMaXN0LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3Q/Lmxlbmd0aCA+IDAgPyB0aGlzLmN1cnJlbnRDYWxsTGlzdFswXSA6IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93Q29udGFjdHNQYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHModGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZVNpZClcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAuLi5yZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpbWc6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy50b0ltYWdlIDogcmVzPy5mcm9tSW1hZ2UgfHwgY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNIb2xkOiByZXM/LmlzSG9sZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmVyZW5jZUhvbGQ6IG91ck51bWJlckluZm8/LmlzSG9sZCB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGlzTXV0ZTogcmVzPy5pc011dGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0NvbmZlcmVuY2U6IHJlcz8uaXNDb25mZXJlbmNlIHx8IHRoaXMuaXNDb25mZXJlbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNBY2NlcHRDYWxsOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gdGhpcy5nZXRTdGF0dXMocmVzKSA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGhvbmU6IHJlcz8uZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy5mcm9tIDogcmVzPy50byxcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHJlcz8uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlU2lkOiBjYWxsSW5mbz8uY29uZmVyZW5jZVNpZCxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlcz8ubmFtZSB8fCByZXM/LmZyb21OYW1lIHx8IHJlcz8udG9OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdGltZTogdGhpcy5nZXRUaW1lRGlmZmVyZW5jZShyZXM/LmpvaW5lZEF0IHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSksXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzLmlzTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAuLi5yZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1nOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiID8gcmVzPy50b0ltYWdlIDogcmVzPy5mcm9tSW1hZ2UgfHwgY29udGFjdD8uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiByZXMuZGlyZWN0aW9uID09IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzSG9sZDogcmVzPy5pc0hvbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlSG9sZDogb3VyTnVtYmVySW5mbz8uaXNIb2xkIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzTXV0ZTogcmVzPy5pc011dGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNDb25mZXJlbmNlOiByZXMuaXNDb25mZXJlbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQWNjZXB0Q2FsbDogcmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIiA/IHRoaXMuZ2V0U3RhdHVzKHJlcykgOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcGhvbmU6IHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIgPyByZXM/LmZyb20gOiByZXM/LnRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHJlcy5pZCxcclxuICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlU2lkOiBjYWxsSW5mbz8uY29uZmVyZW5jZVNpZCxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXM/Lm5hbWUgfHwgcmVzPy5mcm9tTmFtZSB8fCByZXM/LnRvTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmdldFRpbWVEaWZmZXJlbmNlKHJlcz8uam9pbmVkQXQgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKSxcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbMF1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyID0gJzAwOjAwJztcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmxlZnRQYXJ0aWNpcGVudFtjYWxsSW5mbz8uY29uZmVyZW5jZUlkXSA9IFsuLi5uZXcgTWFwKGNhbGxJbmZvPy5wYXJ0aWNpcGFudHMuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LmlzTGVmdCA9PT0gdHJ1ZSkubWFwKChpdGVtOiBhbnkpID0+IFtpdGVtPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gaXRlbT8udG8gfHwgJ1Vua25vd24nIDogaXRlbT8uZnJvbSwgaXRlbV0pKS52YWx1ZXMoKVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0NvbmN1cnJlbnRJbmNvbWluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbERpdiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0ge31cclxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1JpbmdpbmcpIHtcclxuICAgICAgICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgbGV0IHZhbGlkVmFsdWVzID0gbmV3IFNldCh0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZsYXRNYXAoKGl0ZW06IGFueSkgPT4gaXRlbT8ucGFydGljaXBhbnRzLm1hcCgodmFsOiBhbnkpID0+IHZhbD8uaWQpKSk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gdmFsaWRWYWx1ZXMuaGFzKGl0ZW0/LnBhcnRpY2lwYW50SWQpKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHRoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWQgPT0gcmVzPy5wYXJ0aWNpcGFudElkICYmICFyZXM/LmlzQ29uZmVyZW5jZUhvbGQpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Q2FsbCA9IHRoaXMuY3VycmVudENhbGxMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtPy5pc0FjY2VwdENhbGwgJiYgIWl0ZW0/LmlzQ29uZmVyZW5jZUhvbGQpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiBpdGVtPy5wYXJ0aWNpcGFudHM/LmZpbmQoKHBhcnRpY2lwYW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py5mcm9tKSAmJiBwYXJ0aWNpcGFudD8udG8gPT09ICdjMmNfc29mdHBob25lX2NsaWVudCcpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0ICYmICFwYXJ0aWNpcGFudD8uaXNIb2xkXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChjdXJyZW50Q2FsbD8ubGVuZ3RoID09IDEgJiYgY3VycmVudENhbGxbMF0/LmlkKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gY3VycmVudENhbGxbMF0gfHwgdGhpcy5jdXJyZW50Q2FsbExpc3RbMF07XHJcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Q2FsbD8ubGVuZ3RoID4gMSAmJiBjdXJyZW50Q2FsbFsxXT8uaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsID0gY3VycmVudENhbGxbMV0gfHwgdGhpcy5jdXJyZW50Q2FsbExpc3RbMV1cclxuICAgICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCAmJiAhdGhpcy5pc05ld0FkZGVkQ2FsbCkge1xyXG4gICAgICAgICAgLy8gdGhpcy5jdXJyZW50Q29uZmVyZW5jZUNhbGwgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbmQoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgLy8gICByZXR1cm4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoaXRlbT8uZnJvbSkgJiYgaXRlbT8udG8gPT09ICdjMmNfc29mdHBob25lX2NsaWVudCcpIHx8IHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhpdGVtPy50bykpICYmICFpdGVtPy5pc0xlZnQgJiYgIWl0ZW0/LmlzSG9sZFxyXG4gICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHJlcz8ucGFydGljaXBhbnRJZCA9PSB0aGlzLmN1cnJlbnRDYWxsPy5wYXJ0aWNpcGFudElkICYmIHJlcz8uaXNBY2NlcHRDYWxsICYmICFyZXM/LmlzQ29uZmVyZW5jZUhvbGQpXHJcbiAgICAgICAgICAvLyBpZiAoIXRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsPy5pZCAmJiB0aGlzLmN1cnJlbnRDYWxsTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAvLyB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbCA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3QuZmluZCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAvLyAgIHJldHVybiAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhpdGVtPy5mcm9tKSAmJiBpdGVtPy50byA9PT0gJ2MyY19zb2Z0cGhvbmVfY2xpZW50JykgfHwgdGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGl0ZW0/LnRvKSkgJiYgIWl0ZW0/LmlzTGVmdCAmJiBpdGVtPy5pc0hvbGRcclxuICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgLy8gbGV0IGNhbGxkZXRhaWwgPSB0aGlzLmN1cnJlbnRDb25mZXJlbmNlQ2FsbC5maW5kKChyZXNJbmZvOiBhbnkpID0+ICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0luZm8/LmZyb20pICYmIHJlc0luZm8/LnRvID09PSAnYzJjX3NvZnRwaG9uZV9jbGllbnQnKSB8fCB0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzSW5mbz8udG8pKSAmJiAhcmVzSW5mbz8uaXNMZWZ0ICYmIHJlc0luZm8/LmlzSG9sZClcclxuICAgICAgICAgIC8vIGlmIChjYWxsZGV0YWlsPy5pc0hvbGQpIHtcclxuICAgICAgICAgIC8vICAgdGhpcy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gICB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgLy8gICAgIHBhcnRpY2lwYW50SWQ6IFtjYWxsZGV0YWlsPy5pZCB8fCBjYWxsZGV0YWlsPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgIC8vICAgICBjb25mZXJlbmNlSWQ6IGNhbGxkZXRhaWw/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIC8vICAgICBob2xkOiBmYWxzZSxcclxuICAgICAgICAgIC8vICAgICBtdXRlOiBjYWxsZGV0YWlsPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgLy8gICAgIGNvbmZlcmVuY2U6IGNhbGxkZXRhaWw/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgICAgLy8gICB9KTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIC8vIGlmICghdGhpcy5jdXJyZW50Q2FsbD8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICAgICAgLy8gICB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbMF07XHJcbiAgICAgICAgICAvLyAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdFswXT8uaXNDb25mZXJlbmNlSG9sZCAmJiB0aGlzLmN1cnJlbnRDYWxsTGlzdFswXT8uaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgICAvLyAgICAgdGhpcy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAvLyAgICAgICBwYXJ0aWNpcGFudElkOiBbdGhpcy5jdXJyZW50Q2FsbD8ucGFydGljaXBhbnRJZF0sXHJcbiAgICAgICAgICAvLyAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIC8vICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgLy8gICAgICAgbXV0ZTogdGhpcy5jdXJyZW50Q2FsbD8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIC8vICAgICAgIGNvbmZlcmVuY2U6IHRoaXMuY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAgICAgLy8gICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudENhbGw/LmlzQ29uZmVyZW5jZUhvbGQpIHtcclxuICAgICAgICAgIC8vICAgICB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgLy8gICAgICAgcGFydGljaXBhbnRJZDogW3RoaXMuY3VycmVudENhbGw/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgLy8gICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAvLyAgICAgICBob2xkOiBmYWxzZSxcclxuICAgICAgICAgIC8vICAgICAgIG11dGU6IHRoaXMuY3VycmVudENhbGw/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAvLyAgICAgICBjb25mZXJlbmNlOiB0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAgIC8vICAgfVxyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgbGV0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgICAgICAgaWYgKCFjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvPy5pZCkge1xyXG4gICAgICAgICAgICBsZXQgaG9sZENhbGxJbmZvID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFswXS5wYXJ0aWNpcGFudHMuZmluZCgoY2FsbEluZm86IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoY2FsbEluZm8/LmZyb20pICYmIGNhbGxJbmZvPy50byA9PT0gJ2MyY19zb2Z0cGhvbmVfY2xpZW50JylcclxuICAgICAgICAgICAgICB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKGNhbGxJbmZvPy50bykgJiYgY2FsbEluZm8/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhY2FsbEluZm8/LmlzTGVmdCAmJiBjYWxsSW5mbz8uaXNIb2xkKVxyXG4gICAgICAgICAgICBpZiAoaG9sZENhbGxJbmZvPy5pZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbaG9sZENhbGxJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IGhvbGRDYWxsSW5mbz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICAgICAgaG9sZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBtdXRlOiBob2xkQ2FsbEluZm8/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjb25mZXJlbmNlOiBob2xkQ2FsbEluZm8/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY3VycmVudENvbmZlcmVuY2VDYWxsLCAnY3VycmVudENvbmZlcmVuY2VDYWxsJylcclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmxlZnRQYXJ0aWNpcGVudCwgJ2xlZnRQYXJ0aWNpcGVudCcpO1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVXNlckluZm8/LnBhcnRpY2lwYW50SWQpIHtcclxuICAgICAgICAgIGxldCBzZWxlY3RlZFVzZXIgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0/LmlkID09IHRoaXMuc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRVc2VyKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVXNlci5Jc1VzZXJJbmZvU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IHNlbGVjdGVkVXNlcjtcclxuICAgICAgICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBpbmNvbWluZ0NhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0/LmJ1c2luZXNzTnVtYmVyKTtcclxuICAgICAgICAgICAgaWYgKGluY29taW5nQ2FsbD8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGluY29taW5nQ2FsbDtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0NsaWNrRXhwYW5kKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB7fTtcclxuICAgICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgcmVzSW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gISFpdGVtPy5idXNpbmVzc051bWJlcik7XHJcbiAgICAgICAgICBpZiAocmVzSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdFtyZXNJbmRleF0uSXNVc2VySW5mb1Nob3cgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSB0aGlzLmN1cnJlbnRDYWxsTGlzdFtyZXNJbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0SGVpZ2h0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBsZXQgaW5jb21pbmdEYXRhOiBhbnkgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXMpID0+IHJlcz8uaXNJbmNvbWluZ0NhbGwgJiYgIXJlcz8uaXNBY2NlcHRDYWxsICYmICFyZXM/LmlzTGVmdCk7XHJcbiAgICAgICAgaWYgKGluY29taW5nRGF0YT8uaWQgJiYgIXRoaXMuaXNSaW5naW5nKSB7XHJcbiAgICAgICAgICB0aGlzLmlzUmluZ2luZyA9IHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghaW5jb21pbmdEYXRhPy5pZCAmJiB0aGlzLmlzUmluZ2luZykge1xyXG4gICAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdjdXJyZW50Q2FsbExpc3QnLCB0aGlzLmN1cnJlbnRDYWxsTGlzdCk7XHJcbiAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsTGlzdCA9IFtcclxuICAgICAgICAgIC4uLm5ldyBNYXAodGhpcy5jdXJyZW50Q2FsbExpc3QubWFwKGl0ZW0gPT4gW2l0ZW0uY29uZmVyZW5jZUlkLCBpdGVtXSkpLnZhbHVlcygpXHJcbiAgICAgICAgXTtcclxuICAgICAgfSBlbHNlIGlmICghdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEaXYgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGwgPSB7fVxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBpZiAodGhpcy5pc1JpbmdpbmcpIHtcclxuICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc1JpbmdpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYWxsLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snY2FsbEFjdGlvbiddPy5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5kZXZpY2VOdW1iZXJMaXN0ID0gdGhpcy5jYWxsZXJJZExpc3QubWFwKChyZXM6IGFueSkgPT4gcmVzLm51bWJlcik7XHJcbiAgICAgIHRoaXMucmVqb2luSG9zdCh0aGlzLmNhbGxBY3Rpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVqb2luSG9zdChjYWxsSW5mbzogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZWpvaW5QYXJ0aWNpcGVudEluZm8gPSBjYWxsSW5mbz8ucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LmZyb20pICYmIHJlc0RhdGE/LnRvID09ICdjMmNfc29mdHBob25lX2NsaWVudCcpXHJcbiAgICAgIClcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IHRydWU7XHJcblxyXG4gICAgICAvLyAx77iP4oOjIEdldCBuZXcgdG9rZW4gZm9yIHNhbWUgY29uZmVyZW5jZVxyXG4gICAgICBjb25zdCB0b2tlbkRhdGE6IGFueSA9IGF3YWl0IHRoaXMuZ2V0T3V0Z29pbmdDYWxsVG9rZW4oY2FsbEluZm8/LmNvbmZlcmVuY2VJZCk7XHJcblxyXG4gICAgICAvLyAy77iP4oOjIFJlY29ubmVjdCBkZXZpY2VcclxuICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge1xyXG4gICAgICAgIGNvZGVjUHJlZmVyZW5jZXM6IFsnb3B1cycsICdwY211J10sXHJcbiAgICAgICAgY2xvc2VQcm90ZWN0aW9uOiB0cnVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5kZXZpY2UgPSBuZXcgRGV2aWNlKHRva2VuRGF0YS50b2tlbi52YWx1ZSwgb3B0aW9ucyk7XHJcblxyXG4gICAgICB0aGlzLmNhbGwgPSBhd2FpdCB0aGlzLmRldmljZS5jb25uZWN0KHtcclxuICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgIEZyb206IHJlam9pblBhcnRpY2lwZW50SW5mby5mcm9tLFxyXG4gICAgICAgICAgVG86IHJlam9pblBhcnRpY2lwZW50SW5mby5mcm9tLFxyXG4gICAgICAgICAgRW52OiBlbnZpcm9ubWVudC5hYmIsXHJcbiAgICAgICAgICBUb2tlbjogdG9rZW5EYXRhLnRva2VuLmlkLFxyXG4gICAgICAgICAgRXh0OiByZWpvaW5QYXJ0aWNpcGVudEluZm8uZXh0TnVtLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiByZWpvaW5QYXJ0aWNpcGVudEluZm8/LmNvbmZlcmVuY2VJZFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcnRjQ29uc3RyYWludHM6IHsgYXVkaW86IHsgZGV2aWNlSWQ6ICdkZWZhdWx0JyB9IH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmNhbGwgPSB0aGlzLmNhbGw7XHJcblxyXG4gICAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKCdSZWpvaW5lZCBzdWNjZXNzZnVsbHknKTtcclxuXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdSZWpvaW4gZmFpbGVkJywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzKHJlczogYW55KSB7XHJcbiAgICBpZiAocmVzLmRpcmVjdGlvbiA9PSBcImluY29taW5nLWNhbGxcIikge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5pc0N1cnJlbnRJbmNvbWluZ0NhbGxMaXN0LmluY2x1ZGVzKHJlcy5pZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAnYW5zd2VyZWQnICYmIHJlcy5kaXJlY3Rpb24gPT0gXCJpbmNvbWluZy1jYWxsXCIpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEdldENvbnRhY3RzTGlzdCgpIHtcclxuICAgIGNvbnN0IHRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIHx8ICcnO1xyXG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLnJlYWRDb250YWN0cyh0b2tlbikuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnQVBJIFJlc3BvbnNlOicsIHJlcyk7XHJcblxyXG4gICAgICAgIC8vIE5vdGU6IENhcGl0YWwgQiBpbiBwaG9uZUJvb2tcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5waG9uZUJvb2spIHtcclxuICAgICAgICAgIHRoaXMuY29udGFjdHMgPSByZXMucGhvbmVCb29rO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSByZXMucGhvbmVCb29rO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0NvbnRhY3RzIGFycmF5OicsIHRoaXMuY29udGFjdHMpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gcmVzO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSByZXM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY29udGFjdHMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ29udGFjdHMgYXJyYXk6JywgdGhpcy5jb250YWN0cyk7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjb250YWN0czonLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5jb250YWN0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGFkZFJlczogYW55O1xyXG4gIGFzeW5jIHN0YXJ0Q2FsbChjYWxsRGF0YTogYW55LCBpc05ld0NvbmZlcmVuY2U/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnNvbGUubG9nKGNhbGxEYXRhLCAnY2FsbERhdGEnKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xyXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgIGNoYW5uZWxJZDogZW52aXJvbm1lbnQuY2hhbm5lbElkLFxyXG4gICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpLFxyXG4gICAgICAgIHRvOiBjYWxsRGF0YS5waG9uZSxcclxuICAgICAgICBmcm9tTnVtYmVyOiBjYWxsRGF0YS5mcm9tLFxyXG4gICAgICAgIHNjb3BlOiAnbG9jYWwnLFxyXG4gICAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmN1cnJlbnRDYWxsID0ge1xyXG4gICAgICAgIGJ1c2luZXNzTnVtYmVyOiBmYWxzZSxcclxuICAgICAgICBjYWxsU2lkOiAnJyxcclxuICAgICAgICBjYWxsU3RhdHVzOiAnJyxcclxuICAgICAgICBjb25mZXJlbmNlSWQ6ICcnLFxyXG4gICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgZGlyZWN0aW9uOiAnb3V0Z29pbmctY2FsbCcsXHJcbiAgICAgICAgZm9yd2FyZGVkVG86ICcnLFxyXG4gICAgICAgIGZyb206IGNhbGxEYXRhLmZyb20sXHJcbiAgICAgICAgaWQ6ICd5eXVnZ2hqYicsXHJcbiAgICAgICAgaW1nOiBjYWxsRGF0YS5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgIGlzQWNjZXB0Q2FsbDogdHJ1ZSxcclxuICAgICAgICBpc0NvbmZlcmVuY2U6IGZhbHNlLFxyXG4gICAgICAgIGlzSG9sZDogZmFsc2UsXHJcbiAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgIGlzTGVmdDogZmFsc2UsXHJcbiAgICAgICAgaXNNdXRlOiBmYWxzZSxcclxuICAgICAgICBqb2luZWRBdDogJycsXHJcbiAgICAgICAgbmFtZTogY2FsbERhdGE/Lm5hbWUgfHwgJycsXHJcbiAgICAgICAgcGFydGljaXBhbnRJZDogJycsXHJcbiAgICAgICAgcGhvbmU6IGNhbGxEYXRhPy5waG9uZSB8fCAnJyxcclxuICAgICAgICByb2xlOiAnY2FsbGVlJyxcclxuICAgICAgICBzdGF0dXM6ICcnLFxyXG4gICAgICAgIHRpbWU6ICcnLFxyXG4gICAgICAgIHRvOiBjYWxsRGF0YT8ucGhvbmUgfHwgJycsXHJcbiAgICAgICAgdG9OYW1lOiBjYWxsRGF0YT8ubmFtZSB8fCAnJyxcclxuICAgICAgICB1c2VySWQ6IHRoaXMudXNlcklkIHx8IGNhbGxEYXRhPy51c2VySWRcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5pbml0aWF0ZUNhbGwocGF5bG9hZCk7XHJcbiAgICAgIHRoaXMuY29uZmVyZW5jZUlkID0gcmVzcG9uc2U/LmNhbGxhdXRoPy5pZDtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICBjb25zdCB7IGlkOiBjYWxsQXV0aElkLCByZWNvcmRDYWxsIH0gPSBhd2FpdCB0aGlzLmdldENhbGxBdXRoSWQocmVzcG9uc2UpO1xyXG4gICAgICAgIC8vIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGNhbGxBdXRoSWQpXHJcbiAgICAgICAgdGhpcy5yZWNvcmRDYWxsID0gcmVjb3JkQ2FsbDsgLy8gU3RvcmUgdGhlIHJlY29yZENhbGwgdmFsdWVcclxuICAgICAgICBjb25zdCB0b2tlbkRhdGE6IGFueSA9IGF3YWl0IHRoaXMuZ2V0T3V0Z29pbmdDYWxsVG9rZW4oY2FsbEF1dGhJZCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0VG9EZXZpY2UodG9rZW5EYXRhLnRva2VuLCBjYWxsRGF0YSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2FsbFN0YXR1cyhjYWxsQXV0aElkKTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFJlcyA9IGF3YWl0IHRoaXMuYWRkUGFydGljaXBhbnRUb0NhbGwoe1xyXG4gICAgICAgICAgICAgIGZyb206IGNhbGxEYXRhPy5mcm9tLFxyXG4gICAgICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICAgICAgcGFydGljaXBhbnROdW1iZXI6IGNhbGxEYXRhPy5waG9uZSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IHJlc3BvbnNlPy5jYWxsYXV0aD8uaWQsXHJcbiAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcklkJyksXHJcbiAgICAgICAgICAgICAgcHJveHk6ICcnLFxyXG4gICAgICAgICAgICAgIGNvdW50cnljb2RlOiAnJyxcclxuICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkZXJzaG93LmVtaXQoZmFsc2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnSW5pdGlhbCBwYXJ0aWNpcGFudElkOicsIHRoaXMuYWRkUmVzPy5wYXJ0aWNpcGFudElkKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWRkaW5nIGluaXRpYWwgcGFydGljaXBhbnQ6JywgZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTAwMClcclxuICAgICAgICAvLyBQb2xsIHRoZSBzdGF0dXMgZm9yIDMwLTQ1IHNlY29uZHNcclxuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMjAxKSB7XHJcbiAgICAgICAgdGhpcy5pc05ld0FkZGVkQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkZXJzaG93LmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIHN3YWwoXCJFcnJvclwiLCByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnIvPlwiKSwgXCJlcnJvclwiKTtcclxuICAgICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvcik7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd0ZXN0MycpXHJcbiAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbk11dGVVc2VyKGM6IGFueSkge1xyXG4gICAgdGhpcy5vbk11dGVQYXJ0aWNpcGFudCh7XHJcbiAgICAgIHBhcnRpY2lwYW50SWQ6IFtjLnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IGM/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgaG9sZDogYy5ob2xkLFxyXG4gICAgICBtdXRlOiAhYz8uaXNNdXRlLFxyXG4gICAgICBjb25mZXJlbmNlOiBjLmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgfSlcclxuICAgIGMuaXNNdXRlID0gIWMuaXNNdXRlO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRBbGxQYXJ0aWNpcGFudHMoYz8uY29uZmVyZW5jZUlkKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG9uSG9sZENhbGwoYzogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZyhjLCAnZHNkc2RzZHNkc2RzYWRzYScpO1xyXG4gICAgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgcGFydGljaXBhbnRJZDogW2MucGFydGljaXBhbnRJZF0sXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogYz8uY29uZmVyZW5jZUlkLFxyXG4gICAgICBob2xkOiAhYy5ob2xkLFxyXG4gICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgICBjb25mZXJlbmNlOiBjLmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgfSlcclxuICAgIGMuaG9sZCA9ICFjLmhvbGQ7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIGFzeW5jIG9uRW5kSW5jb21pbmdDYWxsKCkge1xyXG4gICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChyZXMpID0+IHJlcy5wYXJ0aWNpcGFudElkID09IHRoaXMuY3VycmVudENhbGwucGFydGljaXBhbnRJZCk7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XT8ucGFydGljaXBhbnRJZCwgdGhpcy5jdXJyZW50Q2FsbExpc3RbaW5kZXhdPy5jb25mZXJlbmNlSWQgfHwgJ25vJykuc3Vic2NyaWJlKChyZXMpID0+IHtcclxuICAgICAgY29uc29sZS5sb2cocmVzKVxyXG4gICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgdGhpcy5lbmRJbmNvbWluZ0NhbGxFdmVudC5lbWl0KCk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBhc3luYyBvbkVuZENhbGwoYzogYW55LCBpc0FsbENhbGxFbmQ/OiBib29sZWFuLCBpc0NvbnRlY3Q/OiBib29sZWFuKSB7XHJcbiAgICAvLyBpZiAoIWM/LmlzQWNjZXB0Q2FsbCAmJiAhaXNDb250ZWN0ICYmICFpc0FsbENhbGxFbmQpIHtcclxuICAgIC8vICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChyZXMpID0+IHJlcy5wYXJ0aWNpcGFudElkID09IGMucGFydGljaXBhbnRJZClcclxuICAgIC8vICAgYXdhaXQgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFJlbW92ZVBhcnRpY2lwYW50cyh0aGlzLmN1cnJlbnRDYWxsTGlzdFtpbmRleF0/LnBhcnRpY2lwYW50SWQsIHRoaXMuY3VycmVudENhbGxMaXN0W2luZGV4XT8uY29uZmVyZW5jZUlkIHx8ICdubycpLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAvLyAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3Quc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgLy8gICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgIC8vICAgICB0aGlzLmNhbGw/LmRpc2Nvbm5lY3QoKTtcclxuICAgIC8vICAgICB0aGlzLmVuZEluY29taW5nQ2FsbEV2ZW50LmVtaXQoYyk7XHJcbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICB9KVxyXG4gICAgLy8gICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyB9XHJcbiAgICBsZXQgcGFydGljaXBhbnRJZCA9IGlzQWxsQ2FsbEVuZCA/ICdhbGwnIDogYy5wYXJ0aWNpcGFudElkIHx8IGM/LmlkO1xyXG4gICAgY29uc3QgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbyA9IHRoaXMuZ2V0Q3VycmVudENhbGxJbmZvKCk7XHJcbiAgICBsZXQgY29uZmVyZW5jZUlkID0gYy5jb25mZXJlbmNlSWQgfHwgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uY29uZmVyZW5jZUlkO1xyXG4gICAgbGV0IHJlczogYW55ID0gYXdhaXQgdGhpcy5nZXRSZW1vdmVQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZCwgY29uZmVyZW5jZUlkKTtcclxuICAgIGlmIChyZXM/LnN0YXR1cyA9PSAyMDEgJiYgcmVzPy5tZXNzYWdlID09ICdwYXJ0aWNpcGFudCBhbHJlYWR5IGxlZnQnKSB7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKGNvbmZlcmVuY2VJZCk7XHJcbiAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICB0aGlzLmVuZEluY29taW5nQ2FsbEV2ZW50LmVtaXQoYyk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhdGVDYWxsKHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5pbml0aWF0ZUNhbGwocGF5bG9hZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5ob2xkUGFydGljaXBhbnQocGF5bG9hZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGFkZFBhcnRpY2lwYW50VG9DYWxsKHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5hZGRQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2FsbFN0YXR1c09mUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU3RhdHVzT2ZQYXJ0aWNpcGFudHMocGFydGljaXBhbnRJZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTXV0ZVBhcnRpY2lwYW50KHBheWxvYWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5vbk11dGVQYXJ0aWNpcGFudChwYXlsb2FkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQ6IGFueSwgY29uZmVyZW5jZUlkOiBhbnkpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0UmVtb3ZlUGFydGljaXBhbnRzKHBhcnRpY2lwYW50SWQsIGNvbmZlcmVuY2VJZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldENhbGxBdXRoSWQocmVzcG9uc2U6IGFueSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IHJlc3BvbnNlLmNhbGxhdXRoLmlkLFxyXG4gICAgICByZWNvcmRDYWxsOiByZXNwb25zZS5jYWxsYXV0aC5yZWNvcmRDYWxsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRPdXRnb2luZ0NhbGxUb2tlbihjYWxsQXV0aElkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q29uZmVyZW5jZUNhbGxUb2tlbih7IGF1dGhJZDogY2FsbEF1dGhJZCB9KS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvRGV2aWNlKHRva2VuOiBhbnksIGNhbGxEYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcclxuICAgICAgY29kZWNQcmVmZXJlbmNlczogWydvcHVzJywgJ3BjbXUnXSxcclxuICAgICAgY2xvc2VQcm90ZWN0aW9uOiB0cnVlLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmRldmljZSA9IG5ldyBEZXZpY2UodG9rZW4udmFsdWUsIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5jYWxsID0gYXdhaXQgdGhpcy5kZXZpY2UuY29ubmVjdCh7XHJcbiAgICAgIHBhcmFtczoge1xyXG4gICAgICAgIEZyb206IGNhbGxEYXRhLmZyb20sXHJcbiAgICAgICAgVG86IGNhbGxEYXRhLnBob25lLFxyXG4gICAgICAgIEVudjogZW52aXJvbm1lbnQuYWJiLFxyXG4gICAgICAgIFRva2VuOiB0b2tlbi5pZCxcclxuICAgICAgICBFeHQ6IGNhbGxEYXRhLmV4dE51bVxyXG4gICAgICB9LFxyXG4gICAgICBydGNDb25zdHJhaW50czogeyBhdWRpbzogeyBkZXZpY2VJZDogJ2RlZmF1bHQnIH0gfSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy50d2lsaW9TZXJ2aWNlLmNhbGwgPSB0aGlzLmNhbGw7XHJcbiAgICBjb25zb2xlLmxvZygndGVzdDk4OTk4MTExMTExJywgdGhpcy5jYWxsKTtcclxuICAgIGNvbnNvbGUubG9nKCd0ZXN0ZGV2aWNlJywgdGhpcy50d2lsaW9TZXJ2aWNlLmRldmljZSk7XHJcbiAgICAvLyB0aGlzLmNhbGxbJ2NhbGxJbmZvJ10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNhbGxEYXRhKSk7XHJcbiAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycygpIHtcclxuXHJcbiAgICB0aGlzLnN0YXJ0VGltZXIoKTtcclxuICAgIHRoaXMuZGV2aWNlPy5vbignZXJyb3InLCAoZXJyKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ2Vycm9yJywgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zaG93UmluZ0FuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0b3BUaW1lcigpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbignZGlzY29ubmVjdCcsIChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ3Rlc3QtZGlzY29ubmVjdCcpXHJcbiAgICAgIHRoaXMuY2FsbD8uZGlzY29ubmVjdCgpO1xyXG4gICAgICAvLyB0aGlzLmVuZENhbGwoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsbD8ub24oJ3JpbmdpbmcnLCAoKSA9PiB7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdyZWplY3QnLCAoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd0ZXN0NScpXHJcbiAgICAgIHRoaXMuZW5kQ2FsbCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxsPy5vbignYWNjZXB0JywgKCkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZGlzYmFsZUVuZENhbGxCdG4gPSBmYWxzZTtcclxuICAgICAgLy8gRW5zdXJlIHRoZSBhY3RpdmUgb3V0Z29pbmcgY2FsbCBpcyBtYXJrZWQgYXMgYWNjZXB0ZWQgc28gdGhlIFVJIHN3aXRjaGVzIHRvIHRoZSBjb25uZWN0ZWQgdmlld1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBpZCA9IHRoaXMuY2FsbERhdGE/LnBhcnRpY2lwYW50SWQ7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5jdXJyZW50Q2FsbExpc3QpICYmIHRoaXMuY3VycmVudENhbGxMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgLy8gY29uc3QgaWR4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChjOiBhbnkpID0+IChwaWQgJiYgYz8ucGFydGljaXBhbnRJZCA9PT0gcGlkKSB8fCAoIXBpZCAmJiBjPy5waG9uZSA9PT0gdGhpcy5jYWxsRGF0YT8ucGhvbmUpKTtcclxuICAgICAgICAgIC8vIGlmIChpZHggIT09IC0xKSB7XHJcbiAgICAgICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsTGlzdFtpZHhdLmlzQWNjZXB0Q2FsbCA9IHRydWU7XHJcbiAgICAgICAgICAvLyB0aGlzLmN1cnJlbnRDYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3RbaWR4XTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHVwZGF0aW5nIGFjY2VwdCBzdGF0ZTonLCBlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNhbGw/Lm9uKCdtZXNzYWdlUmVjZWl2ZWQnLCAobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnRUaW1lcigpIHtcclxuICAgIGxldCBzZWNvbmRzID0gMDtcclxuICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgc2Vjb25kcysrO1xyXG4gICAgICB0aGlzLnRpbWVyID0gdGhpcy5mb3JtYXRUaW1lKHNlY29uZHMpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RvcFRpbWVyKCkge1xyXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xyXG4gICAgdGhpcy50aW1lciA9ICcwMDowMCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdFRpbWUodG90YWxTZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IodG90YWxTZWNvbmRzIC8gNjApO1xyXG4gICAgY29uc3Qgc2Vjb25kcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xyXG4gICAgcmV0dXJuIGAke3RoaXMucGFkKG1pbnV0ZXMpfToke3RoaXMucGFkKHNlY29uZHMpfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhZCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2YWx1ZSA8IDEwID8gYDAke3ZhbHVlfWAgOiBgJHt2YWx1ZX1gO1xyXG4gIH1cclxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBhbnkpIHtcclxuICAgIHN3YWwoXCJFcnJvclwiLCBlcnJvciwgXCJlcnJvclwiKTtcclxuICB9XHJcblxyXG4gIGVuZENvbmZlcmVuZWNlQ2FsbChjb25mPzogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZiA9IGNvbmY7XHJcbiAgICBpZiAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHRoaXMuaG9zdG51bWJlcj8uZnJvbSkpIHtcclxuICAgICAgdGhpcy5vbkNhbGxEaXNjb25uZWN0ZWQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChjb25mPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgICBsZXQgY29uZmVyZW5jZSA9IHRoaXMubmV3SW5jb21pbmdDYWxsc0xpc3Q/LmZpbmQoKHJlczogYW55KSA9PiByZXM/LmNvbmZlcmVuY2VJZCA9PSBjb25mPy5jb25mZXJlbmNlSWQpXHJcbiAgICAgICAgbGV0IHBhcnRpY2lwZW50SW5mbyA9IGNvbmZlcmVuY2U/LnBhcnRpY2lwYW50cz8uZmluZCgocGFydGljaXBhbnQ6IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pXHJcbiAgICAgICAgICAmJiBwYXJ0aWNpcGFudD8udG8gPT09ICdjMmNfc29mdHBob25lX2NsaWVudCcpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LnRvKSAmJiBwYXJ0aWNpcGFudD8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFwYXJ0aWNpcGFudD8uaXNMZWZ0KVxyXG4gICAgICAgIGlmIChjb25mZXJlbmNlPy5pZCkge1xyXG4gICAgICAgICAgdGhpcy5vbkVuZENhbGwocGFydGljaXBlbnRJbmZvKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVuZENhbGwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZW5kQ2FsbChpc0FsbENhbGxFbmQ/OiBib29sZWFuKSB7XHJcbiAgICAvLyB0aGlzLmlzQ29uZmVyZW5jZSA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgIGlmIChpc0FsbENhbGxFbmQpIHtcclxuICAgICAgdGhpcy5zdG9wVGltZXIoKTtcclxuICAgICAgdGhpcy5vbkVuZENhbGwoe30sIGlzQWxsQ2FsbEVuZCk7XHJcbiAgICAgIGlmICghdGhpcy5jdXJyZW50Q2FsbExpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbyA9IHRoaXMuZ2V0Q3VycmVudENhbGxJbmZvKCk7XHJcbiAgICAgIHRoaXMub25FbmRDYWxsKGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8sIGlzQWxsQ2FsbEVuZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jYWxsKSB7XHJcbiAgICAgIHRoaXMuY2FsbC5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuY2FsbC5yZWplY3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBhc3luYyB0b2dnbGVNdXRlKGlzQ29uZmVyZW5jZT86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNNdXRlID0gIXRoaXMuaXNNdXRlO1xyXG4gICAgdGhpcy5jYWxsPy5tdXRlKHRoaXMuaXNNdXRlKTtcclxuICAgIGNvbnN0IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8gPSB0aGlzLmdldEN1cnJlbnRDYWxsSW5mbygpO1xyXG4gICAgdGhpcy5vbk11dGVQYXJ0aWNpcGFudCh7XHJcbiAgICAgIHBhcnRpY2lwYW50SWQ6IFtjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvLnBhcnRpY2lwYW50SWQgfHwgY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaWRdLFxyXG4gICAgICBjb25mZXJlbmNlSWQ6IGN1cnJlbnRDb25mZXJlbmNlQ2FsbEluZm8/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgaG9sZDogY3VycmVudENvbmZlcmVuY2VDYWxsSW5mby5ob2xkLFxyXG4gICAgICBtdXRlOiAhY3VycmVudENvbmZlcmVuY2VDYWxsSW5mbz8uaXNNdXRlLFxyXG4gICAgICBjb25mZXJlbmNlOiBjdXJyZW50Q29uZmVyZW5jZUNhbGxJbmZvLmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgfSlcclxuICAgIHRoaXMuY3VycmVudENhbGwuaXNNdXRlID0gdGhpcy5pc011dGU7XHJcbiAgfVxyXG5cclxuICAvLyBhdWRpb1N0cmVhbT86IE1lZGlhU3RyZWFtO1xyXG4gIC8vIG1pY09uID0gZmFsc2U7XHJcblxyXG4gIC8vIGFzeW5jIHRvZ2dsZU1pYygpIHtcclxuICAvLyAgIGlmICghdGhpcy5hdWRpb1N0cmVhbSkge1xyXG4gIC8vICAgICAvLyBmaXJzdCB0aW1lOiByZXF1ZXN0IG1pY1xyXG4gIC8vICAgICB0aGlzLmF1ZGlvU3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyBhdWRpbzogdHJ1ZSB9KTtcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICB0aGlzLm1pY09uID0gIXRoaXMubWljT247XHJcblxyXG4gIC8vICAgdGhpcy5hdWRpb1N0cmVhbS5nZXRBdWRpb1RyYWNrcygpLmZvckVhY2godHJhY2sgPT4ge1xyXG4gIC8vICAgICB0cmFjay5lbmFibGVkID0gdGhpcy5taWNPbjsgICAvLyBmYWxzZSA9IG11dGVkLCB0cnVlID0gc2VuZGluZyBhdWRpb1xyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuICBnZXRDdXJyZW50Q2FsbEluZm8oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdFxyXG4gICAgICAuZmxhdE1hcCgoY2FsbEluZm86IGFueSkgPT4gY2FsbEluZm8ucGFydGljaXBhbnRzKVxyXG4gICAgICAuZmluZCgocGFydGljaXBhbnQ6IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pICYmIHBhcnRpY2lwYW50Py50byA9PT0gJ2MyY19zb2Z0cGhvbmVfY2xpZW50JylcclxuICAgICAgICB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcGFydGljaXBhbnQ/LmlzTGVmdCAmJiAhcGFydGljaXBhbnQ/LmlzSG9sZCk7XHJcbiAgfVxyXG4gIHRvZ2dsZUtleXBhZCgpIHtcclxuICAgIHRoaXMuc2hvd0tleXBhZCA9ICF0aGlzLnNob3dLZXlwYWQ7XHJcbiAgICB0aGlzLmNhbGxJbnB1dCA9ICcnO1xyXG4gIH1cclxuICB0b2dnbGVDb250YWN0c1BhbmVsKGNhbGxJbmZvPzogYW55LCBpc0Nsb3NlPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZiAoaXNDbG9zZSkge1xyXG4gICAgICB0aGlzLnNob3dDb250YWN0c1BhbmVsID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd0NvbnRhY3RzUGFuZWwgPSAhaXNDbG9zZTtcclxuICAgIHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKGNhbGxJbmZvPy5jb25mZXJlbmNlU2lkKTtcclxuICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cztcclxuICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICAgIHRoaXMuaXNTZWFyY2hWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcclxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFJlbW92ZVBhcnRpY2lwYW50KCkge1xyXG4gICAgdGhpcy5pc0FkZFJlbW92ZVBhcnRpY2lwYW50ID0gIXRoaXMuaXNBZGRSZW1vdmVQYXJ0aWNpcGFudDtcclxuICAgIGF3YWl0IHRoaXMuZ2V0QWxsUGFydGljaXBhbnRzKHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZVNpZCk7XHJcbiAgICB0aGlzLmZpbHRlcmVkUGFydGljaXBlbnRMaXN0ID0gdGhpcy5hbGxQYXJ0aWNpcGVudExpc3Q7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGQoZGF0YT86IGFueSkge1xyXG4gICAgdGhpcy5pc0luY29taW5nQ2FsbEJ0bkRpc2FibGUgPSB0cnVlO1xyXG4gICAgdGhpcy5jb25mZXJlbmNlSWQgPSB0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvLmNvbmZlcmVuY2VJZDtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRDYWxsTGlzdC5sZW5ndGggPiAxICYmIHRoaXMuY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbCkge1xyXG4gICAgICBpZiAodGhpcy5jdXJyZW50Q2FsbD8uaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFt0aGlzLmhvc3RudW1iZXIucGFydGljaXBhbnRJZF0sXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuaG9zdG51bWJlcj8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgIG11dGU6IHRoaXMuaG9zdG51bWJlcj8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIGNvbmZlcmVuY2U6IHRoaXMuaG9zdG51bWJlci5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IHRoaXMuY3VycmVudENhbGw/LmlzSW5jb21pbmdDYWxsID8gW3RoaXMuY3VycmVudENhbGw/LmlkXSA6IFt0aGlzLmN1cnJlbnRDYWxsPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgICAgICAgIG11dGU6IHRoaXMuY3VycmVudENhbGw/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICBjb25mZXJlbmNlOiB0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIHJlY29yZElkOiBkYXRhPy5pZCxcclxuICAgICAgaXBBZGRyZXNzOiAnJyxcclxuICAgICAgaXBDb3VudHJ5OiAnJyxcclxuICAgICAgY2FsbFN0YXR1czogJ2Fuc3dlcmVkJyxcclxuICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogZGF0YT8uY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgIH1cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5zZXRJbmNvbWluZ0NhbGxTdGF0dXMocGF5bG9hZCkuc3Vic2NyaWJlKGFzeW5jIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICB0aGlzLmNhbGwgPSBhd2FpdCB0aGlzLnR3aWxpb1NlcnZpY2UuY29ubmVjdCh7IGNvbmZlcmVuY2VJZDogcmVzLmNvbmZlcmVuY2VJZCwgY29uZmVyZW5jZU5hbWU6IHJlcy5jb25mZXJlbmNlTmFtZSB9KTtcclxuICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLmlzQ3VycmVudEluY29taW5nQ2FsbExpc3QucHVzaChkYXRhPy5pZCk7XHJcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5jYWxsLCAnY2FsbENvbm5lY3QnKTtcclxuICAgICAgICBkYXRhLmlzQWNjZXB0Q2FsbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0luY29taW5nQ2FsbEJ0bkRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChyZXMpID0+IHJlcy5wYXJ0aWNpcGFudElkID09IGRhdGEucGFydGljaXBhbnRJZClcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgICAgICAgc3dhbChcIkVycm9yXCIsIHJlcz8ubWVzc2FnZS5qb2luKFwiPGJyLz5cIiksIFwiZXJyb3JcIik7XHJcbiAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgICAgIHRoaXMuaXNJbmNvbWluZ0NhbGxCdG5EaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgYXN5bmMgY2FsbENvbnRhY3QoY29udGFjdDogYW55LCBpc1Vuc2F2ZWROdW1iZXI/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnNvbGUubG9nKCdBZGRpbmcgcGFydGljaXBhbnQ6JywgY29udGFjdCk7XHJcbiAgICBjb25zb2xlLmxvZygndGhpcy5jYWxsJywgdGhpcy5jYWxsKVxyXG4gICAgY29uc3QgcGhvbmVOdW1iZXIgPSBpc1Vuc2F2ZWROdW1iZXIgPyBjb250YWN0IDogY29udGFjdD8ubnVtYmVyc0xpc3Q/LlswXT8ubnVtYmVyIHx8IGNvbnRhY3Q/LnBob25lO1xyXG4gICAgbGV0IGFscmVhZHlJbkNhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChyZXM6IGFueSkgPT4gcmVzLnRvID09IHBob25lTnVtYmVyIHx8IHJlcy5mcm9tID09IHBob25lTnVtYmVyKTtcclxuICAgIGlmIChhbHJlYWR5SW5DYWxsKSB7XHJcbiAgICAgIHN3YWwoJ0Vycm9yJywgYEFscmVhZHkgJHtwaG9uZU51bWJlcn0gbnVtYmVyIGluIHRoaXMgY2FsbC5gKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY3VycmVudENhbGwgPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kKChjOiBhbnkpID0+IGM/LnBob25lID09PSBwaG9uZU51bWJlcik7XHJcbiAgICBpZiAoIXBob25lTnVtYmVyIHx8IGN1cnJlbnRDYWxsKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHBob25lIG51bWJlciBmb3VuZCBmb3IgY29udGFjdCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgbGV0IGRhdGE6IGFueSA9IGF3YWl0IHRoaXMuYWRkUGFydGljaXBhbnRUb0NhbGwoe1xyXG4gICAgICAgICAgZnJvbTogdGhpcy5jYWxsRGF0YT8uZnJvbSA/IHRoaXMuY2FsbERhdGE/LmZyb20gOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcixcclxuICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudE51bWJlcjogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQsXHJcbiAgICAgICAgICBwcm94eTogJycsXHJcbiAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbZGF0YT8ucGFydGljaXBhbnRJZF0sXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgbXV0ZTogdGhpcy5jdXJyZW50Q2FsbD8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIGNvbmZlcmVuY2U6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNhbGxEYXRhID0ge1xyXG4gICAgICAgICAgcGhvbmU6IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgZGlzcGxheU51bTogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBuYW1lOiBjb250YWN0Py5uYW1lIHx8IGAke2NvbnRhY3Q/LmZpcnN0TmFtZX0gJHtjb250YWN0Py5sYXN0TmFtZX1gIHx8IHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgaW1nOiBjb250YWN0Py5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogZGF0YT8ucGFydGljaXBhbnRJZCxcclxuICAgICAgICAgIGZyb206IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyLFxyXG4gICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgICAgaXNIb2xkOiBmYWxzZSxcclxuICAgICAgICAgIGlzTGVmdDogZmFsc2UsXHJcbiAgICAgICAgICBpc0NvbmZlcmVuY2U6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlBhcnRpY2lwYW50IGFkZGVkIHRvIGNvbmZlcmVuY2U6XCIsIHBob25lTnVtYmVyKTtcclxuICAgICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoYz8ucGFydGljaXBhbnRJZCAmJiAhYz8uaXNIb2xkICYmIHRoaXMuY3VycmVudENhbGwuY29uZmVyZW5jZUlkID09IGM/LmNvbmZlcmVuY2VJZCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgICAgICBjb25mZXJlbmNlSWQ6IGMuY29uZmVyZW5jZUlkLFxyXG4gICAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIG11dGU6IGM/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgY29uZmVyZW5jZTogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBQdXQgY3VycmVudCBjYWxsIG9uIGhvbGRcclxuICAgICAgICB0aGlzLmlzQ2FsbE9uSG9sZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93Q29udGFjdHNQYW5lbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gQWRkIHBhcnRpY2lwYW50IHRvIHRoZSBjb25mZXJlbmNlXHJcbiAgICAgICAgbGV0IGRhdGE6IGFueSA9IGF3YWl0IHRoaXMuYWRkUGFydGljaXBhbnRUb0NhbGwoe1xyXG4gICAgICAgICAgZnJvbTogdGhpcy5jYWxsRGF0YT8uZnJvbSB8fCB0aGlzLnNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcixcclxuICAgICAgICAgIHJvdXRlOiBcIk9VVEdPSU5HXCIsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudE51bWJlcjogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBjb25mZXJlbmNlSWQ6IHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQsXHJcbiAgICAgICAgICBwcm94eTogJycsXHJcbiAgICAgICAgICBjb3VudHJ5Y29kZTogJycsXHJcbiAgICAgICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgcGFydGljaXBhbnRJZDogW2RhdGE/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgY29uZmVyZW5jZUlkOiB0aGlzLmN1cnJlbnRDYWxsLmNvbmZlcmVuY2VJZCxcclxuICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgbXV0ZTogZmFsc2UsXHJcbiAgICAgICAgICBjb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FsbERhdGEgPSB7XHJcbiAgICAgICAgICBwaG9uZTogcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBkaXNwbGF5TnVtOiBwaG9uZU51bWJlcixcclxuICAgICAgICAgIG5hbWU6IGNvbnRhY3Q/Lm5hbWUgfHwgYCR7Y29udGFjdD8uZmlyc3ROYW1lfSAke2NvbnRhY3Q/Lmxhc3ROYW1lfWAgfHwgcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICBpbWc6IGNvbnRhY3Q/LmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgICBwYXJ0aWNpcGFudElkOiBkYXRhPy5wYXJ0aWNpcGFudElkLFxyXG4gICAgICAgICAgZnJvbTogdGhpcy5zZWxlY3RlZENhbGxlcklkPy5udW1iZXIsXHJcbiAgICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgICBpc0hvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgaXNMZWZ0OiBmYWxzZSxcclxuICAgICAgICAgIGlzQ29uZmVyZW5jZTogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLnNob3dSaW5nQW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFkZGluZyBwYXJ0aWNpcGFudDonLCBlcnJvcik7XHJcbiAgICAgIHRoaXMuc2hvd1JpbmdBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBDYWxsVG9VbnNhdmVkTnVtYmVyKG51bWJlcjogc3RyaW5nLCBpc05ld0NvbmZlcmVuY2U/OiBib29sZWFuKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpc0ludmFsaWQgPSBhd2FpdCB0aGlzLmlzSW52YWxpZE51bWJlcihudW1iZXIpO1xyXG4gICAgICBpZiAoaXNJbnZhbGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBhbHJlYWR5SW5DYWxsID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZCgocmVzOiBhbnkpID0+IHJlcy50byA9PSBudW1iZXIgfHwgcmVzLmZyb20gPT0gbnVtYmVyKTtcclxuICAgICAgaWYgKGFscmVhZHlJbkNhbGwpIHtcclxuICAgICAgICBzd2FsKCdFcnJvcicsIGBBbHJlYWR5ICR7bnVtYmVyfSBudW1iZXIgaW4gdGhpcyBjYWxsLmApO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobnVtYmVyID09PSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpbGlvTnVtYmVyJykpIHtcclxuICAgICAgICBzd2FsKCdFcnJvcicsICdZb3UgY2FuIG5vdCBkaWFsIHRoaXMgbnVtYmVyJyk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY29udGFjdCA9IHRoaXMuY29udGFjdHMuZmluZCgoY29udGFjdDogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRhY3QubnVtYmVyc0xpc3Quc29tZSgobnVtOiBhbnkpID0+IG51bS5udW1iZXIgPT09IG51bWJlcilcclxuICAgICAgfSk7XHJcbiAgICAgIG51bWJlciA9IGF3YWl0IHRoaXMuZ2V0VG9OdW1iZXIobnVtYmVyKTtcclxuXHJcbiAgICAgIC8vIFVwZGF0ZSBjYWxsIGRhdGEgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXHJcbiAgICAgIGNvbnN0IGNhbGxEYXRhID0ge1xyXG4gICAgICAgIG5hbWU6IGNvbnRhY3Q/LmZpcnN0TmFtZSxcclxuICAgICAgICBpbWc6IGNvbnRhY3Q/LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICBwaG9uZTogbnVtYmVyLFxyXG4gICAgICAgIGV4dE51bTogJycsXHJcbiAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgIGRpYWw6IHRydWUsXHJcbiAgICAgICAgZnJvbTogdGhpcy5zZWxlY3RlZENhbGxlcklkLm51bWJlcixcclxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc29sZS5sb2coJ2NhbGwgc3RhcnR0ZWQnLCBjYWxsRGF0YSk7XHJcbiAgICAgIGlmIChpc05ld0NvbmZlcmVuY2UpIHtcclxuICAgICAgICB0aGlzLmlzTmV3QWRkZWRDYWxsID0gdHJ1ZTtcclxuICAgICAgICBsZXQgb3VyTnVtYmVySW5mbzogYW55ID0ge31cclxuICAgICAgICBsZXQgY2FsbEluZm8gPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0LmZpbmQoKGNhbGxJbmZvOiBhbnksIGk6IG51bWJlcikgPT4gdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQgPT0gY2FsbEluZm8uY29uZmVyZW5jZUlkKVxyXG4gICAgICAgIGlmIChjYWxsSW5mbykge1xyXG4gICAgICAgICAgb3VyTnVtYmVySW5mbyA9IGNhbGxJbmZvLnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XHJcbiAgICAgICAgICAgICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LmZyb20pICYmIHJlc0RhdGE/LnRvID09ICdjMmNfc29mdHBob25lX2NsaWVudCcpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3VyTnVtYmVySW5mbz8uaWQpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKG91ck51bWJlckluZm8sICdzZWxmSW5mbycpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgICAgcGFydGljaXBhbnRJZDogW291ck51bWJlckluZm8/LmlkXSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZUlkOiBvdXJOdW1iZXJJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IG91ck51bWJlckluZm8/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2U6IG91ck51bWJlckluZm8/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuc3RhcnRDYWxsKGNhbGxEYXRhLCBpc05ld0NvbmZlcmVuY2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0Q2FsbChjYWxsRGF0YSwgaXNOZXdDb25mZXJlbmNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgICAgdGhpcy5jYWxsQ29udGFjdChudW1iZXIsIHRydWUpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnRmFpbGVkIHRvIGluaXRpYXRlIGNhbGwuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFRvTnVtYmVyKGRpYWxlZE51bWJlcjogc3RyaW5nKSB7XHJcbiAgICBpZiAoZGlhbGVkTnVtYmVyWzBdICE9PSAnKycpIHtcclxuICAgICAgLy8gdGhpcyBpcyBjYXNlIHdoZW4gdXNlciBnZW9sb2NhdGlvbiBkaWFsIGNvZGUgaXMgb25cclxuICAgICAgbGV0IGlwQWRkcmVzczogYW55ID0gYXdhaXQgdGhpcy5pcFNlcnZpY2UuZ2V0SXBBZGRyZXNzSW5mbygpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IHRoaXMudHdpbGlvU2VydmljZS5nZXRUb051bWJlcihkaWFsZWROdW1iZXIsIGlwQWRkcmVzcy5hZGRyZXNzLmNvdW50cnlDb2RlKS50b1Byb21pc2UoKTtcclxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcz8udG9OdW1iZXJcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZGlhbGVkTnVtYmVyXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkaWFsZWROdW1iZXJcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGlzSW52YWxpZE51bWJlcihudW1iZXI6IHN0cmluZykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKG51bWJlciA9PSAnJykge1xyXG4gICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB2YWxpZE51bWJlclBhdHRlcm4gPSAvXlsrXFxkXFxzKCktXSokLzsgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIHZhbGlkIGNoYXJhY3RlcnNcclxuICAgICAgY29uc3QgcGhvbmVOdW1iZXIgPSBudW1iZXI7XHJcbiAgICAgIGlmICghdmFsaWROdW1iZXJQYXR0ZXJuLnRlc3QocGhvbmVOdW1iZXIpKSB7XHJcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcclxuICAgICAgcmV0dXJuIHRydWU7IC8vIFJldHVybiB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBtZWFuaW5nIHRoZSBudW1iZXIgaXMgaW52YWxpZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd0RpYWxBbGVydChtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGlhbEFsZXJ0ID0ge1xyXG4gICAgICBtc2c6IG1lc3NhZ2UsXHJcbiAgICAgIHNob3c6IHRydWVcclxuICAgIH07XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5kaWFsQWxlcnQuc2hvdyA9IGZhbHNlO1xyXG4gICAgfSwgMzAwMCk7XHJcbiAgfVxyXG5cclxuICBnZXRBbGxQYXJ0aWNpcGFudHMoY29uZmVyZW5jZVNpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0QWxsUGFydGljaXBhbnRzKGNvbmZlcmVuY2VTaWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5hbGxQYXJ0aWNpcGVudExpc3QgPSByZXMucGFydGljaXBhbnRzLmZpbHRlcigocmVzSW5mbzogYW55KSA9PiAhKHJlc0luZm8/LnRvID09ICdjMmNfc29mdHBob25lX2NsaWVudCcgJiYgcmVzSW5mbz8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpOztcclxuICAgICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xyXG4gICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHN3YXBDYWxscyhjYWxsSW5mbzogYW55LCBpc0NvbmZlcmVuY2VDYWxsPzogYm9vbGVhbikge1xyXG4gICAgLy8gaWYgKCF0aGlzLmhlbGRDYWxsIHx8ICF0aGlzLmNhbGwpIHJldHVybjtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuY2FsbCwgJ3RoaXMuY2FsbCcpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5oZWxkQ2FsbCwgJ3RoaXMuaGVsZENhbGwnKTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuY3VycmVudENhbGxMaXN0LCAndGhpcy5jdXJyZW50Q2FsbExpc3QnKTtcclxuICAgIGNvbnNvbGUubG9nKGNhbGxJbmZvLCAnY2FsbEluZm8gZm9yIHN3YXBDYWxscycpO1xyXG4gICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzTGlzdC5mb3JFYWNoKGFzeW5jIChjOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGM/LmNvbmZlcmVuY2VJZCA9PSBjYWxsSW5mbz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgbGV0IHBhcnRpY2lwYW50SW5mbyA9IGMucGFydGljaXBhbnRzLmZpbmQoKHJlc0RhdGE6IGFueSkgPT5cclxuICAgICAgICAgICgodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHJlc0RhdGE/LmZyb20pICYmIHJlc0RhdGE/LnRvID09ICdjMmNfc29mdHBob25lX2NsaWVudCcpIHx8ICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcmVzRGF0YT8uaXNMZWZ0XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChwYXJ0aWNpcGFudEluZm8/LmlkKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbcGFydGljaXBhbnRJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcGFydGljaXBhbnRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBtdXRlOiBwYXJ0aWNpcGFudEluZm8/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2U6IHBhcnRpY2lwYW50SW5mbz8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcGFydGljaXBhbnRJbmZvID0gYy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8uZnJvbSkgJiYgcmVzRGF0YT8udG8gPT0gJ2MyY19zb2Z0cGhvbmVfY2xpZW50JykgfHwgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJykpICYmICFyZXNEYXRhPy5pc0xlZnRcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHBhcnRpY2lwYW50SW5mbz8uaWQgJiYgIXBhcnRpY2lwYW50SW5mbz8uaXNIb2xkKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgICAgICAgICBwYXJ0aWNpcGFudElkOiBbcGFydGljaXBhbnRJbmZvPy5pZF0sXHJcbiAgICAgICAgICAgIGNvbmZlcmVuY2VJZDogcGFydGljaXBhbnRJbmZvPy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgIG11dGU6IHBhcnRpY2lwYW50SW5mbz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgY29uZmVyZW5jZTogcGFydGljaXBhbnRJbmZvPy5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLy8gdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjPy5pc0NvbmZlcmVuY2UgJiYgIWM/LmlzSG9sZCAmJiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQgPT0gYz8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcclxuICAgICAgICAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICBob2xkOiB0cnVlLFxyXG4gICAgICAgICAgbXV0ZTogYz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIGNvbmZlcmVuY2U6IGM/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIGlmICh0aGlzLmN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UpIHtcclxuICAgIC8vICAgdGhpcy5jdXJyZW50Q2FsbExpc3QuZm9yRWFjaChhc3luYyAoYzogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgaWYgKGM/LmlzQ29uZmVyZW5jZSAmJiAhYz8uaXNIb2xkICYmIHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCA9PSBjPy5jb25mZXJlbmNlSWQpIHtcclxuICAgIC8vICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAvLyAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcclxuICAgIC8vICAgICAgICAgY29uZmVyZW5jZUlkOiBjLmNvbmZlcmVuY2VJZCxcclxuICAgIC8vICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgIC8vICAgICAgICAgbXV0ZTogYz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgIC8vICAgICAgICAgY29uZmVyZW5jZTogYz8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAvLyAgICAgICB9KTtcclxuICAgIC8vICAgICAgIC8vIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSB0cnVlO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAoaXNDb25mZXJlbmNlQ2FsbCAmJiBjPy5jb25mZXJlbmNlSWQgPT0gY2FsbEluZm8uY29uZmVyZW5jZUlkICYmIGMuaXNDb25mZXJlbmNlKSB7XHJcbiAgICAvLyAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgLy8gICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXHJcbiAgICAvLyAgICAgICAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAvLyAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBjb25mZXJlbmNlOiB0cnVlXHJcbiAgICAvLyAgICAgICB9KTtcclxuICAgIC8vICAgICAgIHRoaXMuaXNDb25mZXJlbmNlID0gdHJ1ZTtcclxuICAgIC8vICAgICAgIHRoaXMuaXNDb25mZXJlbmNlQ2FsbEhvbGQgPSBmYWxzZVxyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAoY2FsbEluZm8/LmlzSG9sZCAmJiBjPy5wYXJ0aWNpcGFudElkID09PSBjYWxsSW5mbz8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgLy8gICAgICAgYXdhaXQgdGhpcy5vbmhvbGRPclVuaG9sZFBhcnRpY2lwYW50KHtcclxuICAgIC8vICAgICAgICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgLy8gICAgICAgICBjb25mZXJlbmNlSWQ6IGMuY29uZmVyZW5jZUlkLFxyXG4gICAgLy8gICAgICAgICBob2xkOiBmYWxzZSxcclxuICAgIC8vICAgICAgICAgbXV0ZTogYz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgIC8vICAgICAgICAgY29uZmVyZW5jZTogYz8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAvLyAgICAgICB9KTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0pO1xyXG4gICAgLy8gfSBlbHNlIGlmIChpc0NvbmZlcmVuY2VDYWxsKSB7XHJcbiAgICAvLyAgIHRoaXMuY3VycmVudENhbGxMaXN0LmZvckVhY2goYXN5bmMgKGM6IGFueSkgPT4ge1xyXG4gICAgLy8gICAgIGlmIChjPy5pc0NvbmZlcmVuY2UgJiYgY2FsbEluZm8/LmNvbmZlcmVuY2VJZCA9PSBjPy5jb25mZXJlbmNlSWQpIHtcclxuICAgIC8vICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAvLyAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcclxuICAgIC8vICAgICAgICAgY29uZmVyZW5jZUlkOiBjLmNvbmZlcmVuY2VJZCxcclxuICAgIC8vICAgICAgICAgaG9sZDogZmFsc2UsXHJcbiAgICAvLyAgICAgICAgIG11dGU6IGM/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAvLyAgICAgICAgIGNvbmZlcmVuY2U6IGM/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgLy8gICAgICAgfSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgIC8vIGMuaXNIb2xkID0gdHJ1ZTtcclxuICAgIC8vICAgICAgIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAvLyAgICAgICAgIHBhcnRpY2lwYW50SWQ6IFtjPy5wYXJ0aWNpcGFudElkXSxcclxuICAgIC8vICAgICAgICAgY29uZmVyZW5jZUlkOiBjLmNvbmZlcmVuY2VJZCxcclxuICAgIC8vICAgICAgICAgaG9sZDogdHJ1ZSxcclxuICAgIC8vICAgICAgICAgbXV0ZTogYz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgIC8vICAgICAgICAgY29uZmVyZW5jZTogYz8uaXNDb25mZXJlbmNlIHx8IGZhbHNlXHJcbiAgICAvLyAgICAgICB9KTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0pO1xyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgdGhpcy5pc0NvbmZlcmVuY2VDYWxsSG9sZCA9IGZhbHNlO1xyXG4gICAgLy8gICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKGFzeW5jIChjOiBhbnkpID0+IHtcclxuICAgIC8vICAgICBpZiAoYz8ucGFydGljaXBhbnRJZCAmJiAhYz8uaXNIb2xkKSB7XHJcbiAgICAvLyAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgLy8gICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXHJcbiAgICAvLyAgICAgICAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAvLyAgICAgICAgIGhvbGQ6IHRydWUsXHJcbiAgICAvLyAgICAgICAgIG11dGU6IGM/Lm11dGUgfHwgZmFsc2UsXHJcbiAgICAvLyAgICAgICAgIGNvbmZlcmVuY2U6IGM/LmlzQ29uZmVyZW5jZSB8fCBmYWxzZVxyXG4gICAgLy8gICAgICAgfSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChjYWxsSW5mbz8uaXNIb2xkICYmIGM/LnBhcnRpY2lwYW50SWQgPT09IGNhbGxJbmZvPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAvLyAgICAgICBhd2FpdCB0aGlzLm9uaG9sZE9yVW5ob2xkUGFydGljaXBhbnQoe1xyXG4gICAgLy8gICAgICAgICBwYXJ0aWNpcGFudElkOiBbYz8ucGFydGljaXBhbnRJZF0sXHJcbiAgICAvLyAgICAgICAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAvLyAgICAgICAgIGhvbGQ6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBtdXRlOiBjPy5tdXRlIHx8IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBjb25mZXJlbmNlOiBjPy5pc0NvbmZlcmVuY2UgfHwgZmFsc2VcclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBjb25zb2xlLmxvZygndGhpcy5jdXJyZW50Q2FsbExpc3QgYWZ0ZXIgc3dhcCcsIHRoaXMuY3VycmVudENhbGxMaXN0KTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGlzTWVyZ2VDYWxsQWxsb3dlZCgpIHtcclxuICAgIGxldCBtZXJnZUNhbGxMaXN0ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmlsdGVyKChyZXMpID0+IHJlcy5jb25mZXJlbmNlSWQgPT0gdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQpO1xyXG4gICAgcmV0dXJuIG1lcmdlQ2FsbExpc3QubGVuZ3RoIDw9IDE7XHJcbiAgfVxyXG5cclxuICBhc3luYyBtZXJnZUNhbGxzKCkge1xyXG4gICAgLy8gTWVyZ2UgZnVuY3Rpb25hbGl0eSAtIHVubXV0ZSBib3RoIGNhbGxzIGZvciBjb25mZXJlbmNlXHJcbiAgICBpZiAodGhpcy5jdXJyZW50Q2FsbExpc3QubGVuZ3RoID4gMSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKGFzeW5jIChjOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoYy5jb25mZXJlbmNlSWQgPT0gdGhpcy5jdXJyZW50Q2FsbC5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgICAgIGlmIChjPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgICAgICAgIC8vIGF3YWl0IHRoaXMub25ob2xkT3JVbmhvbGRQYXJ0aWNpcGFudCh7XHJcbiAgICAgICAgICAgIC8vICAgcGFydGljaXBhbnRJZDogW2M/LnBhcnRpY2lwYW50SWRdLFxyXG4gICAgICAgICAgICAvLyAgIGNvbmZlcmVuY2VJZDogYy5jb25mZXJlbmNlSWQsXHJcbiAgICAgICAgICAgIC8vICAgaG9sZDogZmFsc2UsXHJcbiAgICAgICAgICAgIC8vICAgbXV0ZTogYz8ubXV0ZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgLy8gICBjb25mZXJlbmNlOiB0cnVlXHJcbiAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICBjLmlzQ29uZmVyZW5jZSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmlzQ29uZmVyZW5jZUNhbGxIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5pc0NhbGxPbkhvbGQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5pc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYXNEZXRhaWxlZEluZm8oY2FsbERhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFjYWxsRGF0YSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHVzZXJJbmZvIGV4aXN0cyBhbmQgaGFzIG1lYW5pbmdmdWwgZGF0YVxyXG4gICAgaWYgKGNhbGxEYXRhLnVzZXJJbmZvICYmIGNhbGxEYXRhLnVzZXJJbmZvLmMyY0luZm9ybWF0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBjYWxsRGF0YS51c2VySW5mby5jMmNJbmZvcm1hdGlvbjtcclxuICAgICAgcmV0dXJuICEhKFxyXG4gICAgICAgIGluZm8uc3ViamVjdCAmJiBpbmZvLnN1YmplY3QgIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8uZW1haWwgJiYgaW5mby5lbWFpbCAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5tZXNzYWdlICYmIGluZm8ubWVzc2FnZSAhPT0gJy0nIHx8XHJcbiAgICAgICAgaW5mby5wb2ludE5hbWUgJiYgaW5mby5wb2ludE5hbWUgIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8uc291cmNlTmFtZSAmJiBpbmZvLnNvdXJjZU5hbWUgIT09ICctJyB8fFxyXG4gICAgICAgIGluZm8uZXh0ZW5zaW9uICYmIGluZm8uZXh0ZW5zaW9uICE9PSAnLScgfHxcclxuICAgICAgICBpbmZvLnVybCB8fFxyXG4gICAgICAgIGluZm8ubGF0aXR1ZGUgfHxcclxuICAgICAgICBpbmZvLmxvbmdpdHVkZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uQ2FsbElucHV0cyhudW06IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIobnVtKSB8fCBudW0gPT0gJysnIHx8IG51bSA9PSAnKicgfHwgbnVtID09ICcjJykge1xyXG4gICAgICAgIGlmIChudW0gPT0gJyMnKSB7XHJcbiAgICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtaGFzaC0ubXAzYCkucGxheSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobnVtID09ICcqJykge1xyXG4gICAgICAgICAgbmV3IEF1ZGlvKGAvYXNzZXRzL2RpYWwtdG9uZXMvZHRtZi9kdG1mLXN0YXItLm1wM2ApLnBsYXkoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbmV3IEF1ZGlvKGAvYXNzZXRzL2RpYWwtdG9uZXMvZHRtZi9kdG1mLSR7bnVtfS0ubXAzYCkucGxheSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jYWxsSW5wdXQgPSB0aGlzLmNhbGxJbnB1dCArIFN0cmluZyhudW0pO1xyXG4gICAgICAgIHRoaXMuc2hvd0NsZWFyQnRuID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc3RyID0gU3RyaW5nKG51bSk7XHJcbiAgICAgIHRoaXMuY2FsbD8uc2VuZERpZ2l0cyhzdHIpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH1cclxuICB9XHJcbiAgb25DYWxsSW5wdXRFbnRlcihldjogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmNhbGw/LnNlbmREaWdpdHMoU3RyaW5nKGV2LmtleSkpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlSW5jb21pbmdDYWxsKGRhdGE6IGFueSkge1xyXG4gICAgaWYgKGRhdGEuc2hvdykge1xyXG4gICAgICAvLyBoYW5kbGUgaW5jb21pbmcgY2FsbCBhY2NlcHRlZFxyXG4gICAgICB0aGlzLnN0YXJ0VGltZXIoKTtcclxuICAgICAgdGhpcy5kaXNiYWxlRW5kQ2FsbEJ0biA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gZmFsc2U7XHJcblxyXG4gICAgICBjb25zdCBpbmNvbWluZ0RldGFpbCA9IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRDYWxsU2lkKCk7XHJcbiAgICAgIHRoaXMuaW5jb21pbmdSZWNvcmRDYWxsID0gaW5jb21pbmdEZXRhaWwucmVjb3JkQ2FsbDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmluY29taW5nUmVjb3JkQ2FsbCkge1xyXG4gICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gaW5jb21pbmcgY2FsbCByZWplY3RlZCBvciBhdXRvLWNhbmNlbGxlZFxyXG4gICAgICB0aGlzLmlzQ29uY3VycmVudEluY29taW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGl2ID0gZmFsc2U7XHJcbiAgICAgIC8vIElmIHRoZXJlIGlzIE5PIGFjdGl2ZSBjYWxsLCB0aGVuIHByb3BhZ2F0ZSBlbmQuIE90aGVyd2lzZSBrZWVwIG9uZ29pbmcgVUkuXHJcbiAgICAgIGlmICghdGhpcy5jYWxsIHx8IHRoaXMuY2FsbC5zdGF0dXMoKSAhPT0gJ29wZW4nKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3Rlc3Q3JylcclxuICAgICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgY2xlYXJJbnB1dHMoKSB7XHJcbiAgICB0aGlzLmNhbGxJbnB1dCA9IHRoaXMuY2FsbElucHV0LnNsaWNlKDAsIC0xKTtcclxuICB9XHJcbiAgaXNNaW5pbWlzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtaW5pbWlzZURpYWxwYWQoKSB7XHJcbiAgICB0aGlzLm1pbmltaXNlRXZlbnQuZW1pdCh0cnVlKTtcclxuICAgIHRoaXMuaXNNaW5pbWlzZWQgPSB0cnVlO1xyXG4gIH1cclxuICBtYXhpbWlzZURpYWxwYWQoKSB7XHJcbiAgICB0aGlzLm1pbmltaXNlRXZlbnQuZW1pdChmYWxzZSk7XHJcbiAgICB0aGlzLmlzTWluaW1pc2VkID0gZmFsc2U7XHJcbiAgfVxyXG4gIHRvZ2dsZVJlY29yZGluZygpIHtcclxuICAgIGlmICh0aGlzLmlzUmVjb3JkaW5nKSB7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydFJlY29yZGluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGFydFJlY29yZGluZygpIHtcclxuICAgIGxldCBzaWQ7XHJcbiAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldENhbGxTaWQoKTtcclxuICAgIHRoaXMuaW5jb21pbmdDYWxsU2lkID0gZGV0YWlscy5jYWxsU2lkO1xyXG4gICAgdGhpcy5pbmNvbWluZ1JlY29yZENhbGwgPSBkZXRhaWxzLnJlY29yZENhbGw7XHJcbiAgICBzaWQgPSB0aGlzLmluY29taW5nQ2FsbFNpZCA/IHRoaXMuaW5jb21pbmdDYWxsU2lkIDogdGhpcy5jYWxsU2lkIHx8IHRoaXMuYWRkUmVzPy5jb25mZXJlbmNlU2lkO1xyXG5cclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBcImNvbmZlcmVuY2VJZFwiOiB0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsXHJcbiAgICB9XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFJlY29yZGluZyhwYXlsb2FkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICB0aGlzLmlzUmVjb3JkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRpbWVFbGFwc2VkID0gMDtcclxuICAgICAgdGhpcy5zdGFydFRpbWVyMSgpO1xyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFJlY29yZGluZygpIHtcclxuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcGF1c2VSZWNvcmRpbmcoKSB7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UucGF1c2VPclJlc3VtZVJlY29yZGluZyh0aGlzLmN1cnJlbnRDYWxsPy5jb25mZXJlbmNlSWQsICdwYXVzZScpLnN1YnNjcmliZShcclxuICAgICAgcmVzcG9uc2UgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcFJlY29yZGluZ1RpbWVyKCk7XHJcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhdXNpbmcgcmVjb3JkaW5nOicsIGVycm9yKTtcclxuICAgICAgICAvLyBDb25zaWRlciB1cGRhdGluZyB0aGUgVUkgdG8gc2hvdyB0aGUgZXJyb3Igc3RhdGVcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgcmVzdW1lUmVjb3JkaW5nKCkge1xyXG4gICAgLy8gaWYgKCF0aGlzLmluY29taW5nUmVjb3JkQ2FsbCAmJiAhdGhpcy5yZWNvcmRDYWxsKSB7XHJcbiAgICAvLyAgIHJldHVybjsgLy8gU2tpcCBpZiByZWNvcmRpbmcgaXMgbm90IGVuYWJsZWRcclxuICAgIC8vIH1cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5wYXVzZU9yUmVzdW1lUmVjb3JkaW5nKHRoaXMuY3VycmVudENhbGw/LmNvbmZlcmVuY2VJZCwgJ3Jlc3VtZScpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XHJcbiAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGFydFRpbWVyMSgpO1xyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZXN1bWluZyByZWNvcmRpbmcnLCBlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZ2V0VGltZURpZmZlcmVuY2UoaW5wdXRUaW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFzdFRpbWUgPSBuZXcgRGF0ZShpbnB1dFRpbWUpLmdldFRpbWUoKTtcclxuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgbGV0IGRpZmYgPSBNYXRoLmZsb29yKChjdXJyZW50VGltZSAtIHBhc3RUaW1lKSAvIDEwMDApOyAvLyB0b3RhbCBzZWNvbmRzXHJcblxyXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoZGlmZiAvIDYwKTtcclxuICAgIGNvbnN0IHNlY29uZHMgPSBkaWZmICUgNjA7XHJcblxyXG4gICAgY29uc3QgbW0gPSBtaW51dGVzIDwgMTAgPyAnMCcgKyBtaW51dGVzIDogbWludXRlcztcclxuICAgIGNvbnN0IHNzID0gc2Vjb25kcyA8IDEwID8gJzAnICsgc2Vjb25kcyA6IHNlY29uZHM7XHJcblxyXG4gICAgcmV0dXJuIGAke21tfToke3NzfWA7XHJcbiAgfVxyXG4gIHN0YXJ0VGltZXIxKCkge1xyXG4gICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbiA9IGludGVydmFsKDEwMDApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMudGltZUVsYXBzZWQrKztcclxuICAgIH0pO1xyXG4gIH1cclxuICBzdG9wUmVjb3JkaW5nVGltZXIoKSB7XHJcbiAgICBpZiAodGhpcy50aW1lclN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IC8vIFBhdXNlIHRoZSB0aW1lclxyXG4gICAgICB0aGlzLnRpbWVyU3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkOyAgICAgICAgLy8gT3B0aW9uYWxseSByZXNldCB0aGUgc3Vic2NyaXB0aW9uXHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldEZvcm1hdHRlZFRpbWUoKSB7XHJcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcih0aGlzLnRpbWVFbGFwc2VkIC8gNjApO1xyXG4gICAgY29uc3Qgc2Vjb25kcyA9IHRoaXMudGltZUVsYXBzZWQgJSA2MDtcclxuICAgIHJldHVybiBgJHttaW51dGVzfToke3NlY29uZHMgPCAxMCA/ICcwJyA6ICcnfSR7c2Vjb25kc31gO1xyXG4gIH1cclxuICBwb2xsQ2FsbFN0YXR1cyhjYWxsQXV0aElkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG1heFRpbWUgPSAzMDAwMDsgLy8gUG9sbCBmb3IgdXAgdG8gMzAgc2Vjb25kc1xyXG4gICAgY29uc3QgcG9sbEludGVydmFsID0gMzAwMDsgLy8gUG9sbCBldmVyeSAzIHNlY29uZHNcclxuICAgIGxldCBlbGFwc2VkVGltZSA9IDA7XHJcbiAgICBjb25zdCBpbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xyXG4gICAgICBlbGFwc2VkVGltZSArPSBwb2xsSW50ZXJ2YWw7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0Q2FsbFN0YXR1cyhjYWxsQXV0aElkKS50b1Byb21pc2UoKSBhcyBDYWxsU3RhdHVzUmVzcG9uc2U7XHJcbiAgICAgICAgaWYgKHN0YXR1c1Jlc3BvbnNlICYmIHN0YXR1c1Jlc3BvbnNlLmNhbGxEZXRhaWxzKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGxTdGF0dXMgPSBzdGF0dXNSZXNwb25zZS5jYWxsRGV0YWlscy5jYWxsU3RhdHVzO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY2FsbFN0YXR1cyA9PT0gJ2luLXByb2dyZXNzJykge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxTaWQgPSBzdGF0dXNSZXNwb25zZS5jYWxsRGV0YWlscy5jYWxsU2lkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yZWNvcmRDYWxsICYmICF0aGlzLmlzUmVjb3JkaW5nKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdGFydFJlY29yZGluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2FsbFN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcpIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3Rlc3QxJylcclxuICAgICAgICAgICAgdGhpcy5lbmRDYWxsKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxTdGF0dXMgPT09ICdyaW5naW5nJykge1xyXG4gICAgICAgICAgICAvLyBDb250aW51ZSBwb2xsaW5nOyBkbyBub3QgY2xlYXIgdGhlIGludGVydmFsIHlldFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChlbGFwc2VkVGltZSA+PSBtYXhUaW1lKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ01heCBwb2xsaW5nIHRpbWUgcmVhY2hlZC4gU3RvcHBpbmcgcG9sbC4nKTtcclxuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICB9XHJcbiAgICB9LCBwb2xsSW50ZXJ2YWwpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlckluZm9ybWF0aW9uKGlkOiBhbnkpIHtcclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24oaWQpLnN1YnNjcmliZShcclxuICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSwgJ3VzZXJJbmZvcm1hdGlvbicpO1xyXG4gICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgc2VsZWN0ZWRJbmNvbWluZ0NhbGxJbmZvKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEluY29taW5nQ2FsbCA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBnZXRIb2xkQ2FsbExpc3QoKSB7XHJcbiAgICBsZXQgaG9sZExpc3Q6IGFueVtdID0gW107XHJcbiAgICBsZXQgaXNDb25mZXJlbmNlID0gZmFsc2U7XHJcbiAgICB0aGlzLmN1cnJlbnRDYWxsTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGM/LmlzSG9sZCAmJiAhYz8uaXNDb25mZXJlbmNlKSB7XHJcbiAgICAgICAgaG9sZExpc3QucHVzaChjKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoYz8uaXNDb25mZXJlbmNlICYmICFpc0NvbmZlcmVuY2UpIHtcclxuICAgICAgICBpc0NvbmZlcmVuY2UgPSB0cnVlO1xyXG4gICAgICAgIGNbJ2lzQ29uZmVyZW5jZUNhbGxIb2xkJ10gPSB0cnVlO1xyXG4gICAgICAgIGhvbGRMaXN0LnB1c2goYyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGhvbGRMaXN0O1xyXG4gIH1cclxuXHJcbiAgb25DbGlja0V4cGFuZChkYXRhOiBhbnkpIHtcclxuICAgIGlmIChkYXRhLmlkICE9IHRoaXMuc2VsZWN0ZWRVc2VySW5mbz8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICB0aGlzLmlzQ2xpY2tFeHBhbmQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVXNlckluZm8gPSBkYXRhO1xyXG4gICAgICB0aGlzLmNoZWNrVGV4dEhlaWdodCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0NsaWNrRXhwYW5kID0gIXRoaXMuaXNDbGlja0V4cGFuZDtcclxuICAgICAgaWYgKHRoaXMuaXNDbGlja0V4cGFuZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VySW5mbyA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5jaGVja1RleHRIZWlnaHQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0SW5jb21pbmdDYWxsU3RhdHVzKGRhdGE6IGFueSkge1xyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIHJlY29yZElkOiBkYXRhPy5pZCxcclxuICAgICAgaXBBZGRyZXNzOiAnJyxcclxuICAgICAgaXBDb3VudHJ5OiAnJyxcclxuICAgICAgY2FsbFN0YXR1czogJ2Fuc3dlcmVkJyxcclxuICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgIGNvbmZlcmVuY2VJZDogdGhpcy5jdXJyZW50Q2FsbD8uY29uZmVyZW5jZUlkIHx8IGRhdGEuY29uZmVyZW5jZUlkIHx8ICdubydcclxuICAgIH1cclxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5zZXRJbmNvbWluZ0NhbGxTdGF0dXMocGF5bG9hZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhyZXMpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VhcmNoKCkge1xyXG4gICAgdGhpcy5pc1NlYXJjaFZpc2libGUgPSAhdGhpcy5pc1NlYXJjaFZpc2libGU7XHJcblxyXG4gICAgLy8gaWYgY2xvc2luZyBzZWFyY2gg4oCUIHJlc2V0IHJlc3VsdHNcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgaWYgKCF0aGlzLmlzU2VhcmNoVmlzaWJsZSkge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuY29udGFjdHM7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRQYXJ0aWNpcGVudExpc3QgPSB0aGlzLmFsbFBhcnRpY2lwZW50TGlzdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVyKCkge1xyXG4gICAgY29uc3QgdGV4dCA9IHRoaXMuc2VhcmNoVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHRoaXMuaXNEaXJlY3RDYWxsT3B0aW9uU2hvdyA9IC9eXFwrP1xcZCskLy50ZXN0KHRleHQpXHJcbiAgICBpZiAodGV4dC5sZW5ndGggPCAyKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5jb250YWN0cztcclxuICAgICAgdGhpcy5maWx0ZXJlZFBhcnRpY2lwZW50TGlzdCA9IHRoaXMuYWxsUGFydGljaXBlbnRMaXN0O1xyXG4gICAgICB0aGlzLmZpbHRlcmVkTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRDYWxsTGlzdC5maW5kSW5kZXgoKGNjOiBhbnkpID0+ICFjYz8uSXNDb25uZWN0ZWQgJiYgKGNjPy5waG9uZSA9PSBjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyIHx8IGNjPy5waG9uZSA9PSBjPy5udW1iZXJzTGlzdFsxXT8ubnVtYmVyKSk7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgIGNbJ0lzQ29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjWydJc0Nvbm5lY3RlZCddID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLmNvbnRhY3RzLmZpbHRlcigoYzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiAoYz8uZmlyc3ROYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8IChjPy5sYXN0TmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSB8fFxyXG4gICAgICAgIChjPy5taWRkbGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8IChjPy5uaWNrTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSB8fFxyXG4gICAgICAgIChjPy5udW1iZXJzTGlzdFswXT8ubnVtYmVyIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpIHx8IChjPy5udW1iZXJzTGlzdFsxXT8ubnVtYmVyIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkTGlzdC5mb3JFYWNoKChjOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Q2FsbExpc3QuZmluZEluZGV4KChjYzogYW55KSA9PiBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciB8fCBjYz8ucGhvbmUgPT0gYz8ubnVtYmVyc0xpc3RbMV0/Lm51bWJlcik7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY1snSXNDb25uZWN0ZWQnXSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgY2hlY2tUZXh0SGVpZ2h0KCkge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGV4dC1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChlbD8uc2Nyb2xsSGVpZ2h0ID4gZWw/LmNsaWVudEhlaWdodCkge1xyXG4gICAgICB0aGlzLnNob3dCdXR0b24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuICB0b2dnbGVUZXh0KCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gIXRoaXMuaXNFeHBhbmRlZDtcclxuICB9XHJcblxyXG4gIHNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZTtcclxuXHJcbiAgLy8gQ2FsbCB0aGlzIHdoZW4gY2FsbCBkaXNjb25uZWN0c1xyXG4gIG9uQ2FsbERpc2Nvbm5lY3RlZCgpIHtcclxuICAgIHRoaXMuc2hvd0Rpc2Nvbm5lY3RNb2RhbCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBlbmRDb25mZXJlbmNlKCkge1xyXG4gICAgY29uc29sZS5sb2coJ0NvbmZlcmVuY2UgRW5kZWQnKTtcclxuICAgIHRoaXMuc2hvd0Rpc2Nvbm5lY3RNb2RhbCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb25mPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgdGhpcy5vbkVuZENhbGwodGhpcy5zZWxlY3RlZENvbmYsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbmRDYWxsKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGVhdmVDb25mZXJlbmNlKCkge1xyXG4gICAgY29uc29sZS5sb2coJ2xlYXZlVGltZScsIHRoaXMubGVhdmVSZWFzb24pO1xyXG4gICAgdGhpcy5zaG93RGlzY29ubmVjdE1vZGFsID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5pc1JlYXNvbkNoZWNrZWQpIHtcclxuICAgICAgbGV0IHBheWxvYWQgPSB7IGNvbmZlcmVuY2VJZDogdGhpcy5zZWxlY3RlZENvbmY/LmNvbmZlcmVuY2VJZCB8fCB0aGlzLmhvc3RudW1iZXI/LmNvbmZlcmVuY2VJZCwgdGltZTogdGhpcy5jb252ZXJ0SEhNTVRvTWludXRlcyh0aGlzLmxlYXZlUmVhc29uKSwgdGltZXJEYXRlOiBuZXcgRGF0ZSgpLnRvU3RyaW5nKCkgfVxyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2Uuc2V0VGltZXJGb3JFbmRDb25mZXJlbmNlQ2FsbChwYXlsb2FkKS5zdWJzY3JpYmUoKHJlcykgPT4geyB9KVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb25mPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgbGV0IGNvbmZlcmVuY2UgPSB0aGlzLm5ld0luY29taW5nQ2FsbHNMaXN0Py5maW5kKChyZXM6IGFueSkgPT4gcmVzPy5jb25mZXJlbmNlSWQgPT0gdGhpcy5zZWxlY3RlZENvbmY/LmNvbmZlcmVuY2VJZClcclxuICAgICAgbGV0IHBhcnRpY2lwZW50SW5mbyA9IGNvbmZlcmVuY2U/LnBhcnRpY2lwYW50cz8uZmluZCgocGFydGljaXBhbnQ6IGFueSkgPT4gKCh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocGFydGljaXBhbnQ/LmZyb20pXHJcbiAgICAgICAgJiYgcGFydGljaXBhbnQ/LnRvID09PSAnYzJjX3NvZnRwaG9uZV9jbGllbnQnKSB8fCAodGhpcy5kZXZpY2VOdW1iZXJMaXN0LmluY2x1ZGVzKHBhcnRpY2lwYW50Py50bykgJiYgcGFydGljaXBhbnQ/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpKSAmJiAhcGFydGljaXBhbnQ/LmlzTGVmdClcclxuICAgICAgaWYgKGNvbmZlcmVuY2U/LmlkKSB7XHJcbiAgICAgICAgdGhpcy5vbkVuZENhbGwocGFydGljaXBlbnRJbmZvKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9uRW5kQ2FsbCh0aGlzLmhvc3RudW1iZXIpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcbiAgY29udmVydEhITU1Ub01pbnV0ZXModGltZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IFtob3VycywgbWludXRlc10gPSB0aW1lLnNwbGl0KCc6JykubWFwKE51bWJlcik7XHJcbiAgICByZXR1cm4gKGhvdXJzICogNjApICsgbWludXRlcztcclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmNhbGxEYXRhLmRpYWwgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnRpbWVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsbC1jb250YWluZXJcIiAqbmdJZj1cIiFpc01pbmltaXNlZCAmJiBjdXJyZW50Q2FsbExpc3Q/Lmxlbmd0aFwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydjb2xsb3BzJzogaXNDb2xsb3BzLCAnaW5jb21pbmctY2FsbC1jb250YWluZXInOiBpc0NsaWNrRXhwYW5kLCAnY29udGFjdHMtb3Blbic6IHNob3dDb250YWN0c1BhbmVsIH1cIj5cclxuICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaW5jb21pbmdDYWxsRGl2IHx8IGlzQ29uY3VycmVudEluY29taW5nIHx8IHRydWVcIj4gLS0+XHJcblxyXG4gICAgICAgIDwhLS0gQWxsIHR5cGUgQ2FsbCBIb2xkIGxpc3QgIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWxkLWNhbGwtYmFubmVyXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50Q2FsbExpc3QubGVuZ3RoID4gMSAmJiAhIWN1cnJlbnRDYWxsICYmICgoaXNDb25mZXJlbmNlQ2FsbEhvbGQgfHwgaXNDb25mZXJlbmNlKSB8fCAhaXNDb25mZXJlbmNlKVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb25mIG9mIGNvbmZlcmVuY2VDYWxsTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtY2FsbC1jb250ZW50XCIgKm5nSWY9XCJjb25mPy5pc0NvbmZlcmVuY2VIb2xkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaG9sZC1pY29uXCI+cGF1c2VfY2lyY2xlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVsZC1jYWxsZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVsZC1sYWJlbFwiPkhvbGQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlbGQtbmFtZVwiPkNvbmZlcmVuY2UgQ2FsbDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbGQtYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1ob2xkLWNvbnRhY3RcIiBbbmdDbGFzc109XCJ7ICdvbi1ob2xkJzogY29uZj8uaXNDb25mZXJlbmNlSG9sZCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzd2FwQ2FsbHMoY29uZix0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJ7eydIb2xkJ319XCI+IHBob25lX3BhdXNlZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cImVuZENvbmZlcmVuZWNlQ2FsbChjb25mKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgdGl0bGU9XCJDYWxsIEVuZFwiPiBjYWxsX2VuZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlYXJyb3ctYXJyb3cgbWUtMlwiIGlkPVwidG9nZ2xlYXJyb3dcIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjb25mKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gRm9yIHNpbmdsZSBpbmNvbWluZyBjYWxsIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoLTEwMCBweS01XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudENhbGxMaXN0Lmxlbmd0aCA9PT0gMSAmJiBjdXJyZW50Q2FsbExpc3RbMF0/LmlzSW5jb21pbmdDYWxsICYmICFjdXJyZW50Q2FsbExpc3RbMF0/LmlzQWNjZXB0Q2FsbCBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxUb051bVwiPkluY29taW5nIGNhbGwgb24gPGJyIC8+PHNwYW4+e3tjdXJyZW50Q2FsbExpc3RbMF0/LnRvIHx8ICdVbmtub3duXHJcbiAgICAgICAgICAgICAgICAgICAgTnVtYmVyJ319PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYW5pbWF0aW9uXCIgW25nQ2xhc3NdPVwieydjYWxsLWFuaW1hdGlvbi1wbGF5Jzogc2hvd1JpbmdBbmltYXRpb259XCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiIFtzcmNdPVwiY3VycmVudENhbGxMaXN0WzBdPy5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCJcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEyMFwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbGVyRGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgPGgxPnt7IGN1cnJlbnRDYWxsTGlzdFswXT8ubmFtZSA/IGN1cnJlbnRDYWxsTGlzdFswXT8ubmFtZSA6IGN1cnJlbnRDYWxsTGlzdFswXT8ucGhvbmUgfHwgJ1Vua25vd25cclxuICAgICAgICAgICAgICAgICAgICBOdW1iZXInIH19PC9oMT5cclxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiISFjdXJyZW50Q2FsbExpc3RbMF0/Lm5hbWVcIj57eyBjdXJyZW50Q2FsbExpc3RbMF0/LnBob25lIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFjdGlvbi1idG5zIG10LWF1dG9cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biByZWNlaXZlLWJ0blwiICpuZ0lmPVwiIW5ld0luY29taW5nQ2FsbHNMaXN0WzBdPy5pc0NhbGxDb25uZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0luY29taW5nQ2FsbEJ0bkRpc2FibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwiYWRkKGN1cnJlbnRDYWxsTGlzdFswXSlcIj4gY2FsbCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLWJ0biByZWplY3QtYnRuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChjdXJyZW50Q2FsbExpc3RbMF0pXCI+IGNhbGxfZW5kXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEZvciBzaW5nbGUgYWN0aXZlIGNhbGwgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIighaXNDb25mZXJlbmNlIHx8IGlzQ29uZmVyZW5jZUNhbGxIb2xkKSAmJiAoISFjdXJyZW50Q2FsbD8uaWQgJiYgIWN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2UpICYmIGN1cnJlbnRDYWxsPy5pc0FjY2VwdENhbGxcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOiAnZmxleCcsICdmbGV4LWRpcmVjdGlvbic6ICdjb2x1bW4nLCAncG9zaXRpb24nOiAncmVsYXRpdmUnfVwiIGNsYXNzPVwiYWN0aXZlLWNhbGxcIj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvblwiIFtuZ0NsYXNzXT1cInsnY2FsbC1hbmltYXRpb24tcGxheSc6IHNob3dSaW5nQW5pbWF0aW9ufVwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhci1pbWdcIiBbc3JjXT1cImN1cnJlbnRDYWxsPy5pbWcgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnXCIgYWx0PVwiXCIgd2lkdGg9XCIxMjBcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgIDxoMSBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBzaG93S2V5cGFkID8gJzAnOiAnOHB4J31cIj57e2N1cnJlbnRDYWxsPy5uYW1lIHx8ICdVbmtub3duIG51bWJlcid9fVxyXG4gICAgICAgICAgICAgICAgPC9oMT5cclxuICAgICAgICAgICAgICAgIDxwPnt7Y3VycmVudENhbGw/LnBob25lIH19PC9wPlxyXG4gICAgICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luLXRvcDogNHB4XCI+e3tjdXJyZW50Q2FsbD8udGltZSB8fCB0aW1lcn19PC9oND5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWFjdGlvbi1idG5zXCIgKm5nSWY9XCIhc2hvd0tleXBhZFwiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICcyMHB4J31cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYnRuLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHN0YXJ0LXN0b3BcIiAqbmdJZj1cIiFpc1JlY29yZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncmVjb3JkaW5nJzogaXNSZWNvcmRpbmcsICdzdG9wcGVkJzogIWlzUmVjb3JkaW5nfVwiIChjbGljayk9XCJ0b2dnbGVSZWNvcmRpbmcoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpc1JlY29yZGluZyA/ICdTdG9wIFJlY29yZGluZycgOiAnU3RhcnQgUmVjb3JkaW5nJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlY29yZGluZy1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXVzZS1yZXN1bWUtYnRuc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVjb3JkLWJ0biBwYXVzZS1yZXN1bWVcIiAqbmdJZj1cImlzUmVjb3JkaW5nICYmICFpc1BhdXNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGF1c2VSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBhdXNlIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNQYXVzZWRcIiAoY2xpY2spPVwicmVzdW1lUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBwbGF5X2Fycm93IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1JlY29yZGluZ1wiIGNsYXNzPVwidGltZXItZGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGdldEZvcm1hdHRlZFRpbWUoKSB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0tleXBhZFwiIGNsYXNzPVwic2VuZERpZ2l0XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiY2FsbC1pbnB1dHNcIiBpZD1cImNhbGwtaW5wdXRcIiBbKG5nTW9kZWwpXT1cImNhbGxJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cIm9uQ2FsbElucHV0RW50ZXIoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGlucHV0LWNsZWFyLWJ0blwiICpuZ0lmPVwiY2FsbElucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJJbnB1dHMoKVwiPmNsb3NlX3NtYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1jb250YWluZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwic2hvd0tleXBhZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleS1idG5cIiAqbmdGb3I9XCJsZXQga2V5IG9mIGtleXBhZFZhbFwiIChjbGljayk9XCJvbkNhbGxJbnB1dHMoa2V5Lm51bSlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2tleS5udW19fVxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWFsYmhhYmV0c1wiPnt7a2V5LnRleHQgPyBrZXkudGV4dCA6ICcmbmJzcDsnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hY3Rpb24tYnRuc1wiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IHNob3dLZXlwYWQgPyAnMCc6ICc3MjN4J31cIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cIiFpbmNvbWluZ0NhbGxEaXYgfHwgaXNDb25jdXJyZW50SW5jb21pbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaGVsZC1idG4gbWVyZ2UtYnRuXCIgKGNsaWNrKT1cIm1lcmdlQ2FsbHMoKVwiIHRpdGxlPVwiTWVyZ2UgY2FsbHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNZXJnZUNhbGxBbGxvd2VkKCkgfHwgY3VycmVudENhbGxMaXN0Lmxlbmd0aCA8IDJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+TWVyZ2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWV2ZW5seSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0biBtci0zXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCIgKGNsaWNrKT1cInRvZ2dsZU11dGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cImlzTXV0ZVwiPiBtaWNfb2ZmIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCIhaXNNdXRlXCI+IG1pYyA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxsLXNlYy1idG4gbXItM1wiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAoY2xpY2spPVwidG9nZ2xlS2V5cGFkKClcIj4gdHJhbnNpdGlvbl9kaXNzb2x2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtc2VjLWJ0blwiIFtkaXNhYmxlZF09XCIhY3VycmVudENhbGw/LmlzQWNjZXB0Q2FsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDb250YWN0c1BhbmVsKGN1cnJlbnRDYWxsKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzXzIgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gZW5kLWNhbGwtYnRuXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Q2FsbD8uaXNBY2NlcHRDYWxsXCIgKGNsaWNrKT1cImVuZENhbGwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIGNvbmZlcmVuY2UgY2FsbCB2aWV3IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb25mZXJlbmNlLWNhbGwtdmlld1wiICpuZ0lmPVwiaXNDb25mZXJlbmNlICYmIGN1cnJlbnRDYWxsPy5pc0NvbmZlcmVuY2VcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmYtaGVhZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25mLWljb24gbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBncm91cHMgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb25mLXRpdGxlXCI+Q29uZmVyZW5jZSBDYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsLXRleHQgY29uZi1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2FsbCBvZiBjdXJyZW50Q2FsbExpc3Q7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjYWxsPy5pc0NvbmZlcmVuY2VIb2xkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImkgIT0gMFwiPiY8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbGw/Lm5hbWUgPyBjYWxsPy5uYW1lIDogY2FsbD8ucGhvbmUgfHwgJ1Vua25vd24gbnVtYmVyJ319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZi10aW1lclwiPnt7IHRpbWVyIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtYWN0aW9uLWJ0bnMgbXQtYXV0b1wiICpuZ0lmPVwiIXNob3dLZXlwYWRcIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogc2hvd0tleXBhZCA/ICcwJzogJzIwcHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1idG4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gc3RhcnQtc3RvcFwiICpuZ0lmPVwiIWlzUmVjb3JkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydyZWNvcmRpbmcnOiBpc1JlY29yZGluZywgJ3N0b3BwZWQnOiAhaXNSZWNvcmRpbmd9XCIgKGNsaWNrKT1cInRvZ2dsZVJlY29yZGluZygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImlzUmVjb3JkaW5nID8gJ1N0b3AgUmVjb3JkaW5nJyA6ICdTdGFydCBSZWNvcmRpbmcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVjb3JkaW5nLWljb25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhdXNlLXJlc3VtZS1idG5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZWNvcmQtYnRuIHBhdXNlLXJlc3VtZVwiICpuZ0lmPVwiaXNSZWNvcmRpbmcgJiYgIWlzUGF1c2VkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwYXVzZVJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gcGF1c2UgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlY29yZC1idG4gcGF1c2UtcmVzdW1lXCIgKm5nSWY9XCJpc1BhdXNlZFwiIChjbGljayk9XCJyZXN1bWVSZWNvcmRpbmcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IHBsYXlfYXJyb3cgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzUmVjb3JkaW5nXCIgY2xhc3M9XCJ0aW1lci1kaXNwbGF5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZ2V0Rm9ybWF0dGVkVGltZSgpIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0tleXBhZFwiIGNsYXNzPVwic2VuZERpZ2l0IG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJjYWxsLWlucHV0c1wiIGlkPVwiY2FsbC1pbnB1dFwiIFsobmdNb2RlbCldPVwiY2FsbElucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwib25DYWxsSW5wdXRFbnRlcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaW5wdXQtY2xlYXItYnRuXCIgKm5nSWY9XCJjYWxsSW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhcklucHV0cygpXCI+Y2xvc2Vfc21hbGw8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRhaW5lciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJzaG93S2V5cGFkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5LWJ0blwiICpuZ0Zvcj1cImxldCBrZXkgb2Yga2V5cGFkVmFsXCIgKGNsaWNrKT1cIm9uQ2FsbElucHV0cyhrZXkubnVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7a2V5Lm51bX19XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4tYWxiaGFiZXRzXCI+e3trZXkudGV4dCA/IGtleS50ZXh0IDogJyZuYnNwOyd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25mLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaXJjbGUtYnRuXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBpc011dGV9XCIgKGNsaWNrKT1cInRvZ2dsZU11dGUodHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4ge3sgaXNNdXRlID8gJ21pY19vZmYnIDogJ21pYycgfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0blwiIChjbGljayk9XCJ0b2dnbGVLZXlwYWQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiB0cmFuc2l0aW9uX2Rpc3NvbHZlIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpcmNsZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbChjdXJyZW50Q2FsbClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gZ3JvdXBzXzIgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmYtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2lyY2xlLWJ0biBkYW5nZXJcIiAoY2xpY2spPVwiZW5kQ29uZmVyZW5lY2VDYWxsKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2F2ZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIndhdmVzXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXHJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAyNCAxNTAgMjhcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHNoYXBlLXJlbmRlcmluZz1cImF1dG9cIj5cclxuICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGlkPVwiZ2VudGxlLXdhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTS0xNjAgNDRjMzAgMCA1OC0xOCA4OC0xOHMgNTggMTggODggMTggNTgtMTggODgtMTggNTggMTggODggMTggdjQ0aC0zNTJ6XCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgIDxnIGNsYXNzPVwicGFyYWxsYXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiMFwiIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCIzXCIgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC41KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjdcIiBmaWxsPVwiI2ZmZlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBJbmNvbWluZyBjYWxsIHVzZXIgZGV0YWlscyBzaG93biBpbiBtb2RlbCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxsLWNvbnRhaW5lci1tb2RlbCBwLTMgdGV4dC13aGl0ZSBtb2RlbC1jb250ZW50IGNhbGwtY29udGFpbmVyXCIgKm5nSWY9XCJpc0NsaWNrRXhwYW5kXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgdXNlci1pbmZvLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG15LTNcIj5cclxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtd2hpdGVcIj5DMkMgLVBPSU5UIHt7c2VsZWN0ZWRVc2VySW5mbz8ucG9pbnROYW1lfX08L2gzPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cInRleHQtd2hpdGUgbWItMVwiPk5hbWU6PC9oNT5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cInRleHQtd2hpdGUgdXNlck5hbWVcIj57e3NlbGVjdGVkVXNlckluZm8/Lm5hbWV9fTwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZi0xM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5OdW1iZXI6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj57e3NlbGVjdGVkVXNlckluZm8/Lm51bWJlcn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj5FeHRlbnNpb246PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5leHRlbnNpb259fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+RW1haWw6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7c2VsZWN0ZWRVc2VySW5mbz8uZW1haWx9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+U3ViamVjdDo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTIgc3ViamVjdC10ZXh0XCIgdGl0bGU9XCJ7e3NlbGVjdGVkVXNlckluZm8/LnN1YmplY3R9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzZWxlY3RlZFVzZXJJbmZvPy5zdWJqZWN0fX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMiBtYi0xXCI+SW1hZ2U6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFVzZXJJbmZvPy5pbWFnZSAmJiBzZWxlY3RlZFVzZXJJbmZvPy5pbWFnZSAhPT0gJy0nOyBlbHNlIG5vSW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cInt7c2VsZWN0ZWRVc2VySW5mbz8uaW1hZ2V9fVwiIGFsdD1cIlwiIHdpZHRoPVwiMTUwXCIgY2xhc3M9XCJtbC0yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ltYWdlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiPk5vIEltYWdlIEF2YWlsYWJsZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPk1lc3NhZ2U6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jb250YWluZXJcIiBbY2xhc3MuZXhwYW5kZWRdPVwiaXNFeHBhbmRlZFwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ubWVzc2FnZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRvZ2dsZS1idG5cIiAqbmdJZj1cInNob3dCdXR0b25cIiAoY2xpY2spPVwidG9nZ2xlVGV4dCgpXCI+e3sgaXNFeHBhbmRlZCA/ICdTZWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzJyA6ICdTZWUgbW9yZScgfX08L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+UG9pbnQgTmFtZTo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPnt7c2VsZWN0ZWRVc2VySW5mbz8ucG9pbnROYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMVwiPlNvdXJjZSBOYW1lOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tzZWxlY3RlZFVzZXJJbmZvPy5zb3VyY2VOYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gY29udGFjdCBsaXN0IHBhbmVsIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnRhY3RzLXBhbmVsXCIgKm5nSWY9XCJzaG93Q29udGFjdHNQYW5lbFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgPGRpdj5QYXJ0aWNpcGFudDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICA8cD48L3A+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZGlhbC1jbG9zZS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ29udGFjdHNQYW5lbCh7fSwgdHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNHB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMwMDAwMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJtMjU2LTIwMC01Ni01NiAyMjQtMjI0LTIyNC0yMjQgNTYtNTYgMjI0IDIyNCAyMjQtMjI0IDU2IDU2LTIyNCAyMjQgMjI0IDIyNC01NiA1Ni0yMjQtMjI0LTIyNCAyMjRaXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU0VBUkNIIElOUFVUICh2aXNpYmxlIHdoZW4gaXNTZWFyY2hWaXNpYmxlID0gdHJ1ZSkgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1iYXIgcC0zIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCIgKGlucHV0KT1cImFwcGx5RmlsdGVyKClcIiAvPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWNvbnRhY3RzLWxpc3RcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZmlsdGVyZWRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiICpuZ0lmPVwic2VhcmNoVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiBbc3JjXT1cImM/LmltZyB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZydcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tjPy5maXJzdE5hbWV9fSB7e2M/Lm1pZGRsZU5hbWV9fSB7e2M/Lmxhc3ROYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgKGM/Lm51bWJlcnNMaXN0ICYmIGM/Lm51bWJlcnNMaXN0WzBdPy5udW1iZXIpfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0biBtci0yXCIgKGNsaWNrKT1cImNhbGxDb250YWN0KGMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWM/LklzQ29ubmVjdGVkXCIgdGl0bGU9XCJBZGQgdG8gY29uZmVyZW5jZSBjYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuXCIgKGNsaWNrKT1cIkNhbGxUb1Vuc2F2ZWROdW1iZXIoYz8ubnVtYmVyc0xpc3RbMF0/Lm51bWJlciwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYz8uSXNDb25uZWN0ZWRcIiB0aXRsZT1cIk5ldyBDYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpbHRlcmVkTGlzdC5sZW5ndGggJiYgaXNEaXJlY3RDYWxsT3B0aW9uU2hvdyAmJiBzZWFyY2hUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIiBbc3JjXT1cIidhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3sgc2VhcmNoVGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRhY3QtY2FsbC1idG4gY29udGFjdC1hZGQtYnRuIG1yLTJcIiAoY2xpY2spPVwiQ2FsbFRvVW5zYXZlZE51bWJlcihzZWFyY2hUZXh0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkFkZCB0byBjb25mZXJlbmNlIGNhbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBhZGQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRhY3QtY2FsbC1idG5cIiAoY2xpY2spPVwiQ2FsbFRvVW5zYXZlZE51bWJlcihzZWFyY2hUZXh0LCB0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIk5ldyBDYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1saXN0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0wIHRpdGxlXCI+SW4gVGhpcyBDYWxsPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxociBjbGFzcz1cIm1iLTIgbXQtMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCIhYz8uaXNMZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImM/LnRvID09ICdjbGllbnQnIGVsc2UgcGFydGljaXBlbnRJbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjb250YWN0LWF2YXRhclwiIFtzcmNdPVwiYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LW5hbWVcIj5Zb3VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIj57eyBjPy5mcm9tIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWljLWJ0biBtci0yXCIgW2Rpc2FibGVkXT1cImM/LmhvbGRcIiAoY2xpY2spPVwib25NdXRlVXNlcihjKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJjPy5pc011dGVcIj4gbWljX29mZiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFjPy5pc011dGVcIj4gbWljIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdCBtci0yXCIgW25nQ2xhc3NdPVwieyAnb24taG9sZCc6IGM/LmhvbGQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ib2xkQ2FsbChjKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgW3RpdGxlXT1cIiFjPy5ob2xkID8gJ0hvbGQnIDogJ1Jlc3VtZSdcIj4gcGhvbmVfcGF1c2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChjLCBmYWxzZSwgdHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BhcnRpY2lwZW50SW5mbz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNvbnRhY3QtYXZhdGFyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiYz8uZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIDogYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tjPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnID8gYz8udG9OYW1lIHx8ICdVbmtub3duJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYz8uZnJvbU5hbWUgfHwgJ1Vua25vd24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtdGl0bGVcIiAqbmdJZj1cImM/LnRvICE9ICdjMmNfc29mdHBob25lX2NsaWVudCdcIj57eyBjPy5kaXJlY3Rpb24gPT1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3V0Z29pbmctY2FsbCcgPyBjPy50byB8fCAnVW5rbm93bicgOiBjPy5mcm9tIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24nfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCIgKm5nSWY9XCJjPy50byA9PSAnYzJjX3NvZnRwaG9uZV9jbGllbnQnXCI+e3sgYz8uZnJvbSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmtub3duJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgKm5nSWY9XCJjPy5mcm9tID09IGhvc3RudW1iZXI/LmZyb20gJiYgYz8udG8gPT0gJ2MyY19zb2Z0cGhvbmVfY2xpZW50J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLWxhYmVsXCI+T3JnYW5pemVyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWljLWJ0biBtci0yXCIgW2Rpc2FibGVkXT1cImM/LmhvbGRcIiAoY2xpY2spPVwib25NdXRlVXNlcihjKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgKm5nSWY9XCJjPy5pc011dGVcIj4gbWljX29mZiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFjPy5pc011dGVcIj4gbWljIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWhvbGQtY29udGFjdCBtci0yXCIgW25nQ2xhc3NdPVwieyAnb24taG9sZCc6IGM/LmhvbGQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ib2xkQ2FsbChjKVwiICpuZ0lmPVwiYz8udG8gIT0gJ2MyY19zb2Z0cGhvbmVfY2xpZW50J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgW3RpdGxlXT1cIiFjPy5ob2xkID8gJ0hvbGQnIDogJ1Jlc3VtZSdcIj4gcGhvbmVfcGF1c2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29uZmVyZW5jZS1jb250YWN0XCIgKGNsaWNrKT1cIm9uRW5kQ2FsbChjLCBmYWxzZSwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjPy50byAhPSAnYzJjX3NvZnRwaG9uZV9jbGllbnQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiB0aXRsZT1cIkNhbGwgRW5kXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb25mZXJlbmNlLWNvbnRhY3RcIiAoY2xpY2spPVwiZW5kQ29uZmVyZW5lY2VDYWxsKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjPy50byA9PSAnYzJjX3NvZnRwaG9uZV9jbGllbnQnICYmIGRldmljZU51bWJlckxpc3QuaW5jbHVkZXMoYz8uZnJvbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHRpdGxlPVwiQ2FsbCBFbmRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJtLTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgcHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCB0aXRsZVwiPlBhcnRpY2lwYW50IGFkZGVkIHRvIHRoZSBjYWxsPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxociBjbGFzcz1cIm1iLTIgbXQtMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkUGFydGljaXBlbnRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pdGVtXCIgKm5nSWY9XCJjPy5pc0xlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29udGFjdC1hdmF0YXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImMuZGlyZWN0aW9uID09ICdvdXRnb2luZy1jYWxsJyA/IGM/LnRvSW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnIDogYz8uZnJvbUltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tjLmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50b05hbWUgOiBjPy5mcm9tTmFtZSB8fCAnVW5rbm93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LXRpdGxlXCI+e3tjLmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50byA6IGM/LmZyb219fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250YWN0LWNhbGwtYnRuIGNvbnRhY3QtYWRkLWJ0biBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiQ2FsbFRvVW5zYXZlZE51bWJlcihjLmRpcmVjdGlvbiA9PSAnb3V0Z29pbmctY2FsbCcgPyBjPy50byA6IGM/LmZyb20pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBhZGQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+QWRkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1pbi1jYWxsLWNvbnRhaW5lclwiICpuZ0lmPVwiaXNNaW5pbWlzZWRcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBmdWxsc2NyZWVuXCIgKGNsaWNrKT1cIm1heGltaXNlRGlhbHBhZCgpXCI+IG9wZW5faW5fZnVsbCA8L3NwYW4+XHJcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgd2lkdGg6IDEwMCVcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLWNhbGwtYW5pbWF0aW9uXCIgaWQ9XCJjYWxsLWF2YXRhclwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cIm1pbi1hdmF0YXItaW1nXCIgW3NyY109XCJjYWxsRGF0YS5pbWdcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLWNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tjYWxsRGF0YS5uYW1lfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDBcIj57e2NhbGxEYXRhLmRpc3BsYXlOdW0gPyBjYWxsRGF0YS5kaXNwbGF5TnVtIDogY2FsbERhdGEucGhvbmUgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWluLWJ0bi1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXRpbWVyXCI+e3t0aW1lcn19PC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1pbi1jYWxsLXNlYy1idG5cIiAoY2xpY2spPVwidG9nZ2xlTXV0ZSgpXCIgW2Rpc2FibGVkXT1cImRpc2JhbGVFbmRDYWxsQnRuXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiICpuZ0lmPVwiaXNNdXRlXCI+IG1pY19vZmYgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiAqbmdJZj1cIiFpc011dGVcIj4gbWljIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWluLWNhbGwtYnRuIGVuZC1jYWxsLWJ0blwiIFtkaXNhYmxlZF09XCJkaXNiYWxlRW5kQ2FsbEJ0blwiIChjbGljayk9XCJlbmRDYWxsKClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+IGNhbGxfZW5kIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPCEtLSBDYWxsIERpc2Nvbm5lY3QgTW9kYWwgLS0+XHJcbjxkaXYgY2xhc3M9XCJjdXN0b20tbW9kYWxcIiAqbmdJZj1cInNob3dEaXNjb25uZWN0TW9kYWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50IHAtM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0cy1oZWFkZXIgcC0wIHBiLTJcIj5cclxuICAgICAgICAgICAgPGg0IGNsYXNzPVwidGl0bGUgbWItMFwiPkNhbGwgRGlzY29ubmVjdGVkPC9oND5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInNob3dEaXNjb25uZWN0TW9kYWwgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwMDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIm0yNTYtMjAwLTU2LTU2IDIyNC0yMjQtMjI0LTIyNCA1Ni01NiAyMjQgMjI0IDIyNC0yMjQgNTYgNTYtMjI0IDIyNCAyMjQgMjI0LTU2IDU2LTIyNC0yMjQtMjI0IDIyNFpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFudC1ib2R5IG1iLTJcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICBFeGl0aW5nIHRoaXMgY2FsbCB3aWxsIG5vdCBlbmQgdGhlIGNvbmZlcmVuY2UuIFRoZSBzZXNzaW9uIHdpbGwgY29udGludWUsIGFuZCBjaGFyZ2VzIHdpbGwgaW5jdXIgdG9cclxuICAgICAgICAgICAgICAgIHlvdXJcclxuICAgICAgICAgICAgICAgIGFjY291bnQuXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN0YXJ0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMCBtci0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiaXNSZWFzb25DaGVja2VkXCIgY2xhc3M9XCJtZS0yXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0aW1lXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHJlYXNvblwiIFsobmdNb2RlbCldPVwibGVhdmVSZWFzb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNSZWFzb25DaGVja2VkXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gZW5kLWJ0blwiIChjbGljayk9XCJsZWF2ZUNvbmZlcmVuY2UoKVwiPlxyXG4gICAgICAgICAgICAgICAgTGVhdmVcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gZW5kLWJ0blwiIChjbGljayk9XCJlbmRDb25mZXJlbmNlKClcIj5cclxuICAgICAgICAgICAgICAgIEVuZCBBbGxcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|