@hivegpt/hiveai-angular 0.0.186 → 0.0.189
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/bundles/hivegpt-hiveai-angular.umd.js +1980 -1983
- package/bundles/hivegpt-hiveai-angular.umd.js.map +1 -1
- package/bundles/hivegpt-hiveai-angular.umd.min.js +1 -1
- package/bundles/hivegpt-hiveai-angular.umd.min.js.map +1 -1
- package/environments/environment.d.ts +14 -14
- package/environments/environment.d.ts.map +1 -1
- package/esm2015/environments/environment.js +15 -15
- package/esm2015/hivegpt-hiveai-angular.js +10 -10
- package/esm2015/lib/components/NotificationSocket.js +39 -39
- package/esm2015/lib/components/chat-drawer/chat-drawer.component.js +1116 -1116
- package/esm2015/lib/components/chatbot/chatbot.component.js +50 -50
- package/esm2015/lib/components/conversation.service.js +45 -45
- package/esm2015/lib/components/socket-service.service.js +69 -72
- package/esm2015/lib/components/video-player/video-player.component.js +123 -123
- package/esm2015/lib/hivegpt.module.js +19 -19
- package/esm2015/lib/models/video.js +2 -2
- package/esm2015/lib/pipes/safe-html.pipe.js +19 -19
- package/esm2015/lib/utils/utils.js +36 -36
- package/esm2015/public-api.js +7 -7
- package/fesm2015/hivegpt-hiveai-angular.js +1478 -1481
- package/fesm2015/hivegpt-hiveai-angular.js.map +1 -1
- package/hivegpt-hiveai-angular.d.ts +9 -9
- package/hivegpt-hiveai-angular.d.ts.map +1 -1
- package/hivegpt-hiveai-angular.metadata.json +1 -1
- package/lib/components/NotificationSocket.d.ts +4 -4
- package/lib/components/NotificationSocket.d.ts.map +1 -1
- package/lib/components/chat-drawer/chat-drawer.component.d.ts +185 -185
- package/lib/components/chat-drawer/chat-drawer.component.d.ts.map +1 -1
- package/lib/components/chatbot/chatbot.component.d.ts +35 -35
- package/lib/components/chatbot/chatbot.component.d.ts.map +1 -1
- package/lib/components/conversation.service.d.ts +12 -12
- package/lib/components/conversation.service.d.ts.map +1 -1
- package/lib/components/socket-service.service.d.ts +18 -18
- package/lib/components/socket-service.service.d.ts.map +1 -1
- package/lib/components/video-player/video-player.component.d.ts +35 -35
- package/lib/components/video-player/video-player.component.d.ts.map +1 -1
- package/lib/hivegpt.module.d.ts +2 -2
- package/lib/hivegpt.module.d.ts.map +1 -1
- package/lib/models/video.d.ts +34 -34
- package/lib/models/video.d.ts.map +1 -1
- package/lib/pipes/safe-html.pipe.d.ts +7 -7
- package/lib/pipes/safe-html.pipe.d.ts.map +1 -1
- package/lib/utils/utils.d.ts +2 -2
- package/lib/utils/utils.d.ts.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +3 -3
- package/public-api.d.ts.map +1 -1
|
@@ -1,1116 +1,1116 @@
|
|
|
1
|
-
// import { Platform } from '@angular/cdk/platform';
|
|
2
|
-
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|
3
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild, ViewChildren, } from '@angular/core';
|
|
4
|
-
import { DomSanitizer } from '@angular/platform-browser';
|
|
5
|
-
import { of } from 'rxjs';
|
|
6
|
-
import { catchError, switchMap } from 'rxjs/operators';
|
|
7
|
-
import { formatNow, formatTimeStamps } from '../../utils/utils';
|
|
8
|
-
import { dev_environment, prod_environment } from '../../../environments/environment';
|
|
9
|
-
import { ConversationService } from '../conversation.service';
|
|
10
|
-
import { SocketService } from '../socket-service.service';
|
|
11
|
-
export class ChatDrawerComponent {
|
|
12
|
-
constructor(cdr, http, sanitizer, elementRef, renderer, socketService, conversation
|
|
13
|
-
// private platform: Platform
|
|
14
|
-
) {
|
|
15
|
-
this.cdr = cdr;
|
|
16
|
-
this.http = http;
|
|
17
|
-
this.sanitizer = sanitizer;
|
|
18
|
-
this.elementRef = elementRef;
|
|
19
|
-
this.renderer = renderer;
|
|
20
|
-
this.socketService = socketService;
|
|
21
|
-
this.conversation = conversation;
|
|
22
|
-
this.bodyOverflowClass = 'body-overflow-hidden';
|
|
23
|
-
this.isCollapsedTrue = false;
|
|
24
|
-
this.copilotName = "HiveXGPT";
|
|
25
|
-
this.feedbackEvent = new EventEmitter();
|
|
26
|
-
this.onCloseEvent = new EventEmitter();
|
|
27
|
-
this.openPage = new EventEmitter();
|
|
28
|
-
this.sessionActions = new EventEmitter();
|
|
29
|
-
this.closeBot = new EventEmitter();
|
|
30
|
-
this.connectWithUser = new EventEmitter();
|
|
31
|
-
this.scheduleMeeting = new EventEmitter();
|
|
32
|
-
this.autogenKey = "Autogen_eDJTtEU-NB0RtIpzq1w";
|
|
33
|
-
this.addToMyAgendaAction = "add_to_my_agenda";
|
|
34
|
-
this.myUpcomingSessionAction = "my_upcomming_session";
|
|
35
|
-
this.connectOrFollowAction = "connect_or_follow";
|
|
36
|
-
this.aiResponse = '';
|
|
37
|
-
this.chatLog = [];
|
|
38
|
-
this.decoder = new TextDecoder();
|
|
39
|
-
this.feedbackDone = false;
|
|
40
|
-
this.greetingMsg = '';
|
|
41
|
-
this.hasBackdropValue = false;
|
|
42
|
-
this.input = '';
|
|
43
|
-
this.listenerAdded = false;
|
|
44
|
-
this.loading = false;
|
|
45
|
-
this.mode = 'over';
|
|
46
|
-
this.quickPrompts = [];
|
|
47
|
-
this.thumbsDownMsgIndex = 0;
|
|
48
|
-
this.userName = '';
|
|
49
|
-
this.showStartAgain = false;
|
|
50
|
-
this.isIOSDevice = false;
|
|
51
|
-
this.showFeedBackIconsIndex = null;
|
|
52
|
-
this.temperature = 1;
|
|
53
|
-
this.speakers = [];
|
|
54
|
-
this.executionPathImages = [];
|
|
55
|
-
this.searchTerms = [];
|
|
56
|
-
this.financialGraphs = [];
|
|
57
|
-
this.isChatingWithAi = false;
|
|
58
|
-
this.readAllChunks = (stream) => {
|
|
59
|
-
const reader = stream.getReader();
|
|
60
|
-
const allSuggestions = [];
|
|
61
|
-
reader.closed.catch((err) => {
|
|
62
|
-
if (err) {
|
|
63
|
-
console.error('Error reading stream: ', err);
|
|
64
|
-
}
|
|
65
|
-
this.isChatingWithAi = false;
|
|
66
|
-
this.scrollToBottom();
|
|
67
|
-
return;
|
|
68
|
-
});
|
|
69
|
-
return new ReadableStream({
|
|
70
|
-
start: (controller) => {
|
|
71
|
-
return this.pump(controller, reader, allSuggestions);
|
|
72
|
-
},
|
|
73
|
-
});
|
|
74
|
-
};
|
|
75
|
-
this.isDropdownOpen = false;
|
|
76
|
-
this.selectedAgents = [];
|
|
77
|
-
this.allSelected = false;
|
|
78
|
-
this.isCollapsed = false;
|
|
79
|
-
this.isCollapsedForGraph = false;
|
|
80
|
-
this.isCollapsedForFGraph = false;
|
|
81
|
-
/*Related*/
|
|
82
|
-
this.relatedListItems = [];
|
|
83
|
-
/*End Related*/
|
|
84
|
-
this.sourcesList = [];
|
|
85
|
-
this.displayedSources = []; // First 3 cards
|
|
86
|
-
this.remainingSources = []; // Remaining items
|
|
87
|
-
// [
|
|
88
|
-
// {
|
|
89
|
-
// "title": "AI News January 2024: In-Depth and Concise - The AI Track",
|
|
90
|
-
// "desc": "Each month, we compile significant news, trends, and happenings in AI, providing detailed summaries with key points in bullet form for concise yet complete understanding.",
|
|
91
|
-
// "link": "https://theaitrack.com/ai-news-january-2024/"
|
|
92
|
-
// },
|
|
93
|
-
// {
|
|
94
|
-
// "title": "Top AI News, January 2024 - Everypixel Journal",
|
|
95
|
-
// "desc": "In this monthly roundup, we spotlight the top AI news stories from January, including the OpenAI vs. The New York Times Lawsuit.",
|
|
96
|
-
// "link": "https://journal.everypixel.com/top-ai-news-january-2024"
|
|
97
|
-
// },
|
|
98
|
-
// {
|
|
99
|
-
// "title": "AI News July 2024: In-Depth and Concise - The AI Track",
|
|
100
|
-
// "desc": "This page features AI News for July 2024, highlighting significant events such as Canva acquiring Leonardo AI.",
|
|
101
|
-
// "link": "https://theaitrack.com/ai-news-july-2024-in-depth-and-concise/"
|
|
102
|
-
// },
|
|
103
|
-
// {
|
|
104
|
-
// "title": "January news roundup: What's new in the world of AI? - Pluralsight",
|
|
105
|
-
// "desc": "OpenAI’s new GPT store, business-ready ChatGPT plans, and a predicted rise in AI-powered cybercrime.",
|
|
106
|
-
// "link": "https://www.pluralsight.com/resources/blog/data/ai-this-month-january-2024"
|
|
107
|
-
// },
|
|
108
|
-
// {
|
|
109
|
-
// "title": "AI News August 2024: In-Depth and Concise - The AI Track",
|
|
110
|
-
// "desc": "This page features AI News for August 2024, with highlights such as Nvidia delaying the “Blackwell” B200 AI chips delivery.",
|
|
111
|
-
// "link": "https://theaitrack.com/ai-news-august-2024-in-depth-and-concise-duplicate/"
|
|
112
|
-
// }
|
|
113
|
-
// ]
|
|
114
|
-
this.dateTime = { now: new Date().toISOString() };
|
|
115
|
-
this.isDrawerOpen = true;
|
|
116
|
-
this.chatMain = new ElementRef(null);
|
|
117
|
-
// if (this.platform.IOS) {
|
|
118
|
-
// this.isIOSDevice = true;
|
|
119
|
-
// }
|
|
120
|
-
}
|
|
121
|
-
ngOnInit() {
|
|
122
|
-
this.environment = this.isDev ? dev_environment : prod_environment;
|
|
123
|
-
// this.fetchMyConnections().subscribe();
|
|
124
|
-
// this.fetchPendingRequests().subscribe();
|
|
125
|
-
this.changeTemperature(this.temperature);
|
|
126
|
-
this.fetchBotConfig().subscribe((res) => {
|
|
127
|
-
this.cdr.markForCheck();
|
|
128
|
-
this.fetchChatHistory().subscribe((response) => {
|
|
129
|
-
this.loading = false;
|
|
130
|
-
this.mapChatHistory(response);
|
|
131
|
-
this.cdr.markForCheck();
|
|
132
|
-
}, (err) => {
|
|
133
|
-
console.error('Error fetching chat history:', err);
|
|
134
|
-
});
|
|
135
|
-
}, (err) => {
|
|
136
|
-
console.error('Error fetching chat history:', err);
|
|
137
|
-
});
|
|
138
|
-
this.fetchAgents();
|
|
139
|
-
this.cdr.markForCheck();
|
|
140
|
-
this.initializeSocket();
|
|
141
|
-
setTimeout(() => {
|
|
142
|
-
this.listenSockets();
|
|
143
|
-
}, 200);
|
|
144
|
-
}
|
|
145
|
-
initializeSocket() {
|
|
146
|
-
;
|
|
147
|
-
const conversation_id = this.conversation.getKey(this.botId);
|
|
148
|
-
this.socketService.registerUserSpecificHiveSocket(this.botId, conversation_id);
|
|
149
|
-
}
|
|
150
|
-
listenSockets() {
|
|
151
|
-
this.eventSubscription = this.conversation
|
|
152
|
-
.getUserSpecificNotification()
|
|
153
|
-
.subscribe((res) => {
|
|
154
|
-
var _a, _b, _c, _d;
|
|
155
|
-
// Check if OtherFields exists in the response
|
|
156
|
-
if ((_a = res === null || res === void 0 ? void 0 : res.m) === null || _a === void 0 ? void 0 : _a.OtherFields) {
|
|
157
|
-
const { conversation_id, bot_id, answer, web_results, financial_graphs, execution_graphs, online_search_terms, suggestions } = (_b = res === null || res === void 0 ? void 0 : res.m) === null || _b === void 0 ? void 0 : _b.OtherFields;
|
|
158
|
-
// Handle the fields based on their presence
|
|
159
|
-
if (answer) {
|
|
160
|
-
this.isChatingWithAi = false;
|
|
161
|
-
console.log('Answer:', answer);
|
|
162
|
-
this.chatLog.push({
|
|
163
|
-
type: 'ai',
|
|
164
|
-
message: this.processMessageForDisplay(answer),
|
|
165
|
-
time: formatNow(this.timezone),
|
|
166
|
-
});
|
|
167
|
-
this.showFeedBackIconsIndex = this.chatLog.length - 1;
|
|
168
|
-
this.cdr.markForCheck();
|
|
169
|
-
this.scrollToBottom();
|
|
170
|
-
}
|
|
171
|
-
if (web_results && Array.isArray(web_results)) {
|
|
172
|
-
console.log('Web Results:', web_results);
|
|
173
|
-
this.sourcesList = web_results;
|
|
174
|
-
this.displayedSources = (_c = this.sourcesList) === null || _c === void 0 ? void 0 : _c.slice(0, 3); // First 3 cards
|
|
175
|
-
this.remainingSources = (_d = this.sourcesList) === null || _d === void 0 ? void 0 : _d.slice(3); // Remaining items
|
|
176
|
-
this.cdr.detectChanges();
|
|
177
|
-
}
|
|
178
|
-
if (financial_graphs && Array.isArray(financial_graphs)) {
|
|
179
|
-
console.log('Financial Graphs:', financial_graphs);
|
|
180
|
-
this.financialGraphs = financial_graphs;
|
|
181
|
-
this.cdr.detectChanges();
|
|
182
|
-
}
|
|
183
|
-
if (execution_graphs && Array.isArray(execution_graphs)) {
|
|
184
|
-
console.log('Execution Graphs:', execution_graphs);
|
|
185
|
-
// Process execution graphs as needed
|
|
186
|
-
this.executionPathImages = execution_graphs;
|
|
187
|
-
this.cdr.detectChanges();
|
|
188
|
-
}
|
|
189
|
-
if (online_search_terms && Array.isArray(online_search_terms)) {
|
|
190
|
-
console.log('Online Search Terms:', online_search_terms);
|
|
191
|
-
this.searchTerms = online_search_terms;
|
|
192
|
-
this.cdr.detectChanges();
|
|
193
|
-
// Process online search terms as needed
|
|
194
|
-
}
|
|
195
|
-
if (suggestions && Array.isArray(suggestions)) {
|
|
196
|
-
console.log('suggestions:', suggestions);
|
|
197
|
-
this.relatedListItems = suggestions;
|
|
198
|
-
this.cdr.detectChanges();
|
|
199
|
-
// Process online search terms as needed
|
|
200
|
-
}
|
|
201
|
-
// Add any other fields and their processing here
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
console.warn('OtherFields is missing in the response');
|
|
205
|
-
}
|
|
206
|
-
}, (err) => {
|
|
207
|
-
this.eventSubscription.unsubscribe();
|
|
208
|
-
console.error('Error in fetching data from socket', err);
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
initializeSocketAndListen() {
|
|
212
|
-
}
|
|
213
|
-
handleEvent(data, type) {
|
|
214
|
-
switch (type) {
|
|
215
|
-
case 'webresult':
|
|
216
|
-
break;
|
|
217
|
-
case 'answer':
|
|
218
|
-
break;
|
|
219
|
-
case 'graph':
|
|
220
|
-
break;
|
|
221
|
-
default:
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
ngOnDestroy() {
|
|
226
|
-
if (this.eventSubscription) {
|
|
227
|
-
this.eventSubscription.unsubscribe();
|
|
228
|
-
}
|
|
229
|
-
//this.socketService.close();
|
|
230
|
-
}
|
|
231
|
-
changeTemperature(newTemperature) {
|
|
232
|
-
if (this.loading)
|
|
233
|
-
return;
|
|
234
|
-
this.temperature = newTemperature;
|
|
235
|
-
const wrapper = document.querySelector('.hivegpt-chat-wrapper');
|
|
236
|
-
// Remove existing theme classes from body
|
|
237
|
-
wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.remove('creative', 'balanced', 'precise');
|
|
238
|
-
switch (newTemperature) {
|
|
239
|
-
case 0:
|
|
240
|
-
wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('creative');
|
|
241
|
-
break;
|
|
242
|
-
case 1:
|
|
243
|
-
wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('balanced');
|
|
244
|
-
break;
|
|
245
|
-
case 2:
|
|
246
|
-
wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('precise');
|
|
247
|
-
break;
|
|
248
|
-
default:
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
onStartAgain() {
|
|
253
|
-
if (this.loading)
|
|
254
|
-
return;
|
|
255
|
-
this.showStartAgain = false;
|
|
256
|
-
this.chatLog = [];
|
|
257
|
-
this.chatLog.push({
|
|
258
|
-
type: 'ai',
|
|
259
|
-
message: this.greetingMsg ||
|
|
260
|
-
this.processMessage("Greetings! I'm your COP28 virtual assistant. Have questions about the event? I'm here to help."),
|
|
261
|
-
time: formatNow(this.timezone),
|
|
262
|
-
});
|
|
263
|
-
this.archieveMessages().subscribe();
|
|
264
|
-
}
|
|
265
|
-
archieveMessages() {
|
|
266
|
-
const headers = new HttpHeaders({
|
|
267
|
-
'Content-Type': 'application/json',
|
|
268
|
-
'x-api-key': this.apiKey,
|
|
269
|
-
});
|
|
270
|
-
const url = `${this.environment.BASE_URL}/bot/clear-history/${this.botId}/${this.userId}`;
|
|
271
|
-
return this.http.post(url, {}, { headers }).pipe(switchMap((res) => {
|
|
272
|
-
return of(res);
|
|
273
|
-
}), catchError((error) => {
|
|
274
|
-
return of(null);
|
|
275
|
-
}));
|
|
276
|
-
}
|
|
277
|
-
fetchBotConfig() {
|
|
278
|
-
this.loading = true;
|
|
279
|
-
const url = `${this.environment.BASE_URL}/bots?bot_id=${this.botId}`;
|
|
280
|
-
return this.http.get(url).pipe(switchMap((res) => {
|
|
281
|
-
var _a;
|
|
282
|
-
this.botName = res.Name;
|
|
283
|
-
this.botIcon = res.Icon;
|
|
284
|
-
this.botSkills = res === null || res === void 0 ? void 0 : res.Skills;
|
|
285
|
-
this.greetingMsg = res.Greeting;
|
|
286
|
-
this.thumbsDownMessages = ((_a = res === null || res === void 0 ? void 0 : res.NegativeResponses) === null || _a === void 0 ? void 0 : _a.length) ? res.NegativeResponses
|
|
287
|
-
: [
|
|
288
|
-
"We are sorry we've not been able to answer your question.<br/> However, our dedicated support team is happy to help. <span class='feedback-link' style='cursor: pointer; text-decoration: underline; font-weight: 700; color: #17235B;'>Please click here</span> and a human agent will assist you as soon as possible",
|
|
289
|
-
];
|
|
290
|
-
this.quickPrompts = res.QuickPrompts;
|
|
291
|
-
this.cdr.markForCheck();
|
|
292
|
-
this.loading = false;
|
|
293
|
-
return of(res);
|
|
294
|
-
}), catchError((error) => {
|
|
295
|
-
console.error('Error fetching chatbot config: ', error);
|
|
296
|
-
this.loading = false;
|
|
297
|
-
return of(null);
|
|
298
|
-
}));
|
|
299
|
-
}
|
|
300
|
-
fetchChatHistory() {
|
|
301
|
-
this.loading = true;
|
|
302
|
-
this.conversationKey = this.conversation.getKey(this.botId);
|
|
303
|
-
const url = `${this.environment.BASE_URL}/conversations/${this.conversationKey}`;
|
|
304
|
-
const headers = new HttpHeaders({
|
|
305
|
-
'accept': 'application/json'
|
|
306
|
-
});
|
|
307
|
-
return this.http.get(url, { headers }).pipe(catchError(this.handleError('fetchConversation')));
|
|
308
|
-
}
|
|
309
|
-
handleError(operation = 'operation', result) {
|
|
310
|
-
return (error) => {
|
|
311
|
-
console.error(`${operation} failed: ${error.message}`);
|
|
312
|
-
return of(result);
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
// fetchChatHistory() {
|
|
316
|
-
// this.loading = true;
|
|
317
|
-
// const headers = new HttpHeaders({
|
|
318
|
-
// 'Content-Type': 'application/json',
|
|
319
|
-
// 'x-api-key': this.apiKey,
|
|
320
|
-
// });
|
|
321
|
-
// return this.http
|
|
322
|
-
// .get(`${this.environment.BASE_URL}/conversations/${this.conversationKey}`, { headers })
|
|
323
|
-
// .pipe(
|
|
324
|
-
// switchMap((res: any) => {
|
|
325
|
-
// this.loading = false;
|
|
326
|
-
// return of(res);
|
|
327
|
-
// }),
|
|
328
|
-
// catchError((error: any) => {
|
|
329
|
-
// console.error('Error fetching chat history: ', error);
|
|
330
|
-
// this.loading = false;
|
|
331
|
-
// return of(null);
|
|
332
|
-
// })
|
|
333
|
-
// );
|
|
334
|
-
// }
|
|
335
|
-
mapChatHistory(chats) {
|
|
336
|
-
var _a;
|
|
337
|
-
this.chatLog.push({
|
|
338
|
-
type: 'ai',
|
|
339
|
-
message: this.greetingMsg ||
|
|
340
|
-
this.processMessage("Greetings! I'm your COP28 virtual assistant. Have questions about the event? I'm here to help."),
|
|
341
|
-
time: formatNow(this.timezone),
|
|
342
|
-
});
|
|
343
|
-
if (chats && ((_a = chats === null || chats === void 0 ? void 0 : chats.Messages) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
344
|
-
chats === null || chats === void 0 ? void 0 : chats.Messages.forEach((chat) => {
|
|
345
|
-
if (chat.Type == "user") {
|
|
346
|
-
this.chatLog.push({
|
|
347
|
-
type: 'user',
|
|
348
|
-
message: this.processMessageForDisplay(chat.Text),
|
|
349
|
-
time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
|
|
350
|
-
copied: false,
|
|
351
|
-
isCollapsedTrue: false
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
if (chat.Type == "ai") {
|
|
355
|
-
this.chatLog.push({
|
|
356
|
-
type: 'ai',
|
|
357
|
-
message: this.processMessageForDisplay(chat.Text),
|
|
358
|
-
time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
|
|
359
|
-
copied: false,
|
|
360
|
-
isCollapsedTrue: false
|
|
361
|
-
});
|
|
362
|
-
this.showFeedBackIconsIndex = this.chatLog.length - 1;
|
|
363
|
-
}
|
|
364
|
-
});
|
|
365
|
-
this.showStartAgain = true;
|
|
366
|
-
}
|
|
367
|
-
this.scrollToBottom();
|
|
368
|
-
this.cdr.markForCheck();
|
|
369
|
-
}
|
|
370
|
-
processMessage(message) {
|
|
371
|
-
if (!message || !((message === null || message === void 0 ? void 0 : message.length) > 0)) {
|
|
372
|
-
return '';
|
|
373
|
-
}
|
|
374
|
-
// console.log('here is my message')
|
|
375
|
-
// console.log(message);
|
|
376
|
-
message = message.trim();
|
|
377
|
-
const markdownLinkRegex = /\[([^[]+)]\(([^)]+)\)/g;
|
|
378
|
-
const urlRegex = /(?<!href=")\bhttps?:\/\/\S+(?<![.,])/gi;
|
|
379
|
-
if (markdownLinkRegex.test(message)) {
|
|
380
|
-
const html = message.replace(markdownLinkRegex, '<a href="$2" target="_blank">$1</a>');
|
|
381
|
-
//console.log('Sanitized message: ', message);
|
|
382
|
-
return this.sanitizeHtml(html);
|
|
383
|
-
}
|
|
384
|
-
if (urlRegex.test(message)) {
|
|
385
|
-
const html = message.replace(urlRegex, '<a href="$&" target="_blank">$&</a>');
|
|
386
|
-
// console.log('Sanitized message: ', message);
|
|
387
|
-
return this.sanitizeHtml(html);
|
|
388
|
-
}
|
|
389
|
-
message = message.replace(/(?:\r\n|\r|\n)/g, '<br>');
|
|
390
|
-
message = message.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
|
|
391
|
-
// Convert Markdown headers to HTML headers
|
|
392
|
-
message = message.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
|
|
393
|
-
const level = hashes.length;
|
|
394
|
-
return `<h${level}>${text}</h${level}>`;
|
|
395
|
-
});
|
|
396
|
-
this.cdr.markForCheck();
|
|
397
|
-
const sanitizedMessage = this.sanitizeHtml(message);
|
|
398
|
-
return sanitizedMessage;
|
|
399
|
-
}
|
|
400
|
-
ngAfterViewChecked() {
|
|
401
|
-
const feedbackLinks = this.elementRef.nativeElement.querySelectorAll('.feedback-link');
|
|
402
|
-
feedbackLinks.forEach((link) => {
|
|
403
|
-
link.addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
|
|
404
|
-
});
|
|
405
|
-
// if (this.elementRef.nativeElement.querySelector('.feedback-link')) {
|
|
406
|
-
// this.elementRef.nativeElement
|
|
407
|
-
// .querySelector('.feedback-link')
|
|
408
|
-
// .addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
|
|
409
|
-
// }
|
|
410
|
-
}
|
|
411
|
-
sanitizeHtml(html) {
|
|
412
|
-
return this.sanitizer.bypassSecurityTrustHtml(html);
|
|
413
|
-
}
|
|
414
|
-
onFeedbackClick(value) {
|
|
415
|
-
this.feedbackEvent.emit(value);
|
|
416
|
-
}
|
|
417
|
-
onClose() {
|
|
418
|
-
this.renderer.removeClass(document.body, this.bodyOverflowClass);
|
|
419
|
-
this.onCloseEvent.emit();
|
|
420
|
-
}
|
|
421
|
-
sendMessageWithTile(prompt) {
|
|
422
|
-
this.input = prompt;
|
|
423
|
-
this.fetchData();
|
|
424
|
-
this.scrollToBottom();
|
|
425
|
-
}
|
|
426
|
-
fetchData() {
|
|
427
|
-
var _a;
|
|
428
|
-
this.input = (_a = this.input) === null || _a === void 0 ? void 0 : _a.trim();
|
|
429
|
-
if (!this.input || this.loading) {
|
|
430
|
-
return;
|
|
431
|
-
}
|
|
432
|
-
this.chatLog.push({
|
|
433
|
-
type: 'user',
|
|
434
|
-
message: this.processMessageForDisplay(this.input),
|
|
435
|
-
time: formatNow(this.timezone),
|
|
436
|
-
copied: false,
|
|
437
|
-
isCollapsedTrue: false
|
|
438
|
-
});
|
|
439
|
-
this.cdr.markForCheck();
|
|
440
|
-
this.aiResponse = '';
|
|
441
|
-
this.isChatingWithAi = true;
|
|
442
|
-
const url = `${this.environment.BASE_URL}/ai/ask`; // +
|
|
443
|
-
// (this.useOpenAi === false ? '/llm-hf' : '');
|
|
444
|
-
fetch(url, {
|
|
445
|
-
method: 'POST',
|
|
446
|
-
headers: {
|
|
447
|
-
'Content-Type': 'application/json',
|
|
448
|
-
'x-api-key': this.apiKey,
|
|
449
|
-
},
|
|
450
|
-
body: JSON.stringify({
|
|
451
|
-
user_question: this.input,
|
|
452
|
-
user_id: this.userId,
|
|
453
|
-
bot_id: this.botId,
|
|
454
|
-
// temperature: this.temperature,
|
|
455
|
-
// event_id: this.eventId,
|
|
456
|
-
// token: this.s27UserToken,
|
|
457
|
-
agents: this.agents.filter(p => p.selected).map(p => p.id),
|
|
458
|
-
conversation_id: this.conversationKey
|
|
459
|
-
}),
|
|
460
|
-
})
|
|
461
|
-
// Retrieve its body as ReadableStream
|
|
462
|
-
.then((response) => {
|
|
463
|
-
//return this.readAllChunks(response.body);
|
|
464
|
-
return of(null);
|
|
465
|
-
})
|
|
466
|
-
.catch((err) => {
|
|
467
|
-
console.error('Err: ', err);
|
|
468
|
-
this.isChatingWithAi = false;
|
|
469
|
-
});
|
|
470
|
-
this.input = '';
|
|
471
|
-
}
|
|
472
|
-
fetchDataFor(msg) {
|
|
473
|
-
const inputMsg = msg === null || msg === void 0 ? void 0 : msg.trim();
|
|
474
|
-
if (!inputMsg || this.loading) {
|
|
475
|
-
return;
|
|
476
|
-
}
|
|
477
|
-
this.scrollToBottom();
|
|
478
|
-
this.chatLog.push({
|
|
479
|
-
type: 'user',
|
|
480
|
-
message: this.processMessageForDisplay(inputMsg),
|
|
481
|
-
time: formatNow(this.timezone),
|
|
482
|
-
copied: false,
|
|
483
|
-
isCollapsedTrue: false
|
|
484
|
-
});
|
|
485
|
-
this.cdr.markForCheck();
|
|
486
|
-
this.aiResponse = '';
|
|
487
|
-
this.isChatingWithAi = true;
|
|
488
|
-
const url = `${this.environment.BASE_URL}/ai/ask`; // +
|
|
489
|
-
// (this.useOpenAi === false ? '/llm-hf' : '');
|
|
490
|
-
fetch(url, {
|
|
491
|
-
method: 'POST',
|
|
492
|
-
headers: {
|
|
493
|
-
'Content-Type': 'application/json',
|
|
494
|
-
'x-api-key': this.apiKey,
|
|
495
|
-
},
|
|
496
|
-
body: JSON.stringify({
|
|
497
|
-
user_question: inputMsg,
|
|
498
|
-
user_id: this.userId,
|
|
499
|
-
bot_id: this.botId,
|
|
500
|
-
// temperature: this.temperature,
|
|
501
|
-
// event_id: this.eventId,
|
|
502
|
-
// token: this.s27UserToken,
|
|
503
|
-
agents: this.agents.filter(p => p.selected).map(p => p.id),
|
|
504
|
-
conversation_id: this.conversationKey
|
|
505
|
-
}),
|
|
506
|
-
})
|
|
507
|
-
// Retrieve its body as ReadableStream
|
|
508
|
-
.then((response) => {
|
|
509
|
-
return this.readAllChunks(response.body);
|
|
510
|
-
})
|
|
511
|
-
.catch((err) => {
|
|
512
|
-
console.error('Err: ', err);
|
|
513
|
-
this.isChatingWithAi = false;
|
|
514
|
-
});
|
|
515
|
-
this.input = '';
|
|
516
|
-
}
|
|
517
|
-
fetchSmallTalk() {
|
|
518
|
-
this.loading = true;
|
|
519
|
-
this.cdr.markForCheck();
|
|
520
|
-
const url = `${this.environment.BASE_URL}/bot/small-talk/${this.botId}/${this.userId}`;
|
|
521
|
-
this.http
|
|
522
|
-
.get(url, {
|
|
523
|
-
headers: {
|
|
524
|
-
'x-api-key': this.apiKey,
|
|
525
|
-
},
|
|
526
|
-
})
|
|
527
|
-
.pipe(catchError((error) => {
|
|
528
|
-
console.error('Error while fetching small talk:', error);
|
|
529
|
-
return of(null);
|
|
530
|
-
}))
|
|
531
|
-
.subscribe((response) => {
|
|
532
|
-
this.loading = false;
|
|
533
|
-
this.cdr.markForCheck();
|
|
534
|
-
if (!response) {
|
|
535
|
-
return;
|
|
536
|
-
}
|
|
537
|
-
if (response && response.smallTalk) {
|
|
538
|
-
this.chatLog.push({
|
|
539
|
-
type: 'ai',
|
|
540
|
-
message: this.processMessage(response.smallTalk),
|
|
541
|
-
time: formatNow(this.timezone),
|
|
542
|
-
isFeedbackMsg: true,
|
|
543
|
-
});
|
|
544
|
-
this.showFeedBackIconsIndex = this.chatLog.length - 2;
|
|
545
|
-
// this.scrollToBottom();
|
|
546
|
-
this.cdr.markForCheck();
|
|
547
|
-
}
|
|
548
|
-
});
|
|
549
|
-
}
|
|
550
|
-
pump(controller, reader, allSuggestions) {
|
|
551
|
-
reader.read().then(({ done, value }) => {
|
|
552
|
-
var _a, _b, _c, _d;
|
|
553
|
-
const lastItem = this.chatLog[this.chatLog.length - 1];
|
|
554
|
-
if (done) {
|
|
555
|
-
lastItem.message = this.processMessageForDisplay(lastItem.message);
|
|
556
|
-
this.chatLog.pop();
|
|
557
|
-
this.chatLog.push(lastItem);
|
|
558
|
-
if (allSuggestions === null || allSuggestions === void 0 ? void 0 : allSuggestions.length) {
|
|
559
|
-
this.chatLog.push({
|
|
560
|
-
type: 'suggestions',
|
|
561
|
-
suggestions: allSuggestions
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
controller.close();
|
|
565
|
-
this.isChatingWithAi = false;
|
|
566
|
-
// this.scrollToBottom();
|
|
567
|
-
this.cdr.markForCheck();
|
|
568
|
-
this.showStartAgain = true;
|
|
569
|
-
// setTimeout(() => {
|
|
570
|
-
// this.fetchSmallTalk();
|
|
571
|
-
// },1000)
|
|
572
|
-
return;
|
|
573
|
-
}
|
|
574
|
-
let decodedChunk = this.decoder.decode(value, { stream: true });
|
|
575
|
-
this.aiResponse += decodedChunk;
|
|
576
|
-
if (lastItem.type === 'ai') {
|
|
577
|
-
const suggestionsMatch = this.aiResponse.match(/<sug>(.*?)<\/sug>/g);
|
|
578
|
-
if (suggestionsMatch) {
|
|
579
|
-
suggestionsMatch.forEach((match) => {
|
|
580
|
-
this.aiResponse = this.aiResponse.replace(match, "");
|
|
581
|
-
allSuggestions.push(match === null || match === void 0 ? void 0 : match.replace(/<\/?sug>/g, ""));
|
|
582
|
-
});
|
|
583
|
-
}
|
|
584
|
-
lastItem.message = this.aiResponse;
|
|
585
|
-
this.cdr.markForCheck();
|
|
586
|
-
}
|
|
587
|
-
else {
|
|
588
|
-
this.isChatingWithAi = false;
|
|
589
|
-
let aiFormattedData;
|
|
590
|
-
try {
|
|
591
|
-
console.log('parsing json ');
|
|
592
|
-
aiFormattedData = JSON.parse(JSON.parse(this.aiResponse));
|
|
593
|
-
}
|
|
594
|
-
catch (e) {
|
|
595
|
-
try {
|
|
596
|
-
console.log('parsing json 2');
|
|
597
|
-
aiFormattedData = JSON.parse(this.aiResponse);
|
|
598
|
-
}
|
|
599
|
-
catch (e) { }
|
|
600
|
-
}
|
|
601
|
-
console.log('parsing json done');
|
|
602
|
-
if (aiFormattedData && ((_a = aiFormattedData === null || aiFormattedData === void 0 ? void 0 : aiFormattedData.section_id) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
|
603
|
-
if (aiFormattedData.section_id == 'company_search' || aiFormattedData.section_id == 'user_search' || aiFormattedData.section_id == 'industry_company_search') {
|
|
604
|
-
this.fetchMyConnections().subscribe();
|
|
605
|
-
this.fetchPendingRequests().subscribe();
|
|
606
|
-
}
|
|
607
|
-
if (aiFormattedData.section_id == this.myUpcomingSessionAction) {
|
|
608
|
-
var speakerIds = [];
|
|
609
|
-
(_b = aiFormattedData.content) === null || _b === void 0 ? void 0 : _b.forEach(session => {
|
|
610
|
-
speakerIds = [...speakerIds, ...session.speakers];
|
|
611
|
-
});
|
|
612
|
-
if ((speakerIds === null || speakerIds === void 0 ? void 0 : speakerIds.length) > 0)
|
|
613
|
-
this.getSpeakersByStaffIds(speakerIds);
|
|
614
|
-
}
|
|
615
|
-
if (aiFormattedData.section_id == this.addToMyAgendaAction && ((_c = aiFormattedData.content) === null || _c === void 0 ? void 0 : _c.length) > 0) {
|
|
616
|
-
this.openPage.next({
|
|
617
|
-
sectionId: aiFormattedData.section_id,
|
|
618
|
-
sessionIds: aiFormattedData.content
|
|
619
|
-
});
|
|
620
|
-
}
|
|
621
|
-
if (aiFormattedData.section_id == this.connectOrFollowAction) {
|
|
622
|
-
let usersLen = (_d = aiFormattedData.content) === null || _d === void 0 ? void 0 : _d.length;
|
|
623
|
-
if (usersLen > 1) {
|
|
624
|
-
this.openPage.next({
|
|
625
|
-
sectionId: "open_networking_drawer",
|
|
626
|
-
search: aiFormattedData.content
|
|
627
|
-
});
|
|
628
|
-
}
|
|
629
|
-
else if (usersLen == 1) {
|
|
630
|
-
this.openPage.next({
|
|
631
|
-
sectionId: aiFormattedData.section_id,
|
|
632
|
-
connetUserIds: [aiFormattedData.content[0].userId]
|
|
633
|
-
});
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
if (aiFormattedData.is_open_page == "true") {
|
|
637
|
-
this.openPage.next({
|
|
638
|
-
sectionId: aiFormattedData.section_id,
|
|
639
|
-
search: aiFormattedData.content
|
|
640
|
-
});
|
|
641
|
-
if (this.isMobileBrowser()) {
|
|
642
|
-
aiFormattedData.message += "\n\n" + '<a id="closeBotNow">Click Here</a> to see results.';
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
this.chatLog.push({
|
|
646
|
-
type: 'ai',
|
|
647
|
-
message: aiFormattedData.message,
|
|
648
|
-
action: aiFormattedData,
|
|
649
|
-
time: formatNow(this.timezone)
|
|
650
|
-
});
|
|
651
|
-
if (this.isMobileBrowser()) {
|
|
652
|
-
setTimeout(() => {
|
|
653
|
-
this.addCloseBotClickEvent();
|
|
654
|
-
}, 500);
|
|
655
|
-
}
|
|
656
|
-
this.aiResponse = "";
|
|
657
|
-
}
|
|
658
|
-
else {
|
|
659
|
-
this.chatLog.push({
|
|
660
|
-
type: 'ai',
|
|
661
|
-
message: this.aiResponse,
|
|
662
|
-
time: formatNow(this.timezone),
|
|
663
|
-
});
|
|
664
|
-
}
|
|
665
|
-
this.showFeedBackIconsIndex = this.chatLog.length - 1;
|
|
666
|
-
this.cdr.markForCheck();
|
|
667
|
-
}
|
|
668
|
-
this.scrollToBottom();
|
|
669
|
-
// Enqueue the next data chunk into our target stream
|
|
670
|
-
controller.enqueue(value);
|
|
671
|
-
this.pump(controller, reader, allSuggestions);
|
|
672
|
-
});
|
|
673
|
-
}
|
|
674
|
-
submitFeedback(flag) {
|
|
675
|
-
this.feedbackDone = true;
|
|
676
|
-
this.showFeedBackIconsIndex = null;
|
|
677
|
-
const url = `${this.environment.BASE_URL}/bot/feedback`;
|
|
678
|
-
fetch(url, {
|
|
679
|
-
method: 'POST',
|
|
680
|
-
headers: {
|
|
681
|
-
'Content-Type': 'application/json',
|
|
682
|
-
'x-api-key': this.apiKey,
|
|
683
|
-
},
|
|
684
|
-
body: JSON.stringify({ flag, user_id: this.userId, bot_id: this.botId }),
|
|
685
|
-
}).then(() => {
|
|
686
|
-
if (flag) {
|
|
687
|
-
this.chatLog.push({
|
|
688
|
-
type: 'ai',
|
|
689
|
-
message: this.thumbsUpMessage ||
|
|
690
|
-
`Great. May I assist you with anything else?`,
|
|
691
|
-
time: formatNow(this.timezone),
|
|
692
|
-
isFeedbackMsg: true,
|
|
693
|
-
});
|
|
694
|
-
this.scrollToBottom();
|
|
695
|
-
this.cdr.markForCheck();
|
|
696
|
-
this.feedbackDone = false;
|
|
697
|
-
this.showFeedBackIconsIndex = null;
|
|
698
|
-
return;
|
|
699
|
-
}
|
|
700
|
-
this.chatLog.push({
|
|
701
|
-
type: 'ai',
|
|
702
|
-
message: this.processMessage(this.thumbsDownMessages[this.thumbsDownMsgIndex]),
|
|
703
|
-
time: formatNow(this.timezone),
|
|
704
|
-
isFeedbackMsg: true,
|
|
705
|
-
});
|
|
706
|
-
this.thumbsDownMsgIndex =
|
|
707
|
-
(this.thumbsDownMsgIndex + 1) % this.thumbsDownMessages.length;
|
|
708
|
-
this.scrollToBottom();
|
|
709
|
-
this.cdr.markForCheck();
|
|
710
|
-
this.feedbackDone = false;
|
|
711
|
-
this.showFeedBackIconsIndex = null;
|
|
712
|
-
});
|
|
713
|
-
}
|
|
714
|
-
handleSubmit() {
|
|
715
|
-
this.fetchData();
|
|
716
|
-
this.scrollToBottom();
|
|
717
|
-
}
|
|
718
|
-
handleUpClick(idx) {
|
|
719
|
-
if (this.feedbackDone) {
|
|
720
|
-
return;
|
|
721
|
-
}
|
|
722
|
-
this.submitFeedback(true);
|
|
723
|
-
this.chatLog[idx].liked = !this.chatLog[idx].liked;
|
|
724
|
-
if (this.chatLog[idx].unliked) {
|
|
725
|
-
this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
|
|
726
|
-
}
|
|
727
|
-
this.cdr.markForCheck();
|
|
728
|
-
}
|
|
729
|
-
handleDownClick(idx) {
|
|
730
|
-
if (this.feedbackDone)
|
|
731
|
-
return;
|
|
732
|
-
this.submitFeedback(false);
|
|
733
|
-
this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
|
|
734
|
-
if (this.chatLog[idx].liked)
|
|
735
|
-
this.chatLog[idx].liked = !this.chatLog[idx].liked;
|
|
736
|
-
}
|
|
737
|
-
handleCopyClick(index) {
|
|
738
|
-
// Copy the message to the clipboard
|
|
739
|
-
const contentToCopy = this.chatLog[index].message;
|
|
740
|
-
navigator.clipboard.writeText(contentToCopy).then(() => {
|
|
741
|
-
// Indicate that the message was copied
|
|
742
|
-
this.chatLog[index].copied = true;
|
|
743
|
-
this.cdr.detectChanges();
|
|
744
|
-
// Reset the copied state after a delay
|
|
745
|
-
setTimeout(() => {
|
|
746
|
-
this.chatLog[index].copied = false;
|
|
747
|
-
this.cdr.detectChanges();
|
|
748
|
-
}, 2000); // Reset after 2 seconds
|
|
749
|
-
});
|
|
750
|
-
}
|
|
751
|
-
scrollToBottom() {
|
|
752
|
-
let counter = 0;
|
|
753
|
-
const interval = setInterval(() => {
|
|
754
|
-
this.chatMain.nativeElement.scrollTop =
|
|
755
|
-
this.chatMain.nativeElement.scrollHeight;
|
|
756
|
-
if (counter++ > 5)
|
|
757
|
-
clearInterval(interval);
|
|
758
|
-
}, 5);
|
|
759
|
-
}
|
|
760
|
-
handleAction(action) {
|
|
761
|
-
console.info("incoming action from the chatbot AI");
|
|
762
|
-
console.info(action);
|
|
763
|
-
if (action === null || action === void 0 ? void 0 : action.content) {
|
|
764
|
-
}
|
|
765
|
-
}
|
|
766
|
-
ngAfterViewInit() {
|
|
767
|
-
// Check if the drawer is initially open and apply overflow hidden to body if so
|
|
768
|
-
if (this.drawer.opened) {
|
|
769
|
-
this.setBodyOverflow();
|
|
770
|
-
}
|
|
771
|
-
// Listen to changes in the drawer being opened or closed
|
|
772
|
-
this.drawer.openedChange.subscribe((opened) => {
|
|
773
|
-
if (opened) {
|
|
774
|
-
this.setBodyOverflow();
|
|
775
|
-
}
|
|
776
|
-
else {
|
|
777
|
-
this.removeBodyOverflow();
|
|
778
|
-
}
|
|
779
|
-
});
|
|
780
|
-
this.drawer.openedChange.subscribe((opened) => {
|
|
781
|
-
if (opened) {
|
|
782
|
-
setTimeout(() => {
|
|
783
|
-
if (this.myTextarea && this.myTextarea.nativeElement) {
|
|
784
|
-
this.myTextarea.nativeElement.focus(); // Focus on the textarea
|
|
785
|
-
}
|
|
786
|
-
});
|
|
787
|
-
}
|
|
788
|
-
});
|
|
789
|
-
}
|
|
790
|
-
setBodyOverflow() {
|
|
791
|
-
this.renderer.addClass(document.body, this.bodyOverflowClass);
|
|
792
|
-
}
|
|
793
|
-
removeBodyOverflow() {
|
|
794
|
-
this.renderer.removeClass(document.body, this.bodyOverflowClass);
|
|
795
|
-
}
|
|
796
|
-
getSpeakersByStaffIds(ids) {
|
|
797
|
-
const url = `${this.environment.USERS_API}/events/${this.eventId}/users/get-by-staff-ids`;
|
|
798
|
-
fetch(url, {
|
|
799
|
-
method: 'POST',
|
|
800
|
-
headers: {
|
|
801
|
-
'Content-Type': 'application/json',
|
|
802
|
-
'Authorization': "Bearer " + "your_token_here",
|
|
803
|
-
},
|
|
804
|
-
body: JSON.stringify(ids),
|
|
805
|
-
})
|
|
806
|
-
.then((response) => {
|
|
807
|
-
if (response.ok) {
|
|
808
|
-
return response.json(); // Parse the JSON body of the response
|
|
809
|
-
}
|
|
810
|
-
else {
|
|
811
|
-
throw new Error('Network response was not ok.');
|
|
812
|
-
}
|
|
813
|
-
})
|
|
814
|
-
.then((data) => {
|
|
815
|
-
if ((data === null || data === void 0 ? void 0 : data.length) > 0) {
|
|
816
|
-
data.forEach(speaker => {
|
|
817
|
-
this.speakers[speaker.id] = speaker;
|
|
818
|
-
});
|
|
819
|
-
this.cdr.markForCheck();
|
|
820
|
-
}
|
|
821
|
-
})
|
|
822
|
-
.catch((err) => {
|
|
823
|
-
console.error('Error fetching data:', err);
|
|
824
|
-
this.loading = false;
|
|
825
|
-
});
|
|
826
|
-
}
|
|
827
|
-
performSessionAction(sessionId, action) {
|
|
828
|
-
this.sessionActions.next({
|
|
829
|
-
sessionId,
|
|
830
|
-
action
|
|
831
|
-
});
|
|
832
|
-
}
|
|
833
|
-
addCloseBotClickEvent() {
|
|
834
|
-
const element = this.elementRef.nativeElement.querySelector('#closeBotNow');
|
|
835
|
-
if (element) {
|
|
836
|
-
this.renderer.listen(element, 'click', () => {
|
|
837
|
-
this.closeBot.next();
|
|
838
|
-
});
|
|
839
|
-
}
|
|
840
|
-
}
|
|
841
|
-
isMobileBrowser() {
|
|
842
|
-
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
843
|
-
}
|
|
844
|
-
connectToUser(userId) {
|
|
845
|
-
this.connectWithUser.emit({
|
|
846
|
-
connect: !this.canDisconnect(userId),
|
|
847
|
-
userId
|
|
848
|
-
});
|
|
849
|
-
setTimeout(() => {
|
|
850
|
-
this.fetchMyConnections().subscribe(res => {
|
|
851
|
-
this.cdr.markForCheck();
|
|
852
|
-
});
|
|
853
|
-
this.fetchPendingRequests().subscribe(res => {
|
|
854
|
-
this.cdr.markForCheck();
|
|
855
|
-
});
|
|
856
|
-
}, 500);
|
|
857
|
-
}
|
|
858
|
-
scheduleMeetingWithUser(user) {
|
|
859
|
-
this.scheduleMeeting.emit(user);
|
|
860
|
-
}
|
|
861
|
-
canConnect(userId) {
|
|
862
|
-
return !(this.canDisconnect(userId) || this.pendingRequests.find(a => a == userId));
|
|
863
|
-
}
|
|
864
|
-
canDisconnect(userId) {
|
|
865
|
-
return this.myConnections.find(conn => conn.userId == userId);
|
|
866
|
-
}
|
|
867
|
-
fetchPendingRequests() {
|
|
868
|
-
const headers = new HttpHeaders({
|
|
869
|
-
'Content-Type': 'application/json',
|
|
870
|
-
'apiKey': this.autogenKey
|
|
871
|
-
});
|
|
872
|
-
return this.http
|
|
873
|
-
.get(`${this.environment.USERS_API}/events/${this.eventId}/connection-requests/autogen/pending-sent-requests?userId=${this.userId}`, { headers })
|
|
874
|
-
.pipe(switchMap((res) => {
|
|
875
|
-
this.pendingRequests = res;
|
|
876
|
-
this.cdr.markForCheck();
|
|
877
|
-
return of(res);
|
|
878
|
-
}), catchError((error) => {
|
|
879
|
-
console.error('Error fetching pending requests: ', error);
|
|
880
|
-
return of(null);
|
|
881
|
-
}));
|
|
882
|
-
}
|
|
883
|
-
fetchMyConnections() {
|
|
884
|
-
const headers = new HttpHeaders({
|
|
885
|
-
'Content-Type': 'application/json',
|
|
886
|
-
'apiKey': this.autogenKey
|
|
887
|
-
});
|
|
888
|
-
return this.http
|
|
889
|
-
.get(`${this.environment.USERS_API}/events/${this.eventId}/users-connections/autogen?userId=${this.userId}`, { headers })
|
|
890
|
-
.pipe(switchMap((res) => {
|
|
891
|
-
this.myConnections = res;
|
|
892
|
-
this.cdr.markForCheck();
|
|
893
|
-
return of(res);
|
|
894
|
-
}), catchError((error) => {
|
|
895
|
-
console.error('Error fetching pending requests: ', error);
|
|
896
|
-
return of(null);
|
|
897
|
-
}));
|
|
898
|
-
}
|
|
899
|
-
// Toggle the dropdown visibility
|
|
900
|
-
toggleDropdown() {
|
|
901
|
-
this.isDropdownOpen = !this.isDropdownOpen;
|
|
902
|
-
}
|
|
903
|
-
onSelectAll(event) {
|
|
904
|
-
var _a;
|
|
905
|
-
(_a = this.agents) === null || _a === void 0 ? void 0 : _a.forEach(agent => agent.selected = false);
|
|
906
|
-
this.cdr.detectChanges();
|
|
907
|
-
}
|
|
908
|
-
onAgentChange(agent) {
|
|
909
|
-
//agent.selected = !agent.selected;
|
|
910
|
-
//console.log(agent);
|
|
911
|
-
let agentFound = this.agents.filter(p => p.id == agent.id);
|
|
912
|
-
if (agentFound && agentFound.length > 0) {
|
|
913
|
-
agentFound[0].selected = !agentFound[0].selected;
|
|
914
|
-
this.cdr.detectChanges();
|
|
915
|
-
}
|
|
916
|
-
this.cdr.detectChanges();
|
|
917
|
-
}
|
|
918
|
-
areAllSelected() {
|
|
919
|
-
var _a;
|
|
920
|
-
return (_a = this.agents) === null || _a === void 0 ? void 0 : _a.every(agent => !agent.selected);
|
|
921
|
-
}
|
|
922
|
-
getDropdownHeaderText() {
|
|
923
|
-
var _a;
|
|
924
|
-
const selectedAgents = (_a = this.agents) === null || _a === void 0 ? void 0 : _a.filter(agent => agent.selected);
|
|
925
|
-
if (selectedAgents && (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) === 0) {
|
|
926
|
-
return 'All Agents';
|
|
927
|
-
}
|
|
928
|
-
else {
|
|
929
|
-
return (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) > 1 ? `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agents Selected` : `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agent Selected`;
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
fetchAgents_http() {
|
|
933
|
-
this.loading = true;
|
|
934
|
-
const url = `${this.environment.AGENTS_API}/CoPilot/${this.botId}/active-agents`;
|
|
935
|
-
const headers = new HttpHeaders({
|
|
936
|
-
'Content-Type': 'application/json'
|
|
937
|
-
});
|
|
938
|
-
return this.http.post(url, {}, { headers }).pipe(switchMap((res) => {
|
|
939
|
-
if (res) {
|
|
940
|
-
this.agents = res.map(agent => (Object.assign(Object.assign({}, agent), { selected: false })));
|
|
941
|
-
}
|
|
942
|
-
this.cdr.markForCheck();
|
|
943
|
-
return of(res);
|
|
944
|
-
}), catchError((error) => {
|
|
945
|
-
console.error('Error fetching chatbot config: ', error);
|
|
946
|
-
return of(null);
|
|
947
|
-
}));
|
|
948
|
-
}
|
|
949
|
-
fetchAgents() {
|
|
950
|
-
this.fetchAgents_http()
|
|
951
|
-
.subscribe();
|
|
952
|
-
}
|
|
953
|
-
// events/${eventId}/users-connections
|
|
954
|
-
processMessageForDisplay(markdown) {
|
|
955
|
-
if (!markdown || !(markdown.length > 0)) {
|
|
956
|
-
console.error('Input Markdown is null or empty');
|
|
957
|
-
return '';
|
|
958
|
-
}
|
|
959
|
-
//console.log('Markdown input:', markdown);
|
|
960
|
-
// Convert Markdown headers to HTML headers
|
|
961
|
-
let html = markdown.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
|
|
962
|
-
const level = hashes.length;
|
|
963
|
-
return `<h${level}>${text}</h${level}>`;
|
|
964
|
-
});
|
|
965
|
-
// console.log('After header conversion:', html);
|
|
966
|
-
// Convert Markdown links to HTML links
|
|
967
|
-
html = html.replace(/\[([^\]]+)]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
|
|
968
|
-
// console.log('After link conversion:', html);
|
|
969
|
-
// Convert Markdown bold to HTML strong
|
|
970
|
-
html = html.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
|
|
971
|
-
//console.log('After bold conversion:', html);
|
|
972
|
-
// Convert new lines to <br> tags
|
|
973
|
-
html = html.replace(/(?:\r\n|\r|\n)/g, '<br>');
|
|
974
|
-
// console.log('After line breaks conversion:', html);
|
|
975
|
-
// Optional: Sanitize the HTML to prevent XSS
|
|
976
|
-
const sanitizedHtml = this.sanitizeHtml(html);
|
|
977
|
-
// console.log('Sanitized HTML:', sanitizedHtml);
|
|
978
|
-
return sanitizedHtml;
|
|
979
|
-
}
|
|
980
|
-
toggleCollapse() {
|
|
981
|
-
this.isCollapsed = !this.isCollapsed;
|
|
982
|
-
this.cdr.detectChanges();
|
|
983
|
-
}
|
|
984
|
-
toggleCollapseGraph() {
|
|
985
|
-
this.isCollapsedForGraph = !this.isCollapsedForGraph;
|
|
986
|
-
this.cdr.detectChanges();
|
|
987
|
-
}
|
|
988
|
-
toggleCollapseFGraph() {
|
|
989
|
-
this.isCollapsedForFGraph = !this.isCollapsedForFGraph;
|
|
990
|
-
this.cdr.detectChanges();
|
|
991
|
-
}
|
|
992
|
-
// Extracts the domain from a URL
|
|
993
|
-
getDomainName(url) {
|
|
994
|
-
try {
|
|
995
|
-
const { hostname } = new URL(url);
|
|
996
|
-
return hostname.replace(/^www\./, ''); // Remove 'www.' if present
|
|
997
|
-
}
|
|
998
|
-
catch (_a) {
|
|
999
|
-
return 'unknown';
|
|
1000
|
-
}
|
|
1001
|
-
}
|
|
1002
|
-
// Generates the favicon URL
|
|
1003
|
-
getFaviconUrl(url) {
|
|
1004
|
-
const domain = this.getDomainName(url);
|
|
1005
|
-
return `https://www.google.com/s2/favicons?sz=128&domain=${domain}`;
|
|
1006
|
-
}
|
|
1007
|
-
onCardClick() {
|
|
1008
|
-
this.sourcesDrawer.open();
|
|
1009
|
-
const button = document.getElementById('botcloseplaygroundbutton');
|
|
1010
|
-
if (button) {
|
|
1011
|
-
button.style.display = 'none';
|
|
1012
|
-
}
|
|
1013
|
-
}
|
|
1014
|
-
onCloseSource() {
|
|
1015
|
-
this.sourcesDrawer.close();
|
|
1016
|
-
this.isDrawerOpen = false;
|
|
1017
|
-
this.cdr.detectChanges(); // Trigger change detection if needed
|
|
1018
|
-
this.onDrawerClosed();
|
|
1019
|
-
}
|
|
1020
|
-
onDrawerClosed() {
|
|
1021
|
-
setTimeout(() => {
|
|
1022
|
-
this.isDrawerOpen = true;
|
|
1023
|
-
this.cdr.detectChanges(); // Trigger change detection if needed
|
|
1024
|
-
// Use ngClass to dynamically apply the class
|
|
1025
|
-
const button = document.getElementById('botcloseplaygroundbutton');
|
|
1026
|
-
if (button) {
|
|
1027
|
-
button.style.display = 'block';
|
|
1028
|
-
}
|
|
1029
|
-
}, 1000);
|
|
1030
|
-
}
|
|
1031
|
-
toggleDrawer(todo) {
|
|
1032
|
-
this.isDrawerOpen = todo;
|
|
1033
|
-
this.cdr.detectChanges();
|
|
1034
|
-
this.updateButtonVisibility();
|
|
1035
|
-
}
|
|
1036
|
-
updateButtonVisibility() {
|
|
1037
|
-
const button = document.getElementById('botcloseplaygroundbutton');
|
|
1038
|
-
if (button) {
|
|
1039
|
-
button.style.display = this.isDrawerOpen ? 'block' : 'none';
|
|
1040
|
-
}
|
|
1041
|
-
}
|
|
1042
|
-
openLinkInNewTab(link) {
|
|
1043
|
-
window.open(link, '_blank');
|
|
1044
|
-
}
|
|
1045
|
-
}
|
|
1046
|
-
ChatDrawerComponent.decorators = [
|
|
1047
|
-
{ type: Component, args: [{
|
|
1048
|
-
selector: 'hivegpt-chat-drawer',
|
|
1049
|
-
template: "<mat-drawer-container class=\"hivegpt-chat-wrapper\" [ngClass]=\"{'mat-drawer-container-has-open': isDrawerOpen}\"\r\n [class.ios-device]=\"isIOSDevice\" [hasBackdrop]=\"hasBackdropValue\">\r\n\r\n <mat-drawer class=\"drawer\" #drawer [position]=\"'start'\" [mode]=\"'over'\" opened=\"true\"\r\n [class.full-width-drawer]=\"fullView\" [style.background]=\"\r\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\r\n \">\r\n <mat-drawer-content>\r\n\r\n <div class=\"chat-main\">\r\n <!-- <div class=\"chat-header\">\r\n <h2> -->\r\n <!-- {{eventName}} -->\r\n <!-- </h2> -->\r\n <!-- <button class=\"closeIcon\" (click)=\"onClose()\">\r\n <span class=\"material-symbols-outlined\">\r\n close\r\n </span>\r\n </button> -->\r\n <!-- </div> -->\r\n\r\n <div class=\"innerChat\" #chatMain>\r\n <div class=\"\">\r\n <div class=\"title\">\r\n <h2><span> {{botName}} <i><svg width=\"30\" height=\"30\" viewBox=\"0 0 106 105\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M52.8578 104.318C52.8645 104.32 52.8713 104.323 52.878 104.325V104.311C74.7711 96.9781 115.49 69.0948 103.537 16.0875C79.9227 8.17267 59.9557 2.08167 52.878 0.0118542V0C52.8713 0.0019722 52.8645 0.00394726 52.8578 0.00592613C52.851 0.00394726 52.8442 0.0019722 52.8375 0V0.0118542C45.7599 2.08167 25.7928 8.17267 2.17802 16.0875C-9.77459 69.0948 30.9444 96.9781 52.8375 104.311V104.325C52.8442 104.323 52.851 104.32 52.8578 104.318Z\"\r\n fill=\"#E2F6FA\"></path>\r\n <path\r\n d=\"M52.8409 95.3002V9.02441C58.6643 10.7266 75.2028 15.7706 94.7694 22.3286C104.66 66.1922 70.9382 89.2528 52.8409 95.3002Z\"\r\n fill=\"url(#paint0_linear_174_9166)\"></path>\r\n <rect x=\"63.725\" y=\"21.0347\" width=\"2.275\" height=\"29.6903\" rx=\"1.1375\"\r\n transform=\"rotate(-73.8316 63.725 21.0347)\"\r\n fill=\"url(#paint1_linear_174_9166)\"></rect>\r\n <path\r\n d=\"M52.8745 95.3002V9.02441C47.0511 10.7266 30.5127 15.7706 10.9461 22.3286C1.0553 66.1922 34.7772 89.2528 52.8745 95.3002Z\"\r\n fill=\"url(#paint2_linear_174_9166)\"></path>\r\n <path\r\n d=\"M67.1131 34.3431L43.2493 56.165C41.5673 57.7031 41.5085 60.3337 43.1202 61.9454L68.0846 86.9097C69.4975 88.3227 71.7364 88.4762 73.3289 87.2693L89.8566 74.7444C90.8029 74.0273 91.3817 72.9269 91.4364 71.7409L91.7769 64.3639C91.8163 63.5106 91.5814 62.667 91.1067 61.9568L73.138 35.0723C71.7767 33.0355 68.9209 32.6899 67.1131 34.3431Z\"\r\n fill=\"url(#paint3_linear_174_9166)\"></path>\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M68.6302 31.8839C69.0923 31.6059 69.6441 31.5177 70.1698 31.6379C70.6955 31.758 71.1542 32.0771 71.4497 32.5282L73.5143 35.6772C73.7834 36.0886 73.8986 36.5818 73.8394 37.0698C73.7803 37.5579 73.5506 38.0093 73.191 38.3445L73.1848 38.3528L73.1556 38.3799L73.0367 38.4905L72.5675 38.9388C69.9711 41.4572 67.4535 44.0555 65.0183 46.7299C60.4366 51.7683 54.9958 58.3624 51.3338 64.7604C50.3119 66.5456 47.8157 66.9293 46.335 65.3882L32.8111 51.3366C32.6173 51.1352 32.466 50.8968 32.3661 50.6357C32.2663 50.3746 32.2199 50.0961 32.2298 49.8168C32.2398 49.5374 32.3057 49.2629 32.4239 49.0095C32.542 48.7562 32.7098 48.5292 32.9175 48.342L37.0049 44.6549C37.3641 44.3311 37.8247 44.1422 38.3078 44.1205C38.7909 44.0988 39.2666 44.2457 39.6534 44.5361L46.554 49.71C57.3335 39.0806 63.4459 35.0016 68.6302 31.8839Z\"\r\n fill=\"url(#paint4_linear_174_9166)\"></path>\r\n <defs>\r\n <linearGradient id=\"paint0_linear_174_9166\" x1=\"74.6954\" y1=\"9.02441\"\r\n x2=\"74.6954\" y2=\"95.3002\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#6EC6E3\"></stop>\r\n <stop offset=\"1\" stop-color=\"#5361C7\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint1_linear_174_9166\" x1=\"64.8625\" y1=\"21.0347\"\r\n x2=\"64.2597\" y2=\"43.0438\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"white\" stop-opacity=\"0.47\"></stop>\r\n <stop offset=\"1\" stop-color=\"white\" stop-opacity=\"0\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint2_linear_174_9166\" x1=\"31.02\" y1=\"9.02441\"\r\n x2=\"31.02\" y2=\"95.3002\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#5F8ED4\"></stop>\r\n <stop offset=\"1\" stop-color=\"#4F54C3\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint3_linear_174_9166\" x1=\"54.7875\" y1=\"42.5752\"\r\n x2=\"75.425\" y2=\"71.3377\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#5975CC\"></stop>\r\n <stop offset=\"1\" stop-color=\"#0043A6\" stop-opacity=\"0\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint4_linear_174_9166\" x1=\"40.8125\" y1=\"66.3502\"\r\n x2=\"73.8\" y2=\"66.3502\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#D0F0F7\"></stop>\r\n <stop offset=\"1\" stop-color=\"white\"></stop>\r\n </linearGradient>\r\n </defs>\r\n </svg></i> </span></h2>\r\n <p>AI-powered <span>copilot</span></p>\r\n </div>\r\n <div class=\"chatType\" style=\"display:none\">\r\n <h4 class=\"labelChat\">Choose a conversation style</h4>\r\n <ul>\r\n <li (click)=\"changeTemperature(0)\">\r\n <button [ngClass]=\"{active: temperature === 0}\">\r\n <span class=\"top-section-title\">\r\n More Creative\r\n </span>\r\n </button>\r\n </li>\r\n <li (click)=\"changeTemperature(1)\" class=\"fdssfd\">\r\n <button [ngClass]=\"{active: temperature === 1}\">\r\n <span class=\"top-section-title\">\r\n More Balanced\r\n </span>\r\n </button>\r\n </li>\r\n <li (click)=\"changeTemperature(2)\">\r\n <button [ngClass]=\"{active: temperature === 2}\">\r\n <span class=\"top-section-title\">\r\n More Precise\r\n </span>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <!-- chattype -->\r\n <div class=\"chat bot\" *ngFor=\"let chat of chatLog; let i = index\">\r\n\r\n <div class=\"chat-box\">\r\n <div class=\"message\">\r\n <div class=\"researchingCard\" *ngIf=\"showFeedBackIconsIndex === i\">\r\n <div *ngIf=\"(searchTerms && searchTerms.length>0) || (sourcesList && sourcesList.length >0)\"\r\n class=\"card-header d-flex align-items-center\" (click)=\"toggleCollapse()\">\r\n <span class=\"icon\"><i class=\"bx bx-plus-circle bx-sm\"></i></span>\r\n <span class=\"ml-2\">Researching <i id=\"toggleIcon\" class=\"toggle-icon ml-2 fa\"\r\n [ngClass]=\"{'fa-chevron-down': isCollapsed,'fa-chevron-up': !isCollapsed }\"></i></span>\r\n\r\n </div>\r\n <div *ngIf=\"searchTerms && searchTerms.length>0\"\r\n [ngClass]=\"{'collapse': isCollapsed}\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li *ngFor=\"let term of searchTerms\" class=\"list-group-item\">Searching for\r\n <strong>{{term}}</strong>\r\n </li>\r\n </ul>\r\n\r\n <h5 class=\"mt-2\" *ngIf=\"sourcesList && sourcesList.length >0\"><i\r\n class='bx bx-unite'></i> Sources</h5>\r\n <div class=\"sources-container\" *ngIf=\"sourcesList && sourcesList.length >0\">\r\n <div class=\"source-card\"\r\n *ngFor=\"let source of displayedSources; let i = index\">\r\n <div>\r\n <div class=\"source-title\">{{source.title}}</div>\r\n <div class=\"source-url\">\r\n <img class=\"relative block\" [src]=\"getFaviconUrl(source.link)\"\r\n [alt]=\"getDomainName(source.link) + ' favicon'\">\r\n {{getDomainName(source.link)}}\r\n </div>\r\n <div class=\"popup\">\r\n <div class=\"source-url\" (click)=\"openLinkInNewTab(source.link)\">\r\n <img class=\"relative block\"\r\n [src]=\"getFaviconUrl(source.link)\"\r\n [alt]=\"getDomainName(source.link) + ' favicon'\">\r\n {{getDomainName(source.link)}}\r\n </div>\r\n <h5 (click)=\"openLinkInNewTab(source.link)\">{{source.title}}\r\n </h5>\r\n <p (click)=\"openLinkInNewTab(source.link)\">{{source.desc}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"remainingSources && remainingSources.length > 0\">\r\n <div class=\"source-card\" (click)=\"onCardClick($event)\">\r\n <div>\r\n <div class=\"source-title\"><img\r\n *ngFor=\"let source of remainingSources; let i = index\"\r\n class=\"relative block\"\r\n [src]=\"getFaviconUrl(source.link)\"\r\n [alt]=\"getDomainName(source.link) + ' favicon'\"></div>\r\n <div class=\"source-url\">\r\n\r\n View {{remainingSources.length}} more\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"chat.type === 'ai' || chat.type === 'user'\" [ngStyle]=\"{\r\n background:\r\n chat.type === 'ai' && bgBubbleAi\r\n ? ''\r\n : chat.type === 'user' && bgBubbleUser\r\n ? ''\r\n : ''\r\n }\">\r\n <p *ngIf=\"chat.type === 'ai' || chat.type === 'user'\" [ngStyle]=\"{\r\n background:\r\n chat.type === 'ai' && messageTextColorAi\r\n ? ''\r\n : chat.type === 'user' && messageTextColorUser\r\n ? ''\r\n : '',\r\n color:\r\n chat.type === 'ai' && messageTextColorAi\r\n ? ''\r\n : chat.type === 'user' && messageTextColorUser\r\n ? ''\r\n : ''\r\n }\" [innerHTML]=\"chat.message\">\r\n </p>\r\n\r\n </div>\r\n <div class=\"exicution mt-2\"\r\n *ngIf=\"showFeedBackIconsIndex === i && chat.type === 'ai' && (financialGraphs && financialGraphs.length >0) \">\r\n <h5 *ngIf=\"chat.type === 'ai'\"><i class='bx bx-network-chart'></i> Graphs <i\r\n (click)=\"toggleCollapseFGraph()\" class=\"toggle-icon ml-2 fa\"\r\n [ngClass]=\"{'fas fa-chevron-down': isCollapsedForFGraph,'fas fa-chevron-up': !isCollapsedForFGraph }\"></i>\r\n </h5>\r\n <img *ngFor=\"let image of financialGraphs\"\r\n [ngClass]=\"{'collapse': isCollapsedForFGraph}\" [src]=\"image\" alt=\"\">\r\n </div>\r\n <div class=\"exicution mt-2\"\r\n *ngIf=\"showFeedBackIconsIndex === i && chat.type === 'ai' && (executionPathImages && executionPathImages.length >0) \">\r\n <h5 *ngIf=\"chat.type === 'ai'\"><i class='bx bx-network-chart'></i> Execution Path\r\n Diagram\r\n For Data Visualization Workflow <i (click)=\"toggleCollapseGraph()\"\r\n class=\"toggle-icon ml-2 fa\"\r\n [ngClass]=\"{'fas fa-chevron-down': isCollapsedForGraph,'fas fa-chevron-up': !isCollapsedForGraph }\"></i>\r\n </h5>\r\n <img *ngFor=\"let image of executionPathImages\"\r\n [ngClass]=\"{'collapse': isCollapsedForGraph}\" [src]=\"image\" alt=\"\">\r\n </div>\r\n <div class=\"Related mt-2\"\r\n *ngIf=\"showFeedBackIconsIndex === i && (relatedListItems && relatedListItems.length > 0)\">\r\n <h5 *ngIf=\"chat.type === 'ai'\"><i class='bx bx-list-check'></i> Related</h5>\r\n <div class=\"card-container\" *ngIf=\"chat.type === 'ai'\">\r\n <ul class=\"list-container\">\r\n <ng-container *ngFor=\"let item of relatedListItems\">\r\n <li (click)=\"fetchDataFor(item)\">{{ item }}</li>\r\n </ng-container>\r\n\r\n </ul>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cta\" *ngIf=\"showFeedBackIconsIndex === i\">\r\n <div class=\"copyBox\" title=\"Copy\" style=\"float: right;\">\r\n <button title=\"{{ chat.copied ? 'Copied!' : 'Copy' }}\" class=\"copy\"\r\n [class.active]=\"chat.copied\" (click)=\"handleCopyClick(i)\">\r\n <i *ngIf=\"chat.copied\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\r\n fill=\"#566563\" />\r\n </svg>\r\n\r\n </i>\r\n <i *ngIf=\"!chat.copied\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M19.24 2H8.84C8.14 2 7.58 2.56 7.58 3.26V16.84C7.58 17.54 8.14 18.1 8.84 18.1H19.24C19.94 18.1 20.5 17.54 20.5 16.84V3.26C20.5 2.56 19.94 2 19.24 2ZM19.24 16.84H8.84V3.26H19.24V16.84ZM4.74 6.52C4.04 6.52 3.48 7.08 3.48 7.78V20.36C3.48 21.06 4.04 21.62 4.74 21.62H15.14C15.84 21.62 16.4 21.06 16.4 20.36V18.88H14.96V20.36H4.74V7.78H6.18V6.52H4.74Z\"\r\n fill=\"#566563\" />\r\n </svg>\r\n </i>\r\n </button>\r\n <button class=\"up copy\" title=\"Like\" [class.active]=\"chat.liked\"\r\n (click)=\"handleUpClick(i)\">\r\n <i *ngIf=\"chat.liked\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.38989 18.4902V8.33022C8.38989 7.93022 8.50989 7.54022 8.72989 7.21022L11.4599 3.15022C11.8899 2.50022 12.9599 2.04022 13.8699 2.38022C14.8499 2.71022 15.4999 3.81022 15.2899 4.79022L14.7699 8.06022C14.7299 8.36022 14.8099 8.63022 14.9799 8.84022C15.1499 9.03022 15.3999 9.15022 15.6699 9.15022H19.7799C20.5699 9.15022 21.2499 9.47022 21.6499 10.0302C22.0299 10.5702 22.0999 11.2702 21.8499 11.9802L19.3899 19.4702C19.0799 20.7102 17.7299 21.7202 16.3899 21.7202H12.4899C11.8199 21.7202 10.8799 21.4902 10.4499 21.0602L9.16989 20.0702C8.67989 19.7002 8.38989 19.1102 8.38989 18.4902Z\"\r\n fill=\"#17235B\" />\r\n <path\r\n d=\"M5.21 6.37988H4.18C2.63 6.37988 2 6.97988 2 8.45988V18.5199C2 19.9999 2.63 20.5999 4.18 20.5999H5.21C6.76 20.5999 7.39 19.9999 7.39 18.5199V8.45988C7.39 6.97988 6.76 6.37988 5.21 6.37988Z\"\r\n fill=\"#17235B\" />\r\n </svg>\r\n </i>\r\n <i *ngIf=\"!chat.liked\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M10.4037 20.9264L10.381 20.9038L10.3557 20.8843L7.72165 18.85L8.02965 18.4516L10.7161 20.5315C10.9228 20.7195 11.2181 20.8517 11.4962 20.9377C11.7978 21.0309 12.1451 21.09 12.4801 21.09H16.2801C16.8572 21.09 17.4266 20.8625 17.8751 20.5306C18.3159 20.2044 18.6912 19.7385 18.8305 19.1997L21.2428 11.8732C21.4379 11.3309 21.4287 10.749 21.0965 10.2887C20.7583 9.81377 20.1844 9.58999 19.5801 9.58999H15.5801C15.2031 9.58999 14.8615 9.43143 14.6276 9.16215L14.627 9.16142C14.3873 8.88649 14.2756 8.51549 14.3345 8.11501L14.8322 4.9195C14.9978 4.1052 14.4664 3.24596 13.7053 2.98804C13.3277 2.85165 12.9297 2.89129 12.61 2.99839C12.2949 3.10396 11.9772 3.30172 11.7881 3.57673L11.7881 3.57671L11.7851 3.58107L7.96352 9.26689L7.55454 8.99314L11.3751 3.30891L11.3755 3.30836C11.8763 2.56103 13.0109 2.19028 13.8726 2.51744L13.8834 2.52151L13.8943 2.52509C14.9044 2.8564 15.556 3.98765 15.3317 5.01314L15.3284 5.02805L15.326 5.04314L14.836 8.19314L14.836 8.19313L14.8351 8.19928C14.8184 8.31642 14.7981 8.60268 15.0138 8.84924L15.0248 8.86177L15.0366 8.87354C15.1833 9.02026 15.3817 9.09999 15.5901 9.09999H19.5901C20.4308 9.09999 21.1176 9.44886 21.5113 10.0079L21.5124 10.0095C21.8964 10.5502 21.9908 11.2849 21.7202 12.0291L21.7175 12.0365L21.7151 12.044L19.3251 19.324L19.3198 19.34L19.3156 19.3564C19.0058 20.5707 17.6766 21.6 16.2801 21.6H12.4801C12.2411 21.6 11.8403 21.5625 11.4297 21.4512C11.0123 21.338 10.6406 21.1633 10.4037 20.9264Z\"\r\n fill=\"#566563\" stroke=\"#566563\" />\r\n <path\r\n d=\"M5.37988 20.4999H4.37988C3.52442 20.4999 2.98559 20.2982 2.65822 19.9825C2.33437 19.6702 2.12988 19.1614 2.12988 18.3499V8.5499C2.12988 7.73843 2.33437 7.22962 2.65822 6.91731C2.98559 6.6016 3.52442 6.3999 4.37988 6.3999H5.37988C6.23534 6.3999 6.77418 6.6016 7.10155 6.91731C7.4254 7.22962 7.62988 7.73843 7.62988 8.5499V18.3499C7.62988 19.1614 7.4254 19.6702 7.10155 19.9825C6.77418 20.2982 6.23534 20.4999 5.37988 20.4999ZM4.37988 6.8999C4.0934 6.8999 3.83578 6.9164 3.61382 6.96689C3.38745 7.01838 3.16822 7.11196 2.99258 7.2876C2.81559 7.46459 2.72807 7.67966 2.68301 7.89002C2.63948 8.09318 2.62988 8.31967 2.62988 8.5499V18.3499C2.62988 18.5801 2.63948 18.8066 2.68301 19.0098C2.72807 19.2201 2.81559 19.4352 2.99258 19.6122C3.16822 19.7878 3.38745 19.8814 3.61382 19.9329C3.83578 19.9834 4.0934 19.9999 4.37988 19.9999H5.37988C5.66637 19.9999 5.92398 19.9834 6.14595 19.9329C6.37232 19.8814 6.59155 19.7878 6.76719 19.6122C6.94418 19.4352 7.0317 19.2201 7.07676 19.0098C7.12028 18.8066 7.12988 18.5801 7.12988 18.3499V8.5499C7.12988 8.31967 7.12028 8.09318 7.07676 7.89002C7.0317 7.67966 6.94418 7.46459 6.76719 7.2876C6.59155 7.11196 6.37232 7.01838 6.14595 6.96689C5.92398 6.9164 5.66637 6.8999 5.37988 6.8999H4.37988Z\"\r\n fill=\"#566563\" stroke=\"#566563\" />\r\n </svg>\r\n </i>\r\n </button>\r\n <button class=\"down copy\" title=\"Dislike\" [class.active]=\"chat.unliked\"\r\n (click)=\"handleDownClick(i)\">\r\n <i *ngIf=\"chat.unliked\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.61 5.50002V15.66C15.61 16.06 15.49 16.45 15.27 16.78L12.54 20.84C12.11 21.49 11.04 21.95 10.13 21.61C9.15002 21.28 8.50002 20.18 8.71002 19.2L9.23002 15.93C9.27002 15.63 9.19002 15.36 9.02002 15.15C8.85002 14.96 8.60002 14.84 8.33002 14.84H4.22002C3.43002 14.84 2.75002 14.52 2.35002 13.96C1.97002 13.42 1.90002 12.72 2.15002 12.01L4.61002 4.52002C4.92002 3.28002 6.27002 2.27002 7.61002 2.27002H11.51C12.18 2.27002 13.12 2.50002 13.55 2.93002L14.83 3.92002C15.32 4.30002 15.61 4.88002 15.61 5.50002Z\"\r\n fill=\"#17235B\" />\r\n\r\n <path\r\n d=\"M18.7901 17.6099H19.8201C21.3701 17.6099 22.0001 17.0099 22.0001 15.5299V5.4799C22.0001 3.9999 21.3701 3.3999 19.8201 3.3999H18.7901C17.2401 3.3999 16.6101 3.9999 16.6101 5.4799V15.5399C16.6101 17.0099 17.2401 17.6099 18.7901 17.6099Z\"\r\n fill=\"#17235B\" />\r\n </svg>\r\n </i>\r\n\r\n <i *ngIf=\"!chat.unliked\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M10.1237 21.481L10.1148 21.4778L10.1059 21.4748C9.09577 21.1435 8.44416 20.0122 8.66849 18.9867L8.67175 18.9718L8.6741 18.9568L9.1641 15.8068L9.16413 15.8068L9.16501 15.8006C9.18175 15.6835 9.20207 15.3972 8.98633 15.1507L8.97536 15.1381L8.96359 15.1263C8.81687 14.9796 8.61841 14.8999 8.41004 14.8999H4.41004C3.56937 14.8999 2.88252 14.551 2.48884 13.992L2.4877 13.9904C2.10371 13.4497 2.00931 12.715 2.27994 11.9708L2.28263 11.9634L2.28509 11.9559L4.67509 4.67586L4.68035 4.65985L4.68451 4.64353C4.99418 3.42996 6.33271 2.3999 7.72004 2.3999H11.52C11.7591 2.3999 12.1599 2.43736 12.5704 2.54872C12.9878 2.66194 13.3596 2.83655 13.5965 3.07346L13.6191 3.09608L13.6444 3.11563L16.2785 5.14986L15.9705 5.54825L13.2875 3.47111C13.0799 3.2763 12.7837 3.1413 12.5061 3.05412C12.2031 2.95897 11.8551 2.8999 11.52 2.8999H7.72004C7.1429 2.8999 6.57353 3.12735 6.12508 3.45926C5.68428 3.78551 5.30892 4.25142 5.16963 4.79019L2.75738 12.1167C2.56223 12.659 2.57147 13.2409 2.90366 13.7012C3.24183 14.1761 3.81578 14.3999 4.42004 14.3999H8.42004C8.79702 14.3999 9.13867 14.5585 9.37252 14.8277L9.37315 14.8285C9.61286 15.1034 9.72457 15.4745 9.66568 15.875C9.6656 15.8755 9.66552 15.8761 9.66544 15.8766L9.16795 19.0704C9.00242 19.8841 9.53299 20.7428 10.2933 21.0013C10.6685 21.1391 11.0675 21.0978 11.3857 20.9917C11.7001 20.8869 12.0218 20.6898 12.2121 20.4132L12.2121 20.4132L12.215 20.4088L16.0351 14.7253L16.4472 15.0045L12.6251 20.691L12.6249 20.6912C12.259 21.2361 11.5347 21.5999 10.8 21.5999C10.5668 21.5999 10.3358 21.5596 10.1237 21.481Z\"\r\n fill=\"#566563\" stroke=\"#566563\" />\r\n <path\r\n d=\"M19.6201 17.6H18.6201C17.7647 17.6 17.2258 17.3983 16.8985 17.0826C16.5746 16.7703 16.3701 16.2615 16.3701 15.45V5.65C16.3701 4.83853 16.5746 4.32972 16.8985 4.0174C17.2258 3.7017 17.7647 3.5 18.6201 3.5H19.6201C20.4756 3.5 21.0144 3.7017 21.3418 4.0174C21.6656 4.32972 21.8701 4.83853 21.8701 5.65V15.45C21.8701 16.2615 21.6656 16.7703 21.3418 17.0826C21.0144 17.3983 20.4756 17.6 19.6201 17.6ZM18.6201 4C18.3336 4 18.076 4.01649 17.8541 4.06699C17.6277 4.11848 17.4085 4.21206 17.2328 4.3877C17.0558 4.56469 16.9683 4.77976 16.9232 4.99011C16.8797 5.19328 16.8701 5.41977 16.8701 5.65V15.45C16.8701 15.6802 16.8797 15.9067 16.9232 16.1099C16.9683 16.3202 17.0558 16.5353 17.2328 16.7123C17.4085 16.8879 17.6277 16.9815 17.8541 17.033C18.076 17.0835 18.3336 17.1 18.6201 17.1H19.6201C19.9066 17.1 20.1642 17.0835 20.3862 17.033C20.6126 16.9815 20.8318 16.8879 21.0074 16.7123C21.1844 16.5353 21.2719 16.3202 21.317 16.1099C21.3605 15.9067 21.3701 15.6802 21.3701 15.45V5.65C21.3701 5.41977 21.3605 5.19328 21.317 4.99011C21.2719 4.77976 21.1844 4.56469 21.0074 4.3877C20.8318 4.21206 20.6126 4.11848 20.3862 4.06699C20.1642 4.01649 19.9066 4 19.6201 4H18.6201Z\"\r\n fill=\"#566563\" stroke=\"#566563\" />\r\n </svg>\r\n </i>\r\n </button>\r\n\r\n </div>\r\n\r\n </div>\r\n <div class=\"time-cta\"\r\n [ngClass]=\"{'time-cta din': showFeedBackIconsIndex===i, 'time-cta': showFeedBackIconsIndex!=i}\">\r\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat.type === 'ai'\">\r\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\r\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\r\n {{ \"Assistant\" }} - {{ chat.time }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat.type === 'user'\">\r\n <img src=\"https://e1cdn.social27.com/digitalevents/chatbot/user-chatbot-icon.svg\">\r\n <div class=\"dateTime\">\r\n You - {{ chat.time }}\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"cta-faqs quick-prompts-extended\" *ngIf=\"i == 0 && quickPrompts?.length\">\r\n <!-- <div *ngFor=\"let tile of quickPrompts\" class=\"cta\"\r\n (click)=\"sendMessageWithTile(tile.prompt)\">\r\n Q: {{ tile.text }}\r\n </div> -->\r\n <div class=\"cta_suggestions\">\r\n <button *ngFor=\"let tile of quickPrompts\" (click)=\"sendMessageWithTile(tile.prompt)\">\r\n <ng-container *ngIf=\"tile\">{{tile.text}}</ng-container>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n <div class=\"chat bot\" *ngIf=\"i == 0 && botSkills\">\r\n <div class=\"chat-box\">\r\n <div class=\"message\">\r\n <p [innerHTML]=\"processMessageForDisplay(botSkills)\"> </p> \r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"chat.suggestions?.length\">\r\n <h4 class=\"labelChat\">Here are some things EventsGPT Copilot can help you do:</h4>\r\n <div class=\"cta_suggestions\">\r\n <button *ngFor=\"let suggestion of chat.suggestions\"\r\n (click)=\"sendMessageWithTile(suggestion)\">\r\n <ng-container *ngIf=\"suggestion\">{{suggestion}}</ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"chat.action?.section_id == 'company_search' || chat.action?.section_id == 'user_search' || chat.action?.section_id == 'industry_company_search'\">\r\n <div class=\"box\">\r\n <div class=\"tiktokwrapper\">\r\n <div class=\"tiktokshell\" *ngFor=\"let user of chat.action.users\">\r\n <div class=\"videoPhotobox\">\r\n <ng-conatiner *ngIf=\"user?.photoPath && !user.userVideosModel\">\r\n <img [src]=\"user?.photoPath\">\r\n </ng-conatiner>\r\n <ng-conatiner *ngIf=\"user.userVideosModel\">\r\n <app-video-player *ngIf=\"user?.userVideosModel\" [isDev]=\"isDev\"\r\n [currentUserId]=\"userId\" [videoObj]=\"user?.userVideosModel\"\r\n [user]=\"user\" [eventId]=\"eventId\" type=\"1\">\r\n </app-video-player>\r\n </ng-conatiner>\r\n\r\n </div>\r\n\r\n <div class=\"noPhoto\" *ngIf=\"!user?.photoPath && !user.userVideosModel\">\r\n <h3>{{user.firstName | slice:0:1}}{{user.lastName | slice:0:1}}</h3>\r\n </div>\r\n <div class=\"overlymask\" *ngIf=\"!user.userVideosModel\">\r\n </div>\r\n <div class=\"onshell-content\">\r\n <div class=\"title-shell\">\r\n <h3>{{user.firstName}} {{user.lastName}}</h3>\r\n <h3 class=\"companyName\">{{user.company}}</h3>\r\n </div>\r\n <div class=\"button-shell\">\r\n <button class=\"Connectbtn\"\r\n (click)=\"connectToUser(user.userId)\">{{canConnect(user.userId) ?\r\n 'Connect' : canDisconnect(user.userId) ? 'Disconnect' : 'Request\r\n Sent'}}</button>\r\n <button class=\"schedulebtn\"\r\n (click)=\"scheduleMeetingWithUser(user)\">Schedule</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"chat.action?.section_id == myUpcomingSessionAction\">\r\n <div class=\"agenda-items-wrapper\" class=\"agenda-items-wrapper\">\r\n <div class=\"list-view\">\r\n <div class=\"session-detail-wrapper card-background-session\"\r\n *ngFor=\"let upcomingSession of chat.action.content\">\r\n <div class=\"thumbnail \"><img alt=\"Introduction to the Imaging Radar Academy\"\r\n src=\"https://s27media.azureedge.net/8008/profile_pic/453cea2c-feba-11ed-8c0b-00155d025b0a.png\"\r\n class=\"\">\r\n <!---->\r\n <!---->\r\n <!----><button class=\"play-btn color-primary \"\r\n title=\"Play Session: Introduction to the Imaging Radar Academy\"><span\r\n class=\"material-icons notranslate \"> play_circle_outline\r\n </span>\r\n <!---->\r\n </button>\r\n <!---->\r\n <!---->\r\n </div>\r\n <!---->\r\n <!---->\r\n <div class=\"content p-3\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"d-flex flex-column\">\r\n <p class=\"fs-xs mb-0 body-text-color \">\r\n {{upcomingSession.dateTimeRange.start | date:'MM-dd-yyyy\r\n HH:mm':'UTC'}} - {{upcomingSession.dateTimeRange.end |\r\n date:'MM-dd-yyyy HH:mm':'UTC'}} {{upcomingSession.timeZone.id}}\r\n </p>\r\n <!---->\r\n <!---->\r\n <!-- <p class=\"fs-xs mb-2 color-secondary\" title=\"Session Type: Generative AI\">Generative AI </p> -->\r\n <!---->\r\n </div>\r\n <div class=\"d-flex align-items-center actions px-2\">\r\n <!---->\r\n <button\r\n (click)=\"performSessionAction(upcomingSession.id, 'view-session')\"\r\n class=\"s27-btn-icon body-text-color\"\r\n title=\"View Session Information: Introduction to the Imaging Radar Academy\"><span\r\n class=\"material-icons notranslate\"> remove_red_eye\r\n </span>\r\n </button>\r\n\r\n <button\r\n (click)=\"performSessionAction(upcomingSession.id, 'add-to-agenda')\"\r\n class=\"s27-btn-icon body-text-color \"><span\r\n class=\"material-icons notranslate\"\r\n title=\"Add Session: Introduction to the Imaging Radar Academy to My agendaa\">\r\n event_available </span>\r\n </button>\r\n <!---->\r\n <!---->\r\n <!---->\r\n <!---->\r\n\r\n <button (click)=\"performSessionAction(upcomingSession.id, 'play')\"\r\n class=\"s27-btn-icon body-text-color \"\r\n title=\"Copy session link to share\"><span\r\n class=\"material-icons notranslate\"> play_circle_outline\r\n </span>\r\n </button>\r\n <!---->\r\n </div>\r\n </div>\r\n <h2 class=\"body-text-color\">{{upcomingSession.title}}</h2>\r\n <div class=\"session-description color-secondary\"\r\n [innerHTML]=\"sanitizeHtml(upcomingSession.description)\">\r\n </div>\r\n <ul class=\"speakers grid-2-cols\"\r\n *ngFor=\"let speakerId of upcomingSession.speakers\">\r\n <li class=\"\">\r\n <div class=\"image \" title=\"Blair Wunderlich\"><img\r\n alt=\"Blair Wunderlich\"\r\n [src]=\"speakers[speakerId]?.photoPath\" class=\"\">\r\n <!---->\r\n <!---->\r\n <!---->\r\n </div>\r\n <!---->\r\n <div class=\"content pl-3 \" style=\"text-transform: none;\">\r\n <div class=\"mb-0 body-text-color fs-xs fw-500\">\r\n {{speakers[speakerId]?.firstName}}\r\n {{speakers[speakerId]?.lastName}}</div>\r\n <div class=\"color-secondary fs-xxs\">\r\n {{speakers[speakerId]?.jobTitle}}</div>\r\n <div class=\"color-secondary fs-xxs\">\r\n {{speakers[speakerId]?.company}}</div>\r\n </div>\r\n <!---->\r\n </li>\r\n </ul>\r\n <!---->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat bot\" *ngIf=\"isChatingWithAi\">\r\n\r\n <div class=\"chat-box\">\r\n <div class=\"o-media__body\">\r\n <div class=\"o-vertical-spacing\">\r\n <h3 class=\"blog-post__headline\">\r\n <span class=\"skeleton-box\" style=\"width:55%;\"></span>\r\n </h3>\r\n <p>\r\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:90%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:83%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-cta\">\r\n <div class=\"Icon_TimeSTamp\">\r\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\r\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\r\n {{ \"Assistant\" }} - {{ chat?.time ? chat.time : (dateTime.now |\r\n date:'shortTime') }}\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"chat bot\" *ngIf=\"loading\">\r\n <div class=\"chat-box\">\r\n <div class=\"o-media__body\">\r\n <div class=\"o-vertical-spacing\">\r\n <h3 class=\"blog-post__headline\">\r\n <span class=\"skeleton-box\" style=\"width:55%;\"></span>\r\n </h3>\r\n <p>\r\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:90%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:83%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-cta\">\r\n <div class=\"Icon_TimeSTamp\">\r\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\r\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\r\n {{ \"Loading..\" }}\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div #chatMain></div> -->\r\n <div class=\"chatFooterWrapper\">\r\n <div class=\"chat-footer\">\r\n <div class=\"dropdown-wrapper\" (click)=\"toggleDropdown()\">\r\n <div class=\"dropdown-header\">\r\n <span>{{ getDropdownHeaderText() }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\r\n <path d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </div>\r\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\r\n <label (click)=\"onSelectAll()\">\r\n <input type=\"checkbox\" [checked]=\"areAllSelected()\" />\r\n All\r\n </label>\r\n <label *ngFor=\"let agent of agents\" (click)=\"onAgentChange(agent)\">\r\n <input type=\"checkbox\" [(ngModel)]=\"agent.selected\" />\r\n {{ agent.agentName }}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"border-shape\">\r\n <input [disabled]=\"isChatingWithAi\" type=\"text\" class=\"form-control-1 s27-scroll\"\r\n placeholder=\"Ask anything...\" [style.background]=\"formFieldBgColor ? formFieldBgColor : ''\"\r\n [style.color]=\"formFieldTextColor ? formFieldTextColor : ''\" [(ngModel)]=\"input\"\r\n (keyup.enter)=\"handleSubmit()\" #myInput />\r\n\r\n </div>\r\n <div class=\"cta-footer\">\r\n <button class=\"btn cta-chat\" (click)=\"handleSubmit()\"\r\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\r\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\">\r\n <svg stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 512 512\"\r\n height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M476.59 227.05l-.16-.07L49.35 49.84A23.56 23.56 0 0027.14 52 24.65 24.65 0 0016 72.59v113.29a24 24 0 0019.52 23.57l232.93 43.07a4 4 0 010 7.86L35.53 303.45A24 24 0 0016 327v113.31A23.57 23.57 0 0026.59 460a23.94 23.94 0 0013.22 4 24.55 24.55 0 009.52-1.93L476.4 285.94l.19-.09a32 32 0 000-58.8z\">\r\n </path>\r\n </svg>\r\n <!-- SEND -->\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"text-left note-section\">\r\n <div class=\"note\">\r\n <i>\r\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 106 105\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M52.8578 104.318C52.8645 104.32 52.8713 104.323 52.878 104.325V104.311C74.7711 96.9781 115.49 69.0948 103.537 16.0875C79.9227 8.17267 59.9557 2.08167 52.878 0.0118542V0C52.8713 0.0019722 52.8645 0.00394726 52.8578 0.00592613C52.851 0.00394726 52.8442 0.0019722 52.8375 0V0.0118542C45.7599 2.08167 25.7928 8.17267 2.17802 16.0875C-9.77459 69.0948 30.9444 96.9781 52.8375 104.311V104.325C52.8442 104.323 52.851 104.32 52.8578 104.318Z\"\r\n fill=\"#E2F6FA\"></path>\r\n <path\r\n d=\"M52.8409 95.3002V9.02441C58.6643 10.7266 75.2028 15.7706 94.7694 22.3286C104.66 66.1922 70.9382 89.2528 52.8409 95.3002Z\"\r\n fill=\"url(#paint0_linear_174_9166)\"></path>\r\n <rect x=\"63.725\" y=\"21.0347\" width=\"2.275\" height=\"29.6903\" rx=\"1.1375\"\r\n transform=\"rotate(-73.8316 63.725 21.0347)\" fill=\"url(#paint1_linear_174_9166)\">\r\n </rect>\r\n <path\r\n d=\"M52.8745 95.3002V9.02441C47.0511 10.7266 30.5127 15.7706 10.9461 22.3286C1.0553 66.1922 34.7772 89.2528 52.8745 95.3002Z\"\r\n fill=\"url(#paint2_linear_174_9166)\"></path>\r\n <path\r\n d=\"M67.1131 34.3431L43.2493 56.165C41.5673 57.7031 41.5085 60.3337 43.1202 61.9454L68.0846 86.9097C69.4975 88.3227 71.7364 88.4762 73.3289 87.2693L89.8566 74.7444C90.8029 74.0273 91.3817 72.9269 91.4364 71.7409L91.7769 64.3639C91.8163 63.5106 91.5814 62.667 91.1067 61.9568L73.138 35.0723C71.7767 33.0355 68.9209 32.6899 67.1131 34.3431Z\"\r\n fill=\"url(#paint3_linear_174_9166)\"></path>\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M68.6302 31.8839C69.0923 31.6059 69.6441 31.5177 70.1698 31.6379C70.6955 31.758 71.1542 32.0771 71.4497 32.5282L73.5143 35.6772C73.7834 36.0886 73.8986 36.5818 73.8394 37.0698C73.7803 37.5579 73.5506 38.0093 73.191 38.3445L73.1848 38.3528L73.1556 38.3799L73.0367 38.4905L72.5675 38.9388C69.9711 41.4572 67.4535 44.0555 65.0183 46.7299C60.4366 51.7683 54.9958 58.3624 51.3338 64.7604C50.3119 66.5456 47.8157 66.9293 46.335 65.3882L32.8111 51.3366C32.6173 51.1352 32.466 50.8968 32.3661 50.6357C32.2663 50.3746 32.2199 50.0961 32.2298 49.8168C32.2398 49.5374 32.3057 49.2629 32.4239 49.0095C32.542 48.7562 32.7098 48.5292 32.9175 48.342L37.0049 44.6549C37.3641 44.3311 37.8247 44.1422 38.3078 44.1205C38.7909 44.0988 39.2666 44.2457 39.6534 44.5361L46.554 49.71C57.3335 39.0806 63.4459 35.0016 68.6302 31.8839Z\"\r\n fill=\"#C4C4C4\"></path>\r\n <defs>\r\n <linearGradient id=\"paint0_linear_174_9166\" x1=\"87.9736\" y1=\"7.88186\" x2=\"7.52095\"\r\n y2=\"100.482\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#E8F6F9\"></stop>\r\n <stop offset=\"1\" stop-color=\"#CEFAF9\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint1_linear_174_9166\" x1=\"63.8012\" y1=\"37.3264\" x2=\"66.6714\"\r\n y2=\"24.7281\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#C2E4E7\"></stop>\r\n <stop offset=\"1\" stop-color=\"#F3F8F8\" stop-opacity=\"0\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint2_linear_174_9166\" x1=\"52.8387\" y1=\"30.822\" x2=\"27.7411\"\r\n y2=\"77.8896\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#E8F6F9\"></stop>\r\n <stop offset=\"1\" stop-color=\"#CEFAF9\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint3_linear_174_9166\" x1=\"89.7622\" y1=\"51.5494\" x2=\"73.8328\"\r\n y2=\"68.4825\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#A0E6E9\"></stop>\r\n <stop offset=\"1\" stop-color=\"#D6F7F9\" stop-opacity=\"0\"></stop>\r\n </linearGradient>\r\n </defs>\r\n </svg>\r\n </i>\r\n <span class=\"text\">Your personal or company information is kept private and secure within this\r\n chat.</span>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-drawer-content>\r\n\r\n\r\n\r\n </mat-drawer>\r\n <mat-drawer class=\"drawer\" style=\"width: 45%;\" #sourcesDrawer [position]=\"'end'\" [mode]=\"'over'\" [style.background]=\"'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\r\n \">\r\n <mat-drawer-content>\r\n <div class=\"sourceDraweContainer\">\r\n\r\n <div class=\"container-fluid\">\r\n <button mat-icon-button class=\"closeButtonSource\" (click)=\"onCloseSource()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <h1>{{sourcesList.length}} Sources</h1>\r\n <p>Tell me about latest news from Mistral about AI agents announcement done this month</p>\r\n <hr />\r\n <ul class=\"sources-list\">\r\n <li *ngFor=\"let item of sourcesList;let si=index\">\r\n <input type=\"checkbox\" id=\"source1\">\r\n <div class=\"source-content\" (click)=\"openLinkInNewTab(item.link)\">\r\n <label for=\"source1\">\r\n <span class=\"source-title\"><span class=\"ml-1\">{{si+1}}.</span>{{item.title}}</span>\r\n <span class=\"image-container\">\r\n <img class=\"relative block\" [src]=\"getFaviconUrl(item.link)\"\r\n [alt]=\"getDomainName(item.link) + ' favicon'\"> <span>\r\n {{getDomainName(item.link)}}</span>\r\n </span>\r\n <span class=\"source-description\">{{item.desc}}</span>\r\n </label>\r\n </div>\r\n </li>\r\n\r\n </ul>\r\n </div>\r\n </div>\r\n </mat-drawer-content>\r\n </mat-drawer>\r\n</mat-drawer-container>",
|
|
1050
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1051
|
-
styles: ["@import url(\"https://e1cdn.social27.com/digitalevents/liteversion/fonts/segoe-ui/stylesheet.css\");::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb,::-webkit-scrollbar-thumb:hover{background:#e5ccbc}body{overflow:hidden}.ios-device .drawer .chat-footer .form-control{font-size:16px}.hivegpt-chat-wrapper{background:transparent!important;height:100%;inset:0;opacity:0;position:fixed;visibility:hidden;z-index:999999}.hivegpt-chat-wrapper.mat-drawer-container-has-open{background:transparent!important;opacity:1;transition:all .3s;visibility:visible;z-index:999999}.hivegpt-chat-wrapper .mat-drawer:not(.mat-drawer-side){box-shadow:none}.hivegpt-chat-wrapper mat-drawer{background-color:#fafafa!important;background-image:none!important;max-width:800px;width:100%}.hivegpt-chat-wrapper mat-drawer.full-width-drawer{max-width:100%}.hivegpt-chat-wrapper .mat-drawer-content{display:flex;flex-direction:column}.hivegpt-chat-wrapper .chat-header{padding:16px 40px;width:100%}.hivegpt-chat-wrapper .chat-header h2{font-family:Segoe UI,sans-serif;font-size:36px;font-weight:500;letter-spacing:-.72px;line-height:108%;margin:0;text-transform:uppercase}.hivegpt-chat-wrapper .chat-header .closeIcon{align-items:center;background:transparent;border:none;border-radius:50%;display:inline-flex;font-size:18px;height:35px;justify-content:center;outline:none;padding:0;position:absolute;right:12px;top:16px;width:35px}.hivegpt-chat-wrapper .chat-main{display:flex;flex:1;flex-direction:column;justify-content:space-between;overflow-y:auto;width:100%}.hivegpt-chat-wrapper .chat-main .innerChat{overflow-y:auto;padding:20px 40px 10px;width:100%}.hivegpt-chat-wrapper .chat-main .chat-box{max-width:80%;width:100%}.hivegpt-chat-wrapper .chat-main .chat-box .message{background:hsla(0,0%,94.9%,.7);border-radius:6px 6px 10px 0;box-shadow:0 .3px .9px rgba(0,0,0,.1215686275),0 1.6px 3.6px rgba(0,0,0,.1607843137);margin-bottom:10px;margin-top:20px;min-height:60px;padding:18px 20px;position:relative}.hivegpt-chat-wrapper .chat-main .chat-box .message p{color:#111;font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;text-align:left;white-space:pre-line}.hivegpt-chat-wrapper .chat-main .chat-box .message p a{color:#17235b!important;cursor:pointer!important;font-weight:700;text-decoration:underline}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta{align-items:end;bottom:-7px;display:inline-flex;gap:10px;grid-gap:10px;position:relative;right:-10px;z-index:5}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button{background:transparent;border:none;color:#566563;cursor:pointer;padding:0;transition:all .3s}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button i{display:inline-block}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button:hover{color:#17235b}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-wrapper .chat-main .chat{margin-bottom:20px}.hivegpt-chat-wrapper .chat-main .chat.bot .chat-box .message{border-radius:6px 6px 10px 0}.hivegpt-chat-wrapper .chat-main .chat.user{text-align:right}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box{margin-left:auto}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box .message{background:linear-gradient(96deg,#8b4ead -10.61%,#761c79 84.59%);border-radius:20px 20px 0 20px;color:#fff}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box .message p{color:#fff;text-align:left}.hivegpt-chat-wrapper .chat-main .chat.user .dateTime{text-align:right}.hivegpt-chat-wrapper .chat-main .chat.user .time-cta{justify-content:flex-end}.hivegpt-chat-wrapper .chat-main .chat .Icon_TimeSTamp{align-content:center;align-items:center;display:flex;justify-content:center}.hivegpt-chat-wrapper .chat-main .chat .dateTime{color:#566563;font-family:Segoe UI,sans-serif;font-size:13px;font-style:normal;font-weight:500;line-height:140%;margin:0 5px}.hivegpt-chat-wrapper .chat-main .chat:last-of-type{margin-bottom:0}.hivegpt-chat-wrapper .chatFooterWrapper{background:#fff;border-radius:6px 6px 0 0!important;margin-top:5px!important;padding:10px 14px}.hivegpt-chat-wrapper .chatFooterWrapper .note{align-items:center;border-radius:6px;color:#1b75bb;display:inline-flex;font-size:11px;gap:8px;line-height:1;margin:0 auto 4px;padding:4px 8px}.hivegpt-chat-wrapper .chatFooterWrapper .note a{text-transform:capitalize}.hivegpt-chat-wrapper .chatFooterWrapper .note i{font-size:18px}.hivegpt-chat-wrapper .chatFooterWrapper .note i svg{height:18px;width:18px}.hivegpt-chat-wrapper .chatFooterWrapper .note span{flex:1;gap:4px;line-height:1.3}.hivegpt-chat-wrapper .chat-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;padding:4px 0 0;position:relative}.hivegpt-chat-wrapper .chat-footer .form-control{background:#fff!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.hivegpt-chat-wrapper .chat-footer .form-control::-moz-placeholder{color:#6c7a78}.hivegpt-chat-wrapper .chat-footer .form-control::placeholder{color:#6c7a78}.hivegpt-chat-wrapper .chat-footer .form-control:focus{border-color:#e5ccbc}.hivegpt-chat-wrapper .chat-footer .cta-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;position:absolute;right:10px;text-align:right}.hivegpt-chat-wrapper .chat-footer .cta-footer .btn{color:#000;font-weight:500;gap:8px;max-width:150px;padding:0}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat{align-items:center;background:transparent!important;border:none;border-radius:0;box-shadow:0 1px 2px 0 rgba(16,24,40,.05);display:inline-flex;font-size:20px;height:auto;justify-content:center;width:auto}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat:hover{opacity:.8}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-again{background:#17235b;border:1px solid #17235b;color:#fff}.hivegpt-chat-wrapper .cta-faqs{align-items:flex-end;display:flex;flex-direction:column;flex-wrap:wrap;gap:8px;margin-left:auto;max-width:80%;padding:10px 0 0}.hivegpt-chat-wrapper .cta-faqs .cta{background:transparent;border:1px solid #c9a893;border-radius:20px 20px 0 20px;color:#333;cursor:pointer;font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;min-height:44px;padding:12px 20px;text-align:left;text-decoration:none;transition:all .3s;white-space:pre-line}.spinner{align-items:center;display:flex;gap:2px;justify-content:center}.spinner>div{animation:bouncedelay 1.4s ease-in-out infinite;animation-fill-mode:both;background-color:#173330;border-radius:100%;display:inline-block;height:5px;width:5px}.spinner .bounce1{animation-delay:-.32s}.spinner .bounce2{animation-delay:-.16s}@keyframes bouncedelay{0%,80%,to{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.time-cta{align-items:center;display:flex;gap:8px;justify-content:start;margin-left:-30px;margin-top:5px}@keyframes thumbsUpAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes thumbsDownAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(3px)}}@media (max-width:767px){.hivegpt-chat-wrapper .chat-main .innerChat{padding:0 24px 10px}.hivegpt-chat-wrapper .chat-footer{padding:10px 24px}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat{max-width:100%}.hivegpt-chat-wrapper .chat-footer .form-control{height:80px}.hivegpt-chat-wrapper .chat-header .closeIcon{height:28px;right:8px;top:8px;width:28px}.hivegpt-chat-wrapper .chat-header .closeIcon span{font-size:14px}.hivegpt-chat-wrapper .chat-header{padding:10px 24px}.hivegpt-chat-wrapper .chat-header h2{font-size:20px}.cta-faqs{padding:10px 0 0}}.body-overflow-hidden{overflow:hidden}.chat-button{align-items:center;background:#17235b;border:#17235b;border-radius:50%;color:#fff;display:inline-flex;font-size:24px;height:50px;justify-content:center;width:50px}textarea{caret-color:#000}.labelChat{font-size:14px;font-weight:400;margin:0 0 10px}.chatType h4{color:#566563;text-align:center}.chatType ul{align-items:center;background:#fff;border-radius:10px;box-shadow:0 .3px .9px rgba(0,0,0,.12),0 1.6px 3.6px rgba(0,0,0,.16);display:flex;justify-content:center;list-style:none;margin:0 0 20px;padding:4px}.chatType ul li{flex:1}.chatType ul li button{align-items:center;background:#fff;border:none;border-radius:10px;font-weight:600;min-height:48px;padding:.375rem;text-align:center;text-shadow:1px 0 rgba(0,0,0,.2);width:100%}.chatType ul li button.active{background:linear-gradient(96deg,#761c79 -10.61%,#761c79 84.59%);box-shadow:0 1px 2px 0 rgba(16,24,40,.05);color:#fff}.cta_suggestions{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:20px}.cta_suggestions button{background:#fff;border:1px solid #174ae4;border-radius:10px;box-shadow:0 1.6px 3.6px 0 rgba(0,0,0,.13),0 .3px .9px 0 rgba(0,0,0,.1);color:#1543cd;font-size:14px;font-weight:600;line-height:1.2;padding:8px 12px;position:relative;text-align:left;transition:all .3s}.cta_suggestions button:hover{background:#eff3ff}.balanced .chat-footer .cta-footer .cta-chat,.balanced .chat-main .chat.user .chat-box .message,.balanced .chatType ul li button.active{color:#000}.balanced .chat-main .innerChat .title p span{color:#06f}.balanced mat-drawer{background-image:linear-gradient(180deg,rgba(88,190,251,.05) 60%,rgba(0,102,255,.2) 96.27%)}.balanced .cta_suggestions button:hover{border:1px solid #06f}.precise .chat-footer .cta-footer .cta-chat,.precise .chat-main .chat.user .chat-box .message{background:linear-gradient(96deg,#69ca6d -10.61%,#4caf50 84.59%)}.precise .chatType ul li button.active{background:linear-gradient(96deg,#4caf50 -10.61%,#4caf50 84.59%);color:#fff}.precise .chat-main .innerChat .title p span{color:#4caf50}.precise mat-drawer{background-image:linear-gradient(180deg,rgba(76,175,80,.05) 60%,rgba(76,175,80,.3) 96.27%)}.precise .cta_suggestions button:hover{border:1px solid #4caf50}.title{margin-bottom:50px}.title h2{font-size:28px;margin:0 0 10px}.title h2 span{align-items:center;color:#000;display:inline-flex;gap:10px}.title h2 i{color:#06f;font-size:30px;line-height:1}.title h2 i svg{height:30px;width:30px}.title p{font-weight:600;margin:0}.title p span{color:#06f}.agenda-items-wrapper{padding-bottom:15px;padding-top:15px}@media (max-width:576px){.list-view .session-detail-wrapper{border:none;flex-direction:column}}.card-background-session{background:#fff;border-radius:8px}.card-background-session .body-text-color{color:#111!important}.card-background-session h2{-webkit-box-orient:vertical;-webkit-line-clamp:1;display:-webkit-box;font-size:20px;margin-bottom:8px;overflow:hidden}.card-background-session .session-description{-webkit-box-orient:vertical;-webkit-line-clamp:2;color:#111!important;display:-webkit-box;font-size:14px;overflow:hidden}.card-background-session .color-secondary{color:#111!important}.card-background-session p{font-size:14px}.list-view .session-detail-wrapper .s27-btn-icon{background:transparent;border:transparent}.list-view .session-detail-wrapper{border-left:3px solid transparent;display:flex;margin-bottom:16px}.thumbnail{align-items:center;display:flex;height:160px;justify-content:center;min-width:160px;position:relative;width:160px}.thumbnail img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}@media (max-width:576px){.thumbnail{height:160px;min-height:unset;width:100%}}.thumbnail .play-btn{align-items:center;background-color:transparent;border:0;bottom:0;display:flex;font-size:60px;justify-content:center;left:0;position:absolute;right:0;top:0;width:100%}.thumbnail .play-btn span{font-size:80px;text-shadow:0 0 14px rgba(74,74,74,.45)}.content{flex-grow:1}.actions{background-color:transparent!important}.speakers{margin-bottom:0;margin-top:10px;padding:0}.speakers li{align-items:unset;display:flex}.speakers li .content{font-size:12px!important}.speakers .image{border-radius:100%;height:40px;min-width:40px;overflow:hidden;width:40px}.speakers img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}.grid-2-cols{display:grid;grid-gap:15px;grid-template-columns:calc(55% - 10px) calc(50% - 10px);padding-right:20px}@media (max-width:768px){.grid-2-cols{grid-template-columns:calc(50% - 10px) calc(50% - 10px)}}@media (max-width:575px){.grid-3-cols{grid-template-columns:100%}}.quick-prompts-extended{align-items:flex-start!important;margin-left:0!important}.border-shape{background:#fff;border:1px solid #ced4da;border-radius:4px;min-height:60px;overflow:hidden;padding:0;width:100%}.border-shape .form-control-1{background:none!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.border-shape .form-control-1:focus{box-shadow:none;outline:none}.border-shape .s27-scroll::-webkit-scrollbar{border-radius:30px;width:3px}.border-shape .s27-scroll::-webkit-scrollbar-track{background:#f1f1f1;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-thumb{background:#888;border-radius:30px}.box{display:table;height:275px;margin:10px 0;width:100%}.tiktokwrapper{display:grid;gap:10px;grid-template-columns:repeat(2,1fr);height:100%}.tiktokwrapper .tiktokshell{background:#3d2b8f;border:2px solid #fff;border-radius:5px;box-shadow:0 0 6px #494949;height:100%;min-height:275px;min-width:160px;position:relative;width:100%}.tiktokwrapper .overlymask{background-image:url(https://e1cdn.social27.com/digitalevents/HiveGpt/screen-overlay.png);background-position:0 0;bottom:0;height:100%;left:0;position:absolute;width:100%;z-index:6}.tiktokwrapper .videoPhotobox{bottom:0;height:272px;left:0;overflow:hidden;position:absolute;width:auto;z-index:6}.tiktokwrapper .videoPhotobox video{-o-object-fit:cover;border-radius:0;cursor:pointer;height:270px;object-fit:cover;outline:0;transition:.3s ease-in-out;width:100%}.tiktokwrapper .videoPhotobox img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}.tiktokwrapper .playBtn{align-items:center;border:none;cursor:pointer;display:flex;height:40px;justify-content:center;left:0;margin:0 auto;position:absolute;right:0;top:105px;transition:all 1s;width:40px;z-index:10}.tiktokwrapper .playBtn:hover{transform:scale(1.2)}.tiktokwrapper .noPhoto{align-items:center;border:none;cursor:pointer;display:flex;height:40px;justify-content:center;left:0;margin:0 auto;position:absolute;right:0;top:105px;transition:all 1s;z-index:6}.tiktokwrapper .noPhoto h3{color:#fff;font-size:46px}.tiktokwrapper .onshell-content{bottom:10px;left:5px;position:absolute;z-index:10}.tiktokwrapper .onshell-content .title-shell{margin:0 10px}.tiktokwrapper .onshell-content h3{color:#fff;font-size:13px;font-weight:500}.tiktokwrapper .onshell-content .companyName{color:#eaeaea;font-size:12px;font-weight:400}.tiktokwrapper .onshell-content .button-shell button{background:#4e4e4e;border:none;border-radius:2px;color:#fff;font-size:11px;margin:0 1px;padding:4px 7px;text-transform:capitalize}.tiktokwrapper .onshell-content .Connectbtn{background:linear-gradient(149deg,#06f,#06f)!important}.skeleton-box{background-color:#dddbdd;display:inline-block;height:1em;overflow:hidden;position:relative}.skeleton-box:after{animation:shimmer 5s infinite;background-image:linear-gradient(90deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.2) 20%,hsla(0,0%,100%,.5) 60%,hsla(0,0%,100%,0));bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;transform:translateX(-100%)}@keyframes shimmer{to{transform:translateX(100%)}}.blog-post__headline{font-size:1.25em;font-weight:700}.blog-post__meta{color:#6b6b6b;font-size:.85em}.o-media{display:flex}.o-media__body{flex-grow:1;margin-left:1em}.o-vertical-spacing>*+*{margin-top:.75em}.o-vertical-spacing--l>*+*{margin-top:2em}.copy{background:none;border:none;cursor:pointer;padding:5px;transition:transform .2s ease}.copy.active{transform:scale(1.1)}.copy svg{fill:#566563;height:18px;width:18px}.copyBox{background:hsla(0,0%,100%,.7019607843);border-radius:13px;box-shadow:0 .3px .9px rgba(0,0,0,.1215686275),0 1.6px 3.6px rgba(0,0,0,.1607843137);color:#566563;display:flex;gap:12px;padding:5px 10px;position:relative;width:105px}.copyBox button{background:transparent;border:none;color:#566563;cursor:pointer;padding:0;transition:all .3s}.copyBox button i{display:inline-block}.copyBox button:hover{color:#17235b}.copyBox button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.copyBox button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.din{display:inline-flex}.chatFooterWrapper{align-items:center;background-color:#f5f5f5;border-top:1px solid #ccc;flex-direction:column;justify-content:center;padding:10px}.chat-footer{align-items:center;background:#fff;border-radius:5px;display:flex;margin-bottom:10px;padding:10px;width:100%}.dropdown-wrapper{margin-right:10px;position:relative}.dropdown-header{align-items:center;cursor:pointer;display:flex}.dropdown-header span{margin-right:8px}.dropdown-menu{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px rgba(0,0,0,.1);display:block;left:0;max-height:200px;overflow-y:auto;padding:0;position:absolute;top:auto;width:160px;z-index:1000}.dropdown-menu label{cursor:pointer;display:block;padding:5px 15px}.dropdown-menu label:hover{background-color:#f0f0f0}.border-shape{flex-grow:1}.form-control-1{border:1px solid #ddd;border-radius:5px;padding:10px;width:100%}.cta-footer{align-items:center;display:flex}.btn.cta-chat{background-color:#007bff;border:none;border-radius:5px;color:#fff;cursor:pointer;padding:10px 15px}.btn.cta-chat svg{vertical-align:middle}.text-left .note-section{align-items:center;background:#fff;border-radius:5px;box-shadow:0 2px 4px rgba(0,0,0,.1);display:flex;margin-top:10px;max-width:800px;padding:10px;width:100%}.text-left .note{align-items:center;color:#555;display:flex}.text-left .note i{margin-right:8px}.text-left .note .text{font-size:14px}.card-container{display:flex;gap:15px}.custom-card{background:#fffefe;border:1px solid #ddd;border-radius:.25rem;box-shadow:0 4px 8px rgba(0,0,0,.1);margin-bottom:10px;overflow:hidden;width:18rem}.custom-card .card-body{padding:10px}.custom-card .card-title{font-size:1.25rem;font-weight:700}.custom-card .card-text{font-size:1rem;text-align:left}.custom-card .btn-primary{background-color:#007bff;border:none;border-radius:.25rem}.custom-card .card-footer{background-color:#f8f9fa;color:#6c757d;padding:10px;text-align:center}.list-container{list-style:none;padding:0}.list-container li{border-bottom:1px solid #ccc;font-size:12px;margin-bottom:5px;padding:5px}.list-container li:hover{color:#06f;cursor:pointer}.collapsible-container{margin-bottom:5px;overflow:hidden;width:100%}.collapsible-header{cursor:pointer;display:flex;padding:15px}.collapsible-header .header-icon{font-size:20px;margin-right:10px}.collapsible-header .header-title{flex:1;font-size:18px}.collapsible-header .toggle-icon{font-size:18px;margin-left:18px}.collapsible-content{background-color:#f8f9fa;color:#333;padding:15px;width:100%}.collapsible-content.show{display:block}.researchingCard{margin:20px auto}.card-header{-moz-user-select:none;-webkit-user-select:none;background:none;border-bottom:0;cursor:pointer;padding:0;user-select:none}.icon{font-size:20px;line-height:5px}.rotate{transform:rotate(180deg)}.collapse{display:none}.list-group-item{font-size:14px}.sources-container{align-items:flex-start;display:flex;gap:15px}.source-card{background-color:#f0f3f5;border-radius:10px;box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;justify-content:space-between;padding:15px;position:relative;transition:box-shadow .3s ease;width:100%}.popup{background-color:#fff;border-radius:5px;box-shadow:0 4px 8px rgba(0,0,0,.2);left:50%;opacity:0;padding:10px;position:absolute;top:100%;transform:translateX(-50%) translateY(-10px);transition:opacity .3s ease,transform .3s ease;visibility:hidden;white-space:normal;width:100%;z-index:10}.popup h5{font-size:14px;font-weight:600;line-height:1.2;margin:5px 0 10px}.popup p{font-size:12px;line-height:1.4;margin:0}.popup h5:hover{color:#007bff;cursor:pointer}.popup .source-url{color:#000;text-decoration:none}.popup .source-url:hover{color:#007bff;cursor:pointer;text-decoration:underline}.source-card:hover .popup{opacity:1;transform:translateX(-50%) translateY(-15px);visibility:visible}.source-card:hover{box-shadow:0 4px 8px rgba(0,0,0,.1);transform:scale(1.05)}.source-title{-webkit-box-orient:vertical;-webkit-line-clamp:2;display:-webkit-box;font-size:14px;font-weight:500;height:55px;line-height:1.5;overflow:hidden;text-align:left;text-overflow:ellipsis}.source-title img{margin-left:10px;width:20px}.source-url{align-items:center;color:#6c757d;display:flex;font-size:12px;text-align:left}.source-url img{border-radius:50%;height:16px;margin-right:5px;width:16px}.sourceDraweContainer .container{background-color:#fff;padding:20px}.sourceDraweContainer .sources-list{list-style:none;padding:0}.sourceDraweContainer .sources-list li{align-items:flex-start;display:flex;margin-bottom:15px}.sourceDraweContainer .sources-list input[type=checkbox]{flex-shrink:0;margin-right:15px;margin-top:8px}.sourceDraweContainer .source-content{background-color:#f5f2f2;border:1px solid #ddd;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,.1);cursor:pointer;flex:1;padding:12px}.sourceDraweContainer .source-content:hover{background:#ccc}.sourceDraweContainer .source-title{display:block;font-size:1rem;font-weight:500;height:auto!important;margin-bottom:4px}.sourceDraweContainer .source-description{display:block;font-size:.875rem}.sourceDraweContainer .image-container{align-items:center;display:flex;margin:10px 0}.sourceDraweContainer .image-container img{-o-object-fit:cover;border:1px solid #ddd;border-radius:50%;height:16px;margin-right:5px;object-fit:cover;width:16px}.sourceDraweContainer .image-container span{color:#555;font-size:13px}.closeButtonSource{background:none!important;border-color:transparent!important;box-shadow:none!important;color:inherit;cursor:pointer;float:right;margin-top:20px;transition:color .2s ease-in-out}.closeButtonSource.closeplaygroundbutton{display:none!important}"]
|
|
1052
|
-
},] }
|
|
1053
|
-
];
|
|
1054
|
-
ChatDrawerComponent.ctorParameters = () => [
|
|
1055
|
-
{ type: ChangeDetectorRef },
|
|
1056
|
-
{ type: HttpClient },
|
|
1057
|
-
{ type: DomSanitizer },
|
|
1058
|
-
{ type: ElementRef },
|
|
1059
|
-
{ type: Renderer2 },
|
|
1060
|
-
{ type: SocketService },
|
|
1061
|
-
{ type: ConversationService }
|
|
1062
|
-
];
|
|
1063
|
-
ChatDrawerComponent.propDecorators = {
|
|
1064
|
-
chatMain: [{ type: ViewChild, args: ['chatMain',] }],
|
|
1065
|
-
closePlaygroundButtons: [{ type: ViewChildren, args: ['closeplaygroundbutton',] }],
|
|
1066
|
-
drawer: [{ type: ViewChild, args: ['drawer',] }],
|
|
1067
|
-
sourcesDrawer: [{ type: ViewChild, args: ['sourcesDrawer',] }],
|
|
1068
|
-
myTextarea: [{ type: ViewChild, args: ['myTextarea', { static: false },] }],
|
|
1069
|
-
copilotName: [{ type: Input }],
|
|
1070
|
-
firstName: [{ type: Input }],
|
|
1071
|
-
lastName: [{ type: Input }],
|
|
1072
|
-
apiKey: [{ type: Input }],
|
|
1073
|
-
bgBubbleAi: [{ type: Input }],
|
|
1074
|
-
bgBubbleUser: [{ type: Input }],
|
|
1075
|
-
bgGradient: [{ type: Input }],
|
|
1076
|
-
botName: [{ type: Input }],
|
|
1077
|
-
botSkills: [{ type: Input }],
|
|
1078
|
-
botId: [{ type: Input }],
|
|
1079
|
-
closeButtonColor: [{ type: Input }],
|
|
1080
|
-
closeButtonbgColor: [{ type: Input }],
|
|
1081
|
-
credentials: [{ type: Input }],
|
|
1082
|
-
dateTimeColor: [{ type: Input }],
|
|
1083
|
-
dateTextColor: [{ type: Input }],
|
|
1084
|
-
eventId: [{ type: Input }],
|
|
1085
|
-
s27UserToken: [{ type: Input }],
|
|
1086
|
-
eventName: [{ type: Input }],
|
|
1087
|
-
botIcon: [{ type: Input }],
|
|
1088
|
-
formFieldBgColor: [{ type: Input }],
|
|
1089
|
-
formFieldTextColor: [{ type: Input }],
|
|
1090
|
-
fullView: [{ type: Input }],
|
|
1091
|
-
gradientColors: [{ type: Input }],
|
|
1092
|
-
greeting: [{ type: Input }],
|
|
1093
|
-
messageTextColorAi: [{ type: Input }],
|
|
1094
|
-
messageTextColorUser: [{ type: Input }],
|
|
1095
|
-
rules: [{ type: Input }],
|
|
1096
|
-
sendButtonColor: [{ type: Input }],
|
|
1097
|
-
sendButtonTextColor: [{ type: Input }],
|
|
1098
|
-
showClose: [{ type: Input }],
|
|
1099
|
-
thumbsDownMessages: [{ type: Input }],
|
|
1100
|
-
thumbsUpMessage: [{ type: Input }],
|
|
1101
|
-
timezone: [{ type: Input }],
|
|
1102
|
-
unknownResponses: [{ type: Input }],
|
|
1103
|
-
useOpenAi: [{ type: Input }],
|
|
1104
|
-
userId: [{ type: Input }],
|
|
1105
|
-
isDev: [{ type: Input }],
|
|
1106
|
-
againButtonColor: [{ type: Input }],
|
|
1107
|
-
againButtonTextColor: [{ type: Input }],
|
|
1108
|
-
feedbackEvent: [{ type: Output }],
|
|
1109
|
-
onCloseEvent: [{ type: Output }],
|
|
1110
|
-
openPage: [{ type: Output }],
|
|
1111
|
-
sessionActions: [{ type: Output }],
|
|
1112
|
-
closeBot: [{ type: Output }],
|
|
1113
|
-
connectWithUser: [{ type: Output }],
|
|
1114
|
-
scheduleMeeting: [{ type: Output }]
|
|
1115
|
-
};
|
|
1116
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1kcmF3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkQ6L1NvY2lhbDI3L09uTGluZSBURlMvTGl0ZS1QbGF0Zm9ybS9IaXZlQUktUGFja2FnZXMvcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9jaGF0LWRyYXdlci9jaGF0LWRyYXdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0RBQW9EO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLEVBQUUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVMxRCxNQUFNLE9BQU8sbUJBQW1CO0lBd0Y5QixZQUNVLEdBQXNCLEVBQ3RCLElBQWdCLEVBQ2hCLFNBQXVCLEVBQ3ZCLFVBQXNCLEVBQ3RCLFFBQW1CLEVBQ25CLGFBQTRCLEVBQzVCLFlBQWlDO0lBQ3pDLDZCQUE2Qjs7UUFQckIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUExRm5DLHNCQUFpQixHQUFHLHNCQUFzQixDQUFDO1FBR25ELG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ2YsZ0JBQVcsR0FBVyxVQUFVLENBQUM7UUF3Q2hDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMzQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDeEMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDbkMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3pDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ25DLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMxQyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFdkQsZUFBVSxHQUFHLDZCQUE2QixDQUFBO1FBQzFDLHdCQUFtQixHQUFHLGtCQUFrQixDQUFDO1FBQ3pDLDRCQUF1QixHQUFHLHNCQUFzQixDQUFDO1FBQ2pELDBCQUFxQixHQUFHLG1CQUFtQixDQUFDO1FBQzVDLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsWUFBTyxHQUFVLEVBQUUsQ0FBQztRQUNwQixZQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUM1QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUNuQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ3pCLFNBQUksR0FBVyxNQUFNLENBQUM7UUFDdEIsaUJBQVksR0FBVSxFQUFFLENBQUM7UUFDekIsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0IsMkJBQXNCLEdBQWtCLElBQUksQ0FBQztRQUM3QyxnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUN4QixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBdUVkLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUN6QixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQWdWckIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUErSXhCLGtCQUFhLEdBQUcsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUM5QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEMsTUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO1lBRXBDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQy9CLElBQUksR0FBRyxFQUFFO29CQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQzlDO2dCQUVELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU87WUFDVCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSxjQUFjLENBQUM7Z0JBQ3hCLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDdkQsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQThaRixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUVoQyxtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQThHcEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzVCLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQWM3QixXQUFXO1FBQ1gscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLGVBQWU7UUFFZixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixxQkFBZ0IsR0FBRyxFQUFFLENBQUEsQ0FBQyxnQkFBZ0I7UUFDdEMscUJBQWdCLEdBQUcsRUFBRSxDQUFDLENBQUMsa0JBQWtCO1FBQ3pDLE1BQU07UUFDTixNQUFNO1FBQ04sNEVBQTRFO1FBQzVFLDRMQUE0TDtRQUM1TCw2REFBNkQ7UUFDN0QsT0FBTztRQUNQLE1BQU07UUFDTixpRUFBaUU7UUFDakUsa0pBQWtKO1FBQ2xKLHdFQUF3RTtRQUN4RSxPQUFPO1FBQ1AsTUFBTTtRQUNOLHlFQUF5RTtRQUN6RSxnSUFBZ0k7UUFDaEksK0VBQStFO1FBQy9FLE9BQU87UUFDUCxNQUFNO1FBQ04scUZBQXFGO1FBQ3JGLHNIQUFzSDtRQUN0SCwyRkFBMkY7UUFDM0YsT0FBTztRQUNQLE1BQU07UUFDTiwyRUFBMkU7UUFDM0UsNklBQTZJO1FBQzdJLDJGQUEyRjtRQUMzRixNQUFNO1FBQ04sSUFBSTtRQUNKLGFBQVEsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUF5QzdDLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBanBDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyQywyQkFBMkI7UUFDM0IsNkJBQTZCO1FBQzdCLElBQUk7SUFFTixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztRQUVuRSx5Q0FBeUM7UUFDekMsMkNBQTJDO1FBRTNDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLFNBQVMsQ0FDN0IsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFeEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUMvQixDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLENBQUMsRUFDRCxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdELElBQUksQ0FBQyxhQUFhLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBUUQsYUFBYTtRQUNYLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWTthQUN2QywyQkFBMkIsRUFBRTthQUM3QixTQUFTLENBQ1IsQ0FBQyxHQUFHLEVBQUUsRUFBRTs7WUFDTiw4Q0FBOEM7WUFDOUMsVUFBSSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsQ0FBQywwQ0FBRSxXQUFXLEVBQUU7Z0JBQ3ZCLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLFNBQUcsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLENBQUMsMENBQUUsV0FBVyxDQUFDO2dCQUVuSiw0Q0FBNEM7Z0JBQzVDLElBQUksTUFBTSxFQUFFO29CQUNWLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO29CQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0JBQ2hCLElBQUksRUFBRSxJQUFJO3dCQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDO3dCQUM5QyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7cUJBQy9CLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUN0RCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN4QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7aUJBQ3ZCO2dCQUVELElBQUksV0FBVyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztvQkFFL0IsSUFBSSxDQUFDLGdCQUFnQixTQUFHLElBQUksQ0FBQyxXQUFXLDBDQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7b0JBQ3ZFLElBQUksQ0FBQyxnQkFBZ0IsU0FBRyxJQUFJLENBQUMsV0FBVywwQ0FBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0I7b0JBQ3RFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBRTFCO2dCQUVELElBQUksZ0JBQWdCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO29CQUN2RCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQ25ELElBQUksQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQzFCO2dCQUVELElBQUksZ0JBQWdCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO29CQUN2RCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQ25ELHFDQUFxQztvQkFDckMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDO29CQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUMxQjtnQkFFRCxJQUFJLG1CQUFtQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFBRTtvQkFDN0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO29CQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDO29CQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUN6Qix3Q0FBd0M7aUJBQ3pDO2dCQUNELElBQUksV0FBVyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO29CQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUN6Qix3Q0FBd0M7aUJBQ3pDO2dCQUVELGlEQUFpRDthQUNsRDtpQkFBTTtnQkFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7YUFDeEQ7UUFDSCxDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FDRixDQUFDO0lBQ04sQ0FBQztJQUVELHlCQUF5QjtJQUV6QixDQUFDO0lBQ0QsV0FBVyxDQUFDLElBQVMsRUFBRSxJQUFZO1FBQ2pDLFFBQVEsSUFBSSxFQUFFO1lBQ1osS0FBSyxXQUFXO2dCQUVkLE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBRVgsTUFBTTtZQUNSLEtBQUssT0FBTztnQkFFVixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEM7UUFDRCw2QkFBNkI7SUFDL0IsQ0FBQztJQUNELGlCQUFpQixDQUFDLGNBQXNCO1FBQ3RDLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUMvRCwwQ0FBMEM7UUFDMUMsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUU7UUFFN0QsUUFBUSxjQUFjLEVBQUU7WUFDdEIsS0FBSyxDQUFDO2dCQUNKLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtnQkFDbkMsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7Z0JBQ25DLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFO2dCQUNsQyxNQUFNO1lBQ1I7Z0JBQ0UsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNoQixJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFDTCxJQUFJLENBQUMsV0FBVztnQkFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FDakIsZ0dBQWdHLENBQ2pHO1lBQ0gsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQy9CLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQztZQUM5QixjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTTtTQUN6QixDQUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxzQkFBc0IsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzlDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3JCLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLGdCQUFnQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQzVCLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFOztZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLE1BQU0sQ0FBQztZQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFFaEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLGlCQUFpQiwwQ0FBRSxNQUFNLEVBQ3RELENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCO2dCQUN2QixDQUFDLENBQUM7b0JBQ0Esd1RBQXdUO2lCQUN6VCxDQUFDO1lBQ0osSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLGtCQUFrQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDakYsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDOUIsUUFBUSxFQUFFLGtCQUFrQjtTQUM3QixDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN6QyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBTSxtQkFBbUIsQ0FBQyxDQUFDLENBQ3ZELENBQUM7SUFDSixDQUFDO0lBRU8sV0FBVyxDQUFJLFNBQVMsR0FBRyxXQUFXLEVBQUUsTUFBVTtRQUN4RCxPQUFPLENBQUMsS0FBVSxFQUFpQixFQUFFO1lBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLFlBQVksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDdkQsT0FBTyxFQUFFLENBQUMsTUFBVyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNELHVCQUF1QjtJQUN2Qix5QkFBeUI7SUFDekIsc0NBQXNDO0lBQ3RDLDBDQUEwQztJQUMxQyxnQ0FBZ0M7SUFDaEMsUUFBUTtJQUNSLHFCQUFxQjtJQUNyQiw4RkFBOEY7SUFDOUYsYUFBYTtJQUNiLGtDQUFrQztJQUNsQyxnQ0FBZ0M7SUFDaEMsMEJBQTBCO0lBQzFCLFlBQVk7SUFDWixxQ0FBcUM7SUFDckMsaUVBQWlFO0lBQ2pFLGdDQUFnQztJQUNoQywyQkFBMkI7SUFDM0IsV0FBVztJQUNYLFNBQVM7SUFDVCxJQUFJO0lBRUosY0FBYyxDQUFDLEtBQVU7O1FBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ2hCLElBQUksRUFBRSxJQUFJO1lBQ1YsT0FBTyxFQUNMLElBQUksQ0FBQyxXQUFXO2dCQUNoQixJQUFJLENBQUMsY0FBYyxDQUNqQixnR0FBZ0csQ0FDakc7WUFDSCxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxLQUFLLFdBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLFFBQVEsMENBQUUsTUFBTSxDQUFBLEVBQUU7WUFDcEMsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFBRTtvQkFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0JBQ2hCLElBQUksRUFBRSxNQUFNO3dCQUNaLE9BQU8sRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzt3QkFDakQsSUFBSSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQzt3QkFDM0QsTUFBTSxFQUFFLEtBQUs7d0JBQ2IsZUFBZSxFQUFFLEtBQUs7cUJBQ3ZCLENBQUMsQ0FBQztpQkFDSjtnQkFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO29CQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzt3QkFDaEIsSUFBSSxFQUFFLElBQUk7d0JBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3dCQUNqRCxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO3dCQUMzRCxNQUFNLEVBQUUsS0FBSzt3QkFDYixlQUFlLEVBQUUsS0FBSztxQkFDdkIsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7aUJBQ3ZEO1lBQ0gsQ0FBQyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsY0FBYyxDQUFDLE9BQWU7UUFDNUIsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxJQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxvQ0FBb0M7UUFDcEMsd0JBQXdCO1FBRXhCLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFekIsTUFBTSxpQkFBaUIsR0FBRyx3QkFBd0IsQ0FBQztRQUNuRCxNQUFNLFFBQVEsR0FBRyx3Q0FBd0MsQ0FBQztRQUUxRCxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNuQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUMxQixpQkFBaUIsRUFDakIscUNBQXFDLENBQ3RDLENBQUM7WUFDRiw4Q0FBOEM7WUFDOUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQzFCLFFBQVEsRUFDUixxQ0FBcUMsQ0FDdEMsQ0FBQztZQUNGLCtDQUErQztZQUMvQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEM7UUFFRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVyRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ25FLDJDQUEyQztRQUMzQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDdkUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUM1QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLGFBQWEsR0FDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNuRSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUNuQixPQUFPLEVBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUMzQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSCx1RUFBdUU7UUFDdkUsa0NBQWtDO1FBQ2xDLHVDQUF1QztRQUN2Qyw4RUFBOEU7UUFDOUUsSUFBSTtJQUNOLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBWTtRQUN2QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFjO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFNBQVM7O1FBQ1AsSUFBSSxDQUFDLEtBQUssU0FBRyxJQUFJLENBQUMsS0FBSywwQ0FBRSxJQUFJLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQy9CLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ2hCLElBQUksRUFBRSxNQUFNO1lBQ1osT0FBTyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ2xELElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM5QixNQUFNLEVBQUUsS0FBSztZQUNiLGVBQWUsRUFBRSxLQUFLO1NBQ3ZCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFFNUIsTUFBTSxHQUFHLEdBQ1AsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsU0FBUyxDQUFBLENBQUEsSUFBSTtRQUMzQywrQ0FBK0M7UUFDL0MsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNULE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTTthQUN6QjtZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNsQixpQ0FBaUM7Z0JBQ2pDLDJCQUEyQjtnQkFDM0IsNEJBQTRCO2dCQUM1QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO2FBQ3RDLENBQUM7U0FDSCxDQUFDO1lBQ0Esc0NBQXNDO2FBQ3JDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pCLG1EQUFtRDtZQUNuRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUNELFlBQVksQ0FBQyxHQUFHO1FBQ2QsTUFBTSxRQUFRLEdBQUcsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLElBQUksRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUM3QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDaEIsSUFBSSxFQUFFLE1BQU07WUFDWixPQUFPLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQztZQUNoRCxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDOUIsTUFBTSxFQUFFLEtBQUs7WUFDYixlQUFlLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXhCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTVCLE1BQU0sR0FBRyxHQUNQLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLFNBQVMsQ0FBQSxDQUFBLElBQUk7UUFDM0MsK0NBQStDO1FBQy9DLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDVCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU07YUFDekI7WUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsYUFBYSxFQUFFLFFBQVE7Z0JBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNsQixpQ0FBaUM7Z0JBQ2pDLDJCQUEyQjtnQkFDM0IsNEJBQTRCO2dCQUM1QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO2FBQ3RDLENBQUM7U0FDSCxDQUFDO1lBQ0Esc0NBQXNDO2FBQ3JDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxjQUFjO1FBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV4QixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxtQkFBbUIsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFdkYsSUFBSSxDQUFDLElBQUk7YUFDTixHQUFHLENBQXdCLEdBQUcsRUFBRTtZQUMvQixPQUFPLEVBQUU7Z0JBQ1AsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNO2FBQ3pCO1NBQ0YsQ0FBQzthQUNELElBQUksQ0FDSCxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXpELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUV4QixJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNiLE9BQU87YUFDUjtZQUVELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNoQixJQUFJLEVBQUUsSUFBSTtvQkFDVixPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO29CQUNoRCxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQzlCLGFBQWEsRUFBRSxJQUFJO2lCQUNwQixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDdEQseUJBQXlCO2dCQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3pCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBdUJELElBQUksQ0FBQyxVQUFlLEVBQUUsTUFBVyxFQUFFLGNBQXdCO1FBQ3pELE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQU8sRUFBRSxFQUFFOztZQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXZELElBQUksSUFBSSxFQUFFO2dCQUNSLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVCLElBQUksY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLE1BQU0sRUFBRTtvQkFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0JBQ2hCLElBQUksRUFBRSxhQUFhO3dCQUNuQixXQUFXLEVBQUUsY0FBYztxQkFDNUIsQ0FBQyxDQUFBO2lCQUNIO2dCQUVELFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLHlCQUF5QjtnQkFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBRTNCLHFCQUFxQjtnQkFDckIsMkJBQTJCO2dCQUMzQixVQUFVO2dCQUNWLE9BQU87YUFDUjtZQUVELElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxVQUFVLElBQUksWUFBWSxDQUFDO1lBQ2hDLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQzFCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDckUsSUFBSSxnQkFBZ0IsRUFBRTtvQkFDcEIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUNyRCxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDO29CQUN2RCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFFRCxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDekI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Z0JBRTdCLElBQUksZUFBb0IsQ0FBQztnQkFFekIsSUFBSTtvQkFDRixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO29CQUM1QixlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO2lCQUMxRDtnQkFDRCxPQUFPLENBQUMsRUFBRTtvQkFDUixJQUFJO3dCQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTt3QkFDN0IsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO3FCQUM5QztvQkFBQyxPQUFPLENBQUMsRUFBRSxHQUFHO2lCQUNoQjtnQkFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUE7Z0JBRWhDLElBQUksZUFBZSxJQUFJLE9BQUEsZUFBZSxhQUFmLGVBQWUsdUJBQWYsZUFBZSxDQUFFLFVBQVUsMENBQUUsTUFBTSxJQUFHLENBQUMsRUFBRTtvQkFDOUQsSUFBSSxlQUFlLENBQUMsVUFBVSxJQUFJLGdCQUFnQixJQUFJLGVBQWUsQ0FBQyxVQUFVLElBQUksYUFBYSxJQUFJLGVBQWUsQ0FBQyxVQUFVLElBQUkseUJBQXlCLEVBQUU7d0JBQzVKLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUN0QyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztxQkFDekM7b0JBRUQsSUFBSSxlQUFlLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTt3QkFDOUQsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO3dCQUNwQixNQUFBLGVBQWUsQ0FBQyxPQUFPLDBDQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTs0QkFDekMsVUFBVSxHQUFHLENBQUMsR0FBRyxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7d0JBQ25ELENBQUMsRUFBRTt3QkFFSCxJQUFJLENBQUEsVUFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLE1BQU0sSUFBRyxDQUFDOzRCQUN4QixJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQzFDO29CQUVELElBQUksZUFBZSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksT0FBQSxlQUFlLENBQUMsT0FBTywwQ0FBRSxNQUFNLElBQUcsQ0FBQyxFQUFFO3dCQUNqRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs0QkFDakIsU0FBUyxFQUFFLGVBQWUsQ0FBQyxVQUFVOzRCQUNyQyxVQUFVLEVBQUUsZUFBZSxDQUFDLE9BQU87eUJBQ3BDLENBQUMsQ0FBQTtxQkFDSDtvQkFFRCxJQUFJLGVBQWUsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO3dCQUM1RCxJQUFJLFFBQVEsU0FBRyxlQUFlLENBQUMsT0FBTywwQ0FBRSxNQUFNLENBQUM7d0JBQy9DLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTs0QkFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0NBQ2pCLFNBQVMsRUFBRSx3QkFBd0I7Z0NBQ25DLE1BQU0sRUFBRSxlQUFlLENBQUMsT0FBTzs2QkFDaEMsQ0FBQyxDQUFBO3lCQUNIOzZCQUNJLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRTs0QkFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0NBQ2pCLFNBQVMsRUFBRSxlQUFlLENBQUMsVUFBVTtnQ0FDckMsYUFBYSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7NkJBQ25ELENBQUMsQ0FBQTt5QkFDSDtxQkFDRjtvQkFFRCxJQUFJLGVBQWUsQ0FBQyxZQUFZLElBQUksTUFBTSxFQUFFO3dCQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs0QkFDakIsU0FBUyxFQUFFLGVBQWUsQ0FBQyxVQUFVOzRCQUNyQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE9BQU87eUJBQ2hDLENBQUMsQ0FBQzt3QkFFSCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRTs0QkFDMUIsZUFBZSxDQUFDLE9BQU8sSUFBSSxNQUFNLEdBQUcsb0RBQW9ELENBQUE7eUJBQ3pGO3FCQUNGO29CQUlELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUNoQixJQUFJLEVBQUUsSUFBSTt3QkFDVixPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU87d0JBQ2hDLE1BQU0sRUFBRSxlQUFlO3dCQUN2QixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7cUJBQy9CLENBQUMsQ0FBQztvQkFFSCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRTt3QkFDMUIsVUFBVSxDQUFDLEdBQUcsRUFBRTs0QkFDZCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQzt3QkFDL0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3FCQUNUO29CQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2lCQUN0QjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzt3QkFDaEIsSUFBSSxFQUFFLElBQUk7d0JBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVO3dCQUN4QixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7cUJBQy9CLENBQUMsQ0FBQztpQkFDSjtnQkFFRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3pCO1lBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXRCLHFEQUFxRDtZQUNyRCxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBYTtRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLGVBQWUsQ0FBQztRQUN4RCxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ1QsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNO2FBQ3pCO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN6RSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNYLElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNoQixJQUFJLEVBQUUsSUFBSTtvQkFDVixPQUFPLEVBQ0wsSUFBSSxDQUFDLGVBQWU7d0JBQ3BCLDZDQUE2QztvQkFDL0MsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUM5QixhQUFhLEVBQUUsSUFBSTtpQkFDcEIsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7Z0JBQ25DLE9BQU87YUFDUjtZQUVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNoQixJQUFJLEVBQUUsSUFBSTtnQkFDVixPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FDMUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUNqRDtnQkFDRCxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQzlCLGFBQWEsRUFBRSxJQUFJO2FBQ3BCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxrQkFBa0I7Z0JBQ3JCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7WUFDakUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQVE7UUFDcEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUVuRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFO1lBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7U0FDeEQ7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxlQUFlLENBQUMsR0FBUTtRQUN0QixJQUFJLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUM5QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDdkQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUs7WUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN2RCxDQUFDO0lBQ0QsZUFBZSxDQUFDLEtBQVU7UUFDeEIsb0NBQW9DO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ2xELFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckQsdUNBQXVDO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLHVDQUF1QztZQUN2QyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVM7Z0JBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztZQUMzQyxJQUFJLE9BQU8sRUFBRSxHQUFHLENBQUM7Z0JBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBVztRQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUE7UUFDbkQsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVwQixJQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLEVBQUU7U0FFcEI7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLGdGQUFnRjtRQUNoRixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtRQUVELHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUNyRCxJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDeEI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDM0I7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzVDLElBQUksTUFBTSxFQUFFO2dCQUNWLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFO3dCQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtxQkFDaEU7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELHFCQUFxQixDQUFDLEdBQUc7UUFDdkIsTUFBTSxHQUFHLEdBQ1AsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsV0FBVyxJQUFJLENBQUMsT0FBTyx5QkFBeUIsQ0FBQTtRQUMvRSxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ1QsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsZUFBZSxFQUFFLFNBQVMsR0FBRyxpQkFBaUI7YUFDL0M7WUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7U0FDMUIsQ0FBQzthQUNDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pCLElBQUksUUFBUSxDQUFDLEVBQUUsRUFBRTtnQkFDZixPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLHNDQUFzQzthQUMvRDtpQkFBTTtnQkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7YUFDakQ7UUFDSCxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNiLElBQUksQ0FBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsTUFBTSxJQUFHLENBQUMsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO2dCQUN0QyxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3pCO1FBQ0gsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELG9CQUFvQixDQUFDLFNBQVMsRUFBRSxNQUFNO1FBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLFNBQVM7WUFDVCxNQUFNO1NBQ1AsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUUsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLGdFQUFnRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFNO1FBQ2xCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3BDLE1BQU07U0FDUCxDQUFDLENBQUM7UUFFSCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELHVCQUF1QixDQUFDLElBQUk7UUFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFNO1FBQ2YsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBQ3JGLENBQUM7SUFFRCxhQUFhLENBQUMsTUFBTTtRQUNsQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDO1lBQzlCLGNBQWMsRUFBRSxrQkFBa0I7WUFDbEMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzFCLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDYixHQUFHLENBQ0YsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsV0FBVyxJQUFJLENBQUMsT0FBTyw2REFBNkQsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUM5SCxFQUFFLE9BQU8sRUFBRSxDQUNaO2FBQ0EsSUFBSSxDQUNILFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDO1lBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDeEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQztZQUM5QixjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUMxQixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJO2FBQ2IsR0FBRyxDQUNGLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLFdBQVcsSUFBSSxDQUFDLE9BQU8scUNBQXFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFDdEcsRUFBRSxPQUFPLEVBQUUsQ0FDWjthQUNBLElBQUksQ0FDSCxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztZQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFPRCxpQ0FBaUM7SUFDakMsY0FBYztRQUNaLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdDLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBWTs7UUFFdEIsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssRUFBRTtRQUN0RCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBRTNCLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBVTtRQUN0QixtQ0FBbUM7UUFDbkMscUJBQXFCO1FBQ3JCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0QsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDakQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGNBQWM7O1FBQ1osYUFBTyxJQUFJLENBQUMsTUFBTSwwQ0FBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7SUFDdEQsQ0FBQztJQUVELHFCQUFxQjs7UUFDbkIsTUFBTSxjQUFjLFNBQUcsSUFBSSxDQUFDLE1BQU0sMENBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLElBQUksY0FBYyxJQUFJLENBQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLE1BQU0sTUFBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxZQUFZLENBQUM7U0FDckI7YUFBTTtZQUNMLE9BQU8sQ0FBQSxjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUUsTUFBTSxJQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUUsTUFBTSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUUsTUFBTSxpQkFBaUIsQ0FBQztTQUM5SDtJQUNILENBQUM7SUFDRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxZQUFZLElBQUksQ0FBQyxLQUFLLGdCQUFnQixDQUFDO1FBQ2pGLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDO1lBQzlCLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzlDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3JCLElBQUksR0FBRyxFQUFFO2dCQUNQLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGlDQUMxQixLQUFLLEtBQ1IsUUFBUSxFQUFFLEtBQUssSUFDZixDQUFDLENBQUM7YUFDTDtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFeEIsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUV4RCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUdELFdBQVc7UUFDVCxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7YUFDcEIsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUlELHNDQUFzQztJQUN0Qyx3QkFBd0IsQ0FBQyxRQUFnQjtRQUN2QyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztZQUNqRCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsMkNBQTJDO1FBRTNDLDJDQUEyQztRQUMzQyxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUN6RSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzVCLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssR0FBRyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBRUgsaURBQWlEO1FBRWpELHVDQUF1QztRQUN2QyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1FBRXRGLGdEQUFnRDtRQUVoRCx1Q0FBdUM7UUFDdkMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUU3RCw4Q0FBOEM7UUFFOUMsaUNBQWlDO1FBQ2pDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRS9DLHVEQUF1RDtRQUV2RCw2Q0FBNkM7UUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU5QyxpREFBaUQ7UUFFakQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUlELGNBQWM7UUFDWixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ3JELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDdkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBb0NELGlDQUFpQztJQUNqQyxhQUFhLENBQUMsR0FBVztRQUN2QixJQUFJO1lBQ0YsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQywyQkFBMkI7U0FDbkU7UUFBQyxXQUFNO1lBQ04sT0FBTyxTQUFTLENBQUM7U0FDbEI7SUFDSCxDQUFDO0lBRUQsNEJBQTRCO0lBQzVCLGFBQWEsQ0FBQyxHQUFXO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsT0FBTyxvREFBb0QsTUFBTSxFQUFFLENBQUM7SUFDdEUsQ0FBQztJQUNELFdBQVc7UUFFVCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNuRSxJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztTQUMvQjtJQUNILENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMscUNBQXFDO1FBQy9ELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBQ0QsY0FBYztRQUNaLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMscUNBQXFDO1lBQy9ELDZDQUE2QztZQUM3QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDbkUsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2FBQ2hDO1FBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUdELFlBQVksQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQ0Qsc0JBQXNCO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNuRSxJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQzdEO0lBQ0gsQ0FBQztJQUNELGdCQUFnQixDQUFDLElBQVk7UUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUIsQ0FBQzs7O1lBeHdDRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHFCQUFxQjtnQkFDL0IsdysxREFBMkM7Z0JBRTNDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOzthQUNoRDs7O1lBNUJDLGlCQUFpQjtZQUhWLFVBQVU7WUFnQlYsWUFBWTtZQVhuQixVQUFVO1lBTVYsU0FBUztZQVlGLGFBQWE7WUFGYixtQkFBbUI7Ozt1QkFZekIsU0FBUyxTQUFDLFVBQVU7cUNBQ3BCLFlBQVksU0FBQyx1QkFBdUI7cUJBQ3BDLFNBQVMsU0FBQyxRQUFROzRCQUNsQixTQUFTLFNBQUMsZUFBZTt5QkFFekIsU0FBUyxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7MEJBR3pDLEtBQUs7d0JBQ0wsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7eUJBQ0wsS0FBSzsyQkFDTCxLQUFLO3lCQUNMLEtBQUs7c0JBQ0wsS0FBSzt3QkFDTCxLQUFLO29CQUNMLEtBQUs7K0JBQ0wsS0FBSztpQ0FDTCxLQUFLOzBCQUNMLEtBQUs7NEJBQ0wsS0FBSzs0QkFDTCxLQUFLO3NCQUNMLEtBQUs7MkJBQ0wsS0FBSzt3QkFDTCxLQUFLO3NCQUNMLEtBQUs7K0JBQ0wsS0FBSztpQ0FDTCxLQUFLO3VCQUNMLEtBQUs7NkJBQ0wsS0FBSzt1QkFDTCxLQUFLO2lDQUNMLEtBQUs7bUNBQ0wsS0FBSztvQkFDTCxLQUFLOzhCQUNMLEtBQUs7a0NBQ0wsS0FBSzt3QkFDTCxLQUFLO2lDQUNMLEtBQUs7OEJBQ0wsS0FBSzt1QkFDTCxLQUFLOytCQUNMLEtBQUs7d0JBQ0wsS0FBSztxQkFDTCxLQUFLO29CQUNMLEtBQUs7K0JBRUwsS0FBSzttQ0FDTCxLQUFLOzRCQUNMLE1BQU07MkJBQ04sTUFBTTt1QkFDTixNQUFNOzZCQUNOLE1BQU07dUJBQ04sTUFBTTs4QkFDTixNQUFNOzhCQUNOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RHJhd2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IGZvcm1hdE5vdywgZm9ybWF0VGltZVN0YW1wcyB9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgZGV2X2Vudmlyb25tZW50LCBwcm9kX2Vudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcclxuaW1wb3J0IHsgQ29udmVyc2F0aW9uU2VydmljZSB9IGZyb20gJy4uL2NvbnZlcnNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTb2NrZXRTZXJ2aWNlIH0gZnJvbSAnLi4vc29ja2V0LXNlcnZpY2Uuc2VydmljZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdoaXZlZ3B0LWNoYXQtZHJhd2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2hhdC1kcmF3ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NoYXQtZHJhd2VyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0RHJhd2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAVmlld0NoaWxkKCdjaGF0TWFpbicpIHByaXZhdGUgY2hhdE1haW46IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZHJlbignY2xvc2VwbGF5Z3JvdW5kYnV0dG9uJykgY2xvc2VQbGF5Z3JvdW5kQnV0dG9uczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG4gIEBWaWV3Q2hpbGQoJ2RyYXdlcicpIGRyYXdlciE6IE1hdERyYXdlcjtcclxuICBAVmlld0NoaWxkKCdzb3VyY2VzRHJhd2VyJykgc291cmNlc0RyYXdlciE6IE1hdERyYXdlcjtcclxuICBwcml2YXRlIGJvZHlPdmVyZmxvd0NsYXNzID0gJ2JvZHktb3ZlcmZsb3ctaGlkZGVuJztcclxuICBAVmlld0NoaWxkKCdteVRleHRhcmVhJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgbXlUZXh0YXJlYSE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47IC8vIFJlZmVyZW5jZSB0byB0aGUgdGV4dGFyZWFcclxuICBpc0NvbGxhcHNlZFRydWUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjb3BpbG90TmFtZTogc3RyaW5nID0gXCJIaXZlWEdQVFwiO1xyXG4gIEBJbnB1dCgpIGZpcnN0TmFtZSE6IHN0cmluZztcclxuICBASW5wdXQoKSBsYXN0TmFtZSE6IHN0cmluZztcclxuICBASW5wdXQoKSBhcGlLZXkhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYmdCdWJibGVBaSE6IHN0cmluZztcclxuICBASW5wdXQoKSBiZ0J1YmJsZVVzZXIhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYmdHcmFkaWVudCE6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIGJvdE5hbWUhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYm90U2tpbGxzITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGJvdElkITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNsb3NlQnV0dG9uQ29sb3IhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY2xvc2VCdXR0b25iZ0NvbG9yITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNyZWRlbnRpYWxzITogW107XHJcbiAgQElucHV0KCkgZGF0ZVRpbWVDb2xvciE6IHN0cmluZztcclxuICBASW5wdXQoKSBkYXRlVGV4dENvbG9yITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGV2ZW50SWQhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgczI3VXNlclRva2VuITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGV2ZW50TmFtZSE6IHN0cmluZztcclxuICBASW5wdXQoKSBib3RJY29uITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGZvcm1GaWVsZEJnQ29sb3IhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZm9ybUZpZWxkVGV4dENvbG9yITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGZ1bGxWaWV3ITogYm9vbGVhbjtcclxuICBASW5wdXQoKSBncmFkaWVudENvbG9ycyE6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIGdyZWV0aW5nITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG1lc3NhZ2VUZXh0Q29sb3JBaSE6IHN0cmluZztcclxuICBASW5wdXQoKSBtZXNzYWdlVGV4dENvbG9yVXNlciE6IHN0cmluZztcclxuICBASW5wdXQoKSBydWxlcyE6IHN0cmluZztcclxuICBASW5wdXQoKSBzZW5kQnV0dG9uQ29sb3IhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2VuZEJ1dHRvblRleHRDb2xvciE6IHN0cmluZztcclxuICBASW5wdXQoKSBzaG93Q2xvc2UhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHRodW1ic0Rvd25NZXNzYWdlcyE6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIHRodW1ic1VwTWVzc2FnZSE6IHN0cmluZztcclxuICBASW5wdXQoKSB0aW1lem9uZSE6IHN0cmluZztcclxuICBASW5wdXQoKSB1bmtub3duUmVzcG9uc2VzITogW107XHJcbiAgQElucHV0KCkgdXNlT3BlbkFpITogYm9vbGVhbjtcclxuICBASW5wdXQoKSB1c2VySWQhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaXNEZXYhOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBhZ2FpbkJ1dHRvbkNvbG9yITogc3RyaW5nW107XHJcbiAgQElucHV0KCkgYWdhaW5CdXR0b25UZXh0Q29sb3IhOiBzdHJpbmdbXTtcclxuICBAT3V0cHV0KCkgZmVlZGJhY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSBvbkNsb3NlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIG9wZW5QYWdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHNlc3Npb25BY3Rpb25zID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGNsb3NlQm90ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGNvbm5lY3RXaXRoVXNlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzY2hlZHVsZU1lZXRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgYXV0b2dlbktleSA9IFwiQXV0b2dlbl9lREpUdEVVLU5CMFJ0SXB6cTF3XCJcclxuICBhZGRUb015QWdlbmRhQWN0aW9uID0gXCJhZGRfdG9fbXlfYWdlbmRhXCI7XHJcbiAgbXlVcGNvbWluZ1Nlc3Npb25BY3Rpb24gPSBcIm15X3VwY29tbWluZ19zZXNzaW9uXCI7XHJcbiAgY29ubmVjdE9yRm9sbG93QWN0aW9uID0gXCJjb25uZWN0X29yX2ZvbGxvd1wiO1xyXG4gIGFpUmVzcG9uc2U6IHN0cmluZyA9ICcnO1xyXG4gIGNoYXRMb2c6IGFueVtdID0gW107XHJcbiAgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xyXG4gIGZlZWRiYWNrRG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGdyZWV0aW5nTXNnOiBzdHJpbmcgPSAnJztcclxuICBoYXNCYWNrZHJvcFZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaW5wdXQ6IHN0cmluZyA9ICcnO1xyXG4gIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTtcclxuICBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbW9kZTogc3RyaW5nID0gJ292ZXInO1xyXG4gIHF1aWNrUHJvbXB0czogYW55W10gPSBbXTtcclxuICB0aHVtYnNEb3duTXNnSW5kZXggPSAwO1xyXG4gIHVzZXJOYW1lOiBzdHJpbmcgPSAnJztcclxuICBzaG93U3RhcnRBZ2FpbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzSU9TRGV2aWNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd0ZlZWRCYWNrSWNvbnNJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgdGVtcGVyYXR1cmU6IG51bWJlciA9IDE7XHJcbiAgc3BlYWtlcnMgPSBbXTtcclxuICBlbnZpcm9ubWVudDoge1xyXG4gICAgVVNFUlNfQVBJLFxyXG4gICAgQkFTRV9VUkwsXHJcbiAgICBBR0VOVFNfQVBJXHJcbiAgfTtcclxuICBwZW5kaW5nUmVxdWVzdHM6IGFueTtcclxuICBteUNvbm5lY3Rpb25zOiBhbnk7XHJcbiAgY29udmVyc2F0aW9uS2V5OiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgc29ja2V0U2VydmljZTogU29ja2V0U2VydmljZSxcclxuICAgIHByaXZhdGUgY29udmVyc2F0aW9uOiBDb252ZXJzYXRpb25TZXJ2aWNlXHJcbiAgICAvLyBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybVxyXG4gICkge1xyXG4gICAgdGhpcy5jaGF0TWFpbiA9IG5ldyBFbGVtZW50UmVmKG51bGwpO1xyXG5cclxuICAgIC8vIGlmICh0aGlzLnBsYXRmb3JtLklPUykge1xyXG4gICAgLy8gICB0aGlzLmlzSU9TRGV2aWNlID0gdHJ1ZTtcclxuICAgIC8vIH1cclxuXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLmlzRGV2ID8gZGV2X2Vudmlyb25tZW50IDogcHJvZF9lbnZpcm9ubWVudDtcclxuXHJcbiAgICAvLyB0aGlzLmZldGNoTXlDb25uZWN0aW9ucygpLnN1YnNjcmliZSgpO1xyXG4gICAgLy8gdGhpcy5mZXRjaFBlbmRpbmdSZXF1ZXN0cygpLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuY2hhbmdlVGVtcGVyYXR1cmUodGhpcy50ZW1wZXJhdHVyZSk7XHJcbiAgICB0aGlzLmZldGNoQm90Q29uZmlnKCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZmV0Y2hDaGF0SGlzdG9yeSgpLnN1YnNjcmliZShcclxuICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5tYXBDaGF0SGlzdG9yeShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5OicsIGVycik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNoYXQgaGlzdG9yeTonLCBlcnIpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5mZXRjaEFnZW50cygpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLmluaXRpYWxpemVTb2NrZXQoKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RlblNvY2tldHMoKTtcclxuICAgIH0sIDIwMCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZXZlbnRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBpbml0aWFsaXplU29ja2V0KCkge1xyXG4gICAgO1xyXG4gICAgY29uc3QgY29udmVyc2F0aW9uX2lkID0gdGhpcy5jb252ZXJzYXRpb24uZ2V0S2V5KHRoaXMuYm90SWQpO1xyXG5cclxuICAgIHRoaXMuc29ja2V0U2VydmljZS5yZWdpc3RlclVzZXJTcGVjaWZpY0hpdmVTb2NrZXQodGhpcy5ib3RJZCwgY29udmVyc2F0aW9uX2lkKTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmlwdGlvbk5ldzogYW55O1xyXG4gIHNvY2tldERhdGE6IGFueTtcclxuICBleGVjdXRpb25QYXRoSW1hZ2VzID0gW107XHJcbiAgc2VhcmNoVGVybXMgPSBbXTtcclxuICBmaW5hbmNpYWxHcmFwaHMgPSBbXTtcclxuXHJcbiAgbGlzdGVuU29ja2V0cygpIHtcclxuICAgIHRoaXMuZXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmNvbnZlcnNhdGlvblxyXG4gICAgICAuZ2V0VXNlclNwZWNpZmljTm90aWZpY2F0aW9uKClcclxuICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAocmVzKSA9PiB7XHJcbiAgICAgICAgICAvLyBDaGVjayBpZiBPdGhlckZpZWxkcyBleGlzdHMgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgICAgICBpZiAocmVzPy5tPy5PdGhlckZpZWxkcykge1xyXG4gICAgICAgICAgICBjb25zdCB7IGNvbnZlcnNhdGlvbl9pZCwgYm90X2lkLCBhbnN3ZXIsIHdlYl9yZXN1bHRzLCBmaW5hbmNpYWxfZ3JhcGhzLCBleGVjdXRpb25fZ3JhcGhzLCBvbmxpbmVfc2VhcmNoX3Rlcm1zLCBzdWdnZXN0aW9ucyB9ID0gcmVzPy5tPy5PdGhlckZpZWxkcztcclxuXHJcbiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgZmllbGRzIGJhc2VkIG9uIHRoZWlyIHByZXNlbmNlXHJcbiAgICAgICAgICAgIGlmIChhbnN3ZXIpIHtcclxuICAgICAgICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbnN3ZXI6JywgYW5zd2VyKTtcclxuICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnYWknLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoYW5zd2VyKSxcclxuICAgICAgICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh3ZWJfcmVzdWx0cyAmJiBBcnJheS5pc0FycmF5KHdlYl9yZXN1bHRzKSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXZWIgUmVzdWx0czonLCB3ZWJfcmVzdWx0cyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzTGlzdCA9IHdlYl9yZXN1bHRzO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmRpc3BsYXllZFNvdXJjZXMgPSB0aGlzLnNvdXJjZXNMaXN0Py5zbGljZSgwLCAzKTsgLy8gRmlyc3QgMyBjYXJkc1xyXG4gICAgICAgICAgICAgIHRoaXMucmVtYWluaW5nU291cmNlcyA9IHRoaXMuc291cmNlc0xpc3Q/LnNsaWNlKDMpOyAvLyBSZW1haW5pbmcgaXRlbXNcclxuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZmluYW5jaWFsX2dyYXBocyAmJiBBcnJheS5pc0FycmF5KGZpbmFuY2lhbF9ncmFwaHMpKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZpbmFuY2lhbCBHcmFwaHM6JywgZmluYW5jaWFsX2dyYXBocyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5maW5hbmNpYWxHcmFwaHMgPSBmaW5hbmNpYWxfZ3JhcGhzO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV4ZWN1dGlvbl9ncmFwaHMgJiYgQXJyYXkuaXNBcnJheShleGVjdXRpb25fZ3JhcGhzKSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFeGVjdXRpb24gR3JhcGhzOicsIGV4ZWN1dGlvbl9ncmFwaHMpO1xyXG4gICAgICAgICAgICAgIC8vIFByb2Nlc3MgZXhlY3V0aW9uIGdyYXBocyBhcyBuZWVkZWRcclxuICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGlvblBhdGhJbWFnZXMgPSBleGVjdXRpb25fZ3JhcGhzO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9ubGluZV9zZWFyY2hfdGVybXMgJiYgQXJyYXkuaXNBcnJheShvbmxpbmVfc2VhcmNoX3Rlcm1zKSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdPbmxpbmUgU2VhcmNoIFRlcm1zOicsIG9ubGluZV9zZWFyY2hfdGVybXMpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGVybXMgPSBvbmxpbmVfc2VhcmNoX3Rlcm1zO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAvLyBQcm9jZXNzIG9ubGluZSBzZWFyY2ggdGVybXMgYXMgbmVlZGVkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25zICYmIEFycmF5LmlzQXJyYXkoc3VnZ2VzdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1Z2dlc3Rpb25zOicsIHN1Z2dlc3Rpb25zKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlbGF0ZWRMaXN0SXRlbXMgPSBzdWdnZXN0aW9ucztcclxuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgLy8gUHJvY2VzcyBvbmxpbmUgc2VhcmNoIHRlcm1zIGFzIG5lZWRlZFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBBZGQgYW55IG90aGVyIGZpZWxkcyBhbmQgdGhlaXIgcHJvY2Vzc2luZyBoZXJlXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ090aGVyRmllbGRzIGlzIG1pc3NpbmcgaW4gdGhlIHJlc3BvbnNlJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmV2ZW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBmZXRjaGluZyBkYXRhIGZyb20gc29ja2V0JywgZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplU29ja2V0QW5kTGlzdGVuKCkge1xyXG5cclxuICB9XHJcbiAgaGFuZGxlRXZlbnQoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcpIHtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlICd3ZWJyZXN1bHQnOlxyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnYW5zd2VyJzpcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2dyYXBoJzpcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZXZlbnRTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5ldmVudFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgLy90aGlzLnNvY2tldFNlcnZpY2UuY2xvc2UoKTtcclxuICB9XHJcbiAgY2hhbmdlVGVtcGVyYXR1cmUobmV3VGVtcGVyYXR1cmU6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xyXG4gICAgdGhpcy50ZW1wZXJhdHVyZSA9IG5ld1RlbXBlcmF0dXJlO1xyXG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaXZlZ3B0LWNoYXQtd3JhcHBlcicpXHJcbiAgICAvLyBSZW1vdmUgZXhpc3RpbmcgdGhlbWUgY2xhc3NlcyBmcm9tIGJvZHlcclxuICAgIHdyYXBwZXI/LmNsYXNzTGlzdC5yZW1vdmUoJ2NyZWF0aXZlJywgJ2JhbGFuY2VkJywgJ3ByZWNpc2UnKTtcclxuXHJcbiAgICBzd2l0Y2ggKG5ld1RlbXBlcmF0dXJlKSB7XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICB3cmFwcGVyPy5jbGFzc0xpc3QuYWRkKCdjcmVhdGl2ZScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgd3JhcHBlcj8uY2xhc3NMaXN0LmFkZCgnYmFsYW5jZWQnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIHdyYXBwZXI/LmNsYXNzTGlzdC5hZGQoJ3ByZWNpc2UnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU3RhcnRBZ2FpbigpIHtcclxuICAgIGlmICh0aGlzLmxvYWRpbmcpIHJldHVybjtcclxuICAgIHRoaXMuc2hvd1N0YXJ0QWdhaW4gPSBmYWxzZTtcclxuICAgIHRoaXMuY2hhdExvZyA9IFtdO1xyXG4gICAgdGhpcy5jaGF0TG9nLnB1c2goe1xyXG4gICAgICB0eXBlOiAnYWknLFxyXG4gICAgICBtZXNzYWdlOlxyXG4gICAgICAgIHRoaXMuZ3JlZXRpbmdNc2cgfHxcclxuICAgICAgICB0aGlzLnByb2Nlc3NNZXNzYWdlKFxyXG4gICAgICAgICAgXCJHcmVldGluZ3MhIEknbSB5b3VyIENPUDI4IHZpcnR1YWwgYXNzaXN0YW50LiBIYXZlIHF1ZXN0aW9ucyBhYm91dCB0aGUgZXZlbnQ/IEknbSBoZXJlIHRvIGhlbHAuXCJcclxuICAgICAgICApLFxyXG4gICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXHJcbiAgICB9KTtcclxuICAgIHRoaXMuYXJjaGlldmVNZXNzYWdlcygpLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgYXJjaGlldmVNZXNzYWdlcygpIHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2JvdC9jbGVhci1oaXN0b3J5LyR7dGhpcy5ib3RJZH0vJHt0aGlzLnVzZXJJZH1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwge30sIHsgaGVhZGVycyB9KS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG9mKHJlcyk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBmZXRjaEJvdENvbmZpZygpIHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9ib3RzP2JvdF9pZD0ke3RoaXMuYm90SWR9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYm90TmFtZSA9IHJlcy5OYW1lO1xyXG4gICAgICAgIHRoaXMuYm90SWNvbiA9IHJlcy5JY29uO1xyXG4gICAgICAgIHRoaXMuYm90U2tpbGxzID0gcmVzPy5Ta2lsbHM7XHJcbiAgICAgICAgdGhpcy5ncmVldGluZ01zZyA9IHJlcy5HcmVldGluZztcclxuXHJcbiAgICAgICAgdGhpcy50aHVtYnNEb3duTWVzc2FnZXMgPSByZXM/Lk5lZ2F0aXZlUmVzcG9uc2VzPy5sZW5ndGhcclxuICAgICAgICAgID8gcmVzLk5lZ2F0aXZlUmVzcG9uc2VzXHJcbiAgICAgICAgICA6IFtcclxuICAgICAgICAgICAgXCJXZSBhcmUgc29ycnkgd2UndmUgbm90IGJlZW4gYWJsZSB0byBhbnN3ZXIgeW91ciBxdWVzdGlvbi48YnIvPiBIb3dldmVyLCBvdXIgZGVkaWNhdGVkIHN1cHBvcnQgdGVhbSBpcyBoYXBweSB0byBoZWxwLiA8c3BhbiBjbGFzcz0nZmVlZGJhY2stbGluaycgc3R5bGU9J2N1cnNvcjogcG9pbnRlcjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAjMTcyMzVCOyc+UGxlYXNlIGNsaWNrIGhlcmU8L3NwYW4+IGFuZCBhIGh1bWFuIGFnZW50IHdpbGwgYXNzaXN0IHlvdSBhcyBzb29uIGFzIHBvc3NpYmxlXCIsXHJcbiAgICAgICAgICBdO1xyXG4gICAgICAgIHRoaXMucXVpY2tQcm9tcHRzID0gcmVzLlF1aWNrUHJvbXB0cztcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gb2YocmVzKTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdGJvdCBjb25maWc6ICcsIGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hDaGF0SGlzdG9yeSgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY29udmVyc2F0aW9uS2V5ID0gdGhpcy5jb252ZXJzYXRpb24uZ2V0S2V5KHRoaXMuYm90SWQpO1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vY29udmVyc2F0aW9ucy8ke3RoaXMuY29udmVyc2F0aW9uS2V5fWA7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgJ2FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJ1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IGhlYWRlcnMgfSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yPGFueT4oJ2ZldGNoQ29udmVyc2F0aW9uJykpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcjxUPihvcGVyYXRpb24gPSAnb3BlcmF0aW9uJywgcmVzdWx0PzogVCkge1xyXG4gICAgcmV0dXJuIChlcnJvcjogYW55KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCR7b3BlcmF0aW9ufSBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgcmV0dXJuIG9mKHJlc3VsdCBhcyBUKTtcclxuICAgIH07XHJcbiAgfVxyXG4gIC8vIGZldGNoQ2hhdEhpc3RvcnkoKSB7XHJcbiAgLy8gICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gIC8vICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgLy8gICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgLy8gICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcclxuICAvLyAgIH0pO1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gIC8vICAgICAuZ2V0KGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbktleX1gLCB7IGhlYWRlcnMgfSlcclxuICAvLyAgICAgLnBpcGUoXHJcbiAgLy8gICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgLy8gICAgICAgICByZXR1cm4gb2YocmVzKTtcclxuICAvLyAgICAgICB9KSxcclxuICAvLyAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjaGF0IGhpc3Rvcnk6ICcsIGVycm9yKTtcclxuICAvLyAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gIC8vICAgICAgIH0pXHJcbiAgLy8gICAgICk7XHJcbiAgLy8gfVxyXG5cclxuICBtYXBDaGF0SGlzdG9yeShjaGF0czogYW55KSB7XHJcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgIHR5cGU6ICdhaScsXHJcbiAgICAgIG1lc3NhZ2U6XHJcbiAgICAgICAgdGhpcy5ncmVldGluZ01zZyB8fFxyXG4gICAgICAgIHRoaXMucHJvY2Vzc01lc3NhZ2UoXHJcbiAgICAgICAgICBcIkdyZWV0aW5ncyEgSSdtIHlvdXIgQ09QMjggdmlydHVhbCBhc3Npc3RhbnQuIEhhdmUgcXVlc3Rpb25zIGFib3V0IHRoZSBldmVudD8gSSdtIGhlcmUgdG8gaGVscC5cIlxyXG4gICAgICAgICksXHJcbiAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcclxuICAgIH0pO1xyXG4gICAgaWYgKGNoYXRzICYmIGNoYXRzPy5NZXNzYWdlcz8ubGVuZ3RoKSB7XHJcbiAgICAgIGNoYXRzPy5NZXNzYWdlcy5mb3JFYWNoKChjaGF0OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoY2hhdC5UeXBlID09IFwidXNlclwiKSB7XHJcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICd1c2VyJyxcclxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KSxcclxuICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXHJcbiAgICAgICAgICAgIGNvcGllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2hhdC5UeXBlID09IFwiYWlcIikge1xyXG4gICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xyXG4gICAgICAgICAgICB0eXBlOiAnYWknLFxyXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShjaGF0LlRleHQpLFxyXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXRUaW1lU3RhbXBzKHRoaXMudGltZXpvbmUsIGNoYXQuSW5zZXJ0VGltZXN0YW1wKSxcclxuICAgICAgICAgICAgY29waWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNob3dTdGFydEFnYWluID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc01lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogU2FmZUh0bWwge1xyXG4gICAgaWYgKCFtZXNzYWdlIHx8ICEobWVzc2FnZT8ubGVuZ3RoID4gMCkpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKCdoZXJlIGlzIG15IG1lc3NhZ2UnKVxyXG4gICAgLy8gY29uc29sZS5sb2cobWVzc2FnZSk7XHJcblxyXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UudHJpbSgpO1xyXG5cclxuICAgIGNvbnN0IG1hcmtkb3duTGlua1JlZ2V4ID0gL1xcWyhbXltdKyldXFwoKFteKV0rKVxcKS9nO1xyXG4gICAgY29uc3QgdXJsUmVnZXggPSAvKD88IWhyZWY9XCIpXFxiaHR0cHM/OlxcL1xcL1xcUysoPzwhWy4sXSkvZ2k7XHJcblxyXG4gICAgaWYgKG1hcmtkb3duTGlua1JlZ2V4LnRlc3QobWVzc2FnZSkpIHtcclxuICAgICAgY29uc3QgaHRtbCA9IG1lc3NhZ2UucmVwbGFjZShcclxuICAgICAgICBtYXJrZG93bkxpbmtSZWdleCxcclxuICAgICAgICAnPGEgaHJlZj1cIiQyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+J1xyXG4gICAgICApO1xyXG4gICAgICAvL2NvbnNvbGUubG9nKCdTYW5pdGl6ZWQgbWVzc2FnZTogJywgbWVzc2FnZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLnNhbml0aXplSHRtbChodG1sKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodXJsUmVnZXgudGVzdChtZXNzYWdlKSkge1xyXG4gICAgICBjb25zdCBodG1sID0gbWVzc2FnZS5yZXBsYWNlKFxyXG4gICAgICAgIHVybFJlZ2V4LFxyXG4gICAgICAgICc8YSBocmVmPVwiJCZcIiB0YXJnZXQ9XCJfYmxhbmtcIj4kJjwvYT4nXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdTYW5pdGl6ZWQgbWVzc2FnZTogJywgbWVzc2FnZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLnNhbml0aXplSHRtbChodG1sKTtcclxuICAgIH1cclxuXHJcbiAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKC8oPzpcXHJcXG58XFxyfFxcbikvZywgJzxicj4nKTtcclxuXHJcbiAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKC9cXCpcXCooLio/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpO1xyXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBoZWFkZXJzIHRvIEhUTUwgaGVhZGVyc1xyXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXigjezEsNn0pXFxzKyguKikkL2dtLCAobWF0Y2gsIGhhc2hlcywgdGV4dCkgPT4ge1xyXG4gICAgICBjb25zdCBsZXZlbCA9IGhhc2hlcy5sZW5ndGg7XHJcbiAgICAgIHJldHVybiBgPGgke2xldmVsfT4ke3RleHR9PC9oJHtsZXZlbH0+YDtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgY29uc3Qgc2FuaXRpemVkTWVzc2FnZSA9IHRoaXMuc2FuaXRpemVIdG1sKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIHNhbml0aXplZE1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XHJcbiAgICBjb25zdCBmZWVkYmFja0xpbmtzID1cclxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZlZWRiYWNrLWxpbmsnKTtcclxuICAgIGZlZWRiYWNrTGlua3MuZm9yRWFjaCgobGluazogYW55KSA9PiB7XHJcbiAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICAnY2xpY2snLFxyXG4gICAgICAgIHRoaXMub25GZWVkYmFja0NsaWNrLmJpbmQodGhpcywgJ3plbmRlc2snKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICAvLyBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZlZWRiYWNrLWxpbmsnKSkge1xyXG4gICAgLy8gICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxyXG4gICAgLy8gICAgIC5xdWVyeVNlbGVjdG9yKCcuZmVlZGJhY2stbGluaycpXHJcbiAgICAvLyAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkZlZWRiYWNrQ2xpY2suYmluZCh0aGlzLCAnemVuZGVzaycpKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHNhbml0aXplSHRtbChodG1sOiBzdHJpbmcpOiBTYWZlSHRtbCB7XHJcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoaHRtbCk7XHJcbiAgfVxyXG5cclxuICBvbkZlZWRiYWNrQ2xpY2sodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5mZWVkYmFja0V2ZW50LmVtaXQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb25DbG9zZSgpIHtcclxuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgdGhpcy5ib2R5T3ZlcmZsb3dDbGFzcyk7XHJcbiAgICB0aGlzLm9uQ2xvc2VFdmVudC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBzZW5kTWVzc2FnZVdpdGhUaWxlKHByb21wdDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmlucHV0ID0gcHJvbXB0O1xyXG4gICAgdGhpcy5mZXRjaERhdGEoKTtcclxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICB9XHJcbiAgaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XHJcbiAgZmV0Y2hEYXRhKCkge1xyXG4gICAgdGhpcy5pbnB1dCA9IHRoaXMuaW5wdXQ/LnRyaW0oKTtcclxuICAgIGlmICghdGhpcy5pbnB1dCB8fCB0aGlzLmxvYWRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgdHlwZTogJ3VzZXInLFxyXG4gICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheSh0aGlzLmlucHV0KSxcclxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxyXG4gICAgICBjb3BpZWQ6IGZhbHNlLFxyXG4gICAgICBpc0NvbGxhcHNlZFRydWU6IGZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuXHJcbiAgICB0aGlzLmFpUmVzcG9uc2UgPSAnJztcclxuICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCB1cmwgPVxyXG4gICAgICBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9haS9hc2tgLy8gK1xyXG4gICAgLy8gKHRoaXMudXNlT3BlbkFpID09PSBmYWxzZSA/ICcvbGxtLWhmJyA6ICcnKTtcclxuICAgIGZldGNoKHVybCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgdXNlcl9xdWVzdGlvbjogdGhpcy5pbnB1dCxcclxuICAgICAgICB1c2VyX2lkOiB0aGlzLnVzZXJJZCxcclxuICAgICAgICBib3RfaWQ6IHRoaXMuYm90SWQsXHJcbiAgICAgICAgLy8gdGVtcGVyYXR1cmU6IHRoaXMudGVtcGVyYXR1cmUsXHJcbiAgICAgICAgLy8gIGV2ZW50X2lkOiB0aGlzLmV2ZW50SWQsXHJcbiAgICAgICAgLy8gdG9rZW46IHRoaXMuczI3VXNlclRva2VuLFxyXG4gICAgICAgIGFnZW50czogdGhpcy5hZ2VudHMuZmlsdGVyKHAgPT4gcC5zZWxlY3RlZCkubWFwKHAgPT4gcC5pZCksXHJcbiAgICAgICAgY29udmVyc2F0aW9uX2lkOiB0aGlzLmNvbnZlcnNhdGlvbktleVxyXG4gICAgICB9KSxcclxuICAgIH0pXHJcbiAgICAgIC8vIFJldHJpZXZlIGl0cyBib2R5IGFzIFJlYWRhYmxlU3RyZWFtXHJcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIC8vcmV0dXJuIHRoaXMucmVhZEFsbENodW5rcyhyZXNwb25zZS5ib2R5KTsgICAgICAgIFxyXG4gICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnI6ICcsIGVycik7XHJcbiAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5pbnB1dCA9ICcnO1xyXG4gIH1cclxuICBmZXRjaERhdGFGb3IobXNnKSB7XHJcbiAgICBjb25zdCBpbnB1dE1zZyA9IG1zZz8udHJpbSgpO1xyXG4gICAgaWYgKCFpbnB1dE1zZyB8fCB0aGlzLmxvYWRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgdGhpcy5jaGF0TG9nLnB1c2goe1xyXG4gICAgICB0eXBlOiAndXNlcicsXHJcbiAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGlucHV0TXNnKSxcclxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxyXG4gICAgICBjb3BpZWQ6IGZhbHNlLFxyXG4gICAgICBpc0NvbGxhcHNlZFRydWU6IGZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuXHJcbiAgICB0aGlzLmFpUmVzcG9uc2UgPSAnJztcclxuICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCB1cmwgPVxyXG4gICAgICBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9haS9hc2tgLy8gK1xyXG4gICAgLy8gKHRoaXMudXNlT3BlbkFpID09PSBmYWxzZSA/ICcvbGxtLWhmJyA6ICcnKTtcclxuICAgIGZldGNoKHVybCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgdXNlcl9xdWVzdGlvbjogaW5wdXRNc2csXHJcbiAgICAgICAgdXNlcl9pZDogdGhpcy51c2VySWQsXHJcbiAgICAgICAgYm90X2lkOiB0aGlzLmJvdElkLFxyXG4gICAgICAgIC8vIHRlbXBlcmF0dXJlOiB0aGlzLnRlbXBlcmF0dXJlLFxyXG4gICAgICAgIC8vICBldmVudF9pZDogdGhpcy5ldmVudElkLFxyXG4gICAgICAgIC8vIHRva2VuOiB0aGlzLnMyN1VzZXJUb2tlbixcclxuICAgICAgICBhZ2VudHM6IHRoaXMuYWdlbnRzLmZpbHRlcihwID0+IHAuc2VsZWN0ZWQpLm1hcChwID0+IHAuaWQpLFxyXG4gICAgICAgIGNvbnZlcnNhdGlvbl9pZDogdGhpcy5jb252ZXJzYXRpb25LZXlcclxuICAgICAgfSksXHJcbiAgICB9KVxyXG4gICAgICAvLyBSZXRyaWV2ZSBpdHMgYm9keSBhcyBSZWFkYWJsZVN0cmVhbVxyXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkQWxsQ2h1bmtzKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0VycjogJywgZXJyKTtcclxuICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmlucHV0ID0gJyc7XHJcbiAgfVxyXG4gIGZldGNoU21hbGxUYWxrKCkge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2JvdC9zbWFsbC10YWxrLyR7dGhpcy5ib3RJZH0vJHt0aGlzLnVzZXJJZH1gO1xyXG5cclxuICAgIHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0PHsgc21hbGxUYWxrOiBzdHJpbmcgfT4odXJsLCB7XHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGlsZSBmZXRjaGluZyBzbWFsbCB0YWxrOicsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc21hbGxUYWxrKSB7XHJcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdhaScsXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2UocmVzcG9uc2Uuc21hbGxUYWxrKSxcclxuICAgICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxyXG4gICAgICAgICAgICBpc0ZlZWRiYWNrTXNnOiB0cnVlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMjtcclxuICAgICAgICAgIC8vIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICByZWFkQWxsQ2h1bmtzID0gKHN0cmVhbTogYW55KSA9PiB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XHJcbiAgICBjb25zdCBhbGxTdWdnZXN0aW9uczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICByZWFkZXIuY2xvc2VkLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVhZGluZyBzdHJlYW06ICcsIGVycik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XHJcbiAgICAgIHN0YXJ0OiAoY29udHJvbGxlcikgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnB1bXAoY29udHJvbGxlciwgcmVhZGVyLCBhbGxTdWdnZXN0aW9ucyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICBwdW1wKGNvbnRyb2xsZXI6IGFueSwgcmVhZGVyOiBhbnksIGFsbFN1Z2dlc3Rpb25zOiBzdHJpbmdbXSkge1xyXG4gICAgcmVhZGVyLnJlYWQoKS50aGVuKCh7IGRvbmUsIHZhbHVlIH06IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBsYXN0SXRlbSA9IHRoaXMuY2hhdExvZ1t0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICBpZiAoZG9uZSkge1xyXG4gICAgICAgIGxhc3RJdGVtLm1lc3NhZ2UgPSB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShsYXN0SXRlbS5tZXNzYWdlKTtcclxuICAgICAgICB0aGlzLmNoYXRMb2cucG9wKCk7XHJcbiAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2gobGFzdEl0ZW0pO1xyXG4gICAgICAgIGlmIChhbGxTdWdnZXN0aW9ucz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdzdWdnZXN0aW9ucycsXHJcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBhbGxTdWdnZXN0aW9uc1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcclxuICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xyXG4gICAgICAgIC8vIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB0aGlzLnNob3dTdGFydEFnYWluID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gICB0aGlzLmZldGNoU21hbGxUYWxrKCk7XHJcbiAgICAgICAgLy8gfSwxMDAwKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGRlY29kZWRDaHVuayA9IHRoaXMuZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pO1xyXG4gICAgICB0aGlzLmFpUmVzcG9uc2UgKz0gZGVjb2RlZENodW5rO1xyXG4gICAgICBpZiAobGFzdEl0ZW0udHlwZSA9PT0gJ2FpJykge1xyXG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zTWF0Y2ggPSB0aGlzLmFpUmVzcG9uc2UubWF0Y2goLzxzdWc+KC4qPyk8XFwvc3VnPi9nKTtcclxuICAgICAgICBpZiAoc3VnZ2VzdGlvbnNNYXRjaCkge1xyXG4gICAgICAgICAgc3VnZ2VzdGlvbnNNYXRjaC5mb3JFYWNoKChtYXRjaCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFpUmVzcG9uc2UgPSB0aGlzLmFpUmVzcG9uc2UucmVwbGFjZShtYXRjaCwgXCJcIik7XHJcbiAgICAgICAgICAgIGFsbFN1Z2dlc3Rpb25zLnB1c2gobWF0Y2g/LnJlcGxhY2UoLzxcXC8/c3VnPi9nLCBcIlwiKSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxhc3RJdGVtLm1lc3NhZ2UgPSB0aGlzLmFpUmVzcG9uc2U7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IGFpRm9ybWF0dGVkRGF0YTogYW55O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ3BhcnNpbmcganNvbiAnKVxyXG4gICAgICAgICAgYWlGb3JtYXR0ZWREYXRhID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKHRoaXMuYWlSZXNwb25zZSkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygncGFyc2luZyBqc29uIDInKVxyXG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEgPSBKU09OLnBhcnNlKHRoaXMuYWlSZXNwb25zZSlcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coJ3BhcnNpbmcganNvbiBkb25lJylcclxuXHJcbiAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YSAmJiBhaUZvcm1hdHRlZERhdGE/LnNlY3Rpb25faWQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSAnY29tcGFueV9zZWFyY2gnIHx8IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09ICd1c2VyX3NlYXJjaCcgfHwgYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gJ2luZHVzdHJ5X2NvbXBhbnlfc2VhcmNoJykge1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoTXlDb25uZWN0aW9ucygpLnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoUGVuZGluZ1JlcXVlc3RzKCkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09IHRoaXMubXlVcGNvbWluZ1Nlc3Npb25BY3Rpb24pIHtcclxuICAgICAgICAgICAgdmFyIHNwZWFrZXJJZHMgPSBbXTtcclxuICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQ/LmZvckVhY2goc2Vzc2lvbiA9PiB7XHJcbiAgICAgICAgICAgICAgc3BlYWtlcklkcyA9IFsuLi5zcGVha2VySWRzLCAuLi5zZXNzaW9uLnNwZWFrZXJzXVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzcGVha2VySWRzPy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0U3BlYWtlcnNCeVN0YWZmSWRzKHNwZWFrZXJJZHMpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSB0aGlzLmFkZFRvTXlBZ2VuZGFBY3Rpb24gJiYgYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5vcGVuUGFnZS5uZXh0KHtcclxuICAgICAgICAgICAgICBzZWN0aW9uSWQ6IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkLFxyXG4gICAgICAgICAgICAgIHNlc3Npb25JZHM6IGFpRm9ybWF0dGVkRGF0YS5jb250ZW50XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09IHRoaXMuY29ubmVjdE9yRm9sbG93QWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCB1c2Vyc0xlbiA9IGFpRm9ybWF0dGVkRGF0YS5jb250ZW50Py5sZW5ndGg7XHJcbiAgICAgICAgICAgIGlmICh1c2Vyc0xlbiA+IDEpIHtcclxuICAgICAgICAgICAgICB0aGlzLm9wZW5QYWdlLm5leHQoe1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbklkOiBcIm9wZW5fbmV0d29ya2luZ19kcmF3ZXJcIixcclxuICAgICAgICAgICAgICAgIHNlYXJjaDogYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnRcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHVzZXJzTGVuID09IDEpIHtcclxuICAgICAgICAgICAgICB0aGlzLm9wZW5QYWdlLm5leHQoe1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbklkOiBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCxcclxuICAgICAgICAgICAgICAgIGNvbm5ldFVzZXJJZHM6IFthaUZvcm1hdHRlZERhdGEuY29udGVudFswXS51c2VySWRdXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuaXNfb3Blbl9wYWdlID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3BlblBhZ2UubmV4dCh7XHJcbiAgICAgICAgICAgICAgc2VjdGlvbklkOiBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCxcclxuICAgICAgICAgICAgICBzZWFyY2g6IGFpRm9ybWF0dGVkRGF0YS5jb250ZW50XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVCcm93c2VyKCkpIHtcclxuICAgICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEubWVzc2FnZSArPSBcIlxcblxcblwiICsgJzxhIGlkPVwiY2xvc2VCb3ROb3dcIj5DbGljayBIZXJlPC9hPiB0byBzZWUgcmVzdWx0cy4nXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcblxyXG5cclxuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgICAgICAgbWVzc2FnZTogYWlGb3JtYXR0ZWREYXRhLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgIGFjdGlvbjogYWlGb3JtYXR0ZWREYXRhLFxyXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSlcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlQnJvd3NlcigpKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuYWRkQ2xvc2VCb3RDbGlja0V2ZW50KCk7XHJcbiAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5haVJlc3BvbnNlID0gXCJcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xyXG4gICAgICAgICAgICB0eXBlOiAnYWknLFxyXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmFpUmVzcG9uc2UsXHJcbiAgICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuXHJcbiAgICAgIC8vIEVucXVldWUgdGhlIG5leHQgZGF0YSBjaHVuayBpbnRvIG91ciB0YXJnZXQgc3RyZWFtXHJcbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh2YWx1ZSk7XHJcbiAgICAgIHRoaXMucHVtcChjb250cm9sbGVyLCByZWFkZXIsIGFsbFN1Z2dlc3Rpb25zKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0RmVlZGJhY2soZmxhZzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5mZWVkYmFja0RvbmUgPSB0cnVlO1xyXG4gICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gbnVsbDtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2JvdC9mZWVkYmFja2A7XHJcbiAgICBmZXRjaCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcclxuICAgICAgfSxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBmbGFnLCB1c2VyX2lkOiB0aGlzLnVzZXJJZCwgYm90X2lkOiB0aGlzLmJvdElkIH0pLFxyXG4gICAgfSkudGhlbigoKSA9PiB7XHJcbiAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xyXG4gICAgICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgICAgIG1lc3NhZ2U6XHJcbiAgICAgICAgICAgIHRoaXMudGh1bWJzVXBNZXNzYWdlIHx8XHJcbiAgICAgICAgICAgIGBHcmVhdC4gTWF5IEkgYXNzaXN0IHlvdSB3aXRoIGFueXRoaW5nIGVsc2U/YCxcclxuICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcclxuICAgICAgICAgIGlzRmVlZGJhY2tNc2c6IHRydWUsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB0aGlzLmZlZWRiYWNrRG9uZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlKFxyXG4gICAgICAgICAgdGhpcy50aHVtYnNEb3duTWVzc2FnZXNbdGhpcy50aHVtYnNEb3duTXNnSW5kZXhdXHJcbiAgICAgICAgKSxcclxuICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXHJcbiAgICAgICAgaXNGZWVkYmFja01zZzogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudGh1bWJzRG93bk1zZ0luZGV4ID1cclxuICAgICAgICAodGhpcy50aHVtYnNEb3duTXNnSW5kZXggKyAxKSAlIHRoaXMudGh1bWJzRG93bk1lc3NhZ2VzLmxlbmd0aDtcclxuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgdGhpcy5mZWVkYmFja0RvbmUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gbnVsbDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU3VibWl0KCkge1xyXG4gICAgdGhpcy5mZXRjaERhdGEoKTtcclxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVVwQ2xpY2soaWR4OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmZlZWRiYWNrRG9uZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdWJtaXRGZWVkYmFjayh0cnVlKTtcclxuICAgIHRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkID0gIXRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkKSB7XHJcbiAgICAgIHRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQgPSAhdGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZURvd25DbGljayhpZHg6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZmVlZGJhY2tEb25lKSByZXR1cm47XHJcbiAgICB0aGlzLnN1Ym1pdEZlZWRiYWNrKGZhbHNlKTtcclxuICAgIHRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQgPSAhdGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZDtcclxuICAgIGlmICh0aGlzLmNoYXRMb2dbaWR4XS5saWtlZClcclxuICAgICAgdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQgPSAhdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQ7XHJcbiAgfVxyXG4gIGhhbmRsZUNvcHlDbGljayhpbmRleDogYW55KSB7XHJcbiAgICAvLyBDb3B5IHRoZSBtZXNzYWdlIHRvIHRoZSBjbGlwYm9hcmRcclxuICAgIGNvbnN0IGNvbnRlbnRUb0NvcHkgPSB0aGlzLmNoYXRMb2dbaW5kZXhdLm1lc3NhZ2U7XHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb250ZW50VG9Db3B5KS50aGVuKCgpID0+IHtcclxuICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgbWVzc2FnZSB3YXMgY29waWVkXHJcbiAgICAgIHRoaXMuY2hhdExvZ1tpbmRleF0uY29waWVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAvLyBSZXNldCB0aGUgY29waWVkIHN0YXRlIGFmdGVyIGEgZGVsYXlcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5jb3BpZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0sIDIwMDApOyAvLyBSZXNldCBhZnRlciAyIHNlY29uZHNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2Nyb2xsVG9Cb3R0b20oKSB7XHJcbiAgICBsZXQgY291bnRlciA9IDA7XHJcbiAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy5jaGF0TWFpbi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9XHJcbiAgICAgICAgdGhpcy5jaGF0TWFpbi5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcclxuICAgICAgaWYgKGNvdW50ZXIrKyA+IDUpIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xyXG4gICAgfSwgNSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVBY3Rpb24oYWN0aW9uOiBhbnkpIHtcclxuICAgIGNvbnNvbGUuaW5mbyhcImluY29taW5nIGFjdGlvbiBmcm9tIHRoZSBjaGF0Ym90IEFJXCIpXHJcbiAgICBjb25zb2xlLmluZm8oYWN0aW9uKVxyXG5cclxuICAgIGlmIChhY3Rpb24/LmNvbnRlbnQpIHtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAvLyBDaGVjayBpZiB0aGUgZHJhd2VyIGlzIGluaXRpYWxseSBvcGVuIGFuZCBhcHBseSBvdmVyZmxvdyBoaWRkZW4gdG8gYm9keSBpZiBzb1xyXG4gICAgaWYgKHRoaXMuZHJhd2VyLm9wZW5lZCkge1xyXG4gICAgICB0aGlzLnNldEJvZHlPdmVyZmxvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIExpc3RlbiB0byBjaGFuZ2VzIGluIHRoZSBkcmF3ZXIgYmVpbmcgb3BlbmVkIG9yIGNsb3NlZFxyXG4gICAgdGhpcy5kcmF3ZXIub3BlbmVkQ2hhbmdlLnN1YnNjcmliZSgob3BlbmVkOiBib29sZWFuKSA9PiB7XHJcbiAgICAgIGlmIChvcGVuZWQpIHtcclxuICAgICAgICB0aGlzLnNldEJvZHlPdmVyZmxvdygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQm9keU92ZXJmbG93KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZHJhd2VyLm9wZW5lZENoYW5nZS5zdWJzY3JpYmUoKG9wZW5lZCkgPT4ge1xyXG4gICAgICBpZiAob3BlbmVkKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5teVRleHRhcmVhICYmIHRoaXMubXlUZXh0YXJlYS5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMubXlUZXh0YXJlYS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7IC8vIEZvY3VzIG9uIHRoZSB0ZXh0YXJlYVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Qm9keU92ZXJmbG93KCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCB0aGlzLmJvZHlPdmVyZmxvd0NsYXNzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlQm9keU92ZXJmbG93KCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCB0aGlzLmJvZHlPdmVyZmxvd0NsYXNzKTtcclxuICB9XHJcblxyXG4gIGdldFNwZWFrZXJzQnlTdGFmZklkcyhpZHMpIHtcclxuICAgIGNvbnN0IHVybCA9XHJcbiAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuVVNFUlNfQVBJfS9ldmVudHMvJHt0aGlzLmV2ZW50SWR9L3VzZXJzL2dldC1ieS1zdGFmZi1pZHNgXHJcbiAgICBmZXRjaCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogXCJCZWFyZXIgXCIgKyBcInlvdXJfdG9rZW5faGVyZVwiLFxyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpLFxyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpOyAvLyBQYXJzZSB0aGUgSlNPTiBib2R5IG9mIHRoZSByZXNwb25zZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvay4nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGRhdGEuZm9yRWFjaChzcGVha2VyID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zcGVha2Vyc1tzcGVha2VyLmlkXSA9IHNwZWFrZXI7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgZGF0YTonLCBlcnIpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHBlcmZvcm1TZXNzaW9uQWN0aW9uKHNlc3Npb25JZCwgYWN0aW9uKSB7XHJcbiAgICB0aGlzLnNlc3Npb25BY3Rpb25zLm5leHQoe1xyXG4gICAgICBzZXNzaW9uSWQsXHJcbiAgICAgIGFjdGlvblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRDbG9zZUJvdENsaWNrRXZlbnQoKSB7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2Nsb3NlQm90Tm93Jyk7XHJcbiAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihlbGVtZW50LCAnY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jbG9zZUJvdC5uZXh0KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNNb2JpbGVCcm93c2VyKCkge1xyXG4gICAgcmV0dXJuIC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcclxuICB9XHJcblxyXG4gIGNvbm5lY3RUb1VzZXIodXNlcklkKSB7XHJcbiAgICB0aGlzLmNvbm5lY3RXaXRoVXNlci5lbWl0KHtcclxuICAgICAgY29ubmVjdDogIXRoaXMuY2FuRGlzY29ubmVjdCh1c2VySWQpLFxyXG4gICAgICB1c2VySWRcclxuICAgIH0pO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmZldGNoTXlDb25uZWN0aW9ucygpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5mZXRjaFBlbmRpbmdSZXF1ZXN0cygpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KTtcclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG5cclxuICBzY2hlZHVsZU1lZXRpbmdXaXRoVXNlcih1c2VyKSB7XHJcbiAgICB0aGlzLnNjaGVkdWxlTWVldGluZy5lbWl0KHVzZXIpO1xyXG4gIH1cclxuXHJcbiAgY2FuQ29ubmVjdCh1c2VySWQpIHtcclxuICAgIHJldHVybiAhKHRoaXMuY2FuRGlzY29ubmVjdCh1c2VySWQpIHx8IHRoaXMucGVuZGluZ1JlcXVlc3RzLmZpbmQoYSA9PiBhID09IHVzZXJJZCkpXHJcbiAgfVxyXG5cclxuICBjYW5EaXNjb25uZWN0KHVzZXJJZCkge1xyXG4gICAgcmV0dXJuIHRoaXMubXlDb25uZWN0aW9ucy5maW5kKGNvbm4gPT4gY29ubi51c2VySWQgPT0gdXNlcklkKVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hQZW5kaW5nUmVxdWVzdHMoKSB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ2FwaUtleSc6IHRoaXMuYXV0b2dlbktleVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgIC5nZXQoXHJcbiAgICAgICAgYCR7dGhpcy5lbnZpcm9ubWVudC5VU0VSU19BUEl9L2V2ZW50cy8ke3RoaXMuZXZlbnRJZH0vY29ubmVjdGlvbi1yZXF1ZXN0cy9hdXRvZ2VuL3BlbmRpbmctc2VudC1yZXF1ZXN0cz91c2VySWQ9JHt0aGlzLnVzZXJJZH1gLFxyXG4gICAgICAgIHsgaGVhZGVycyB9XHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSByZXM7XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgIHJldHVybiBvZihyZXMpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHBlbmRpbmcgcmVxdWVzdHM6ICcsIGVycm9yKTtcclxuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hNeUNvbm5lY3Rpb25zKCkge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdhcGlLZXknOiB0aGlzLmF1dG9nZW5LZXlcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0KFxyXG4gICAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuVVNFUlNfQVBJfS9ldmVudHMvJHt0aGlzLmV2ZW50SWR9L3VzZXJzLWNvbm5lY3Rpb25zL2F1dG9nZW4/dXNlcklkPSR7dGhpcy51c2VySWR9YCxcclxuICAgICAgICB7IGhlYWRlcnMgfVxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMubXlDb25uZWN0aW9ucyA9IHJlcztcclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcGVuZGluZyByZXF1ZXN0czogJywgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuXHJcbiAgaXNEcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBhZ2VudHM6IGFueTtcclxuICBzZWxlY3RlZEFnZW50cyA9IFtdO1xyXG4gIGFsbFNlbGVjdGVkID0gZmFsc2U7XHJcbiAgLy8gVG9nZ2xlIHRoZSBkcm9wZG93biB2aXNpYmlsaXR5XHJcbiAgdG9nZ2xlRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gIXRoaXMuaXNEcm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdEFsbChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmFnZW50cz8uZm9yRWFjaChhZ2VudCA9PiBhZ2VudC5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgfVxyXG5cclxuICBvbkFnZW50Q2hhbmdlKGFnZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIC8vYWdlbnQuc2VsZWN0ZWQgPSAhYWdlbnQuc2VsZWN0ZWQ7XHJcbiAgICAvL2NvbnNvbGUubG9nKGFnZW50KTtcclxuICAgIGxldCBhZ2VudEZvdW5kID0gdGhpcy5hZ2VudHMuZmlsdGVyKHAgPT4gcC5pZCA9PSBhZ2VudC5pZCk7XHJcbiAgICBpZiAoYWdlbnRGb3VuZCAmJiBhZ2VudEZvdW5kLmxlbmd0aCA+IDApIHtcclxuICAgICAgYWdlbnRGb3VuZFswXS5zZWxlY3RlZCA9ICFhZ2VudEZvdW5kWzBdLnNlbGVjdGVkO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBhcmVBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFnZW50cz8uZXZlcnkoYWdlbnQgPT4gIWFnZW50LnNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIGdldERyb3Bkb3duSGVhZGVyVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRBZ2VudHMgPSB0aGlzLmFnZW50cz8uZmlsdGVyKGFnZW50ID0+IGFnZW50LnNlbGVjdGVkKTtcclxuICAgIGlmIChzZWxlY3RlZEFnZW50cyAmJiBzZWxlY3RlZEFnZW50cz8ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAnQWxsIEFnZW50cyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gc2VsZWN0ZWRBZ2VudHM/Lmxlbmd0aCA+IDEgPyBgJHtzZWxlY3RlZEFnZW50cz8ubGVuZ3RofSBBZ2VudHMgU2VsZWN0ZWRgIDogYCR7c2VsZWN0ZWRBZ2VudHM/Lmxlbmd0aH0gQWdlbnQgU2VsZWN0ZWRgO1xyXG4gICAgfVxyXG4gIH1cclxuICBmZXRjaEFnZW50c19odHRwKCkge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQUdFTlRTX0FQSX0vQ29QaWxvdC8ke3RoaXMuYm90SWR9L2FjdGl2ZS1hZ2VudHNgO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIHt9LCB7IGhlYWRlcnMgfSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAgIHRoaXMuYWdlbnRzID0gcmVzLm1hcChhZ2VudCA9PiAoe1xyXG4gICAgICAgICAgICAuLi5hZ2VudCxcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgICByZXR1cm4gb2YocmVzKTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdGJvdCBjb25maWc6ICcsIGVycm9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG5cclxuICBmZXRjaEFnZW50cygpIHtcclxuICAgIHRoaXMuZmV0Y2hBZ2VudHNfaHR0cCgpXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8gZXZlbnRzLyR7ZXZlbnRJZH0vdXNlcnMtY29ubmVjdGlvbnNcclxuICBwcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkobWFya2Rvd246IHN0cmluZyk6IFNhZmVIdG1sIHtcclxuICAgIGlmICghbWFya2Rvd24gfHwgIShtYXJrZG93bi5sZW5ndGggPiAwKSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdJbnB1dCBNYXJrZG93biBpcyBudWxsIG9yIGVtcHR5Jyk7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICAvL2NvbnNvbGUubG9nKCdNYXJrZG93biBpbnB1dDonLCBtYXJrZG93bik7XHJcblxyXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBoZWFkZXJzIHRvIEhUTUwgaGVhZGVyc1xyXG4gICAgbGV0IGh0bWwgPSBtYXJrZG93bi5yZXBsYWNlKC9eKCN7MSw2fSlcXHMrKC4qKSQvZ20sIChtYXRjaCwgaGFzaGVzLCB0ZXh0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGxldmVsID0gaGFzaGVzLmxlbmd0aDtcclxuICAgICAgcmV0dXJuIGA8aCR7bGV2ZWx9PiR7dGV4dH08L2gke2xldmVsfT5gO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2coJ0FmdGVyIGhlYWRlciBjb252ZXJzaW9uOicsIGh0bWwpO1xyXG5cclxuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gbGlua3MgdG8gSFRNTCBsaW5rc1xyXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXFxbKFteXFxdXSspXVxcKChbXildKylcXCkvZywgJzxhIGhyZWY9XCIkMlwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPicpO1xyXG5cclxuICAgIC8vICBjb25zb2xlLmxvZygnQWZ0ZXIgbGluayBjb252ZXJzaW9uOicsIGh0bWwpO1xyXG5cclxuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gYm9sZCB0byBIVE1MIHN0cm9uZ1xyXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXFwqXFwqKC4qPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKTtcclxuXHJcbiAgICAvL2NvbnNvbGUubG9nKCdBZnRlciBib2xkIGNvbnZlcnNpb246JywgaHRtbCk7XHJcblxyXG4gICAgLy8gQ29udmVydCBuZXcgbGluZXMgdG8gPGJyPiB0YWdzXHJcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC8oPzpcXHJcXG58XFxyfFxcbikvZywgJzxicj4nKTtcclxuXHJcbiAgICAvLyAgY29uc29sZS5sb2coJ0FmdGVyIGxpbmUgYnJlYWtzIGNvbnZlcnNpb246JywgaHRtbCk7XHJcblxyXG4gICAgLy8gT3B0aW9uYWw6IFNhbml0aXplIHRoZSBIVE1MIHRvIHByZXZlbnQgWFNTXHJcbiAgICBjb25zdCBzYW5pdGl6ZWRIdG1sID0gdGhpcy5zYW5pdGl6ZUh0bWwoaHRtbCk7XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2coJ1Nhbml0aXplZCBIVE1MOicsIHNhbml0aXplZEh0bWwpO1xyXG5cclxuICAgIHJldHVybiBzYW5pdGl6ZWRIdG1sO1xyXG4gIH1cclxuICBpc0NvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIGlzQ29sbGFwc2VkRm9yR3JhcGggPSBmYWxzZTtcclxuICBpc0NvbGxhcHNlZEZvckZHcmFwaCA9IGZhbHNlO1xyXG4gIHRvZ2dsZUNvbGxhcHNlKCkge1xyXG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9ICF0aGlzLmlzQ29sbGFwc2VkO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ29sbGFwc2VHcmFwaCgpIHtcclxuICAgIHRoaXMuaXNDb2xsYXBzZWRGb3JHcmFwaCA9ICF0aGlzLmlzQ29sbGFwc2VkRm9yR3JhcGg7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIHRvZ2dsZUNvbGxhcHNlRkdyYXBoKCkge1xyXG4gICAgdGhpcy5pc0NvbGxhcHNlZEZvckZHcmFwaCA9ICF0aGlzLmlzQ29sbGFwc2VkRm9yRkdyYXBoO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICAvKlJlbGF0ZWQqL1xyXG4gIHJlbGF0ZWRMaXN0SXRlbXMgPSBbXTtcclxuICAvKkVuZCBSZWxhdGVkKi9cclxuXHJcbiAgc291cmNlc0xpc3QgPSBbXTtcclxuICBkaXNwbGF5ZWRTb3VyY2VzID0gW10gLy8gRmlyc3QgMyBjYXJkc1xyXG4gIHJlbWFpbmluZ1NvdXJjZXMgPSBbXTsgLy8gUmVtYWluaW5nIGl0ZW1zXHJcbiAgLy8gICBbXHJcbiAgLy8gICB7XHJcbiAgLy8gICAgIFwidGl0bGVcIjogXCJBSSBOZXdzIEphbnVhcnkgMjAyNDogSW4tRGVwdGggYW5kIENvbmNpc2UgLSBUaGUgQUkgVHJhY2tcIixcclxuICAvLyAgICAgXCJkZXNjXCI6IFwiRWFjaCBtb250aCwgd2UgY29tcGlsZSBzaWduaWZpY2FudCBuZXdzLCB0cmVuZHMsIGFuZCBoYXBwZW5pbmdzIGluIEFJLCBwcm92aWRpbmcgZGV0YWlsZWQgc3VtbWFyaWVzIHdpdGgga2V5IHBvaW50cyBpbiBidWxsZXQgZm9ybSBmb3IgY29uY2lzZSB5ZXQgY29tcGxldGUgdW5kZXJzdGFuZGluZy5cIixcclxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly90aGVhaXRyYWNrLmNvbS9haS1uZXdzLWphbnVhcnktMjAyNC9cIlxyXG4gIC8vICAgfSxcclxuICAvLyAgIHtcclxuICAvLyAgICAgXCJ0aXRsZVwiOiBcIlRvcCBBSSBOZXdzLCBKYW51YXJ5IDIwMjQgLSBFdmVyeXBpeGVsIEpvdXJuYWxcIixcclxuICAvLyAgICAgXCJkZXNjXCI6IFwiSW4gdGhpcyBtb250aGx5IHJvdW5kdXAsIHdlIHNwb3RsaWdodCB0aGUgdG9wIEFJIG5ld3Mgc3RvcmllcyBmcm9tIEphbnVhcnksIGluY2x1ZGluZyB0aGUgT3BlbkFJIHZzLiBUaGUgTmV3IFlvcmsgVGltZXMgTGF3c3VpdC5cIixcclxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly9qb3VybmFsLmV2ZXJ5cGl4ZWwuY29tL3RvcC1haS1uZXdzLWphbnVhcnktMjAyNFwiXHJcbiAgLy8gICB9LFxyXG4gIC8vICAge1xyXG4gIC8vICAgICBcInRpdGxlXCI6IFwiQUkgTmV3cyBKdWx5IDIwMjQ6IEluLURlcHRoIGFuZCBDb25jaXNlIC0gVGhlIEFJIFRyYWNrXCIsXHJcbiAgLy8gICAgIFwiZGVzY1wiOiBcIlRoaXMgcGFnZSBmZWF0dXJlcyBBSSBOZXdzIGZvciBKdWx5IDIwMjQsIGhpZ2hsaWdodGluZyBzaWduaWZpY2FudCBldmVudHMgc3VjaCBhcyBDYW52YSBhY3F1aXJpbmcgTGVvbmFyZG8gQUkuXCIsXHJcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vdGhlYWl0cmFjay5jb20vYWktbmV3cy1qdWx5LTIwMjQtaW4tZGVwdGgtYW5kLWNvbmNpc2UvXCJcclxuICAvLyAgIH0sXHJcbiAgLy8gICB7XHJcbiAgLy8gICAgIFwidGl0bGVcIjogXCJKYW51YXJ5IG5ld3Mgcm91bmR1cDogV2hhdCdzIG5ldyBpbiB0aGUgd29ybGQgb2YgQUk/IC0gUGx1cmFsc2lnaHRcIixcclxuICAvLyAgICAgXCJkZXNjXCI6IFwiT3BlbkFJ4oCZcyBuZXcgR1BUIHN0b3JlLCBidXNpbmVzcy1yZWFkeSBDaGF0R1BUIHBsYW5zLCBhbmQgYSBwcmVkaWN0ZWQgcmlzZSBpbiBBSS1wb3dlcmVkIGN5YmVyY3JpbWUuXCIsXHJcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vd3d3LnBsdXJhbHNpZ2h0LmNvbS9yZXNvdXJjZXMvYmxvZy9kYXRhL2FpLXRoaXMtbW9udGgtamFudWFyeS0yMDI0XCJcclxuICAvLyAgIH0sXHJcbiAgLy8gICB7XHJcbiAgLy8gICAgIFwidGl0bGVcIjogXCJBSSBOZXdzIEF1Z3VzdCAyMDI0OiBJbi1EZXB0aCBhbmQgQ29uY2lzZSAtIFRoZSBBSSBUcmFja1wiLFxyXG4gIC8vICAgICBcImRlc2NcIjogXCJUaGlzIHBhZ2UgZmVhdHVyZXMgQUkgTmV3cyBmb3IgQXVndXN0IDIwMjQsIHdpdGggaGlnaGxpZ2h0cyBzdWNoIGFzIE52aWRpYSBkZWxheWluZyB0aGUg4oCcQmxhY2t3ZWxs4oCdIEIyMDAgQUkgY2hpcHMgZGVsaXZlcnkuXCIsXHJcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vdGhlYWl0cmFjay5jb20vYWktbmV3cy1hdWd1c3QtMjAyNC1pbi1kZXB0aC1hbmQtY29uY2lzZS1kdXBsaWNhdGUvXCJcclxuICAvLyAgIH1cclxuICAvLyBdXHJcbiAgZGF0ZVRpbWUgPSB7IG5vdzogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH07XHJcbiAgLy8gRXh0cmFjdHMgdGhlIGRvbWFpbiBmcm9tIGEgVVJMXHJcbiAgZ2V0RG9tYWluTmFtZSh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB7IGhvc3RuYW1lIH0gPSBuZXcgVVJMKHVybCk7XHJcbiAgICAgIHJldHVybiBob3N0bmFtZS5yZXBsYWNlKC9ed3d3XFwuLywgJycpOyAvLyBSZW1vdmUgJ3d3dy4nIGlmIHByZXNlbnRcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gJ3Vua25vd24nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gR2VuZXJhdGVzIHRoZSBmYXZpY29uIFVSTFxyXG4gIGdldEZhdmljb25VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZG9tYWluID0gdGhpcy5nZXREb21haW5OYW1lKHVybCk7XHJcbiAgICByZXR1cm4gYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vczIvZmF2aWNvbnM/c3o9MTI4JmRvbWFpbj0ke2RvbWFpbn1gO1xyXG4gIH1cclxuICBvbkNhcmRDbGljaygpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLnNvdXJjZXNEcmF3ZXIub3BlbigpO1xyXG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdGNsb3NlcGxheWdyb3VuZGJ1dHRvbicpO1xyXG4gICAgaWYgKGJ1dHRvbikge1xyXG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuICB9XHJcbiAgb25DbG9zZVNvdXJjZSgpIHtcclxuICAgIHRoaXMuc291cmNlc0RyYXdlci5jbG9zZSgpO1xyXG4gICAgdGhpcy5pc0RyYXdlck9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIGlmIG5lZWRlZFxyXG4gICAgdGhpcy5vbkRyYXdlckNsb3NlZCgpO1xyXG4gIH1cclxuICBvbkRyYXdlckNsb3NlZCgpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzRHJhd2VyT3BlbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIGlmIG5lZWRlZFxyXG4gICAgICAvLyBVc2UgbmdDbGFzcyB0byBkeW5hbWljYWxseSBhcHBseSB0aGUgY2xhc3NcclxuICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdGNsb3NlcGxheWdyb3VuZGJ1dHRvbicpO1xyXG4gICAgICBpZiAoYnV0dG9uKSB7XHJcbiAgICAgICAgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICB9XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcbiAgaXNEcmF3ZXJPcGVuID0gdHJ1ZTtcclxuXHJcbiAgdG9nZ2xlRHJhd2VyKHRvZG8pIHtcclxuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gdG9kbztcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMudXBkYXRlQnV0dG9uVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuICB1cGRhdGVCdXR0b25WaXNpYmlsaXR5KCkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdGNsb3NlcGxheWdyb3VuZGJ1dHRvbicpO1xyXG4gICAgaWYgKGJ1dHRvbikge1xyXG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9IHRoaXMuaXNEcmF3ZXJPcGVuID8gJ2Jsb2NrJyA6ICdub25lJztcclxuICAgIH1cclxuICB9XHJcbiAgb3BlbkxpbmtJbk5ld1RhYihsaW5rOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5vcGVuKGxpbmssICdfYmxhbmsnKTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
|
|
1
|
+
// import { Platform } from '@angular/cdk/platform';
|
|
2
|
+
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|
3
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild, ViewChildren, } from '@angular/core';
|
|
4
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
5
|
+
import { of } from 'rxjs';
|
|
6
|
+
import { catchError, switchMap } from 'rxjs/operators';
|
|
7
|
+
import { formatNow, formatTimeStamps } from '../../utils/utils';
|
|
8
|
+
import { dev_environment, prod_environment } from '../../../environments/environment';
|
|
9
|
+
import { ConversationService } from '../conversation.service';
|
|
10
|
+
import { SocketService } from '../socket-service.service';
|
|
11
|
+
export class ChatDrawerComponent {
|
|
12
|
+
constructor(cdr, http, sanitizer, elementRef, renderer, socketService, conversation
|
|
13
|
+
// private platform: Platform
|
|
14
|
+
) {
|
|
15
|
+
this.cdr = cdr;
|
|
16
|
+
this.http = http;
|
|
17
|
+
this.sanitizer = sanitizer;
|
|
18
|
+
this.elementRef = elementRef;
|
|
19
|
+
this.renderer = renderer;
|
|
20
|
+
this.socketService = socketService;
|
|
21
|
+
this.conversation = conversation;
|
|
22
|
+
this.bodyOverflowClass = 'body-overflow-hidden';
|
|
23
|
+
this.isCollapsedTrue = false;
|
|
24
|
+
this.copilotName = "HiveXGPT";
|
|
25
|
+
this.feedbackEvent = new EventEmitter();
|
|
26
|
+
this.onCloseEvent = new EventEmitter();
|
|
27
|
+
this.openPage = new EventEmitter();
|
|
28
|
+
this.sessionActions = new EventEmitter();
|
|
29
|
+
this.closeBot = new EventEmitter();
|
|
30
|
+
this.connectWithUser = new EventEmitter();
|
|
31
|
+
this.scheduleMeeting = new EventEmitter();
|
|
32
|
+
this.autogenKey = "Autogen_eDJTtEU-NB0RtIpzq1w";
|
|
33
|
+
this.addToMyAgendaAction = "add_to_my_agenda";
|
|
34
|
+
this.myUpcomingSessionAction = "my_upcomming_session";
|
|
35
|
+
this.connectOrFollowAction = "connect_or_follow";
|
|
36
|
+
this.aiResponse = '';
|
|
37
|
+
this.chatLog = [];
|
|
38
|
+
this.decoder = new TextDecoder();
|
|
39
|
+
this.feedbackDone = false;
|
|
40
|
+
this.greetingMsg = '';
|
|
41
|
+
this.hasBackdropValue = false;
|
|
42
|
+
this.input = '';
|
|
43
|
+
this.listenerAdded = false;
|
|
44
|
+
this.loading = false;
|
|
45
|
+
this.mode = 'over';
|
|
46
|
+
this.quickPrompts = [];
|
|
47
|
+
this.thumbsDownMsgIndex = 0;
|
|
48
|
+
this.userName = '';
|
|
49
|
+
this.showStartAgain = false;
|
|
50
|
+
this.isIOSDevice = false;
|
|
51
|
+
this.showFeedBackIconsIndex = null;
|
|
52
|
+
this.temperature = 1;
|
|
53
|
+
this.speakers = [];
|
|
54
|
+
this.executionPathImages = [];
|
|
55
|
+
this.searchTerms = [];
|
|
56
|
+
this.financialGraphs = [];
|
|
57
|
+
this.isChatingWithAi = false;
|
|
58
|
+
this.readAllChunks = (stream) => {
|
|
59
|
+
const reader = stream.getReader();
|
|
60
|
+
const allSuggestions = [];
|
|
61
|
+
reader.closed.catch((err) => {
|
|
62
|
+
if (err) {
|
|
63
|
+
console.error('Error reading stream: ', err);
|
|
64
|
+
}
|
|
65
|
+
this.isChatingWithAi = false;
|
|
66
|
+
this.scrollToBottom();
|
|
67
|
+
return;
|
|
68
|
+
});
|
|
69
|
+
return new ReadableStream({
|
|
70
|
+
start: (controller) => {
|
|
71
|
+
return this.pump(controller, reader, allSuggestions);
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
this.isDropdownOpen = false;
|
|
76
|
+
this.selectedAgents = [];
|
|
77
|
+
this.allSelected = false;
|
|
78
|
+
this.isCollapsed = false;
|
|
79
|
+
this.isCollapsedForGraph = false;
|
|
80
|
+
this.isCollapsedForFGraph = false;
|
|
81
|
+
/*Related*/
|
|
82
|
+
this.relatedListItems = [];
|
|
83
|
+
/*End Related*/
|
|
84
|
+
this.sourcesList = [];
|
|
85
|
+
this.displayedSources = []; // First 3 cards
|
|
86
|
+
this.remainingSources = []; // Remaining items
|
|
87
|
+
// [
|
|
88
|
+
// {
|
|
89
|
+
// "title": "AI News January 2024: In-Depth and Concise - The AI Track",
|
|
90
|
+
// "desc": "Each month, we compile significant news, trends, and happenings in AI, providing detailed summaries with key points in bullet form for concise yet complete understanding.",
|
|
91
|
+
// "link": "https://theaitrack.com/ai-news-january-2024/"
|
|
92
|
+
// },
|
|
93
|
+
// {
|
|
94
|
+
// "title": "Top AI News, January 2024 - Everypixel Journal",
|
|
95
|
+
// "desc": "In this monthly roundup, we spotlight the top AI news stories from January, including the OpenAI vs. The New York Times Lawsuit.",
|
|
96
|
+
// "link": "https://journal.everypixel.com/top-ai-news-january-2024"
|
|
97
|
+
// },
|
|
98
|
+
// {
|
|
99
|
+
// "title": "AI News July 2024: In-Depth and Concise - The AI Track",
|
|
100
|
+
// "desc": "This page features AI News for July 2024, highlighting significant events such as Canva acquiring Leonardo AI.",
|
|
101
|
+
// "link": "https://theaitrack.com/ai-news-july-2024-in-depth-and-concise/"
|
|
102
|
+
// },
|
|
103
|
+
// {
|
|
104
|
+
// "title": "January news roundup: What's new in the world of AI? - Pluralsight",
|
|
105
|
+
// "desc": "OpenAI’s new GPT store, business-ready ChatGPT plans, and a predicted rise in AI-powered cybercrime.",
|
|
106
|
+
// "link": "https://www.pluralsight.com/resources/blog/data/ai-this-month-january-2024"
|
|
107
|
+
// },
|
|
108
|
+
// {
|
|
109
|
+
// "title": "AI News August 2024: In-Depth and Concise - The AI Track",
|
|
110
|
+
// "desc": "This page features AI News for August 2024, with highlights such as Nvidia delaying the “Blackwell” B200 AI chips delivery.",
|
|
111
|
+
// "link": "https://theaitrack.com/ai-news-august-2024-in-depth-and-concise-duplicate/"
|
|
112
|
+
// }
|
|
113
|
+
// ]
|
|
114
|
+
this.dateTime = { now: new Date().toISOString() };
|
|
115
|
+
this.isDrawerOpen = true;
|
|
116
|
+
this.chatMain = new ElementRef(null);
|
|
117
|
+
// if (this.platform.IOS) {
|
|
118
|
+
// this.isIOSDevice = true;
|
|
119
|
+
// }
|
|
120
|
+
}
|
|
121
|
+
ngOnInit() {
|
|
122
|
+
this.environment = this.isDev ? dev_environment : prod_environment;
|
|
123
|
+
// this.fetchMyConnections().subscribe();
|
|
124
|
+
// this.fetchPendingRequests().subscribe();
|
|
125
|
+
this.changeTemperature(this.temperature);
|
|
126
|
+
this.fetchBotConfig().subscribe((res) => {
|
|
127
|
+
this.cdr.markForCheck();
|
|
128
|
+
this.fetchChatHistory().subscribe((response) => {
|
|
129
|
+
this.loading = false;
|
|
130
|
+
this.mapChatHistory(response);
|
|
131
|
+
this.cdr.markForCheck();
|
|
132
|
+
}, (err) => {
|
|
133
|
+
console.error('Error fetching chat history:', err);
|
|
134
|
+
});
|
|
135
|
+
}, (err) => {
|
|
136
|
+
console.error('Error fetching chat history:', err);
|
|
137
|
+
});
|
|
138
|
+
this.fetchAgents();
|
|
139
|
+
this.cdr.markForCheck();
|
|
140
|
+
this.initializeSocket();
|
|
141
|
+
setTimeout(() => {
|
|
142
|
+
this.listenSockets();
|
|
143
|
+
}, 200);
|
|
144
|
+
}
|
|
145
|
+
initializeSocket() {
|
|
146
|
+
;
|
|
147
|
+
const conversation_id = this.conversation.getKey(this.botId);
|
|
148
|
+
this.socketService.registerUserSpecificHiveSocket(this.botId, conversation_id);
|
|
149
|
+
}
|
|
150
|
+
listenSockets() {
|
|
151
|
+
this.eventSubscription = this.conversation
|
|
152
|
+
.getUserSpecificNotification()
|
|
153
|
+
.subscribe((res) => {
|
|
154
|
+
var _a, _b, _c, _d;
|
|
155
|
+
// Check if OtherFields exists in the response
|
|
156
|
+
if ((_a = res === null || res === void 0 ? void 0 : res.m) === null || _a === void 0 ? void 0 : _a.OtherFields) {
|
|
157
|
+
const { conversation_id, bot_id, answer, web_results, financial_graphs, execution_graphs, online_search_terms, suggestions } = (_b = res === null || res === void 0 ? void 0 : res.m) === null || _b === void 0 ? void 0 : _b.OtherFields;
|
|
158
|
+
// Handle the fields based on their presence
|
|
159
|
+
if (answer) {
|
|
160
|
+
this.isChatingWithAi = false;
|
|
161
|
+
console.log('Answer:', answer);
|
|
162
|
+
this.chatLog.push({
|
|
163
|
+
type: 'ai',
|
|
164
|
+
message: this.processMessageForDisplay(answer),
|
|
165
|
+
time: formatNow(this.timezone),
|
|
166
|
+
});
|
|
167
|
+
this.showFeedBackIconsIndex = this.chatLog.length - 1;
|
|
168
|
+
this.cdr.markForCheck();
|
|
169
|
+
this.scrollToBottom();
|
|
170
|
+
}
|
|
171
|
+
if (web_results && Array.isArray(web_results)) {
|
|
172
|
+
console.log('Web Results:', web_results);
|
|
173
|
+
this.sourcesList = web_results;
|
|
174
|
+
this.displayedSources = (_c = this.sourcesList) === null || _c === void 0 ? void 0 : _c.slice(0, 3); // First 3 cards
|
|
175
|
+
this.remainingSources = (_d = this.sourcesList) === null || _d === void 0 ? void 0 : _d.slice(3); // Remaining items
|
|
176
|
+
this.cdr.detectChanges();
|
|
177
|
+
}
|
|
178
|
+
if (financial_graphs && Array.isArray(financial_graphs)) {
|
|
179
|
+
console.log('Financial Graphs:', financial_graphs);
|
|
180
|
+
this.financialGraphs = financial_graphs;
|
|
181
|
+
this.cdr.detectChanges();
|
|
182
|
+
}
|
|
183
|
+
if (execution_graphs && Array.isArray(execution_graphs)) {
|
|
184
|
+
console.log('Execution Graphs:', execution_graphs);
|
|
185
|
+
// Process execution graphs as needed
|
|
186
|
+
this.executionPathImages = execution_graphs;
|
|
187
|
+
this.cdr.detectChanges();
|
|
188
|
+
}
|
|
189
|
+
if (online_search_terms && Array.isArray(online_search_terms)) {
|
|
190
|
+
console.log('Online Search Terms:', online_search_terms);
|
|
191
|
+
this.searchTerms = online_search_terms;
|
|
192
|
+
this.cdr.detectChanges();
|
|
193
|
+
// Process online search terms as needed
|
|
194
|
+
}
|
|
195
|
+
if (suggestions && Array.isArray(suggestions)) {
|
|
196
|
+
console.log('suggestions:', suggestions);
|
|
197
|
+
this.relatedListItems = suggestions;
|
|
198
|
+
this.cdr.detectChanges();
|
|
199
|
+
// Process online search terms as needed
|
|
200
|
+
}
|
|
201
|
+
// Add any other fields and their processing here
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
console.warn('OtherFields is missing in the response');
|
|
205
|
+
}
|
|
206
|
+
}, (err) => {
|
|
207
|
+
this.eventSubscription.unsubscribe();
|
|
208
|
+
console.error('Error in fetching data from socket', err);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
initializeSocketAndListen() {
|
|
212
|
+
}
|
|
213
|
+
handleEvent(data, type) {
|
|
214
|
+
switch (type) {
|
|
215
|
+
case 'webresult':
|
|
216
|
+
break;
|
|
217
|
+
case 'answer':
|
|
218
|
+
break;
|
|
219
|
+
case 'graph':
|
|
220
|
+
break;
|
|
221
|
+
default:
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
ngOnDestroy() {
|
|
226
|
+
if (this.eventSubscription) {
|
|
227
|
+
this.eventSubscription.unsubscribe();
|
|
228
|
+
}
|
|
229
|
+
//this.socketService.close();
|
|
230
|
+
}
|
|
231
|
+
changeTemperature(newTemperature) {
|
|
232
|
+
if (this.loading)
|
|
233
|
+
return;
|
|
234
|
+
this.temperature = newTemperature;
|
|
235
|
+
const wrapper = document.querySelector('.hivegpt-chat-wrapper');
|
|
236
|
+
// Remove existing theme classes from body
|
|
237
|
+
wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.remove('creative', 'balanced', 'precise');
|
|
238
|
+
switch (newTemperature) {
|
|
239
|
+
case 0:
|
|
240
|
+
wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('creative');
|
|
241
|
+
break;
|
|
242
|
+
case 1:
|
|
243
|
+
wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('balanced');
|
|
244
|
+
break;
|
|
245
|
+
case 2:
|
|
246
|
+
wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('precise');
|
|
247
|
+
break;
|
|
248
|
+
default:
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
onStartAgain() {
|
|
253
|
+
if (this.loading)
|
|
254
|
+
return;
|
|
255
|
+
this.showStartAgain = false;
|
|
256
|
+
this.chatLog = [];
|
|
257
|
+
this.chatLog.push({
|
|
258
|
+
type: 'ai',
|
|
259
|
+
message: this.greetingMsg ||
|
|
260
|
+
this.processMessage("Greetings! I'm your COP28 virtual assistant. Have questions about the event? I'm here to help."),
|
|
261
|
+
time: formatNow(this.timezone),
|
|
262
|
+
});
|
|
263
|
+
this.archieveMessages().subscribe();
|
|
264
|
+
}
|
|
265
|
+
archieveMessages() {
|
|
266
|
+
const headers = new HttpHeaders({
|
|
267
|
+
'Content-Type': 'application/json',
|
|
268
|
+
'x-api-key': this.apiKey,
|
|
269
|
+
});
|
|
270
|
+
const url = `${this.environment.BASE_URL}/bot/clear-history/${this.botId}/${this.userId}`;
|
|
271
|
+
return this.http.post(url, {}, { headers }).pipe(switchMap((res) => {
|
|
272
|
+
return of(res);
|
|
273
|
+
}), catchError((error) => {
|
|
274
|
+
return of(null);
|
|
275
|
+
}));
|
|
276
|
+
}
|
|
277
|
+
fetchBotConfig() {
|
|
278
|
+
this.loading = true;
|
|
279
|
+
const url = `${this.environment.BASE_URL}/bots?bot_id=${this.botId}`;
|
|
280
|
+
return this.http.get(url).pipe(switchMap((res) => {
|
|
281
|
+
var _a;
|
|
282
|
+
this.botName = res.Name;
|
|
283
|
+
this.botIcon = res.Icon;
|
|
284
|
+
this.botSkills = res === null || res === void 0 ? void 0 : res.Skills;
|
|
285
|
+
this.greetingMsg = res.Greeting;
|
|
286
|
+
this.thumbsDownMessages = ((_a = res === null || res === void 0 ? void 0 : res.NegativeResponses) === null || _a === void 0 ? void 0 : _a.length) ? res.NegativeResponses
|
|
287
|
+
: [
|
|
288
|
+
"We are sorry we've not been able to answer your question.<br/> However, our dedicated support team is happy to help. <span class='feedback-link' style='cursor: pointer; text-decoration: underline; font-weight: 700; color: #17235B;'>Please click here</span> and a human agent will assist you as soon as possible",
|
|
289
|
+
];
|
|
290
|
+
this.quickPrompts = res.QuickPrompts;
|
|
291
|
+
this.cdr.markForCheck();
|
|
292
|
+
this.loading = false;
|
|
293
|
+
return of(res);
|
|
294
|
+
}), catchError((error) => {
|
|
295
|
+
console.error('Error fetching chatbot config: ', error);
|
|
296
|
+
this.loading = false;
|
|
297
|
+
return of(null);
|
|
298
|
+
}));
|
|
299
|
+
}
|
|
300
|
+
fetchChatHistory() {
|
|
301
|
+
this.loading = true;
|
|
302
|
+
this.conversationKey = this.conversation.getKey(this.botId);
|
|
303
|
+
const url = `${this.environment.BASE_URL}/conversations/${this.conversationKey}`;
|
|
304
|
+
const headers = new HttpHeaders({
|
|
305
|
+
'accept': 'application/json'
|
|
306
|
+
});
|
|
307
|
+
return this.http.get(url, { headers }).pipe(catchError(this.handleError('fetchConversation')));
|
|
308
|
+
}
|
|
309
|
+
handleError(operation = 'operation', result) {
|
|
310
|
+
return (error) => {
|
|
311
|
+
console.error(`${operation} failed: ${error.message}`);
|
|
312
|
+
return of(result);
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
// fetchChatHistory() {
|
|
316
|
+
// this.loading = true;
|
|
317
|
+
// const headers = new HttpHeaders({
|
|
318
|
+
// 'Content-Type': 'application/json',
|
|
319
|
+
// 'x-api-key': this.apiKey,
|
|
320
|
+
// });
|
|
321
|
+
// return this.http
|
|
322
|
+
// .get(`${this.environment.BASE_URL}/conversations/${this.conversationKey}`, { headers })
|
|
323
|
+
// .pipe(
|
|
324
|
+
// switchMap((res: any) => {
|
|
325
|
+
// this.loading = false;
|
|
326
|
+
// return of(res);
|
|
327
|
+
// }),
|
|
328
|
+
// catchError((error: any) => {
|
|
329
|
+
// console.error('Error fetching chat history: ', error);
|
|
330
|
+
// this.loading = false;
|
|
331
|
+
// return of(null);
|
|
332
|
+
// })
|
|
333
|
+
// );
|
|
334
|
+
// }
|
|
335
|
+
mapChatHistory(chats) {
|
|
336
|
+
var _a;
|
|
337
|
+
this.chatLog.push({
|
|
338
|
+
type: 'ai',
|
|
339
|
+
message: this.greetingMsg ||
|
|
340
|
+
this.processMessage("Greetings! I'm your COP28 virtual assistant. Have questions about the event? I'm here to help."),
|
|
341
|
+
time: formatNow(this.timezone),
|
|
342
|
+
});
|
|
343
|
+
if (chats && ((_a = chats === null || chats === void 0 ? void 0 : chats.Messages) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
344
|
+
chats === null || chats === void 0 ? void 0 : chats.Messages.forEach((chat) => {
|
|
345
|
+
if (chat.Type == "user") {
|
|
346
|
+
this.chatLog.push({
|
|
347
|
+
type: 'user',
|
|
348
|
+
message: this.processMessageForDisplay(chat.Text),
|
|
349
|
+
time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
|
|
350
|
+
copied: false,
|
|
351
|
+
isCollapsedTrue: false
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
if (chat.Type == "ai") {
|
|
355
|
+
this.chatLog.push({
|
|
356
|
+
type: 'ai',
|
|
357
|
+
message: this.processMessageForDisplay(chat.Text),
|
|
358
|
+
time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
|
|
359
|
+
copied: false,
|
|
360
|
+
isCollapsedTrue: false
|
|
361
|
+
});
|
|
362
|
+
this.showFeedBackIconsIndex = this.chatLog.length - 1;
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
this.showStartAgain = true;
|
|
366
|
+
}
|
|
367
|
+
this.scrollToBottom();
|
|
368
|
+
this.cdr.markForCheck();
|
|
369
|
+
}
|
|
370
|
+
processMessage(message) {
|
|
371
|
+
if (!message || !((message === null || message === void 0 ? void 0 : message.length) > 0)) {
|
|
372
|
+
return '';
|
|
373
|
+
}
|
|
374
|
+
// console.log('here is my message')
|
|
375
|
+
// console.log(message);
|
|
376
|
+
message = message.trim();
|
|
377
|
+
const markdownLinkRegex = /\[([^[]+)]\(([^)]+)\)/g;
|
|
378
|
+
const urlRegex = /(?<!href=")\bhttps?:\/\/\S+(?<![.,])/gi;
|
|
379
|
+
if (markdownLinkRegex.test(message)) {
|
|
380
|
+
const html = message.replace(markdownLinkRegex, '<a href="$2" target="_blank">$1</a>');
|
|
381
|
+
//console.log('Sanitized message: ', message);
|
|
382
|
+
return this.sanitizeHtml(html);
|
|
383
|
+
}
|
|
384
|
+
if (urlRegex.test(message)) {
|
|
385
|
+
const html = message.replace(urlRegex, '<a href="$&" target="_blank">$&</a>');
|
|
386
|
+
// console.log('Sanitized message: ', message);
|
|
387
|
+
return this.sanitizeHtml(html);
|
|
388
|
+
}
|
|
389
|
+
message = message.replace(/(?:\r\n|\r|\n)/g, '<br>');
|
|
390
|
+
message = message.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
|
|
391
|
+
// Convert Markdown headers to HTML headers
|
|
392
|
+
message = message.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
|
|
393
|
+
const level = hashes.length;
|
|
394
|
+
return `<h${level}>${text}</h${level}>`;
|
|
395
|
+
});
|
|
396
|
+
this.cdr.markForCheck();
|
|
397
|
+
const sanitizedMessage = this.sanitizeHtml(message);
|
|
398
|
+
return sanitizedMessage;
|
|
399
|
+
}
|
|
400
|
+
ngAfterViewChecked() {
|
|
401
|
+
const feedbackLinks = this.elementRef.nativeElement.querySelectorAll('.feedback-link');
|
|
402
|
+
feedbackLinks.forEach((link) => {
|
|
403
|
+
link.addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
|
|
404
|
+
});
|
|
405
|
+
// if (this.elementRef.nativeElement.querySelector('.feedback-link')) {
|
|
406
|
+
// this.elementRef.nativeElement
|
|
407
|
+
// .querySelector('.feedback-link')
|
|
408
|
+
// .addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
|
|
409
|
+
// }
|
|
410
|
+
}
|
|
411
|
+
sanitizeHtml(html) {
|
|
412
|
+
return this.sanitizer.bypassSecurityTrustHtml(html);
|
|
413
|
+
}
|
|
414
|
+
onFeedbackClick(value) {
|
|
415
|
+
this.feedbackEvent.emit(value);
|
|
416
|
+
}
|
|
417
|
+
onClose() {
|
|
418
|
+
this.renderer.removeClass(document.body, this.bodyOverflowClass);
|
|
419
|
+
this.onCloseEvent.emit();
|
|
420
|
+
}
|
|
421
|
+
sendMessageWithTile(prompt) {
|
|
422
|
+
this.input = prompt;
|
|
423
|
+
this.fetchData();
|
|
424
|
+
this.scrollToBottom();
|
|
425
|
+
}
|
|
426
|
+
fetchData() {
|
|
427
|
+
var _a;
|
|
428
|
+
this.input = (_a = this.input) === null || _a === void 0 ? void 0 : _a.trim();
|
|
429
|
+
if (!this.input || this.loading) {
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
this.chatLog.push({
|
|
433
|
+
type: 'user',
|
|
434
|
+
message: this.processMessageForDisplay(this.input),
|
|
435
|
+
time: formatNow(this.timezone),
|
|
436
|
+
copied: false,
|
|
437
|
+
isCollapsedTrue: false
|
|
438
|
+
});
|
|
439
|
+
this.cdr.markForCheck();
|
|
440
|
+
this.aiResponse = '';
|
|
441
|
+
this.isChatingWithAi = true;
|
|
442
|
+
const url = `${this.environment.BASE_URL}/ai/ask`; // +
|
|
443
|
+
// (this.useOpenAi === false ? '/llm-hf' : '');
|
|
444
|
+
fetch(url, {
|
|
445
|
+
method: 'POST',
|
|
446
|
+
headers: {
|
|
447
|
+
'Content-Type': 'application/json',
|
|
448
|
+
'x-api-key': this.apiKey,
|
|
449
|
+
},
|
|
450
|
+
body: JSON.stringify({
|
|
451
|
+
user_question: this.input,
|
|
452
|
+
user_id: this.userId,
|
|
453
|
+
bot_id: this.botId,
|
|
454
|
+
// temperature: this.temperature,
|
|
455
|
+
// event_id: this.eventId,
|
|
456
|
+
// token: this.s27UserToken,
|
|
457
|
+
agents: this.agents.filter(p => p.selected).map(p => p.id),
|
|
458
|
+
conversation_id: this.conversationKey
|
|
459
|
+
}),
|
|
460
|
+
})
|
|
461
|
+
// Retrieve its body as ReadableStream
|
|
462
|
+
.then((response) => {
|
|
463
|
+
//return this.readAllChunks(response.body);
|
|
464
|
+
return of(null);
|
|
465
|
+
})
|
|
466
|
+
.catch((err) => {
|
|
467
|
+
console.error('Err: ', err);
|
|
468
|
+
this.isChatingWithAi = false;
|
|
469
|
+
});
|
|
470
|
+
this.input = '';
|
|
471
|
+
}
|
|
472
|
+
fetchDataFor(msg) {
|
|
473
|
+
const inputMsg = msg === null || msg === void 0 ? void 0 : msg.trim();
|
|
474
|
+
if (!inputMsg || this.loading) {
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
this.scrollToBottom();
|
|
478
|
+
this.chatLog.push({
|
|
479
|
+
type: 'user',
|
|
480
|
+
message: this.processMessageForDisplay(inputMsg),
|
|
481
|
+
time: formatNow(this.timezone),
|
|
482
|
+
copied: false,
|
|
483
|
+
isCollapsedTrue: false
|
|
484
|
+
});
|
|
485
|
+
this.cdr.markForCheck();
|
|
486
|
+
this.aiResponse = '';
|
|
487
|
+
this.isChatingWithAi = true;
|
|
488
|
+
const url = `${this.environment.BASE_URL}/ai/ask`; // +
|
|
489
|
+
// (this.useOpenAi === false ? '/llm-hf' : '');
|
|
490
|
+
fetch(url, {
|
|
491
|
+
method: 'POST',
|
|
492
|
+
headers: {
|
|
493
|
+
'Content-Type': 'application/json',
|
|
494
|
+
'x-api-key': this.apiKey,
|
|
495
|
+
},
|
|
496
|
+
body: JSON.stringify({
|
|
497
|
+
user_question: inputMsg,
|
|
498
|
+
user_id: this.userId,
|
|
499
|
+
bot_id: this.botId,
|
|
500
|
+
// temperature: this.temperature,
|
|
501
|
+
// event_id: this.eventId,
|
|
502
|
+
// token: this.s27UserToken,
|
|
503
|
+
agents: this.agents.filter(p => p.selected).map(p => p.id),
|
|
504
|
+
conversation_id: this.conversationKey
|
|
505
|
+
}),
|
|
506
|
+
})
|
|
507
|
+
// Retrieve its body as ReadableStream
|
|
508
|
+
.then((response) => {
|
|
509
|
+
return this.readAllChunks(response.body);
|
|
510
|
+
})
|
|
511
|
+
.catch((err) => {
|
|
512
|
+
console.error('Err: ', err);
|
|
513
|
+
this.isChatingWithAi = false;
|
|
514
|
+
});
|
|
515
|
+
this.input = '';
|
|
516
|
+
}
|
|
517
|
+
fetchSmallTalk() {
|
|
518
|
+
this.loading = true;
|
|
519
|
+
this.cdr.markForCheck();
|
|
520
|
+
const url = `${this.environment.BASE_URL}/bot/small-talk/${this.botId}/${this.userId}`;
|
|
521
|
+
this.http
|
|
522
|
+
.get(url, {
|
|
523
|
+
headers: {
|
|
524
|
+
'x-api-key': this.apiKey,
|
|
525
|
+
},
|
|
526
|
+
})
|
|
527
|
+
.pipe(catchError((error) => {
|
|
528
|
+
console.error('Error while fetching small talk:', error);
|
|
529
|
+
return of(null);
|
|
530
|
+
}))
|
|
531
|
+
.subscribe((response) => {
|
|
532
|
+
this.loading = false;
|
|
533
|
+
this.cdr.markForCheck();
|
|
534
|
+
if (!response) {
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
if (response && response.smallTalk) {
|
|
538
|
+
this.chatLog.push({
|
|
539
|
+
type: 'ai',
|
|
540
|
+
message: this.processMessage(response.smallTalk),
|
|
541
|
+
time: formatNow(this.timezone),
|
|
542
|
+
isFeedbackMsg: true,
|
|
543
|
+
});
|
|
544
|
+
this.showFeedBackIconsIndex = this.chatLog.length - 2;
|
|
545
|
+
// this.scrollToBottom();
|
|
546
|
+
this.cdr.markForCheck();
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
pump(controller, reader, allSuggestions) {
|
|
551
|
+
reader.read().then(({ done, value }) => {
|
|
552
|
+
var _a, _b, _c, _d;
|
|
553
|
+
const lastItem = this.chatLog[this.chatLog.length - 1];
|
|
554
|
+
if (done) {
|
|
555
|
+
lastItem.message = this.processMessageForDisplay(lastItem.message);
|
|
556
|
+
this.chatLog.pop();
|
|
557
|
+
this.chatLog.push(lastItem);
|
|
558
|
+
if (allSuggestions === null || allSuggestions === void 0 ? void 0 : allSuggestions.length) {
|
|
559
|
+
this.chatLog.push({
|
|
560
|
+
type: 'suggestions',
|
|
561
|
+
suggestions: allSuggestions
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
controller.close();
|
|
565
|
+
this.isChatingWithAi = false;
|
|
566
|
+
// this.scrollToBottom();
|
|
567
|
+
this.cdr.markForCheck();
|
|
568
|
+
this.showStartAgain = true;
|
|
569
|
+
// setTimeout(() => {
|
|
570
|
+
// this.fetchSmallTalk();
|
|
571
|
+
// },1000)
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
let decodedChunk = this.decoder.decode(value, { stream: true });
|
|
575
|
+
this.aiResponse += decodedChunk;
|
|
576
|
+
if (lastItem.type === 'ai') {
|
|
577
|
+
const suggestionsMatch = this.aiResponse.match(/<sug>(.*?)<\/sug>/g);
|
|
578
|
+
if (suggestionsMatch) {
|
|
579
|
+
suggestionsMatch.forEach((match) => {
|
|
580
|
+
this.aiResponse = this.aiResponse.replace(match, "");
|
|
581
|
+
allSuggestions.push(match === null || match === void 0 ? void 0 : match.replace(/<\/?sug>/g, ""));
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
lastItem.message = this.aiResponse;
|
|
585
|
+
this.cdr.markForCheck();
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
this.isChatingWithAi = false;
|
|
589
|
+
let aiFormattedData;
|
|
590
|
+
try {
|
|
591
|
+
console.log('parsing json ');
|
|
592
|
+
aiFormattedData = JSON.parse(JSON.parse(this.aiResponse));
|
|
593
|
+
}
|
|
594
|
+
catch (e) {
|
|
595
|
+
try {
|
|
596
|
+
console.log('parsing json 2');
|
|
597
|
+
aiFormattedData = JSON.parse(this.aiResponse);
|
|
598
|
+
}
|
|
599
|
+
catch (e) { }
|
|
600
|
+
}
|
|
601
|
+
console.log('parsing json done');
|
|
602
|
+
if (aiFormattedData && ((_a = aiFormattedData === null || aiFormattedData === void 0 ? void 0 : aiFormattedData.section_id) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
|
603
|
+
if (aiFormattedData.section_id == 'company_search' || aiFormattedData.section_id == 'user_search' || aiFormattedData.section_id == 'industry_company_search') {
|
|
604
|
+
this.fetchMyConnections().subscribe();
|
|
605
|
+
this.fetchPendingRequests().subscribe();
|
|
606
|
+
}
|
|
607
|
+
if (aiFormattedData.section_id == this.myUpcomingSessionAction) {
|
|
608
|
+
var speakerIds = [];
|
|
609
|
+
(_b = aiFormattedData.content) === null || _b === void 0 ? void 0 : _b.forEach(session => {
|
|
610
|
+
speakerIds = [...speakerIds, ...session.speakers];
|
|
611
|
+
});
|
|
612
|
+
if ((speakerIds === null || speakerIds === void 0 ? void 0 : speakerIds.length) > 0)
|
|
613
|
+
this.getSpeakersByStaffIds(speakerIds);
|
|
614
|
+
}
|
|
615
|
+
if (aiFormattedData.section_id == this.addToMyAgendaAction && ((_c = aiFormattedData.content) === null || _c === void 0 ? void 0 : _c.length) > 0) {
|
|
616
|
+
this.openPage.next({
|
|
617
|
+
sectionId: aiFormattedData.section_id,
|
|
618
|
+
sessionIds: aiFormattedData.content
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
if (aiFormattedData.section_id == this.connectOrFollowAction) {
|
|
622
|
+
let usersLen = (_d = aiFormattedData.content) === null || _d === void 0 ? void 0 : _d.length;
|
|
623
|
+
if (usersLen > 1) {
|
|
624
|
+
this.openPage.next({
|
|
625
|
+
sectionId: "open_networking_drawer",
|
|
626
|
+
search: aiFormattedData.content
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
else if (usersLen == 1) {
|
|
630
|
+
this.openPage.next({
|
|
631
|
+
sectionId: aiFormattedData.section_id,
|
|
632
|
+
connetUserIds: [aiFormattedData.content[0].userId]
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
if (aiFormattedData.is_open_page == "true") {
|
|
637
|
+
this.openPage.next({
|
|
638
|
+
sectionId: aiFormattedData.section_id,
|
|
639
|
+
search: aiFormattedData.content
|
|
640
|
+
});
|
|
641
|
+
if (this.isMobileBrowser()) {
|
|
642
|
+
aiFormattedData.message += "\n\n" + '<a id="closeBotNow">Click Here</a> to see results.';
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
this.chatLog.push({
|
|
646
|
+
type: 'ai',
|
|
647
|
+
message: aiFormattedData.message,
|
|
648
|
+
action: aiFormattedData,
|
|
649
|
+
time: formatNow(this.timezone)
|
|
650
|
+
});
|
|
651
|
+
if (this.isMobileBrowser()) {
|
|
652
|
+
setTimeout(() => {
|
|
653
|
+
this.addCloseBotClickEvent();
|
|
654
|
+
}, 500);
|
|
655
|
+
}
|
|
656
|
+
this.aiResponse = "";
|
|
657
|
+
}
|
|
658
|
+
else {
|
|
659
|
+
this.chatLog.push({
|
|
660
|
+
type: 'ai',
|
|
661
|
+
message: this.aiResponse,
|
|
662
|
+
time: formatNow(this.timezone),
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
this.showFeedBackIconsIndex = this.chatLog.length - 1;
|
|
666
|
+
this.cdr.markForCheck();
|
|
667
|
+
}
|
|
668
|
+
this.scrollToBottom();
|
|
669
|
+
// Enqueue the next data chunk into our target stream
|
|
670
|
+
controller.enqueue(value);
|
|
671
|
+
this.pump(controller, reader, allSuggestions);
|
|
672
|
+
});
|
|
673
|
+
}
|
|
674
|
+
submitFeedback(flag) {
|
|
675
|
+
this.feedbackDone = true;
|
|
676
|
+
this.showFeedBackIconsIndex = null;
|
|
677
|
+
const url = `${this.environment.BASE_URL}/bot/feedback`;
|
|
678
|
+
fetch(url, {
|
|
679
|
+
method: 'POST',
|
|
680
|
+
headers: {
|
|
681
|
+
'Content-Type': 'application/json',
|
|
682
|
+
'x-api-key': this.apiKey,
|
|
683
|
+
},
|
|
684
|
+
body: JSON.stringify({ flag, user_id: this.userId, bot_id: this.botId }),
|
|
685
|
+
}).then(() => {
|
|
686
|
+
if (flag) {
|
|
687
|
+
this.chatLog.push({
|
|
688
|
+
type: 'ai',
|
|
689
|
+
message: this.thumbsUpMessage ||
|
|
690
|
+
`Great. May I assist you with anything else?`,
|
|
691
|
+
time: formatNow(this.timezone),
|
|
692
|
+
isFeedbackMsg: true,
|
|
693
|
+
});
|
|
694
|
+
this.scrollToBottom();
|
|
695
|
+
this.cdr.markForCheck();
|
|
696
|
+
this.feedbackDone = false;
|
|
697
|
+
this.showFeedBackIconsIndex = null;
|
|
698
|
+
return;
|
|
699
|
+
}
|
|
700
|
+
this.chatLog.push({
|
|
701
|
+
type: 'ai',
|
|
702
|
+
message: this.processMessage(this.thumbsDownMessages[this.thumbsDownMsgIndex]),
|
|
703
|
+
time: formatNow(this.timezone),
|
|
704
|
+
isFeedbackMsg: true,
|
|
705
|
+
});
|
|
706
|
+
this.thumbsDownMsgIndex =
|
|
707
|
+
(this.thumbsDownMsgIndex + 1) % this.thumbsDownMessages.length;
|
|
708
|
+
this.scrollToBottom();
|
|
709
|
+
this.cdr.markForCheck();
|
|
710
|
+
this.feedbackDone = false;
|
|
711
|
+
this.showFeedBackIconsIndex = null;
|
|
712
|
+
});
|
|
713
|
+
}
|
|
714
|
+
handleSubmit() {
|
|
715
|
+
this.fetchData();
|
|
716
|
+
this.scrollToBottom();
|
|
717
|
+
}
|
|
718
|
+
handleUpClick(idx) {
|
|
719
|
+
if (this.feedbackDone) {
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
this.submitFeedback(true);
|
|
723
|
+
this.chatLog[idx].liked = !this.chatLog[idx].liked;
|
|
724
|
+
if (this.chatLog[idx].unliked) {
|
|
725
|
+
this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
|
|
726
|
+
}
|
|
727
|
+
this.cdr.markForCheck();
|
|
728
|
+
}
|
|
729
|
+
handleDownClick(idx) {
|
|
730
|
+
if (this.feedbackDone)
|
|
731
|
+
return;
|
|
732
|
+
this.submitFeedback(false);
|
|
733
|
+
this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
|
|
734
|
+
if (this.chatLog[idx].liked)
|
|
735
|
+
this.chatLog[idx].liked = !this.chatLog[idx].liked;
|
|
736
|
+
}
|
|
737
|
+
handleCopyClick(index) {
|
|
738
|
+
// Copy the message to the clipboard
|
|
739
|
+
const contentToCopy = this.chatLog[index].message;
|
|
740
|
+
navigator.clipboard.writeText(contentToCopy).then(() => {
|
|
741
|
+
// Indicate that the message was copied
|
|
742
|
+
this.chatLog[index].copied = true;
|
|
743
|
+
this.cdr.detectChanges();
|
|
744
|
+
// Reset the copied state after a delay
|
|
745
|
+
setTimeout(() => {
|
|
746
|
+
this.chatLog[index].copied = false;
|
|
747
|
+
this.cdr.detectChanges();
|
|
748
|
+
}, 2000); // Reset after 2 seconds
|
|
749
|
+
});
|
|
750
|
+
}
|
|
751
|
+
scrollToBottom() {
|
|
752
|
+
let counter = 0;
|
|
753
|
+
const interval = setInterval(() => {
|
|
754
|
+
this.chatMain.nativeElement.scrollTop =
|
|
755
|
+
this.chatMain.nativeElement.scrollHeight;
|
|
756
|
+
if (counter++ > 5)
|
|
757
|
+
clearInterval(interval);
|
|
758
|
+
}, 5);
|
|
759
|
+
}
|
|
760
|
+
handleAction(action) {
|
|
761
|
+
console.info("incoming action from the chatbot AI");
|
|
762
|
+
console.info(action);
|
|
763
|
+
if (action === null || action === void 0 ? void 0 : action.content) {
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
ngAfterViewInit() {
|
|
767
|
+
// Check if the drawer is initially open and apply overflow hidden to body if so
|
|
768
|
+
if (this.drawer.opened) {
|
|
769
|
+
this.setBodyOverflow();
|
|
770
|
+
}
|
|
771
|
+
// Listen to changes in the drawer being opened or closed
|
|
772
|
+
this.drawer.openedChange.subscribe((opened) => {
|
|
773
|
+
if (opened) {
|
|
774
|
+
this.setBodyOverflow();
|
|
775
|
+
}
|
|
776
|
+
else {
|
|
777
|
+
this.removeBodyOverflow();
|
|
778
|
+
}
|
|
779
|
+
});
|
|
780
|
+
this.drawer.openedChange.subscribe((opened) => {
|
|
781
|
+
if (opened) {
|
|
782
|
+
setTimeout(() => {
|
|
783
|
+
if (this.myTextarea && this.myTextarea.nativeElement) {
|
|
784
|
+
this.myTextarea.nativeElement.focus(); // Focus on the textarea
|
|
785
|
+
}
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
});
|
|
789
|
+
}
|
|
790
|
+
setBodyOverflow() {
|
|
791
|
+
this.renderer.addClass(document.body, this.bodyOverflowClass);
|
|
792
|
+
}
|
|
793
|
+
removeBodyOverflow() {
|
|
794
|
+
this.renderer.removeClass(document.body, this.bodyOverflowClass);
|
|
795
|
+
}
|
|
796
|
+
getSpeakersByStaffIds(ids) {
|
|
797
|
+
const url = `${this.environment.USERS_API}/events/${this.eventId}/users/get-by-staff-ids`;
|
|
798
|
+
fetch(url, {
|
|
799
|
+
method: 'POST',
|
|
800
|
+
headers: {
|
|
801
|
+
'Content-Type': 'application/json',
|
|
802
|
+
'Authorization': "Bearer " + "your_token_here",
|
|
803
|
+
},
|
|
804
|
+
body: JSON.stringify(ids),
|
|
805
|
+
})
|
|
806
|
+
.then((response) => {
|
|
807
|
+
if (response.ok) {
|
|
808
|
+
return response.json(); // Parse the JSON body of the response
|
|
809
|
+
}
|
|
810
|
+
else {
|
|
811
|
+
throw new Error('Network response was not ok.');
|
|
812
|
+
}
|
|
813
|
+
})
|
|
814
|
+
.then((data) => {
|
|
815
|
+
if ((data === null || data === void 0 ? void 0 : data.length) > 0) {
|
|
816
|
+
data.forEach(speaker => {
|
|
817
|
+
this.speakers[speaker.id] = speaker;
|
|
818
|
+
});
|
|
819
|
+
this.cdr.markForCheck();
|
|
820
|
+
}
|
|
821
|
+
})
|
|
822
|
+
.catch((err) => {
|
|
823
|
+
console.error('Error fetching data:', err);
|
|
824
|
+
this.loading = false;
|
|
825
|
+
});
|
|
826
|
+
}
|
|
827
|
+
performSessionAction(sessionId, action) {
|
|
828
|
+
this.sessionActions.next({
|
|
829
|
+
sessionId,
|
|
830
|
+
action
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
addCloseBotClickEvent() {
|
|
834
|
+
const element = this.elementRef.nativeElement.querySelector('#closeBotNow');
|
|
835
|
+
if (element) {
|
|
836
|
+
this.renderer.listen(element, 'click', () => {
|
|
837
|
+
this.closeBot.next();
|
|
838
|
+
});
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
isMobileBrowser() {
|
|
842
|
+
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
843
|
+
}
|
|
844
|
+
connectToUser(userId) {
|
|
845
|
+
this.connectWithUser.emit({
|
|
846
|
+
connect: !this.canDisconnect(userId),
|
|
847
|
+
userId
|
|
848
|
+
});
|
|
849
|
+
setTimeout(() => {
|
|
850
|
+
this.fetchMyConnections().subscribe(res => {
|
|
851
|
+
this.cdr.markForCheck();
|
|
852
|
+
});
|
|
853
|
+
this.fetchPendingRequests().subscribe(res => {
|
|
854
|
+
this.cdr.markForCheck();
|
|
855
|
+
});
|
|
856
|
+
}, 500);
|
|
857
|
+
}
|
|
858
|
+
scheduleMeetingWithUser(user) {
|
|
859
|
+
this.scheduleMeeting.emit(user);
|
|
860
|
+
}
|
|
861
|
+
canConnect(userId) {
|
|
862
|
+
return !(this.canDisconnect(userId) || this.pendingRequests.find(a => a == userId));
|
|
863
|
+
}
|
|
864
|
+
canDisconnect(userId) {
|
|
865
|
+
return this.myConnections.find(conn => conn.userId == userId);
|
|
866
|
+
}
|
|
867
|
+
fetchPendingRequests() {
|
|
868
|
+
const headers = new HttpHeaders({
|
|
869
|
+
'Content-Type': 'application/json',
|
|
870
|
+
'apiKey': this.autogenKey
|
|
871
|
+
});
|
|
872
|
+
return this.http
|
|
873
|
+
.get(`${this.environment.USERS_API}/events/${this.eventId}/connection-requests/autogen/pending-sent-requests?userId=${this.userId}`, { headers })
|
|
874
|
+
.pipe(switchMap((res) => {
|
|
875
|
+
this.pendingRequests = res;
|
|
876
|
+
this.cdr.markForCheck();
|
|
877
|
+
return of(res);
|
|
878
|
+
}), catchError((error) => {
|
|
879
|
+
console.error('Error fetching pending requests: ', error);
|
|
880
|
+
return of(null);
|
|
881
|
+
}));
|
|
882
|
+
}
|
|
883
|
+
fetchMyConnections() {
|
|
884
|
+
const headers = new HttpHeaders({
|
|
885
|
+
'Content-Type': 'application/json',
|
|
886
|
+
'apiKey': this.autogenKey
|
|
887
|
+
});
|
|
888
|
+
return this.http
|
|
889
|
+
.get(`${this.environment.USERS_API}/events/${this.eventId}/users-connections/autogen?userId=${this.userId}`, { headers })
|
|
890
|
+
.pipe(switchMap((res) => {
|
|
891
|
+
this.myConnections = res;
|
|
892
|
+
this.cdr.markForCheck();
|
|
893
|
+
return of(res);
|
|
894
|
+
}), catchError((error) => {
|
|
895
|
+
console.error('Error fetching pending requests: ', error);
|
|
896
|
+
return of(null);
|
|
897
|
+
}));
|
|
898
|
+
}
|
|
899
|
+
// Toggle the dropdown visibility
|
|
900
|
+
toggleDropdown() {
|
|
901
|
+
this.isDropdownOpen = !this.isDropdownOpen;
|
|
902
|
+
}
|
|
903
|
+
onSelectAll(event) {
|
|
904
|
+
var _a;
|
|
905
|
+
(_a = this.agents) === null || _a === void 0 ? void 0 : _a.forEach(agent => agent.selected = false);
|
|
906
|
+
this.cdr.detectChanges();
|
|
907
|
+
}
|
|
908
|
+
onAgentChange(agent) {
|
|
909
|
+
//agent.selected = !agent.selected;
|
|
910
|
+
//console.log(agent);
|
|
911
|
+
let agentFound = this.agents.filter(p => p.id == agent.id);
|
|
912
|
+
if (agentFound && agentFound.length > 0) {
|
|
913
|
+
agentFound[0].selected = !agentFound[0].selected;
|
|
914
|
+
this.cdr.detectChanges();
|
|
915
|
+
}
|
|
916
|
+
this.cdr.detectChanges();
|
|
917
|
+
}
|
|
918
|
+
areAllSelected() {
|
|
919
|
+
var _a;
|
|
920
|
+
return (_a = this.agents) === null || _a === void 0 ? void 0 : _a.every(agent => !agent.selected);
|
|
921
|
+
}
|
|
922
|
+
getDropdownHeaderText() {
|
|
923
|
+
var _a;
|
|
924
|
+
const selectedAgents = (_a = this.agents) === null || _a === void 0 ? void 0 : _a.filter(agent => agent.selected);
|
|
925
|
+
if (selectedAgents && (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) === 0) {
|
|
926
|
+
return 'All Agents';
|
|
927
|
+
}
|
|
928
|
+
else {
|
|
929
|
+
return (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) > 1 ? `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agents Selected` : `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agent Selected`;
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
fetchAgents_http() {
|
|
933
|
+
this.loading = true;
|
|
934
|
+
const url = `${this.environment.AGENTS_API}/CoPilot/${this.botId}/active-agents`;
|
|
935
|
+
const headers = new HttpHeaders({
|
|
936
|
+
'Content-Type': 'application/json'
|
|
937
|
+
});
|
|
938
|
+
return this.http.post(url, {}, { headers }).pipe(switchMap((res) => {
|
|
939
|
+
if (res) {
|
|
940
|
+
this.agents = res.map(agent => (Object.assign(Object.assign({}, agent), { selected: false })));
|
|
941
|
+
}
|
|
942
|
+
this.cdr.markForCheck();
|
|
943
|
+
return of(res);
|
|
944
|
+
}), catchError((error) => {
|
|
945
|
+
console.error('Error fetching chatbot config: ', error);
|
|
946
|
+
return of(null);
|
|
947
|
+
}));
|
|
948
|
+
}
|
|
949
|
+
fetchAgents() {
|
|
950
|
+
this.fetchAgents_http()
|
|
951
|
+
.subscribe();
|
|
952
|
+
}
|
|
953
|
+
// events/${eventId}/users-connections
|
|
954
|
+
processMessageForDisplay(markdown) {
|
|
955
|
+
if (!markdown || !(markdown.length > 0)) {
|
|
956
|
+
console.error('Input Markdown is null or empty');
|
|
957
|
+
return '';
|
|
958
|
+
}
|
|
959
|
+
//console.log('Markdown input:', markdown);
|
|
960
|
+
// Convert Markdown headers to HTML headers
|
|
961
|
+
let html = markdown.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
|
|
962
|
+
const level = hashes.length;
|
|
963
|
+
return `<h${level}>${text}</h${level}>`;
|
|
964
|
+
});
|
|
965
|
+
// console.log('After header conversion:', html);
|
|
966
|
+
// Convert Markdown links to HTML links
|
|
967
|
+
html = html.replace(/\[([^\]]+)]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
|
|
968
|
+
// console.log('After link conversion:', html);
|
|
969
|
+
// Convert Markdown bold to HTML strong
|
|
970
|
+
html = html.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
|
|
971
|
+
//console.log('After bold conversion:', html);
|
|
972
|
+
// Convert new lines to <br> tags
|
|
973
|
+
html = html.replace(/(?:\r\n|\r|\n)/g, '<br>');
|
|
974
|
+
// console.log('After line breaks conversion:', html);
|
|
975
|
+
// Optional: Sanitize the HTML to prevent XSS
|
|
976
|
+
const sanitizedHtml = this.sanitizeHtml(html);
|
|
977
|
+
// console.log('Sanitized HTML:', sanitizedHtml);
|
|
978
|
+
return sanitizedHtml;
|
|
979
|
+
}
|
|
980
|
+
toggleCollapse() {
|
|
981
|
+
this.isCollapsed = !this.isCollapsed;
|
|
982
|
+
this.cdr.detectChanges();
|
|
983
|
+
}
|
|
984
|
+
toggleCollapseGraph() {
|
|
985
|
+
this.isCollapsedForGraph = !this.isCollapsedForGraph;
|
|
986
|
+
this.cdr.detectChanges();
|
|
987
|
+
}
|
|
988
|
+
toggleCollapseFGraph() {
|
|
989
|
+
this.isCollapsedForFGraph = !this.isCollapsedForFGraph;
|
|
990
|
+
this.cdr.detectChanges();
|
|
991
|
+
}
|
|
992
|
+
// Extracts the domain from a URL
|
|
993
|
+
getDomainName(url) {
|
|
994
|
+
try {
|
|
995
|
+
const { hostname } = new URL(url);
|
|
996
|
+
return hostname.replace(/^www\./, ''); // Remove 'www.' if present
|
|
997
|
+
}
|
|
998
|
+
catch (_a) {
|
|
999
|
+
return 'unknown';
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
// Generates the favicon URL
|
|
1003
|
+
getFaviconUrl(url) {
|
|
1004
|
+
const domain = this.getDomainName(url);
|
|
1005
|
+
return `https://www.google.com/s2/favicons?sz=128&domain=${domain}`;
|
|
1006
|
+
}
|
|
1007
|
+
onCardClick() {
|
|
1008
|
+
this.sourcesDrawer.open();
|
|
1009
|
+
const button = document.getElementById('botcloseplaygroundbutton');
|
|
1010
|
+
if (button) {
|
|
1011
|
+
button.style.display = 'none';
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
onCloseSource() {
|
|
1015
|
+
this.sourcesDrawer.close();
|
|
1016
|
+
this.isDrawerOpen = false;
|
|
1017
|
+
this.cdr.detectChanges(); // Trigger change detection if needed
|
|
1018
|
+
this.onDrawerClosed();
|
|
1019
|
+
}
|
|
1020
|
+
onDrawerClosed() {
|
|
1021
|
+
setTimeout(() => {
|
|
1022
|
+
this.isDrawerOpen = true;
|
|
1023
|
+
this.cdr.detectChanges(); // Trigger change detection if needed
|
|
1024
|
+
// Use ngClass to dynamically apply the class
|
|
1025
|
+
const button = document.getElementById('botcloseplaygroundbutton');
|
|
1026
|
+
if (button) {
|
|
1027
|
+
button.style.display = 'block';
|
|
1028
|
+
}
|
|
1029
|
+
}, 1000);
|
|
1030
|
+
}
|
|
1031
|
+
toggleDrawer(todo) {
|
|
1032
|
+
this.isDrawerOpen = todo;
|
|
1033
|
+
this.cdr.detectChanges();
|
|
1034
|
+
this.updateButtonVisibility();
|
|
1035
|
+
}
|
|
1036
|
+
updateButtonVisibility() {
|
|
1037
|
+
const button = document.getElementById('botcloseplaygroundbutton');
|
|
1038
|
+
if (button) {
|
|
1039
|
+
button.style.display = this.isDrawerOpen ? 'block' : 'none';
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
openLinkInNewTab(link) {
|
|
1043
|
+
window.open(link, '_blank');
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
ChatDrawerComponent.decorators = [
|
|
1047
|
+
{ type: Component, args: [{
|
|
1048
|
+
selector: 'hivegpt-chat-drawer',
|
|
1049
|
+
template: "<mat-drawer-container class=\"hivegpt-chat-wrapper\" [ngClass]=\"{'mat-drawer-container-has-open': isDrawerOpen}\"\n [class.ios-device]=\"isIOSDevice\" [hasBackdrop]=\"hasBackdropValue\">\n\n <mat-drawer class=\"drawer\" #drawer [position]=\"'start'\" [mode]=\"'over'\" opened=\"true\"\n [class.full-width-drawer]=\"fullView\" [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \">\n <mat-drawer-content>\n\n <div class=\"chat-main\">\n <!-- <div class=\"chat-header\">\n <h2> -->\n <!-- {{eventName}} -->\n <!-- </h2> -->\n <!-- <button class=\"closeIcon\" (click)=\"onClose()\">\n <span class=\"material-symbols-outlined\">\n close\n </span>\n </button> -->\n <!-- </div> -->\n\n <div class=\"innerChat\" #chatMain>\n <div class=\"\">\n <div class=\"title\">\n <h2><span> {{botName}} <i><svg width=\"30\" height=\"30\" viewBox=\"0 0 106 105\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M52.8578 104.318C52.8645 104.32 52.8713 104.323 52.878 104.325V104.311C74.7711 96.9781 115.49 69.0948 103.537 16.0875C79.9227 8.17267 59.9557 2.08167 52.878 0.0118542V0C52.8713 0.0019722 52.8645 0.00394726 52.8578 0.00592613C52.851 0.00394726 52.8442 0.0019722 52.8375 0V0.0118542C45.7599 2.08167 25.7928 8.17267 2.17802 16.0875C-9.77459 69.0948 30.9444 96.9781 52.8375 104.311V104.325C52.8442 104.323 52.851 104.32 52.8578 104.318Z\"\n fill=\"#E2F6FA\"></path>\n <path\n d=\"M52.8409 95.3002V9.02441C58.6643 10.7266 75.2028 15.7706 94.7694 22.3286C104.66 66.1922 70.9382 89.2528 52.8409 95.3002Z\"\n fill=\"url(#paint0_linear_174_9166)\"></path>\n <rect x=\"63.725\" y=\"21.0347\" width=\"2.275\" height=\"29.6903\" rx=\"1.1375\"\n transform=\"rotate(-73.8316 63.725 21.0347)\"\n fill=\"url(#paint1_linear_174_9166)\"></rect>\n <path\n d=\"M52.8745 95.3002V9.02441C47.0511 10.7266 30.5127 15.7706 10.9461 22.3286C1.0553 66.1922 34.7772 89.2528 52.8745 95.3002Z\"\n fill=\"url(#paint2_linear_174_9166)\"></path>\n <path\n d=\"M67.1131 34.3431L43.2493 56.165C41.5673 57.7031 41.5085 60.3337 43.1202 61.9454L68.0846 86.9097C69.4975 88.3227 71.7364 88.4762 73.3289 87.2693L89.8566 74.7444C90.8029 74.0273 91.3817 72.9269 91.4364 71.7409L91.7769 64.3639C91.8163 63.5106 91.5814 62.667 91.1067 61.9568L73.138 35.0723C71.7767 33.0355 68.9209 32.6899 67.1131 34.3431Z\"\n fill=\"url(#paint3_linear_174_9166)\"></path>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M68.6302 31.8839C69.0923 31.6059 69.6441 31.5177 70.1698 31.6379C70.6955 31.758 71.1542 32.0771 71.4497 32.5282L73.5143 35.6772C73.7834 36.0886 73.8986 36.5818 73.8394 37.0698C73.7803 37.5579 73.5506 38.0093 73.191 38.3445L73.1848 38.3528L73.1556 38.3799L73.0367 38.4905L72.5675 38.9388C69.9711 41.4572 67.4535 44.0555 65.0183 46.7299C60.4366 51.7683 54.9958 58.3624 51.3338 64.7604C50.3119 66.5456 47.8157 66.9293 46.335 65.3882L32.8111 51.3366C32.6173 51.1352 32.466 50.8968 32.3661 50.6357C32.2663 50.3746 32.2199 50.0961 32.2298 49.8168C32.2398 49.5374 32.3057 49.2629 32.4239 49.0095C32.542 48.7562 32.7098 48.5292 32.9175 48.342L37.0049 44.6549C37.3641 44.3311 37.8247 44.1422 38.3078 44.1205C38.7909 44.0988 39.2666 44.2457 39.6534 44.5361L46.554 49.71C57.3335 39.0806 63.4459 35.0016 68.6302 31.8839Z\"\n fill=\"url(#paint4_linear_174_9166)\"></path>\n <defs>\n <linearGradient id=\"paint0_linear_174_9166\" x1=\"74.6954\" y1=\"9.02441\"\n x2=\"74.6954\" y2=\"95.3002\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#6EC6E3\"></stop>\n <stop offset=\"1\" stop-color=\"#5361C7\"></stop>\n </linearGradient>\n <linearGradient id=\"paint1_linear_174_9166\" x1=\"64.8625\" y1=\"21.0347\"\n x2=\"64.2597\" y2=\"43.0438\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"white\" stop-opacity=\"0.47\"></stop>\n <stop offset=\"1\" stop-color=\"white\" stop-opacity=\"0\"></stop>\n </linearGradient>\n <linearGradient id=\"paint2_linear_174_9166\" x1=\"31.02\" y1=\"9.02441\"\n x2=\"31.02\" y2=\"95.3002\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#5F8ED4\"></stop>\n <stop offset=\"1\" stop-color=\"#4F54C3\"></stop>\n </linearGradient>\n <linearGradient id=\"paint3_linear_174_9166\" x1=\"54.7875\" y1=\"42.5752\"\n x2=\"75.425\" y2=\"71.3377\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#5975CC\"></stop>\n <stop offset=\"1\" stop-color=\"#0043A6\" stop-opacity=\"0\"></stop>\n </linearGradient>\n <linearGradient id=\"paint4_linear_174_9166\" x1=\"40.8125\" y1=\"66.3502\"\n x2=\"73.8\" y2=\"66.3502\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#D0F0F7\"></stop>\n <stop offset=\"1\" stop-color=\"white\"></stop>\n </linearGradient>\n </defs>\n </svg></i> </span></h2>\n <p>AI-powered <span>copilot</span></p>\n </div>\n <div class=\"chatType\" style=\"display:none\">\n <h4 class=\"labelChat\">Choose a conversation style</h4>\n <ul>\n <li (click)=\"changeTemperature(0)\">\n <button [ngClass]=\"{active: temperature === 0}\">\n <span class=\"top-section-title\">\n More Creative\n </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(1)\" class=\"fdssfd\">\n <button [ngClass]=\"{active: temperature === 1}\">\n <span class=\"top-section-title\">\n More Balanced\n </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(2)\">\n <button [ngClass]=\"{active: temperature === 2}\">\n <span class=\"top-section-title\">\n More Precise\n </span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n <!-- chattype -->\n <div class=\"chat bot\" *ngFor=\"let chat of chatLog; let i = index\">\n\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"researchingCard\" *ngIf=\"showFeedBackIconsIndex === i\">\n <div *ngIf=\"(searchTerms && searchTerms.length>0) || (sourcesList && sourcesList.length >0)\"\n class=\"card-header d-flex align-items-center\" (click)=\"toggleCollapse()\">\n <span class=\"icon\"><i class=\"bx bx-plus-circle bx-sm\"></i></span>\n <span class=\"ml-2\">Researching <i id=\"toggleIcon\" class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{'fa-chevron-down': isCollapsed,'fa-chevron-up': !isCollapsed }\"></i></span>\n\n </div>\n <div *ngIf=\"searchTerms && searchTerms.length>0\"\n [ngClass]=\"{'collapse': isCollapsed}\">\n <ul class=\"list-group list-group-flush\">\n <li *ngFor=\"let term of searchTerms\" class=\"list-group-item\">Searching for\n <strong>{{term}}</strong>\n </li>\n </ul>\n\n <h5 class=\"mt-2\" *ngIf=\"sourcesList && sourcesList.length >0\"><i\n class='bx bx-unite'></i> Sources</h5>\n <div class=\"sources-container\" *ngIf=\"sourcesList && sourcesList.length >0\">\n <div class=\"source-card\"\n *ngFor=\"let source of displayedSources; let i = index\">\n <div>\n <div class=\"source-title\">{{source.title}}</div>\n <div class=\"source-url\">\n <img class=\"relative block\" [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\">\n {{getDomainName(source.link)}}\n </div>\n <div class=\"popup\">\n <div class=\"source-url\" (click)=\"openLinkInNewTab(source.link)\">\n <img class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\">\n {{getDomainName(source.link)}}\n </div>\n <h5 (click)=\"openLinkInNewTab(source.link)\">{{source.title}}\n </h5>\n <p (click)=\"openLinkInNewTab(source.link)\">{{source.desc}}</p>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"remainingSources && remainingSources.length > 0\">\n <div class=\"source-card\" (click)=\"onCardClick($event)\">\n <div>\n <div class=\"source-title\"><img\n *ngFor=\"let source of remainingSources; let i = index\"\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"></div>\n <div class=\"source-url\">\n\n View {{remainingSources.length}} more\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n </div>\n </div>\n\n <div *ngIf=\"chat.type === 'ai' || chat.type === 'user'\" [ngStyle]=\"{\n background:\n chat.type === 'ai' && bgBubbleAi\n ? ''\n : chat.type === 'user' && bgBubbleUser\n ? ''\n : ''\n }\">\n <p *ngIf=\"chat.type === 'ai' || chat.type === 'user'\" [ngStyle]=\"{\n background:\n chat.type === 'ai' && messageTextColorAi\n ? ''\n : chat.type === 'user' && messageTextColorUser\n ? ''\n : '',\n color:\n chat.type === 'ai' && messageTextColorAi\n ? ''\n : chat.type === 'user' && messageTextColorUser\n ? ''\n : ''\n }\" [innerHTML]=\"chat.message\">\n </p>\n\n </div>\n <div class=\"exicution mt-2\"\n *ngIf=\"showFeedBackIconsIndex === i && chat.type === 'ai' && (financialGraphs && financialGraphs.length >0) \">\n <h5 *ngIf=\"chat.type === 'ai'\"><i class='bx bx-network-chart'></i> Graphs <i\n (click)=\"toggleCollapseFGraph()\" class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{'fas fa-chevron-down': isCollapsedForFGraph,'fas fa-chevron-up': !isCollapsedForFGraph }\"></i>\n </h5>\n <img *ngFor=\"let image of financialGraphs\"\n [ngClass]=\"{'collapse': isCollapsedForFGraph}\" [src]=\"image\" alt=\"\">\n </div>\n <div class=\"exicution mt-2\"\n *ngIf=\"showFeedBackIconsIndex === i && chat.type === 'ai' && (executionPathImages && executionPathImages.length >0) \">\n <h5 *ngIf=\"chat.type === 'ai'\"><i class='bx bx-network-chart'></i> Execution Path\n Diagram\n For Data Visualization Workflow <i (click)=\"toggleCollapseGraph()\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{'fas fa-chevron-down': isCollapsedForGraph,'fas fa-chevron-up': !isCollapsedForGraph }\"></i>\n </h5>\n <img *ngFor=\"let image of executionPathImages\"\n [ngClass]=\"{'collapse': isCollapsedForGraph}\" [src]=\"image\" alt=\"\">\n </div>\n <div class=\"Related mt-2\"\n *ngIf=\"showFeedBackIconsIndex === i && (relatedListItems && relatedListItems.length > 0)\">\n <h5 *ngIf=\"chat.type === 'ai'\"><i class='bx bx-list-check'></i> Related</h5>\n <div class=\"card-container\" *ngIf=\"chat.type === 'ai'\">\n <ul class=\"list-container\">\n <ng-container *ngFor=\"let item of relatedListItems\">\n <li (click)=\"fetchDataFor(item)\">{{ item }}</li>\n </ng-container>\n\n </ul>\n\n </div>\n </div>\n </div>\n <div class=\"cta\" *ngIf=\"showFeedBackIconsIndex === i\">\n <div class=\"copyBox\" title=\"Copy\" style=\"float: right;\">\n <button title=\"{{ chat.copied ? 'Copied!' : 'Copy' }}\" class=\"copy\"\n [class.active]=\"chat.copied\" (click)=\"handleCopyClick(i)\">\n <i *ngIf=\"chat.copied\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\n fill=\"#566563\" />\n </svg>\n\n </i>\n <i *ngIf=\"!chat.copied\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M19.24 2H8.84C8.14 2 7.58 2.56 7.58 3.26V16.84C7.58 17.54 8.14 18.1 8.84 18.1H19.24C19.94 18.1 20.5 17.54 20.5 16.84V3.26C20.5 2.56 19.94 2 19.24 2ZM19.24 16.84H8.84V3.26H19.24V16.84ZM4.74 6.52C4.04 6.52 3.48 7.08 3.48 7.78V20.36C3.48 21.06 4.04 21.62 4.74 21.62H15.14C15.84 21.62 16.4 21.06 16.4 20.36V18.88H14.96V20.36H4.74V7.78H6.18V6.52H4.74Z\"\n fill=\"#566563\" />\n </svg>\n </i>\n </button>\n <button class=\"up copy\" title=\"Like\" [class.active]=\"chat.liked\"\n (click)=\"handleUpClick(i)\">\n <i *ngIf=\"chat.liked\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.38989 18.4902V8.33022C8.38989 7.93022 8.50989 7.54022 8.72989 7.21022L11.4599 3.15022C11.8899 2.50022 12.9599 2.04022 13.8699 2.38022C14.8499 2.71022 15.4999 3.81022 15.2899 4.79022L14.7699 8.06022C14.7299 8.36022 14.8099 8.63022 14.9799 8.84022C15.1499 9.03022 15.3999 9.15022 15.6699 9.15022H19.7799C20.5699 9.15022 21.2499 9.47022 21.6499 10.0302C22.0299 10.5702 22.0999 11.2702 21.8499 11.9802L19.3899 19.4702C19.0799 20.7102 17.7299 21.7202 16.3899 21.7202H12.4899C11.8199 21.7202 10.8799 21.4902 10.4499 21.0602L9.16989 20.0702C8.67989 19.7002 8.38989 19.1102 8.38989 18.4902Z\"\n fill=\"#17235B\" />\n <path\n d=\"M5.21 6.37988H4.18C2.63 6.37988 2 6.97988 2 8.45988V18.5199C2 19.9999 2.63 20.5999 4.18 20.5999H5.21C6.76 20.5999 7.39 19.9999 7.39 18.5199V8.45988C7.39 6.97988 6.76 6.37988 5.21 6.37988Z\"\n fill=\"#17235B\" />\n </svg>\n </i>\n <i *ngIf=\"!chat.liked\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10.4037 20.9264L10.381 20.9038L10.3557 20.8843L7.72165 18.85L8.02965 18.4516L10.7161 20.5315C10.9228 20.7195 11.2181 20.8517 11.4962 20.9377C11.7978 21.0309 12.1451 21.09 12.4801 21.09H16.2801C16.8572 21.09 17.4266 20.8625 17.8751 20.5306C18.3159 20.2044 18.6912 19.7385 18.8305 19.1997L21.2428 11.8732C21.4379 11.3309 21.4287 10.749 21.0965 10.2887C20.7583 9.81377 20.1844 9.58999 19.5801 9.58999H15.5801C15.2031 9.58999 14.8615 9.43143 14.6276 9.16215L14.627 9.16142C14.3873 8.88649 14.2756 8.51549 14.3345 8.11501L14.8322 4.9195C14.9978 4.1052 14.4664 3.24596 13.7053 2.98804C13.3277 2.85165 12.9297 2.89129 12.61 2.99839C12.2949 3.10396 11.9772 3.30172 11.7881 3.57673L11.7881 3.57671L11.7851 3.58107L7.96352 9.26689L7.55454 8.99314L11.3751 3.30891L11.3755 3.30836C11.8763 2.56103 13.0109 2.19028 13.8726 2.51744L13.8834 2.52151L13.8943 2.52509C14.9044 2.8564 15.556 3.98765 15.3317 5.01314L15.3284 5.02805L15.326 5.04314L14.836 8.19314L14.836 8.19313L14.8351 8.19928C14.8184 8.31642 14.7981 8.60268 15.0138 8.84924L15.0248 8.86177L15.0366 8.87354C15.1833 9.02026 15.3817 9.09999 15.5901 9.09999H19.5901C20.4308 9.09999 21.1176 9.44886 21.5113 10.0079L21.5124 10.0095C21.8964 10.5502 21.9908 11.2849 21.7202 12.0291L21.7175 12.0365L21.7151 12.044L19.3251 19.324L19.3198 19.34L19.3156 19.3564C19.0058 20.5707 17.6766 21.6 16.2801 21.6H12.4801C12.2411 21.6 11.8403 21.5625 11.4297 21.4512C11.0123 21.338 10.6406 21.1633 10.4037 20.9264Z\"\n fill=\"#566563\" stroke=\"#566563\" />\n <path\n d=\"M5.37988 20.4999H4.37988C3.52442 20.4999 2.98559 20.2982 2.65822 19.9825C2.33437 19.6702 2.12988 19.1614 2.12988 18.3499V8.5499C2.12988 7.73843 2.33437 7.22962 2.65822 6.91731C2.98559 6.6016 3.52442 6.3999 4.37988 6.3999H5.37988C6.23534 6.3999 6.77418 6.6016 7.10155 6.91731C7.4254 7.22962 7.62988 7.73843 7.62988 8.5499V18.3499C7.62988 19.1614 7.4254 19.6702 7.10155 19.9825C6.77418 20.2982 6.23534 20.4999 5.37988 20.4999ZM4.37988 6.8999C4.0934 6.8999 3.83578 6.9164 3.61382 6.96689C3.38745 7.01838 3.16822 7.11196 2.99258 7.2876C2.81559 7.46459 2.72807 7.67966 2.68301 7.89002C2.63948 8.09318 2.62988 8.31967 2.62988 8.5499V18.3499C2.62988 18.5801 2.63948 18.8066 2.68301 19.0098C2.72807 19.2201 2.81559 19.4352 2.99258 19.6122C3.16822 19.7878 3.38745 19.8814 3.61382 19.9329C3.83578 19.9834 4.0934 19.9999 4.37988 19.9999H5.37988C5.66637 19.9999 5.92398 19.9834 6.14595 19.9329C6.37232 19.8814 6.59155 19.7878 6.76719 19.6122C6.94418 19.4352 7.0317 19.2201 7.07676 19.0098C7.12028 18.8066 7.12988 18.5801 7.12988 18.3499V8.5499C7.12988 8.31967 7.12028 8.09318 7.07676 7.89002C7.0317 7.67966 6.94418 7.46459 6.76719 7.2876C6.59155 7.11196 6.37232 7.01838 6.14595 6.96689C5.92398 6.9164 5.66637 6.8999 5.37988 6.8999H4.37988Z\"\n fill=\"#566563\" stroke=\"#566563\" />\n </svg>\n </i>\n </button>\n <button class=\"down copy\" title=\"Dislike\" [class.active]=\"chat.unliked\"\n (click)=\"handleDownClick(i)\">\n <i *ngIf=\"chat.unliked\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15.61 5.50002V15.66C15.61 16.06 15.49 16.45 15.27 16.78L12.54 20.84C12.11 21.49 11.04 21.95 10.13 21.61C9.15002 21.28 8.50002 20.18 8.71002 19.2L9.23002 15.93C9.27002 15.63 9.19002 15.36 9.02002 15.15C8.85002 14.96 8.60002 14.84 8.33002 14.84H4.22002C3.43002 14.84 2.75002 14.52 2.35002 13.96C1.97002 13.42 1.90002 12.72 2.15002 12.01L4.61002 4.52002C4.92002 3.28002 6.27002 2.27002 7.61002 2.27002H11.51C12.18 2.27002 13.12 2.50002 13.55 2.93002L14.83 3.92002C15.32 4.30002 15.61 4.88002 15.61 5.50002Z\"\n fill=\"#17235B\" />\n\n <path\n d=\"M18.7901 17.6099H19.8201C21.3701 17.6099 22.0001 17.0099 22.0001 15.5299V5.4799C22.0001 3.9999 21.3701 3.3999 19.8201 3.3999H18.7901C17.2401 3.3999 16.6101 3.9999 16.6101 5.4799V15.5399C16.6101 17.0099 17.2401 17.6099 18.7901 17.6099Z\"\n fill=\"#17235B\" />\n </svg>\n </i>\n\n <i *ngIf=\"!chat.unliked\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10.1237 21.481L10.1148 21.4778L10.1059 21.4748C9.09577 21.1435 8.44416 20.0122 8.66849 18.9867L8.67175 18.9718L8.6741 18.9568L9.1641 15.8068L9.16413 15.8068L9.16501 15.8006C9.18175 15.6835 9.20207 15.3972 8.98633 15.1507L8.97536 15.1381L8.96359 15.1263C8.81687 14.9796 8.61841 14.8999 8.41004 14.8999H4.41004C3.56937 14.8999 2.88252 14.551 2.48884 13.992L2.4877 13.9904C2.10371 13.4497 2.00931 12.715 2.27994 11.9708L2.28263 11.9634L2.28509 11.9559L4.67509 4.67586L4.68035 4.65985L4.68451 4.64353C4.99418 3.42996 6.33271 2.3999 7.72004 2.3999H11.52C11.7591 2.3999 12.1599 2.43736 12.5704 2.54872C12.9878 2.66194 13.3596 2.83655 13.5965 3.07346L13.6191 3.09608L13.6444 3.11563L16.2785 5.14986L15.9705 5.54825L13.2875 3.47111C13.0799 3.2763 12.7837 3.1413 12.5061 3.05412C12.2031 2.95897 11.8551 2.8999 11.52 2.8999H7.72004C7.1429 2.8999 6.57353 3.12735 6.12508 3.45926C5.68428 3.78551 5.30892 4.25142 5.16963 4.79019L2.75738 12.1167C2.56223 12.659 2.57147 13.2409 2.90366 13.7012C3.24183 14.1761 3.81578 14.3999 4.42004 14.3999H8.42004C8.79702 14.3999 9.13867 14.5585 9.37252 14.8277L9.37315 14.8285C9.61286 15.1034 9.72457 15.4745 9.66568 15.875C9.6656 15.8755 9.66552 15.8761 9.66544 15.8766L9.16795 19.0704C9.00242 19.8841 9.53299 20.7428 10.2933 21.0013C10.6685 21.1391 11.0675 21.0978 11.3857 20.9917C11.7001 20.8869 12.0218 20.6898 12.2121 20.4132L12.2121 20.4132L12.215 20.4088L16.0351 14.7253L16.4472 15.0045L12.6251 20.691L12.6249 20.6912C12.259 21.2361 11.5347 21.5999 10.8 21.5999C10.5668 21.5999 10.3358 21.5596 10.1237 21.481Z\"\n fill=\"#566563\" stroke=\"#566563\" />\n <path\n d=\"M19.6201 17.6H18.6201C17.7647 17.6 17.2258 17.3983 16.8985 17.0826C16.5746 16.7703 16.3701 16.2615 16.3701 15.45V5.65C16.3701 4.83853 16.5746 4.32972 16.8985 4.0174C17.2258 3.7017 17.7647 3.5 18.6201 3.5H19.6201C20.4756 3.5 21.0144 3.7017 21.3418 4.0174C21.6656 4.32972 21.8701 4.83853 21.8701 5.65V15.45C21.8701 16.2615 21.6656 16.7703 21.3418 17.0826C21.0144 17.3983 20.4756 17.6 19.6201 17.6ZM18.6201 4C18.3336 4 18.076 4.01649 17.8541 4.06699C17.6277 4.11848 17.4085 4.21206 17.2328 4.3877C17.0558 4.56469 16.9683 4.77976 16.9232 4.99011C16.8797 5.19328 16.8701 5.41977 16.8701 5.65V15.45C16.8701 15.6802 16.8797 15.9067 16.9232 16.1099C16.9683 16.3202 17.0558 16.5353 17.2328 16.7123C17.4085 16.8879 17.6277 16.9815 17.8541 17.033C18.076 17.0835 18.3336 17.1 18.6201 17.1H19.6201C19.9066 17.1 20.1642 17.0835 20.3862 17.033C20.6126 16.9815 20.8318 16.8879 21.0074 16.7123C21.1844 16.5353 21.2719 16.3202 21.317 16.1099C21.3605 15.9067 21.3701 15.6802 21.3701 15.45V5.65C21.3701 5.41977 21.3605 5.19328 21.317 4.99011C21.2719 4.77976 21.1844 4.56469 21.0074 4.3877C20.8318 4.21206 20.6126 4.11848 20.3862 4.06699C20.1642 4.01649 19.9066 4 19.6201 4H18.6201Z\"\n fill=\"#566563\" stroke=\"#566563\" />\n </svg>\n </i>\n </button>\n\n </div>\n\n </div>\n <div class=\"time-cta\"\n [ngClass]=\"{'time-cta din': showFeedBackIconsIndex===i, 'time-cta': showFeedBackIconsIndex!=i}\">\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat.type === 'ai'\">\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n {{ \"Assistant\" }} - {{ chat.time }}\n </div>\n </div>\n\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat.type === 'user'\">\n <img src=\"https://e1cdn.social27.com/digitalevents/chatbot/user-chatbot-icon.svg\">\n <div class=\"dateTime\">\n You - {{ chat.time }}\n </div>\n </div>\n\n\n </div>\n\n </div>\n\n <div class=\"cta-faqs quick-prompts-extended\" *ngIf=\"i == 0 && quickPrompts?.length\">\n <!-- <div *ngFor=\"let tile of quickPrompts\" class=\"cta\"\n (click)=\"sendMessageWithTile(tile.prompt)\">\n Q: {{ tile.text }}\n </div> -->\n <div class=\"cta_suggestions\">\n <button *ngFor=\"let tile of quickPrompts\" (click)=\"sendMessageWithTile(tile.prompt)\">\n <ng-container *ngIf=\"tile\">{{tile.text}}</ng-container>\n </button>\n </div>\n\n </div>\n <div class=\"chat bot\" *ngIf=\"i == 0 && botSkills\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <p [innerHTML]=\"processMessageForDisplay(botSkills)\"> </p> \n </div>\n </div>\n </div>\n <div *ngIf=\"chat.suggestions?.length\">\n <h4 class=\"labelChat\">Here are some things EventsGPT Copilot can help you do:</h4>\n <div class=\"cta_suggestions\">\n <button *ngFor=\"let suggestion of chat.suggestions\"\n (click)=\"sendMessageWithTile(suggestion)\">\n <ng-container *ngIf=\"suggestion\">{{suggestion}}</ng-container>\n </button>\n </div>\n </div>\n <div\n *ngIf=\"chat.action?.section_id == 'company_search' || chat.action?.section_id == 'user_search' || chat.action?.section_id == 'industry_company_search'\">\n <div class=\"box\">\n <div class=\"tiktokwrapper\">\n <div class=\"tiktokshell\" *ngFor=\"let user of chat.action.users\">\n <div class=\"videoPhotobox\">\n <ng-conatiner *ngIf=\"user?.photoPath && !user.userVideosModel\">\n <img [src]=\"user?.photoPath\">\n </ng-conatiner>\n <ng-conatiner *ngIf=\"user.userVideosModel\">\n <app-video-player *ngIf=\"user?.userVideosModel\" [isDev]=\"isDev\"\n [currentUserId]=\"userId\" [videoObj]=\"user?.userVideosModel\"\n [user]=\"user\" [eventId]=\"eventId\" type=\"1\">\n </app-video-player>\n </ng-conatiner>\n\n </div>\n\n <div class=\"noPhoto\" *ngIf=\"!user?.photoPath && !user.userVideosModel\">\n <h3>{{user.firstName | slice:0:1}}{{user.lastName | slice:0:1}}</h3>\n </div>\n <div class=\"overlymask\" *ngIf=\"!user.userVideosModel\">\n </div>\n <div class=\"onshell-content\">\n <div class=\"title-shell\">\n <h3>{{user.firstName}} {{user.lastName}}</h3>\n <h3 class=\"companyName\">{{user.company}}</h3>\n </div>\n <div class=\"button-shell\">\n <button class=\"Connectbtn\"\n (click)=\"connectToUser(user.userId)\">{{canConnect(user.userId) ?\n 'Connect' : canDisconnect(user.userId) ? 'Disconnect' : 'Request\n Sent'}}</button>\n <button class=\"schedulebtn\"\n (click)=\"scheduleMeetingWithUser(user)\">Schedule</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"chat.action?.section_id == myUpcomingSessionAction\">\n <div class=\"agenda-items-wrapper\" class=\"agenda-items-wrapper\">\n <div class=\"list-view\">\n <div class=\"session-detail-wrapper card-background-session\"\n *ngFor=\"let upcomingSession of chat.action.content\">\n <div class=\"thumbnail \"><img alt=\"Introduction to the Imaging Radar Academy\"\n src=\"https://s27media.azureedge.net/8008/profile_pic/453cea2c-feba-11ed-8c0b-00155d025b0a.png\"\n class=\"\">\n <!---->\n <!---->\n <!----><button class=\"play-btn color-primary \"\n title=\"Play Session: Introduction to the Imaging Radar Academy\"><span\n class=\"material-icons notranslate \"> play_circle_outline\n </span>\n <!---->\n </button>\n <!---->\n <!---->\n </div>\n <!---->\n <!---->\n <div class=\"content p-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"d-flex flex-column\">\n <p class=\"fs-xs mb-0 body-text-color \">\n {{upcomingSession.dateTimeRange.start | date:'MM-dd-yyyy\n HH:mm':'UTC'}} - {{upcomingSession.dateTimeRange.end |\n date:'MM-dd-yyyy HH:mm':'UTC'}} {{upcomingSession.timeZone.id}}\n </p>\n <!---->\n <!---->\n <!-- <p class=\"fs-xs mb-2 color-secondary\" title=\"Session Type: Generative AI\">Generative AI </p> -->\n <!---->\n </div>\n <div class=\"d-flex align-items-center actions px-2\">\n <!---->\n <button\n (click)=\"performSessionAction(upcomingSession.id, 'view-session')\"\n class=\"s27-btn-icon body-text-color\"\n title=\"View Session Information: Introduction to the Imaging Radar Academy\"><span\n class=\"material-icons notranslate\"> remove_red_eye\n </span>\n </button>\n\n <button\n (click)=\"performSessionAction(upcomingSession.id, 'add-to-agenda')\"\n class=\"s27-btn-icon body-text-color \"><span\n class=\"material-icons notranslate\"\n title=\"Add Session: Introduction to the Imaging Radar Academy to My agendaa\">\n event_available </span>\n </button>\n <!---->\n <!---->\n <!---->\n <!---->\n\n <button (click)=\"performSessionAction(upcomingSession.id, 'play')\"\n class=\"s27-btn-icon body-text-color \"\n title=\"Copy session link to share\"><span\n class=\"material-icons notranslate\"> play_circle_outline\n </span>\n </button>\n <!---->\n </div>\n </div>\n <h2 class=\"body-text-color\">{{upcomingSession.title}}</h2>\n <div class=\"session-description color-secondary\"\n [innerHTML]=\"sanitizeHtml(upcomingSession.description)\">\n </div>\n <ul class=\"speakers grid-2-cols\"\n *ngFor=\"let speakerId of upcomingSession.speakers\">\n <li class=\"\">\n <div class=\"image \" title=\"Blair Wunderlich\"><img\n alt=\"Blair Wunderlich\"\n [src]=\"speakers[speakerId]?.photoPath\" class=\"\">\n <!---->\n <!---->\n <!---->\n </div>\n <!---->\n <div class=\"content pl-3 \" style=\"text-transform: none;\">\n <div class=\"mb-0 body-text-color fs-xs fw-500\">\n {{speakers[speakerId]?.firstName}}\n {{speakers[speakerId]?.lastName}}</div>\n <div class=\"color-secondary fs-xxs\">\n {{speakers[speakerId]?.jobTitle}}</div>\n <div class=\"color-secondary fs-xxs\">\n {{speakers[speakerId]?.company}}</div>\n </div>\n <!---->\n </li>\n </ul>\n <!---->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"chat bot\" *ngIf=\"isChatingWithAi\">\n\n <div class=\"chat-box\">\n <div class=\"o-media__body\">\n <div class=\"o-vertical-spacing\">\n <h3 class=\"blog-post__headline\">\n <span class=\"skeleton-box\" style=\"width:55%;\"></span>\n </h3>\n <p>\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\n <span class=\"skeleton-box\" style=\"width:90%;\"></span>\n <span class=\"skeleton-box\" style=\"width:83%;\"></span>\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\n </p>\n </div>\n </div>\n\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n {{ \"Assistant\" }} - {{ chat?.time ? chat.time : (dateTime.now |\n date:'shortTime') }}\n\n </div>\n </div>\n\n\n\n </div>\n </div>\n\n </div>\n <div class=\"chat bot\" *ngIf=\"loading\">\n <div class=\"chat-box\">\n <div class=\"o-media__body\">\n <div class=\"o-vertical-spacing\">\n <h3 class=\"blog-post__headline\">\n <span class=\"skeleton-box\" style=\"width:55%;\"></span>\n </h3>\n <p>\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\n <span class=\"skeleton-box\" style=\"width:90%;\"></span>\n <span class=\"skeleton-box\" style=\"width:83%;\"></span>\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\n </p>\n </div>\n </div>\n\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n {{ \"Loading..\" }}\n\n </div>\n </div>\n\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- <div #chatMain></div> -->\n <div class=\"chatFooterWrapper\">\n <div class=\"chat-footer\">\n <div class=\"dropdown-wrapper\" (click)=\"toggleDropdown()\">\n <div class=\"dropdown-header\">\n <span>{{ getDropdownHeaderText() }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\n <label (click)=\"onSelectAll()\">\n <input type=\"checkbox\" [checked]=\"areAllSelected()\" />\n All\n </label>\n <label *ngFor=\"let agent of agents\" (click)=\"onAgentChange(agent)\">\n <input type=\"checkbox\" [(ngModel)]=\"agent.selected\" />\n {{ agent.agentName }}\n </label>\n </div>\n </div>\n\n\n <div class=\"border-shape\">\n <input [disabled]=\"isChatingWithAi\" type=\"text\" class=\"form-control-1 s27-scroll\"\n placeholder=\"Ask anything...\" [style.background]=\"formFieldBgColor ? formFieldBgColor : ''\"\n [style.color]=\"formFieldTextColor ? formFieldTextColor : ''\" [(ngModel)]=\"input\"\n (keyup.enter)=\"handleSubmit()\" #myInput />\n\n </div>\n <div class=\"cta-footer\">\n <button class=\"btn cta-chat\" (click)=\"handleSubmit()\"\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\">\n <svg stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 512 512\"\n height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M476.59 227.05l-.16-.07L49.35 49.84A23.56 23.56 0 0027.14 52 24.65 24.65 0 0016 72.59v113.29a24 24 0 0019.52 23.57l232.93 43.07a4 4 0 010 7.86L35.53 303.45A24 24 0 0016 327v113.31A23.57 23.57 0 0026.59 460a23.94 23.94 0 0013.22 4 24.55 24.55 0 009.52-1.93L476.4 285.94l.19-.09a32 32 0 000-58.8z\">\n </path>\n </svg>\n <!-- SEND -->\n </button>\n </div>\n </div>\n <div class=\"text-left note-section\">\n <div class=\"note\">\n <i>\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 106 105\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M52.8578 104.318C52.8645 104.32 52.8713 104.323 52.878 104.325V104.311C74.7711 96.9781 115.49 69.0948 103.537 16.0875C79.9227 8.17267 59.9557 2.08167 52.878 0.0118542V0C52.8713 0.0019722 52.8645 0.00394726 52.8578 0.00592613C52.851 0.00394726 52.8442 0.0019722 52.8375 0V0.0118542C45.7599 2.08167 25.7928 8.17267 2.17802 16.0875C-9.77459 69.0948 30.9444 96.9781 52.8375 104.311V104.325C52.8442 104.323 52.851 104.32 52.8578 104.318Z\"\n fill=\"#E2F6FA\"></path>\n <path\n d=\"M52.8409 95.3002V9.02441C58.6643 10.7266 75.2028 15.7706 94.7694 22.3286C104.66 66.1922 70.9382 89.2528 52.8409 95.3002Z\"\n fill=\"url(#paint0_linear_174_9166)\"></path>\n <rect x=\"63.725\" y=\"21.0347\" width=\"2.275\" height=\"29.6903\" rx=\"1.1375\"\n transform=\"rotate(-73.8316 63.725 21.0347)\" fill=\"url(#paint1_linear_174_9166)\">\n </rect>\n <path\n d=\"M52.8745 95.3002V9.02441C47.0511 10.7266 30.5127 15.7706 10.9461 22.3286C1.0553 66.1922 34.7772 89.2528 52.8745 95.3002Z\"\n fill=\"url(#paint2_linear_174_9166)\"></path>\n <path\n d=\"M67.1131 34.3431L43.2493 56.165C41.5673 57.7031 41.5085 60.3337 43.1202 61.9454L68.0846 86.9097C69.4975 88.3227 71.7364 88.4762 73.3289 87.2693L89.8566 74.7444C90.8029 74.0273 91.3817 72.9269 91.4364 71.7409L91.7769 64.3639C91.8163 63.5106 91.5814 62.667 91.1067 61.9568L73.138 35.0723C71.7767 33.0355 68.9209 32.6899 67.1131 34.3431Z\"\n fill=\"url(#paint3_linear_174_9166)\"></path>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M68.6302 31.8839C69.0923 31.6059 69.6441 31.5177 70.1698 31.6379C70.6955 31.758 71.1542 32.0771 71.4497 32.5282L73.5143 35.6772C73.7834 36.0886 73.8986 36.5818 73.8394 37.0698C73.7803 37.5579 73.5506 38.0093 73.191 38.3445L73.1848 38.3528L73.1556 38.3799L73.0367 38.4905L72.5675 38.9388C69.9711 41.4572 67.4535 44.0555 65.0183 46.7299C60.4366 51.7683 54.9958 58.3624 51.3338 64.7604C50.3119 66.5456 47.8157 66.9293 46.335 65.3882L32.8111 51.3366C32.6173 51.1352 32.466 50.8968 32.3661 50.6357C32.2663 50.3746 32.2199 50.0961 32.2298 49.8168C32.2398 49.5374 32.3057 49.2629 32.4239 49.0095C32.542 48.7562 32.7098 48.5292 32.9175 48.342L37.0049 44.6549C37.3641 44.3311 37.8247 44.1422 38.3078 44.1205C38.7909 44.0988 39.2666 44.2457 39.6534 44.5361L46.554 49.71C57.3335 39.0806 63.4459 35.0016 68.6302 31.8839Z\"\n fill=\"#C4C4C4\"></path>\n <defs>\n <linearGradient id=\"paint0_linear_174_9166\" x1=\"87.9736\" y1=\"7.88186\" x2=\"7.52095\"\n y2=\"100.482\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#E8F6F9\"></stop>\n <stop offset=\"1\" stop-color=\"#CEFAF9\"></stop>\n </linearGradient>\n <linearGradient id=\"paint1_linear_174_9166\" x1=\"63.8012\" y1=\"37.3264\" x2=\"66.6714\"\n y2=\"24.7281\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#C2E4E7\"></stop>\n <stop offset=\"1\" stop-color=\"#F3F8F8\" stop-opacity=\"0\"></stop>\n </linearGradient>\n <linearGradient id=\"paint2_linear_174_9166\" x1=\"52.8387\" y1=\"30.822\" x2=\"27.7411\"\n y2=\"77.8896\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#E8F6F9\"></stop>\n <stop offset=\"1\" stop-color=\"#CEFAF9\"></stop>\n </linearGradient>\n <linearGradient id=\"paint3_linear_174_9166\" x1=\"89.7622\" y1=\"51.5494\" x2=\"73.8328\"\n y2=\"68.4825\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#A0E6E9\"></stop>\n <stop offset=\"1\" stop-color=\"#D6F7F9\" stop-opacity=\"0\"></stop>\n </linearGradient>\n </defs>\n </svg>\n </i>\n <span class=\"text\">Your personal or company information is kept private and secure within this\n chat.</span>\n </div>\n </div>\n </div>\n </mat-drawer-content>\n\n\n\n </mat-drawer>\n <mat-drawer class=\"drawer\" style=\"width: 45%;\" #sourcesDrawer [position]=\"'end'\" [mode]=\"'over'\" [style.background]=\"'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \">\n <mat-drawer-content>\n <div class=\"sourceDraweContainer\">\n\n <div class=\"container-fluid\">\n <button mat-icon-button class=\"closeButtonSource\" (click)=\"onCloseSource()\">\n <mat-icon>close</mat-icon>\n </button>\n <h1>{{sourcesList.length}} Sources</h1>\n <p>Tell me about latest news from Mistral about AI agents announcement done this month</p>\n <hr />\n <ul class=\"sources-list\">\n <li *ngFor=\"let item of sourcesList;let si=index\">\n <input type=\"checkbox\" id=\"source1\">\n <div class=\"source-content\" (click)=\"openLinkInNewTab(item.link)\">\n <label for=\"source1\">\n <span class=\"source-title\"><span class=\"ml-1\">{{si+1}}.</span>{{item.title}}</span>\n <span class=\"image-container\">\n <img class=\"relative block\" [src]=\"getFaviconUrl(item.link)\"\n [alt]=\"getDomainName(item.link) + ' favicon'\"> <span>\n {{getDomainName(item.link)}}</span>\n </span>\n <span class=\"source-description\">{{item.desc}}</span>\n </label>\n </div>\n </li>\n\n </ul>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n</mat-drawer-container>",
|
|
1050
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1051
|
+
styles: ["@import url(\"https://e1cdn.social27.com/digitalevents/liteversion/fonts/segoe-ui/stylesheet.css\");::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb,::-webkit-scrollbar-thumb:hover{background:#e5ccbc}body{overflow:hidden}.ios-device .drawer .chat-footer .form-control{font-size:16px}.hivegpt-chat-wrapper{background:transparent!important;height:100%;inset:0;opacity:0;position:fixed;visibility:hidden;z-index:999999}.hivegpt-chat-wrapper.mat-drawer-container-has-open{background:transparent!important;opacity:1;transition:all .3s;visibility:visible;z-index:999999}.hivegpt-chat-wrapper .mat-drawer:not(.mat-drawer-side){box-shadow:none}.hivegpt-chat-wrapper mat-drawer{background-color:#fafafa!important;background-image:none!important;max-width:800px;width:100%}.hivegpt-chat-wrapper mat-drawer.full-width-drawer{max-width:100%}.hivegpt-chat-wrapper .mat-drawer-content{display:flex;flex-direction:column}.hivegpt-chat-wrapper .chat-header{padding:16px 40px;width:100%}.hivegpt-chat-wrapper .chat-header h2{font-family:Segoe UI,sans-serif;font-size:36px;font-weight:500;letter-spacing:-.72px;line-height:108%;margin:0;text-transform:uppercase}.hivegpt-chat-wrapper .chat-header .closeIcon{align-items:center;background:transparent;border:none;border-radius:50%;display:inline-flex;font-size:18px;height:35px;justify-content:center;outline:none;padding:0;position:absolute;right:12px;top:16px;width:35px}.hivegpt-chat-wrapper .chat-main{display:flex;flex:1;flex-direction:column;justify-content:space-between;overflow-y:auto;width:100%}.hivegpt-chat-wrapper .chat-main .innerChat{overflow-y:auto;padding:20px 40px 10px;width:100%}.hivegpt-chat-wrapper .chat-main .chat-box{max-width:80%;width:100%}.hivegpt-chat-wrapper .chat-main .chat-box .message{background:hsla(0,0%,94.9%,.7);border-radius:6px 6px 10px 0;box-shadow:0 .3px .9px rgba(0,0,0,.1215686275),0 1.6px 3.6px rgba(0,0,0,.1607843137);margin-bottom:10px;margin-top:20px;min-height:60px;padding:18px 20px;position:relative}.hivegpt-chat-wrapper .chat-main .chat-box .message p{color:#111;font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;text-align:left;white-space:pre-line}.hivegpt-chat-wrapper .chat-main .chat-box .message p a{color:#17235b!important;cursor:pointer!important;font-weight:700;text-decoration:underline}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta{align-items:end;bottom:-7px;display:inline-flex;gap:10px;grid-gap:10px;position:relative;right:-10px;z-index:5}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button{background:transparent;border:none;color:#566563;cursor:pointer;padding:0;transition:all .3s}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button i{display:inline-block}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button:hover{color:#17235b}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-wrapper .chat-main .chat{margin-bottom:20px}.hivegpt-chat-wrapper .chat-main .chat.bot .chat-box .message{border-radius:6px 6px 10px 0}.hivegpt-chat-wrapper .chat-main .chat.user{text-align:right}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box{margin-left:auto}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box .message{background:linear-gradient(96deg,#8b4ead -10.61%,#761c79 84.59%);border-radius:20px 20px 0 20px;color:#fff}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box .message p{color:#fff;text-align:left}.hivegpt-chat-wrapper .chat-main .chat.user .dateTime{text-align:right}.hivegpt-chat-wrapper .chat-main .chat.user .time-cta{justify-content:flex-end}.hivegpt-chat-wrapper .chat-main .chat .Icon_TimeSTamp{align-content:center;align-items:center;display:flex;justify-content:center}.hivegpt-chat-wrapper .chat-main .chat .dateTime{color:#566563;font-family:Segoe UI,sans-serif;font-size:13px;font-style:normal;font-weight:500;line-height:140%;margin:0 5px}.hivegpt-chat-wrapper .chat-main .chat:last-of-type{margin-bottom:0}.hivegpt-chat-wrapper .chatFooterWrapper{background:#fff;border-radius:6px 6px 0 0!important;margin-top:5px!important;padding:10px 14px}.hivegpt-chat-wrapper .chatFooterWrapper .note{align-items:center;border-radius:6px;color:#1b75bb;display:inline-flex;font-size:11px;gap:8px;line-height:1;margin:0 auto 4px;padding:4px 8px}.hivegpt-chat-wrapper .chatFooterWrapper .note a{text-transform:capitalize}.hivegpt-chat-wrapper .chatFooterWrapper .note i{font-size:18px}.hivegpt-chat-wrapper .chatFooterWrapper .note i svg{height:18px;width:18px}.hivegpt-chat-wrapper .chatFooterWrapper .note span{flex:1;gap:4px;line-height:1.3}.hivegpt-chat-wrapper .chat-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;padding:4px 0 0;position:relative}.hivegpt-chat-wrapper .chat-footer .form-control{background:#fff!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.hivegpt-chat-wrapper .chat-footer .form-control::-moz-placeholder{color:#6c7a78}.hivegpt-chat-wrapper .chat-footer .form-control::placeholder{color:#6c7a78}.hivegpt-chat-wrapper .chat-footer .form-control:focus{border-color:#e5ccbc}.hivegpt-chat-wrapper .chat-footer .cta-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;position:absolute;right:10px;text-align:right}.hivegpt-chat-wrapper .chat-footer .cta-footer .btn{color:#000;font-weight:500;gap:8px;max-width:150px;padding:0}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat{align-items:center;background:transparent!important;border:none;border-radius:0;box-shadow:0 1px 2px 0 rgba(16,24,40,.05);display:inline-flex;font-size:20px;height:auto;justify-content:center;width:auto}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat:hover{opacity:.8}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-again{background:#17235b;border:1px solid #17235b;color:#fff}.hivegpt-chat-wrapper .cta-faqs{align-items:flex-end;display:flex;flex-direction:column;flex-wrap:wrap;gap:8px;margin-left:auto;max-width:80%;padding:10px 0 0}.hivegpt-chat-wrapper .cta-faqs .cta{background:transparent;border:1px solid #c9a893;border-radius:20px 20px 0 20px;color:#333;cursor:pointer;font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;min-height:44px;padding:12px 20px;text-align:left;text-decoration:none;transition:all .3s;white-space:pre-line}.spinner{align-items:center;display:flex;gap:2px;justify-content:center}.spinner>div{animation:bouncedelay 1.4s ease-in-out infinite;animation-fill-mode:both;background-color:#173330;border-radius:100%;display:inline-block;height:5px;width:5px}.spinner .bounce1{animation-delay:-.32s}.spinner .bounce2{animation-delay:-.16s}@keyframes bouncedelay{0%,80%,to{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.time-cta{align-items:center;display:flex;gap:8px;justify-content:start;margin-top:5px}@keyframes thumbsUpAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes thumbsDownAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(3px)}}@media (max-width:767px){.hivegpt-chat-wrapper .chat-main .innerChat{padding:0 24px 10px}.hivegpt-chat-wrapper .chat-footer{padding:10px 24px}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat{max-width:100%}.hivegpt-chat-wrapper .chat-footer .form-control{height:80px}.hivegpt-chat-wrapper .chat-header .closeIcon{height:28px;right:8px;top:8px;width:28px}.hivegpt-chat-wrapper .chat-header .closeIcon span{font-size:14px}.hivegpt-chat-wrapper .chat-header{padding:10px 24px}.hivegpt-chat-wrapper .chat-header h2{font-size:20px}.cta-faqs{padding:10px 0 0}}.body-overflow-hidden{overflow:hidden}.chat-button{align-items:center;background:#17235b;border:#17235b;border-radius:50%;color:#fff;display:inline-flex;font-size:24px;height:50px;justify-content:center;width:50px}textarea{caret-color:#000}.labelChat{font-size:14px;font-weight:400;margin:0 0 10px}.chatType h4{color:#566563;text-align:center}.chatType ul{align-items:center;background:#fff;border-radius:10px;box-shadow:0 .3px .9px rgba(0,0,0,.12),0 1.6px 3.6px rgba(0,0,0,.16);display:flex;justify-content:center;list-style:none;margin:0 0 20px;padding:4px}.chatType ul li{flex:1}.chatType ul li button{align-items:center;background:#fff;border:none;border-radius:10px;font-weight:600;min-height:48px;padding:.375rem;text-align:center;text-shadow:1px 0 rgba(0,0,0,.2);width:100%}.chatType ul li button.active{background:linear-gradient(96deg,#761c79 -10.61%,#761c79 84.59%);box-shadow:0 1px 2px 0 rgba(16,24,40,.05);color:#fff}.cta_suggestions{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:20px}.cta_suggestions button{background:#fff;border:1px solid #174ae4;border-radius:10px;box-shadow:0 1.6px 3.6px 0 rgba(0,0,0,.13),0 .3px .9px 0 rgba(0,0,0,.1);color:#1543cd;font-size:14px;font-weight:600;line-height:1.2;padding:8px 12px;position:relative;text-align:left;transition:all .3s}.cta_suggestions button:hover{background:#eff3ff}.balanced .chat-footer .cta-footer .cta-chat,.balanced .chat-main .chat.user .chat-box .message,.balanced .chatType ul li button.active{color:#000}.balanced .chat-main .innerChat .title p span{color:#06f}.balanced mat-drawer{background-image:linear-gradient(180deg,rgba(88,190,251,.05) 60%,rgba(0,102,255,.2) 96.27%)}.balanced .cta_suggestions button:hover{border:1px solid #06f}.precise .chat-footer .cta-footer .cta-chat,.precise .chat-main .chat.user .chat-box .message{background:linear-gradient(96deg,#69ca6d -10.61%,#4caf50 84.59%)}.precise .chatType ul li button.active{background:linear-gradient(96deg,#4caf50 -10.61%,#4caf50 84.59%);color:#fff}.precise .chat-main .innerChat .title p span{color:#4caf50}.precise mat-drawer{background-image:linear-gradient(180deg,rgba(76,175,80,.05) 60%,rgba(76,175,80,.3) 96.27%)}.precise .cta_suggestions button:hover{border:1px solid #4caf50}.title{margin-bottom:50px}.title h2{font-size:28px;margin:0 0 10px}.title h2 span{align-items:center;color:#000;display:inline-flex;gap:10px}.title h2 i{color:#06f;font-size:30px;line-height:1}.title h2 i svg{height:30px;width:30px}.title p{font-weight:600;margin:0}.title p span{color:#06f}.agenda-items-wrapper{padding-bottom:15px;padding-top:15px}@media (max-width:576px){.list-view .session-detail-wrapper{border:none;flex-direction:column}}.card-background-session{background:#fff;border-radius:8px}.card-background-session .body-text-color{color:#111!important}.card-background-session h2{-webkit-box-orient:vertical;-webkit-line-clamp:1;display:-webkit-box;font-size:20px;margin-bottom:8px;overflow:hidden}.card-background-session .session-description{-webkit-box-orient:vertical;-webkit-line-clamp:2;color:#111!important;display:-webkit-box;font-size:14px;overflow:hidden}.card-background-session .color-secondary{color:#111!important}.card-background-session p{font-size:14px}.list-view .session-detail-wrapper .s27-btn-icon{background:transparent;border:transparent}.list-view .session-detail-wrapper{border-left:3px solid transparent;display:flex;margin-bottom:16px}.thumbnail{align-items:center;display:flex;height:160px;justify-content:center;min-width:160px;position:relative;width:160px}.thumbnail img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}@media (max-width:576px){.thumbnail{height:160px;min-height:unset;width:100%}}.thumbnail .play-btn{align-items:center;background-color:transparent;border:0;bottom:0;display:flex;font-size:60px;justify-content:center;left:0;position:absolute;right:0;top:0;width:100%}.thumbnail .play-btn span{font-size:80px;text-shadow:0 0 14px rgba(74,74,74,.45)}.content{flex-grow:1}.actions{background-color:transparent!important}.speakers{margin-bottom:0;margin-top:10px;padding:0}.speakers li{align-items:unset;display:flex}.speakers li .content{font-size:12px!important}.speakers .image{border-radius:100%;height:40px;min-width:40px;overflow:hidden;width:40px}.speakers img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}.grid-2-cols{display:grid;grid-gap:15px;grid-template-columns:calc(55% - 10px) calc(50% - 10px);padding-right:20px}@media (max-width:768px){.grid-2-cols{grid-template-columns:calc(50% - 10px) calc(50% - 10px)}}@media (max-width:575px){.grid-3-cols{grid-template-columns:100%}}.quick-prompts-extended{align-items:flex-start!important;margin-left:0!important}.border-shape{background:#fff;border:1px solid #ced4da;border-radius:4px;min-height:60px;overflow:hidden;padding:0;width:100%}.border-shape .form-control-1{background:none!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.border-shape .form-control-1:focus{box-shadow:none;outline:none}.border-shape .s27-scroll::-webkit-scrollbar{border-radius:30px;width:3px}.border-shape .s27-scroll::-webkit-scrollbar-track{background:#f1f1f1;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-thumb{background:#888;border-radius:30px}.box{display:table;height:275px;margin:10px 0;width:100%}.tiktokwrapper{display:grid;gap:10px;grid-template-columns:repeat(2,1fr);height:100%}.tiktokwrapper .tiktokshell{background:#3d2b8f;border:2px solid #fff;border-radius:5px;box-shadow:0 0 6px #494949;height:100%;min-height:275px;min-width:160px;position:relative;width:100%}.tiktokwrapper .overlymask{background-image:url(https://e1cdn.social27.com/digitalevents/HiveGpt/screen-overlay.png);background-position:0 0;bottom:0;height:100%;left:0;position:absolute;width:100%;z-index:6}.tiktokwrapper .videoPhotobox{bottom:0;height:272px;left:0;overflow:hidden;position:absolute;width:auto;z-index:6}.tiktokwrapper .videoPhotobox video{-o-object-fit:cover;border-radius:0;cursor:pointer;height:270px;object-fit:cover;outline:0;transition:.3s ease-in-out;width:100%}.tiktokwrapper .videoPhotobox img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}.tiktokwrapper .playBtn{align-items:center;border:none;cursor:pointer;display:flex;height:40px;justify-content:center;left:0;margin:0 auto;position:absolute;right:0;top:105px;transition:all 1s;width:40px;z-index:10}.tiktokwrapper .playBtn:hover{transform:scale(1.2)}.tiktokwrapper .noPhoto{align-items:center;border:none;cursor:pointer;display:flex;height:40px;justify-content:center;left:0;margin:0 auto;position:absolute;right:0;top:105px;transition:all 1s;z-index:6}.tiktokwrapper .noPhoto h3{color:#fff;font-size:46px}.tiktokwrapper .onshell-content{bottom:10px;left:5px;position:absolute;z-index:10}.tiktokwrapper .onshell-content .title-shell{margin:0 10px}.tiktokwrapper .onshell-content h3{color:#fff;font-size:13px;font-weight:500}.tiktokwrapper .onshell-content .companyName{color:#eaeaea;font-size:12px;font-weight:400}.tiktokwrapper .onshell-content .button-shell button{background:#4e4e4e;border:none;border-radius:2px;color:#fff;font-size:11px;margin:0 1px;padding:4px 7px;text-transform:capitalize}.tiktokwrapper .onshell-content .Connectbtn{background:linear-gradient(149deg,#06f,#06f)!important}.skeleton-box{background-color:#dddbdd;display:inline-block;height:1em;overflow:hidden;position:relative}.skeleton-box:after{animation:shimmer 5s infinite;background-image:linear-gradient(90deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.2) 20%,hsla(0,0%,100%,.5) 60%,hsla(0,0%,100%,0));bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;transform:translateX(-100%)}@keyframes shimmer{to{transform:translateX(100%)}}.blog-post__headline{font-size:1.25em;font-weight:700}.blog-post__meta{color:#6b6b6b;font-size:.85em}.o-media{display:flex}.o-media__body{flex-grow:1;margin-left:1em}.o-vertical-spacing>*+*{margin-top:.75em}.o-vertical-spacing--l>*+*{margin-top:2em}.copy{background:none;border:none;cursor:pointer;padding:5px;transition:transform .2s ease}.copy.active{transform:scale(1.1)}.copy svg{fill:#566563;height:18px;width:18px}.copyBox{background:hsla(0,0%,100%,.7019607843);border-radius:13px;box-shadow:0 .3px .9px rgba(0,0,0,.1215686275),0 1.6px 3.6px rgba(0,0,0,.1607843137);color:#566563;display:flex;gap:12px;padding:5px 10px;position:relative;width:105px}.copyBox button{background:transparent;border:none;color:#566563;cursor:pointer;padding:0;transition:all .3s}.copyBox button i{display:inline-block}.copyBox button:hover{color:#17235b}.copyBox button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.copyBox button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.din{display:inline-flex}.chatFooterWrapper{align-items:center;background-color:#f5f5f5;border-top:1px solid #ccc;flex-direction:column;justify-content:center;padding:10px}.chat-footer{align-items:center;background:#fff;border-radius:5px;display:flex;margin-bottom:10px;padding:10px;width:100%}.dropdown-wrapper{margin-right:10px;position:relative}.dropdown-header{align-items:center;background:#ebebeb;border-radius:4px;color:#414141!important;cursor:pointer;display:flex;font-size:1rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.dropdown-header span{margin-right:8px}.dropdown-menu{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px rgba(0,0,0,.1);display:block;left:0;margin-bottom:10px;max-height:200px;overflow-y:auto;padding:0;position:absolute;top:auto;width:160px;z-index:1000}.dropdown-menu label{cursor:pointer;display:block;font-size:16px;padding:5px 15px}.dropdown-menu label input{height:16px;width:16px}.dropdown-menu label:hover{background-color:#f0f0f0}.border-shape{flex-grow:1}.form-control-1{border:1px solid #ddd;border-radius:5px;padding:10px;width:100%}.cta-footer{align-items:center;display:flex}.btn.cta-chat{background-color:#007bff;border:none;border-radius:5px;color:#fff;cursor:pointer;padding:10px 15px}.btn.cta-chat svg{vertical-align:middle}.text-left .note-section{align-items:center;background:#fff;border-radius:5px;box-shadow:0 2px 4px rgba(0,0,0,.1);display:flex;margin-top:10px;max-width:800px;padding:10px;width:100%}.text-left .note{align-items:center;color:#555;display:flex}.text-left .note i{margin-right:8px}.text-left .note .text{font-size:14px}.card-container{display:flex;gap:15px}.custom-card{background:#fffefe;border:1px solid #ddd;border-radius:.25rem;box-shadow:0 4px 8px rgba(0,0,0,.1);margin-bottom:10px;overflow:hidden;width:18rem}.custom-card .card-body{padding:10px}.custom-card .card-title{font-size:1.25rem;font-weight:700}.custom-card .card-text{font-size:1rem;text-align:left}.custom-card .btn-primary{background-color:#007bff;border:none;border-radius:.25rem}.custom-card .card-footer{background-color:#f8f9fa;color:#6c757d;padding:10px;text-align:center}.list-container{list-style:none;padding:0}.list-container li{border-bottom:1px solid #ccc;font-size:12px;margin-bottom:5px;padding:5px}.list-container li:hover{color:#06f;cursor:pointer}.collapsible-container{margin-bottom:5px;overflow:hidden;width:100%}.collapsible-header{cursor:pointer;display:flex;padding:15px}.collapsible-header .header-icon{font-size:20px;margin-right:10px}.collapsible-header .header-title{flex:1;font-size:18px}.collapsible-header .toggle-icon{font-size:18px;margin-left:18px}.collapsible-content{background-color:#f8f9fa;color:#333;padding:15px;width:100%}.collapsible-content.show{display:block}.researchingCard{margin:20px auto}.card-header{-moz-user-select:none;-webkit-user-select:none;background:none;border-bottom:0;cursor:pointer;padding:0;user-select:none}.icon{font-size:20px;line-height:5px}.rotate{transform:rotate(180deg)}.collapse{display:none}.list-group-item{font-size:14px}.sources-container{align-items:flex-start;display:flex;gap:15px}.source-card{background-color:#f0f3f5;border-radius:10px;box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;justify-content:space-between;padding:15px;position:relative;transition:box-shadow .3s ease;width:100%}.popup{background-color:#fff;border-radius:5px;box-shadow:0 4px 8px rgba(0,0,0,.2);left:50%;opacity:0;padding:10px;position:absolute;top:100%;transform:translateX(-50%) translateY(-10px);transition:opacity .3s ease,transform .3s ease;visibility:hidden;white-space:normal;width:100%;z-index:10}.popup h5{font-size:14px;font-weight:600;line-height:1.2;margin:5px 0 10px}.popup p{font-size:12px;line-height:1.4;margin:0}.popup h5:hover{color:#007bff;cursor:pointer}.popup .source-url{color:#000;text-decoration:none}.popup .source-url:hover{color:#007bff;cursor:pointer;text-decoration:underline}.source-card:hover .popup{opacity:1;transform:translateX(-50%) translateY(-15px);visibility:visible}.source-card:hover{box-shadow:0 4px 8px rgba(0,0,0,.1);transform:scale(1.05)}.source-title{-webkit-box-orient:vertical;-webkit-line-clamp:2;display:-webkit-box;font-size:14px;font-weight:500;height:55px;line-height:1.5;overflow:hidden;text-align:left;text-overflow:ellipsis}.source-title img{margin-left:10px;width:20px}.source-url{align-items:center;color:#6c757d;display:flex;font-size:12px;text-align:left}.source-url img{border-radius:50%;height:16px;margin-right:5px;width:16px}.sourceDraweContainer .container{background-color:#fff;padding:20px}.sourceDraweContainer .sources-list{list-style:none;padding:0}.sourceDraweContainer .sources-list li{align-items:flex-start;display:flex;margin-bottom:15px}.sourceDraweContainer .sources-list input[type=checkbox]{flex-shrink:0;margin-right:15px;margin-top:8px}.sourceDraweContainer .source-content{background-color:#f5f2f2;border:1px solid #ddd;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,.1);cursor:pointer;flex:1;padding:12px}.sourceDraweContainer .source-content:hover{background:#ccc}.sourceDraweContainer .source-title{display:block;font-size:1rem;font-weight:500;height:auto!important;margin-bottom:4px}.sourceDraweContainer .source-description{display:block;font-size:.875rem}.sourceDraweContainer .image-container{align-items:center;display:flex;margin:10px 0}.sourceDraweContainer .image-container img{-o-object-fit:cover;border:1px solid #ddd;border-radius:50%;height:16px;margin-right:5px;object-fit:cover;width:16px}.sourceDraweContainer .image-container span{color:#555;font-size:13px}.closeButtonSource{background:none!important;border-color:transparent!important;box-shadow:none!important;color:inherit;cursor:pointer;float:right;margin-top:20px;transition:color .2s ease-in-out}.closeButtonSource.closeplaygroundbutton{display:none!important}"]
|
|
1052
|
+
},] }
|
|
1053
|
+
];
|
|
1054
|
+
ChatDrawerComponent.ctorParameters = () => [
|
|
1055
|
+
{ type: ChangeDetectorRef },
|
|
1056
|
+
{ type: HttpClient },
|
|
1057
|
+
{ type: DomSanitizer },
|
|
1058
|
+
{ type: ElementRef },
|
|
1059
|
+
{ type: Renderer2 },
|
|
1060
|
+
{ type: SocketService },
|
|
1061
|
+
{ type: ConversationService }
|
|
1062
|
+
];
|
|
1063
|
+
ChatDrawerComponent.propDecorators = {
|
|
1064
|
+
chatMain: [{ type: ViewChild, args: ['chatMain',] }],
|
|
1065
|
+
closePlaygroundButtons: [{ type: ViewChildren, args: ['closeplaygroundbutton',] }],
|
|
1066
|
+
drawer: [{ type: ViewChild, args: ['drawer',] }],
|
|
1067
|
+
sourcesDrawer: [{ type: ViewChild, args: ['sourcesDrawer',] }],
|
|
1068
|
+
myTextarea: [{ type: ViewChild, args: ['myTextarea', { static: false },] }],
|
|
1069
|
+
copilotName: [{ type: Input }],
|
|
1070
|
+
firstName: [{ type: Input }],
|
|
1071
|
+
lastName: [{ type: Input }],
|
|
1072
|
+
apiKey: [{ type: Input }],
|
|
1073
|
+
bgBubbleAi: [{ type: Input }],
|
|
1074
|
+
bgBubbleUser: [{ type: Input }],
|
|
1075
|
+
bgGradient: [{ type: Input }],
|
|
1076
|
+
botName: [{ type: Input }],
|
|
1077
|
+
botSkills: [{ type: Input }],
|
|
1078
|
+
botId: [{ type: Input }],
|
|
1079
|
+
closeButtonColor: [{ type: Input }],
|
|
1080
|
+
closeButtonbgColor: [{ type: Input }],
|
|
1081
|
+
credentials: [{ type: Input }],
|
|
1082
|
+
dateTimeColor: [{ type: Input }],
|
|
1083
|
+
dateTextColor: [{ type: Input }],
|
|
1084
|
+
eventId: [{ type: Input }],
|
|
1085
|
+
s27UserToken: [{ type: Input }],
|
|
1086
|
+
eventName: [{ type: Input }],
|
|
1087
|
+
botIcon: [{ type: Input }],
|
|
1088
|
+
formFieldBgColor: [{ type: Input }],
|
|
1089
|
+
formFieldTextColor: [{ type: Input }],
|
|
1090
|
+
fullView: [{ type: Input }],
|
|
1091
|
+
gradientColors: [{ type: Input }],
|
|
1092
|
+
greeting: [{ type: Input }],
|
|
1093
|
+
messageTextColorAi: [{ type: Input }],
|
|
1094
|
+
messageTextColorUser: [{ type: Input }],
|
|
1095
|
+
rules: [{ type: Input }],
|
|
1096
|
+
sendButtonColor: [{ type: Input }],
|
|
1097
|
+
sendButtonTextColor: [{ type: Input }],
|
|
1098
|
+
showClose: [{ type: Input }],
|
|
1099
|
+
thumbsDownMessages: [{ type: Input }],
|
|
1100
|
+
thumbsUpMessage: [{ type: Input }],
|
|
1101
|
+
timezone: [{ type: Input }],
|
|
1102
|
+
unknownResponses: [{ type: Input }],
|
|
1103
|
+
useOpenAi: [{ type: Input }],
|
|
1104
|
+
userId: [{ type: Input }],
|
|
1105
|
+
isDev: [{ type: Input }],
|
|
1106
|
+
againButtonColor: [{ type: Input }],
|
|
1107
|
+
againButtonTextColor: [{ type: Input }],
|
|
1108
|
+
feedbackEvent: [{ type: Output }],
|
|
1109
|
+
onCloseEvent: [{ type: Output }],
|
|
1110
|
+
openPage: [{ type: Output }],
|
|
1111
|
+
sessionActions: [{ type: Output }],
|
|
1112
|
+
closeBot: [{ type: Output }],
|
|
1113
|
+
connectWithUser: [{ type: Output }],
|
|
1114
|
+
scheduleMeeting: [{ type: Output }]
|
|
1115
|
+
};
|
|
1116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1kcmF3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9tdWRkYXNzaXJuYXl5ZXIvRGV2ZWxvcG1lbnQvU29jaWFsMjcvSGl2ZUFJLVBhY2thZ2VzL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvY2hhdC1kcmF3ZXIvY2hhdC1kcmF3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9EQUFvRDtBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFTMUQsTUFBTSxPQUFPLG1CQUFtQjtJQXdGOUIsWUFDVSxHQUFzQixFQUN0QixJQUFnQixFQUNoQixTQUF1QixFQUN2QixVQUFzQixFQUN0QixRQUFtQixFQUNuQixhQUE0QixFQUM1QixZQUFp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U0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxxQkFBcUI7Z0JBQy9CLDRuekRBQTJDO2dCQUUzQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDaEQ7OztZQTVCQyxpQkFBaUI7WUFIVixVQUFVO1lBZ0JWLFlBQVk7WUFYbkIsVUFBVTtZQU1WLFNBQVM7WUFZRixhQUFhO1lBRmIsbUJBQW1COzs7dUJBWXpCLFNBQVMsU0FBQyxVQUFVO3FDQUNwQixZQUFZLFNBQUMsdUJBQXVCO3FCQUNwQyxTQUFTLFNBQUMsUUFBUTs0QkFDbEIsU0FBUyxTQUFDLGVBQWU7eUJBRXpCLFNBQVMsU0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzBCQUd6QyxLQUFLO3dCQUNMLEtBQUs7dUJBQ0wsS0FBSztxQkFDTCxLQUFLO3lCQUNMLEtBQUs7MkJBQ0wsS0FBSzt5QkFDTCxLQUFLO3NCQUNMLEtBQUs7d0JBQ0wsS0FBSztvQkFDTCxLQUFLOytCQUNMLEtBQUs7aUNBQ0wsS0FBSzswQkFDTCxLQUFLOzRCQUNMLEtBQUs7NEJBQ0wsS0FBSztzQkFDTCxLQUFLOzJCQUNMLEtBQUs7d0JBQ0wsS0FBSztzQkFDTCxLQUFLOytCQUNMLEtBQUs7aUNBQ0wsS0FBSzt1QkFDTCxLQUFLOzZCQUNMLEtBQUs7dUJBQ0wsS0FBSztpQ0FDTCxLQUFLO21DQUNMLEtBQUs7b0JBQ0wsS0FBSzs4QkFDTCxLQUFLO2tDQUNMLEtBQUs7d0JBQ0wsS0FBSztpQ0FDTCxLQUFLOzhCQUNMLEtBQUs7dUJBQ0wsS0FBSzsrQkFDTCxLQUFLO3dCQUNMLEtBQUs7cUJBQ0wsS0FBSztvQkFDTCxLQUFLOytCQUVMLEtBQUs7bUNBQ0wsS0FBSzs0QkFDTCxNQUFNOzJCQUNOLE1BQU07dUJBQ04sTUFBTTs2QkFDTixNQUFNO3VCQUNOLE1BQU07OEJBQ04sTUFBTTs4QkFDTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREcmF3ZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zaWRlbmF2JztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGZvcm1hdE5vdywgZm9ybWF0VGltZVN0YW1wcyB9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCB7IGRldl9lbnZpcm9ubWVudCwgcHJvZF9lbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBDb252ZXJzYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29udmVyc2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU29ja2V0U2VydmljZSB9IGZyb20gJy4uL3NvY2tldC1zZXJ2aWNlLnNlcnZpY2UnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hpdmVncHQtY2hhdC1kcmF3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhdC1kcmF3ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGF0LWRyYXdlci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhdERyYXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2NoYXRNYWluJykgcHJpdmF0ZSBjaGF0TWFpbjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZHJlbignY2xvc2VwbGF5Z3JvdW5kYnV0dG9uJykgY2xvc2VQbGF5Z3JvdW5kQnV0dG9uczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkKCdkcmF3ZXInKSBkcmF3ZXIhOiBNYXREcmF3ZXI7XG4gIEBWaWV3Q2hpbGQoJ3NvdXJjZXNEcmF3ZXInKSBzb3VyY2VzRHJhd2VyITogTWF0RHJhd2VyO1xuICBwcml2YXRlIGJvZHlPdmVyZmxvd0NsYXNzID0gJ2JvZHktb3ZlcmZsb3ctaGlkZGVuJztcbiAgQFZpZXdDaGlsZCgnbXlUZXh0YXJlYScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBteVRleHRhcmVhITogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjsgLy8gUmVmZXJlbmNlIHRvIHRoZSB0ZXh0YXJlYVxuICBpc0NvbGxhcHNlZFRydWUgPSBmYWxzZTtcbiAgQElucHV0KCkgY29waWxvdE5hbWU6IHN0cmluZyA9IFwiSGl2ZVhHUFRcIjtcbiAgQElucHV0KCkgZmlyc3ROYW1lITogc3RyaW5nO1xuICBASW5wdXQoKSBsYXN0TmFtZSE6IHN0cmluZztcbiAgQElucHV0KCkgYXBpS2V5ITogc3RyaW5nO1xuICBASW5wdXQoKSBiZ0J1YmJsZUFpITogc3RyaW5nO1xuICBASW5wdXQoKSBiZ0J1YmJsZVVzZXIhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJnR3JhZGllbnQhOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgYm90TmFtZSE6IHN0cmluZztcbiAgQElucHV0KCkgYm90U2tpbGxzITogc3RyaW5nO1xuICBASW5wdXQoKSBib3RJZCE6IHN0cmluZztcbiAgQElucHV0KCkgY2xvc2VCdXR0b25Db2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgY2xvc2VCdXR0b25iZ0NvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBjcmVkZW50aWFscyE6IFtdO1xuICBASW5wdXQoKSBkYXRlVGltZUNvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBkYXRlVGV4dENvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBldmVudElkITogc3RyaW5nO1xuICBASW5wdXQoKSBzMjdVc2VyVG9rZW4hOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGV2ZW50TmFtZSE6IHN0cmluZztcbiAgQElucHV0KCkgYm90SWNvbiE6IHN0cmluZztcbiAgQElucHV0KCkgZm9ybUZpZWxkQmdDb2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgZm9ybUZpZWxkVGV4dENvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBmdWxsVmlldyE6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGdyYWRpZW50Q29sb3JzITogc3RyaW5nW107XG4gIEBJbnB1dCgpIGdyZWV0aW5nITogc3RyaW5nO1xuICBASW5wdXQoKSBtZXNzYWdlVGV4dENvbG9yQWkhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1lc3NhZ2VUZXh0Q29sb3JVc2VyITogc3RyaW5nO1xuICBASW5wdXQoKSBydWxlcyE6IHN0cmluZztcbiAgQElucHV0KCkgc2VuZEJ1dHRvbkNvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBzZW5kQnV0dG9uVGV4dENvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBzaG93Q2xvc2UhOiBib29sZWFuO1xuICBASW5wdXQoKSB0aHVtYnNEb3duTWVzc2FnZXMhOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgdGh1bWJzVXBNZXNzYWdlITogc3RyaW5nO1xuICBASW5wdXQoKSB0aW1lem9uZSE6IHN0cmluZztcbiAgQElucHV0KCkgdW5rbm93blJlc3BvbnNlcyE6IFtdO1xuICBASW5wdXQoKSB1c2VPcGVuQWkhOiBib29sZWFuO1xuICBASW5wdXQoKSB1c2VySWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlzRGV2ITogYm9vbGVhbjtcblxuICBASW5wdXQoKSBhZ2FpbkJ1dHRvbkNvbG9yITogc3RyaW5nW107XG4gIEBJbnB1dCgpIGFnYWluQnV0dG9uVGV4dENvbG9yITogc3RyaW5nW107XG4gIEBPdXRwdXQoKSBmZWVkYmFja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBvbkNsb3NlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBvcGVuUGFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgc2Vzc2lvbkFjdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGNsb3NlQm90ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBjb25uZWN0V2l0aFVzZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNjaGVkdWxlTWVldGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIGF1dG9nZW5LZXkgPSBcIkF1dG9nZW5fZURKVHRFVS1OQjBSdElwenExd1wiXG4gIGFkZFRvTXlBZ2VuZGFBY3Rpb24gPSBcImFkZF90b19teV9hZ2VuZGFcIjtcbiAgbXlVcGNvbWluZ1Nlc3Npb25BY3Rpb24gPSBcIm15X3VwY29tbWluZ19zZXNzaW9uXCI7XG4gIGNvbm5lY3RPckZvbGxvd0FjdGlvbiA9IFwiY29ubmVjdF9vcl9mb2xsb3dcIjtcbiAgYWlSZXNwb25zZTogc3RyaW5nID0gJyc7XG4gIGNoYXRMb2c6IGFueVtdID0gW107XG4gIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgZmVlZGJhY2tEb25lOiBib29sZWFuID0gZmFsc2U7XG4gIGdyZWV0aW5nTXNnOiBzdHJpbmcgPSAnJztcbiAgaGFzQmFja2Ryb3BWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpbnB1dDogc3RyaW5nID0gJyc7XG4gIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTtcbiAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBtb2RlOiBzdHJpbmcgPSAnb3Zlcic7XG4gIHF1aWNrUHJvbXB0czogYW55W10gPSBbXTtcbiAgdGh1bWJzRG93bk1zZ0luZGV4ID0gMDtcbiAgdXNlck5hbWU6IHN0cmluZyA9ICcnO1xuICBzaG93U3RhcnRBZ2FpbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0lPU0RldmljZTogYm9vbGVhbiA9IGZhbHNlO1xuICBzaG93RmVlZEJhY2tJY29uc0luZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgdGVtcGVyYXR1cmU6IG51bWJlciA9IDE7XG4gIHNwZWFrZXJzID0gW107XG4gIGVudmlyb25tZW50OiB7XG4gICAgVVNFUlNfQVBJLFxuICAgIEJBU0VfVVJMLFxuICAgIEFHRU5UU19BUElcbiAgfTtcbiAgcGVuZGluZ1JlcXVlc3RzOiBhbnk7XG4gIG15Q29ubmVjdGlvbnM6IGFueTtcbiAgY29udmVyc2F0aW9uS2V5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBzb2NrZXRTZXJ2aWNlOiBTb2NrZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29udmVyc2F0aW9uOiBDb252ZXJzYXRpb25TZXJ2aWNlXG4gICAgLy8gcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm1cbiAgKSB7XG4gICAgdGhpcy5jaGF0TWFpbiA9IG5ldyBFbGVtZW50UmVmKG51bGwpO1xuXG4gICAgLy8gaWYgKHRoaXMucGxhdGZvcm0uSU9TKSB7XG4gICAgLy8gICB0aGlzLmlzSU9TRGV2aWNlID0gdHJ1ZTtcbiAgICAvLyB9XG5cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLmlzRGV2ID8gZGV2X2Vudmlyb25tZW50IDogcHJvZF9lbnZpcm9ubWVudDtcblxuICAgIC8vIHRoaXMuZmV0Y2hNeUNvbm5lY3Rpb25zKCkuc3Vic2NyaWJlKCk7XG4gICAgLy8gdGhpcy5mZXRjaFBlbmRpbmdSZXF1ZXN0cygpLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5jaGFuZ2VUZW1wZXJhdHVyZSh0aGlzLnRlbXBlcmF0dXJlKTtcbiAgICB0aGlzLmZldGNoQm90Q29uZmlnKCkuc3Vic2NyaWJlKFxuICAgICAgKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICB0aGlzLmZldGNoQ2hhdEhpc3RvcnkoKS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubWFwQ2hhdEhpc3RvcnkocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjaGF0IGhpc3Rvcnk6JywgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjaGF0IGhpc3Rvcnk6JywgZXJyKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuZmV0Y2hBZ2VudHMoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmluaXRpYWxpemVTb2NrZXQoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubGlzdGVuU29ja2V0cygpO1xuICAgIH0sIDIwMCk7XG4gIH1cbiAgcHJpdmF0ZSBldmVudFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBpbml0aWFsaXplU29ja2V0KCkge1xuICAgIDtcbiAgICBjb25zdCBjb252ZXJzYXRpb25faWQgPSB0aGlzLmNvbnZlcnNhdGlvbi5nZXRLZXkodGhpcy5ib3RJZCk7XG5cbiAgICB0aGlzLnNvY2tldFNlcnZpY2UucmVnaXN0ZXJVc2VyU3BlY2lmaWNIaXZlU29ja2V0KHRoaXMuYm90SWQsIGNvbnZlcnNhdGlvbl9pZCk7XG4gIH1cblxuICBzdWJzY3JpcHRpb25OZXc6IGFueTtcbiAgc29ja2V0RGF0YTogYW55O1xuICBleGVjdXRpb25QYXRoSW1hZ2VzID0gW107XG4gIHNlYXJjaFRlcm1zID0gW107XG4gIGZpbmFuY2lhbEdyYXBocyA9IFtdO1xuXG4gIGxpc3RlblNvY2tldHMoKSB7XG4gICAgdGhpcy5ldmVudFN1YnNjcmlwdGlvbiA9IHRoaXMuY29udmVyc2F0aW9uXG4gICAgICAuZ2V0VXNlclNwZWNpZmljTm90aWZpY2F0aW9uKClcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiBPdGhlckZpZWxkcyBleGlzdHMgaW4gdGhlIHJlc3BvbnNlXG4gICAgICAgICAgaWYgKHJlcz8ubT8uT3RoZXJGaWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29udmVyc2F0aW9uX2lkLCBib3RfaWQsIGFuc3dlciwgd2ViX3Jlc3VsdHMsIGZpbmFuY2lhbF9ncmFwaHMsIGV4ZWN1dGlvbl9ncmFwaHMsIG9ubGluZV9zZWFyY2hfdGVybXMsIHN1Z2dlc3Rpb25zIH0gPSByZXM/Lm0/Lk90aGVyRmllbGRzO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGZpZWxkcyBiYXNlZCBvbiB0aGVpciBwcmVzZW5jZVxuICAgICAgICAgICAgaWYgKGFuc3dlcikge1xuICAgICAgICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQW5zd2VyOicsIGFuc3dlcik7XG4gICAgICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYWknLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGFuc3dlciksXG4gICAgICAgICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh3ZWJfcmVzdWx0cyAmJiBBcnJheS5pc0FycmF5KHdlYl9yZXN1bHRzKSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV2ViIFJlc3VsdHM6Jywgd2ViX3Jlc3VsdHMpO1xuICAgICAgICAgICAgICB0aGlzLnNvdXJjZXNMaXN0ID0gd2ViX3Jlc3VsdHM7XG5cbiAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRTb3VyY2VzID0gdGhpcy5zb3VyY2VzTGlzdD8uc2xpY2UoMCwgMyk7IC8vIEZpcnN0IDMgY2FyZHNcbiAgICAgICAgICAgICAgdGhpcy5yZW1haW5pbmdTb3VyY2VzID0gdGhpcy5zb3VyY2VzTGlzdD8uc2xpY2UoMyk7IC8vIFJlbWFpbmluZyBpdGVtc1xuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpbmFuY2lhbF9ncmFwaHMgJiYgQXJyYXkuaXNBcnJheShmaW5hbmNpYWxfZ3JhcGhzKSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmluYW5jaWFsIEdyYXBoczonLCBmaW5hbmNpYWxfZ3JhcGhzKTtcbiAgICAgICAgICAgICAgdGhpcy5maW5hbmNpYWxHcmFwaHMgPSBmaW5hbmNpYWxfZ3JhcGhzO1xuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleGVjdXRpb25fZ3JhcGhzICYmIEFycmF5LmlzQXJyYXkoZXhlY3V0aW9uX2dyYXBocykpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0V4ZWN1dGlvbiBHcmFwaHM6JywgZXhlY3V0aW9uX2dyYXBocyk7XG4gICAgICAgICAgICAgIC8vIFByb2Nlc3MgZXhlY3V0aW9uIGdyYXBocyBhcyBuZWVkZWRcbiAgICAgICAgICAgICAgdGhpcy5leGVjdXRpb25QYXRoSW1hZ2VzID0gZXhlY3V0aW9uX2dyYXBocztcbiAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob25saW5lX3NlYXJjaF90ZXJtcyAmJiBBcnJheS5pc0FycmF5KG9ubGluZV9zZWFyY2hfdGVybXMpKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdPbmxpbmUgU2VhcmNoIFRlcm1zOicsIG9ubGluZV9zZWFyY2hfdGVybXMpO1xuICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRlcm1zID0gb25saW5lX3NlYXJjaF90ZXJtcztcbiAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAvLyBQcm9jZXNzIG9ubGluZSBzZWFyY2ggdGVybXMgYXMgbmVlZGVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbnMgJiYgQXJyYXkuaXNBcnJheShzdWdnZXN0aW9ucykpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1Z2dlc3Rpb25zOicsIHN1Z2dlc3Rpb25zKTtcbiAgICAgICAgICAgICAgdGhpcy5yZWxhdGVkTGlzdEl0ZW1zID0gc3VnZ2VzdGlvbnM7XG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgLy8gUHJvY2VzcyBvbmxpbmUgc2VhcmNoIHRlcm1zIGFzIG5lZWRlZFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgYW55IG90aGVyIGZpZWxkcyBhbmQgdGhlaXIgcHJvY2Vzc2luZyBoZXJlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignT3RoZXJGaWVsZHMgaXMgbWlzc2luZyBpbiB0aGUgcmVzcG9uc2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmV2ZW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gZmV0Y2hpbmcgZGF0YSBmcm9tIHNvY2tldCcsIGVycik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBpbml0aWFsaXplU29ja2V0QW5kTGlzdGVuKCkge1xuXG4gIH1cbiAgaGFuZGxlRXZlbnQoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3dlYnJlc3VsdCc6XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbnN3ZXInOlxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZ3JhcGgnOlxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV2ZW50U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmV2ZW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIC8vdGhpcy5zb2NrZXRTZXJ2aWNlLmNsb3NlKCk7XG4gIH1cbiAgY2hhbmdlVGVtcGVyYXR1cmUobmV3VGVtcGVyYXR1cmU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmxvYWRpbmcpIHJldHVybjtcbiAgICB0aGlzLnRlbXBlcmF0dXJlID0gbmV3VGVtcGVyYXR1cmU7XG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaXZlZ3B0LWNoYXQtd3JhcHBlcicpXG4gICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHRoZW1lIGNsYXNzZXMgZnJvbSBib2R5XG4gICAgd3JhcHBlcj8uY2xhc3NMaXN0LnJlbW92ZSgnY3JlYXRpdmUnLCAnYmFsYW5jZWQnLCAncHJlY2lzZScpO1xuXG4gICAgc3dpdGNoIChuZXdUZW1wZXJhdHVyZSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB3cmFwcGVyPy5jbGFzc0xpc3QuYWRkKCdjcmVhdGl2ZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgd3JhcHBlcj8uY2xhc3NMaXN0LmFkZCgnYmFsYW5jZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHdyYXBwZXI/LmNsYXNzTGlzdC5hZGQoJ3ByZWNpc2UnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvblN0YXJ0QWdhaW4oKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xuICAgIHRoaXMuc2hvd1N0YXJ0QWdhaW4gPSBmYWxzZTtcbiAgICB0aGlzLmNoYXRMb2cgPSBbXTtcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICB0eXBlOiAnYWknLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgdGhpcy5ncmVldGluZ01zZyB8fFxuICAgICAgICB0aGlzLnByb2Nlc3NNZXNzYWdlKFxuICAgICAgICAgIFwiR3JlZXRpbmdzISBJJ20geW91ciBDT1AyOCB2aXJ0dWFsIGFzc2lzdGFudC4gSGF2ZSBxdWVzdGlvbnMgYWJvdXQgdGhlIGV2ZW50PyBJJ20gaGVyZSB0byBoZWxwLlwiXG4gICAgICAgICksXG4gICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgfSk7XG4gICAgdGhpcy5hcmNoaWV2ZU1lc3NhZ2VzKCkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhcmNoaWV2ZU1lc3NhZ2VzKCkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICB9KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9ib3QvY2xlYXItaGlzdG9yeS8ke3RoaXMuYm90SWR9LyR7dGhpcy51c2VySWR9YDtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodXJsLCB7fSwgeyBoZWFkZXJzIH0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBvZihyZXMpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBmZXRjaEJvdENvbmZpZygpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2JvdHM/Ym90X2lkPSR7dGhpcy5ib3RJZH1gO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5ib3ROYW1lID0gcmVzLk5hbWU7XG4gICAgICAgIHRoaXMuYm90SWNvbiA9IHJlcy5JY29uO1xuICAgICAgICB0aGlzLmJvdFNraWxscyA9IHJlcz8uU2tpbGxzO1xuICAgICAgICB0aGlzLmdyZWV0aW5nTXNnID0gcmVzLkdyZWV0aW5nO1xuXG4gICAgICAgIHRoaXMudGh1bWJzRG93bk1lc3NhZ2VzID0gcmVzPy5OZWdhdGl2ZVJlc3BvbnNlcz8ubGVuZ3RoXG4gICAgICAgICAgPyByZXMuTmVnYXRpdmVSZXNwb25zZXNcbiAgICAgICAgICA6IFtcbiAgICAgICAgICAgIFwiV2UgYXJlIHNvcnJ5IHdlJ3ZlIG5vdCBiZWVuIGFibGUgdG8gYW5zd2VyIHlvdXIgcXVlc3Rpb24uPGJyLz4gSG93ZXZlciwgb3VyIGRlZGljYXRlZCBzdXBwb3J0IHRlYW0gaXMgaGFwcHkgdG8gaGVscC4gPHNwYW4gY2xhc3M9J2ZlZWRiYWNrLWxpbmsnIHN0eWxlPSdjdXJzb3I6IHBvaW50ZXI7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogIzE3MjM1QjsnPlBsZWFzZSBjbGljayBoZXJlPC9zcGFuPiBhbmQgYSBodW1hbiBhZ2VudCB3aWxsIGFzc2lzdCB5b3UgYXMgc29vbiBhcyBwb3NzaWJsZVwiLFxuICAgICAgICAgIF07XG4gICAgICAgIHRoaXMucXVpY2tQcm9tcHRzID0gcmVzLlF1aWNrUHJvbXB0cztcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gb2YocmVzKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdGJvdCBjb25maWc6ICcsIGVycm9yKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoQ2hhdEhpc3RvcnkoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY29udmVyc2F0aW9uS2V5ID0gdGhpcy5jb252ZXJzYXRpb24uZ2V0S2V5KHRoaXMuYm90SWQpO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbktleX1gO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ2FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IGhlYWRlcnMgfSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcjxhbnk+KCdmZXRjaENvbnZlcnNhdGlvbicpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yPFQ+KG9wZXJhdGlvbiA9ICdvcGVyYXRpb24nLCByZXN1bHQ/OiBUKSB7XG4gICAgcmV0dXJuIChlcnJvcjogYW55KTogT2JzZXJ2YWJsZTxUPiA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gb2YocmVzdWx0IGFzIFQpO1xuICAgIH07XG4gIH1cbiAgLy8gZmV0Y2hDaGF0SGlzdG9yeSgpIHtcbiAgLy8gICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAvLyAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAvLyAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgLy8gICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgLy8gICB9KTtcbiAgLy8gICByZXR1cm4gdGhpcy5odHRwXG4gIC8vICAgICAuZ2V0KGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbktleX1gLCB7IGhlYWRlcnMgfSlcbiAgLy8gICAgIC5waXBlKFxuICAvLyAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIC8vICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gIC8vICAgICAgIH0pLFxuICAvLyAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XG4gIC8vICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5OiAnLCBlcnJvcik7XG4gIC8vICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIC8vICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAvLyAgICAgICB9KVxuICAvLyAgICAgKTtcbiAgLy8gfVxuXG4gIG1hcENoYXRIaXN0b3J5KGNoYXRzOiBhbnkpIHtcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICB0eXBlOiAnYWknLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgdGhpcy5ncmVldGluZ01zZyB8fFxuICAgICAgICB0aGlzLnByb2Nlc3NNZXNzYWdlKFxuICAgICAgICAgIFwiR3JlZXRpbmdzISBJJ20geW91ciBDT1AyOCB2aXJ0dWFsIGFzc2lzdGFudC4gSGF2ZSBxdWVzdGlvbnMgYWJvdXQgdGhlIGV2ZW50PyBJJ20gaGVyZSB0byBoZWxwLlwiXG4gICAgICAgICksXG4gICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgfSk7XG4gICAgaWYgKGNoYXRzICYmIGNoYXRzPy5NZXNzYWdlcz8ubGVuZ3RoKSB7XG4gICAgICBjaGF0cz8uTWVzc2FnZXMuZm9yRWFjaCgoY2hhdDogYW55KSA9PiB7XG4gICAgICAgIGlmIChjaGF0LlR5cGUgPT0gXCJ1c2VyXCIpIHtcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAndXNlcicsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShjaGF0LlRleHQpLFxuICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXG4gICAgICAgICAgICBjb3BpZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGF0LlR5cGUgPT0gXCJhaVwiKSB7XG4gICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGNoYXQuVGV4dCksXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXRUaW1lU3RhbXBzKHRoaXMudGltZXpvbmUsIGNoYXQuSW5zZXJ0VGltZXN0YW1wKSxcbiAgICAgICAgICAgIGNvcGllZDogZmFsc2UsXG4gICAgICAgICAgICBpc0NvbGxhcHNlZFRydWU6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zaG93U3RhcnRBZ2FpbiA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb2Nlc3NNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgIShtZXNzYWdlPy5sZW5ndGggPiAwKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKCdoZXJlIGlzIG15IG1lc3NhZ2UnKVxuICAgIC8vIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UudHJpbSgpO1xuXG4gICAgY29uc3QgbWFya2Rvd25MaW5rUmVnZXggPSAvXFxbKFteW10rKV1cXCgoW14pXSspXFwpL2c7XG4gICAgY29uc3QgdXJsUmVnZXggPSAvKD88IWhyZWY9XCIpXFxiaHR0cHM/OlxcL1xcL1xcUysoPzwhWy4sXSkvZ2k7XG5cbiAgICBpZiAobWFya2Rvd25MaW5rUmVnZXgudGVzdChtZXNzYWdlKSkge1xuICAgICAgY29uc3QgaHRtbCA9IG1lc3NhZ2UucmVwbGFjZShcbiAgICAgICAgbWFya2Rvd25MaW5rUmVnZXgsXG4gICAgICAgICc8YSBocmVmPVwiJDJcIiB0YXJnZXQ9XCJfYmxhbmtcIj4kMTwvYT4nXG4gICAgICApO1xuICAgICAgLy9jb25zb2xlLmxvZygnU2FuaXRpemVkIG1lc3NhZ2U6ICcsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVIdG1sKGh0bWwpO1xuICAgIH1cblxuICAgIGlmICh1cmxSZWdleC50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICBjb25zdCBodG1sID0gbWVzc2FnZS5yZXBsYWNlKFxuICAgICAgICB1cmxSZWdleCxcbiAgICAgICAgJzxhIGhyZWY9XCIkJlwiIHRhcmdldD1cIl9ibGFua1wiPiQmPC9hPidcbiAgICAgICk7XG4gICAgICAvLyBjb25zb2xlLmxvZygnU2FuaXRpemVkIG1lc3NhZ2U6ICcsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVIdG1sKGh0bWwpO1xuICAgIH1cblxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoLyg/OlxcclxcbnxcXHJ8XFxuKS9nLCAnPGJyPicpO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXFwqXFwqKC4qPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKTtcbiAgICAvLyBDb252ZXJ0IE1hcmtkb3duIGhlYWRlcnMgdG8gSFRNTCBoZWFkZXJzXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXigjezEsNn0pXFxzKyguKikkL2dtLCAobWF0Y2gsIGhhc2hlcywgdGV4dCkgPT4ge1xuICAgICAgY29uc3QgbGV2ZWwgPSBoYXNoZXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIGA8aCR7bGV2ZWx9PiR7dGV4dH08L2gke2xldmVsfT5gO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgY29uc3Qgc2FuaXRpemVkTWVzc2FnZSA9IHRoaXMuc2FuaXRpemVIdG1sKG1lc3NhZ2UpO1xuICAgIHJldHVybiBzYW5pdGl6ZWRNZXNzYWdlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIGNvbnN0IGZlZWRiYWNrTGlua3MgPVxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZlZWRiYWNrLWxpbmsnKTtcbiAgICBmZWVkYmFja0xpbmtzLmZvckVhY2goKGxpbms6IGFueSkgPT4ge1xuICAgICAgbGluay5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnY2xpY2snLFxuICAgICAgICB0aGlzLm9uRmVlZGJhY2tDbGljay5iaW5kKHRoaXMsICd6ZW5kZXNrJylcbiAgICAgICk7XG4gICAgfSk7XG4gICAgLy8gaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mZWVkYmFjay1saW5rJykpIHtcbiAgICAvLyAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XG4gICAgLy8gICAgIC5xdWVyeVNlbGVjdG9yKCcuZmVlZGJhY2stbGluaycpXG4gICAgLy8gICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25GZWVkYmFja0NsaWNrLmJpbmQodGhpcywgJ3plbmRlc2snKSk7XG4gICAgLy8gfVxuICB9XG5cbiAgc2FuaXRpemVIdG1sKGh0bWw6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoaHRtbCk7XG4gIH1cblxuICBvbkZlZWRiYWNrQ2xpY2sodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZmVlZGJhY2tFdmVudC5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCB0aGlzLmJvZHlPdmVyZmxvd0NsYXNzKTtcbiAgICB0aGlzLm9uQ2xvc2VFdmVudC5lbWl0KCk7XG4gIH1cblxuICBzZW5kTWVzc2FnZVdpdGhUaWxlKHByb21wdDogc3RyaW5nKSB7XG4gICAgdGhpcy5pbnB1dCA9IHByb21wdDtcbiAgICB0aGlzLmZldGNoRGF0YSgpO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgfVxuICBpc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgZmV0Y2hEYXRhKCkge1xuICAgIHRoaXMuaW5wdXQgPSB0aGlzLmlucHV0Py50cmltKCk7XG4gICAgaWYgKCF0aGlzLmlucHV0IHx8IHRoaXMubG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgIHR5cGU6ICd1c2VyJyxcbiAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KHRoaXMuaW5wdXQpLFxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2VcbiAgICB9KTtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdGhpcy5haVJlc3BvbnNlID0gJyc7XG4gICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSB0cnVlO1xuXG4gICAgY29uc3QgdXJsID1cbiAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2FpL2Fza2AvLyArXG4gICAgLy8gKHRoaXMudXNlT3BlbkFpID09PSBmYWxzZSA/ICcvbGxtLWhmJyA6ICcnKTtcbiAgICBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB1c2VyX3F1ZXN0aW9uOiB0aGlzLmlucHV0LFxuICAgICAgICB1c2VyX2lkOiB0aGlzLnVzZXJJZCxcbiAgICAgICAgYm90X2lkOiB0aGlzLmJvdElkLFxuICAgICAgICAvLyB0ZW1wZXJhdHVyZTogdGhpcy50ZW1wZXJhdHVyZSxcbiAgICAgICAgLy8gIGV2ZW50X2lkOiB0aGlzLmV2ZW50SWQsXG4gICAgICAgIC8vIHRva2VuOiB0aGlzLnMyN1VzZXJUb2tlbixcbiAgICAgICAgYWdlbnRzOiB0aGlzLmFnZW50cy5maWx0ZXIocCA9PiBwLnNlbGVjdGVkKS5tYXAocCA9PiBwLmlkKSxcbiAgICAgICAgY29udmVyc2F0aW9uX2lkOiB0aGlzLmNvbnZlcnNhdGlvbktleVxuICAgICAgfSksXG4gICAgfSlcbiAgICAgIC8vIFJldHJpZXZlIGl0cyBib2R5IGFzIFJlYWRhYmxlU3RyZWFtXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgLy9yZXR1cm4gdGhpcy5yZWFkQWxsQ2h1bmtzKHJlc3BvbnNlLmJvZHkpOyAgICAgICAgXG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnI6ICcsIGVycik7XG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgIHRoaXMuaW5wdXQgPSAnJztcbiAgfVxuICBmZXRjaERhdGFGb3IobXNnKSB7XG4gICAgY29uc3QgaW5wdXRNc2cgPSBtc2c/LnRyaW0oKTtcbiAgICBpZiAoIWlucHV0TXNnIHx8IHRoaXMubG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgdHlwZTogJ3VzZXInLFxuICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoaW5wdXRNc2cpLFxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2VcbiAgICB9KTtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdGhpcy5haVJlc3BvbnNlID0gJyc7XG4gICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSB0cnVlO1xuXG4gICAgY29uc3QgdXJsID1cbiAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2FpL2Fza2AvLyArXG4gICAgLy8gKHRoaXMudXNlT3BlbkFpID09PSBmYWxzZSA/ICcvbGxtLWhmJyA6ICcnKTtcbiAgICBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB1c2VyX3F1ZXN0aW9uOiBpbnB1dE1zZyxcbiAgICAgICAgdXNlcl9pZDogdGhpcy51c2VySWQsXG4gICAgICAgIGJvdF9pZDogdGhpcy5ib3RJZCxcbiAgICAgICAgLy8gdGVtcGVyYXR1cmU6IHRoaXMudGVtcGVyYXR1cmUsXG4gICAgICAgIC8vICBldmVudF9pZDogdGhpcy5ldmVudElkLFxuICAgICAgICAvLyB0b2tlbjogdGhpcy5zMjdVc2VyVG9rZW4sXG4gICAgICAgIGFnZW50czogdGhpcy5hZ2VudHMuZmlsdGVyKHAgPT4gcC5zZWxlY3RlZCkubWFwKHAgPT4gcC5pZCksXG4gICAgICAgIGNvbnZlcnNhdGlvbl9pZDogdGhpcy5jb252ZXJzYXRpb25LZXlcbiAgICAgIH0pLFxuICAgIH0pXG4gICAgICAvLyBSZXRyaWV2ZSBpdHMgYm9keSBhcyBSZWFkYWJsZVN0cmVhbVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRBbGxDaHVua3MocmVzcG9uc2UuYm9keSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyOiAnLCBlcnIpO1xuICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmlucHV0ID0gJyc7XG4gIH1cbiAgZmV0Y2hTbWFsbFRhbGsoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2JvdC9zbWFsbC10YWxrLyR7dGhpcy5ib3RJZH0vJHt0aGlzLnVzZXJJZH1gO1xuXG4gICAgdGhpcy5odHRwXG4gICAgICAuZ2V0PHsgc21hbGxUYWxrOiBzdHJpbmcgfT4odXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgZmV0Y2hpbmcgc21hbGwgdGFsazonLCBlcnJvcik7XG5cbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zbWFsbFRhbGspIHtcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYWknLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZShyZXNwb25zZS5zbWFsbFRhbGspLFxuICAgICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgICAgICAgaXNGZWVkYmFja01zZzogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMjtcbiAgICAgICAgICAvLyB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcmVhZEFsbENodW5rcyA9IChzdHJlYW06IGFueSkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICBjb25zdCBhbGxTdWdnZXN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIHJlYWRlci5jbG9zZWQuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlYWRpbmcgc3RyZWFtOiAnLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICBzdGFydDogKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVtcChjb250cm9sbGVyLCByZWFkZXIsIGFsbFN1Z2dlc3Rpb25zKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgcHVtcChjb250cm9sbGVyOiBhbnksIHJlYWRlcjogYW55LCBhbGxTdWdnZXN0aW9uczogc3RyaW5nW10pIHtcbiAgICByZWFkZXIucmVhZCgpLnRoZW4oKHsgZG9uZSwgdmFsdWUgfTogYW55KSA9PiB7XG4gICAgICBjb25zdCBsYXN0SXRlbSA9IHRoaXMuY2hhdExvZ1t0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGxhc3RJdGVtLm1lc3NhZ2UgPSB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShsYXN0SXRlbS5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5jaGF0TG9nLnBvcCgpO1xuICAgICAgICB0aGlzLmNoYXRMb2cucHVzaChsYXN0SXRlbSk7XG4gICAgICAgIGlmIChhbGxTdWdnZXN0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ3N1Z2dlc3Rpb25zJyxcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBhbGxTdWdnZXN0aW9uc1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICAgIC8vIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuc2hvd1N0YXJ0QWdhaW4gPSB0cnVlO1xuXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyAgIHRoaXMuZmV0Y2hTbWFsbFRhbGsoKTtcbiAgICAgICAgLy8gfSwxMDAwKVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBkZWNvZGVkQ2h1bmsgPSB0aGlzLmRlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICAgIHRoaXMuYWlSZXNwb25zZSArPSBkZWNvZGVkQ2h1bms7XG4gICAgICBpZiAobGFzdEl0ZW0udHlwZSA9PT0gJ2FpJykge1xuICAgICAgICBjb25zdCBzdWdnZXN0aW9uc01hdGNoID0gdGhpcy5haVJlc3BvbnNlLm1hdGNoKC88c3VnPiguKj8pPFxcL3N1Zz4vZyk7XG4gICAgICAgIGlmIChzdWdnZXN0aW9uc01hdGNoKSB7XG4gICAgICAgICAgc3VnZ2VzdGlvbnNNYXRjaC5mb3JFYWNoKChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5haVJlc3BvbnNlID0gdGhpcy5haVJlc3BvbnNlLnJlcGxhY2UobWF0Y2gsIFwiXCIpO1xuICAgICAgICAgICAgYWxsU3VnZ2VzdGlvbnMucHVzaChtYXRjaD8ucmVwbGFjZSgvPFxcLz9zdWc+L2csIFwiXCIpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RJdGVtLm1lc3NhZ2UgPSB0aGlzLmFpUmVzcG9uc2U7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcblxuICAgICAgICBsZXQgYWlGb3JtYXR0ZWREYXRhOiBhbnk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygncGFyc2luZyBqc29uICcpXG4gICAgICAgICAgYWlGb3JtYXR0ZWREYXRhID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKHRoaXMuYWlSZXNwb25zZSkpXG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3BhcnNpbmcganNvbiAyJylcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YSA9IEpTT04ucGFyc2UodGhpcy5haVJlc3BvbnNlKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ3BhcnNpbmcganNvbiBkb25lJylcblxuICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhICYmIGFpRm9ybWF0dGVkRGF0YT8uc2VjdGlvbl9pZD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSAnY29tcGFueV9zZWFyY2gnIHx8IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09ICd1c2VyX3NlYXJjaCcgfHwgYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gJ2luZHVzdHJ5X2NvbXBhbnlfc2VhcmNoJykge1xuICAgICAgICAgICAgdGhpcy5mZXRjaE15Q29ubmVjdGlvbnMoKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hQZW5kaW5nUmVxdWVzdHMoKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gdGhpcy5teVVwY29taW5nU2Vzc2lvbkFjdGlvbikge1xuICAgICAgICAgICAgdmFyIHNwZWFrZXJJZHMgPSBbXTtcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5jb250ZW50Py5mb3JFYWNoKHNlc3Npb24gPT4ge1xuICAgICAgICAgICAgICBzcGVha2VySWRzID0gWy4uLnNwZWFrZXJJZHMsIC4uLnNlc3Npb24uc3BlYWtlcnNdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHNwZWFrZXJJZHM/Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgIHRoaXMuZ2V0U3BlYWtlcnNCeVN0YWZmSWRzKHNwZWFrZXJJZHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSB0aGlzLmFkZFRvTXlBZ2VuZGFBY3Rpb24gJiYgYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub3BlblBhZ2UubmV4dCh7XG4gICAgICAgICAgICAgIHNlY3Rpb25JZDogYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQsXG4gICAgICAgICAgICAgIHNlc3Npb25JZHM6IGFpRm9ybWF0dGVkRGF0YS5jb250ZW50XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSB0aGlzLmNvbm5lY3RPckZvbGxvd0FjdGlvbikge1xuICAgICAgICAgICAgbGV0IHVzZXJzTGVuID0gYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQ/Lmxlbmd0aDtcbiAgICAgICAgICAgIGlmICh1c2Vyc0xlbiA+IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5vcGVuUGFnZS5uZXh0KHtcbiAgICAgICAgICAgICAgICBzZWN0aW9uSWQ6IFwib3Blbl9uZXR3b3JraW5nX2RyYXdlclwiLFxuICAgICAgICAgICAgICAgIHNlYXJjaDogYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnRcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHVzZXJzTGVuID09IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5vcGVuUGFnZS5uZXh0KHtcbiAgICAgICAgICAgICAgICBzZWN0aW9uSWQ6IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkLFxuICAgICAgICAgICAgICAgIGNvbm5ldFVzZXJJZHM6IFthaUZvcm1hdHRlZERhdGEuY29udGVudFswXS51c2VySWRdXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YS5pc19vcGVuX3BhZ2UgPT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3BlblBhZ2UubmV4dCh7XG4gICAgICAgICAgICAgIHNlY3Rpb25JZDogYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQsXG4gICAgICAgICAgICAgIHNlYXJjaDogYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZUJyb3dzZXIoKSkge1xuICAgICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEubWVzc2FnZSArPSBcIlxcblxcblwiICsgJzxhIGlkPVwiY2xvc2VCb3ROb3dcIj5DbGljayBIZXJlPC9hPiB0byBzZWUgcmVzdWx0cy4nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG5cblxuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgICAgICBtZXNzYWdlOiBhaUZvcm1hdHRlZERhdGEubWVzc2FnZSxcbiAgICAgICAgICAgIGFjdGlvbjogYWlGb3JtYXR0ZWREYXRhLFxuICAgICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZUJyb3dzZXIoKSkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkQ2xvc2VCb3RDbGlja0V2ZW50KCk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuYWlSZXNwb25zZSA9IFwiXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuYWlSZXNwb25zZSxcbiAgICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuXG4gICAgICAvLyBFbnF1ZXVlIHRoZSBuZXh0IGRhdGEgY2h1bmsgaW50byBvdXIgdGFyZ2V0IHN0cmVhbVxuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHZhbHVlKTtcbiAgICAgIHRoaXMucHVtcChjb250cm9sbGVyLCByZWFkZXIsIGFsbFN1Z2dlc3Rpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN1Ym1pdEZlZWRiYWNrKGZsYWc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmZlZWRiYWNrRG9uZSA9IHRydWU7XG4gICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gbnVsbDtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9ib3QvZmVlZGJhY2tgO1xuICAgIGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGZsYWcsIHVzZXJfaWQ6IHRoaXMudXNlcklkLCBib3RfaWQ6IHRoaXMuYm90SWQgfSksXG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICBpZiAoZmxhZykge1xuICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgdGhpcy50aHVtYnNVcE1lc3NhZ2UgfHxcbiAgICAgICAgICAgIGBHcmVhdC4gTWF5IEkgYXNzaXN0IHlvdSB3aXRoIGFueXRoaW5nIGVsc2U/YCxcbiAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgICAgaXNGZWVkYmFja01zZzogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5mZWVkYmFja0RvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2UoXG4gICAgICAgICAgdGhpcy50aHVtYnNEb3duTWVzc2FnZXNbdGhpcy50aHVtYnNEb3duTXNnSW5kZXhdXG4gICAgICAgICksXG4gICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgICAgaXNGZWVkYmFja01zZzogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy50aHVtYnNEb3duTXNnSW5kZXggPVxuICAgICAgICAodGhpcy50aHVtYnNEb3duTXNnSW5kZXggKyAxKSAlIHRoaXMudGh1bWJzRG93bk1lc3NhZ2VzLmxlbmd0aDtcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5mZWVkYmFja0RvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IG51bGw7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWJtaXQoKSB7XG4gICAgdGhpcy5mZXRjaERhdGEoKTtcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gIH1cblxuICBoYW5kbGVVcENsaWNrKGlkeDogYW55KSB7XG4gICAgaWYgKHRoaXMuZmVlZGJhY2tEb25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdWJtaXRGZWVkYmFjayh0cnVlKTtcbiAgICB0aGlzLmNoYXRMb2dbaWR4XS5saWtlZCA9ICF0aGlzLmNoYXRMb2dbaWR4XS5saWtlZDtcblxuICAgIGlmICh0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkKSB7XG4gICAgICB0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkID0gIXRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBoYW5kbGVEb3duQ2xpY2soaWR4OiBhbnkpIHtcbiAgICBpZiAodGhpcy5mZWVkYmFja0RvbmUpIHJldHVybjtcbiAgICB0aGlzLnN1Ym1pdEZlZWRiYWNrKGZhbHNlKTtcbiAgICB0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkID0gIXRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQ7XG4gICAgaWYgKHRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkKVxuICAgICAgdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQgPSAhdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQ7XG4gIH1cbiAgaGFuZGxlQ29weUNsaWNrKGluZGV4OiBhbnkpIHtcbiAgICAvLyBDb3B5IHRoZSBtZXNzYWdlIHRvIHRoZSBjbGlwYm9hcmRcbiAgICBjb25zdCBjb250ZW50VG9Db3B5ID0gdGhpcy5jaGF0TG9nW2luZGV4XS5tZXNzYWdlO1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbnRlbnRUb0NvcHkpLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgbWVzc2FnZSB3YXMgY29waWVkXG4gICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IHRydWU7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAvLyBSZXNldCB0aGUgY29waWVkIHN0YXRlIGFmdGVyIGEgZGVsYXlcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LCAyMDAwKTsgLy8gUmVzZXQgYWZ0ZXIgMiBzZWNvbmRzXG4gICAgfSk7XG4gIH1cblxuICBzY3JvbGxUb0JvdHRvbSgpIHtcbiAgICBsZXQgY291bnRlciA9IDA7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmNoYXRNYWluLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cbiAgICAgICAgdGhpcy5jaGF0TWFpbi5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIGlmIChjb3VudGVyKysgPiA1KSBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICB9LCA1KTtcbiAgfVxuXG4gIGhhbmRsZUFjdGlvbihhY3Rpb246IGFueSkge1xuICAgIGNvbnNvbGUuaW5mbyhcImluY29taW5nIGFjdGlvbiBmcm9tIHRoZSBjaGF0Ym90IEFJXCIpXG4gICAgY29uc29sZS5pbmZvKGFjdGlvbilcblxuICAgIGlmIChhY3Rpb24/LmNvbnRlbnQpIHtcblxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZHJhd2VyIGlzIGluaXRpYWxseSBvcGVuIGFuZCBhcHBseSBvdmVyZmxvdyBoaWRkZW4gdG8gYm9keSBpZiBzb1xuICAgIGlmICh0aGlzLmRyYXdlci5vcGVuZWQpIHtcbiAgICAgIHRoaXMuc2V0Qm9keU92ZXJmbG93KCk7XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIHRvIGNoYW5nZXMgaW4gdGhlIGRyYXdlciBiZWluZyBvcGVuZWQgb3IgY2xvc2VkXG4gICAgdGhpcy5kcmF3ZXIub3BlbmVkQ2hhbmdlLnN1YnNjcmliZSgob3BlbmVkOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAob3BlbmVkKSB7XG4gICAgICAgIHRoaXMuc2V0Qm9keU92ZXJmbG93KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUJvZHlPdmVyZmxvdygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5kcmF3ZXIub3BlbmVkQ2hhbmdlLnN1YnNjcmliZSgob3BlbmVkKSA9PiB7XG4gICAgICBpZiAob3BlbmVkKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm15VGV4dGFyZWEgJiYgdGhpcy5teVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMubXlUZXh0YXJlYS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7IC8vIEZvY3VzIG9uIHRoZSB0ZXh0YXJlYVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEJvZHlPdmVyZmxvdygpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVCb2R5T3ZlcmZsb3coKSB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCB0aGlzLmJvZHlPdmVyZmxvd0NsYXNzKTtcbiAgfVxuXG4gIGdldFNwZWFrZXJzQnlTdGFmZklkcyhpZHMpIHtcbiAgICBjb25zdCB1cmwgPVxuICAgICAgYCR7dGhpcy5lbnZpcm9ubWVudC5VU0VSU19BUEl9L2V2ZW50cy8ke3RoaXMuZXZlbnRJZH0vdXNlcnMvZ2V0LWJ5LXN0YWZmLWlkc2BcbiAgICBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IFwiQmVhcmVyIFwiICsgXCJ5b3VyX3Rva2VuX2hlcmVcIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpLFxuICAgIH0pXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTsgLy8gUGFyc2UgdGhlIEpTT04gYm9keSBvZiB0aGUgcmVzcG9uc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvay4nKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChkYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZGF0YS5mb3JFYWNoKHNwZWFrZXIgPT4ge1xuICAgICAgICAgICAgdGhpcy5zcGVha2Vyc1tzcGVha2VyLmlkXSA9IHNwZWFrZXI7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGRhdGE6JywgZXJyKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgfVxuXG4gIHBlcmZvcm1TZXNzaW9uQWN0aW9uKHNlc3Npb25JZCwgYWN0aW9uKSB7XG4gICAgdGhpcy5zZXNzaW9uQWN0aW9ucy5uZXh0KHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIGFjdGlvblxuICAgIH0pO1xuICB9XG5cbiAgYWRkQ2xvc2VCb3RDbGlja0V2ZW50KCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY2xvc2VCb3ROb3cnKTtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlQm90Lm5leHQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzTW9iaWxlQnJvd3NlcigpIHtcbiAgICByZXR1cm4gL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG5cbiAgY29ubmVjdFRvVXNlcih1c2VySWQpIHtcbiAgICB0aGlzLmNvbm5lY3RXaXRoVXNlci5lbWl0KHtcbiAgICAgIGNvbm5lY3Q6ICF0aGlzLmNhbkRpc2Nvbm5lY3QodXNlcklkKSxcbiAgICAgIHVzZXJJZFxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZldGNoTXlDb25uZWN0aW9ucygpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5mZXRjaFBlbmRpbmdSZXF1ZXN0cygpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICBzY2hlZHVsZU1lZXRpbmdXaXRoVXNlcih1c2VyKSB7XG4gICAgdGhpcy5zY2hlZHVsZU1lZXRpbmcuZW1pdCh1c2VyKTtcbiAgfVxuXG4gIGNhbkNvbm5lY3QodXNlcklkKSB7XG4gICAgcmV0dXJuICEodGhpcy5jYW5EaXNjb25uZWN0KHVzZXJJZCkgfHwgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZmluZChhID0+IGEgPT0gdXNlcklkKSlcbiAgfVxuXG4gIGNhbkRpc2Nvbm5lY3QodXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMubXlDb25uZWN0aW9ucy5maW5kKGNvbm4gPT4gY29ubi51c2VySWQgPT0gdXNlcklkKVxuICB9XG5cbiAgZmV0Y2hQZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ2FwaUtleSc6IHRoaXMuYXV0b2dlbktleVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQoXG4gICAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuVVNFUlNfQVBJfS9ldmVudHMvJHt0aGlzLmV2ZW50SWR9L2Nvbm5lY3Rpb24tcmVxdWVzdHMvYXV0b2dlbi9wZW5kaW5nLXNlbnQtcmVxdWVzdHM/dXNlcklkPSR7dGhpcy51c2VySWR9YCxcbiAgICAgICAgeyBoZWFkZXJzIH1cbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSByZXM7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcGVuZGluZyByZXF1ZXN0czogJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBmZXRjaE15Q29ubmVjdGlvbnMoKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ2FwaUtleSc6IHRoaXMuYXV0b2dlbktleVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQoXG4gICAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuVVNFUlNfQVBJfS9ldmVudHMvJHt0aGlzLmV2ZW50SWR9L3VzZXJzLWNvbm5lY3Rpb25zL2F1dG9nZW4/dXNlcklkPSR7dGhpcy51c2VySWR9YCxcbiAgICAgICAgeyBoZWFkZXJzIH1cbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5teUNvbm5lY3Rpb25zID0gcmVzO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHJldHVybiBvZihyZXMpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHBlbmRpbmcgcmVxdWVzdHM6ICcsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cblxuICBpc0Ryb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBhZ2VudHM6IGFueTtcbiAgc2VsZWN0ZWRBZ2VudHMgPSBbXTtcbiAgYWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgLy8gVG9nZ2xlIHRoZSBkcm9wZG93biB2aXNpYmlsaXR5XG4gIHRvZ2dsZURyb3Bkb3duKCkge1xuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0Ryb3Bkb3duT3BlbjtcbiAgfVxuXG4gIG9uU2VsZWN0QWxsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuXG4gICAgdGhpcy5hZ2VudHM/LmZvckVhY2goYWdlbnQgPT4gYWdlbnQuc2VsZWN0ZWQgPSBmYWxzZSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gIH1cblxuICBvbkFnZW50Q2hhbmdlKGFnZW50OiBhbnkpOiB2b2lkIHtcbiAgICAvL2FnZW50LnNlbGVjdGVkID0gIWFnZW50LnNlbGVjdGVkO1xuICAgIC8vY29uc29sZS5sb2coYWdlbnQpO1xuICAgIGxldCBhZ2VudEZvdW5kID0gdGhpcy5hZ2VudHMuZmlsdGVyKHAgPT4gcC5pZCA9PSBhZ2VudC5pZCk7XG4gICAgaWYgKGFnZW50Rm91bmQgJiYgYWdlbnRGb3VuZC5sZW5ndGggPiAwKSB7XG4gICAgICBhZ2VudEZvdW5kWzBdLnNlbGVjdGVkID0gIWFnZW50Rm91bmRbMF0uc2VsZWN0ZWQ7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGFyZUFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFnZW50cz8uZXZlcnkoYWdlbnQgPT4gIWFnZW50LnNlbGVjdGVkKTtcbiAgfVxuXG4gIGdldERyb3Bkb3duSGVhZGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlbGVjdGVkQWdlbnRzID0gdGhpcy5hZ2VudHM/LmZpbHRlcihhZ2VudCA9PiBhZ2VudC5zZWxlY3RlZCk7XG4gICAgaWYgKHNlbGVjdGVkQWdlbnRzICYmIHNlbGVjdGVkQWdlbnRzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnQWxsIEFnZW50cyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWxlY3RlZEFnZW50cz8ubGVuZ3RoID4gMSA/IGAke3NlbGVjdGVkQWdlbnRzPy5sZW5ndGh9IEFnZW50cyBTZWxlY3RlZGAgOiBgJHtzZWxlY3RlZEFnZW50cz8ubGVuZ3RofSBBZ2VudCBTZWxlY3RlZGA7XG4gICAgfVxuICB9XG4gIGZldGNoQWdlbnRzX2h0dHAoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkFHRU5UU19BUEl9L0NvUGlsb3QvJHt0aGlzLmJvdElkfS9hY3RpdmUtYWdlbnRzYDtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIHt9LCB7IGhlYWRlcnMgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIHRoaXMuYWdlbnRzID0gcmVzLm1hcChhZ2VudCA9PiAoe1xuICAgICAgICAgICAgLi4uYWdlbnQsXG4gICAgICAgICAgICBzZWxlY3RlZDogZmFsc2VcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNoYXRib3QgY29uZmlnOiAnLCBlcnJvcik7XG5cbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cblxuICBmZXRjaEFnZW50cygpIHtcbiAgICB0aGlzLmZldGNoQWdlbnRzX2h0dHAoKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cblxuXG4gIC8vIGV2ZW50cy8ke2V2ZW50SWR9L3VzZXJzLWNvbm5lY3Rpb25zXG4gIHByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShtYXJrZG93bjogc3RyaW5nKTogU2FmZUh0bWwge1xuICAgIGlmICghbWFya2Rvd24gfHwgIShtYXJrZG93bi5sZW5ndGggPiAwKSkge1xuICAgICAgY29uc29sZS5lcnJvcignSW5wdXQgTWFya2Rvd24gaXMgbnVsbCBvciBlbXB0eScpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vY29uc29sZS5sb2coJ01hcmtkb3duIGlucHV0OicsIG1hcmtkb3duKTtcblxuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gaGVhZGVycyB0byBIVE1MIGhlYWRlcnNcbiAgICBsZXQgaHRtbCA9IG1hcmtkb3duLnJlcGxhY2UoL14oI3sxLDZ9KVxccysoLiopJC9nbSwgKG1hdGNoLCBoYXNoZXMsIHRleHQpID0+IHtcbiAgICAgIGNvbnN0IGxldmVsID0gaGFzaGVzLmxlbmd0aDtcbiAgICAgIHJldHVybiBgPGgke2xldmVsfT4ke3RleHR9PC9oJHtsZXZlbH0+YDtcbiAgICB9KTtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdBZnRlciBoZWFkZXIgY29udmVyc2lvbjonLCBodG1sKTtcblxuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gbGlua3MgdG8gSFRNTCBsaW5rc1xuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL1xcWyhbXlxcXV0rKV1cXCgoW14pXSspXFwpL2csICc8YSBocmVmPVwiJDJcIiB0YXJnZXQ9XCJfYmxhbmtcIj4kMTwvYT4nKTtcblxuICAgIC8vICBjb25zb2xlLmxvZygnQWZ0ZXIgbGluayBjb252ZXJzaW9uOicsIGh0bWwpO1xuXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBib2xkIHRvIEhUTUwgc3Ryb25nXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXFwqXFwqKC4qPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKTtcblxuICAgIC8vY29uc29sZS5sb2coJ0FmdGVyIGJvbGQgY29udmVyc2lvbjonLCBodG1sKTtcblxuICAgIC8vIENvbnZlcnQgbmV3IGxpbmVzIHRvIDxicj4gdGFnc1xuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLyg/OlxcclxcbnxcXHJ8XFxuKS9nLCAnPGJyPicpO1xuXG4gICAgLy8gIGNvbnNvbGUubG9nKCdBZnRlciBsaW5lIGJyZWFrcyBjb252ZXJzaW9uOicsIGh0bWwpO1xuXG4gICAgLy8gT3B0aW9uYWw6IFNhbml0aXplIHRoZSBIVE1MIHRvIHByZXZlbnQgWFNTXG4gICAgY29uc3Qgc2FuaXRpemVkSHRtbCA9IHRoaXMuc2FuaXRpemVIdG1sKGh0bWwpO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ1Nhbml0aXplZCBIVE1MOicsIHNhbml0aXplZEh0bWwpO1xuXG4gICAgcmV0dXJuIHNhbml0aXplZEh0bWw7XG4gIH1cbiAgaXNDb2xsYXBzZWQgPSBmYWxzZTtcbiAgaXNDb2xsYXBzZWRGb3JHcmFwaCA9IGZhbHNlO1xuICBpc0NvbGxhcHNlZEZvckZHcmFwaCA9IGZhbHNlO1xuICB0b2dnbGVDb2xsYXBzZSgpIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gIXRoaXMuaXNDb2xsYXBzZWQ7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgdG9nZ2xlQ29sbGFwc2VHcmFwaCgpIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkRm9yR3JhcGggPSAhdGhpcy5pc0NvbGxhcHNlZEZvckdyYXBoO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuICB0b2dnbGVDb2xsYXBzZUZHcmFwaCgpIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkRm9yRkdyYXBoID0gIXRoaXMuaXNDb2xsYXBzZWRGb3JGR3JhcGg7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gIC8qUmVsYXRlZCovXG4gIHJlbGF0ZWRMaXN0SXRlbXMgPSBbXTtcbiAgLypFbmQgUmVsYXRlZCovXG5cbiAgc291cmNlc0xpc3QgPSBbXTtcbiAgZGlzcGxheWVkU291cmNlcyA9IFtdIC8vIEZpcnN0IDMgY2FyZHNcbiAgcmVtYWluaW5nU291cmNlcyA9IFtdOyAvLyBSZW1haW5pbmcgaXRlbXNcbiAgLy8gICBbXG4gIC8vICAge1xuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkFJIE5ld3MgSmFudWFyeSAyMDI0OiBJbi1EZXB0aCBhbmQgQ29uY2lzZSAtIFRoZSBBSSBUcmFja1wiLFxuICAvLyAgICAgXCJkZXNjXCI6IFwiRWFjaCBtb250aCwgd2UgY29tcGlsZSBzaWduaWZpY2FudCBuZXdzLCB0cmVuZHMsIGFuZCBoYXBwZW5pbmdzIGluIEFJLCBwcm92aWRpbmcgZGV0YWlsZWQgc3VtbWFyaWVzIHdpdGgga2V5IHBvaW50cyBpbiBidWxsZXQgZm9ybSBmb3IgY29uY2lzZSB5ZXQgY29tcGxldGUgdW5kZXJzdGFuZGluZy5cIixcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vdGhlYWl0cmFjay5jb20vYWktbmV3cy1qYW51YXJ5LTIwMjQvXCJcbiAgLy8gICB9LFxuICAvLyAgIHtcbiAgLy8gICAgIFwidGl0bGVcIjogXCJUb3AgQUkgTmV3cywgSmFudWFyeSAyMDI0IC0gRXZlcnlwaXhlbCBKb3VybmFsXCIsXG4gIC8vICAgICBcImRlc2NcIjogXCJJbiB0aGlzIG1vbnRobHkgcm91bmR1cCwgd2Ugc3BvdGxpZ2h0IHRoZSB0b3AgQUkgbmV3cyBzdG9yaWVzIGZyb20gSmFudWFyeSwgaW5jbHVkaW5nIHRoZSBPcGVuQUkgdnMuIFRoZSBOZXcgWW9yayBUaW1lcyBMYXdzdWl0LlwiLFxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly9qb3VybmFsLmV2ZXJ5cGl4ZWwuY29tL3RvcC1haS1uZXdzLWphbnVhcnktMjAyNFwiXG4gIC8vICAgfSxcbiAgLy8gICB7XG4gIC8vICAgICBcInRpdGxlXCI6IFwiQUkgTmV3cyBKdWx5IDIwMjQ6IEluLURlcHRoIGFuZCBDb25jaXNlIC0gVGhlIEFJIFRyYWNrXCIsXG4gIC8vICAgICBcImRlc2NcIjogXCJUaGlzIHBhZ2UgZmVhdHVyZXMgQUkgTmV3cyBmb3IgSnVseSAyMDI0LCBoaWdobGlnaHRpbmcgc2lnbmlmaWNhbnQgZXZlbnRzIHN1Y2ggYXMgQ2FudmEgYWNxdWlyaW5nIExlb25hcmRvIEFJLlwiLFxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly90aGVhaXRyYWNrLmNvbS9haS1uZXdzLWp1bHktMjAyNC1pbi1kZXB0aC1hbmQtY29uY2lzZS9cIlxuICAvLyAgIH0sXG4gIC8vICAge1xuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkphbnVhcnkgbmV3cyByb3VuZHVwOiBXaGF0J3MgbmV3IGluIHRoZSB3b3JsZCBvZiBBST8gLSBQbHVyYWxzaWdodFwiLFxuICAvLyAgICAgXCJkZXNjXCI6IFwiT3BlbkFJ4oCZcyBuZXcgR1BUIHN0b3JlLCBidXNpbmVzcy1yZWFkeSBDaGF0R1BUIHBsYW5zLCBhbmQgYSBwcmVkaWN0ZWQgcmlzZSBpbiBBSS1wb3dlcmVkIGN5YmVyY3JpbWUuXCIsXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL3d3dy5wbHVyYWxzaWdodC5jb20vcmVzb3VyY2VzL2Jsb2cvZGF0YS9haS10aGlzLW1vbnRoLWphbnVhcnktMjAyNFwiXG4gIC8vICAgfSxcbiAgLy8gICB7XG4gIC8vICAgICBcInRpdGxlXCI6IFwiQUkgTmV3cyBBdWd1c3QgMjAyNDogSW4tRGVwdGggYW5kIENvbmNpc2UgLSBUaGUgQUkgVHJhY2tcIixcbiAgLy8gICAgIFwiZGVzY1wiOiBcIlRoaXMgcGFnZSBmZWF0dXJlcyBBSSBOZXdzIGZvciBBdWd1c3QgMjAyNCwgd2l0aCBoaWdobGlnaHRzIHN1Y2ggYXMgTnZpZGlhIGRlbGF5aW5nIHRoZSDigJxCbGFja3dlbGzigJ0gQjIwMCBBSSBjaGlwcyBkZWxpdmVyeS5cIixcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vdGhlYWl0cmFjay5jb20vYWktbmV3cy1hdWd1c3QtMjAyNC1pbi1kZXB0aC1hbmQtY29uY2lzZS1kdXBsaWNhdGUvXCJcbiAgLy8gICB9XG4gIC8vIF1cbiAgZGF0ZVRpbWUgPSB7IG5vdzogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH07XG4gIC8vIEV4dHJhY3RzIHRoZSBkb21haW4gZnJvbSBhIFVSTFxuICBnZXREb21haW5OYW1lKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBob3N0bmFtZSB9ID0gbmV3IFVSTCh1cmwpO1xuICAgICAgcmV0dXJuIGhvc3RuYW1lLnJlcGxhY2UoL153d3dcXC4vLCAnJyk7IC8vIFJlbW92ZSAnd3d3LicgaWYgcHJlc2VudFxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICB9XG4gIH1cblxuICAvLyBHZW5lcmF0ZXMgdGhlIGZhdmljb24gVVJMXG4gIGdldEZhdmljb25VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRvbWFpbiA9IHRoaXMuZ2V0RG9tYWluTmFtZSh1cmwpO1xuICAgIHJldHVybiBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zMi9mYXZpY29ucz9zej0xMjgmZG9tYWluPSR7ZG9tYWlufWA7XG4gIH1cbiAgb25DYXJkQ2xpY2soKTogdm9pZCB7XG5cbiAgICB0aGlzLnNvdXJjZXNEcmF3ZXIub3BlbigpO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cbiAgb25DbG9zZVNvdXJjZSgpIHtcbiAgICB0aGlzLnNvdXJjZXNEcmF3ZXIuY2xvc2UoKTtcbiAgICB0aGlzLmlzRHJhd2VyT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIGlmIG5lZWRlZFxuICAgIHRoaXMub25EcmF3ZXJDbG9zZWQoKTtcbiAgfVxuICBvbkRyYXdlckNsb3NlZCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIGlmIG5lZWRlZFxuICAgICAgLy8gVXNlIG5nQ2xhc3MgdG8gZHluYW1pY2FsbHkgYXBwbHkgdGhlIGNsYXNzXG4gICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm90Y2xvc2VwbGF5Z3JvdW5kYnV0dG9uJyk7XG4gICAgICBpZiAoYnV0dG9uKSB7XG4gICAgICAgIGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfVxuICBpc0RyYXdlck9wZW4gPSB0cnVlO1xuXG4gIHRvZ2dsZURyYXdlcih0b2RvKSB7XG4gICAgdGhpcy5pc0RyYXdlck9wZW4gPSB0b2RvO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvblZpc2liaWxpdHkoKTtcbiAgfVxuICB1cGRhdGVCdXR0b25WaXNpYmlsaXR5KCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9IHRoaXMuaXNEcmF3ZXJPcGVuID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICB9XG4gIH1cbiAgb3BlbkxpbmtJbk5ld1RhYihsaW5rOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB3aW5kb3cub3BlbihsaW5rLCAnX2JsYW5rJyk7XG4gIH1cblxufVxuIl19
|