@hivegpt/hiveai-angular 0.0.355 → 0.0.360

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.
Files changed (57) hide show
  1. package/README.md +23 -24
  2. package/bundles/hivegpt-hiveai-angular.umd.js +3083 -2779
  3. package/bundles/hivegpt-hiveai-angular.umd.js.map +1 -1
  4. package/bundles/hivegpt-hiveai-angular.umd.min.js +1 -1
  5. package/bundles/hivegpt-hiveai-angular.umd.min.js.map +1 -1
  6. package/environments/environment.d.ts +14 -14
  7. package/environments/environment.d.ts.map +1 -1
  8. package/esm2015/environments/environment.js +15 -15
  9. package/esm2015/hivegpt-hiveai-angular.js +13 -12
  10. package/esm2015/lib/components/NotificationSocket.js +39 -39
  11. package/esm2015/lib/components/bot-html-editor/bot-html-editor.component.js +112 -112
  12. package/esm2015/lib/components/bot.service.js +50 -50
  13. package/esm2015/lib/components/chat-drawer/chat-drawer.component.js +1747 -1728
  14. package/esm2015/lib/components/chatbot/chatbot.component.js +50 -50
  15. package/esm2015/lib/components/conversation.service.js +49 -49
  16. package/esm2015/lib/components/socket-service.service.js +72 -72
  17. package/esm2015/lib/components/translations/translation.service.js +219 -0
  18. package/esm2015/lib/components/video-player/video-player.component.js +123 -123
  19. package/esm2015/lib/hivegpt.module.js +21 -21
  20. package/esm2015/lib/models/video.js +2 -2
  21. package/esm2015/lib/pipes/safe-html.pipe.js +19 -19
  22. package/esm2015/lib/utils/utils.js +36 -36
  23. package/esm2015/public-api.js +7 -7
  24. package/fesm2015/hivegpt-hiveai-angular.js +2480 -2243
  25. package/fesm2015/hivegpt-hiveai-angular.js.map +1 -1
  26. package/hivegpt-hiveai-angular.d.ts +12 -11
  27. package/hivegpt-hiveai-angular.d.ts.map +1 -1
  28. package/hivegpt-hiveai-angular.metadata.json +1 -1
  29. package/lib/components/NotificationSocket.d.ts +4 -4
  30. package/lib/components/NotificationSocket.d.ts.map +1 -1
  31. package/lib/components/bot-html-editor/bot-html-editor.component.d.ts +35 -35
  32. package/lib/components/bot-html-editor/bot-html-editor.component.d.ts.map +1 -1
  33. package/lib/components/bot.service.d.ts +11 -11
  34. package/lib/components/bot.service.d.ts.map +1 -1
  35. package/lib/components/chat-drawer/chat-drawer.component.d.ts +254 -250
  36. package/lib/components/chat-drawer/chat-drawer.component.d.ts.map +1 -1
  37. package/lib/components/chatbot/chatbot.component.d.ts +35 -35
  38. package/lib/components/chatbot/chatbot.component.d.ts.map +1 -1
  39. package/lib/components/conversation.service.d.ts +12 -12
  40. package/lib/components/conversation.service.d.ts.map +1 -1
  41. package/lib/components/socket-service.service.d.ts +19 -19
  42. package/lib/components/socket-service.service.d.ts.map +1 -1
  43. package/lib/components/translations/translation.service.d.ts +8 -0
  44. package/lib/components/translations/translation.service.d.ts.map +1 -0
  45. package/lib/components/video-player/video-player.component.d.ts +35 -35
  46. package/lib/components/video-player/video-player.component.d.ts.map +1 -1
  47. package/lib/hivegpt.module.d.ts +2 -2
  48. package/lib/hivegpt.module.d.ts.map +1 -1
  49. package/lib/models/video.d.ts +34 -34
  50. package/lib/models/video.d.ts.map +1 -1
  51. package/lib/pipes/safe-html.pipe.d.ts +7 -7
  52. package/lib/pipes/safe-html.pipe.d.ts.map +1 -1
  53. package/lib/utils/utils.d.ts +2 -2
  54. package/lib/utils/utils.d.ts.map +1 -1
  55. package/package.json +1 -1
  56. package/public-api.d.ts +3 -3
  57. package/public-api.d.ts.map +1 -1
@@ -1,1728 +1,1747 @@
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
- import { FormBuilder, Validators } from '@angular/forms';
12
- import * as SpeechSDK from 'microsoft-cognitiveservices-speech-sdk';
13
- import { BotsService } from '../bot.service';
14
- import * as marked from 'marked'; // Import marked
15
- export class ChatDrawerComponent {
16
- constructor(fb, botService, cdr, http, sanitizer, elementRef, renderer, socketService, conversationService // private platform: Platform
17
- ) {
18
- this.fb = fb;
19
- this.botService = botService;
20
- this.cdr = cdr;
21
- this.http = http;
22
- this.sanitizer = sanitizer;
23
- this.elementRef = elementRef;
24
- this.renderer = renderer;
25
- this.socketService = socketService;
26
- this.conversationService = conversationService;
27
- this.bodyOverflowClass = 'body-overflow-hidden';
28
- this.isCollapsedTrue = false;
29
- this.copilotName = 'HiveXGPT';
30
- this.feedbackEvent = new EventEmitter();
31
- this.onCloseEvent = new EventEmitter();
32
- this.openPage = new EventEmitter();
33
- this.sessionActions = new EventEmitter();
34
- this.closeBot = new EventEmitter();
35
- this.connectWithUser = new EventEmitter();
36
- this.scheduleMeeting = new EventEmitter();
37
- this.refreshToken = new EventEmitter();
38
- this.openSupport = new EventEmitter();
39
- this.autogenKey = 'Autogen_eDJTtEU-NB0RtIpzq1w';
40
- this.addToMyAgendaAction = 'add_to_my_agenda';
41
- this.myUpcomingSessionAction = 'my_upcomming_session';
42
- this.connectOrFollowAction = 'connect_or_follow';
43
- this.aiResponse = '';
44
- this.chatLog = [];
45
- this.decoder = new TextDecoder();
46
- this.feedbackDone = false;
47
- this.greetingMsg = '';
48
- this.hasBackdropValue = false;
49
- this.input = '';
50
- this.listenerAdded = false;
51
- this.loading = false;
52
- this.mode = 'over';
53
- this.quickPrompts = [];
54
- this.thumbsDownMsgIndex = 0;
55
- this.userName = '';
56
- this.showStartAgain = false;
57
- this.isIOSDevice = false;
58
- this.showFeedBackIconsIndex = null;
59
- this.temperature = 1;
60
- this.speakers = [];
61
- this.conSessionKey = '';
62
- this.currentWorkflowActionProgress = 0;
63
- this.currentWorkflowAction = '';
64
- this.recognizedText = '';
65
- this.authorizationToken = '';
66
- this.region = 'westeurope'; // Set your Azure region here
67
- this.domainAuthorityValue = "prod-lite";
68
- this.isChatingWithAi = false;
69
- this.readAllChunks = (stream) => {
70
- const reader = stream.getReader();
71
- const allSuggestions = [];
72
- reader.closed.catch((err) => {
73
- if (err) {
74
- console.error('Error reading stream: ', err);
75
- }
76
- this.isChatingWithAi = false;
77
- this.scrollToBottom();
78
- return;
79
- });
80
- return new ReadableStream({
81
- start: (controller) => {
82
- return this.pump(controller, reader, allSuggestions);
83
- },
84
- });
85
- };
86
- this.currentMessageForEditor = '';
87
- this.currentIndexForEditor = -1;
88
- this.isDropdownOpen = false;
89
- this.selectedAgents = [];
90
- this.allSelected = false;
91
- this.isDocInEditMode = false;
92
- this.isContentLoaded = false;
93
- this.isCollapsed = false;
94
- this.isCollapsedForGraph = false;
95
- this.isCollapsedForFGraph = false;
96
- // [
97
- // {
98
- // "title": "AI News January 2024: In-Depth and Concise - The AI Track",
99
- // "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.",
100
- // "link": "https://theaitrack.com/ai-news-january-2024/"
101
- // },
102
- // {
103
- // "title": "Top AI News, January 2024 - Everypixel Journal",
104
- // "desc": "In this monthly roundup, we spotlight the top AI news stories from January, including the OpenAI vs. The New York Times Lawsuit.",
105
- // "link": "https://journal.everypixel.com/top-ai-news-january-2024"
106
- // },
107
- // {
108
- // "title": "AI News July 2024: In-Depth and Concise - The AI Track",
109
- // "desc": "This page features AI News for July 2024, highlighting significant events such as Canva acquiring Leonardo AI.",
110
- // "link": "https://theaitrack.com/ai-news-july-2024-in-depth-and-concise/"
111
- // },
112
- // {
113
- // "title": "January news roundup: What's new in the world of AI? - Pluralsight",
114
- // "desc": "OpenAI’s new GPT store, business-ready ChatGPT plans, and a predicted rise in AI-powered cybercrime.",
115
- // "link": "https://www.pluralsight.com/resources/blog/data/ai-this-month-january-2024"
116
- // },
117
- // {
118
- // "title": "AI News August 2024: In-Depth and Concise - The AI Track",
119
- // "desc": "This page features AI News for August 2024, with highlights such as Nvidia delaying the “Blackwell” B200 AI chips delivery.",
120
- // "link": "https://theaitrack.com/ai-news-august-2024-in-depth-and-concise-duplicate/"
121
- // }
122
- // ]
123
- this.dateTime = { now: new Date().toISOString() };
124
- this.currentSourcesList = [];
125
- this.isShowEditorButton = true;
126
- this.isDrawerOpen = true;
127
- this.chatMain = new ElementRef(null);
128
- // if (this.platform.IOS) {
129
- // this.isIOSDevice = true;
130
- // }
131
- }
132
- ngOnChanges(changes) {
133
- if (changes.s27Token) {
134
- if (changes.s27Token.currentValue != changes.s27Token.previousValue) {
135
- this.s27Token = changes.s27Token.currentValue;
136
- console.log('isFetchDataFor: ', this.isFetchDataFor);
137
- console.log('msg: ', this.msg);
138
- console.log('chat: ', this.chat);
139
- if (this.is401) {
140
- if (this.isFetchDataFor) {
141
- this.fetchDataFor(this.msg, this.chat);
142
- }
143
- else {
144
- this.fetchData(this.msg);
145
- }
146
- }
147
- }
148
- }
149
- if (changes.orgId) {
150
- if (changes.orgId.currentValue != changes.orgId.previousValue &&
151
- changes.orgId.currentValue) {
152
- this.initializeSocket();
153
- }
154
- }
155
- }
156
- ngOnInit() {
157
- this.environment = this.isDev ? dev_environment : prod_environment;
158
- const domain = window.location.hostname;
159
- // Determine the header value based on the domain
160
- if (domain.includes('pre-app.social27.com')) {
161
- this.domainAuthorityValue = 'pre-prod-lite';
162
- }
163
- else if (domain.includes('app.social27.com')) {
164
- this.domainAuthorityValue = 'prod-lite';
165
- }
166
- else if (domain.includes('hivegpt.io')) {
167
- this.domainAuthorityValue = 'hivegpt';
168
- }
169
- // this.fetchMyConnections().subscribe();
170
- // this.fetchPendingRequests().subscribe();
171
- this.changeTemperature(this.temperature);
172
- this.fetchBotConfig().subscribe((res) => {
173
- this.cdr.markForCheck();
174
- this.fetchChatHistory().subscribe((response) => {
175
- this.loading = false;
176
- this.mapChatHistory(response);
177
- this.cdr.markForCheck();
178
- }, (err) => {
179
- console.error('Error fetching chat history:', err);
180
- });
181
- }, (err) => {
182
- console.error('Error fetching chat history:', err);
183
- });
184
- // this.fetchAgents();
185
- // this.fetchEditorContent();
186
- this.cdr.markForCheck();
187
- // this.initializeSocket();
188
- this.botService.fetchSpeechAuthorizationToken(this.botId, this.apiKey, this.domainAuthorityValue).subscribe((token) => {
189
- this.authorizationToken = token;
190
- this.initializeSpeechRecognizer(token);
191
- });
192
- }
193
- initializeSocket() {
194
- try {
195
- this.socketService.disconnectSocketConnection();
196
- }
197
- catch (error) { }
198
- setTimeout(() => {
199
- this.socketService.connectSocketConnection();
200
- setTimeout(() => {
201
- console.log('YES INIT');
202
- const conversation_id = this.conversationService.getKey(this.botId);
203
- this.socketService.registerUserSpecificHiveSocket(this.botId, conversation_id, this.orgId);
204
- setTimeout(() => {
205
- this.listenSockets();
206
- }, 300);
207
- }, 200);
208
- }, 300);
209
- }
210
- listenSockets() {
211
- if (this.eventSubscription) {
212
- this.eventSubscription.unsubscribe();
213
- }
214
- console.log('Listen Socket');
215
- this.eventSubscription = this.conversationService
216
- .getUserSpecificNotification()
217
- .subscribe((res) => {
218
- var _a, _b, _c, _d, _e, _f;
219
- console.log('Listen Socket response');
220
- console.log(res);
221
- // Check if OtherFields exists in the response
222
- if ((_b = (_a = res === null || res === void 0 ? void 0 : res.m) === null || _a === void 0 ? void 0 : _a.OtherFields) === null || _b === void 0 ? void 0 : _b.workflow_id) {
223
- const { percentage, output, action_name, current_action_name, workflow_execution_id, time_stamp, } = (_c = res === null || res === void 0 ? void 0 : res.m) === null || _c === void 0 ? void 0 : _c.OtherFields;
224
- this.currentWorkflowActionProgress = percentage;
225
- this.currentWorkflowAction = action_name;
226
- const actionIndex = this.workflowExecutionDetails.Actions.findIndex((a) => a.Name == current_action_name);
227
- if (actionIndex !== -1) {
228
- this.workflowExecutionDetails.Actions[actionIndex]['Output'] = output;
229
- this.workflowExecutionDetails.Actions[actionIndex]['InsertTimeStamp'] = formatTimeStamps(this.timezone, time_stamp);
230
- }
231
- else {
232
- console.error(`Action with name ${action_name} not found`);
233
- }
234
- this.currentWorkflowExecutionDetails = this.workflowExecutionDetails;
235
- if (this.currentWorkflowActionProgress == 100) {
236
- this.chatLog[this.chatLog.length - 1]['WorkflowExecutionId'] = workflow_execution_id;
237
- this.isChatingWithAi = false;
238
- this.executingWorkflow = false;
239
- }
240
- this.cdr.detectChanges();
241
- }
242
- else if ((_d = res === null || res === void 0 ? void 0 : res.m) === null || _d === void 0 ? void 0 : _d.OtherFields) {
243
- const { conversation_id, bot_id, message_id, answer, web_results, search_results, graphs, execution_graphs, suggestions, } = (_e = res === null || res === void 0 ? void 0 : res.m) === null || _e === void 0 ? void 0 : _e.OtherFields;
244
- console.log('message_id1');
245
- console.log((_f = res === null || res === void 0 ? void 0 : res.m) === null || _f === void 0 ? void 0 : _f.OtherFields);
246
- var currentChatMessage = this.chatLog.find((p) => p._id == message_id);
247
- console.log(this.chatLog);
248
- if (!currentChatMessage) {
249
- console.log('message_id2');
250
- console.log(message_id);
251
- currentChatMessage = {
252
- _id: message_id,
253
- type: 'ai',
254
- time: formatNow(this.timezone),
255
- };
256
- this.chatLog.push(currentChatMessage);
257
- this.showFeedBackIconsIndex = this.chatLog.length - 1;
258
- console.log('message_id3');
259
- console.log(message_id);
260
- this.cdr.detectChanges();
261
- }
262
- // Handle the fields based on their presence
263
- if (search_results && Array.isArray(search_results)) {
264
- console.log('Online Search Terms:', search_results);
265
- currentChatMessage.searchTerms = search_results;
266
- this.cdr.detectChanges();
267
- }
268
- if (web_results && Array.isArray(web_results)) {
269
- console.log('Web Results:', web_results);
270
- currentChatMessage.sourcesList = web_results;
271
- currentChatMessage.displayedSources = web_results === null || web_results === void 0 ? void 0 : web_results.slice(0, 3); // First 3 cards
272
- currentChatMessage.remainingSources = web_results === null || web_results === void 0 ? void 0 : web_results.slice(3); // Remaining items
273
- this.cdr.detectChanges();
274
- }
275
- if (answer) {
276
- this.isChatingWithAi = false;
277
- console.log('Answer:', answer);
278
- currentChatMessage.message = this.processMessageForDisplay(answer);
279
- this.cdr.detectChanges();
280
- this.scrollToBottom();
281
- }
282
- if (graphs && Array.isArray(graphs)) {
283
- console.log('Graphs:', graphs);
284
- currentChatMessage.graphs = graphs;
285
- this.cdr.detectChanges();
286
- }
287
- if (execution_graphs && Array.isArray(execution_graphs)) {
288
- console.log('Execution Graphs:', execution_graphs);
289
- currentChatMessage.executionGraphs = execution_graphs;
290
- this.cdr.detectChanges();
291
- }
292
- if (suggestions && Array.isArray(suggestions)) {
293
- console.log('suggestions:', suggestions);
294
- currentChatMessage.relatedListItems = suggestions;
295
- this.cdr.detectChanges();
296
- // Process online search terms as needed
297
- }
298
- // Add any other fields and their processing here
299
- }
300
- else {
301
- console.warn('OtherFields is missing in the response');
302
- }
303
- }, (err) => {
304
- this.eventSubscription.unsubscribe();
305
- console.error('Error in fetching data from socket', err);
306
- });
307
- }
308
- initializeSocketAndListen() { }
309
- handleEvent(data, type) {
310
- switch (type) {
311
- case 'webresult':
312
- break;
313
- case 'answer':
314
- break;
315
- case 'graph':
316
- break;
317
- default:
318
- break;
319
- }
320
- }
321
- ngOnDestroy() {
322
- if (this.eventSubscription) {
323
- this.eventSubscription.unsubscribe();
324
- }
325
- this.socketService.disconnectSocketConnection();
326
- //this.socketService.close();
327
- }
328
- changeTemperature(newTemperature) {
329
- if (this.loading)
330
- return;
331
- this.temperature = newTemperature;
332
- const wrapper = document.querySelector('.hivegpt-chat-wrapper');
333
- // Remove existing theme classes from body
334
- wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.remove('creative', 'balanced', 'precise');
335
- switch (newTemperature) {
336
- case 0:
337
- wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('creative');
338
- break;
339
- case 1:
340
- wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('balanced');
341
- break;
342
- case 2:
343
- wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('precise');
344
- break;
345
- default:
346
- break;
347
- }
348
- }
349
- onStartAgain() {
350
- if (this.loading)
351
- return;
352
- this.showStartAgain = false;
353
- this.chatLog = [];
354
- this.chatLog.push({
355
- type: 'ai',
356
- message: this.greetingMsg,
357
- time: formatNow(this.timezone),
358
- });
359
- this.archieveMessages().subscribe();
360
- }
361
- archieveMessages() {
362
- const headers = new HttpHeaders({
363
- 'Content-Type': 'application/json',
364
- 'x-api-key': this.apiKey,
365
- 'hive-bot-id': this.botId,
366
- 'domain-authority': this.domainAuthorityValue
367
- });
368
- const url = `${this.environment.BASE_URL}/bot/clear-history/${this.botId}/${this.userId}`;
369
- return this.http.post(url, { headers }).pipe(switchMap((res) => {
370
- return of(res);
371
- }), catchError((error) => {
372
- return of(null);
373
- }));
374
- }
375
- triggerSupport() {
376
- this.openSupport.emit();
377
- }
378
- fetchBotConfig() {
379
- this.loading = true;
380
- const headers = new HttpHeaders({
381
- 'x-api-key': this.apiKey,
382
- 'hive-bot-id': this.botId,
383
- 'domain-authority': this.domainAuthorityValue
384
- });
385
- const url = `${this.environment.BASE_URL}/bots?bot_id=${this.botId}`;
386
- return this.http.get(url, { headers }).pipe(switchMap((res) => {
387
- var _a;
388
- this.botName = res.Name;
389
- this.botIcon = res.Icon;
390
- this.botSkills = res === null || res === void 0 ? void 0 : res.Skills;
391
- this.greetingMsg = res.Greeting;
392
- this.thumbsDownMessages = ((_a = res === null || res === void 0 ? void 0 : res.NegativeResponses) === null || _a === void 0 ? void 0 : _a.length) ? res.NegativeResponses
393
- : [
394
- `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;'><a style='color: inherit; text-decoration: none;' id='supportLink88' >Please click here</a></span> and a human agent will assist you as soon as possible`,
395
- ];
396
- this.quickPrompts = res.QuickPrompts;
397
- this.cdr.markForCheck();
398
- this.loading = false;
399
- return of(res);
400
- }), catchError((error) => {
401
- console.error('Error fetching chatbot config: ', error);
402
- this.loading = false;
403
- return of(null);
404
- }));
405
- }
406
- fetchChatHistory() {
407
- this.loading = true;
408
- this.conversationKey = this.conversationService.getKey(this.botId, false);
409
- this.conSessionKey = this.conversationService.getSessionKey(this.botId, false);
410
- const url = `${this.environment.BASE_URL}/conversations/${this.conversationKey}?session_id=${this.conSessionKey}`;
411
- const headers = new HttpHeaders({
412
- accept: 'application/json',
413
- 'x-api-key': this.apiKey,
414
- 'hive-bot-id': this.botId,
415
- 'domain-authority': this.domainAuthorityValue
416
- });
417
- return this.http
418
- .get(url, { headers })
419
- .pipe(catchError(this.handleError('fetchConversation')));
420
- }
421
- handleError(operation = 'operation', result) {
422
- return (error) => {
423
- console.error(`${operation} failed: ${error.message}`);
424
- return of(result);
425
- };
426
- }
427
- // fetchChatHistory() {
428
- // this.loading = true;
429
- // const headers = new HttpHeaders({
430
- // 'Content-Type': 'application/json',
431
- // 'x-api-key': this.apiKey,
432
- // });
433
- // return this.http
434
- // .get(`${this.environment.BASE_URL}/conversations/${this.conversationKey}`, { headers })
435
- // .pipe(
436
- // switchMap((res: any) => {
437
- // this.loading = false;
438
- // return of(res);
439
- // }),
440
- // catchError((error: any) => {
441
- // console.error('Error fetching chat history: ', error);
442
- // this.loading = false;
443
- // return of(null);
444
- // })
445
- // );
446
- // }
447
- mapChatHistory(chats) {
448
- var _a;
449
- this.chatLog.push({
450
- type: 'ai',
451
- message: this.greetingMsg,
452
- time: formatNow(this.timezone),
453
- });
454
- if (chats && ((_a = chats === null || chats === void 0 ? void 0 : chats.Messages) === null || _a === void 0 ? void 0 : _a.length)) {
455
- chats === null || chats === void 0 ? void 0 : chats.Messages.forEach((chat) => {
456
- if (chat.Type == 'user') {
457
- this.chatLog.push({
458
- type: 'user',
459
- message: this.processMessageForDisplay(chat.Text),
460
- time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
461
- copied: false,
462
- isCollapsedTrue: false,
463
- WorkflowExecutionId: chat.WorkflowExecutionId,
464
- _id: chat._id
465
- });
466
- }
467
- if (chat.Type == 'ai') {
468
- var sourcesList = chat.WebLinks || [];
469
- var displayedSources = chat.WebLinks.slice(0, 3); // First 3 cards
470
- var remainingSources = chat.WebLinks.slice(3); // Remaining items
471
- this.chatLog.push({
472
- type: 'ai',
473
- message: this.processMessageForDisplay(chat.Text),
474
- executionGraphs: chat.ExecutionGraphs,
475
- graphs: chat.Graphs,
476
- searchTerms: chat.SearchTerms,
477
- sourcesList: sourcesList,
478
- displayedSources: displayedSources,
479
- remainingSources: remainingSources,
480
- time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
481
- copied: false,
482
- isCollapsedTrue: false,
483
- _id: chat._id
484
- });
485
- this.showFeedBackIconsIndex = this.chatLog.length - 1;
486
- }
487
- });
488
- this.showStartAgain = true;
489
- }
490
- this.scrollToBottom();
491
- this.cdr.markForCheck();
492
- }
493
- processMessage(message) {
494
- if (!message || !((message === null || message === void 0 ? void 0 : message.length) > 0)) {
495
- return '';
496
- }
497
- // console.log('here is my message')
498
- // console.log(message);
499
- message = message.trim();
500
- const markdownLinkRegex = /\[([^[]+)]\(([^)]+)\)/g;
501
- const urlRegex = /(?<!href=")\bhttps?:\/\/\S+(?<![.,])/gi;
502
- if (markdownLinkRegex.test(message)) {
503
- const html = message.replace(markdownLinkRegex, '<a href="$2" target="_blank">$1</a>');
504
- //console.log('Sanitized message: ', message);
505
- return this.sanitizeHtml(html);
506
- }
507
- if (urlRegex.test(message)) {
508
- const html = message.replace(urlRegex, '<a href="$&" target="_blank">$&</a>');
509
- // console.log('Sanitized message: ', message);
510
- return this.sanitizeHtml(html);
511
- }
512
- message = message.replace(/(?:\r\n|\r|\n)/g, '<br>');
513
- message = message.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
514
- // Convert Markdown headers to HTML headers
515
- message = message.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
516
- const level = hashes.length;
517
- return `<h${level}>${text}</h${level}>`;
518
- });
519
- this.cdr.markForCheck();
520
- const sanitizedMessage = this.sanitizeHtml(message);
521
- return sanitizedMessage;
522
- }
523
- ngAfterViewChecked() {
524
- const feedbackLinks = this.elementRef.nativeElement.querySelectorAll('.feedback-link');
525
- feedbackLinks.forEach((link) => {
526
- link.addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
527
- });
528
- // if (this.elementRef.nativeElement.querySelector('.feedback-link')) {
529
- // this.elementRef.nativeElement
530
- // .querySelector('.feedback-link')
531
- // .addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
532
- // }
533
- }
534
- sanitizeHtml(html) {
535
- return this.sanitizer.bypassSecurityTrustHtml(html);
536
- }
537
- onFeedbackClick(value) {
538
- this.feedbackEvent.emit(value);
539
- }
540
- onClose() {
541
- this.renderer.removeClass(document.body, this.bodyOverflowClass);
542
- this.onCloseEvent.emit();
543
- }
544
- sendMessageWithTile(prompt) {
545
- this.input = prompt;
546
- this.fetchData();
547
- this.scrollToBottom();
548
- }
549
- fetchData(msg = null) {
550
- var _a;
551
- this.input = msg || ((_a = this.input) === null || _a === void 0 ? void 0 : _a.trim());
552
- this.msg = this.input;
553
- if (!this.input || this.loading) {
554
- return;
555
- }
556
- this.chatLog.push({
557
- type: 'user',
558
- message: this.processMessageForDisplay(this.input),
559
- time: formatNow(this.timezone),
560
- copied: false,
561
- isCollapsedTrue: false,
562
- });
563
- try {
564
- const textarea = this.myInput.nativeElement;
565
- textarea.style.height = 'hidden'; // Reset the height
566
- textarea.style.height = `62px`;
567
- }
568
- catch (error) { }
569
- this.cdr.markForCheck();
570
- this.aiResponse = '';
571
- this.isChatingWithAi = true;
572
- this.makeAskRequest(this.input, this.agents, this.conversationKey);
573
- }
574
- fetchDataFor(msg, chat) {
575
- const inputMsg = msg === null || msg === void 0 ? void 0 : msg.trim();
576
- if (!inputMsg || this.loading) {
577
- return;
578
- }
579
- try {
580
- chat.relatedListItems = [];
581
- this.cdr.detectChanges();
582
- }
583
- catch (error) { }
584
- this.scrollToBottom();
585
- this.chatLog.push({
586
- type: 'user',
587
- message: this.processMessageForDisplay(inputMsg),
588
- time: formatNow(this.timezone),
589
- copied: false,
590
- isCollapsedTrue: false,
591
- });
592
- this.cdr.markForCheck();
593
- this.aiResponse = '';
594
- this.isChatingWithAi = true;
595
- this.makeAskRequest(inputMsg, this.agents, this.conversationKey, msg, chat);
596
- }
597
- fetchSmallTalk() {
598
- this.loading = true;
599
- this.cdr.markForCheck();
600
- const url = `${this.environment.BASE_URL}/bot/small-talk/${this.botId}/${this.userId}`;
601
- this.http
602
- .get(url, {
603
- headers: {
604
- 'x-api-key': this.apiKey,
605
- 'hive-bot-id': this.botId,
606
- 'domain-authority': this.domainAuthorityValue
607
- },
608
- })
609
- .pipe(catchError((error) => {
610
- console.error('Error while fetching small talk:', error);
611
- return of(null);
612
- }))
613
- .subscribe((response) => {
614
- this.loading = false;
615
- this.cdr.markForCheck();
616
- if (!response) {
617
- return;
618
- }
619
- if (response && response.smallTalk) {
620
- this.chatLog.push({
621
- type: 'ai',
622
- message: this.processMessage(response.smallTalk),
623
- time: formatNow(this.timezone),
624
- isFeedbackMsg: true,
625
- });
626
- this.showFeedBackIconsIndex = this.chatLog.length - 2;
627
- // this.scrollToBottom();
628
- this.cdr.markForCheck();
629
- }
630
- });
631
- }
632
- pump(controller, reader, allSuggestions) {
633
- reader.read().then(({ done, value }) => {
634
- var _a, _b, _c, _d;
635
- const lastItem = this.chatLog[this.chatLog.length - 1];
636
- if (done) {
637
- lastItem.message = this.processMessageForDisplay(lastItem.message);
638
- this.chatLog.pop();
639
- this.chatLog.push(lastItem);
640
- if (allSuggestions === null || allSuggestions === void 0 ? void 0 : allSuggestions.length) {
641
- this.chatLog.push({
642
- type: 'suggestions',
643
- suggestions: allSuggestions,
644
- });
645
- }
646
- controller.close();
647
- this.isChatingWithAi = false;
648
- // this.scrollToBottom();
649
- this.cdr.markForCheck();
650
- this.showStartAgain = true;
651
- // setTimeout(() => {
652
- // this.fetchSmallTalk();
653
- // },1000)
654
- return;
655
- }
656
- let decodedChunk = this.decoder.decode(value, { stream: true });
657
- this.aiResponse += decodedChunk;
658
- if (lastItem.type === 'ai') {
659
- const suggestionsMatch = this.aiResponse.match(/<sug>(.*?)<\/sug>/g);
660
- if (suggestionsMatch) {
661
- suggestionsMatch.forEach((match) => {
662
- this.aiResponse = this.aiResponse.replace(match, '');
663
- allSuggestions.push(match === null || match === void 0 ? void 0 : match.replace(/<\/?sug>/g, ''));
664
- });
665
- }
666
- lastItem.message = this.aiResponse;
667
- this.cdr.markForCheck();
668
- }
669
- else {
670
- this.isChatingWithAi = false;
671
- let aiFormattedData;
672
- try {
673
- console.log('parsing json ');
674
- aiFormattedData = JSON.parse(JSON.parse(this.aiResponse));
675
- }
676
- catch (e) {
677
- try {
678
- console.log('parsing json 2');
679
- aiFormattedData = JSON.parse(this.aiResponse);
680
- }
681
- catch (e) { }
682
- }
683
- console.log('parsing json done');
684
- if (aiFormattedData && ((_a = aiFormattedData === null || aiFormattedData === void 0 ? void 0 : aiFormattedData.section_id) === null || _a === void 0 ? void 0 : _a.length) > 0) {
685
- if (aiFormattedData.section_id == 'company_search' ||
686
- aiFormattedData.section_id == 'user_search' ||
687
- aiFormattedData.section_id == 'industry_company_search') {
688
- this.fetchMyConnections().subscribe();
689
- this.fetchPendingRequests().subscribe();
690
- }
691
- if (aiFormattedData.section_id == this.myUpcomingSessionAction) {
692
- var speakerIds = [];
693
- (_b = aiFormattedData.content) === null || _b === void 0 ? void 0 : _b.forEach((session) => {
694
- speakerIds = [...speakerIds, ...session.speakers];
695
- });
696
- if ((speakerIds === null || speakerIds === void 0 ? void 0 : speakerIds.length) > 0)
697
- this.getSpeakersByStaffIds(speakerIds);
698
- }
699
- if (aiFormattedData.section_id == this.addToMyAgendaAction &&
700
- ((_c = aiFormattedData.content) === null || _c === void 0 ? void 0 : _c.length) > 0) {
701
- this.openPage.next({
702
- sectionId: aiFormattedData.section_id,
703
- sessionIds: aiFormattedData.content,
704
- });
705
- }
706
- if (aiFormattedData.section_id == this.connectOrFollowAction) {
707
- let usersLen = (_d = aiFormattedData.content) === null || _d === void 0 ? void 0 : _d.length;
708
- if (usersLen > 1) {
709
- this.openPage.next({
710
- sectionId: 'open_networking_drawer',
711
- search: aiFormattedData.content,
712
- });
713
- }
714
- else if (usersLen == 1) {
715
- this.openPage.next({
716
- sectionId: aiFormattedData.section_id,
717
- connetUserIds: [aiFormattedData.content[0].userId],
718
- });
719
- }
720
- }
721
- if (aiFormattedData.is_open_page == 'true') {
722
- this.openPage.next({
723
- sectionId: aiFormattedData.section_id,
724
- search: aiFormattedData.content,
725
- });
726
- if (this.isMobileBrowser()) {
727
- aiFormattedData.message +=
728
- '\n\n' + '<a id="closeBotNow">Click Here</a> to see results.';
729
- }
730
- }
731
- this.chatLog.push({
732
- type: 'ai',
733
- message: aiFormattedData.message,
734
- action: aiFormattedData,
735
- time: formatNow(this.timezone),
736
- });
737
- if (this.isMobileBrowser()) {
738
- setTimeout(() => {
739
- this.addCloseBotClickEvent();
740
- }, 500);
741
- }
742
- this.aiResponse = '';
743
- }
744
- else {
745
- this.chatLog.push({
746
- type: 'ai',
747
- message: this.aiResponse,
748
- time: formatNow(this.timezone),
749
- });
750
- }
751
- this.showFeedBackIconsIndex = this.chatLog.length - 1;
752
- this.cdr.markForCheck();
753
- }
754
- this.scrollToBottom();
755
- // Enqueue the next data chunk into our target stream
756
- controller.enqueue(value);
757
- this.pump(controller, reader, allSuggestions);
758
- });
759
- }
760
- submitFeedback(flag, message) {
761
- console.log(message);
762
- this.feedbackDone = true;
763
- this.showFeedBackIconsIndex = null;
764
- const conversation_id = this.conversationService.getKey(this.botId);
765
- const url = `${this.environment.AGENTS_API}/Conversation/coPilot/${this.botId}/conversation/${conversation_id}/helpful-response`;
766
- fetch(url, {
767
- method: 'POST',
768
- headers: {
769
- 'Content-Type': 'application/json',
770
- 'apiKey': 'Conversation_WIz/qAm+EEmfOkFaUA/weA==',
771
- 'hive-bot-id': this.botId,
772
- 'domain-authority': this.domainAuthorityValue
773
- },
774
- body: JSON.stringify({ messageId: message._id, isHelpful: flag }),
775
- }).then(() => {
776
- if (flag) {
777
- this.chatLog.push({
778
- type: 'ai',
779
- message: this.thumbsUpMessage ||
780
- `Great. May I assist you with anything else?`,
781
- time: formatNow(this.timezone),
782
- isFeedbackMsg: true,
783
- });
784
- this.scrollToBottom();
785
- this.cdr.markForCheck();
786
- this.feedbackDone = false;
787
- this.showFeedBackIconsIndex = null;
788
- return;
789
- }
790
- this.chatLog.push({
791
- type: 'ai',
792
- message: this.processMessage(this.thumbsDownMessages[this.thumbsDownMsgIndex]),
793
- time: formatNow(this.timezone),
794
- isFeedbackMsg: true,
795
- });
796
- this.thumbsDownMsgIndex =
797
- (this.thumbsDownMsgIndex + 1) % this.thumbsDownMessages.length;
798
- this.scrollToBottom();
799
- this.cdr.markForCheck();
800
- setTimeout(() => {
801
- const supportLink = document.getElementById('supportLink88');
802
- if (supportLink) {
803
- supportLink.addEventListener('click', this.triggerSupport.bind(this));
804
- }
805
- }, 200);
806
- this.feedbackDone = false;
807
- this.showFeedBackIconsIndex = null;
808
- });
809
- }
810
- handleKeydown(event) {
811
- if (event.key === 'Enter' && !event.shiftKey) {
812
- // Prevent default behavior (new line)
813
- event.preventDefault();
814
- // Call your submit function
815
- this.handleSubmit(event);
816
- }
817
- }
818
- handleSubmit(event) {
819
- this.fetchData();
820
- this.scrollToBottom();
821
- }
822
- handleUpClick(idx) {
823
- if (this.feedbackDone) {
824
- return;
825
- }
826
- this.submitFeedback(true, this.chatLog[idx]);
827
- this.chatLog[idx].liked = !this.chatLog[idx].liked;
828
- if (this.chatLog[idx].unliked) {
829
- this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
830
- }
831
- this.cdr.markForCheck();
832
- }
833
- handleDownClick(idx) {
834
- if (this.feedbackDone)
835
- return;
836
- this.submitFeedback(false, this.chatLog[idx]);
837
- this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
838
- if (this.chatLog[idx].liked)
839
- this.chatLog[idx].liked = !this.chatLog[idx].liked;
840
- }
841
- // handleCopyClick(index: any) {
842
- // // Copy the message to the clipboard
843
- // const contentToCopy = this.chatLog[index].message;
844
- // console.log('contentToCopy');
845
- // console.log(contentToCopy);
846
- // navigator.clipboard.writeText(contentToCopy).then(() => {
847
- // // Indicate that the message was copied
848
- // this.chatLog[index].copied = true;
849
- // this.cdr.detectChanges();
850
- // // Reset the copied state after a delay
851
- // setTimeout(() => {
852
- // this.chatLog[index].copied = false;
853
- // this.cdr.detectChanges();
854
- // }, 2000); // Reset after 2 seconds
855
- // });
856
- // }
857
- copyText(id, index) {
858
- // Get the text element
859
- var textElement = document.getElementById(id);
860
- // Create a temporary textarea element to copy the text
861
- var tempTextArea = document.createElement('textarea');
862
- tempTextArea.value = textElement.innerText;
863
- // Append the textarea to the body (necessary for the execCommand to work)
864
- document.body.appendChild(tempTextArea);
865
- // Select the text inside the textarea
866
- tempTextArea.select();
867
- // Copy the text to the clipboard
868
- document.execCommand('copy');
869
- // Remove the temporary textarea
870
- document.body.removeChild(tempTextArea);
871
- // Optionally, you can alert the user or change the button text to indicate the copy was successful
872
- // alert('Text copied to clipboard!');
873
- this.chatLog[index].copied = true;
874
- this.cdr.detectChanges();
875
- // Reset the copied state after a delay
876
- setTimeout(() => {
877
- this.chatLog[index].copied = false;
878
- this.cdr.detectChanges();
879
- }, 2000); // Reset after 2 seconds
880
- }
881
- handleCopyClick(index) {
882
- // Copy the message to the clipboard
883
- const contentToCopy = this.chatLog[index].message;
884
- const resutlt = this.copyText('messageText_' + index, index);
885
- }
886
- sanitizeHTML(html) {
887
- const doc = new DOMParser().parseFromString(html, 'text/html');
888
- // Create a new document fragment to hold the simplified content
889
- const fragment = document.createDocumentFragment();
890
- // Append the children of the body of the parsed document to the fragment
891
- Array.from(doc.body.childNodes).forEach((node) => {
892
- fragment.appendChild(node.cloneNode(true));
893
- });
894
- // Create a new div element to hold the simplified HTML
895
- const simplifiedDiv = document.createElement('div');
896
- simplifiedDiv.appendChild(fragment);
897
- // Remove complex tags or attributes as needed
898
- // Example: remove scripts
899
- simplifiedDiv
900
- .querySelectorAll('script')
901
- .forEach((script) => script.remove());
902
- // Return the simplified HTML as a string
903
- return simplifiedDiv.innerHTML;
904
- }
905
- handleEditorClick(index) {
906
- if (this.currentIndexForEditor == -1) {
907
- this.currentIndexForEditor = index;
908
- this.currentMessageForEditor = this.sanitizeHTML(this.chatLog[index].message);
909
- this.currentMessageForEditor = this.currentMessageForEditor.replace('SafeValue must use [property]=binding:', '');
910
- this.cdr.detectChanges();
911
- }
912
- else {
913
- if (this.currentIndexForEditor == index) {
914
- this.currentMessageForEditor += this.sanitizeHTML(this.chatLog[index].message);
915
- this.currentMessageForEditor = this.currentMessageForEditor.replace('SafeValue must use [property]=binding:', '');
916
- this.cdr.detectChanges();
917
- }
918
- else {
919
- this.currentIndexForEditor = index;
920
- this.currentMessageForEditor = this.sanitizeHTML(this.chatLog[index].message);
921
- this.currentMessageForEditor = this.currentMessageForEditor.replace('SafeValue must use [property]=binding:', '');
922
- this.cdr.detectChanges();
923
- }
924
- }
925
- this.chatLog[index].isEditor = true;
926
- this.cdr.detectChanges();
927
- // Reset the copied state after a delay
928
- setTimeout(() => {
929
- this.chatLog[index].isEditor = false;
930
- this.cdr.detectChanges();
931
- }, 2000); // Reset after 2 seconds
932
- this.editorsDrawer.open();
933
- const button = document.getElementById('botcloseplaygroundbutton');
934
- if (button) {
935
- button.style.display = 'none';
936
- }
937
- this.cdr.detectChanges();
938
- }
939
- scrollToBottom() {
940
- let counter = 0;
941
- const interval = setInterval(() => {
942
- this.chatMain.nativeElement.scrollTop = this.chatMain.nativeElement.scrollHeight;
943
- if (counter++ > 5)
944
- clearInterval(interval);
945
- }, 5);
946
- }
947
- handleAction(action) {
948
- console.info('incoming action from the chatbot AI');
949
- console.info(action);
950
- if (action === null || action === void 0 ? void 0 : action.content) {
951
- }
952
- }
953
- ngAfterViewInit() {
954
- // Check if the drawer is initially open and apply overflow hidden to body if so
955
- if (this.drawer.opened) {
956
- this.setBodyOverflow();
957
- }
958
- // Listen to changes in the drawer being opened or closed
959
- this.drawer.openedChange.subscribe((opened) => {
960
- if (opened) {
961
- this.setBodyOverflow();
962
- }
963
- else {
964
- this.removeBodyOverflow();
965
- }
966
- });
967
- this.drawer.openedChange.subscribe((opened) => {
968
- if (opened) {
969
- setTimeout(() => {
970
- if (this.myTextarea && this.myTextarea.nativeElement) {
971
- this.myTextarea.nativeElement.focus(); // Focus on the textarea
972
- }
973
- });
974
- }
975
- });
976
- }
977
- setBodyOverflow() {
978
- this.renderer.addClass(document.body, this.bodyOverflowClass);
979
- }
980
- removeBodyOverflow() {
981
- this.renderer.removeClass(document.body, this.bodyOverflowClass);
982
- }
983
- getSpeakersByStaffIds(ids) {
984
- const url = `${this.environment.USERS_API}/events/${this.eventId}/users/get-by-staff-ids`;
985
- fetch(url, {
986
- method: 'POST',
987
- headers: {
988
- 'Content-Type': 'application/json',
989
- Authorization: 'Bearer ' + 'your_token_here',
990
- },
991
- body: JSON.stringify(ids),
992
- })
993
- .then((response) => {
994
- if (response.ok) {
995
- return response.json(); // Parse the JSON body of the response
996
- }
997
- else {
998
- throw new Error('Network response was not ok.');
999
- }
1000
- })
1001
- .then((data) => {
1002
- if ((data === null || data === void 0 ? void 0 : data.length) > 0) {
1003
- data.forEach((speaker) => {
1004
- this.speakers[speaker.id] = speaker;
1005
- });
1006
- this.cdr.markForCheck();
1007
- }
1008
- })
1009
- .catch((err) => {
1010
- console.error('Error fetching data:', err);
1011
- this.loading = false;
1012
- });
1013
- }
1014
- performSessionAction(sessionId, action) {
1015
- this.sessionActions.next({
1016
- sessionId,
1017
- action,
1018
- });
1019
- }
1020
- addCloseBotClickEvent() {
1021
- const element = this.elementRef.nativeElement.querySelector('#closeBotNow');
1022
- if (element) {
1023
- this.renderer.listen(element, 'click', () => {
1024
- this.closeBot.next();
1025
- });
1026
- }
1027
- }
1028
- isMobileBrowser() {
1029
- return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
1030
- }
1031
- connectToUser(userId) {
1032
- this.connectWithUser.emit({
1033
- connect: !this.canDisconnect(userId),
1034
- userId,
1035
- });
1036
- setTimeout(() => {
1037
- this.fetchMyConnections().subscribe((res) => {
1038
- this.cdr.markForCheck();
1039
- });
1040
- this.fetchPendingRequests().subscribe((res) => {
1041
- this.cdr.markForCheck();
1042
- });
1043
- }, 500);
1044
- }
1045
- scheduleMeetingWithUser(user) {
1046
- this.scheduleMeeting.emit(user);
1047
- }
1048
- canConnect(userId) {
1049
- return !(this.canDisconnect(userId) ||
1050
- this.pendingRequests.find((a) => a == userId));
1051
- }
1052
- canDisconnect(userId) {
1053
- return this.myConnections.find((conn) => conn.userId == userId);
1054
- }
1055
- fetchPendingRequests() {
1056
- const headers = new HttpHeaders({
1057
- 'Content-Type': 'application/json',
1058
- apiKey: this.autogenKey,
1059
- });
1060
- return this.http
1061
- .get(`${this.environment.USERS_API}/events/${this.eventId}/connection-requests/autogen/pending-sent-requests?userId=${this.userId}`, { headers })
1062
- .pipe(switchMap((res) => {
1063
- this.pendingRequests = res;
1064
- this.cdr.markForCheck();
1065
- return of(res);
1066
- }), catchError((error) => {
1067
- console.error('Error fetching pending requests: ', error);
1068
- return of(null);
1069
- }));
1070
- }
1071
- fetchMyConnections() {
1072
- const headers = new HttpHeaders({
1073
- 'Content-Type': 'application/json',
1074
- apiKey: this.autogenKey,
1075
- });
1076
- return this.http
1077
- .get(`${this.environment.USERS_API}/events/${this.eventId}/users-connections/autogen?userId=${this.userId}`, { headers })
1078
- .pipe(switchMap((res) => {
1079
- this.myConnections = res;
1080
- this.cdr.markForCheck();
1081
- return of(res);
1082
- }), catchError((error) => {
1083
- console.error('Error fetching pending requests: ', error);
1084
- return of(null);
1085
- }));
1086
- }
1087
- // Toggle the dropdown visibility
1088
- toggleDropdown() {
1089
- if (!this.agents)
1090
- this.fetchAgents();
1091
- this.isDropdownOpen = !this.isDropdownOpen;
1092
- this.cdr.detectChanges();
1093
- }
1094
- onSelectAll(event) {
1095
- var _a;
1096
- (_a = this.agents) === null || _a === void 0 ? void 0 : _a.forEach((agent) => (agent.selected = false));
1097
- this.cdr.detectChanges();
1098
- }
1099
- onAgentChange(agent) {
1100
- //agent.selected = !agent.selected;
1101
- //console.log(agent);
1102
- let agentFound = this.agents.filter((p) => p.id == agent.id);
1103
- if (agentFound && agentFound.length > 0) {
1104
- agentFound[0].selected = !agentFound[0].selected;
1105
- this.cdr.detectChanges();
1106
- }
1107
- this.cdr.detectChanges();
1108
- }
1109
- areAllSelected() {
1110
- var _a;
1111
- return (_a = this.agents) === null || _a === void 0 ? void 0 : _a.every((agent) => !agent.selected);
1112
- }
1113
- getDropdownHeaderText() {
1114
- var _a;
1115
- const selectedAgents = (_a = this.agents) === null || _a === void 0 ? void 0 : _a.filter((agent) => agent.selected);
1116
- if (!selectedAgents) {
1117
- return 'All Agents';
1118
- }
1119
- else {
1120
- if (selectedAgents && (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) === 0) {
1121
- return 'All Agents';
1122
- }
1123
- else {
1124
- return (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) > 1
1125
- ? `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agents Selected`
1126
- : `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agent Selected`;
1127
- }
1128
- }
1129
- }
1130
- fetchAgents_http() {
1131
- this.loading = true;
1132
- const url = `${this.environment.AGENTS_API}/CoPilot/${this.botId}/active-agents`;
1133
- const headers = new HttpHeaders({
1134
- 'Content-Type': 'application/json',
1135
- });
1136
- return this.http.post(url, {}, { headers }).pipe(switchMap((res) => {
1137
- if (res) {
1138
- this.agents = res.map((agent) => (Object.assign(Object.assign({}, agent), { selected: false })));
1139
- }
1140
- this.cdr.markForCheck();
1141
- return of(res);
1142
- }), catchError((error) => {
1143
- console.error('Error fetching chatbot config: ', error);
1144
- return of(null);
1145
- }));
1146
- }
1147
- fetchContent_http() {
1148
- this.isDocInEditMode = false;
1149
- this.isContentLoaded = false;
1150
- console.log('API call function');
1151
- this.loading = true;
1152
- const conversation_id = this.conversationService.getKey(this.botId);
1153
- this.conversationId = conversation_id;
1154
- const url = `${this.environment.AGENTS_API}/ConversationDocuments?conversationId=${conversation_id}&botId=${this.botId}`;
1155
- const headers = new HttpHeaders({
1156
- 'Content-Type': 'application/json',
1157
- apiKey: 'WIz/qAm+EEmfOkFaUA/weA==',
1158
- 'domain-authority': this.domainAuthorityValue
1159
- });
1160
- return this.http.get(url, { headers }).pipe(switchMap((res) => {
1161
- if (res) {
1162
- this.isDocInEditMode = true;
1163
- this.documentContent = res;
1164
- console.log('Get API callled success');
1165
- this.isContentLoaded = true;
1166
- console.log(res);
1167
- }
1168
- this.cdr.markForCheck();
1169
- return of(res);
1170
- }), catchError((error) => {
1171
- console.error('Error fetching chatbot config DJ: ', error);
1172
- this.isDocInEditMode = false;
1173
- this.isContentLoaded = true;
1174
- if ((error === null || error === void 0 ? void 0 : error.status) == 404) {
1175
- console.log('dash');
1176
- this.isDocInEditMode = false;
1177
- this.isContentLoaded = true;
1178
- }
1179
- return of(null);
1180
- }));
1181
- }
1182
- fetchAgents() {
1183
- this.fetchAgents_http().subscribe();
1184
- }
1185
- fetchEditorContent() {
1186
- this.fetchContent_http().subscribe();
1187
- }
1188
- // events/${eventId}/users-connections
1189
- processMessageForDisplay(markdown) {
1190
- try {
1191
- // Create a custom renderer to modify <a> tags
1192
- const renderer = new marked.Renderer();
1193
- // Customize anchor tags to include target="_blank"
1194
- renderer.link = (href, title, text) => {
1195
- return `<a href="${href}" title="${title || ''}" target="_blank">${text}</a>`;
1196
- };
1197
- // Parse the markdown content to HTML using marked with the custom renderer
1198
- const markdownContent = marked.parse(markdown, { renderer: renderer });
1199
- // Sanitize the parsed HTML using Angular's DomSanitizer
1200
- const sanitizedHtml = this.sanitizer.bypassSecurityTrustHtml(markdownContent);
1201
- // Return the safe HTML content for display
1202
- return sanitizedHtml;
1203
- }
1204
- catch (error) {
1205
- console.error('Error processing markdown:', error);
1206
- return ''; // Return an empty string or handle the error appropriately
1207
- }
1208
- }
1209
- prepareHtml(markdown) {
1210
- if (!markdown || !(markdown.length > 0)) {
1211
- console.error('Input Markdown is null or empty');
1212
- return '';
1213
- }
1214
- // Convert Markdown headers (### or ##) to <strong> for bold headings
1215
- let html = markdown.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
1216
- const level = hashes.length;
1217
- if (level === 3) {
1218
- return `<h3><strong>${text}</strong></h3>`;
1219
- }
1220
- else if (level === 4) {
1221
- return `<h4><strong>${text}</strong></h4>`;
1222
- }
1223
- return `<strong>${text}</strong>`;
1224
- });
1225
- // Convert Markdown code blocks with language to preformatted HTML
1226
- html = html.replace(/```(\w+)?\n([\s\S]*?)```/g, (match, lang, code) => {
1227
- const escapedCode = this.escapeHtml(code);
1228
- const language = lang || 'plaintext';
1229
- // Create a copy button for the code block
1230
- return `
1231
- <div class="code-container">
1232
- <button id="copy-button" class="copy-button" (click)="copyToClipboard('\`${escapedCode}\`')">Copy</button>
1233
- <pre class="code_block diff"><code class="language-${language}">${escapedCode}</code></pre>
1234
- </div>`;
1235
- });
1236
- // Convert inline code (wrapped in `backticks`) to inline <code> tags
1237
- html = html.replace(/`([^`]+)`/g, '<code>$1</code>');
1238
- // Convert Markdown bold to HTML <strong>
1239
- html = html.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
1240
- // Convert numbered lists
1241
- html = html.replace(/^\d+\.\s+(.*)$/gm, '<li>$1</li>');
1242
- // Convert bullet point lists
1243
- html = html.replace(/^\-\s+(.*)$/gm, '<li>$1</li>');
1244
- // Convert Markdown links to HTML links
1245
- html = html.replace(/\[([^\]]+)]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
1246
- // Convert new lines to <br> tags for paragraphs
1247
- html = html.replace(/(?:\r\n|\r|\n)/g, '<br>');
1248
- return html;
1249
- }
1250
- // Helper function to escape HTML characters for code blocks
1251
- escapeHtml(code) {
1252
- return code
1253
- .replace(/&/g, '&amp;')
1254
- .replace(/</g, '&lt;')
1255
- .replace(/>/g, '&gt;')
1256
- .replace(/"/g, '&quot;')
1257
- .replace(/'/g, '&#039;');
1258
- }
1259
- // Function to copy text to clipboard
1260
- copyToClipboard(text) {
1261
- navigator.clipboard.writeText(text).then(() => {
1262
- alert('Code copied to clipboard!');
1263
- }, (err) => {
1264
- console.error('Could not copy text: ', err);
1265
- });
1266
- }
1267
- toggleCollapse() {
1268
- this.isCollapsed = !this.isCollapsed;
1269
- this.cdr.detectChanges();
1270
- }
1271
- toggleCollapseGraph() {
1272
- this.isCollapsedForGraph = !this.isCollapsedForGraph;
1273
- this.cdr.detectChanges();
1274
- }
1275
- toggleCollapseFGraph() {
1276
- this.isCollapsedForFGraph = !this.isCollapsedForFGraph;
1277
- this.cdr.detectChanges();
1278
- }
1279
- // Extracts the domain from a URL
1280
- getDomainName(url) {
1281
- try {
1282
- const { hostname } = new URL(url);
1283
- return hostname.replace(/^www\./, ''); // Remove 'www.' if present
1284
- }
1285
- catch (_a) {
1286
- return 'unknown';
1287
- }
1288
- }
1289
- // Generates the favicon URL
1290
- getFaviconUrl(url) {
1291
- const domain = this.getDomainName(url);
1292
- return `https://www.google.com/s2/favicons?sz=128&domain=${domain}`;
1293
- }
1294
- onCardClick(sources) {
1295
- this.currentSourcesList = sources;
1296
- this.cdr.detectChanges();
1297
- this.sourcesDrawer.open();
1298
- const button = document.getElementById('botcloseplaygroundbutton');
1299
- if (button) {
1300
- button.style.display = 'none';
1301
- }
1302
- }
1303
- openOuterEditor() {
1304
- this.fetchEditorContent();
1305
- this.editorsDrawer.open();
1306
- this.isDrawerOpen = true;
1307
- this.isShowEditorButton = false;
1308
- this.cdr.detectChanges();
1309
- const button = document.getElementById('botcloseplaygroundbutton');
1310
- if (button) {
1311
- button.style.display = 'none';
1312
- }
1313
- }
1314
- onCloseEditor() {
1315
- this.editorsDrawer.close();
1316
- this.isDrawerOpen = false;
1317
- this.isShowEditorButton = true;
1318
- this.cdr.detectChanges(); // Trigger change detection if needed
1319
- this.onDrawerClosed();
1320
- }
1321
- onCloseSource() {
1322
- this.sourcesDrawer.close();
1323
- this.isDrawerOpen = false;
1324
- this.cdr.detectChanges(); // Trigger change detection if needed
1325
- this.onDrawerClosed();
1326
- }
1327
- onDrawerClosed() {
1328
- setTimeout(() => {
1329
- this.isDrawerOpen = true;
1330
- this.cdr.detectChanges(); // Trigger change detection if needed
1331
- // Use ngClass to dynamically apply the class
1332
- const button = document.getElementById('botcloseplaygroundbutton');
1333
- if (button) {
1334
- button.style.display = 'block';
1335
- }
1336
- }, 800);
1337
- }
1338
- toggleDrawer(todo) {
1339
- this.isDrawerOpen = todo;
1340
- this.cdr.detectChanges();
1341
- this.updateButtonVisibility();
1342
- }
1343
- updateButtonVisibility() {
1344
- const button = document.getElementById('botcloseplaygroundbutton');
1345
- if (button) {
1346
- button.style.display = this.isDrawerOpen ? 'block' : 'none';
1347
- }
1348
- }
1349
- openLinkInNewTab(link) {
1350
- window.open(link, '_blank');
1351
- }
1352
- adjustTextareaHeight(event) {
1353
- try {
1354
- if (event.key === 'Enter' && !event.shiftKey) {
1355
- // Prevents a new line from being added
1356
- event.preventDefault();
1357
- }
1358
- }
1359
- catch (error) {
1360
- }
1361
- const textarea = event.target;
1362
- textarea.style.height = 'auto'; // Reset the height
1363
- textarea.style.height = `${textarea.scrollHeight}px`; // Adjust height to match content
1364
- // Ensure the height doesn't exceed the max-height set in CSS
1365
- if (textarea.scrollHeight > 150) {
1366
- textarea.style.height = `150px`; // Adjust height to match content
1367
- textarea.style.overflowY = 'auto'; // Enable scrolling if content exceeds 400px
1368
- }
1369
- else {
1370
- textarea.style.overflowY = 'hidden'; // Hide scrollbar if content is within limits
1371
- }
1372
- }
1373
- toggleWorkflows(value = null) {
1374
- if (!this.checkForCop29BotId()) {
1375
- this.botService.getWorkflowsByOrgId(this.orgId).subscribe((res) => {
1376
- this.orgWorkflows = res;
1377
- this.isWorkflowOpen = value == null ? !this.isWorkflowOpen : value;
1378
- if (!this.isWorkflowOpen) {
1379
- this.selectedWorkflow = null;
1380
- this.openWorkflowInput = false;
1381
- }
1382
- this.cdr.detectChanges();
1383
- });
1384
- }
1385
- }
1386
- initializeForm() {
1387
- var _a, _b;
1388
- // Create form controls dynamically based on selectedWorkflow.Trigger.InputSchema
1389
- const formControls = {};
1390
- if ((_b = (_a = this.selectedWorkflow) === null || _a === void 0 ? void 0 : _a.Trigger) === null || _b === void 0 ? void 0 : _b.InputSchema) {
1391
- this.selectedWorkflow.Trigger.InputSchema.forEach((input) => {
1392
- formControls[input.InputId] = [
1393
- input.Value || '',
1394
- input.Required ? Validators.required : null,
1395
- ];
1396
- });
1397
- }
1398
- // Initialize the form
1399
- this.workflowForm = this.fb.group(formControls);
1400
- }
1401
- onWorkflowSelected(workflow) {
1402
- this.selectedWorkflow = workflow;
1403
- this.initializeForm();
1404
- this.isWorkflowOpen = false;
1405
- this.openWorkflowInput = true;
1406
- }
1407
- onWorkflowSubmit() {
1408
- const container = document.getElementById('allChats');
1409
- if (this.workflowForm.valid) {
1410
- console.log(this.workflowForm.value);
1411
- var input = this.prepareHtml(this.generateMarkdown(this.selectedWorkflow.Name, this.workflowForm.value));
1412
- // update last two chatLog entries, set showWorkflowExecutionLoader = false
1413
- try {
1414
- this.chatLog[this.chatLog.length - 1]['showWorkflowExecutionLoader'] = false;
1415
- this.chatLog[this.chatLog.length - 2]['showWorkflowExecutionLoader'] = false;
1416
- }
1417
- catch (error) { }
1418
- this.chatLog.push({
1419
- type: 'user',
1420
- message: input,
1421
- time: formatNow(this.timezone),
1422
- copied: false,
1423
- isCollapsedTrue: false,
1424
- showWorkflowExecutionLoader: true,
1425
- });
1426
- console.log(input);
1427
- this.currentWorkflowActionProgress = 0;
1428
- this.currentWorkflowAction =
1429
- 'Executing ' + this.selectedWorkflow.Actions[0].Name;
1430
- this.isChatingWithAi = true;
1431
- this.executingWorkflow = true;
1432
- this.workflowExecutionDetails = {
1433
- Actions: this.selectedWorkflow.Actions,
1434
- Inputs: this.workflowForm.value,
1435
- workflowInputs: this.workflowForm.value,
1436
- WorkflowName: this.selectedWorkflow.Name,
1437
- };
1438
- this.currentWorkflowExecutionDetails = this.workflowExecutionDetails;
1439
- this.scrollToBottom();
1440
- this.cdr.detectChanges();
1441
- // execute the ask endpoint with workflow input
1442
- this.makeAskRequest(input, this.agents, this.conversationKey, '', null, this.selectedWorkflow['_id'], this.workflowForm.value);
1443
- }
1444
- }
1445
- makeAskRequest(inputMsg, agents, conversationId, msg, chat, workflowId, workflow_inputs) {
1446
- var _a;
1447
- var url = `${this.environment.BASE_URL}/ai/ask`;
1448
- var body = {
1449
- user_question: inputMsg,
1450
- user_id: this.userId,
1451
- bot_id: this.botId,
1452
- message_id: this.conversationService.generateKey(),
1453
- session_id: this.conSessionKey,
1454
- agents: (_a = agents === null || agents === void 0 ? void 0 : agents.filter((p) => p.selected).map((p) => p.id)) !== null && _a !== void 0 ? _a : [],
1455
- conversation_id: conversationId,
1456
- first_name: this.firstName,
1457
- last_name: this.lastName
1458
- };
1459
- if (workflowId) {
1460
- body['workflow_id'] = workflowId;
1461
- body['workflow_inputs'] = workflow_inputs;
1462
- }
1463
- fetch(url, {
1464
- method: 'POST',
1465
- headers: {
1466
- 'Content-Type': 'application/json',
1467
- Authorization: 'Bearer ' + this.s27Token,
1468
- 'x-api-key': this.apiKey,
1469
- 'hive-bot-id': this.botId,
1470
- 'domain-authority': this.domainAuthorityValue
1471
- },
1472
- body: JSON.stringify(body),
1473
- })
1474
- .then((response) => {
1475
- if (response.status === 401 || response.status === 403) {
1476
- this.is401 = true;
1477
- this.refreshToken.emit();
1478
- // If `msg` and `chat` exist, handle them
1479
- if (msg && chat) {
1480
- this.msg = msg;
1481
- this.chat = chat;
1482
- this.isFetchDataFor = true;
1483
- }
1484
- }
1485
- else {
1486
- this.is401 = false;
1487
- }
1488
- return response.json();
1489
- })
1490
- .then((data) => {
1491
- console.log(data);
1492
- // Additional response handling if needed
1493
- })
1494
- .catch((err) => {
1495
- console.error('Error: ', err);
1496
- this.isChatingWithAi = false;
1497
- });
1498
- this.input = '';
1499
- this.selectedWorkflow = null;
1500
- this.openWorkflowInput = false;
1501
- this.isWorkflowOpen = false;
1502
- this.scrollToBottom();
1503
- this.cdr.markForCheck();
1504
- }
1505
- makeAskRequestold(inputMsg, agents, conversationId, msg, chat, workflowId, workflow_inputs) {
1506
- var _a;
1507
- const url = `${this.environment.BASE_URL}/ai/ask`;
1508
- const body = {
1509
- user_question: inputMsg,
1510
- user_id: this.userId,
1511
- bot_id: this.botId,
1512
- message_id: this.conversationService.generateKey(),
1513
- agents: (_a = agents === null || agents === void 0 ? void 0 : agents.filter((p) => p.selected).map((p) => p.id)) !== null && _a !== void 0 ? _a : [],
1514
- conversation_id: conversationId,
1515
- first_name: this.firstName,
1516
- last_name: this.lastName,
1517
- };
1518
- if (workflowId) {
1519
- body['workflow_id'] = workflowId;
1520
- body['workflow_inputs'] = workflow_inputs;
1521
- }
1522
- const headers = new HttpHeaders({
1523
- 'Content-Type': 'application/json',
1524
- 'x-api-key': this.apiKey,
1525
- 'hive-bot-id': this.botId,
1526
- 'domain-authority': this.domainAuthorityValue,
1527
- });
1528
- this.http.post(url, body, { headers })
1529
- .subscribe({
1530
- next: (data) => {
1531
- console.log(data);
1532
- // Additional response handling if needed
1533
- },
1534
- error: (err) => {
1535
- console.error('Error: ', err);
1536
- this.isChatingWithAi = false;
1537
- },
1538
- });
1539
- this.input = '';
1540
- this.selectedWorkflow = null;
1541
- this.openWorkflowInput = false;
1542
- this.isWorkflowOpen = false;
1543
- this.scrollToBottom();
1544
- this.cdr.markForCheck();
1545
- }
1546
- generateMarkdown(title, obj) {
1547
- var _a;
1548
- // Initialize markdown with the title
1549
- let markdown = `## ${title}\n`;
1550
- // Loop through the object and append the field names and values
1551
- for (const [key, value] of Object.entries(obj)) {
1552
- var key_label = ((_a = this.selectedWorkflow.Trigger.InputSchema.find((input) => input.InputId === key)) === null || _a === void 0 ? void 0 : _a.Label) || key;
1553
- markdown += `- **${key_label}**: ${value}\n`;
1554
- }
1555
- return markdown;
1556
- }
1557
- showWorkflowHistoryDetails(workflow_id) {
1558
- if (!workflow_id) {
1559
- this.workflowExecutionDetails = this.currentWorkflowExecutionDetails;
1560
- this.showWorkflowExecutionDetails = true;
1561
- this.cdr.detectChanges();
1562
- return;
1563
- }
1564
- this.botService.getWorkflowExecutionById(workflow_id).subscribe((res) => {
1565
- if (res && res.Actions && Array.isArray(res.Actions)) {
1566
- res.Actions = res.Actions.map((action) => {
1567
- if (action.InsertTimeStamp) {
1568
- action.InsertTimeStamp = formatTimeStamps(this.timezone, action.InsertTimeStamp);
1569
- }
1570
- return action;
1571
- });
1572
- }
1573
- res.InsertTimeStamp = formatTimeStamps(this.timezone, res.InsertTimeStamp);
1574
- this.workflowExecutionDetails = res;
1575
- this.showWorkflowExecutionDetails = true;
1576
- this.cdr.detectChanges();
1577
- });
1578
- }
1579
- closeModal() {
1580
- this.showWorkflowExecutionDetails = false;
1581
- }
1582
- objectToArray(obj) {
1583
- return Object.keys(obj).map((key) => ({ key, value: obj[key] }));
1584
- }
1585
- startNewConversation() {
1586
- this.conversationKey = this.conversationService.getKey(this.botId, true);
1587
- this.chatLog = [this.chatLog[0]];
1588
- this.isChatingWithAi = false;
1589
- setTimeout(() => {
1590
- this.initializeSocket();
1591
- }, 200);
1592
- this.scrollToBottom();
1593
- this.cdr.detectChanges();
1594
- }
1595
- initializeSpeechRecognizer(token) {
1596
- this.speechConfig = SpeechSDK.SpeechConfig.fromAuthorizationToken(token, this.region);
1597
- const audioConfig = SpeechSDK.AudioConfig.fromDefaultMicrophoneInput();
1598
- this.recognizer = new SpeechSDK.SpeechRecognizer(this.speechConfig, audioConfig);
1599
- this.recognizer.recognizing = (s, e) => {
1600
- if (e.result.reason === SpeechSDK.ResultReason.RecognizingSpeech) {
1601
- this.input = e.result.text;
1602
- console.log(`Recognizing: ${e.result.text}`);
1603
- this.cdr.markForCheck();
1604
- }
1605
- };
1606
- this.recognizer.recognized = (s, e) => {
1607
- if (e.result.reason === SpeechSDK.ResultReason.RecognizedSpeech) {
1608
- this.input = e.result.text;
1609
- console.log(`Recognized: ${e.result.text}`);
1610
- this.toggleRecording();
1611
- this.cdr.markForCheck();
1612
- }
1613
- };
1614
- this.recognizer.canceled = (s, e) => {
1615
- console.error('Canceled: ', e.errorDetails);
1616
- };
1617
- this.recognizer.sessionStopped = (s, e) => {
1618
- console.log('Session stopped.');
1619
- this.recognizer.stopContinuousRecognitionAsync();
1620
- this.fetchData();
1621
- };
1622
- }
1623
- toggleRecording() {
1624
- this.isRecording = !this.isRecording;
1625
- if (this.isRecording) {
1626
- this.startRecognition();
1627
- }
1628
- else {
1629
- this.stopRecognition();
1630
- }
1631
- }
1632
- startRecognition() {
1633
- this.recognizer.startContinuousRecognitionAsync();
1634
- }
1635
- stopRecognition() {
1636
- this.recognizer.stopContinuousRecognitionAsync();
1637
- }
1638
- checkForCop29BotId() {
1639
- return this.botId == '66fa3f276c5d71e2717bfea8' || this.botId == '671633545652dd78efec848d';
1640
- }
1641
- getLatestTime(time) {
1642
- if (time) {
1643
- return time;
1644
- }
1645
- return new Date().toLocaleTimeString([], {
1646
- hour: '2-digit',
1647
- minute: '2-digit',
1648
- }); // returns current time in 'shortTime' format
1649
- }
1650
- }
1651
- ChatDrawerComponent.decorators = [
1652
- { type: Component, args: [{
1653
- selector: 'hivegpt-chat-drawer-package',
1654
- template: "<button *ngIf=\"isShowEditorButton && !checkForCop29BotId()\" (click)=\"openOuterEditor()\" class=\"fixed-btn\">\r\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\r\n create\r\n </span>\r\n Editor\r\n</button>\r\n\r\n<button *ngIf=\"!isShowEditorButton\" (click)=\"onCloseEditor()\" class=\"fixed-btn-close\">\r\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\r\n close\r\n </span>\r\n Close\r\n</button>\r\n\r\n<mat-drawer-container class=\"hivegpt-chat-wrapper\" [ngClass]=\"{ 'mat-drawer-container-has-open': isDrawerOpen }\"\r\n [class.ios-device]=\"isIOSDevice\" [hasBackdrop]=\"hasBackdropValue\">\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 <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 (click)=\"startNewConversation()\" class=\"new-conversationbutton\">\r\n New Chat <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14.061\" height=\"14.261\"\r\n viewBox=\"0 0 14.061 14.261\">\r\n <path id=\"Path_164\" data-name=\"Path 164\"\r\n d=\"M10.146,5.075H4.531A1.544,1.544,0,0,0,3,6.631v7.262A1.544,1.544,0,0,0,4.531,15.45h7.146a1.544,1.544,0,0,0,1.531-1.556V8.187m-7.146,4.15L15.25,3m0,0H11.677M15.25,3V6.631\"\r\n transform=\"translate(-2.25 -1.939)\" fill=\"none\" stroke=\"#06f\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" stroke-width=\"1.5\" />\r\n </svg>\r\n\r\n </span>\r\n </div>\r\n <div class=\"sticky-header-chat\">\r\n <div class=\"title_chat\">\r\n <h2>\r\n <span>\r\n {{ botName }}\r\n <svg *ngIf=\"!checkForCop29BotId()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"31.499\" height=\"31.501\"\r\n viewBox=\"0 0 31.499 31.501\">\r\n <path id=\"Icon_ion-shield-checkmark\" data-name=\"Icon ion-shield-checkmark\"\r\n d=\"M33.685,7.83a1.125,1.125,0,0,0-.925-1.036,49.227,49.227,0,0,1-14.3-4.444,1.125,1.125,0,0,0-.927,0A49.226,49.226,0,0,1,3.24,6.794,1.125,1.125,0,0,0,2.315,7.83a27.621,27.621,0,0,0,1.718,11.9A24.572,24.572,0,0,0,9.07,27.641a25.712,25.712,0,0,0,8.513,6.028,1.125,1.125,0,0,0,.844,0,25.712,25.712,0,0,0,8.513-6.028,24.572,24.572,0,0,0,5.027-7.911,27.621,27.621,0,0,0,1.718-11.9Zm-9.211,5.281-7.791,9a1.125,1.125,0,0,1-.8.389h-.046a1.125,1.125,0,0,1-.788-.322L11.587,18.79a1.125,1.125,0,1,1,1.575-1.607l2.6,2.552,7.01-8.1a1.125,1.125,0,0,1,1.7,1.472Z\"\r\n transform=\"translate(-2.25 -2.25)\" fill=\"#06f\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"!checkForCop29BotId()\">\r\n <p class=\"small-title\">AI-powered <span>copilot</span></p>\r\n </span>\r\n </h2>\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\"> More Creative </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\"> More Balanced </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\"> More Precise </span>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <!-- chattype -->\r\n <div id=\"allChats\" class=\"chat bot\" *ngFor=\"let chat of chatLog; let i = index\">\r\n <div class=\"chat-box\">\r\n <div class=\"message\">\r\n <div class=\"time-cta\" [ngClass]=\"{\r\n 'time-cta din': showFeedBackIconsIndex === i,\r\n 'time-cta': showFeedBackIconsIndex != i\r\n }\">\r\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'ai'\">\r\n <!-- <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\" /> -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\">\r\n <g id=\"Group_121\" data-name=\"Group 121\" transform=\"translate(4843 -371)\">\r\n <g id=\"Ellipse_18\" data-name=\"Ellipse 18\" transform=\"translate(-4843 371)\" fill=\"#fcfcfc\"\r\n stroke=\"#dfdfdf\" stroke-width=\"1\">\r\n <circle cx=\"22\" cy=\"22\" r=\"22\" stroke=\"none\" />\r\n <circle cx=\"22\" cy=\"22\" r=\"21.5\" fill=\"none\" />\r\n </g>\r\n <g id=\"Group_120\" data-name=\"Group 120\" transform=\"translate(-4835.141 378.855)\">\r\n <g id=\"Group_1\" data-name=\"Group 1\" transform=\"translate(7.29 0)\">\r\n <path id=\"Path_1\" data-name=\"Path 1\"\r\n d=\"M93.774,41.324,98.757,44.2v5.753l-4.983,2.877-4.983-2.877V44.2l4.983-2.877m0-2.034L87.03,43.183V50.97l6.744,3.893,6.744-3.893V43.183L93.774,39.29Z\"\r\n transform=\"translate(-87.03 -39.29)\" fill=\"gray\" />\r\n </g>\r\n <g id=\"Group_2\" data-name=\"Group 2\" transform=\"translate(0 12.717)\">\r\n <path id=\"Path_2\" data-name=\"Path 2\"\r\n d=\"M52.374,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L45.63,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\r\n transform=\"translate(-45.63 -111.51)\" fill=\"gray\" />\r\n </g>\r\n <g id=\"Group_3\" data-name=\"Group 3\" transform=\"translate(14.793 12.717)\">\r\n <path id=\"Path_3\" data-name=\"Path 3\"\r\n d=\"M136.384,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L129.64,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\r\n transform=\"translate(-129.64 -111.51)\" fill=\"gray\" />\r\n </g>\r\n </g>\r\n </g>\r\n </svg>\r\n\r\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\r\n <span>{{ 'Assistant' }}</span> {{ chat?.time }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'user'\">\r\n <div class=\"user-Box\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\">\r\n <g id=\"Ellipse_17\" data-name=\"Ellipse 17\" fill=\"#fcfcfc\" stroke=\"#dfdfdf\" stroke-width=\"1\">\r\n <circle cx=\"22\" cy=\"22\" r=\"22\" stroke=\"none\" />\r\n <circle cx=\"22\" cy=\"22\" r=\"21.5\" fill=\"none\" />\r\n </g>\r\n <path id=\"Icon_grommet-user-expert\" data-name=\"Icon grommet-user-expert\"\r\n d=\"M14.24,20.443a9.472,9.472,0,1,0-9.472-9.472,9.472,9.472,0,0,0,9.472,9.472Zm10.329,5.225c-1.957-3.347-6.516-5.225-10.329-5.225-3.145,0-8.046.805-10.761,5.225\"\r\n transform=\"translate(7.976 8.416)\" fill=\"none\" stroke=\"gray\" stroke-width=\"1.5\" />\r\n </svg>\r\n\r\n <div class=\"dateTime\"><span>You</span> {{ chat?.time }}\r\n </div>\r\n </div>\r\n <div class=\"bards\">\r\n <div class=\"bars\" *ngIf=\"chat?.WorkflowExecutionId || chat?.showWorkflowExecutionLoader\">\r\n <button class=\"icon-button\" (click)=\"showWorkflowHistoryDetails(chat.WorkflowExecutionId)\">\r\n <i class=\"fas fa-bars\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"researchingCard\">\r\n <div *ngIf=\"\r\n (chat?.searchTerms && chat?.searchTerms.length > 0) ||\r\n (chat?.sourcesList && chat?.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\r\n <i id=\"toggleIcon\" class=\"toggle-icon ml-2 fa\" [ngClass]=\"{\r\n 'fa-chevron-down': isCollapsed,\r\n 'fa-chevron-up': !isCollapsed\r\n }\"></i></span>\r\n </div>\r\n <div *ngIf=\"chat?.searchTerms && chat?.searchTerms.length > 0\" [ngClass]=\"{ collapse: isCollapsed }\">\r\n <ul class=\"list-group list-group-flush uptList\">\r\n <li *ngFor=\"let term of chat?.searchTerms\" class=\"list-group-item\">\r\n Searching for\r\n <strong>{{ term }}</strong>\r\n </li>\r\n </ul>\r\n\r\n <h5 class=\"mt-2\" *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\">\r\n <i class=\"bx bx-unite\"></i> Sources\r\n </h5>\r\n <div class=\"sources-container\" *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\">\r\n <div class=\"source-card\" *ngFor=\"\r\n let source of chat?.displayedSources;\r\n let i = index\r\n \">\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\" [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)\">\r\n {{ source.title }}\r\n </h5>\r\n <p (click)=\"openLinkInNewTab(source.link)\">\r\n {{ source.desc }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"\r\n chat?.remainingSources &&\r\n chat?.remainingSources.length > 0\r\n \">\r\n <div class=\"source-card\" (click)=\"onCardClick(chat?.sourcesList)\">\r\n <div>\r\n <div class=\"source-title\">\r\n <img *ngFor=\"\r\n let source of chat?.remainingSources;\r\n let i = index\r\n \" class=\"relative block\" [src]=\"getFaviconUrl(source.link)\"\r\n [alt]=\"getDomainName(source.link) + ' favicon'\" />\r\n </div>\r\n <div class=\"source-url\">\r\n View {{ chat?.remainingSources.length }} more\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\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 <div id=\"messageText_{{ i }}\">\r\n <p *ngIf=\"chat?.type === 'ai' || chat?.type === 'user'\" [ngClass]=\"{\r\n 'SearchTitle ai': chat?.type === 'ai',\r\n 'SearchTitle user': chat?.type === 'user'\r\n }\" [ngStyle]=\"{\r\n background: chat?.type === 'ai' && messageTextColorAi ? messageTextColorAi : (chat?.type === 'user' && messageTextColorUser ? messageTextColorUser : 'defaultBackground'),\r\n color: chat?.type === 'ai' && messageTextColorAi ? messageTextColorAi : (chat?.type === 'user' && messageTextColorUser ? messageTextColorUser : 'defaultColor')\r\n }\" [innerHTML]=\"chat?.message\">\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-container\" *ngIf=\"chat?.showWorkflowExecutionLoader\">\r\n <div class=\"circular-loader\">\r\n <div class=\"loader-spinner\" *ngIf=\"currentWorkflowActionProgress < 100\"\r\n [ngStyle]=\"{ 'transform': 'rotate(' + (percentage * 3.6) + 'deg)' }\">\r\n </div>\r\n <div class=\"checkmark\" *ngIf=\"currentWorkflowActionProgress == 100\">\r\n <svg viewBox=\"0 0 52 52\">\r\n <circle class=\"checkmark-circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\r\n <path class=\"checkmark-check\" fill=\"none\" d=\"M14 27l7 7 16-16\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"loader-text\" *ngIf=\"currentWorkflowActionProgress < 100\">{{\r\n currentWorkflowActionProgress\r\n }}%</div>\r\n </div>\r\n <div class=\"loader-label\">\r\n {{currentWorkflowAction}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"exicution mt-2\" *ngIf=\"\r\n chat?.type === 'ai' &&\r\n chat?.graphs &&\r\n chat?.graphs.length > 0\r\n \">\r\n <h5 *ngIf=\"chat?.type === 'ai'\">\r\n <i class=\"bx bx-network-chart\"></i> Graphs\r\n <i (click)=\"toggleCollapseFGraph()\" class=\"toggle-icon ml-2 fa\" [ngClass]=\"{\r\n 'fas fa-chevron-down': isCollapsedForFGraph,\r\n 'fas fa-chevron-up': !isCollapsedForFGraph\r\n }\"></i>\r\n </h5>\r\n <img *ngFor=\"let image of chat?.graphs\" class=\"graph-img\"\r\n [ngClass]=\"{ collapse: isCollapsedForFGraph }\" [src]=\"image\" alt=\"\" />\r\n </div>\r\n <ng-container *ngIf=\"!checkForCop29BotId()\">\r\n <div class=\"exicution mt-2\" *ngIf=\"\r\n chat?.type === 'ai' &&\r\n chat?.executionGraphs &&\r\n chat?.executionGraphs?.length > 0\r\n \">\r\n <h5 *ngIf=\"chat?.type === 'ai'\">\r\n <i class=\"bx bx-network-chart\"></i> Execution Path Diagram\r\n For Data Visualization Workflow\r\n <i (click)=\"toggleCollapseGraph()\" class=\"toggle-icon ml-2 fa\" [ngClass]=\"{\r\n 'fas fa-chevron-down': isCollapsedForGraph,\r\n 'fas fa-chevron-up': !isCollapsedForGraph\r\n }\"></i>\r\n </h5>\r\n <img *ngFor=\"let image of chat?.executionGraphs\" class=\"graph-img\"\r\n [ngClass]=\"{ collapse: isCollapsedForGraph }\" [src]=\"image\" alt=\"\" />\r\n </div>\r\n </ng-container>\r\n <div class=\"cta\" *ngIf=\"chat?.type === 'ai' && i > 0\">\r\n <div class=\"copyBox\" title=\"Copy\"\r\n [ngClass]=\"showFeedBackIconsIndex == i ? 'show-always' : 'show-hover'\">\r\n <button title=\"{{ chat?.copied ? 'Copied!' : 'Copy' }}\" class=\"copy\" [class.active]=\"chat?.copied\"\r\n (click)=\"handleCopyClick(i)\">\r\n <i *ngIf=\"chat?.copied\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" 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\" fill=\"#566563\" />\r\n </svg>\r\n </i>\r\n\r\n <i *ngIf=\"!chat?.copied\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" 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\r\n <button *ngIf=\"!checkForCop29BotId()\" class=\"up copy\"\r\n title=\"{{ chat?.isEditor ? 'Added!' : 'Add to editor' }}\" (click)=\"handleEditorClick(i)\">\r\n <svg *ngIf=\"!chat?.isEditor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20.152\" height=\"20.152\"\r\n viewBox=\"0 0 20.152 20.152\">\r\n <g id=\"Icon_feather-edit\" data-name=\"Icon feather-edit\" transform=\"translate(-2.5 -2.166)\">\r\n <path id=\"Path_166\" data-name=\"Path 166\"\r\n d=\"M11.5,6H4.889A1.889,1.889,0,0,0,3,7.889v13.22A1.889,1.889,0,0,0,4.889,23h13.22A1.889,1.889,0,0,0,20,21.108V14.5\"\r\n transform=\"translate(0 -1.179)\" fill=\"none\" stroke=\"#393939\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" stroke-width=\"1\" />\r\n <path id=\"Path_167\" data-name=\"Path 167\"\r\n d=\"M21.915,3.4a2,2,0,0,1,2.833,2.833l-8.971,8.971L12,16.152l.944-3.777Z\"\r\n transform=\"translate(-3.334 0)\" fill=\"none\" stroke=\"#393939\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" stroke-width=\"1\" />\r\n </g>\r\n </svg>\r\n\r\n <i *ngIf=\"chat?.isEditor\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" 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\" fill=\"#566563\" />\r\n </svg>\r\n </i>\r\n </button>\r\n\r\n <button class=\"up copy\" title=\"Like\" [class.active]=\"chat?.liked\" (click)=\"handleUpClick(i)\">\r\n <i *ngIf=\"chat?.liked\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" 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\" 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\" 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\" 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 </div>\r\n </div>\r\n <div class=\"Related mt-2\"\r\n *ngIf=\"showFeedBackIconsIndex === i && !isChatingWithAi && chat?.relatedListItems && chat?.relatedListItems.length > 0\">\r\n <h5 *ngIf=\"chat?.type === 'ai'\">\r\n <i class=\"bx bx-list-check\"></i> Related\r\n </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 chat?.relatedListItems\">\r\n <li (click)=\"fetchDataFor(item, chat)\">{{ item }}</li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\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 </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 &nbsp;\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"chat?.suggestions?.length\">\r\n <h4 class=\"labelChat\">\r\n Here are some things EventsGPT Copilot can help you do:\r\n </h4>\r\n <div class=\"cta_suggestions\">\r\n <button *ngFor=\"let suggestion of chat?.suggestions\" (click)=\"sendMessageWithTile(suggestion)\">\r\n <ng-container *ngIf=\"suggestion\">{{\r\n suggestion\r\n }}</ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"\r\n chat?.action?.section_id == 'company_search' ||\r\n chat?.action?.section_id == 'user_search' ||\r\n chat?.action?.section_id == 'industry_company_search'\r\n \">\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\" [currentUserId]=\"userId\"\r\n [videoObj]=\"user?.userVideosModel\" [user]=\"user\" [eventId]=\"eventId\" type=\"1\">\r\n </app-video-player>\r\n </ng-conatiner>\r\n </div>\r\n\r\n <div class=\"noPhoto\" *ngIf=\"!user?.photoPath && !user.userVideosModel\">\r\n <h3>\r\n {{ user.firstName | slice: 0:1\r\n }}{{ user.lastName | slice: 0:1 }}\r\n </h3>\r\n </div>\r\n <div class=\"overlymask\" *ngIf=\"!user.userVideosModel\"></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\" (click)=\"connectToUser(user.userId)\">\r\n {{\r\n canConnect(user.userId)\r\n ? 'Connect'\r\n : canDisconnect(user.userId)\r\n ? 'Disconnect'\r\n : 'Request\r\n Sent'\r\n }}\r\n </button>\r\n <button class=\"schedulebtn\" (click)=\"scheduleMeetingWithUser(user)\">\r\n Schedule\r\n </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\">\r\n <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\">\r\n <span class=\"material-icons notranslate\">\r\n 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 {{\r\n upcomingSession.dateTimeRange.start\r\n | date\r\n : 'MM-dd-yyyy\r\n HH:mm'\r\n : 'UTC'\r\n }}\r\n -\r\n {{\r\n upcomingSession.dateTimeRange.end\r\n | date: 'MM-dd-yyyy HH:mm':'UTC'\r\n }}\r\n {{ 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 (click)=\"\r\n performSessionAction(\r\n upcomingSession.id,\r\n 'view-session'\r\n )\r\n \" class=\"s27-btn-icon body-text-color\"\r\n title=\"View Session Information: Introduction to the Imaging Radar Academy\">\r\n <span class=\"material-icons notranslate\">\r\n remove_red_eye\r\n </span>\r\n </button>\r\n\r\n <button (click)=\"\r\n performSessionAction(\r\n upcomingSession.id,\r\n 'add-to-agenda'\r\n )\r\n \" class=\"s27-btn-icon body-text-color\">\r\n <span class=\"material-icons notranslate\"\r\n title=\"Add Session: Introduction to the Imaging Radar Academy to My agendaa\">\r\n event_available\r\n </span>\r\n </button>\r\n <!---->\r\n <!---->\r\n <!---->\r\n <!---->\r\n\r\n <button (click)=\"\r\n performSessionAction(upcomingSession.id, 'play')\r\n \" class=\"s27-btn-icon body-text-color\" title=\"Copy session link to share\">\r\n <span class=\"material-icons notranslate\">\r\n play_circle_outline\r\n </span>\r\n </button>\r\n <!---->\r\n </div>\r\n </div>\r\n <h2 class=\"body-text-color\">\r\n {{ upcomingSession.title }}\r\n </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\" *ngFor=\"let speakerId of upcomingSession.speakers\">\r\n <li class=\"\">\r\n <div class=\"image\" title=\"Blair Wunderlich\">\r\n <img alt=\"Blair Wunderlich\" [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 }}\r\n </div>\r\n <div class=\"color-secondary fs-xxs\">\r\n {{ speakers[speakerId]?.jobTitle }}\r\n </div>\r\n <div class=\"color-secondary fs-xxs\">\r\n {{ speakers[speakerId]?.company }}\r\n </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 && !executingWorkflow\">\r\n <div class=\"chat-box\">\r\n <div class=\"message\">\r\n <div class=\"time-cta\">\r\n <div class=\"Icon_TimeSTamp\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\">\r\n <g id=\"Group_121\" data-name=\"Group 121\" transform=\"translate(4843 -371)\">\r\n <g id=\"Ellipse_18\" data-name=\"Ellipse 18\" transform=\"translate(-4843 371)\" fill=\"#fcfcfc\"\r\n stroke=\"#dfdfdf\" stroke-width=\"1\">\r\n <circle cx=\"22\" cy=\"22\" r=\"22\" stroke=\"none\" />\r\n <circle cx=\"22\" cy=\"22\" r=\"21.5\" fill=\"none\" />\r\n </g>\r\n <g id=\"Group_120\" data-name=\"Group 120\" transform=\"translate(-4835.141 378.855)\">\r\n <g id=\"Group_1\" data-name=\"Group 1\" transform=\"translate(7.29 0)\">\r\n <path id=\"Path_1\" data-name=\"Path 1\"\r\n d=\"M93.774,41.324,98.757,44.2v5.753l-4.983,2.877-4.983-2.877V44.2l4.983-2.877m0-2.034L87.03,43.183V50.97l6.744,3.893,6.744-3.893V43.183L93.774,39.29Z\"\r\n transform=\"translate(-87.03 -39.29)\" fill=\"gray\" />\r\n </g>\r\n <g id=\"Group_2\" data-name=\"Group 2\" transform=\"translate(0 12.717)\">\r\n <path id=\"Path_2\" data-name=\"Path 2\"\r\n d=\"M52.374,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L45.63,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\r\n transform=\"translate(-45.63 -111.51)\" fill=\"gray\" />\r\n </g>\r\n <g id=\"Group_3\" data-name=\"Group 3\" transform=\"translate(14.793 12.717)\">\r\n <path id=\"Path_3\" data-name=\"Path 3\"\r\n d=\"M136.384,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L129.64,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\r\n transform=\"translate(-129.64 -111.51)\" fill=\"gray\" />\r\n </g>\r\n </g>\r\n </g>\r\n </svg>\r\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\r\n <span> {{ 'Assistant' }}</span> {{ this.getLatestTime(chat?.time)}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"loaderbox\">\r\n <div class='loader-pkg'>\r\n <div class='loader--dot'></div>\r\n <div class='loader--dot'></div>\r\n <div class='loader--dot'></div>\r\n <div class='loader--dot'></div>\r\n <div class='loader--dot'></div>\r\n <div class='loader--dot'></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"chat bot\" *ngIf=\"loading\">\r\n <div class=\"chat-box\">\r\n <div class=\"message\">\r\n\r\n\r\n <div class=\"time-cta\">\r\n <div class=\"Icon_TimeSTamp\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\">\r\n <g id=\"Group_121\" data-name=\"Group 121\" transform=\"translate(4843 -371)\">\r\n <g id=\"Ellipse_18\" data-name=\"Ellipse 18\" transform=\"translate(-4843 371)\" fill=\"#fcfcfc\"\r\n stroke=\"#dfdfdf\" stroke-width=\"1\">\r\n <circle cx=\"22\" cy=\"22\" r=\"22\" stroke=\"none\" />\r\n <circle cx=\"22\" cy=\"22\" r=\"21.5\" fill=\"none\" />\r\n </g>\r\n <g id=\"Group_120\" data-name=\"Group 120\" transform=\"translate(-4835.141 378.855)\">\r\n <g id=\"Group_1\" data-name=\"Group 1\" transform=\"translate(7.29 0)\">\r\n <path id=\"Path_1\" data-name=\"Path 1\"\r\n d=\"M93.774,41.324,98.757,44.2v5.753l-4.983,2.877-4.983-2.877V44.2l4.983-2.877m0-2.034L87.03,43.183V50.97l6.744,3.893,6.744-3.893V43.183L93.774,39.29Z\"\r\n transform=\"translate(-87.03 -39.29)\" fill=\"gray\" />\r\n </g>\r\n <g id=\"Group_2\" data-name=\"Group 2\" transform=\"translate(0 12.717)\">\r\n <path id=\"Path_2\" data-name=\"Path 2\"\r\n d=\"M52.374,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L45.63,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\r\n transform=\"translate(-45.63 -111.51)\" fill=\"gray\" />\r\n </g>\r\n <g id=\"Group_3\" data-name=\"Group 3\" transform=\"translate(14.793 12.717)\">\r\n <path id=\"Path_3\" data-name=\"Path 3\"\r\n d=\"M136.384,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L129.64,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\r\n transform=\"translate(-129.64 -111.51)\" fill=\"gray\" />\r\n </g>\r\n </g>\r\n </g>\r\n </svg>\r\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\r\n <span>{{ 'Loading ...' }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"loaderbox\">\r\n <div class='loader-pkg'>\r\n <div class='loader--dot'></div>\r\n <div class='loader--dot'></div>\r\n <div class='loader--dot'></div>\r\n <div class='loader--dot'></div>\r\n <div class='loader--dot'></div>\r\n <div class='loader--dot'></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div #chatMain></div> -->\r\n <div *ngIf=\"openWorkflowInput && selectedWorkflow && !executingWorkflow\" class=\"chatFooterWrapper\">\r\n <!-- new UI for Chat Message Section by Amit -->\r\n <div class=\"chat-footer-upt\">\r\n <div class=\"topinfo-containerbox\">\r\n <div class=\"agents_note_wrapper\">\r\n <div>\r\n <h6>{{selectedWorkflow?.Name}}</h6>\r\n {{selectedWorkflow?.Description}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"agents_note_wrapper\">\r\n <button mat-icon-button class=\"closeButtonSource\" (click)=\"toggleWorkflows(false)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"bottombox-wrapper\">\r\n <!-- here i need to loop through all the input fields selectedWorkflow.Trigger.InputSchema and render the input fields -->\r\n <!-- Form for Workflow Inputs -->\r\n <form [formGroup]=\"workflowForm\" (ngSubmit)=\"onWorkflowSubmit()\" class=\"form-container\">\r\n <div *ngFor=\"let input of selectedWorkflow?.Trigger?.InputSchema\" class=\"form-group\">\r\n <label>{{ input.Label }}</label>\r\n\r\n <!-- Handle Text Input or Text Area based on requirement -->\r\n <textarea *ngIf=\"input.Type === 'string'\" formControlName=\"{{input.InputId}}\"\r\n [placeholder]=\"input.Placeholder\" [rows]=\"2\" [required]=\"input.Required\"\r\n class=\"form-control\"></textarea>\r\n\r\n <!-- Dropdown for Select Options -->\r\n <select *ngIf=\"input.Type === 'select'\" formControlName=\"{{input.InputId}}\" class=\"form-control\">\r\n <option *ngFor=\"let option of input.Options\" [value]=\"option.Value\">{{\r\n option.Label }}</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Submit button aligned to the right -->\r\n <div class=\"form-group\">\r\n <button type=\"submit\" class=\"btn btn-primary submit-button\">Submit</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- new UI for Chat Message Section by Amit -->\r\n </div>\r\n <div *ngIf=\"!openWorkflowInput\" class=\"chatFooterWrapper\">\r\n <!-- new UI for Chat Message Section by Amit -->\r\n <div class=\"chat-footer-upt\">\r\n <div class=\"topinfo-containerbox\" *ngIf=\"!checkForCop29BotId()\">\r\n <div class=\"agents_note_wrapper\">\r\n\r\n <div class=\"agents-dropdown-wrapper\">\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\" stroke=\"currentColor\"\r\n 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 </div>\r\n\r\n </div>\r\n\r\n <div class=\"agents_note_wrapper\">\r\n\r\n <div class=\"agents-dropdown-wrapper\">\r\n <div class=\"dropdown-wrapper\" (click)=\"toggleWorkflows()\">\r\n <div class=\"dropdown-header\">\r\n <svg stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 256 256\"\r\n class=\"h-5 w-5\" height=\"1.3em\" width=\"1.3em\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M245.66,74.34l-32-32a8,8,0,0,0-11.32,11.32L220.69,72H192a74.49,74.49,0,0,0-28.35,6.73c-13.62,6.29-30.83,19.71-35.54,48-5.32,31.94-29.1,39.22-41,40.86a40,40,0,1,0,.18,16.06A71.65,71.65,0,0,0,108.13,178C121.75,172,139,158.6,143.89,129.31,150.65,88.77,190.34,88,192,88h28.69l-18.35,18.34a8,8,0,0,0,11.32,11.32l32-32A8,8,0,0,0,245.66,74.34ZM48,200a24,24,0,1,1,24-24A24,24,0,0,1,48,200Z\">\r\n </path>\r\n </svg>&nbsp;\r\n Workflows\r\n </div>\r\n <div class=\"dropdown-menu\" *ngIf=\"isWorkflowOpen\">\r\n <label *ngFor=\"let orgWorkflow of orgWorkflows\" (click)=\"onWorkflowSelected(orgWorkflow)\">\r\n {{ orgWorkflow.Name }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n <div class=\"bottombox-wrapper\">\r\n <!-- <input [disabled]=\"isChatingWithAi\" type=\"text\" class=\"form-control-1 s27-scroll\"\r\n \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 <textarea [disabled]=\"isChatingWithAi\" class=\"form-control-1 s27-scroll chat-textarea\"\r\n placeholder=\"Ask anything...\" [(ngModel)]=\"input\" (keydown)=\"handleKeydown($event)\"\r\n (input)=\"adjustTextareaHeight($event)\" #myInput></textarea>\r\n\r\n <button (click)=\"toggleRecording()\" [disabled]=\"isChatingWithAi\"\r\n title=\"{{ isRecording ? 'Stop Recording' : 'Start Recording' }}\" class=\"btn cta-chat mr-1 vj-test\">\r\n <svg *ngIf=\"!isRecording\" 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 <!-- Mic Icon -->\r\n <path\r\n d=\"M256 320c53 0 96-43 96-96V96c0-53-43-96-96-96s-96 43-96 96v128c0 53 43 96 96 96zm144-96h-16c0 66.27-52.73 120-120 120s-120-53.73-120-120h-16c-17.67 0-32 14.33-32 32v32c0 53.87 38.13 100.64 91.21 112.27C210.13 457.77 231.58 464 256 464s45.87-6.23 65.79-17.73C374.87 388.64 416 341.87 416 288v-32c0-17.67-14.33-32-32-32z\">\r\n </path>\r\n </svg>\r\n <svg *ngIf=\"isRecording\" stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 24 24\"\r\n height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <!-- Square Stop Icon -->\r\n <path d=\"M5 5h14v14H5z\"></path>\r\n </svg>\r\n </button>\r\n\r\n\r\n <button class=\"btn cta-chat rotate\" (click)=\"handleSubmit()\"\r\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\r\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\" title=\"Send Message\">\r\n <svg stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 512 512\" height=\"1em\"\r\n 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\r\n\r\n <!-- new UI for Chat Message Section by Amit -->\r\n </div>\r\n\r\n <div class=\"NoteTxt\">\r\n <div class=\"note\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12.882\" height=\"12.883\" viewBox=\"0 0 12.882 12.883\">\r\n <path id=\"Icon_ion-shield-checkmark\" data-name=\"Icon ion-shield-checkmark\"\r\n d=\"M15.106,4.532a.46.46,0,0,0-.378-.424A20.132,20.132,0,0,1,8.881,2.291a.46.46,0,0,0-.379,0A20.132,20.132,0,0,1,2.655,4.108a.46.46,0,0,0-.378.424A11.3,11.3,0,0,0,2.98,9.4a10.049,10.049,0,0,0,2.06,3.235A10.516,10.516,0,0,0,8.521,15.1a.46.46,0,0,0,.345,0,10.516,10.516,0,0,0,3.481-2.465A10.049,10.049,0,0,0,14.4,9.4,11.3,11.3,0,0,0,15.106,4.532Zm-3.767,2.16L8.153,10.373a.46.46,0,0,1-.328.159H7.806a.46.46,0,0,1-.322-.131L6.069,9.014a.46.46,0,1,1,.644-.657L7.777,9.4,10.644,6.09a.46.46,0,0,1,.7.6Z\"\r\n transform=\"translate(-2.25 -2.25)\" fill=\"#06f\" />\r\n </svg>\r\n\r\n\r\n <span class=\"text\">Your personal or company information is kept\r\n private and secure\r\n within this chat.</span>\r\n </div>\r\n </div>\r\n </mat-drawer-content>\r\n </mat-drawer>\r\n <mat-drawer class=\"drawer edit-boxDrawer\" style=\"width: 45%\" #sourcesDrawer [position]=\"'end'\" [mode]=\"'over'\"\r\n [style.background]=\"\r\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\r\n \">\r\n <mat-drawer-content>\r\n <div class=\"sourceDraweContainer\">\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>{{ currentSourcesList?.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 currentSourcesList; 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\r\n }}.</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'\" />\r\n <span> {{ 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 </ul>\r\n </div>\r\n </div>\r\n </mat-drawer-content>\r\n </mat-drawer>\r\n <mat-drawer class=\"drawer edit-boxDrawer\" style=\"width: 45%\" #editorsDrawer [position]=\"'end'\" [mode]=\"'push'\"\r\n [style.background]=\"\r\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\r\n \">\r\n <mat-drawer-content>\r\n <lib-bot-html-editor *ngIf=\"isContentLoaded\" [editorContent]=\"currentMessageForEditor\"\r\n [isDocInEditMode]=\"isDocInEditMode\" [documentContent]=\"documentContent\" [conversationId]=\"conversationId\"\r\n [botId]=\"botId\"></lib-bot-html-editor>\r\n </mat-drawer-content>\r\n </mat-drawer>\r\n</mat-drawer-container>\r\n\r\n\r\n<div *ngIf=\"showWorkflowExecutionDetails\" class=\"modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"close-wrapper\"><span class=\"close_pop\" (click)=\"closeModal()\">&times;</span></div>\r\n <div class=\"titleSection\">\r\n <!-- Workflow Title -->\r\n <h2>{{ workflowExecutionDetails.WorkflowName }}</h2>\r\n <!-- Workflow Title -->\r\n </div>\r\n <!-- Inputs Section -->\r\n <div class=\"inputs-section\">\r\n <h3>Inputs</h3>\r\n <ul>\r\n <li *ngFor=\"let input of objectToArray(workflowExecutionDetails.Inputs)\">\r\n {{ input.key }}: {{ input.value }}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <!-- Actions Section (Displayed as Timeline) -->\r\n <div class=\"actions-section\">\r\n <h3>Agent Actions</h3>\r\n <div class=\"timeline\">\r\n <div *ngFor=\"let action of workflowExecutionDetails.Actions\" class=\"timeline-item\">\r\n <div class=\"timestamp-section\">\r\n <h4>{{ action.ActionName || action.Name }}</h4>\r\n <p><strong></strong> {{\r\n action.InsertTimeStamp }}</p>\r\n </div>\r\n <p [innerHTML]=\"processMessageForDisplay(action.Output)\"></p>\r\n <!-- <pre>{{ action.Output }}</pre> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Insert Timestamp -->\r\n <div class=\"timestamp-section\">\r\n <p><strong>Inserted At:</strong> {{\r\n workflowExecutionDetails.InsertTimeStamp }}</p>\r\n </div>\r\n </div>\r\n</div>",
1655
- changeDetection: ChangeDetectionStrategy.OnPush,
1656
- styles: ["@import url(\"https://e1cdn.social27.com/digitalevents/liteversion/fonts/segoe-ui/stylesheet.css\");.sticky-header-chat{background:#fff;border-bottom:1px solid #ddd;padding:0 0 10px;position:sticky;top:-21px;transition:all 1s;z-index:100}@media (max-width:768px){.sticky-header-chat{top:0}}::-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:#fff!important;background-image:none!important;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 .ai h3{font-size:1.3rem!important}.hivegpt-chat-wrapper .chat-main .chat-box{max-width:96%;width:100%}.hivegpt-chat-wrapper .chat-main .chat-box .message{margin-left:50px;margin-top:10px;min-height:40px;padding:0 20px 0 0;position:relative}@media (max-width:768px){.hivegpt-chat-wrapper .chat-main .chat-box .message{margin-left:0}}.hivegpt-chat-wrapper .chat-main .chat-box .message p{color:#000;color:#525252;font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:160%;margin:0;text-align:left}.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:flow-root;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.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:left;margin:0 -60px;width:auto}@media (max-width:768px){.hivegpt-chat-wrapper .chat-main .chat .Icon_TimeSTamp{margin:0}}.hivegpt-chat-wrapper .chat-main .chat .dateTime{color:#333232;font-size:15px;font-style:normal;font-weight:300;line-height:140%}.hivegpt-chat-wrapper .chat-main .chat .dateTime span{color:#06f;font-size:15px;font-style:normal;font-weight:500;line-height:140%;margin-left:15px;margin-right:5px}.hivegpt-chat-wrapper .chat-main .chat:last-of-type{margin-bottom:0}.hivegpt-chat-wrapper .chatFooterWrapper{background:#fff;border:2px solid hsla(0,0%,85.5%,.5882352941176471);border-radius:10px;box-shadow:2px 0 5px #e1e1e1;margin:0 auto 15px;margin-top:10px!important;transition:all .5s;width:75%}.hivegpt-chat-wrapper .chatFooterWrapper:hover{border:2px solid hsla(0,0%,72.2%,.5882352941176471);box-shadow:2px 0 4px #ddd}.hivegpt-chat-wrapper .chatFooterWrapper .chat-footer-upt{padding:4px}.hivegpt-chat-wrapper .chatFooterWrapper .note{align-items:center;background:rgba(27,117,187,.050980392156862744);border-radius:15px;color:#000;display:inline-flex;font-size:12px;gap:8px;line-height:1;margin:0 auto 4px;padding:10px 25px}.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: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;margin-bottom:10px;position:absolute;right:15px;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:20px}.title h2{font-size:22px;margin:0}.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 .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 2s 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%);z-index:0}@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:#f7f7f7;border-radius:13px;color:#566563;display:flex;float:right;gap:12px;padding:5px 10px;position:relative;width:135px}.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}.chat-footer{background:#fff;flex-direction:column;margin-bottom:10px}.chat-footer,.topinfo-containerbox{align-items:center;display:flex;width:100%}.topinfo-containerbox{background:#f9f9f9;border-bottom:1px solid #efefef;justify-content:space-between;margin:0;padding:5px 10px 8px}@media (max-width:768px){.topinfo-containerbox{flex-direction:column}}.agents_note_wrapper{display:flex;justify-content:space-around}.bottombox-wrapper{display:flex;padding:10px;width:100%}.dropdown-wrapper{margin-right:10px;position:relative}.dropdown-header{align-items:center;background:#fff;border:1px solid #ddd;border-radius:48px;color:#414141!important;cursor:pointer;display:flex;font-size:14px;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:230px;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,.text-left .note-section{align-items:center;display:flex}.text-left .note-section{background:#fff;border-radius:5px;box-shadow:0 2px 4px rgba(0,0,0,.1);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{background:#f5f5f5;border-radius:8px;font-size:13px;margin-bottom:5px;padding:6px 12px}.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:5px auto}.card-header{background:#eee;border-bottom:0;border-radius:8px 8px 0 0;display:flex!important;padding:8px 15px;width:auto}.icon{font-size:20px;line-height:5px}.rotate{transform:rotate(180deg)}.collapse{display:none}.uptList{background:rgba(245,222,179,.1411764705882353);border-radius:0 0 10px 10px;margin-bottom:20px!important}.list-group-item{color:#0f0f0f;font-size:15px;margin:1px 0;padding:0 18px}.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}.closeButtonEditor{border:0;border-radius:100%;height:32px;padding:3px 0 0;position:absolute;right:10px;top:5px;width:32px}.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}.graph-img{background:hsla(0,0%,99.6%,.23137254901960785);border-radius:15px;padding:15px;width:90%}.chat-textarea{background-color:#fff;border:none;box-sizing:border-box;font-size:15px;height:30px;line-height:1.5;overflow-y:hidden;padding:10px;resize:none;transition:all 1s;width:100%}.chat-textarea:focus,.chat-textarea:hover{height:60px}.chat-textarea:focus{outline:none}.fixed-btn{background-color:#000;border:none;border-radius:8px 8px 0 0;color:#fff;cursor:pointer;font-size:16px;padding:5px 12px;position:fixed;right:-22px;top:46%;transform:translateY(-50%) rotate(270deg);transform-origin:center;transition:all .5s;z-index:1000000}.fixed-btn:hover{background-color:#5b5b5b}.fixed-btn-close{background-color:#000;border:none;border-radius:8px 8px 0 0;color:#fff;cursor:pointer;font-size:16px;padding:5px 16px;position:fixed;right:549px;top:46%;transform:translateY(-50%) rotate(270deg);transform-origin:center;transition:all .5s;z-index:1000000}.fixed-btn-close:hover{background-color:#5b5b5b}.btn.rotate{transform:rotate(-15deg)}.btn.rotate:hover{transform:rotate(0deg)}.btn.cta-chat{align-items:center;background:#f3f3f3;border:none;border-radius:50%;color:#666;cursor:pointer;display:flex;height:40px;justify-content:center;margin:0 auto;padding:5px;text-align:center;transition:all .5s;width:40px}.btn.cta-chat:hover{background:#d7d7d7;color:#666}.btn.cta-chat svg{vertical-align:middle}.chat-footer-upt{padding:4px}.workflowbox{align-items:center;border:1px solid transparent;border-radius:48px;color:#414141!important;cursor:pointer;display:flex;font-size:14px;margin-bottom:0;padding:.5rem 1.5rem;transition:all .5s;white-space:nowrap}.workflowbox:hover{background:#fff;border:1px solid #ddd}.workflowbox svg{margin:0 10px}.edit-boxDrawer{border-left:1px solid #ddd;box-shadow:1px 1px 15px hsla(0,0%,86.7%,.7686274509803922)!important}.edit-boxDrawer mat-drawer-content,ng-deep .edit-boxDrawer mat-drawer-content{margin-left:0!important;margin-right:0!important}.SearchTitle{font-size:16px!important;text-transform:capitalize}.exicution{background:#f9f9f9;margin:30px 0!important;padding:15px 20px}.new-conversationbutton{align-items:center;background:#f5f5f5;border:1px solid #e3e3e3;border-radius:10px;cursor:pointer;display:flex;font-size:14px;justify-content:space-around;padding:6px;position:absolute;right:88px;top:10px;transition:all .5s;width:120px;z-index:1000}.new-conversationbutton:hover{background:#eee}@media (max-width:768px){.new-conversationbutton{align-items:center;font-size:11px!important;padding:0!important;position:fixed!important;right:18px!important;top:56px!important;width:90px!important}}.NoteTxt{margin:0 auto}.NoteTxt .text{margin:0 5px}.form-container{width:100%}.progress-container{align-items:center;display:flex}.circular-loader{border:4px solid rgba(0,0,0,.1);border-radius:50%;box-sizing:border-box;height:50px;position:relative;width:50px}.loader-spinner{animation:rotate-loader 1s linear infinite;border:2px solid #2196f3;border-radius:50%;border-top-color:transparent;box-sizing:border-box;height:100%;left:0;position:absolute;top:0;width:100%}.loader-text{color:#333;font-size:12px;font-weight:700;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.loader-label{color:#333;font-size:16px;margin-left:20px}.checkmark{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.checkmark-circle{animation:stroke .6s ease-in-out forwards;stroke:#4caf50;stroke-dasharray:166;stroke-dashoffset:166;stroke-width:4}.checkmark-check{animation:stroke-check .4s ease-in-out .4s forwards;stroke:#4caf50;stroke-dasharray:48;stroke-dashoffset:48;stroke-linecap:round;stroke-linejoin:round;stroke-width:4}@keyframes stroke{to{stroke-dashoffset:0}}@keyframes stroke-check{to{stroke-dashoffset:0}}@keyframes rotate-loader{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes checkmark-animation{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}.circular-loader.completed .loader-spinner{animation:none;transform:rotate(1turn)}.icon-button{background-color:transparent;border:none;color:#333;cursor:pointer;font-size:24px}.icon-button:focus{outline:none}.icon-button:hover{color:#007bff}.modal{background-color:rgba(0,0,0,.4);display:block;height:100%;left:0;padding-top:0;position:fixed;top:0;width:100%;z-index:1000001}.modal-content{background-color:#fff;border-radius:8px;box-shadow:0 4px 8px rgba(0,0,0,.1);height:600px;margin:5% auto;padding:20px;position:relative;width:82%}.close{color:#aaa;float:right;font-size:28px;font-weight:700}.close:focus,.close:hover{color:#000;cursor:pointer;text-decoration:none}.SearchTitle.user{font-size:30px!important;text-transform:none!important}.SearchTitle.user h2,.SearchTitle.user p{font-size:1.7rem!important}.title_chat{display:flex;margin:0;padding:0}.title_chat h2{align-items:center;display:flex;font-size:20px;gap:10px;margin:10px 0}@media (max-width:768px){.title_chat h2{align-items:start;flex-direction:column;font-size:16px}}.small-title{font-size:12px;margin:2px 0}.titleSection{margin:0}.titleSection h2{color:#000;font-size:20px;margin:0}.inputs-section{background-color:#f7f7f7;border-radius:5px;margin:0 0 10px;padding:10px 15px 0}.inputs-section h3{font-size:16px}.actions-section{background-color:#f9f9f9;border-radius:5px;height:500px;margin-bottom:20px;overflow-y:auto;padding:15px}.timeline{margin-bottom:20px;padding-left:40px;position:relative}.timeline:before{border-right:2px dashed #cecece;content:\"\";height:100%;left:19px;position:absolute}.timeline-item{margin-bottom:20px;position:relative}.timeline-item:before{background-color:#007bff;border-radius:50%;content:\"\";height:20px;left:-30px;position:absolute;top:0;width:20px;z-index:1}.timeline-item h4{color:#000;font-size:16px;font-weight:700;margin:0}.timeline-item pre{background-color:#fff;border:1px solid #ddd;border-radius:5px;padding:10px;white-space:pre-wrap}.timestamp-section{color:#666;font-style:normal;justify-content:space-between}.mic-btn{background-color:#ff4d4d;border:none;border-radius:50%;color:#fff;cursor:pointer;font-size:1.5em;padding:10px}.mic-btn:active{background-color:#f66}.actions-section h3{font-size:16px}.close-wrapper{display:flex;justify-content:right;position:absolute;right:22px;top:0;width:100%}.close_pop{color:#aaa;cursor:pointer;font-size:30px;font-weight:400;justify-content:center}.close_pop,.user-Box{align-items:center;display:flex}.bards{position:absolute;right:0;top:20px}::ng-deep .code-container{margin:20px 0;position:relative}::ng-deep .copy-button{background-color:#007bff;border:none;border-radius:4px;color:#fff;cursor:pointer;padding:5px 10px;position:absolute;right:10px;top:10px}::ng-deep .copy-button:hover{background-color:#0056b3}::ng-deep .code_block.diff{background-color:#f8f8f8;border-left:4px solid #ccc;overflow:auto;padding:10px}::ng-deep .heading003{color:#06f;font-size:20px;font-weight:700}::ng-deep .listing{list-style:decimal;margin:0 25px;padding:0}.line{background-color:#e8e8e8;border-radius:15px;display:inline-block;height:15px;width:15px}.load-2 .line:last-child{animation:loadingB 1.5s 1s infinite;margin:5px 0}.load-2 .line:nth-last-child(2){animation:loadingB 1.5s .5s infinite;margin:5px 0}.load-2 .line:nth-last-child(3){animation:loadingB 1.5s 0s infinite;margin:5px 0}.load-1 .line:last-child{animation:loadingA 1.5s 1.2s infinite;margin:5px 0}.load-1 .line:nth-last-child(2){animation:loadingA 1.5s .8s infinite;margin:5px 0}.load-1 .line:nth-last-child(3){animation:loadingA 1.5s .2s infinite;margin:5px 0}@keyframes loadingB{0%{width:65px}50%{width:235px}to{width:65px}}@keyframes loadingA{0%{width:45px}50%{width:205px}to{width:45px}}.loaderbox{height:60px;margin:10px 0;position:relative}.loader-pkg{bottom:0;left:0;margin:0;top:0;width:250px}.loader--dot,.loader-pkg{height:20px;position:absolute}.loader--dot{animation-duration:3s;animation-iteration-count:infinite;animation-name:loader;animation-timing-function:ease-in-out;background-color:#1a6774;border-radius:100%;width:20px}.loader--dot:first-child{animation-delay:.5s;background-color:#618e93}.loader--dot:nth-child(5){animation-delay:.4s;background-color:#3fb0c3}.loader--dot:nth-child(4){animation-delay:.3s;background-color:#40b8cd}.loader--dot:nth-child(3){animation-delay:.2s;background-color:#ec8828}.loader--dot:nth-child(2){animation-delay:.1s;background-color:#fdc25d}.loader--dot:first-child{animation-delay:0s;background-color:#f4e3be}.loader--text{left:0;margin:0;position:absolute;top:200%;width:4rem}.loader--text:after{animation-duration:3s;animation-iteration-count:infinite;animation-name:loading-text;content:\"Loading\";font-weight:700}@keyframes loader{15%{transform:translateX(230px)}45%{transform:translateX(0)}65%{transform:translateX(230px)}95%{transform:translateX(0)}}@keyframes loading-text{0%{content:\"Loading\"}25%{content:\"Loading.\"}50%{content:\"Loading..\"}75%{content:\"Loading...\"}}::ng-deep .loaderbox{height:60px;margin:10px 0;position:relative}::ng-deep .loader-pkg{bottom:0;height:20px;left:0;margin:0;position:absolute;top:0;width:250px}::ng-deep .loader--dot{animation-duration:3s;animation-iteration-count:infinite;animation-name:loader;animation-timing-function:ease-in-out;background-color:#1a6774;border-radius:100%;height:20px;position:absolute;width:20px}::ng-deep .loader--dot:first-child{animation-delay:.5s;background-color:#618e93}::ng-deep .loader--dot:nth-child(5){animation-delay:.4s;background-color:#3fb0c3}::ng-deep .loader--dot:nth-child(4){animation-delay:.3s;background-color:#40b8cd}::ng-deep .loader--dot:nth-child(3){animation-delay:.2s;background-color:#ec8828}::ng-deep .loader--dot:nth-child(2){animation-delay:.1s;background-color:#fdc25d}::ng-deep .loader--dot:first-child{animation-delay:0s;background-color:#f4e3be}::ng-deep .loader--text{left:0;margin:0;position:absolute;top:200%;width:4rem}::ng-deep .loader--text:after{animation-duration:3s;animation-iteration-count:infinite;animation-name:loading-text;content:\"Loading\";font-weight:700}.agents-popwindowbox{background:#fff;padding:10px;width:100%}.agents-popwindowbox h3{color:#000;font-size:15px}.dropdown-menu-agents{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;padding:0;position:absolute;top:auto;width:270px;z-index:1000}.dropdown-menu-agents .scrollerbox{display:flex;flex:fit-content;flex-direction:column;height:215px;overflow-y:auto}.dropdown-menu-agents label{align-items:center;background:#f9f9f9;border-radius:2px;cursor:pointer;display:flex;font-size:13px;justify-content:start;line-height:16px;margin:2px 0;padding:7px}.dropdown-menu-agents label:hover{background:#ebebeb}.dropdown-menu-agents label input{opacity:0;position:absolute}.dropdown-menu-agents .input-check{border:2px solid #ccc;border-radius:4px;display:inline-block;height:23px;margin-right:5px;position:relative;top:0;transition:.5s;width:25px}.dropdown-menu-agents label input:checked~.input-check{animation:animate .7s ease;background:#06f;border-color:#06f}@keyframes animate{0%{transform:scale(1)}40%{transform:scale(1.3,.7)}55%{transform:scale(1)}70%{transform:scale(1.2,.8)}80%{transform:scale(1)}90%{transform:scale(1.1,.9)}to{transform:scale(1)}}.dropdown-menu-agents .input-check:before{border-bottom:3px solid #fff;border-left:3px solid #fff;content:\"\";height:6px;left:4px;position:absolute;top:6px;transform:scale(0) rotate(-45deg);transition:.5s;width:15px}.dropdown-menu-agents label input:checked~.input-check:before{transform:scale(1) rotate(-45deg)}::ng-deep .h1,::ng-deep h1{font-size:1.165rem}::ng-deep .h2,::ng-deep .h3,::ng-deep h2,::ng-deep h3{font-size:1.125rem}::ng-deep b,::ng-deep strong{font-weight:600}@media (max-width:768px){.note{line-height:15px;margin:0 auto;padding:3px 0 10px;width:90%}}.show-hover{display:none}.chat.bot:hover .show-hover{display:flex!important}"]
1657
- },] }
1658
- ];
1659
- ChatDrawerComponent.ctorParameters = () => [
1660
- { type: FormBuilder },
1661
- { type: BotsService },
1662
- { type: ChangeDetectorRef },
1663
- { type: HttpClient },
1664
- { type: DomSanitizer },
1665
- { type: ElementRef },
1666
- { type: Renderer2 },
1667
- { type: SocketService },
1668
- { type: ConversationService }
1669
- ];
1670
- ChatDrawerComponent.propDecorators = {
1671
- chatMain: [{ type: ViewChild, args: ['chatMain',] }],
1672
- myInput: [{ type: ViewChild, args: ['myInput',] }],
1673
- closePlaygroundButtons: [{ type: ViewChildren, args: ['closeplaygroundbutton',] }],
1674
- drawer: [{ type: ViewChild, args: ['drawer',] }],
1675
- sourcesDrawer: [{ type: ViewChild, args: ['sourcesDrawer',] }],
1676
- editorsDrawer: [{ type: ViewChild, args: ['editorsDrawer',] }],
1677
- myTextarea: [{ type: ViewChild, args: ['myTextarea', { static: false },] }],
1678
- copilotName: [{ type: Input }],
1679
- firstName: [{ type: Input }],
1680
- lastName: [{ type: Input }],
1681
- apiKey: [{ type: Input }],
1682
- bgBubbleAi: [{ type: Input }],
1683
- bgBubbleUser: [{ type: Input }],
1684
- bgGradient: [{ type: Input }],
1685
- botName: [{ type: Input }],
1686
- botSkills: [{ type: Input }],
1687
- botId: [{ type: Input }],
1688
- orgId: [{ type: Input }],
1689
- closeButtonColor: [{ type: Input }],
1690
- closeButtonbgColor: [{ type: Input }],
1691
- credentials: [{ type: Input }],
1692
- dateTimeColor: [{ type: Input }],
1693
- dateTextColor: [{ type: Input }],
1694
- eventId: [{ type: Input }],
1695
- s27Token: [{ type: Input }],
1696
- eventName: [{ type: Input }],
1697
- botIcon: [{ type: Input }],
1698
- formFieldBgColor: [{ type: Input }],
1699
- formFieldTextColor: [{ type: Input }],
1700
- fullView: [{ type: Input }],
1701
- gradientColors: [{ type: Input }],
1702
- greeting: [{ type: Input }],
1703
- messageTextColorAi: [{ type: Input }],
1704
- messageTextColorUser: [{ type: Input }],
1705
- rules: [{ type: Input }],
1706
- sendButtonColor: [{ type: Input }],
1707
- sendButtonTextColor: [{ type: Input }],
1708
- showClose: [{ type: Input }],
1709
- thumbsDownMessages: [{ type: Input }],
1710
- thumbsUpMessage: [{ type: Input }],
1711
- timezone: [{ type: Input }],
1712
- unknownResponses: [{ type: Input }],
1713
- useOpenAi: [{ type: Input }],
1714
- userId: [{ type: Input }],
1715
- isDev: [{ type: Input }],
1716
- againButtonColor: [{ type: Input }],
1717
- againButtonTextColor: [{ type: Input }],
1718
- feedbackEvent: [{ type: Output }],
1719
- onCloseEvent: [{ type: Output }],
1720
- openPage: [{ type: Output }],
1721
- sessionActions: [{ type: Output }],
1722
- closeBot: [{ type: Output }],
1723
- connectWithUser: [{ type: Output }],
1724
- scheduleMeeting: [{ type: Output }],
1725
- refreshToken: [{ type: Output }],
1726
- openSupport: [{ type: Output }]
1727
- };
1728
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1kcmF3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkQ6L2hpdmVHUFQtQUktcGFja2FnZXMvSGl2ZUFJLVBhY2thZ2VzL0FuZ3VsYXIvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2NoYXQtZHJhd2VyL2NoYXQtZHJhd2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvREFBb0Q7QUFDcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFFWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFFVCxTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLGdCQUFnQixHQUNqQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxTQUFTLE1BQU0sd0NBQXdDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDLENBQUUsZ0JBQWdCO0FBUW5ELE1BQU0sT0FBTyxtQkFBbUI7SUFxSDlCLFlBQ1UsRUFBZSxFQUNmLFVBQXVCLEVBQ3ZCLEdBQXNCLEVBQ3RCLElBQWdCLEVBQ2hCLFNBQXVCLEVBQ3ZCLFVBQXNCLEVBQ3RCLFFBQW1CLEVBQ25CLGFBQTRCLEVBQzVCLG1CQUF3QyxDQUFDLDZCQUE2Qjs7UUFSdEUsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGVBQVUsR0FBVixVQUFVLENBQWE7UUFDdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBdEgxQyxzQkFBaUIsR0FBRyxzQkFBc0IsQ0FBQztRQUduRCxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUNmLGdCQUFXLEdBQVcsVUFBVSxDQUFDO1FBeUNoQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDM0MsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3hDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ25DLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN6QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNuQyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDMUMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzdDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN2QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFaEQsZUFBVSxHQUFHLDZCQUE2QixDQUFDO1FBQzNDLHdCQUFtQixHQUFHLGtCQUFrQixDQUFDO1FBQ3pDLDRCQUF1QixHQUFHLHNCQUFzQixDQUFDO1FBQ2pELDBCQUFxQixHQUFHLG1CQUFtQixDQUFDO1FBQzVDLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsWUFBTyxHQUFVLEVBQUUsQ0FBQztRQUNwQixZQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUM1QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUNuQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ3pCLFNBQUksR0FBVyxNQUFNLENBQUM7UUFDdEIsaUJBQVksR0FBVSxFQUFFLENBQUM7UUFDekIsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0IsMkJBQXNCLEdBQWtCLElBQUksQ0FBQztRQUM3QyxnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUN4QixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBU2Qsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFVM0Isa0NBQTZCLEdBQVcsQ0FBQyxDQUFDO1FBQzFDLDBCQUFxQixHQUFXLEVBQUUsQ0FBQztRQVFuQyxtQkFBYyxHQUFXLEVBQUUsQ0FBQztRQUM1Qix1QkFBa0IsR0FBVyxFQUFFLENBQUM7UUFDaEMsV0FBTSxHQUFXLFlBQVksQ0FBQyxDQUFDLDZCQUE2QjtRQW1ENUQseUJBQW9CLEdBQVEsV0FBVyxDQUFDO1FBdWZ4QyxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQWlHeEIsa0JBQWEsR0FBRyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQzlCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7WUFFcEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDL0IsSUFBSSxHQUFHLEVBQUU7b0JBQ1AsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDOUM7Z0JBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsT0FBTztZQUNULENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxJQUFJLGNBQWMsQ0FBQztnQkFDeEIsS0FBSyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ3BCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBZ1VGLDRCQUF1QixHQUFRLEVBQUUsQ0FBQztRQUNsQywwQkFBcUIsR0FBUSxDQUFDLENBQUMsQ0FBQztRQXlPaEMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFaEMsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFxRXBCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBSXhCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBMkp4QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIseUJBQW9CLEdBQUcsS0FBSyxDQUFDO1FBYzdCLE1BQU07UUFDTixNQUFNO1FBQ04sNEVBQTRFO1FBQzVFLDRMQUE0TDtRQUM1TCw2REFBNkQ7UUFDN0QsT0FBTztRQUNQLE1BQU07UUFDTixpRUFBaUU7UUFDakUsa0pBQWtKO1FBQ2xKLHdFQUF3RTtRQUN4RSxPQUFPO1FBQ1AsTUFBTTtRQUNOLHlFQUF5RTtRQUN6RSxnSUFBZ0k7UUFDaEksK0VBQStFO1FBQy9FLE9BQU87UUFDUCxNQUFNO1FBQ04scUZBQXFGO1FBQ3JGLHNIQUFzSDtRQUN0SCwyRkFBMkY7UUFDM0YsT0FBTztRQUNQLE1BQU07UUFDTiwyRUFBMkU7UUFDM0UsNklBQTZJO1FBQzdJLDJGQUEyRjtRQUMzRixNQUFNO1FBQ04sSUFBSTtRQUNKLGFBQVEsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFnQjdDLHVCQUFrQixHQUFRLEVBQUUsQ0FBQztRQVc3Qix1QkFBa0IsR0FBRyxJQUFJLENBQUM7UUF3QzFCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBL2dEbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyQywyQkFBMkI7UUFDM0IsNkJBQTZCO1FBQzdCLElBQUk7SUFDTixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUNwQixJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUNuRSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO2dCQUU5QyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDZCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7d0JBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3hDO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUMxQjtpQkFDRjthQUNGO1NBQ0Y7UUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDakIsSUFDRSxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWE7Z0JBQ3pELE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUMxQjtnQkFDQSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzthQUV6QjtTQUNGO0lBQ0gsQ0FBQztJQUtELFFBQVE7UUFFTixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7UUFFbkUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFFeEMsaURBQWlEO1FBR2pELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxlQUFlLENBQUM7U0FDN0M7YUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsV0FBVyxDQUFDO1NBQ3pDO2FBQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7U0FDdkM7UUFFRCx5Q0FBeUM7UUFDekMsMkNBQTJDO1FBRTNDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLFNBQVMsQ0FDN0IsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFeEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUMvQixDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLENBQUMsRUFDRCxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUNGLENBQUM7UUFDRixzQkFBc0I7UUFDdEIsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3BILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDaEMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUdELGdCQUFnQjtRQUNkLElBQUk7WUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLDBCQUEwQixFQUFFLENBQUM7U0FDakQ7UUFBQyxPQUFPLEtBQUssRUFBRSxHQUFHO1FBQ25CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDN0MsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN4QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFcEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsQ0FDL0MsSUFBSSxDQUFDLEtBQUssRUFDVixlQUFlLEVBQ2YsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO2dCQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN2QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDVixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBS0QsYUFBYTtRQUNYLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN0QztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxtQkFBbUI7YUFDOUMsMkJBQTJCLEVBQUU7YUFDN0IsU0FBUyxDQUNSLENBQUMsR0FBRyxFQUFFLEVBQUU7O1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsOENBQThDO1lBQzlDLGdCQUFJLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxDQUFDLDBDQUFFLFdBQVcsMENBQUUsV0FBVyxFQUFFO2dCQUNwQyxNQUFNLEVBQ0osVUFBVSxFQUNWLE1BQU0sRUFDTixXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixVQUFVLEdBQ1gsU0FBRyxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsQ0FBQywwQ0FBRSxXQUFXLENBQUM7Z0JBRXhCLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxVQUFVLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxXQUFXLENBQUM7Z0JBRXpDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUNqRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxtQkFBbUIsQ0FDckMsQ0FBQztnQkFFRixJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDdEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FDaEQsUUFBUSxDQUNULEdBQUcsTUFBTSxDQUFDO29CQUNYLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQ2hELGlCQUFpQixDQUNsQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7aUJBQ2pEO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLFdBQVcsWUFBWSxDQUFDLENBQUM7aUJBQzVEO2dCQUVELElBQUksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7Z0JBRXJFLElBQUksSUFBSSxDQUFDLDZCQUE2QixJQUFJLEdBQUcsRUFBRTtvQkFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FDbkMscUJBQXFCLENBQ3RCLEdBQUcscUJBQXFCLENBQUM7b0JBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO29CQUM3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2lCQUNoQztnQkFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzFCO2lCQUFNLFVBQUksR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLENBQUMsMENBQUUsV0FBVyxFQUFFO2dCQUM5QixNQUFNLEVBQ0osZUFBZSxFQUNmLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLFdBQVcsRUFDWCxjQUFjLEVBQ2QsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixXQUFXLEdBQ1osU0FBRyxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsQ0FBQywwQ0FBRSxXQUFXLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLE9BQUMsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLENBQUMsMENBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3hDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FDM0IsQ0FBQztnQkFDRixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFO29CQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUN4QixrQkFBa0IsR0FBRzt3QkFDbkIsR0FBRyxFQUFFLFVBQVU7d0JBQ2YsSUFBSSxFQUFFLElBQUk7d0JBQ1YsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO3FCQUMvQixDQUFDO29CQUVGLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBRXRDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQzFCO2dCQUVELDRDQUE0QztnQkFDNUMsSUFBSSxjQUFjLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxjQUFjLENBQUMsQ0FBQztvQkFDcEQsa0JBQWtCLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDMUI7Z0JBRUQsSUFBSSxXQUFXLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQ3pDLGtCQUFrQixDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7b0JBQzdDLGtCQUFrQixDQUFDLGdCQUFnQixHQUFHLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO29CQUNoRixrQkFBa0IsQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCO29CQUMvRSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUMxQjtnQkFFRCxJQUFJLE1BQU0sRUFBRTtvQkFDVixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztvQkFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBRS9CLGtCQUFrQixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQ3hELE1BQU0sQ0FDUCxDQUFDO29CQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztpQkFDdkI7Z0JBRUQsSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQy9CLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7b0JBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQzFCO2dCQUVELElBQUksZ0JBQWdCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO29CQUN2RCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQ25ELGtCQUFrQixDQUFDLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDMUI7Z0JBRUQsSUFBSSxXQUFXLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQ3pDLGtCQUFrQixDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztvQkFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDekIsd0NBQXdDO2lCQUN6QztnQkFFRCxpREFBaUQ7YUFDbEQ7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO2FBQ3hEO1FBQ0gsQ0FBQyxFQUNELENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDTixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckMsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQ0YsQ0FBQztJQUNOLENBQUM7SUFFRCx5QkFBeUIsS0FBSyxDQUFDO0lBQy9CLFdBQVcsQ0FBQyxJQUFTLEVBQUUsSUFBWTtRQUNqQyxRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssV0FBVztnQkFDZCxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLE1BQU07WUFDUixLQUFLLE9BQU87Z0JBQ1YsTUFBTTtZQUNSO2dCQUNFLE1BQU07U0FDVDtJQUNILENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2hELDZCQUE2QjtJQUMvQixDQUFDO0lBQ0QsaUJBQWlCLENBQUMsY0FBc0I7UUFDdEMsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2hFLDBDQUEwQztRQUMxQyxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRTtRQUU3RCxRQUFRLGNBQWMsRUFBRTtZQUN0QixLQUFLLENBQUM7Z0JBQ0osT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO2dCQUNuQyxNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtnQkFDbkMsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xDLE1BQU07WUFDUjtnQkFDRSxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ2hCLElBQUksRUFBRSxJQUFJO1lBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBRXpCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUMvQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDOUIsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDeEIsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ3pCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxvQkFBb0I7U0FDOUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsc0JBQXNCLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3JCLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsY0FBYztRQUVaLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQztZQUM5QixXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDeEIsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ3pCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxvQkFBb0I7U0FDOUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsZ0JBQWdCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN6QyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTs7WUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxNQUFNLENBQUM7WUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBRWhDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxpQkFBaUIsMENBQUUsTUFBTSxFQUN0RCxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQjtnQkFDdkIsQ0FBQyxDQUFDO29CQUNBLGtZQUFrWTtpQkFDblksQ0FBQztZQUNKLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQztZQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVwQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxrQkFBa0IsSUFBSSxDQUFDLGVBQWUsZUFBZSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbEgsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDOUIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDeEIsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ3pCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxvQkFBb0I7U0FDOUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsSUFBSTthQUNiLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQzthQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQU0sbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVPLFdBQVcsQ0FBSSxTQUFTLEdBQUcsV0FBVyxFQUFFLE1BQVU7UUFDeEQsT0FBTyxDQUFDLEtBQVUsRUFBaUIsRUFBRTtZQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxZQUFZLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELE9BQU8sRUFBRSxDQUFDLE1BQVcsQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQztJQUNKLENBQUM7SUFDRCx1QkFBdUI7SUFDdkIseUJBQXlCO0lBQ3pCLHNDQUFzQztJQUN0QywwQ0FBMEM7SUFDMUMsZ0NBQWdDO0lBQ2hDLFFBQVE7SUFDUixxQkFBcUI7SUFDckIsOEZBQThGO0lBQzlGLGFBQWE7SUFDYixrQ0FBa0M7SUFDbEMsZ0NBQWdDO0lBQ2hDLDBCQUEwQjtJQUMxQixZQUFZO0lBQ1oscUNBQXFDO0lBQ3JDLGlFQUFpRTtJQUNqRSxnQ0FBZ0M7SUFDaEMsMkJBQTJCO0lBQzNCLFdBQVc7SUFDWCxTQUFTO0lBQ1QsSUFBSTtJQUVKLGNBQWMsQ0FBQyxLQUFVOztRQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNoQixJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVztZQUN6QixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxLQUFLLFdBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLFFBQVEsMENBQUUsTUFBTSxDQUFBLEVBQUU7WUFDcEMsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFBRTtvQkFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0JBQ2hCLElBQUksRUFBRSxNQUFNO3dCQUNaLE9BQU8sRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzt3QkFDakQsSUFBSSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQzt3QkFDM0QsTUFBTSxFQUFFLEtBQUs7d0JBQ2IsZUFBZSxFQUFFLEtBQUs7d0JBQ3RCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7d0JBQzdDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztxQkFDZCxDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtvQkFDckIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7b0JBQ3RDLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO29CQUNsRSxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCO29CQUVqRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzt3QkFDaEIsSUFBSSxFQUFFLElBQUk7d0JBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3dCQUNqRCxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7d0JBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTt3QkFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO3dCQUM3QixXQUFXLEVBQUUsV0FBVzt3QkFDeEIsZ0JBQWdCLEVBQUUsZ0JBQWdCO3dCQUNsQyxnQkFBZ0IsRUFBRSxnQkFBZ0I7d0JBQ2xDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUM7d0JBQzNELE1BQU0sRUFBRSxLQUFLO3dCQUNiLGVBQWUsRUFBRSxLQUFLO3dCQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7cUJBQ2QsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7aUJBQ3ZEO1lBQ0gsQ0FBQyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsY0FBYyxDQUFDLE9BQWU7UUFDNUIsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxJQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxvQ0FBb0M7UUFDcEMsd0JBQXdCO1FBRXhCLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFekIsTUFBTSxpQkFBaUIsR0FBRyx3QkFBd0IsQ0FBQztRQUNuRCxNQUFNLFFBQVEsR0FBRyx3Q0FBd0MsQ0FBQztRQUUxRCxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNuQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUMxQixpQkFBaUIsRUFDakIscUNBQXFDLENBQ3RDLENBQUM7WUFDRiw4Q0FBOEM7WUFDOUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQzFCLFFBQVEsRUFDUixxQ0FBcUMsQ0FDdEMsQ0FBQztZQUNGLCtDQUErQztZQUMvQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEM7UUFFRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVyRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ25FLDJDQUEyQztRQUMzQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDdkUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUM1QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FDbEUsZ0JBQWdCLENBQ2pCLENBQUM7UUFDRixhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUNuQixPQUFPLEVBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUMzQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSCx1RUFBdUU7UUFDdkUsa0NBQWtDO1FBQ2xDLHVDQUF1QztRQUN2Qyw4RUFBOEU7UUFDOUUsSUFBSTtJQUNOLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBWTtRQUN2QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFjO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFHLEdBQUcsSUFBSTs7UUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLFdBQUksSUFBSSxDQUFDLEtBQUssMENBQUUsSUFBSSxHQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDL0IsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDaEIsSUFBSSxFQUFFLE1BQU07WUFDWixPQUFPLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDbEQsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzlCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsZUFBZSxFQUFFLEtBQUs7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsSUFBSTtZQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQzVDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLG1CQUFtQjtZQUNyRCxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDaEM7UUFBQyxPQUFPLEtBQUssRUFBRSxHQUFHO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFFNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFDRCxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDcEIsTUFBTSxRQUFRLEdBQUcsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLElBQUksRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUM3QixPQUFPO1NBQ1I7UUFDRCxJQUFJO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzFCO1FBQUMsT0FBTyxLQUFLLEVBQUUsR0FBRztRQUVuQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDaEIsSUFBSSxFQUFFLE1BQU07WUFDWixPQUFPLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQztZQUNoRCxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDOUIsTUFBTSxFQUFFLEtBQUs7WUFDYixlQUFlLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXhCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTVCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXhCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLG1CQUFtQixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUV2RixJQUFJLENBQUMsSUFBSTthQUNOLEdBQUcsQ0FBd0IsR0FBRyxFQUFFO1lBQy9CLE9BQU8sRUFBRTtnQkFDUCxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ3hCLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDekIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjthQUM5QztTQUNGLENBQUM7YUFDRCxJQUFJLENBQ0gsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUV6RCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FDSDthQUNBLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFeEIsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDYixPQUFPO2FBQ1I7WUFFRCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDaEIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztvQkFDaEQsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUM5QixhQUFhLEVBQUUsSUFBSTtpQkFDcEIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ3RELHlCQUF5QjtnQkFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUN6QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQXVCRCxJQUFJLENBQUMsVUFBZSxFQUFFLE1BQVcsRUFBRSxjQUF3QjtRQUN6RCxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFPLEVBQUUsRUFBRTs7WUFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV2RCxJQUFJLElBQUksRUFBRTtnQkFDUixRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLGNBQWMsYUFBZCxjQUFjLHVCQUFkLGNBQWMsQ0FBRSxNQUFNLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUNoQixJQUFJLEVBQUUsYUFBYTt3QkFDbkIsV0FBVyxFQUFFLGNBQWM7cUJBQzVCLENBQUMsQ0FBQztpQkFDSjtnQkFFRCxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM3Qix5QkFBeUI7Z0JBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUUzQixxQkFBcUI7Z0JBQ3JCLDJCQUEyQjtnQkFDM0IsVUFBVTtnQkFDVixPQUFPO2FBQ1I7WUFFRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsVUFBVSxJQUFJLFlBQVksQ0FBQztZQUNoQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUMxQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ3JFLElBQUksZ0JBQWdCLEVBQUU7b0JBQ3BCLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO3dCQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDckQsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQztvQkFDdkQsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBRUQsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUU3QixJQUFJLGVBQW9CLENBQUM7Z0JBRXpCLElBQUk7b0JBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDN0IsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztpQkFDM0Q7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsSUFBSTt3QkFDRixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7d0JBQzlCLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDL0M7b0JBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztpQkFDaEI7Z0JBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUVqQyxJQUFJLGVBQWUsSUFBSSxPQUFBLGVBQWUsYUFBZixlQUFlLHVCQUFmLGVBQWUsQ0FBRSxVQUFVLDBDQUFFLE1BQU0sSUFBRyxDQUFDLEVBQUU7b0JBQzlELElBQ0UsZUFBZSxDQUFDLFVBQVUsSUFBSSxnQkFBZ0I7d0JBQzlDLGVBQWUsQ0FBQyxVQUFVLElBQUksYUFBYTt3QkFDM0MsZUFBZSxDQUFDLFVBQVUsSUFBSSx5QkFBeUIsRUFDdkQ7d0JBQ0EsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ3RDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO3FCQUN6QztvQkFFRCxJQUFJLGVBQWUsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO3dCQUM5RCxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7d0JBQ3BCLE1BQUEsZUFBZSxDQUFDLE9BQU8sMENBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7NEJBQzNDLFVBQVUsR0FBRyxDQUFDLEdBQUcsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNwRCxDQUFDLEVBQUU7d0JBRUgsSUFBSSxDQUFBLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxNQUFNLElBQUcsQ0FBQzs0QkFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ3BFO29CQUVELElBQ0UsZUFBZSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsbUJBQW1CO3dCQUN0RCxPQUFBLGVBQWUsQ0FBQyxPQUFPLDBDQUFFLE1BQU0sSUFBRyxDQUFDLEVBQ25DO3dCQUNBLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDOzRCQUNqQixTQUFTLEVBQUUsZUFBZSxDQUFDLFVBQVU7NEJBQ3JDLFVBQVUsRUFBRSxlQUFlLENBQUMsT0FBTzt5QkFDcEMsQ0FBQyxDQUFDO3FCQUNKO29CQUVELElBQUksZUFBZSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7d0JBQzVELElBQUksUUFBUSxTQUFHLGVBQWUsQ0FBQyxPQUFPLDBDQUFFLE1BQU0sQ0FBQzt3QkFDL0MsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFOzRCQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQ0FDakIsU0FBUyxFQUFFLHdCQUF3QjtnQ0FDbkMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxPQUFPOzZCQUNoQyxDQUFDLENBQUM7eUJBQ0o7NkJBQU0sSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFOzRCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQ0FDakIsU0FBUyxFQUFFLGVBQWUsQ0FBQyxVQUFVO2dDQUNyQyxhQUFhLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzs2QkFDbkQsQ0FBQyxDQUFDO3lCQUNKO3FCQUNGO29CQUVELElBQUksZUFBZSxDQUFDLFlBQVksSUFBSSxNQUFNLEVBQUU7d0JBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDOzRCQUNqQixTQUFTLEVBQUUsZUFBZSxDQUFDLFVBQVU7NEJBQ3JDLE1BQU0sRUFBRSxlQUFlLENBQUMsT0FBTzt5QkFDaEMsQ0FBQyxDQUFDO3dCQUVILElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFOzRCQUMxQixlQUFlLENBQUMsT0FBTztnQ0FDckIsTUFBTSxHQUFHLG9EQUFvRCxDQUFDO3lCQUNqRTtxQkFDRjtvQkFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzt3QkFDaEIsSUFBSSxFQUFFLElBQUk7d0JBQ1YsT0FBTyxFQUFFLGVBQWUsQ0FBQyxPQUFPO3dCQUNoQyxNQUFNLEVBQUUsZUFBZTt3QkFDdkIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO3FCQUMvQixDQUFDLENBQUM7b0JBRUgsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUU7d0JBQzFCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7NEJBQ2QsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7d0JBQy9CLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztxQkFDVDtvQkFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztpQkFDdEI7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0JBQ2hCLElBQUksRUFBRSxJQUFJO3dCQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVTt3QkFDeEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO3FCQUMvQixDQUFDLENBQUM7aUJBQ0o7Z0JBRUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUN6QjtZQUVELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUV0QixxREFBcUQ7WUFDckQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQWEsRUFBRSxPQUFPO1FBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNuQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSx5QkFBeUIsSUFBSSxDQUFDLEtBQUssaUJBQWlCLGVBQWUsbUJBQW1CLENBQUM7UUFDakksS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNULE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSx1Q0FBdUM7Z0JBQ2pELGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDekIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjthQUM5QztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ2xFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1gsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQ2hCLElBQUksRUFBRSxJQUFJO29CQUNWLE9BQU8sRUFDTCxJQUFJLENBQUMsZUFBZTt3QkFDcEIsNkNBQTZDO29CQUMvQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQzlCLGFBQWEsRUFBRSxJQUFJO2lCQUNwQixDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztnQkFDbkMsT0FBTzthQUNSO1lBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2hCLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQ2pEO2dCQUNELElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDOUIsYUFBYSxFQUFFLElBQUk7YUFDcEIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGtCQUFrQjtnQkFDckIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztZQUNqRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzdELElBQUksV0FBVyxFQUFFO29CQUNmLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFFdkU7WUFDSCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDUixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGFBQWEsQ0FBQyxLQUFvQjtRQUNoQyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUM1QyxzQ0FBc0M7WUFDdEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLDRCQUE0QjtZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUNELFlBQVksQ0FBQyxLQUFLO1FBQ2hCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFFeEIsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFRO1FBQ3BCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUVuRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFO1lBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7U0FDeEQ7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxlQUFlLENBQUMsR0FBUTtRQUN0QixJQUFJLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUM5QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN2RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSztZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxnQ0FBZ0M7SUFDaEMseUNBQXlDO0lBQ3pDLHVEQUF1RDtJQUN2RCxrQ0FBa0M7SUFDbEMsZ0NBQWdDO0lBQ2hDLDhEQUE4RDtJQUM5RCw4Q0FBOEM7SUFDOUMseUNBQXlDO0lBQ3pDLGdDQUFnQztJQUNoQyw4Q0FBOEM7SUFDOUMseUJBQXlCO0lBQ3pCLDRDQUE0QztJQUM1QyxrQ0FBa0M7SUFDbEMseUNBQXlDO0lBQ3pDLFFBQVE7SUFDUixJQUFJO0lBQ0osUUFBUSxDQUFDLEVBQUUsRUFBRSxLQUFLO1FBQ2hCLHVCQUF1QjtRQUN2QixJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTlDLHVEQUF1RDtRQUN2RCxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELFlBQVksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUUzQywwRUFBMEU7UUFDMUUsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEMsc0NBQXNDO1FBQ3RDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUV0QixpQ0FBaUM7UUFDakMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QixnQ0FBZ0M7UUFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEMsbUdBQW1HO1FBQ25HLHNDQUFzQztRQUV0QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6Qix1Q0FBdUM7UUFDdkMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtJQUNwQyxDQUFDO0lBQ0QsZUFBZSxDQUFDLEtBQVU7UUFDeEIsb0NBQW9DO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxHQUFHLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQVk7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRS9ELGdFQUFnRTtRQUNoRSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUVuRCx5RUFBeUU7UUFDekUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQy9DLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBRUgsdURBQXVEO1FBQ3ZELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsYUFBYSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVwQyw4Q0FBOEM7UUFDOUMsMEJBQTBCO1FBQzFCLGFBQWE7YUFDVixnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7YUFDMUIsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUV4Qyx5Q0FBeUM7UUFDekMsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFJRCxpQkFBaUIsQ0FBQyxLQUFVO1FBQzFCLElBQUksSUFBSSxDQUFDLHFCQUFxQixJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7WUFDbkMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxZQUFZLENBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUM1QixDQUFDO1lBQ0YsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQ2pFLHdDQUF3QyxFQUN4QyxFQUFFLENBQ0gsQ0FBQztZQUVGLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDMUI7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLHFCQUFxQixJQUFJLEtBQUssRUFBRTtnQkFDdkMsSUFBSSxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUM1QixDQUFDO2dCQUNGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUNqRSx3Q0FBd0MsRUFDeEMsRUFBRSxDQUNILENBQUM7Z0JBQ0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUMxQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQzVCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQ2pFLHdDQUF3QyxFQUN4QyxFQUFFLENBQ0gsQ0FBQztnQkFDRixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzFCO1NBQ0Y7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6Qix1Q0FBdUM7UUFDdkMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtRQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNuRSxJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztTQUMvQjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO1lBQ2pGLElBQUksT0FBTyxFQUFFLEdBQUcsQ0FBQztnQkFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUFXO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJCLElBQUksTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE9BQU8sRUFBRTtTQUNwQjtJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsZ0ZBQWdGO1FBQ2hGLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO1FBRUQseURBQXlEO1FBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQWUsRUFBRSxFQUFFO1lBQ3JELElBQUksTUFBTSxFQUFFO2dCQUNWLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUMzQjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDNUMsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUU7d0JBQ3BELElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsd0JBQXdCO3FCQUNoRTtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFJTCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQscUJBQXFCLENBQUMsR0FBRztRQUN2QixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxXQUFXLElBQUksQ0FBQyxPQUFPLHlCQUF5QixDQUFDO1FBQzFGLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDVCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxhQUFhLEVBQUUsU0FBUyxHQUFHLGlCQUFpQjthQUM3QztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztTQUMxQixDQUFDO2FBQ0MsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakIsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFO2dCQUNmLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsc0NBQXNDO2FBQy9EO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQzthQUNqRDtRQUNILENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2IsSUFBSSxDQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxNQUFNLElBQUcsQ0FBQyxFQUFFO2dCQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQztnQkFDdEMsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUN6QjtRQUNILENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsTUFBTTtRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUN2QixTQUFTO1lBQ1QsTUFBTTtTQUNQLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVFLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxnRUFBZ0UsQ0FBQyxJQUFJLENBQzFFLFNBQVMsQ0FBQyxTQUFTLENBQ3BCLENBQUM7SUFDSixDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQU07UUFDbEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDeEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDcEMsTUFBTTtTQUNQLENBQUMsQ0FBQztRQUVILFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELHVCQUF1QixDQUFDLElBQUk7UUFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFNO1FBQ2YsT0FBTyxDQUFDLENBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FDOUMsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhLENBQUMsTUFBTTtRQUNsQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDOUIsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDeEIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSTthQUNiLEdBQUcsQ0FDRixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxXQUFXLElBQUksQ0FBQyxPQUFPLDZEQUE2RCxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQzlILEVBQUUsT0FBTyxFQUFFLENBQ1o7YUFDQSxJQUFJLENBQ0gsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDckIsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUM7WUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDO1lBQzlCLGNBQWMsRUFBRSxrQkFBa0I7WUFDbEMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQ3hCLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDYixHQUFHLENBQ0YsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsV0FBVyxJQUFJLENBQUMsT0FBTyxxQ0FBcUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUN0RyxFQUFFLE9BQU8sRUFBRSxDQUNaO2FBQ0EsSUFBSSxDQUNILFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDeEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQU1ELGlDQUFpQztJQUNqQyxjQUFjO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFZOztRQUN0QixNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxFQUFFO1FBQzFELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFVO1FBQ3RCLG1DQUFtQztRQUNuQyxxQkFBcUI7UUFDckIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxjQUFjOztRQUNaLGFBQU8sSUFBSSxDQUFDLE1BQU0sMENBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7SUFDeEQsQ0FBQztJQUVELHFCQUFxQjs7UUFDbkIsTUFBTSxjQUFjLFNBQUcsSUFBSSxDQUFDLE1BQU0sMENBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNuQixPQUFPLFlBQVksQ0FBQztTQUNyQjthQUFNO1lBQ0wsSUFBSSxjQUFjLElBQUksQ0FBQSxjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUUsTUFBTSxNQUFLLENBQUMsRUFBRTtnQkFDbEQsT0FBTyxZQUFZLENBQUM7YUFDckI7aUJBQU07Z0JBQ0wsT0FBTyxDQUFBLGNBQWMsYUFBZCxjQUFjLHVCQUFkLGNBQWMsQ0FBRSxNQUFNLElBQUcsQ0FBQztvQkFDL0IsQ0FBQyxDQUFDLEdBQUcsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLE1BQU0sa0JBQWtCO29CQUM3QyxDQUFDLENBQUMsR0FBRyxjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUUsTUFBTSxpQkFBaUIsQ0FBQzthQUNoRDtTQUNGO0lBQ0gsQ0FBQztJQUNELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLFlBQVksSUFBSSxDQUFDLEtBQUssZ0JBQWdCLENBQUM7UUFDakYsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDOUIsY0FBYyxFQUFFLGtCQUFrQjtTQUNuQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDOUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDckIsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxpQ0FDNUIsS0FBSyxLQUNSLFFBQVEsRUFBRSxLQUFLLElBQ2YsQ0FBQyxDQUFDO2FBQ0w7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXhCLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFeEQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFPRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxlQUFlLENBQUM7UUFDdEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUseUNBQXlDLGVBQWUsVUFBVSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekgsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDOUIsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxNQUFNLEVBQUUsMEJBQTBCO1lBQ2xDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxvQkFBb0I7U0FDOUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDekMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDckIsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDO2dCQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2dCQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2xCO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUV4QixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBRTVCLElBQUksQ0FBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsTUFBTSxLQUFJLEdBQUcsRUFBRTtnQkFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2FBQzdCO1lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsc0NBQXNDO0lBQ3RDLHdCQUF3QixDQUFDLFFBQWdCO1FBQ3ZDLElBQUk7WUFDRiw4Q0FBOEM7WUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFdkMsbURBQW1EO1lBQ25ELFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLElBQVksRUFBRSxFQUFFO2dCQUM1RCxPQUFPLFlBQVksSUFBSSxZQUFZLEtBQUssSUFBSSxFQUMxQyxxQkFBcUIsSUFBSSxNQUFNLENBQUM7WUFDcEMsQ0FBQyxDQUFDO1lBRUYsMkVBQTJFO1lBQzNFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFdkUsd0RBQXdEO1lBQ3hELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQzFELGVBQWUsQ0FDaEIsQ0FBQztZQUVGLDJDQUEyQztZQUMzQyxPQUFPLGFBQWEsQ0FBQztTQUN0QjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNuRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLDJEQUEyRDtTQUN2RTtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsUUFBZ0I7UUFDMUIsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtZQUN2QyxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDakQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELHFFQUFxRTtRQUNyRSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUN6RSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzVCLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtnQkFDZixPQUFPLGVBQWUsSUFBSSxnQkFBZ0IsQ0FBQzthQUM1QztpQkFBTSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7Z0JBQ3RCLE9BQU8sZUFBZSxJQUFJLGdCQUFnQixDQUFDO2FBQzVDO1lBQ0QsT0FBTyxXQUFXLElBQUksV0FBVyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBRUgsa0VBQWtFO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLDJCQUEyQixFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNyRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxXQUFXLENBQUM7WUFFckMsMENBQTBDO1lBQzFDLE9BQU87O21GQUVzRSxXQUFXOzZEQUNqQyxRQUFRLEtBQUssV0FBVzthQUN4RSxDQUFDO1FBQ1YsQ0FBQyxDQUFDLENBQUM7UUFFSCxxRUFBcUU7UUFDckUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFckQseUNBQXlDO1FBQ3pDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFN0QseUJBQXlCO1FBQ3pCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXZELDZCQUE2QjtRQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFcEQsdUNBQXVDO1FBQ3ZDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHlCQUF5QixFQUFFLHFDQUFxQyxDQUFDLENBQUM7UUFFdEYsZ0RBQWdEO1FBQ2hELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRS9DLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDREQUE0RDtJQUM1RCxVQUFVLENBQUMsSUFBWTtRQUNyQixPQUFPLElBQUk7YUFDUixPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQzthQUN0QixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQzthQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQzthQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQzthQUN2QixPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxxQ0FBcUM7SUFDOUIsZUFBZSxDQUFDLElBQVk7UUFDakMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM1QyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNyQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBVUQsY0FBYztRQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDckQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0Qsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUN2RCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUE2QkQsaUNBQWlDO0lBQ2pDLGFBQWEsQ0FBQyxHQUFXO1FBQ3ZCLElBQUk7WUFDRixNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLDJCQUEyQjtTQUNuRTtRQUFDLFdBQU07WUFDTixPQUFPLFNBQVMsQ0FBQztTQUNsQjtJQUNILENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsYUFBYSxDQUFDLEdBQVc7UUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxPQUFPLG9EQUFvRCxNQUFNLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQU87UUFDakIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ25FLElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUlELGVBQWU7UUFDYixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUV6QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbkUsSUFBSSxNQUFNLEVBQUU7WUFDVixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMscUNBQXFDO1FBQy9ELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLHFDQUFxQztRQUMvRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUNELGNBQWM7UUFDWixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLHFDQUFxQztZQUMvRCw2Q0FBNkM7WUFDN0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ25FLElBQUksTUFBTSxFQUFFO2dCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzthQUNoQztRQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFHRCxZQUFZLENBQUMsSUFBSTtRQUNmLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUNELHNCQUFzQjtRQUNwQixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbkUsSUFBSSxNQUFNLEVBQUU7WUFDVixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUM3RDtJQUNILENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxJQUFZO1FBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFDRCxvQkFBb0IsQ0FBQyxLQUFVO1FBQzdCLElBQUk7WUFDRixJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDNUMsdUNBQXVDO2dCQUN2QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDeEI7U0FDRjtRQUFDLE9BQU8sS0FBSyxFQUFFO1NBRWY7UUFDRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBNkIsQ0FBQztRQUNyRCxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxtQkFBbUI7UUFDbkQsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxpQ0FBaUM7UUFDdkYsNkRBQTZEO1FBQzdELElBQUksUUFBUSxDQUFDLFlBQVksR0FBRyxHQUFHLEVBQUU7WUFDL0IsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsaUNBQWlDO1lBQ2xFLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLDRDQUE0QztTQUNoRjthQUFNO1lBQ0wsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUMsNkNBQTZDO1NBQ25GO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFLLEdBQUcsSUFBSTtRQUUxQixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2hFLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO2dCQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUVuRSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztvQkFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztpQkFDaEM7Z0JBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztTQUNKO0lBRUgsQ0FBQztJQUVELGNBQWM7O1FBQ1osaUZBQWlGO1FBQ2pGLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN4QixnQkFBSSxJQUFJLENBQUMsZ0JBQWdCLDBDQUFFLE9BQU8sMENBQUUsV0FBVyxFQUFFO1lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUMxRCxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHO29CQUM1QixLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ2pCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUk7aUJBQzVDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELGtCQUFrQixDQUFDLFFBQVE7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVyQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUN4QixDQUNGLENBQUM7WUFFRiwyRUFBMkU7WUFDM0UsSUFBSTtnQkFDRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUNuQyw2QkFBNkIsQ0FDOUIsR0FBRyxLQUFLLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FDbkMsNkJBQTZCLENBQzlCLEdBQUcsS0FBSyxDQUFDO2FBQ1g7WUFBQyxPQUFPLEtBQUssRUFBRSxHQUFHO1lBRW5CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNoQixJQUFJLEVBQUUsTUFBTTtnQkFDWixPQUFPLEVBQUUsS0FBSztnQkFDZCxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQzlCLE1BQU0sRUFBRSxLQUFLO2dCQUNiLGVBQWUsRUFBRSxLQUFLO2dCQUN0QiwyQkFBMkIsRUFBRSxJQUFJO2FBQ2xDLENBQUMsQ0FBQztZQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFbkIsSUFBSSxDQUFDLDZCQUE2QixHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMscUJBQXFCO2dCQUN4QixZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDdkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM5QixJQUFJLENBQUMsd0JBQXdCLEdBQUc7Z0JBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTztnQkFDdEMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztnQkFDL0IsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztnQkFDdkMsWUFBWSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJO2FBQ3pDLENBQUM7WUFDRixJQUFJLENBQUMsK0JBQStCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQ3JFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUV0QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXpCLCtDQUErQztZQUMvQyxJQUFJLENBQUMsY0FBYyxDQUNqQixLQUFLLEVBQ0wsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsZUFBZSxFQUNwQixFQUFFLEVBQ0YsSUFBSSxFQUNKLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQ3hCLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxjQUFjLENBQ1osUUFBZ0IsRUFDaEIsTUFBYSxFQUNiLGNBQXNCLEVBQ3RCLEdBQVMsRUFDVCxJQUFVLEVBQ1YsVUFBbUIsRUFDbkIsZUFBcUI7O1FBRXJCLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLFNBQVMsQ0FBQztRQUVoRCxJQUFJLElBQUksR0FBRztZQUNULGFBQWEsRUFBRSxRQUFRO1lBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDbEIsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUU7WUFDbEQsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQzlCLE1BQU0sUUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsb0NBQUssRUFBRTtZQUNoRSxlQUFlLEVBQUUsY0FBYztZQUMvQixVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3pCLENBQUM7UUFFRixJQUFJLFVBQVUsRUFBRTtZQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDakMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsZUFBZSxDQUFDO1NBQzNDO1FBR0QsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNULE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLGFBQWEsRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVE7Z0JBQ3hDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDeEIsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUN6QixrQkFBa0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CO2FBQzlDO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1NBQzNCLENBQUM7YUFDQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNqQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO2dCQUN0RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFFekIseUNBQXlDO2dCQUN6QyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7b0JBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2lCQUM1QjthQUNGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2FBQ3BCO1lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLHlDQUF5QztRQUMzQyxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFHRCxpQkFBaUIsQ0FDZixRQUFnQixFQUNoQixNQUFhLEVBQ2IsY0FBc0IsRUFDdEIsR0FBUyxFQUNULElBQVUsRUFDVixVQUFtQixFQUNuQixlQUFxQjs7UUFFckIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsU0FBUyxDQUFDO1FBRWxELE1BQU0sSUFBSSxHQUFRO1lBQ2hCLGFBQWEsRUFBRSxRQUFRO1lBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDbEIsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUU7WUFDbEQsTUFBTSxRQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxvQ0FBSyxFQUFFO1lBQ2hFLGVBQWUsRUFBRSxjQUFjO1lBQy9CLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUztZQUMxQixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDekIsQ0FBQztRQUVGLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxlQUFlLENBQUM7U0FDM0M7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQztZQUM5QixjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTTtZQUN4QixhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDekIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjtTQUM5QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUM7YUFDbkMsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEIseUNBQXlDO1lBQzNDLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDL0IsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUUxQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEdBQUc7O1FBQ3pCLHFDQUFxQztRQUNyQyxJQUFJLFFBQVEsR0FBRyxNQUFNLEtBQUssSUFBSSxDQUFDO1FBRS9CLGdFQUFnRTtRQUNoRSxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM5QyxJQUFJLFNBQVMsR0FDWCxPQUFBLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDNUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssR0FBRyxDQUNqQywwQ0FBRSxLQUFLLEtBQUksR0FBRyxDQUFDO1lBQ2xCLFFBQVEsSUFBSSxPQUFPLFNBQVMsT0FBTyxLQUFLLElBQUksQ0FBQztTQUM5QztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxXQUFXO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQztZQUNyRSxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN0RSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNwRCxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ3ZDLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRTt3QkFDMUIsTUFBTSxDQUFDLGVBQWUsR0FBRyxnQkFBZ0IsQ0FDdkMsSUFBSSxDQUFDLFFBQVEsRUFDYixNQUFNLENBQUMsZUFBZSxDQUN2QixDQUFDO3FCQUNIO29CQUNELE9BQU8sTUFBTSxDQUFDO2dCQUNoQixDQUFDLENBQUMsQ0FBQzthQUNKO1lBRUQsR0FBRyxDQUFDLGVBQWUsR0FBRyxnQkFBZ0IsQ0FDcEMsSUFBSSxDQUFDLFFBQVEsRUFDYixHQUFHLENBQUMsZUFBZSxDQUNwQixDQUFDO1lBQ0YsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztZQUNwQyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7SUFDNUMsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFRO1FBQ3BCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNSLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxLQUFhO1FBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FDL0QsS0FBSyxFQUNMLElBQUksQ0FBQyxNQUFNLENBQ1osQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUN2RSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUM5QyxJQUFJLENBQUMsWUFBWSxFQUNqQixXQUFXLENBQ1osQ0FBQztRQUVGLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDaEUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3pCO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFO2dCQUMvRCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDekI7UUFDSCxDQUFDLENBQUM7UUFFRixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUVyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDekI7YUFBTTtZQUNMLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLCtCQUErQixFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsVUFBVSxDQUFDLDhCQUE4QixFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLElBQUksMEJBQTBCLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSwwQkFBMEIsQ0FBQztJQUU5RixDQUFDO0lBRUQsYUFBYSxDQUFDLElBQUk7UUFDaEIsSUFBSSxJQUFJLEVBQUU7WUFDUixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRTtZQUN2QyxJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQyxDQUFDLDZDQUE2QztJQUNuRCxDQUFDOzs7WUExaUVGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsNkJBQTZCO2dCQUN2Qyw4djZEQUEyQztnQkFFM0MsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07O2FBQ2hEOzs7WUFWUSxXQUFXO1lBRVgsV0FBVztZQTlCbEIsaUJBQWlCO1lBSFYsVUFBVTtZQW1CVixZQUFZO1lBZG5CLFVBQVU7WUFRVixTQUFTO1lBZ0JGLGFBQWE7WUFGYixtQkFBbUI7Ozt1QkFnQnpCLFNBQVMsU0FBQyxVQUFVO3NCQUNwQixTQUFTLFNBQUMsU0FBUztxQ0FDbkIsWUFBWSxTQUFDLHVCQUF1QjtxQkFFcEMsU0FBUyxTQUFDLFFBQVE7NEJBQ2xCLFNBQVMsU0FBQyxlQUFlOzRCQUN6QixTQUFTLFNBQUMsZUFBZTt5QkFFekIsU0FBUyxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7MEJBR3pDLEtBQUs7d0JBQ0wsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7eUJBQ0wsS0FBSzsyQkFDTCxLQUFLO3lCQUNMLEtBQUs7c0JBQ0wsS0FBSzt3QkFDTCxLQUFLO29CQUNMLEtBQUs7b0JBQ0wsS0FBSzsrQkFDTCxLQUFLO2lDQUNMLEtBQUs7MEJBQ0wsS0FBSzs0QkFDTCxLQUFLOzRCQUNMLEtBQUs7c0JBQ0wsS0FBSzt1QkFDTCxLQUFLO3dCQUNMLEtBQUs7c0JBQ0wsS0FBSzsrQkFDTCxLQUFLO2lDQUNMLEtBQUs7dUJBQ0wsS0FBSzs2QkFDTCxLQUFLO3VCQUNMLEtBQUs7aUNBQ0wsS0FBSzttQ0FDTCxLQUFLO29CQUNMLEtBQUs7OEJBQ0wsS0FBSztrQ0FDTCxLQUFLO3dCQUNMLEtBQUs7aUNBQ0wsS0FBSzs4QkFDTCxLQUFLO3VCQUNMLEtBQUs7K0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3FCQUNMLEtBQUs7b0JBQ0wsS0FBSzsrQkFFTCxLQUFLO21DQUNMLEtBQUs7NEJBQ0wsTUFBTTsyQkFDTixNQUFNO3VCQUNOLE1BQU07NkJBQ04sTUFBTTt1QkFDTixNQUFNOzhCQUNOLE1BQU07OEJBQ04sTUFBTTsyQkFDTixNQUFNOzBCQUNOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFJlbmRlcmVyMixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERyYXdlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NpZGVuYXYnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBmb3JtYXROb3csIGZvcm1hdFRpbWVTdGFtcHMgfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgZGV2X2Vudmlyb25tZW50LFxyXG4gIHByb2RfZW52aXJvbm1lbnQsXHJcbn0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcclxuaW1wb3J0IHsgQ29udmVyc2F0aW9uU2VydmljZSB9IGZyb20gJy4uL2NvbnZlcnNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTb2NrZXRTZXJ2aWNlIH0gZnJvbSAnLi4vc29ja2V0LXNlcnZpY2Uuc2VydmljZSc7XHJcblxyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0ICogYXMgU3BlZWNoU0RLIGZyb20gJ21pY3Jvc29mdC1jb2duaXRpdmVzZXJ2aWNlcy1zcGVlY2gtc2RrJztcclxuaW1wb3J0IHsgQm90c1NlcnZpY2UgfSBmcm9tICcuLi9ib3Quc2VydmljZSc7XHJcbmltcG9ydCAqIGFzIG1hcmtlZCBmcm9tICdtYXJrZWQnOyAgLy8gSW1wb3J0IG1hcmtlZFxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdoaXZlZ3B0LWNoYXQtZHJhd2VyLXBhY2thZ2UnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGF0LWRyYXdlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY2hhdC1kcmF3ZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIENoYXREcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgQFZpZXdDaGlsZCgnY2hhdE1haW4nKSBwcml2YXRlIGNoYXRNYWluOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ215SW5wdXQnKSBwcml2YXRlIG15SW5wdXQ6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZHJlbignY2xvc2VwbGF5Z3JvdW5kYnV0dG9uJylcclxuICBjbG9zZVBsYXlncm91bmRCdXR0b25zOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XHJcbiAgQFZpZXdDaGlsZCgnZHJhd2VyJykgZHJhd2VyITogTWF0RHJhd2VyO1xyXG4gIEBWaWV3Q2hpbGQoJ3NvdXJjZXNEcmF3ZXInKSBzb3VyY2VzRHJhd2VyITogTWF0RHJhd2VyO1xyXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcnNEcmF3ZXInKSBlZGl0b3JzRHJhd2VyITogTWF0RHJhd2VyO1xyXG4gIHByaXZhdGUgYm9keU92ZXJmbG93Q2xhc3MgPSAnYm9keS1vdmVyZmxvdy1oaWRkZW4nO1xyXG4gIEBWaWV3Q2hpbGQoJ215VGV4dGFyZWEnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBteVRleHRhcmVhITogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjsgLy8gUmVmZXJlbmNlIHRvIHRoZSB0ZXh0YXJlYVxyXG4gIGlzQ29sbGFwc2VkVHJ1ZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNvcGlsb3ROYW1lOiBzdHJpbmcgPSAnSGl2ZVhHUFQnO1xyXG4gIEBJbnB1dCgpIGZpcnN0TmFtZSE6IHN0cmluZztcclxuICBASW5wdXQoKSBsYXN0TmFtZSE6IHN0cmluZztcclxuICBASW5wdXQoKSBhcGlLZXkhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYmdCdWJibGVBaSE6IHN0cmluZztcclxuICBASW5wdXQoKSBiZ0J1YmJsZVVzZXIhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYmdHcmFkaWVudCE6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIGJvdE5hbWUhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYm90U2tpbGxzITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGJvdElkITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG9yZ0lkITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNsb3NlQnV0dG9uQ29sb3IhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY2xvc2VCdXR0b25iZ0NvbG9yITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNyZWRlbnRpYWxzITogW107XHJcbiAgQElucHV0KCkgZGF0ZVRpbWVDb2xvciE6IHN0cmluZztcclxuICBASW5wdXQoKSBkYXRlVGV4dENvbG9yITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGV2ZW50SWQhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgczI3VG9rZW4hOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZXZlbnROYW1lITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGJvdEljb24hOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZm9ybUZpZWxkQmdDb2xvciE6IHN0cmluZztcclxuICBASW5wdXQoKSBmb3JtRmllbGRUZXh0Q29sb3IhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZnVsbFZpZXchOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGdyYWRpZW50Q29sb3JzITogc3RyaW5nW107XHJcbiAgQElucHV0KCkgZ3JlZXRpbmchOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbWVzc2FnZVRleHRDb2xvckFpITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG1lc3NhZ2VUZXh0Q29sb3JVc2VyITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHJ1bGVzITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNlbmRCdXR0b25Db2xvciE6IHN0cmluZztcclxuICBASW5wdXQoKSBzZW5kQnV0dG9uVGV4dENvbG9yITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNob3dDbG9zZSE6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgdGh1bWJzRG93bk1lc3NhZ2VzITogc3RyaW5nW107XHJcbiAgQElucHV0KCkgdGh1bWJzVXBNZXNzYWdlITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHRpbWV6b25lITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHVua25vd25SZXNwb25zZXMhOiBbXTtcclxuICBASW5wdXQoKSB1c2VPcGVuQWkhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHVzZXJJZCE6IHN0cmluZztcclxuICBASW5wdXQoKSBpc0RldiE6IGJvb2xlYW47XHJcblxyXG4gIEBJbnB1dCgpIGFnYWluQnV0dG9uQ29sb3IhOiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSBhZ2FpbkJ1dHRvblRleHRDb2xvciE6IHN0cmluZ1tdO1xyXG4gIEBPdXRwdXQoKSBmZWVkYmFja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIG9uQ2xvc2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgb3BlblBhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2Vzc2lvbkFjdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgY2xvc2VCb3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgY29ubmVjdFdpdGhVc2VyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHNjaGVkdWxlTWVldGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSByZWZyZXNoVG9rZW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgb3BlblN1cHBvcnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgYXV0b2dlbktleSA9ICdBdXRvZ2VuX2VESlR0RVUtTkIwUnRJcHpxMXcnO1xyXG4gIGFkZFRvTXlBZ2VuZGFBY3Rpb24gPSAnYWRkX3RvX215X2FnZW5kYSc7XHJcbiAgbXlVcGNvbWluZ1Nlc3Npb25BY3Rpb24gPSAnbXlfdXBjb21taW5nX3Nlc3Npb24nO1xyXG4gIGNvbm5lY3RPckZvbGxvd0FjdGlvbiA9ICdjb25uZWN0X29yX2ZvbGxvdyc7XHJcbiAgYWlSZXNwb25zZTogc3RyaW5nID0gJyc7XHJcbiAgY2hhdExvZzogYW55W10gPSBbXTtcclxuICBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XHJcbiAgZmVlZGJhY2tEb25lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZ3JlZXRpbmdNc2c6IHN0cmluZyA9ICcnO1xyXG4gIGhhc0JhY2tkcm9wVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpbnB1dDogc3RyaW5nID0gJyc7XHJcbiAgbGlzdGVuZXJBZGRlZCA9IGZhbHNlO1xyXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtb2RlOiBzdHJpbmcgPSAnb3Zlcic7XHJcbiAgcXVpY2tQcm9tcHRzOiBhbnlbXSA9IFtdO1xyXG4gIHRodW1ic0Rvd25Nc2dJbmRleCA9IDA7XHJcbiAgdXNlck5hbWU6IHN0cmluZyA9ICcnO1xyXG4gIHNob3dTdGFydEFnYWluOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNJT1NEZXZpY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93RmVlZEJhY2tJY29uc0luZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICB0ZW1wZXJhdHVyZTogbnVtYmVyID0gMTtcclxuICBzcGVha2VycyA9IFtdO1xyXG4gIGVudmlyb25tZW50OiB7XHJcbiAgICBVU0VSU19BUEk7XHJcbiAgICBCQVNFX1VSTDtcclxuICAgIEFHRU5UU19BUEk7XHJcbiAgfTtcclxuICBwZW5kaW5nUmVxdWVzdHM6IGFueTtcclxuICBteUNvbm5lY3Rpb25zOiBhbnk7XHJcbiAgY29udmVyc2F0aW9uS2V5OiBzdHJpbmc7XHJcbiAgY29uU2Vzc2lvbktleTogc3RyaW5nID0gJyc7XHJcbiAgaXNGZXRjaERhdGFGb3I6IGJvb2xlYW47XHJcbiAgaXM0MDE6IGJvb2xlYW47XHJcbiAgbXNnOiBhbnk7XHJcbiAgY2hhdDogYW55O1xyXG4gIGlzV29ya2Zsb3dPcGVuOiBib29sZWFuO1xyXG4gIG9yZ1dvcmtmbG93czogYW55O1xyXG4gIG9wZW5Xb3JrZmxvd0lucHV0OiBib29sZWFuO1xyXG4gIHNlbGVjdGVkV29ya2Zsb3c6IGFueTtcclxuICB3b3JrZmxvd0Zvcm06IGFueTtcclxuICBjdXJyZW50V29ya2Zsb3dBY3Rpb25Qcm9ncmVzczogbnVtYmVyID0gMDtcclxuICBjdXJyZW50V29ya2Zsb3dBY3Rpb246IHN0cmluZyA9ICcnO1xyXG4gIGV4ZWN1dGluZ1dvcmtmbG93OiBib29sZWFuO1xyXG4gIHdvcmtmbG93RXhlY3V0aW9uRGV0YWlsczogYW55O1xyXG4gIHNob3dXb3JrZmxvd0V4ZWN1dGlvbkRldGFpbHM6IGFueTtcclxuICBjdXJyZW50V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzOiBhbnk7XHJcblxyXG4gIHNwZWVjaENvbmZpZzogU3BlZWNoU0RLLlNwZWVjaENvbmZpZztcclxuICByZWNvZ25pemVyOiBTcGVlY2hTREsuU3BlZWNoUmVjb2duaXplcjtcclxuICByZWNvZ25pemVkVGV4dDogc3RyaW5nID0gJyc7XHJcbiAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmcgPSAnJztcclxuICByZWdpb246IHN0cmluZyA9ICd3ZXN0ZXVyb3BlJzsgLy8gU2V0IHlvdXIgQXp1cmUgcmVnaW9uIGhlcmVcclxuICBpc1JlY29yZGluZzogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgYm90U2VydmljZTogQm90c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSBzb2NrZXRTZXJ2aWNlOiBTb2NrZXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb252ZXJzYXRpb25TZXJ2aWNlOiBDb252ZXJzYXRpb25TZXJ2aWNlIC8vIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtXHJcbiAgKSB7XHJcbiAgICB0aGlzLmNoYXRNYWluID0gbmV3IEVsZW1lbnRSZWYobnVsbCk7XHJcblxyXG4gICAgLy8gaWYgKHRoaXMucGxhdGZvcm0uSU9TKSB7XHJcbiAgICAvLyAgIHRoaXMuaXNJT1NEZXZpY2UgPSB0cnVlO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMuczI3VG9rZW4pIHtcclxuICAgICAgaWYgKGNoYW5nZXMuczI3VG9rZW4uY3VycmVudFZhbHVlICE9IGNoYW5nZXMuczI3VG9rZW4ucHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuczI3VG9rZW4gPSBjaGFuZ2VzLnMyN1Rva2VuLmN1cnJlbnRWYWx1ZTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coJ2lzRmV0Y2hEYXRhRm9yOiAnLCB0aGlzLmlzRmV0Y2hEYXRhRm9yKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnbXNnOiAnLCB0aGlzLm1zZyk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2NoYXQ6ICcsIHRoaXMuY2hhdCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaXM0MDEpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmlzRmV0Y2hEYXRhRm9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hEYXRhRm9yKHRoaXMubXNnLCB0aGlzLmNoYXQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaERhdGEodGhpcy5tc2cpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzLm9yZ0lkKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBjaGFuZ2VzLm9yZ0lkLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzLm9yZ0lkLnByZXZpb3VzVmFsdWUgJiZcclxuICAgICAgICBjaGFuZ2VzLm9yZ0lkLmN1cnJlbnRWYWx1ZVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVTb2NrZXQoKTtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBkb21haW5BdXRob3JpdHlWYWx1ZTogYW55ID0gXCJwcm9kLWxpdGVcIjtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IHRoaXMuaXNEZXYgPyBkZXZfZW52aXJvbm1lbnQgOiBwcm9kX2Vudmlyb25tZW50O1xyXG5cclxuICAgIGNvbnN0IGRvbWFpbiA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtcclxuXHJcbiAgICAvLyBEZXRlcm1pbmUgdGhlIGhlYWRlciB2YWx1ZSBiYXNlZCBvbiB0aGUgZG9tYWluXHJcblxyXG5cclxuICAgIGlmIChkb21haW4uaW5jbHVkZXMoJ3ByZS1hcHAuc29jaWFsMjcuY29tJykpIHtcclxuICAgICAgdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSA9ICdwcmUtcHJvZC1saXRlJztcclxuICAgIH0gZWxzZSBpZiAoZG9tYWluLmluY2x1ZGVzKCdhcHAuc29jaWFsMjcuY29tJykpIHtcclxuICAgICAgdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSA9ICdwcm9kLWxpdGUnO1xyXG4gICAgfSBlbHNlIGlmIChkb21haW4uaW5jbHVkZXMoJ2hpdmVncHQuaW8nKSkge1xyXG4gICAgICB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlID0gJ2hpdmVncHQnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoaXMuZmV0Y2hNeUNvbm5lY3Rpb25zKCkuc3Vic2NyaWJlKCk7XHJcbiAgICAvLyB0aGlzLmZldGNoUGVuZGluZ1JlcXVlc3RzKCkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VUZW1wZXJhdHVyZSh0aGlzLnRlbXBlcmF0dXJlKTtcclxuICAgIHRoaXMuZmV0Y2hCb3RDb25maWcoKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuXHJcbiAgICAgICAgdGhpcy5mZXRjaENoYXRIaXN0b3J5KCkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm1hcENoYXRIaXN0b3J5KHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjaGF0IGhpc3Rvcnk6JywgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5OicsIGVycik7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICAvLyB0aGlzLmZldGNoQWdlbnRzKCk7XHJcbiAgICAvLyB0aGlzLmZldGNoRWRpdG9yQ29udGVudCgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAvLyB0aGlzLmluaXRpYWxpemVTb2NrZXQoKTtcclxuICAgIHRoaXMuYm90U2VydmljZS5mZXRjaFNwZWVjaEF1dGhvcml6YXRpb25Ub2tlbih0aGlzLmJvdElkLCB0aGlzLmFwaUtleSwgdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSkuc3Vic2NyaWJlKCh0b2tlbikgPT4ge1xyXG4gICAgICB0aGlzLmF1dGhvcml6YXRpb25Ub2tlbiA9IHRva2VuO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVTcGVlY2hSZWNvZ25pemVyKHRva2VuKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBldmVudFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGluaXRpYWxpemVTb2NrZXQoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNvY2tldFNlcnZpY2UuZGlzY29ubmVjdFNvY2tldENvbm5lY3Rpb24oKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7IH1cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNvY2tldFNlcnZpY2UuY29ubmVjdFNvY2tldENvbm5lY3Rpb24oKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1lFUyBJTklUJyk7XHJcbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uX2lkID0gdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdldEtleSh0aGlzLmJvdElkKTtcclxuXHJcbiAgICAgICAgdGhpcy5zb2NrZXRTZXJ2aWNlLnJlZ2lzdGVyVXNlclNwZWNpZmljSGl2ZVNvY2tldChcclxuICAgICAgICAgIHRoaXMuYm90SWQsXHJcbiAgICAgICAgICBjb252ZXJzYXRpb25faWQsXHJcbiAgICAgICAgICB0aGlzLm9yZ0lkXHJcbiAgICAgICAgKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGlzdGVuU29ja2V0cygpO1xyXG4gICAgICAgIH0sIDMwMCk7XHJcbiAgICAgIH0sIDIwMCk7XHJcbiAgICB9LCAzMDApO1xyXG4gIH1cclxuXHJcbiAgc3Vic2NyaXB0aW9uTmV3OiBhbnk7XHJcbiAgc29ja2V0RGF0YTogYW55O1xyXG5cclxuICBsaXN0ZW5Tb2NrZXRzKCkge1xyXG4gICAgaWYgKHRoaXMuZXZlbnRTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5ldmVudFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coJ0xpc3RlbiBTb2NrZXQnKTtcclxuICAgIHRoaXMuZXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2VcclxuICAgICAgLmdldFVzZXJTcGVjaWZpY05vdGlmaWNhdGlvbigpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlcykgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0xpc3RlbiBTb2NrZXQgcmVzcG9uc2UnKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XHJcbiAgICAgICAgICAvLyBDaGVjayBpZiBPdGhlckZpZWxkcyBleGlzdHMgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgICAgICBpZiAocmVzPy5tPy5PdGhlckZpZWxkcz8ud29ya2Zsb3dfaWQpIHtcclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgIHBlcmNlbnRhZ2UsXHJcbiAgICAgICAgICAgICAgb3V0cHV0LFxyXG4gICAgICAgICAgICAgIGFjdGlvbl9uYW1lLFxyXG4gICAgICAgICAgICAgIGN1cnJlbnRfYWN0aW9uX25hbWUsXHJcbiAgICAgICAgICAgICAgd29ya2Zsb3dfZXhlY3V0aW9uX2lkLFxyXG4gICAgICAgICAgICAgIHRpbWVfc3RhbXAsXHJcbiAgICAgICAgICAgIH0gPSByZXM/Lm0/Lk90aGVyRmllbGRzO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50V29ya2Zsb3dBY3Rpb25Qcm9ncmVzcyA9IHBlcmNlbnRhZ2U7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFdvcmtmbG93QWN0aW9uID0gYWN0aW9uX25hbWU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25JbmRleCA9IHRoaXMud29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzLkFjdGlvbnMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgIChhKSA9PiBhLk5hbWUgPT0gY3VycmVudF9hY3Rpb25fbmFtZVxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFjdGlvbkluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgIHRoaXMud29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzLkFjdGlvbnNbYWN0aW9uSW5kZXhdW1xyXG4gICAgICAgICAgICAgICAgJ091dHB1dCdcclxuICAgICAgICAgICAgICBdID0gb3V0cHV0O1xyXG4gICAgICAgICAgICAgIHRoaXMud29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzLkFjdGlvbnNbYWN0aW9uSW5kZXhdW1xyXG4gICAgICAgICAgICAgICAgJ0luc2VydFRpbWVTdGFtcCdcclxuICAgICAgICAgICAgICBdID0gZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCB0aW1lX3N0YW1wKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBY3Rpb24gd2l0aCBuYW1lICR7YWN0aW9uX25hbWV9IG5vdCBmb3VuZGApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRXb3JrZmxvd0V4ZWN1dGlvbkRldGFpbHMgPSB0aGlzLndvcmtmbG93RXhlY3V0aW9uRGV0YWlscztcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRXb3JrZmxvd0FjdGlvblByb2dyZXNzID09IDEwMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY2hhdExvZ1t0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMV1bXHJcbiAgICAgICAgICAgICAgICAnV29ya2Zsb3dFeGVjdXRpb25JZCdcclxuICAgICAgICAgICAgICBdID0gd29ya2Zsb3dfZXhlY3V0aW9uX2lkO1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5leGVjdXRpbmdXb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcz8ubT8uT3RoZXJGaWVsZHMpIHtcclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbl9pZCxcclxuICAgICAgICAgICAgICBib3RfaWQsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZV9pZCxcclxuICAgICAgICAgICAgICBhbnN3ZXIsXHJcbiAgICAgICAgICAgICAgd2ViX3Jlc3VsdHMsXHJcbiAgICAgICAgICAgICAgc2VhcmNoX3Jlc3VsdHMsXHJcbiAgICAgICAgICAgICAgZ3JhcGhzLFxyXG4gICAgICAgICAgICAgIGV4ZWN1dGlvbl9ncmFwaHMsXHJcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMsXHJcbiAgICAgICAgICAgIH0gPSByZXM/Lm0/Lk90aGVyRmllbGRzO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbWVzc2FnZV9pZDEnKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzPy5tPy5PdGhlckZpZWxkcyk7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50Q2hhdE1lc3NhZ2UgPSB0aGlzLmNoYXRMb2cuZmluZChcclxuICAgICAgICAgICAgICAocCkgPT4gcC5faWQgPT0gbWVzc2FnZV9pZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNoYXRMb2cpO1xyXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtZXNzYWdlX2lkMicpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2VfaWQpO1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZSA9IHtcclxuICAgICAgICAgICAgICAgIF9pZDogbWVzc2FnZV9pZCxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdhaScsXHJcbiAgICAgICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXHJcbiAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goY3VycmVudENoYXRNZXNzYWdlKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ21lc3NhZ2VfaWQzJyk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZV9pZCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGZpZWxkcyBiYXNlZCBvbiB0aGVpciBwcmVzZW5jZVxyXG4gICAgICAgICAgICBpZiAoc2VhcmNoX3Jlc3VsdHMgJiYgQXJyYXkuaXNBcnJheShzZWFyY2hfcmVzdWx0cykpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnT25saW5lIFNlYXJjaCBUZXJtczonLCBzZWFyY2hfcmVzdWx0cyk7XHJcbiAgICAgICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnNlYXJjaFRlcm1zID0gc2VhcmNoX3Jlc3VsdHM7XHJcbiAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAod2ViX3Jlc3VsdHMgJiYgQXJyYXkuaXNBcnJheSh3ZWJfcmVzdWx0cykpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV2ViIFJlc3VsdHM6Jywgd2ViX3Jlc3VsdHMpO1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5zb3VyY2VzTGlzdCA9IHdlYl9yZXN1bHRzO1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5kaXNwbGF5ZWRTb3VyY2VzID0gd2ViX3Jlc3VsdHM/LnNsaWNlKDAsIDMpOyAvLyBGaXJzdCAzIGNhcmRzXHJcbiAgICAgICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnJlbWFpbmluZ1NvdXJjZXMgPSB3ZWJfcmVzdWx0cz8uc2xpY2UoMyk7IC8vIFJlbWFpbmluZyBpdGVtc1xyXG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGFuc3dlcikge1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Fuc3dlcjonLCBhbnN3ZXIpO1xyXG5cclxuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UubWVzc2FnZSA9IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KFxyXG4gICAgICAgICAgICAgICAgYW5zd2VyXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZ3JhcGhzICYmIEFycmF5LmlzQXJyYXkoZ3JhcGhzKSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHcmFwaHM6JywgZ3JhcGhzKTtcclxuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UuZ3JhcGhzID0gZ3JhcGhzO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV4ZWN1dGlvbl9ncmFwaHMgJiYgQXJyYXkuaXNBcnJheShleGVjdXRpb25fZ3JhcGhzKSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFeGVjdXRpb24gR3JhcGhzOicsIGV4ZWN1dGlvbl9ncmFwaHMpO1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5leGVjdXRpb25HcmFwaHMgPSBleGVjdXRpb25fZ3JhcGhzO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25zICYmIEFycmF5LmlzQXJyYXkoc3VnZ2VzdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1Z2dlc3Rpb25zOicsIHN1Z2dlc3Rpb25zKTtcclxuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UucmVsYXRlZExpc3RJdGVtcyA9IHN1Z2dlc3Rpb25zO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAvLyBQcm9jZXNzIG9ubGluZSBzZWFyY2ggdGVybXMgYXMgbmVlZGVkXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEFkZCBhbnkgb3RoZXIgZmllbGRzIGFuZCB0aGVpciBwcm9jZXNzaW5nIGhlcmVcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignT3RoZXJGaWVsZHMgaXMgbWlzc2luZyBpbiB0aGUgcmVzcG9uc2UnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXZlbnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGZldGNoaW5nIGRhdGEgZnJvbSBzb2NrZXQnLCBlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVTb2NrZXRBbmRMaXN0ZW4oKSB7IH1cclxuICBoYW5kbGVFdmVudChkYXRhOiBhbnksIHR5cGU6IHN0cmluZykge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3dlYnJlc3VsdCc6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2Fuc3dlcic6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2dyYXBoJzpcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ldmVudFN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmV2ZW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNvY2tldFNlcnZpY2UuZGlzY29ubmVjdFNvY2tldENvbm5lY3Rpb24oKTtcclxuICAgIC8vdGhpcy5zb2NrZXRTZXJ2aWNlLmNsb3NlKCk7XHJcbiAgfVxyXG4gIGNoYW5nZVRlbXBlcmF0dXJlKG5ld1RlbXBlcmF0dXJlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLmxvYWRpbmcpIHJldHVybjtcclxuICAgIHRoaXMudGVtcGVyYXR1cmUgPSBuZXdUZW1wZXJhdHVyZTtcclxuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGl2ZWdwdC1jaGF0LXdyYXBwZXInKTtcclxuICAgIC8vIFJlbW92ZSBleGlzdGluZyB0aGVtZSBjbGFzc2VzIGZyb20gYm9keVxyXG4gICAgd3JhcHBlcj8uY2xhc3NMaXN0LnJlbW92ZSgnY3JlYXRpdmUnLCAnYmFsYW5jZWQnLCAncHJlY2lzZScpO1xyXG5cclxuICAgIHN3aXRjaCAobmV3VGVtcGVyYXR1cmUpIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIHdyYXBwZXI/LmNsYXNzTGlzdC5hZGQoJ2NyZWF0aXZlJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICB3cmFwcGVyPy5jbGFzc0xpc3QuYWRkKCdiYWxhbmNlZCcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgd3JhcHBlcj8uY2xhc3NMaXN0LmFkZCgncHJlY2lzZScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TdGFydEFnYWluKCkge1xyXG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xyXG4gICAgdGhpcy5zaG93U3RhcnRBZ2FpbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5jaGF0TG9nID0gW107XHJcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgIHR5cGU6ICdhaScsXHJcbiAgICAgIG1lc3NhZ2U6IHRoaXMuZ3JlZXRpbmdNc2csXHJcblxyXG4gICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXHJcbiAgICB9KTtcclxuICAgIHRoaXMuYXJjaGlldmVNZXNzYWdlcygpLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgYXJjaGlldmVNZXNzYWdlcygpIHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXHJcbiAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXHJcbiAgICAgICdkb21haW4tYXV0aG9yaXR5JzogdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9ib3QvY2xlYXItaGlzdG9yeS8ke3RoaXMuYm90SWR9LyR7dGhpcy51c2VySWR9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIHsgaGVhZGVycyB9KS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG9mKHJlcyk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB0cmlnZ2VyU3VwcG9ydCgpIHtcclxuXHJcbiAgICB0aGlzLm9wZW5TdXBwb3J0LmVtaXQoKTtcclxuICB9XHJcbiAgZmV0Y2hCb3RDb25maWcoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcclxuICAgICAgJ2hpdmUtYm90LWlkJzogdGhpcy5ib3RJZCxcclxuICAgICAgJ2RvbWFpbi1hdXRob3JpdHknOiB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2JvdHM/Ym90X2lkPSR7dGhpcy5ib3RJZH1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IGhlYWRlcnMgfSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYm90TmFtZSA9IHJlcy5OYW1lO1xyXG4gICAgICAgIHRoaXMuYm90SWNvbiA9IHJlcy5JY29uO1xyXG4gICAgICAgIHRoaXMuYm90U2tpbGxzID0gcmVzPy5Ta2lsbHM7XHJcbiAgICAgICAgdGhpcy5ncmVldGluZ01zZyA9IHJlcy5HcmVldGluZztcclxuXHJcbiAgICAgICAgdGhpcy50aHVtYnNEb3duTWVzc2FnZXMgPSByZXM/Lk5lZ2F0aXZlUmVzcG9uc2VzPy5sZW5ndGhcclxuICAgICAgICAgID8gcmVzLk5lZ2F0aXZlUmVzcG9uc2VzXHJcbiAgICAgICAgICA6IFtcclxuICAgICAgICAgICAgYFdlIGFyZSBzb3JyeSB3ZSd2ZSBub3QgYmVlbiBhYmxlIHRvIGFuc3dlciB5b3VyIHF1ZXN0aW9uLjxici8+IEhvd2V2ZXIsIG91ciBkZWRpY2F0ZWQgc3VwcG9ydCB0ZWFtIGlzIGhhcHB5IHRvIGhlbHAuIDxzcGFuIGNsYXNzPSdmZWVkYmFjay1saW5rJyBzdHlsZT0nY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICMxNzIzNUI7Jz48YSBzdHlsZT0nY29sb3I6IGluaGVyaXQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsnIGlkPSdzdXBwb3J0TGluazg4JyA+UGxlYXNlIGNsaWNrIGhlcmU8L2E+PC9zcGFuPiBhbmQgYSBodW1hbiBhZ2VudCB3aWxsIGFzc2lzdCB5b3UgYXMgc29vbiBhcyBwb3NzaWJsZWAsXHJcbiAgICAgICAgICBdO1xyXG4gICAgICAgIHRoaXMucXVpY2tQcm9tcHRzID0gcmVzLlF1aWNrUHJvbXB0cztcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gb2YocmVzKTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdGJvdCBjb25maWc6ICcsIGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hDaGF0SGlzdG9yeSgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmNvbnZlcnNhdGlvbktleSA9IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZXRLZXkodGhpcy5ib3RJZCwgZmFsc2UpO1xyXG4gICAgdGhpcy5jb25TZXNzaW9uS2V5ID0gdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdldFNlc3Npb25LZXkodGhpcy5ib3RJZCwgZmFsc2UpO1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vY29udmVyc2F0aW9ucy8ke3RoaXMuY29udmVyc2F0aW9uS2V5fT9zZXNzaW9uX2lkPSR7dGhpcy5jb25TZXNzaW9uS2V5fWA7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcclxuICAgICAgJ2hpdmUtYm90LWlkJzogdGhpcy5ib3RJZCxcclxuICAgICAgJ2RvbWFpbi1hdXRob3JpdHknOiB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgIC5nZXQodXJsLCB7IGhlYWRlcnMgfSlcclxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yPGFueT4oJ2ZldGNoQ29udmVyc2F0aW9uJykpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRXJyb3I8VD4ob3BlcmF0aW9uID0gJ29wZXJhdGlvbicsIHJlc3VsdD86IFQpIHtcclxuICAgIHJldHVybiAoZXJyb3I6IGFueSk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XHJcbiAgICAgIHJldHVybiBvZihyZXN1bHQgYXMgVCk7XHJcbiAgICB9O1xyXG4gIH1cclxuICAvLyBmZXRjaENoYXRIaXN0b3J5KCkge1xyXG4gIC8vICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAvLyAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gIC8vICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gIC8vICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXHJcbiAgLy8gICB9KTtcclxuICAvLyAgIHJldHVybiB0aGlzLmh0dHBcclxuICAvLyAgICAgLmdldChgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9jb252ZXJzYXRpb25zLyR7dGhpcy5jb252ZXJzYXRpb25LZXl9YCwgeyBoZWFkZXJzIH0pXHJcbiAgLy8gICAgIC5waXBlKFxyXG4gIC8vICAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcclxuICAvLyAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XHJcbiAgLy8gICAgICAgfSksXHJcbiAgLy8gICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5OiAnLCBlcnJvcik7XHJcbiAgLy8gICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAvLyAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAvLyAgICAgICB9KVxyXG4gIC8vICAgICApO1xyXG4gIC8vIH1cclxuXHJcbiAgbWFwQ2hhdEhpc3RvcnkoY2hhdHM6IGFueSkge1xyXG4gICAgdGhpcy5jaGF0TG9nLnB1c2goe1xyXG4gICAgICB0eXBlOiAnYWknLFxyXG4gICAgICBtZXNzYWdlOiB0aGlzLmdyZWV0aW5nTXNnLFxyXG4gICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXHJcbiAgICB9KTtcclxuICAgIGlmIChjaGF0cyAmJiBjaGF0cz8uTWVzc2FnZXM/Lmxlbmd0aCkge1xyXG4gICAgICBjaGF0cz8uTWVzc2FnZXMuZm9yRWFjaCgoY2hhdDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGNoYXQuVHlwZSA9PSAndXNlcicpIHtcclxuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgICAgICAgdHlwZTogJ3VzZXInLFxyXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShjaGF0LlRleHQpLFxyXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXRUaW1lU3RhbXBzKHRoaXMudGltZXpvbmUsIGNoYXQuSW5zZXJ0VGltZXN0YW1wKSxcclxuICAgICAgICAgICAgY29waWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZSxcclxuICAgICAgICAgICAgV29ya2Zsb3dFeGVjdXRpb25JZDogY2hhdC5Xb3JrZmxvd0V4ZWN1dGlvbklkLFxyXG4gICAgICAgICAgICBfaWQ6IGNoYXQuX2lkXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNoYXQuVHlwZSA9PSAnYWknKSB7XHJcbiAgICAgICAgICB2YXIgc291cmNlc0xpc3QgPSBjaGF0LldlYkxpbmtzIHx8IFtdO1xyXG4gICAgICAgICAgdmFyIGRpc3BsYXllZFNvdXJjZXMgPSBjaGF0LldlYkxpbmtzLnNsaWNlKDAsIDMpOyAvLyBGaXJzdCAzIGNhcmRzXHJcbiAgICAgICAgICB2YXIgcmVtYWluaW5nU291cmNlcyA9IGNoYXQuV2ViTGlua3Muc2xpY2UoMyk7IC8vIFJlbWFpbmluZyBpdGVtc1xyXG5cclxuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KSxcclxuICAgICAgICAgICAgZXhlY3V0aW9uR3JhcGhzOiBjaGF0LkV4ZWN1dGlvbkdyYXBocyxcclxuICAgICAgICAgICAgZ3JhcGhzOiBjaGF0LkdyYXBocyxcclxuICAgICAgICAgICAgc2VhcmNoVGVybXM6IGNoYXQuU2VhcmNoVGVybXMsXHJcbiAgICAgICAgICAgIHNvdXJjZXNMaXN0OiBzb3VyY2VzTGlzdCxcclxuICAgICAgICAgICAgZGlzcGxheWVkU291cmNlczogZGlzcGxheWVkU291cmNlcyxcclxuICAgICAgICAgICAgcmVtYWluaW5nU291cmNlczogcmVtYWluaW5nU291cmNlcyxcclxuICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXHJcbiAgICAgICAgICAgIGNvcGllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIF9pZDogY2hhdC5faWRcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5zaG93U3RhcnRBZ2FpbiA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IFNhZmVIdG1sIHtcclxuICAgIGlmICghbWVzc2FnZSB8fCAhKG1lc3NhZ2U/Lmxlbmd0aCA+IDApKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZygnaGVyZSBpcyBteSBtZXNzYWdlJylcclxuICAgIC8vIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xyXG5cclxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnRyaW0oKTtcclxuXHJcbiAgICBjb25zdCBtYXJrZG93bkxpbmtSZWdleCA9IC9cXFsoW15bXSspXVxcKChbXildKylcXCkvZztcclxuICAgIGNvbnN0IHVybFJlZ2V4ID0gLyg/PCFocmVmPVwiKVxcYmh0dHBzPzpcXC9cXC9cXFMrKD88IVsuLF0pL2dpO1xyXG5cclxuICAgIGlmIChtYXJrZG93bkxpbmtSZWdleC50ZXN0KG1lc3NhZ2UpKSB7XHJcbiAgICAgIGNvbnN0IGh0bWwgPSBtZXNzYWdlLnJlcGxhY2UoXHJcbiAgICAgICAgbWFya2Rvd25MaW5rUmVnZXgsXHJcbiAgICAgICAgJzxhIGhyZWY9XCIkMlwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPidcclxuICAgICAgKTtcclxuICAgICAgLy9jb25zb2xlLmxvZygnU2FuaXRpemVkIG1lc3NhZ2U6ICcsIG1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZUh0bWwoaHRtbCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHVybFJlZ2V4LnRlc3QobWVzc2FnZSkpIHtcclxuICAgICAgY29uc3QgaHRtbCA9IG1lc3NhZ2UucmVwbGFjZShcclxuICAgICAgICB1cmxSZWdleCxcclxuICAgICAgICAnPGEgaHJlZj1cIiQmXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JCY8L2E+J1xyXG4gICAgICApO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygnU2FuaXRpemVkIG1lc3NhZ2U6ICcsIG1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZUh0bWwoaHRtbCk7XHJcbiAgICB9XHJcblxyXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvKD86XFxyXFxufFxccnxcXG4pL2csICc8YnI+Jyk7XHJcblxyXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXFwqXFwqKC4qPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKTtcclxuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gaGVhZGVycyB0byBIVE1MIGhlYWRlcnNcclxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoL14oI3sxLDZ9KVxccysoLiopJC9nbSwgKG1hdGNoLCBoYXNoZXMsIHRleHQpID0+IHtcclxuICAgICAgY29uc3QgbGV2ZWwgPSBoYXNoZXMubGVuZ3RoO1xyXG4gICAgICByZXR1cm4gYDxoJHtsZXZlbH0+JHt0ZXh0fTwvaCR7bGV2ZWx9PmA7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIGNvbnN0IHNhbml0aXplZE1lc3NhZ2UgPSB0aGlzLnNhbml0aXplSHRtbChtZXNzYWdlKTtcclxuICAgIHJldHVybiBzYW5pdGl6ZWRNZXNzYWdlO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgY29uc3QgZmVlZGJhY2tMaW5rcyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXHJcbiAgICAgICcuZmVlZGJhY2stbGluaydcclxuICAgICk7XHJcbiAgICBmZWVkYmFja0xpbmtzLmZvckVhY2goKGxpbms6IGFueSkgPT4ge1xyXG4gICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgJ2NsaWNrJyxcclxuICAgICAgICB0aGlzLm9uRmVlZGJhY2tDbGljay5iaW5kKHRoaXMsICd6ZW5kZXNrJylcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgLy8gaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mZWVkYmFjay1saW5rJykpIHtcclxuICAgIC8vICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcclxuICAgIC8vICAgICAucXVlcnlTZWxlY3RvcignLmZlZWRiYWNrLWxpbmsnKVxyXG4gICAgLy8gICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25GZWVkYmFja0NsaWNrLmJpbmQodGhpcywgJ3plbmRlc2snKSk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBzYW5pdGl6ZUh0bWwoaHRtbDogc3RyaW5nKTogU2FmZUh0bWwge1xyXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWwpO1xyXG4gIH1cclxuXHJcbiAgb25GZWVkYmFja0NsaWNrKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZmVlZGJhY2tFdmVudC5lbWl0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIG9uQ2xvc2UoKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xyXG4gICAgdGhpcy5vbkNsb3NlRXZlbnQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgc2VuZE1lc3NhZ2VXaXRoVGlsZShwcm9tcHQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5pbnB1dCA9IHByb21wdDtcclxuICAgIHRoaXMuZmV0Y2hEYXRhKCk7XHJcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XHJcbiAgfVxyXG4gIGlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xyXG4gIGZldGNoRGF0YShtc2cgPSBudWxsKSB7XHJcbiAgICB0aGlzLmlucHV0ID0gbXNnIHx8IHRoaXMuaW5wdXQ/LnRyaW0oKTtcclxuICAgIHRoaXMubXNnID0gdGhpcy5pbnB1dDtcclxuICAgIGlmICghdGhpcy5pbnB1dCB8fCB0aGlzLmxvYWRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgdHlwZTogJ3VzZXInLFxyXG4gICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheSh0aGlzLmlucHV0KSxcclxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxyXG4gICAgICBjb3BpZWQ6IGZhbHNlLFxyXG4gICAgICBpc0NvbGxhcHNlZFRydWU6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLm15SW5wdXQubmF0aXZlRWxlbWVudDtcclxuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gJ2hpZGRlbic7IC8vIFJlc2V0IHRoZSBoZWlnaHRcclxuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gYDYycHhgO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgdGhpcy5haVJlc3BvbnNlID0gJyc7XHJcbiAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5tYWtlQXNrUmVxdWVzdCh0aGlzLmlucHV0LCB0aGlzLmFnZW50cywgdGhpcy5jb252ZXJzYXRpb25LZXkpO1xyXG4gIH1cclxuICBmZXRjaERhdGFGb3IobXNnLCBjaGF0KSB7XHJcbiAgICBjb25zdCBpbnB1dE1zZyA9IG1zZz8udHJpbSgpO1xyXG4gICAgaWYgKCFpbnB1dE1zZyB8fCB0aGlzLmxvYWRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY2hhdC5yZWxhdGVkTGlzdEl0ZW1zID0gW107XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7IH1cclxuXHJcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XHJcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgIHR5cGU6ICd1c2VyJyxcclxuICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoaW5wdXRNc2cpLFxyXG4gICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXHJcbiAgICAgIGNvcGllZDogZmFsc2UsXHJcbiAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuXHJcbiAgICB0aGlzLmFpUmVzcG9uc2UgPSAnJztcclxuICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLm1ha2VBc2tSZXF1ZXN0KGlucHV0TXNnLCB0aGlzLmFnZW50cywgdGhpcy5jb252ZXJzYXRpb25LZXksIG1zZywgY2hhdCk7XHJcbiAgfVxyXG4gIGZldGNoU21hbGxUYWxrKCkge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2JvdC9zbWFsbC10YWxrLyR7dGhpcy5ib3RJZH0vJHt0aGlzLnVzZXJJZH1gO1xyXG5cclxuICAgIHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0PHsgc21hbGxUYWxrOiBzdHJpbmcgfT4odXJsLCB7XHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxyXG4gICAgICAgICAgJ2hpdmUtYm90LWlkJzogdGhpcy5ib3RJZCxcclxuICAgICAgICAgICdkb21haW4tYXV0aG9yaXR5JzogdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGlsZSBmZXRjaGluZyBzbWFsbCB0YWxrOicsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc21hbGxUYWxrKSB7XHJcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdhaScsXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2UocmVzcG9uc2Uuc21hbGxUYWxrKSxcclxuICAgICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxyXG4gICAgICAgICAgICBpc0ZlZWRiYWNrTXNnOiB0cnVlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMjtcclxuICAgICAgICAgIC8vIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICByZWFkQWxsQ2h1bmtzID0gKHN0cmVhbTogYW55KSA9PiB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XHJcbiAgICBjb25zdCBhbGxTdWdnZXN0aW9uczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICByZWFkZXIuY2xvc2VkLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVhZGluZyBzdHJlYW06ICcsIGVycik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XHJcbiAgICAgIHN0YXJ0OiAoY29udHJvbGxlcikgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnB1bXAoY29udHJvbGxlciwgcmVhZGVyLCBhbGxTdWdnZXN0aW9ucyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICBwdW1wKGNvbnRyb2xsZXI6IGFueSwgcmVhZGVyOiBhbnksIGFsbFN1Z2dlc3Rpb25zOiBzdHJpbmdbXSkge1xyXG4gICAgcmVhZGVyLnJlYWQoKS50aGVuKCh7IGRvbmUsIHZhbHVlIH06IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBsYXN0SXRlbSA9IHRoaXMuY2hhdExvZ1t0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICBpZiAoZG9uZSkge1xyXG4gICAgICAgIGxhc3RJdGVtLm1lc3NhZ2UgPSB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShsYXN0SXRlbS5tZXNzYWdlKTtcclxuICAgICAgICB0aGlzLmNoYXRMb2cucG9wKCk7XHJcbiAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2gobGFzdEl0ZW0pO1xyXG4gICAgICAgIGlmIChhbGxTdWdnZXN0aW9ucz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdzdWdnZXN0aW9ucycsXHJcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBhbGxTdWdnZXN0aW9ucyxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xyXG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XHJcbiAgICAgICAgLy8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIHRoaXMuc2hvd1N0YXJ0QWdhaW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyAgIHRoaXMuZmV0Y2hTbWFsbFRhbGsoKTtcclxuICAgICAgICAvLyB9LDEwMDApXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZGVjb2RlZENodW5rID0gdGhpcy5kZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7XHJcbiAgICAgIHRoaXMuYWlSZXNwb25zZSArPSBkZWNvZGVkQ2h1bms7XHJcbiAgICAgIGlmIChsYXN0SXRlbS50eXBlID09PSAnYWknKSB7XHJcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnNNYXRjaCA9IHRoaXMuYWlSZXNwb25zZS5tYXRjaCgvPHN1Zz4oLio/KTxcXC9zdWc+L2cpO1xyXG4gICAgICAgIGlmIChzdWdnZXN0aW9uc01hdGNoKSB7XHJcbiAgICAgICAgICBzdWdnZXN0aW9uc01hdGNoLmZvckVhY2goKG1hdGNoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWlSZXNwb25zZSA9IHRoaXMuYWlSZXNwb25zZS5yZXBsYWNlKG1hdGNoLCAnJyk7XHJcbiAgICAgICAgICAgIGFsbFN1Z2dlc3Rpb25zLnB1c2gobWF0Y2g/LnJlcGxhY2UoLzxcXC8/c3VnPi9nLCAnJykpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsYXN0SXRlbS5tZXNzYWdlID0gdGhpcy5haVJlc3BvbnNlO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCBhaUZvcm1hdHRlZERhdGE6IGFueTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXJzaW5nIGpzb24gJyk7XHJcbiAgICAgICAgICBhaUZvcm1hdHRlZERhdGEgPSBKU09OLnBhcnNlKEpTT04ucGFyc2UodGhpcy5haVJlc3BvbnNlKSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3BhcnNpbmcganNvbiAyJyk7XHJcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YSA9IEpTT04ucGFyc2UodGhpcy5haVJlc3BvbnNlKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coJ3BhcnNpbmcganNvbiBkb25lJyk7XHJcblxyXG4gICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEgJiYgYWlGb3JtYXR0ZWREYXRhPy5zZWN0aW9uX2lkPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09ICdjb21wYW55X3NlYXJjaCcgfHxcclxuICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gJ3VzZXJfc2VhcmNoJyB8fFxyXG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSAnaW5kdXN0cnlfY29tcGFueV9zZWFyY2gnXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaE15Q29ubmVjdGlvbnMoKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaFBlbmRpbmdSZXF1ZXN0cygpLnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSB0aGlzLm15VXBjb21pbmdTZXNzaW9uQWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBzcGVha2VySWRzID0gW107XHJcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5jb250ZW50Py5mb3JFYWNoKChzZXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgc3BlYWtlcklkcyA9IFsuLi5zcGVha2VySWRzLCAuLi5zZXNzaW9uLnNwZWFrZXJzXTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3BlYWtlcklkcz8ubGVuZ3RoID4gMCkgdGhpcy5nZXRTcGVha2Vyc0J5U3RhZmZJZHMoc3BlYWtlcklkcyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSB0aGlzLmFkZFRvTXlBZ2VuZGFBY3Rpb24gJiZcclxuICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQ/Lmxlbmd0aCA+IDBcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5QYWdlLm5leHQoe1xyXG4gICAgICAgICAgICAgIHNlY3Rpb25JZDogYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQsXHJcbiAgICAgICAgICAgICAgc2Vzc2lvbklkczogYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSB0aGlzLmNvbm5lY3RPckZvbGxvd0FjdGlvbikge1xyXG4gICAgICAgICAgICBsZXQgdXNlcnNMZW4gPSBhaUZvcm1hdHRlZERhdGEuY29udGVudD8ubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAodXNlcnNMZW4gPiAxKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcGVuUGFnZS5uZXh0KHtcclxuICAgICAgICAgICAgICAgIHNlY3Rpb25JZDogJ29wZW5fbmV0d29ya2luZ19kcmF3ZXInLFxyXG4gICAgICAgICAgICAgICAgc2VhcmNoOiBhaUZvcm1hdHRlZERhdGEuY29udGVudCxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh1c2Vyc0xlbiA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcGVuUGFnZS5uZXh0KHtcclxuICAgICAgICAgICAgICAgIHNlY3Rpb25JZDogYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQsXHJcbiAgICAgICAgICAgICAgICBjb25uZXRVc2VySWRzOiBbYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnRbMF0udXNlcklkXSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuaXNfb3Blbl9wYWdlID09ICd0cnVlJykge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5QYWdlLm5leHQoe1xyXG4gICAgICAgICAgICAgIHNlY3Rpb25JZDogYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQsXHJcbiAgICAgICAgICAgICAgc2VhcmNoOiBhaUZvcm1hdHRlZERhdGEuY29udGVudCxcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZUJyb3dzZXIoKSkge1xyXG4gICAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5tZXNzYWdlICs9XHJcbiAgICAgICAgICAgICAgICAnXFxuXFxuJyArICc8YSBpZD1cImNsb3NlQm90Tm93XCI+Q2xpY2sgSGVyZTwvYT4gdG8gc2VlIHJlc3VsdHMuJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgICAgICAgbWVzc2FnZTogYWlGb3JtYXR0ZWREYXRhLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgIGFjdGlvbjogYWlGb3JtYXR0ZWREYXRhLFxyXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZUJyb3dzZXIoKSkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmFkZENsb3NlQm90Q2xpY2tFdmVudCgpO1xyXG4gICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuYWlSZXNwb25zZSA9ICcnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdhaScsXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuYWlSZXNwb25zZSxcclxuICAgICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG5cclxuICAgICAgLy8gRW5xdWV1ZSB0aGUgbmV4dCBkYXRhIGNodW5rIGludG8gb3VyIHRhcmdldCBzdHJlYW1cclxuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHZhbHVlKTtcclxuICAgICAgdGhpcy5wdW1wKGNvbnRyb2xsZXIsIHJlYWRlciwgYWxsU3VnZ2VzdGlvbnMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdWJtaXRGZWVkYmFjayhmbGFnOiBib29sZWFuLCBtZXNzYWdlKSB7XHJcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcclxuXHJcbiAgICB0aGlzLmZlZWRiYWNrRG9uZSA9IHRydWU7XHJcbiAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSBudWxsO1xyXG4gICAgY29uc3QgY29udmVyc2F0aW9uX2lkID0gdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdldEtleSh0aGlzLmJvdElkKTtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQUdFTlRTX0FQSX0vQ29udmVyc2F0aW9uL2NvUGlsb3QvJHt0aGlzLmJvdElkfS9jb252ZXJzYXRpb24vJHtjb252ZXJzYXRpb25faWR9L2hlbHBmdWwtcmVzcG9uc2VgO1xyXG4gICAgZmV0Y2godXJsLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAnYXBpS2V5JzogJ0NvbnZlcnNhdGlvbl9XSXovcUFtK0VFbWZPa0ZhVUEvd2VBPT0nLFxyXG4gICAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXHJcbiAgICAgICAgJ2RvbWFpbi1hdXRob3JpdHknOiB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZUlkOiBtZXNzYWdlLl9pZCwgaXNIZWxwZnVsOiBmbGFnIH0pLFxyXG4gICAgfSkudGhlbigoKSA9PiB7XHJcbiAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xyXG4gICAgICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgICAgIG1lc3NhZ2U6XHJcbiAgICAgICAgICAgIHRoaXMudGh1bWJzVXBNZXNzYWdlIHx8XHJcbiAgICAgICAgICAgIGBHcmVhdC4gTWF5IEkgYXNzaXN0IHlvdSB3aXRoIGFueXRoaW5nIGVsc2U/YCxcclxuICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcclxuICAgICAgICAgIGlzRmVlZGJhY2tNc2c6IHRydWUsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB0aGlzLmZlZWRiYWNrRG9uZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlKFxyXG4gICAgICAgICAgdGhpcy50aHVtYnNEb3duTWVzc2FnZXNbdGhpcy50aHVtYnNEb3duTXNnSW5kZXhdXHJcbiAgICAgICAgKSxcclxuICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXHJcbiAgICAgICAgaXNGZWVkYmFja01zZzogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudGh1bWJzRG93bk1zZ0luZGV4ID1cclxuICAgICAgICAodGhpcy50aHVtYnNEb3duTXNnSW5kZXggKyAxKSAlIHRoaXMudGh1bWJzRG93bk1lc3NhZ2VzLmxlbmd0aDtcclxuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3VwcG9ydExpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VwcG9ydExpbms4OCcpO1xyXG4gICAgICAgIGlmIChzdXBwb3J0TGluaykge1xyXG4gICAgICAgICAgc3VwcG9ydExpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnRyaWdnZXJTdXBwb3J0LmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH0sIDIwMCk7XHJcbiAgICAgIHRoaXMuZmVlZGJhY2tEb25lID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IG51bGw7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgLy8gUHJldmVudCBkZWZhdWx0IGJlaGF2aW9yIChuZXcgbGluZSlcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgLy8gQ2FsbCB5b3VyIHN1Ym1pdCBmdW5jdGlvblxyXG4gICAgICB0aGlzLmhhbmRsZVN1Ym1pdChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGhhbmRsZVN1Ym1pdChldmVudCkge1xyXG4gICAgdGhpcy5mZXRjaERhdGEoKTtcclxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuXHJcbiAgfVxyXG5cclxuICBoYW5kbGVVcENsaWNrKGlkeDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5mZWVkYmFja0RvbmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3VibWl0RmVlZGJhY2sodHJ1ZSwgdGhpcy5jaGF0TG9nW2lkeF0pO1xyXG4gICAgdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQgPSAhdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQ7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQpIHtcclxuICAgICAgdGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZCA9ICF0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRG93bkNsaWNrKGlkeDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5mZWVkYmFja0RvbmUpIHJldHVybjtcclxuICAgIHRoaXMuc3VibWl0RmVlZGJhY2soZmFsc2UsIHRoaXMuY2hhdExvZ1tpZHhdKTtcclxuICAgIHRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQgPSAhdGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZDtcclxuICAgIGlmICh0aGlzLmNoYXRMb2dbaWR4XS5saWtlZClcclxuICAgICAgdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQgPSAhdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQ7XHJcbiAgfVxyXG4gIC8vIGhhbmRsZUNvcHlDbGljayhpbmRleDogYW55KSB7XHJcbiAgLy8gICAvLyBDb3B5IHRoZSBtZXNzYWdlIHRvIHRoZSBjbGlwYm9hcmRcclxuICAvLyAgIGNvbnN0IGNvbnRlbnRUb0NvcHkgPSB0aGlzLmNoYXRMb2dbaW5kZXhdLm1lc3NhZ2U7XHJcbiAgLy8gICBjb25zb2xlLmxvZygnY29udGVudFRvQ29weScpO1xyXG4gIC8vICAgY29uc29sZS5sb2coY29udGVudFRvQ29weSk7XHJcbiAgLy8gICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb250ZW50VG9Db3B5KS50aGVuKCgpID0+IHtcclxuICAvLyAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgbWVzc2FnZSB3YXMgY29waWVkXHJcbiAgLy8gICAgIHRoaXMuY2hhdExvZ1tpbmRleF0uY29waWVkID0gdHJ1ZTtcclxuICAvLyAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIC8vICAgICAvLyBSZXNldCB0aGUgY29waWVkIHN0YXRlIGFmdGVyIGEgZGVsYXlcclxuICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5jb3BpZWQgPSBmYWxzZTtcclxuICAvLyAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgLy8gICAgIH0sIDIwMDApOyAvLyBSZXNldCBhZnRlciAyIHNlY29uZHNcclxuICAvLyAgIH0pO1xyXG4gIC8vIH1cclxuICBjb3B5VGV4dChpZCwgaW5kZXgpIHtcclxuICAgIC8vIEdldCB0aGUgdGV4dCBlbGVtZW50XHJcbiAgICB2YXIgdGV4dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHRleHRhcmVhIGVsZW1lbnQgdG8gY29weSB0aGUgdGV4dFxyXG4gICAgdmFyIHRlbXBUZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XHJcbiAgICB0ZW1wVGV4dEFyZWEudmFsdWUgPSB0ZXh0RWxlbWVudC5pbm5lclRleHQ7XHJcblxyXG4gICAgLy8gQXBwZW5kIHRoZSB0ZXh0YXJlYSB0byB0aGUgYm9keSAobmVjZXNzYXJ5IGZvciB0aGUgZXhlY0NvbW1hbmQgdG8gd29yaylcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcFRleHRBcmVhKTtcclxuXHJcbiAgICAvLyBTZWxlY3QgdGhlIHRleHQgaW5zaWRlIHRoZSB0ZXh0YXJlYVxyXG4gICAgdGVtcFRleHRBcmVhLnNlbGVjdCgpO1xyXG5cclxuICAgIC8vIENvcHkgdGhlIHRleHQgdG8gdGhlIGNsaXBib2FyZFxyXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcclxuXHJcbiAgICAvLyBSZW1vdmUgdGhlIHRlbXBvcmFyeSB0ZXh0YXJlYVxyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZW1wVGV4dEFyZWEpO1xyXG5cclxuICAgIC8vIE9wdGlvbmFsbHksIHlvdSBjYW4gYWxlcnQgdGhlIHVzZXIgb3IgY2hhbmdlIHRoZSBidXR0b24gdGV4dCB0byBpbmRpY2F0ZSB0aGUgY29weSB3YXMgc3VjY2Vzc2Z1bFxyXG4gICAgLy8gYWxlcnQoJ1RleHQgY29waWVkIHRvIGNsaXBib2FyZCEnKTtcclxuXHJcbiAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IHRydWU7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAvLyBSZXNldCB0aGUgY29waWVkIHN0YXRlIGFmdGVyIGEgZGVsYXlcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9LCAyMDAwKTsgLy8gUmVzZXQgYWZ0ZXIgMiBzZWNvbmRzXHJcbiAgfVxyXG4gIGhhbmRsZUNvcHlDbGljayhpbmRleDogYW55KSB7XHJcbiAgICAvLyBDb3B5IHRoZSBtZXNzYWdlIHRvIHRoZSBjbGlwYm9hcmRcclxuICAgIGNvbnN0IGNvbnRlbnRUb0NvcHkgPSB0aGlzLmNoYXRMb2dbaW5kZXhdLm1lc3NhZ2U7XHJcbiAgICBjb25zdCByZXN1dGx0ID0gdGhpcy5jb3B5VGV4dCgnbWVzc2FnZVRleHRfJyArIGluZGV4LCBpbmRleCk7XHJcbiAgfVxyXG5cclxuICBzYW5pdGl6ZUhUTUwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIG5ldyBkb2N1bWVudCBmcmFnbWVudCB0byBob2xkIHRoZSBzaW1wbGlmaWVkIGNvbnRlbnRcclxuICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgY2hpbGRyZW4gb2YgdGhlIGJvZHkgb2YgdGhlIHBhcnNlZCBkb2N1bWVudCB0byB0aGUgZnJhZ21lbnRcclxuICAgIEFycmF5LmZyb20oZG9jLmJvZHkuY2hpbGROb2RlcykuZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDcmVhdGUgYSBuZXcgZGl2IGVsZW1lbnQgdG8gaG9sZCB0aGUgc2ltcGxpZmllZCBIVE1MXHJcbiAgICBjb25zdCBzaW1wbGlmaWVkRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICBzaW1wbGlmaWVkRGl2LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcclxuXHJcbiAgICAvLyBSZW1vdmUgY29tcGxleCB0YWdzIG9yIGF0dHJpYnV0ZXMgYXMgbmVlZGVkXHJcbiAgICAvLyBFeGFtcGxlOiByZW1vdmUgc2NyaXB0c1xyXG4gICAgc2ltcGxpZmllZERpdlxyXG4gICAgICAucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JylcclxuICAgICAgLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKTtcclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIHNpbXBsaWZpZWQgSFRNTCBhcyBhIHN0cmluZ1xyXG4gICAgcmV0dXJuIHNpbXBsaWZpZWREaXYuaW5uZXJIVE1MO1xyXG4gIH1cclxuXHJcbiAgY3VycmVudE1lc3NhZ2VGb3JFZGl0b3I6IGFueSA9ICcnO1xyXG4gIGN1cnJlbnRJbmRleEZvckVkaXRvcjogYW55ID0gLTE7XHJcbiAgaGFuZGxlRWRpdG9yQ2xpY2soaW5kZXg6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4Rm9yRWRpdG9yID09IC0xKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEluZGV4Rm9yRWRpdG9yID0gaW5kZXg7XHJcbiAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2VGb3JFZGl0b3IgPSB0aGlzLnNhbml0aXplSFRNTChcclxuICAgICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLm1lc3NhZ2VcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvciA9IHRoaXMuY3VycmVudE1lc3NhZ2VGb3JFZGl0b3IucmVwbGFjZShcclxuICAgICAgICAnU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzonLFxyXG4gICAgICAgICcnXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5jdXJyZW50SW5kZXhGb3JFZGl0b3IgPT0gaW5kZXgpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yICs9IHRoaXMuc2FuaXRpemVIVE1MKFxyXG4gICAgICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5tZXNzYWdlXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yID0gdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvci5yZXBsYWNlKFxyXG4gICAgICAgICAgJ1NhZmVWYWx1ZSBtdXN0IHVzZSBbcHJvcGVydHldPWJpbmRpbmc6JyxcclxuICAgICAgICAgICcnXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SW5kZXhGb3JFZGl0b3IgPSBpbmRleDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yID0gdGhpcy5zYW5pdGl6ZUhUTUwoXHJcbiAgICAgICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLm1lc3NhZ2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2VGb3JFZGl0b3IgPSB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yLnJlcGxhY2UoXHJcbiAgICAgICAgICAnU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzonLFxyXG4gICAgICAgICAgJydcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jaGF0TG9nW2luZGV4XS5pc0VkaXRvciA9IHRydWU7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAvLyBSZXNldCB0aGUgY29waWVkIHN0YXRlIGFmdGVyIGEgZGVsYXlcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmlzRWRpdG9yID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0sIDIwMDApOyAvLyBSZXNldCBhZnRlciAyIHNlY29uZHNcclxuICAgIHRoaXMuZWRpdG9yc0RyYXdlci5vcGVuKCk7XHJcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm90Y2xvc2VwbGF5Z3JvdW5kYnV0dG9uJyk7XHJcbiAgICBpZiAoYnV0dG9uKSB7XHJcbiAgICAgIGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBzY3JvbGxUb0JvdHRvbSgpIHtcclxuICAgIGxldCBjb3VudGVyID0gMDtcclxuICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNoYXRNYWluLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5jaGF0TWFpbi5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcclxuICAgICAgaWYgKGNvdW50ZXIrKyA+IDUpIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xyXG4gICAgfSwgNSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVBY3Rpb24oYWN0aW9uOiBhbnkpIHtcclxuICAgIGNvbnNvbGUuaW5mbygnaW5jb21pbmcgYWN0aW9uIGZyb20gdGhlIGNoYXRib3QgQUknKTtcclxuICAgIGNvbnNvbGUuaW5mbyhhY3Rpb24pO1xyXG5cclxuICAgIGlmIChhY3Rpb24/LmNvbnRlbnQpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIC8vIENoZWNrIGlmIHRoZSBkcmF3ZXIgaXMgaW5pdGlhbGx5IG9wZW4gYW5kIGFwcGx5IG92ZXJmbG93IGhpZGRlbiB0byBib2R5IGlmIHNvXHJcbiAgICBpZiAodGhpcy5kcmF3ZXIub3BlbmVkKSB7XHJcbiAgICAgIHRoaXMuc2V0Qm9keU92ZXJmbG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTGlzdGVuIHRvIGNoYW5nZXMgaW4gdGhlIGRyYXdlciBiZWluZyBvcGVuZWQgb3IgY2xvc2VkXHJcbiAgICB0aGlzLmRyYXdlci5vcGVuZWRDaGFuZ2Uuc3Vic2NyaWJlKChvcGVuZWQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgaWYgKG9wZW5lZCkge1xyXG4gICAgICAgIHRoaXMuc2V0Qm9keU92ZXJmbG93KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVCb2R5T3ZlcmZsb3coKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kcmF3ZXIub3BlbmVkQ2hhbmdlLnN1YnNjcmliZSgob3BlbmVkKSA9PiB7XHJcbiAgICAgIGlmIChvcGVuZWQpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLm15VGV4dGFyZWEgJiYgdGhpcy5teVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5teVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTsgLy8gRm9jdXMgb24gdGhlIHRleHRhcmVhXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRCb2R5T3ZlcmZsb3coKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVCb2R5T3ZlcmZsb3coKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3BlYWtlcnNCeVN0YWZmSWRzKGlkcykge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5VU0VSU19BUEl9L2V2ZW50cy8ke3RoaXMuZXZlbnRJZH0vdXNlcnMvZ2V0LWJ5LXN0YWZmLWlkc2A7XHJcbiAgICBmZXRjaCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246ICdCZWFyZXIgJyArICd5b3VyX3Rva2VuX2hlcmUnLFxyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpLFxyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpOyAvLyBQYXJzZSB0aGUgSlNPTiBib2R5IG9mIHRoZSByZXNwb25zZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvay4nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGRhdGEuZm9yRWFjaCgoc3BlYWtlcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNwZWFrZXJzW3NwZWFrZXIuaWRdID0gc3BlYWtlcjtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBkYXRhOicsIGVycik7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcGVyZm9ybVNlc3Npb25BY3Rpb24oc2Vzc2lvbklkLCBhY3Rpb24pIHtcclxuICAgIHRoaXMuc2Vzc2lvbkFjdGlvbnMubmV4dCh7XHJcbiAgICAgIHNlc3Npb25JZCxcclxuICAgICAgYWN0aW9uLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRDbG9zZUJvdENsaWNrRXZlbnQoKSB7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2Nsb3NlQm90Tm93Jyk7XHJcbiAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihlbGVtZW50LCAnY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jbG9zZUJvdC5uZXh0KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNNb2JpbGVCcm93c2VyKCkge1xyXG4gICAgcmV0dXJuIC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChcclxuICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNvbm5lY3RUb1VzZXIodXNlcklkKSB7XHJcbiAgICB0aGlzLmNvbm5lY3RXaXRoVXNlci5lbWl0KHtcclxuICAgICAgY29ubmVjdDogIXRoaXMuY2FuRGlzY29ubmVjdCh1c2VySWQpLFxyXG4gICAgICB1c2VySWQsXHJcbiAgICB9KTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5mZXRjaE15Q29ubmVjdGlvbnMoKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5mZXRjaFBlbmRpbmdSZXF1ZXN0cygpLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcblxyXG4gIHNjaGVkdWxlTWVldGluZ1dpdGhVc2VyKHVzZXIpIHtcclxuICAgIHRoaXMuc2NoZWR1bGVNZWV0aW5nLmVtaXQodXNlcik7XHJcbiAgfVxyXG5cclxuICBjYW5Db25uZWN0KHVzZXJJZCkge1xyXG4gICAgcmV0dXJuICEoXHJcbiAgICAgIHRoaXMuY2FuRGlzY29ubmVjdCh1c2VySWQpIHx8XHJcbiAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmZpbmQoKGEpID0+IGEgPT0gdXNlcklkKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNhbkRpc2Nvbm5lY3QodXNlcklkKSB7XHJcbiAgICByZXR1cm4gdGhpcy5teUNvbm5lY3Rpb25zLmZpbmQoKGNvbm4pID0+IGNvbm4udXNlcklkID09IHVzZXJJZCk7XHJcbiAgfVxyXG5cclxuICBmZXRjaFBlbmRpbmdSZXF1ZXN0cygpIHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBhcGlLZXk6IHRoaXMuYXV0b2dlbktleSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0KFxyXG4gICAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuVVNFUlNfQVBJfS9ldmVudHMvJHt0aGlzLmV2ZW50SWR9L2Nvbm5lY3Rpb24tcmVxdWVzdHMvYXV0b2dlbi9wZW5kaW5nLXNlbnQtcmVxdWVzdHM/dXNlcklkPSR7dGhpcy51c2VySWR9YCxcclxuICAgICAgICB7IGhlYWRlcnMgfVxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gcmVzO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICByZXR1cm4gb2YocmVzKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBwZW5kaW5nIHJlcXVlc3RzOiAnLCBlcnJvcik7XHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGZldGNoTXlDb25uZWN0aW9ucygpIHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBhcGlLZXk6IHRoaXMuYXV0b2dlbktleSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0KFxyXG4gICAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuVVNFUlNfQVBJfS9ldmVudHMvJHt0aGlzLmV2ZW50SWR9L3VzZXJzLWNvbm5lY3Rpb25zL2F1dG9nZW4/dXNlcklkPSR7dGhpcy51c2VySWR9YCxcclxuICAgICAgICB7IGhlYWRlcnMgfVxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMubXlDb25uZWN0aW9ucyA9IHJlcztcclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcGVuZGluZyByZXF1ZXN0czogJywgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBpc0Ryb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGFnZW50czogYW55O1xyXG4gIHNlbGVjdGVkQWdlbnRzID0gW107XHJcbiAgYWxsU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAvLyBUb2dnbGUgdGhlIGRyb3Bkb3duIHZpc2liaWxpdHlcclxuICB0b2dnbGVEcm9wZG93bigpIHtcclxuICAgIGlmICghdGhpcy5hZ2VudHMpXHJcbiAgICAgIHRoaXMuZmV0Y2hBZ2VudHMoKTtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0Ryb3Bkb3duT3BlbjtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0QWxsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5hZ2VudHM/LmZvckVhY2goKGFnZW50KSA9PiAoYWdlbnQuc2VsZWN0ZWQgPSBmYWxzZSkpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgb25BZ2VudENoYW5nZShhZ2VudDogYW55KTogdm9pZCB7XHJcbiAgICAvL2FnZW50LnNlbGVjdGVkID0gIWFnZW50LnNlbGVjdGVkO1xyXG4gICAgLy9jb25zb2xlLmxvZyhhZ2VudCk7XHJcbiAgICBsZXQgYWdlbnRGb3VuZCA9IHRoaXMuYWdlbnRzLmZpbHRlcigocCkgPT4gcC5pZCA9PSBhZ2VudC5pZCk7XHJcbiAgICBpZiAoYWdlbnRGb3VuZCAmJiBhZ2VudEZvdW5kLmxlbmd0aCA+IDApIHtcclxuICAgICAgYWdlbnRGb3VuZFswXS5zZWxlY3RlZCA9ICFhZ2VudEZvdW5kWzBdLnNlbGVjdGVkO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBhcmVBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFnZW50cz8uZXZlcnkoKGFnZW50KSA9PiAhYWdlbnQuc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RHJvcGRvd25IZWFkZXJUZXh0KCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZEFnZW50cyA9IHRoaXMuYWdlbnRzPy5maWx0ZXIoKGFnZW50KSA9PiBhZ2VudC5zZWxlY3RlZCk7XHJcbiAgICBpZiAoIXNlbGVjdGVkQWdlbnRzKSB7XHJcbiAgICAgIHJldHVybiAnQWxsIEFnZW50cyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoc2VsZWN0ZWRBZ2VudHMgJiYgc2VsZWN0ZWRBZ2VudHM/Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiAnQWxsIEFnZW50cyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkQWdlbnRzPy5sZW5ndGggPiAxXHJcbiAgICAgICAgICA/IGAke3NlbGVjdGVkQWdlbnRzPy5sZW5ndGh9IEFnZW50cyBTZWxlY3RlZGBcclxuICAgICAgICAgIDogYCR7c2VsZWN0ZWRBZ2VudHM/Lmxlbmd0aH0gQWdlbnQgU2VsZWN0ZWRgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZldGNoQWdlbnRzX2h0dHAoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5BR0VOVFNfQVBJfS9Db1BpbG90LyR7dGhpcy5ib3RJZH0vYWN0aXZlLWFnZW50c2A7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIHt9LCB7IGhlYWRlcnMgfSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAgIHRoaXMuYWdlbnRzID0gcmVzLm1hcCgoYWdlbnQpID0+ICh7XHJcbiAgICAgICAgICAgIC4uLmFnZW50LFxyXG4gICAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgICByZXR1cm4gb2YocmVzKTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdGJvdCBjb25maWc6ICcsIGVycm9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgaXNEb2NJbkVkaXRNb2RlID0gZmFsc2U7XHJcbiAgZG9jdW1lbnRDb250ZW50OiBhbnk7XHJcblxyXG4gIGNvbnZlcnNhdGlvbklkOiBhbnk7XHJcbiAgaXNDb250ZW50TG9hZGVkID0gZmFsc2U7XHJcblxyXG4gIGZldGNoQ29udGVudF9odHRwKCkge1xyXG4gICAgdGhpcy5pc0RvY0luRWRpdE1vZGUgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNDb250ZW50TG9hZGVkID0gZmFsc2U7XHJcbiAgICBjb25zb2xlLmxvZygnQVBJIGNhbGwgZnVuY3Rpb24nKTtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBjb252ZXJzYXRpb25faWQgPSB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2V0S2V5KHRoaXMuYm90SWQpO1xyXG4gICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbl9pZDtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQUdFTlRTX0FQSX0vQ29udmVyc2F0aW9uRG9jdW1lbnRzP2NvbnZlcnNhdGlvbklkPSR7Y29udmVyc2F0aW9uX2lkfSZib3RJZD0ke3RoaXMuYm90SWR9YDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBhcGlLZXk6ICdXSXovcUFtK0VFbWZPa0ZhVUEvd2VBPT0nLFxyXG4gICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWVcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgeyBoZWFkZXJzIH0pLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICB0aGlzLmlzRG9jSW5FZGl0TW9kZSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmRvY3VtZW50Q29udGVudCA9IHJlcztcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQVBJIGNhbGxsZWQgc3VjY2VzcycpO1xyXG4gICAgICAgICAgdGhpcy5pc0NvbnRlbnRMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgY29uc29sZS5sb2cocmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvZihyZXMpO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjaGF0Ym90IGNvbmZpZyBESjogJywgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuaXNEb2NJbkVkaXRNb2RlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0NvbnRlbnRMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3I/LnN0YXR1cyA9PSA0MDQpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdkYXNoJyk7XHJcbiAgICAgICAgICB0aGlzLmlzRG9jSW5FZGl0TW9kZSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5pc0NvbnRlbnRMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hBZ2VudHMoKSB7XHJcbiAgICB0aGlzLmZldGNoQWdlbnRzX2h0dHAoKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGZldGNoRWRpdG9yQ29udGVudCgpIHtcclxuICAgIHRoaXMuZmV0Y2hDb250ZW50X2h0dHAoKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8vIGV2ZW50cy8ke2V2ZW50SWR9L3VzZXJzLWNvbm5lY3Rpb25zXHJcbiAgcHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KG1hcmtkb3duOiBzdHJpbmcpOiBTYWZlSHRtbCB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBDcmVhdGUgYSBjdXN0b20gcmVuZGVyZXIgdG8gbW9kaWZ5IDxhPiB0YWdzXHJcbiAgICAgIGNvbnN0IHJlbmRlcmVyID0gbmV3IG1hcmtlZC5SZW5kZXJlcigpO1xyXG5cclxuICAgICAgLy8gQ3VzdG9taXplIGFuY2hvciB0YWdzIHRvIGluY2x1ZGUgdGFyZ2V0PVwiX2JsYW5rXCJcclxuICAgICAgcmVuZGVyZXIubGluayA9IChocmVmOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHJldHVybiBgPGEgaHJlZj1cIiR7aHJlZn1cIiB0aXRsZT1cIiR7dGl0bGUgfHwgJydcclxuICAgICAgICAgIH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke3RleHR9PC9hPmA7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvLyBQYXJzZSB0aGUgbWFya2Rvd24gY29udGVudCB0byBIVE1MIHVzaW5nIG1hcmtlZCB3aXRoIHRoZSBjdXN0b20gcmVuZGVyZXJcclxuICAgICAgY29uc3QgbWFya2Rvd25Db250ZW50ID0gbWFya2VkLnBhcnNlKG1hcmtkb3duLCB7IHJlbmRlcmVyOiByZW5kZXJlciB9KTtcclxuXHJcbiAgICAgIC8vIFNhbml0aXplIHRoZSBwYXJzZWQgSFRNTCB1c2luZyBBbmd1bGFyJ3MgRG9tU2FuaXRpemVyXHJcbiAgICAgIGNvbnN0IHNhbml0aXplZEh0bWwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcclxuICAgICAgICBtYXJrZG93bkNvbnRlbnRcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIFJldHVybiB0aGUgc2FmZSBIVE1MIGNvbnRlbnQgZm9yIGRpc3BsYXlcclxuICAgICAgcmV0dXJuIHNhbml0aXplZEh0bWw7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIG1hcmtkb3duOicsIGVycm9yKTtcclxuICAgICAgcmV0dXJuICcnOyAvLyBSZXR1cm4gYW4gZW1wdHkgc3RyaW5nIG9yIGhhbmRsZSB0aGUgZXJyb3IgYXBwcm9wcmlhdGVseVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJlcGFyZUh0bWwobWFya2Rvd246IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIW1hcmtkb3duIHx8ICEobWFya2Rvd24ubGVuZ3RoID4gMCkpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignSW5wdXQgTWFya2Rvd24gaXMgbnVsbCBvciBlbXB0eScpO1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBoZWFkZXJzICgjIyMgb3IgIyMpIHRvIDxzdHJvbmc+IGZvciBib2xkIGhlYWRpbmdzXHJcbiAgICBsZXQgaHRtbCA9IG1hcmtkb3duLnJlcGxhY2UoL14oI3sxLDZ9KVxccysoLiopJC9nbSwgKG1hdGNoLCBoYXNoZXMsIHRleHQpID0+IHtcclxuICAgICAgY29uc3QgbGV2ZWwgPSBoYXNoZXMubGVuZ3RoO1xyXG4gICAgICBpZiAobGV2ZWwgPT09IDMpIHtcclxuICAgICAgICByZXR1cm4gYDxoMz48c3Ryb25nPiR7dGV4dH08L3N0cm9uZz48L2gzPmA7XHJcbiAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT09IDQpIHtcclxuICAgICAgICByZXR1cm4gYDxoND48c3Ryb25nPiR7dGV4dH08L3N0cm9uZz48L2g0PmA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGA8c3Ryb25nPiR7dGV4dH08L3N0cm9uZz5gO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBjb2RlIGJsb2NrcyB3aXRoIGxhbmd1YWdlIHRvIHByZWZvcm1hdHRlZCBIVE1MXHJcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9gYGAoXFx3Kyk/XFxuKFtcXHNcXFNdKj8pYGBgL2csIChtYXRjaCwgbGFuZywgY29kZSkgPT4ge1xyXG4gICAgICBjb25zdCBlc2NhcGVkQ29kZSA9IHRoaXMuZXNjYXBlSHRtbChjb2RlKTtcclxuICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5nIHx8ICdwbGFpbnRleHQnO1xyXG5cclxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBidXR0b24gZm9yIHRoZSBjb2RlIGJsb2NrXHJcbiAgICAgIHJldHVybiBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2RlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxidXR0b24gaWQ9XCJjb3B5LWJ1dHRvblwiIGNsYXNzPVwiY29weS1idXR0b25cIiAoY2xpY2spPVwiY29weVRvQ2xpcGJvYXJkKCdcXGAke2VzY2FwZWRDb2RlfVxcYCcpXCI+Q29weTwvYnV0dG9uPlxyXG4gICAgICAgIDxwcmUgY2xhc3M9XCJjb2RlX2Jsb2NrIGRpZmZcIj48Y29kZSBjbGFzcz1cImxhbmd1YWdlLSR7bGFuZ3VhZ2V9XCI+JHtlc2NhcGVkQ29kZX08L2NvZGU+PC9wcmU+XHJcbiAgICAgIDwvZGl2PmA7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDb252ZXJ0IGlubGluZSBjb2RlICh3cmFwcGVkIGluIGBiYWNrdGlja3NgKSB0byBpbmxpbmUgPGNvZGU+IHRhZ3NcclxuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL2AoW15gXSspYC9nLCAnPGNvZGU+JDE8L2NvZGU+Jyk7XHJcblxyXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBib2xkIHRvIEhUTUwgPHN0cm9uZz5cclxuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL1xcKlxcKiguKj8pXFwqXFwqL2csICc8c3Ryb25nPiQxPC9zdHJvbmc+Jyk7XHJcblxyXG4gICAgLy8gQ29udmVydCBudW1iZXJlZCBsaXN0c1xyXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXlxcZCtcXC5cXHMrKC4qKSQvZ20sICc8bGk+JDE8L2xpPicpO1xyXG5cclxuICAgIC8vIENvbnZlcnQgYnVsbGV0IHBvaW50IGxpc3RzXHJcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9eXFwtXFxzKyguKikkL2dtLCAnPGxpPiQxPC9saT4nKTtcclxuXHJcbiAgICAvLyBDb252ZXJ0IE1hcmtkb3duIGxpbmtzIHRvIEhUTUwgbGlua3NcclxuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL1xcWyhbXlxcXV0rKV1cXCgoW14pXSspXFwpL2csICc8YSBocmVmPVwiJDJcIiB0YXJnZXQ9XCJfYmxhbmtcIj4kMTwvYT4nKTtcclxuXHJcbiAgICAvLyBDb252ZXJ0IG5ldyBsaW5lcyB0byA8YnI+IHRhZ3MgZm9yIHBhcmFncmFwaHNcclxuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLyg/OlxcclxcbnxcXHJ8XFxuKS9nLCAnPGJyPicpO1xyXG5cclxuICAgIHJldHVybiBodG1sO1xyXG4gIH1cclxuXHJcbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGVzY2FwZSBIVE1MIGNoYXJhY3RlcnMgZm9yIGNvZGUgYmxvY2tzXHJcbiAgZXNjYXBlSHRtbChjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGNvZGVcclxuICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcclxuICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxyXG4gICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXHJcbiAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcclxuICAgICAgLnJlcGxhY2UoLycvZywgJyYjMDM5OycpO1xyXG4gIH1cclxuXHJcbiAgLy8gRnVuY3Rpb24gdG8gY29weSB0ZXh0IHRvIGNsaXBib2FyZFxyXG4gIHB1YmxpYyBjb3B5VG9DbGlwYm9hcmQodGV4dDogc3RyaW5nKSB7XHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KS50aGVuKCgpID0+IHtcclxuICAgICAgYWxlcnQoJ0NvZGUgY29waWVkIHRvIGNsaXBib2FyZCEnKTtcclxuICAgIH0sIChlcnIpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGNvcHkgdGV4dDogJywgZXJyKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICBpc0NvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIGlzQ29sbGFwc2VkRm9yR3JhcGggPSBmYWxzZTtcclxuICBpc0NvbGxhcHNlZEZvckZHcmFwaCA9IGZhbHNlO1xyXG4gIHRvZ2dsZUNvbGxhcHNlKCkge1xyXG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9ICF0aGlzLmlzQ29sbGFwc2VkO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ29sbGFwc2VHcmFwaCgpIHtcclxuICAgIHRoaXMuaXNDb2xsYXBzZWRGb3JHcmFwaCA9ICF0aGlzLmlzQ29sbGFwc2VkRm9yR3JhcGg7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIHRvZ2dsZUNvbGxhcHNlRkdyYXBoKCkge1xyXG4gICAgdGhpcy5pc0NvbGxhcHNlZEZvckZHcmFwaCA9ICF0aGlzLmlzQ29sbGFwc2VkRm9yRkdyYXBoO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICAvLyAgIFtcclxuICAvLyAgIHtcclxuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkFJIE5ld3MgSmFudWFyeSAyMDI0OiBJbi1EZXB0aCBhbmQgQ29uY2lzZSAtIFRoZSBBSSBUcmFja1wiLFxyXG4gIC8vICAgICBcImRlc2NcIjogXCJFYWNoIG1vbnRoLCB3ZSBjb21waWxlIHNpZ25pZmljYW50IG5ld3MsIHRyZW5kcywgYW5kIGhhcHBlbmluZ3MgaW4gQUksIHByb3ZpZGluZyBkZXRhaWxlZCBzdW1tYXJpZXMgd2l0aCBrZXkgcG9pbnRzIGluIGJ1bGxldCBmb3JtIGZvciBjb25jaXNlIHlldCBjb21wbGV0ZSB1bmRlcnN0YW5kaW5nLlwiLFxyXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL3RoZWFpdHJhY2suY29tL2FpLW5ld3MtamFudWFyeS0yMDI0L1wiXHJcbiAgLy8gICB9LFxyXG4gIC8vICAge1xyXG4gIC8vICAgICBcInRpdGxlXCI6IFwiVG9wIEFJIE5ld3MsIEphbnVhcnkgMjAyNCAtIEV2ZXJ5cGl4ZWwgSm91cm5hbFwiLFxyXG4gIC8vICAgICBcImRlc2NcIjogXCJJbiB0aGlzIG1vbnRobHkgcm91bmR1cCwgd2Ugc3BvdGxpZ2h0IHRoZSB0b3AgQUkgbmV3cyBzdG9yaWVzIGZyb20gSmFudWFyeSwgaW5jbHVkaW5nIHRoZSBPcGVuQUkgdnMuIFRoZSBOZXcgWW9yayBUaW1lcyBMYXdzdWl0LlwiLFxyXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL2pvdXJuYWwuZXZlcnlwaXhlbC5jb20vdG9wLWFpLW5ld3MtamFudWFyeS0yMDI0XCJcclxuICAvLyAgIH0sXHJcbiAgLy8gICB7XHJcbiAgLy8gICAgIFwidGl0bGVcIjogXCJBSSBOZXdzIEp1bHkgMjAyNDogSW4tRGVwdGggYW5kIENvbmNpc2UgLSBUaGUgQUkgVHJhY2tcIixcclxuICAvLyAgICAgXCJkZXNjXCI6IFwiVGhpcyBwYWdlIGZlYXR1cmVzIEFJIE5ld3MgZm9yIEp1bHkgMjAyNCwgaGlnaGxpZ2h0aW5nIHNpZ25pZmljYW50IGV2ZW50cyBzdWNoIGFzIENhbnZhIGFjcXVpcmluZyBMZW9uYXJkbyBBSS5cIixcclxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly90aGVhaXRyYWNrLmNvbS9haS1uZXdzLWp1bHktMjAyNC1pbi1kZXB0aC1hbmQtY29uY2lzZS9cIlxyXG4gIC8vICAgfSxcclxuICAvLyAgIHtcclxuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkphbnVhcnkgbmV3cyByb3VuZHVwOiBXaGF0J3MgbmV3IGluIHRoZSB3b3JsZCBvZiBBST8gLSBQbHVyYWxzaWdodFwiLFxyXG4gIC8vICAgICBcImRlc2NcIjogXCJPcGVuQUnigJlzIG5ldyBHUFQgc3RvcmUsIGJ1c2luZXNzLXJlYWR5IENoYXRHUFQgcGxhbnMsIGFuZCBhIHByZWRpY3RlZCByaXNlIGluIEFJLXBvd2VyZWQgY3liZXJjcmltZS5cIixcclxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly93d3cucGx1cmFsc2lnaHQuY29tL3Jlc291cmNlcy9ibG9nL2RhdGEvYWktdGhpcy1tb250aC1qYW51YXJ5LTIwMjRcIlxyXG4gIC8vICAgfSxcclxuICAvLyAgIHtcclxuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkFJIE5ld3MgQXVndXN0IDIwMjQ6IEluLURlcHRoIGFuZCBDb25jaXNlIC0gVGhlIEFJIFRyYWNrXCIsXHJcbiAgLy8gICAgIFwiZGVzY1wiOiBcIlRoaXMgcGFnZSBmZWF0dXJlcyBBSSBOZXdzIGZvciBBdWd1c3QgMjAyNCwgd2l0aCBoaWdobGlnaHRzIHN1Y2ggYXMgTnZpZGlhIGRlbGF5aW5nIHRoZSDigJxCbGFja3dlbGzigJ0gQjIwMCBBSSBjaGlwcyBkZWxpdmVyeS5cIixcclxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly90aGVhaXRyYWNrLmNvbS9haS1uZXdzLWF1Z3VzdC0yMDI0LWluLWRlcHRoLWFuZC1jb25jaXNlLWR1cGxpY2F0ZS9cIlxyXG4gIC8vICAgfVxyXG4gIC8vIF1cclxuICBkYXRlVGltZSA9IHsgbm93OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfTtcclxuICAvLyBFeHRyYWN0cyB0aGUgZG9tYWluIGZyb20gYSBVUkxcclxuICBnZXREb21haW5OYW1lKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHsgaG9zdG5hbWUgfSA9IG5ldyBVUkwodXJsKTtcclxuICAgICAgcmV0dXJuIGhvc3RuYW1lLnJlcGxhY2UoL153d3dcXC4vLCAnJyk7IC8vIFJlbW92ZSAnd3d3LicgaWYgcHJlc2VudFxyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiAndW5rbm93bic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBHZW5lcmF0ZXMgdGhlIGZhdmljb24gVVJMXHJcbiAgZ2V0RmF2aWNvblVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBkb21haW4gPSB0aGlzLmdldERvbWFpbk5hbWUodXJsKTtcclxuICAgIHJldHVybiBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zMi9mYXZpY29ucz9zej0xMjgmZG9tYWluPSR7ZG9tYWlufWA7XHJcbiAgfVxyXG4gIGN1cnJlbnRTb3VyY2VzTGlzdDogYW55ID0gW107XHJcbiAgb25DYXJkQ2xpY2soc291cmNlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50U291cmNlc0xpc3QgPSBzb3VyY2VzO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5zb3VyY2VzRHJhd2VyLm9wZW4oKTtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcclxuICAgIGlmIChidXR0b24pIHtcclxuICAgICAgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc1Nob3dFZGl0b3JCdXR0b24gPSB0cnVlO1xyXG5cclxuICBvcGVuT3V0ZXJFZGl0b3IoKSB7XHJcbiAgICB0aGlzLmZldGNoRWRpdG9yQ29udGVudCgpO1xyXG4gICAgdGhpcy5lZGl0b3JzRHJhd2VyLm9wZW4oKTtcclxuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNTaG93RWRpdG9yQnV0dG9uID0gZmFsc2U7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdGNsb3NlcGxheWdyb3VuZGJ1dHRvbicpO1xyXG4gICAgaWYgKGJ1dHRvbikge1xyXG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2xvc2VFZGl0b3IoKSB7XHJcbiAgICB0aGlzLmVkaXRvcnNEcmF3ZXIuY2xvc2UoKTtcclxuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzU2hvd0VkaXRvckJ1dHRvbiA9IHRydWU7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWVkZWRcclxuICAgIHRoaXMub25EcmF3ZXJDbG9zZWQoKTtcclxuICB9XHJcblxyXG4gIG9uQ2xvc2VTb3VyY2UoKSB7XHJcbiAgICB0aGlzLnNvdXJjZXNEcmF3ZXIuY2xvc2UoKTtcclxuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWVkZWRcclxuICAgIHRoaXMub25EcmF3ZXJDbG9zZWQoKTtcclxuICB9XHJcbiAgb25EcmF3ZXJDbG9zZWQoKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5pc0RyYXdlck9wZW4gPSB0cnVlO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWVkZWRcclxuICAgICAgLy8gVXNlIG5nQ2xhc3MgdG8gZHluYW1pY2FsbHkgYXBwbHkgdGhlIGNsYXNzXHJcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcclxuICAgICAgaWYgKGJ1dHRvbikge1xyXG4gICAgICAgIGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgfVxyXG4gICAgfSwgODAwKTtcclxuICB9XHJcbiAgaXNEcmF3ZXJPcGVuID0gdHJ1ZTtcclxuXHJcbiAgdG9nZ2xlRHJhd2VyKHRvZG8pIHtcclxuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gdG9kbztcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMudXBkYXRlQnV0dG9uVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuICB1cGRhdGVCdXR0b25WaXNpYmlsaXR5KCkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdGNsb3NlcGxheWdyb3VuZGJ1dHRvbicpO1xyXG4gICAgaWYgKGJ1dHRvbikge1xyXG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9IHRoaXMuaXNEcmF3ZXJPcGVuID8gJ2Jsb2NrJyA6ICdub25lJztcclxuICAgIH1cclxuICB9XHJcbiAgb3BlbkxpbmtJbk5ld1RhYihsaW5rOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5vcGVuKGxpbmssICdfYmxhbmsnKTtcclxuICB9XHJcbiAgYWRqdXN0VGV4dGFyZWFIZWlnaHQoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgICAvLyBQcmV2ZW50cyBhIG5ldyBsaW5lIGZyb20gYmVpbmcgYWRkZWRcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgIH1cclxuICAgIGNvbnN0IHRleHRhcmVhID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcbiAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7IC8vIFJlc2V0IHRoZSBoZWlnaHRcclxuICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9IGAke3RleHRhcmVhLnNjcm9sbEhlaWdodH1weGA7IC8vIEFkanVzdCBoZWlnaHQgdG8gbWF0Y2ggY29udGVudFxyXG4gICAgLy8gRW5zdXJlIHRoZSBoZWlnaHQgZG9lc24ndCBleGNlZWQgdGhlIG1heC1oZWlnaHQgc2V0IGluIENTU1xyXG4gICAgaWYgKHRleHRhcmVhLnNjcm9sbEhlaWdodCA+IDE1MCkge1xyXG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBgMTUwcHhgOyAvLyBBZGp1c3QgaGVpZ2h0IHRvIG1hdGNoIGNvbnRlbnRcclxuICAgICAgdGV4dGFyZWEuc3R5bGUub3ZlcmZsb3dZID0gJ2F1dG8nOyAvLyBFbmFibGUgc2Nyb2xsaW5nIGlmIGNvbnRlbnQgZXhjZWVkcyA0MDBweFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGV4dGFyZWEuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7IC8vIEhpZGUgc2Nyb2xsYmFyIGlmIGNvbnRlbnQgaXMgd2l0aGluIGxpbWl0c1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlV29ya2Zsb3dzKHZhbHVlID0gbnVsbCkge1xyXG5cclxuICAgIGlmICghdGhpcy5jaGVja0ZvckNvcDI5Qm90SWQoKSkge1xyXG4gICAgICB0aGlzLmJvdFNlcnZpY2UuZ2V0V29ya2Zsb3dzQnlPcmdJZCh0aGlzLm9yZ0lkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMub3JnV29ya2Zsb3dzID0gcmVzO1xyXG4gICAgICAgIHRoaXMuaXNXb3JrZmxvd09wZW4gPSB2YWx1ZSA9PSBudWxsID8gIXRoaXMuaXNXb3JrZmxvd09wZW4gOiB2YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzV29ya2Zsb3dPcGVuKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3cgPSBudWxsO1xyXG4gICAgICAgICAgdGhpcy5vcGVuV29ya2Zsb3dJbnB1dCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybSgpIHtcclxuICAgIC8vIENyZWF0ZSBmb3JtIGNvbnRyb2xzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHNlbGVjdGVkV29ya2Zsb3cuVHJpZ2dlci5JbnB1dFNjaGVtYVxyXG4gICAgY29uc3QgZm9ybUNvbnRyb2xzID0ge307XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFdvcmtmbG93Py5UcmlnZ2VyPy5JbnB1dFNjaGVtYSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3cuVHJpZ2dlci5JbnB1dFNjaGVtYS5mb3JFYWNoKChpbnB1dCkgPT4ge1xyXG4gICAgICAgIGZvcm1Db250cm9sc1tpbnB1dC5JbnB1dElkXSA9IFtcclxuICAgICAgICAgIGlucHV0LlZhbHVlIHx8ICcnLFxyXG4gICAgICAgICAgaW5wdXQuUmVxdWlyZWQgPyBWYWxpZGF0b3JzLnJlcXVpcmVkIDogbnVsbCxcclxuICAgICAgICBdO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJbml0aWFsaXplIHRoZSBmb3JtXHJcbiAgICB0aGlzLndvcmtmbG93Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoZm9ybUNvbnRyb2xzKTtcclxuICB9XHJcblxyXG4gIG9uV29ya2Zsb3dTZWxlY3RlZCh3b3JrZmxvdykge1xyXG4gICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93ID0gd29ya2Zsb3c7XHJcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XHJcbiAgICB0aGlzLmlzV29ya2Zsb3dPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLm9wZW5Xb3JrZmxvd0lucHV0ID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9uV29ya2Zsb3dTdWJtaXQoKSB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxsQ2hhdHMnKTtcclxuICAgIGlmICh0aGlzLndvcmtmbG93Rm9ybS52YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLndvcmtmbG93Rm9ybS52YWx1ZSk7XHJcblxyXG4gICAgICB2YXIgaW5wdXQgPSB0aGlzLnByZXBhcmVIdG1sKFxyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVNYXJrZG93bihcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvdy5OYW1lLFxyXG4gICAgICAgICAgdGhpcy53b3JrZmxvd0Zvcm0udmFsdWVcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyB1cGRhdGUgbGFzdCB0d28gY2hhdExvZyBlbnRyaWVzLCBzZXQgc2hvd1dvcmtmbG93RXhlY3V0aW9uTG9hZGVyID0gZmFsc2VcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmNoYXRMb2dbdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDFdW1xyXG4gICAgICAgICAgJ3Nob3dXb3JrZmxvd0V4ZWN1dGlvbkxvYWRlcidcclxuICAgICAgICBdID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jaGF0TG9nW3RoaXMuY2hhdExvZy5sZW5ndGggLSAyXVtcclxuICAgICAgICAgICdzaG93V29ya2Zsb3dFeGVjdXRpb25Mb2FkZXInXHJcbiAgICAgICAgXSA9IGZhbHNlO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikgeyB9XHJcblxyXG4gICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgdHlwZTogJ3VzZXInLFxyXG4gICAgICAgIG1lc3NhZ2U6IGlucHV0LFxyXG4gICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcclxuICAgICAgICBjb3BpZWQ6IGZhbHNlLFxyXG4gICAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2UsXHJcbiAgICAgICAgc2hvd1dvcmtmbG93RXhlY3V0aW9uTG9hZGVyOiB0cnVlLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKGlucHV0KTtcclxuXHJcbiAgICAgIHRoaXMuY3VycmVudFdvcmtmbG93QWN0aW9uUHJvZ3Jlc3MgPSAwO1xyXG4gICAgICB0aGlzLmN1cnJlbnRXb3JrZmxvd0FjdGlvbiA9XHJcbiAgICAgICAgJ0V4ZWN1dGluZyAnICsgdGhpcy5zZWxlY3RlZFdvcmtmbG93LkFjdGlvbnNbMF0uTmFtZTtcclxuICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSB0cnVlO1xyXG4gICAgICB0aGlzLmV4ZWN1dGluZ1dvcmtmbG93ID0gdHJ1ZTtcclxuICAgICAgdGhpcy53b3JrZmxvd0V4ZWN1dGlvbkRldGFpbHMgPSB7XHJcbiAgICAgICAgQWN0aW9uczogdGhpcy5zZWxlY3RlZFdvcmtmbG93LkFjdGlvbnMsXHJcbiAgICAgICAgSW5wdXRzOiB0aGlzLndvcmtmbG93Rm9ybS52YWx1ZSxcclxuICAgICAgICB3b3JrZmxvd0lucHV0czogdGhpcy53b3JrZmxvd0Zvcm0udmFsdWUsXHJcbiAgICAgICAgV29ya2Zsb3dOYW1lOiB0aGlzLnNlbGVjdGVkV29ya2Zsb3cuTmFtZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5jdXJyZW50V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzID0gdGhpcy53b3JrZmxvd0V4ZWN1dGlvbkRldGFpbHM7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuXHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgIC8vIGV4ZWN1dGUgdGhlIGFzayBlbmRwb2ludCB3aXRoIHdvcmtmbG93IGlucHV0XHJcbiAgICAgIHRoaXMubWFrZUFza1JlcXVlc3QoXHJcbiAgICAgICAgaW5wdXQsXHJcbiAgICAgICAgdGhpcy5hZ2VudHMsXHJcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25LZXksXHJcbiAgICAgICAgJycsXHJcbiAgICAgICAgbnVsbCxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3dbJ19pZCddLFxyXG4gICAgICAgIHRoaXMud29ya2Zsb3dGb3JtLnZhbHVlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtYWtlQXNrUmVxdWVzdChcclxuICAgIGlucHV0TXNnOiBzdHJpbmcsXHJcbiAgICBhZ2VudHM6IGFueVtdLFxyXG4gICAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyxcclxuICAgIG1zZz86IGFueSxcclxuICAgIGNoYXQ/OiBhbnksXHJcbiAgICB3b3JrZmxvd0lkPzogc3RyaW5nLFxyXG4gICAgd29ya2Zsb3dfaW5wdXRzPzogYW55XHJcbiAgKTogdm9pZCB7XHJcbiAgICB2YXIgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYWkvYXNrYDtcclxuXHJcbiAgICB2YXIgYm9keSA9IHtcclxuICAgICAgdXNlcl9xdWVzdGlvbjogaW5wdXRNc2csXHJcbiAgICAgIHVzZXJfaWQ6IHRoaXMudXNlcklkLFxyXG4gICAgICBib3RfaWQ6IHRoaXMuYm90SWQsXHJcbiAgICAgIG1lc3NhZ2VfaWQ6IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZW5lcmF0ZUtleSgpLFxyXG4gICAgICBzZXNzaW9uX2lkOiB0aGlzLmNvblNlc3Npb25LZXksXHJcbiAgICAgIGFnZW50czogYWdlbnRzPy5maWx0ZXIoKHApID0+IHAuc2VsZWN0ZWQpLm1hcCgocCkgPT4gcC5pZCkgPz8gW10sXHJcbiAgICAgIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uSWQsXHJcbiAgICAgIGZpcnN0X25hbWU6IHRoaXMuZmlyc3ROYW1lLFxyXG4gICAgICBsYXN0X25hbWU6IHRoaXMubGFzdE5hbWVcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHdvcmtmbG93SWQpIHtcclxuICAgICAgYm9keVsnd29ya2Zsb3dfaWQnXSA9IHdvcmtmbG93SWQ7XHJcbiAgICAgIGJvZHlbJ3dvcmtmbG93X2lucHV0cyddID0gd29ya2Zsb3dfaW5wdXRzO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmZXRjaCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246ICdCZWFyZXIgJyArIHRoaXMuczI3VG9rZW4sXHJcbiAgICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxyXG4gICAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXHJcbiAgICAgICAgJ2RvbWFpbi1hdXRob3JpdHknOiB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzKSB7XHJcbiAgICAgICAgICB0aGlzLmlzNDAxID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuLmVtaXQoKTtcclxuXHJcbiAgICAgICAgICAvLyBJZiBgbXNnYCBhbmQgYGNoYXRgIGV4aXN0LCBoYW5kbGUgdGhlbVxyXG4gICAgICAgICAgaWYgKG1zZyAmJiBjaGF0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubXNnID0gbXNnO1xyXG4gICAgICAgICAgICB0aGlzLmNoYXQgPSBjaGF0O1xyXG4gICAgICAgICAgICB0aGlzLmlzRmV0Y2hEYXRhRm9yID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5pczQwMSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICB9KVxyXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xyXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgcmVzcG9uc2UgaGFuZGxpbmcgaWYgbmVlZGVkXHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6ICcsIGVycik7XHJcbiAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5pbnB1dCA9ICcnO1xyXG4gICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93ID0gbnVsbDtcclxuICAgIHRoaXMub3BlbldvcmtmbG93SW5wdXQgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNXb3JrZmxvd09wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcblxyXG4gIG1ha2VBc2tSZXF1ZXN0b2xkKFxyXG4gICAgaW5wdXRNc2c6IHN0cmluZyxcclxuICAgIGFnZW50czogYW55W10sXHJcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxyXG4gICAgbXNnPzogYW55LFxyXG4gICAgY2hhdD86IGFueSxcclxuICAgIHdvcmtmbG93SWQ/OiBzdHJpbmcsXHJcbiAgICB3b3JrZmxvd19pbnB1dHM/OiBhbnlcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2FpL2Fza2A7XHJcblxyXG4gICAgY29uc3QgYm9keTogYW55ID0ge1xyXG4gICAgICB1c2VyX3F1ZXN0aW9uOiBpbnB1dE1zZyxcclxuICAgICAgdXNlcl9pZDogdGhpcy51c2VySWQsXHJcbiAgICAgIGJvdF9pZDogdGhpcy5ib3RJZCxcclxuICAgICAgbWVzc2FnZV9pZDogdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdlbmVyYXRlS2V5KCksXHJcbiAgICAgIGFnZW50czogYWdlbnRzPy5maWx0ZXIoKHApID0+IHAuc2VsZWN0ZWQpLm1hcCgocCkgPT4gcC5pZCkgPz8gW10sXHJcbiAgICAgIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uSWQsXHJcbiAgICAgIGZpcnN0X25hbWU6IHRoaXMuZmlyc3ROYW1lLFxyXG4gICAgICBsYXN0X25hbWU6IHRoaXMubGFzdE5hbWUsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh3b3JrZmxvd0lkKSB7XHJcbiAgICAgIGJvZHlbJ3dvcmtmbG93X2lkJ10gPSB3b3JrZmxvd0lkO1xyXG4gICAgICBib2R5Wyd3b3JrZmxvd19pbnB1dHMnXSA9IHdvcmtmbG93X2lucHV0cztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxyXG4gICAgICAnaGl2ZS1ib3QtaWQnOiB0aGlzLmJvdElkLFxyXG4gICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGJvZHksIHsgaGVhZGVycyB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZGF0YSk7XHJcbiAgICAgICAgICAvLyBBZGRpdGlvbmFsIHJlc3BvbnNlIGhhbmRsaW5nIGlmIG5lZWRlZFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiAnLCBlcnIpO1xyXG4gICAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmlucHV0ID0gJyc7XHJcbiAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3cgPSBudWxsO1xyXG4gICAgdGhpcy5vcGVuV29ya2Zsb3dJbnB1dCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1dvcmtmbG93T3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVNYXJrZG93bih0aXRsZSwgb2JqKSB7XHJcbiAgICAvLyBJbml0aWFsaXplIG1hcmtkb3duIHdpdGggdGhlIHRpdGxlXHJcbiAgICBsZXQgbWFya2Rvd24gPSBgIyMgJHt0aXRsZX1cXG5gO1xyXG5cclxuICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgb2JqZWN0IGFuZCBhcHBlbmQgdGhlIGZpZWxkIG5hbWVzIGFuZCB2YWx1ZXNcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcclxuICAgICAgdmFyIGtleV9sYWJlbCA9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93LlRyaWdnZXIuSW5wdXRTY2hlbWEuZmluZChcclxuICAgICAgICAgIChpbnB1dCkgPT4gaW5wdXQuSW5wdXRJZCA9PT0ga2V5XHJcbiAgICAgICAgKT8uTGFiZWwgfHwga2V5O1xyXG4gICAgICBtYXJrZG93biArPSBgLSAqKiR7a2V5X2xhYmVsfSoqOiAke3ZhbHVlfVxcbmA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1hcmtkb3duO1xyXG4gIH1cclxuXHJcbiAgc2hvd1dvcmtmbG93SGlzdG9yeURldGFpbHMod29ya2Zsb3dfaWQpIHtcclxuICAgIGlmICghd29ya2Zsb3dfaWQpIHtcclxuICAgICAgdGhpcy53b3JrZmxvd0V4ZWN1dGlvbkRldGFpbHMgPSB0aGlzLmN1cnJlbnRXb3JrZmxvd0V4ZWN1dGlvbkRldGFpbHM7XHJcbiAgICAgIHRoaXMuc2hvd1dvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IHRydWU7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYm90U2VydmljZS5nZXRXb3JrZmxvd0V4ZWN1dGlvbkJ5SWQod29ya2Zsb3dfaWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMgJiYgcmVzLkFjdGlvbnMgJiYgQXJyYXkuaXNBcnJheShyZXMuQWN0aW9ucykpIHtcclxuICAgICAgICByZXMuQWN0aW9ucyA9IHJlcy5BY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICBpZiAoYWN0aW9uLkluc2VydFRpbWVTdGFtcCkge1xyXG4gICAgICAgICAgICBhY3Rpb24uSW5zZXJ0VGltZVN0YW1wID0gZm9ybWF0VGltZVN0YW1wcyhcclxuICAgICAgICAgICAgICB0aGlzLnRpbWV6b25lLFxyXG4gICAgICAgICAgICAgIGFjdGlvbi5JbnNlcnRUaW1lU3RhbXBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBhY3Rpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlcy5JbnNlcnRUaW1lU3RhbXAgPSBmb3JtYXRUaW1lU3RhbXBzKFxyXG4gICAgICAgIHRoaXMudGltZXpvbmUsXHJcbiAgICAgICAgcmVzLkluc2VydFRpbWVTdGFtcFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLndvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IHJlcztcclxuICAgICAgdGhpcy5zaG93V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzID0gdHJ1ZTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZU1vZGFsKCkge1xyXG4gICAgdGhpcy5zaG93V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvYmplY3RUb0FycmF5KG9iajogYW55KTogYW55W10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubWFwKChrZXkpID0+ICh7IGtleSwgdmFsdWU6IG9ialtrZXldIH0pKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0TmV3Q29udmVyc2F0aW9uKCkge1xyXG4gICAgdGhpcy5jb252ZXJzYXRpb25LZXkgPSB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2V0S2V5KHRoaXMuYm90SWQsIHRydWUpO1xyXG4gICAgdGhpcy5jaGF0TG9nID0gW3RoaXMuY2hhdExvZ1swXV07XHJcbiAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVNvY2tldCgpO1xyXG4gICAgfSwgMjAwKTtcclxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVTcGVlY2hSZWNvZ25pemVyKHRva2VuOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3BlZWNoQ29uZmlnID0gU3BlZWNoU0RLLlNwZWVjaENvbmZpZy5mcm9tQXV0aG9yaXphdGlvblRva2VuKFxyXG4gICAgICB0b2tlbixcclxuICAgICAgdGhpcy5yZWdpb25cclxuICAgICk7XHJcbiAgICBjb25zdCBhdWRpb0NvbmZpZyA9IFNwZWVjaFNESy5BdWRpb0NvbmZpZy5mcm9tRGVmYXVsdE1pY3JvcGhvbmVJbnB1dCgpO1xyXG4gICAgdGhpcy5yZWNvZ25pemVyID0gbmV3IFNwZWVjaFNESy5TcGVlY2hSZWNvZ25pemVyKFxyXG4gICAgICB0aGlzLnNwZWVjaENvbmZpZyxcclxuICAgICAgYXVkaW9Db25maWdcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZWNvZ25pemVyLnJlY29nbml6aW5nID0gKHMsIGUpID0+IHtcclxuICAgICAgaWYgKGUucmVzdWx0LnJlYXNvbiA9PT0gU3BlZWNoU0RLLlJlc3VsdFJlYXNvbi5SZWNvZ25pemluZ1NwZWVjaCkge1xyXG4gICAgICAgIHRoaXMuaW5wdXQgPSBlLnJlc3VsdC50ZXh0O1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBSZWNvZ25pemluZzogJHtlLnJlc3VsdC50ZXh0fWApO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucmVjb2duaXplci5yZWNvZ25pemVkID0gKHMsIGUpID0+IHtcclxuICAgICAgaWYgKGUucmVzdWx0LnJlYXNvbiA9PT0gU3BlZWNoU0RLLlJlc3VsdFJlYXNvbi5SZWNvZ25pemVkU3BlZWNoKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dCA9IGUucmVzdWx0LnRleHQ7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFJlY29nbml6ZWQ6ICR7ZS5yZXN1bHQudGV4dH1gKTtcclxuICAgICAgICB0aGlzLnRvZ2dsZVJlY29yZGluZygpO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucmVjb2duaXplci5jYW5jZWxlZCA9IChzLCBlKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0NhbmNlbGVkOiAnLCBlLmVycm9yRGV0YWlscyk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucmVjb2duaXplci5zZXNzaW9uU3RvcHBlZCA9IChzLCBlKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdTZXNzaW9uIHN0b3BwZWQuJyk7XHJcbiAgICAgIHRoaXMucmVjb2duaXplci5zdG9wQ29udGludW91c1JlY29nbml0aW9uQXN5bmMoKTtcclxuICAgICAgdGhpcy5mZXRjaERhdGEoKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0b2dnbGVSZWNvcmRpbmcoKSB7XHJcbiAgICB0aGlzLmlzUmVjb3JkaW5nID0gIXRoaXMuaXNSZWNvcmRpbmc7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNSZWNvcmRpbmcpIHtcclxuICAgICAgdGhpcy5zdGFydFJlY29nbml0aW9uKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0b3BSZWNvZ25pdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRSZWNvZ25pdGlvbigpIHtcclxuICAgIHRoaXMucmVjb2duaXplci5zdGFydENvbnRpbnVvdXNSZWNvZ25pdGlvbkFzeW5jKCk7XHJcbiAgfVxyXG5cclxuICBzdG9wUmVjb2duaXRpb24oKSB7XHJcbiAgICB0aGlzLnJlY29nbml6ZXIuc3RvcENvbnRpbnVvdXNSZWNvZ25pdGlvbkFzeW5jKCk7XHJcbiAgfVxyXG5cclxuICBjaGVja0ZvckNvcDI5Qm90SWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5ib3RJZCA9PSAnNjZmYTNmMjc2YzVkNzFlMjcxN2JmZWE4JyB8fCB0aGlzLmJvdElkID09ICc2NzE2MzM1NDU2NTJkZDc4ZWZlYzg0OGQnO1xyXG5cclxuICB9XHJcblxyXG4gIGdldExhdGVzdFRpbWUodGltZSk6IHN0cmluZyB7XHJcbiAgICBpZiAodGltZSkge1xyXG4gICAgICByZXR1cm4gdGltZTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZyhbXSwge1xyXG4gICAgICBob3VyOiAnMi1kaWdpdCcsXHJcbiAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxyXG4gICAgfSk7IC8vIHJldHVybnMgY3VycmVudCB0aW1lIGluICdzaG9ydFRpbWUnIGZvcm1hdFxyXG4gIH1cclxufVxyXG4iXX0=
1
+ // import { Platform } from '@angular/cdk/platform';
2
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
3
+ import { TranslationService } from '../translations/translation.service';
4
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild, ViewChildren, } from '@angular/core';
5
+ import { DomSanitizer } from '@angular/platform-browser';
6
+ import { of } from 'rxjs';
7
+ import { catchError, switchMap } from 'rxjs/operators';
8
+ import { formatNow, formatTimeStamps } from '../../utils/utils';
9
+ import { dev_environment, prod_environment, } from '../../../environments/environment';
10
+ import { ConversationService } from '../conversation.service';
11
+ import { SocketService } from '../socket-service.service';
12
+ import { FormBuilder, Validators } from '@angular/forms';
13
+ import * as SpeechSDK from 'microsoft-cognitiveservices-speech-sdk';
14
+ import { BotsService } from '../bot.service';
15
+ import * as marked from 'marked'; // Import marked
16
+ export class ChatDrawerComponent {
17
+ constructor(fb, botService, cdr, http, sanitizer, elementRef, renderer, socketService, conversationService, // private platform: Platform
18
+ translationService) {
19
+ this.fb = fb;
20
+ this.botService = botService;
21
+ this.cdr = cdr;
22
+ this.http = http;
23
+ this.sanitizer = sanitizer;
24
+ this.elementRef = elementRef;
25
+ this.renderer = renderer;
26
+ this.socketService = socketService;
27
+ this.conversationService = conversationService;
28
+ this.translationService = translationService;
29
+ this.bodyOverflowClass = 'body-overflow-hidden';
30
+ this.isCollapsedTrue = false;
31
+ this.copilotName = 'HiveXGPT';
32
+ this.feedbackEvent = new EventEmitter();
33
+ this.onCloseEvent = new EventEmitter();
34
+ this.openPage = new EventEmitter();
35
+ this.sessionActions = new EventEmitter();
36
+ this.closeBot = new EventEmitter();
37
+ this.connectWithUser = new EventEmitter();
38
+ this.scheduleMeeting = new EventEmitter();
39
+ this.refreshToken = new EventEmitter();
40
+ this.openSupport = new EventEmitter();
41
+ this.autogenKey = 'Autogen_eDJTtEU-NB0RtIpzq1w';
42
+ this.addToMyAgendaAction = 'add_to_my_agenda';
43
+ this.myUpcomingSessionAction = 'my_upcomming_session';
44
+ this.connectOrFollowAction = 'connect_or_follow';
45
+ this.aiResponse = '';
46
+ this.chatLog = [];
47
+ this.decoder = new TextDecoder();
48
+ this.feedbackDone = false;
49
+ this.greetingMsg = '';
50
+ this.hasBackdropValue = false;
51
+ this.input = '';
52
+ this.listenerAdded = false;
53
+ this.loading = false;
54
+ this.mode = 'over';
55
+ this.quickPrompts = [];
56
+ this.thumbsDownMsgIndex = 0;
57
+ this.userName = '';
58
+ this.showStartAgain = false;
59
+ this.isIOSDevice = false;
60
+ this.showFeedBackIconsIndex = null;
61
+ this.temperature = 1;
62
+ this.speakers = [];
63
+ this.conSessionKey = '';
64
+ this.currentWorkflowActionProgress = 0;
65
+ this.currentWorkflowAction = '';
66
+ this.recognizedText = '';
67
+ this.authorizationToken = '';
68
+ this.region = 'westeurope'; // Set your Azure region here
69
+ this.domainAuthorityValue = "prod-lite";
70
+ this.isChatingWithAi = false;
71
+ this.readAllChunks = (stream) => {
72
+ const reader = stream.getReader();
73
+ const allSuggestions = [];
74
+ reader.closed.catch((err) => {
75
+ if (err) {
76
+ console.error('Error reading stream: ', err);
77
+ }
78
+ this.isChatingWithAi = false;
79
+ this.scrollToBottom();
80
+ return;
81
+ });
82
+ return new ReadableStream({
83
+ start: (controller) => {
84
+ return this.pump(controller, reader, allSuggestions);
85
+ },
86
+ });
87
+ };
88
+ this.currentMessageForEditor = '';
89
+ this.currentIndexForEditor = -1;
90
+ this.isDropdownOpen = false;
91
+ this.selectedAgents = [];
92
+ this.allSelected = false;
93
+ this.isDocInEditMode = false;
94
+ this.isContentLoaded = false;
95
+ this.isCollapsed = false;
96
+ this.isCollapsedForGraph = false;
97
+ this.isCollapsedForFGraph = false;
98
+ // [
99
+ // {
100
+ // "title": "AI News January 2024: In-Depth and Concise - The AI Track",
101
+ // "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.",
102
+ // "link": "https://theaitrack.com/ai-news-january-2024/"
103
+ // },
104
+ // {
105
+ // "title": "Top AI News, January 2024 - Everypixel Journal",
106
+ // "desc": "In this monthly roundup, we spotlight the top AI news stories from January, including the OpenAI vs. The New York Times Lawsuit.",
107
+ // "link": "https://journal.everypixel.com/top-ai-news-january-2024"
108
+ // },
109
+ // {
110
+ // "title": "AI News July 2024: In-Depth and Concise - The AI Track",
111
+ // "desc": "This page features AI News for July 2024, highlighting significant events such as Canva acquiring Leonardo AI.",
112
+ // "link": "https://theaitrack.com/ai-news-july-2024-in-depth-and-concise/"
113
+ // },
114
+ // {
115
+ // "title": "January news roundup: What's new in the world of AI? - Pluralsight",
116
+ // "desc": "OpenAI’s new GPT store, business-ready ChatGPT plans, and a predicted rise in AI-powered cybercrime.",
117
+ // "link": "https://www.pluralsight.com/resources/blog/data/ai-this-month-january-2024"
118
+ // },
119
+ // {
120
+ // "title": "AI News August 2024: In-Depth and Concise - The AI Track",
121
+ // "desc": "This page features AI News for August 2024, with highlights such as Nvidia delaying the “Blackwell” B200 AI chips delivery.",
122
+ // "link": "https://theaitrack.com/ai-news-august-2024-in-depth-and-concise-duplicate/"
123
+ // }
124
+ // ]
125
+ this.dateTime = { now: new Date().toISOString() };
126
+ this.currentSourcesList = [];
127
+ this.isShowEditorButton = true;
128
+ this.isDrawerOpen = true;
129
+ this.chatMain = new ElementRef(null);
130
+ // if (this.platform.IOS) {
131
+ // this.isIOSDevice = true;
132
+ // }
133
+ }
134
+ getTranslation(key) {
135
+ return this.translationService.getTranslation(key);
136
+ }
137
+ ngOnChanges(changes) {
138
+ // Handle eventId changes to update translation service
139
+ if (changes.eventId && changes.eventId.currentValue) {
140
+ this.translationService.setEventId(changes.eventId.currentValue);
141
+ }
142
+ if (changes.s27Token) {
143
+ if (changes.s27Token.currentValue != changes.s27Token.previousValue) {
144
+ this.s27Token = changes.s27Token.currentValue;
145
+ console.log('isFetchDataFor: ', this.isFetchDataFor);
146
+ console.log('msg: ', this.msg);
147
+ console.log('chat: ', this.chat);
148
+ if (this.is401) {
149
+ if (this.isFetchDataFor) {
150
+ this.fetchDataFor(this.msg, this.chat);
151
+ }
152
+ else {
153
+ this.fetchData(this.msg);
154
+ }
155
+ }
156
+ }
157
+ }
158
+ if (changes.orgId) {
159
+ if (changes.orgId.currentValue != changes.orgId.previousValue &&
160
+ changes.orgId.currentValue) {
161
+ this.initializeSocket();
162
+ }
163
+ }
164
+ }
165
+ ngOnInit() {
166
+ // Set the eventId in translation service to get the correct language from localStorage
167
+ console.log('Rohit >>>', this.eventId);
168
+ console.log('Rohit name >>>', this.firstName);
169
+ if (this.eventId) {
170
+ this.translationService.setEventId(this.eventId);
171
+ }
172
+ this.environment = this.isDev ? dev_environment : prod_environment;
173
+ console.log('Rohit >>>', this.eventId);
174
+ console.log('Rohit name >>>', this.firstName);
175
+ const domain = window.location.hostname;
176
+ // Determine the header value based on the domain
177
+ if (domain.includes('pre-app.social27.com')) {
178
+ this.domainAuthorityValue = 'pre-prod-lite';
179
+ }
180
+ else if (domain.includes('app.social27.com')) {
181
+ this.domainAuthorityValue = 'prod-lite';
182
+ }
183
+ else if (domain.includes('hivegpt.io')) {
184
+ this.domainAuthorityValue = 'hivegpt';
185
+ }
186
+ // this.fetchMyConnections().subscribe();
187
+ // this.fetchPendingRequests().subscribe();
188
+ this.changeTemperature(this.temperature);
189
+ this.fetchBotConfig().subscribe((res) => {
190
+ this.cdr.markForCheck();
191
+ this.fetchChatHistory().subscribe((response) => {
192
+ this.loading = false;
193
+ this.mapChatHistory(response);
194
+ this.cdr.markForCheck();
195
+ }, (err) => {
196
+ console.error('Error fetching chat history:', err);
197
+ });
198
+ }, (err) => {
199
+ console.error('Error fetching chat history:', err);
200
+ });
201
+ // this.fetchAgents();
202
+ // this.fetchEditorContent();
203
+ this.cdr.markForCheck();
204
+ // this.initializeSocket();
205
+ this.botService.fetchSpeechAuthorizationToken(this.botId, this.apiKey, this.domainAuthorityValue).subscribe((token) => {
206
+ this.authorizationToken = token;
207
+ this.initializeSpeechRecognizer(token);
208
+ });
209
+ }
210
+ initializeSocket() {
211
+ try {
212
+ this.socketService.disconnectSocketConnection();
213
+ }
214
+ catch (error) { }
215
+ setTimeout(() => {
216
+ this.socketService.connectSocketConnection();
217
+ setTimeout(() => {
218
+ console.log('YES INIT');
219
+ const conversation_id = this.conversationService.getKey(this.botId);
220
+ this.socketService.registerUserSpecificHiveSocket(this.botId, conversation_id, this.orgId);
221
+ setTimeout(() => {
222
+ this.listenSockets();
223
+ }, 300);
224
+ }, 200);
225
+ }, 300);
226
+ }
227
+ listenSockets() {
228
+ if (this.eventSubscription) {
229
+ this.eventSubscription.unsubscribe();
230
+ }
231
+ console.log('Listen Socket');
232
+ this.eventSubscription = this.conversationService
233
+ .getUserSpecificNotification()
234
+ .subscribe((res) => {
235
+ var _a, _b, _c, _d, _e, _f;
236
+ console.log('Listen Socket response');
237
+ console.log(res);
238
+ // Check if OtherFields exists in the response
239
+ if ((_b = (_a = res === null || res === void 0 ? void 0 : res.m) === null || _a === void 0 ? void 0 : _a.OtherFields) === null || _b === void 0 ? void 0 : _b.workflow_id) {
240
+ const { percentage, output, action_name, current_action_name, workflow_execution_id, time_stamp, } = (_c = res === null || res === void 0 ? void 0 : res.m) === null || _c === void 0 ? void 0 : _c.OtherFields;
241
+ this.currentWorkflowActionProgress = percentage;
242
+ this.currentWorkflowAction = action_name;
243
+ const actionIndex = this.workflowExecutionDetails.Actions.findIndex((a) => a.Name == current_action_name);
244
+ if (actionIndex !== -1) {
245
+ this.workflowExecutionDetails.Actions[actionIndex]['Output'] = output;
246
+ this.workflowExecutionDetails.Actions[actionIndex]['InsertTimeStamp'] = formatTimeStamps(this.timezone, time_stamp);
247
+ }
248
+ else {
249
+ console.error(`Action with name ${action_name} not found`);
250
+ }
251
+ this.currentWorkflowExecutionDetails = this.workflowExecutionDetails;
252
+ if (this.currentWorkflowActionProgress == 100) {
253
+ this.chatLog[this.chatLog.length - 1]['WorkflowExecutionId'] = workflow_execution_id;
254
+ this.isChatingWithAi = false;
255
+ this.executingWorkflow = false;
256
+ }
257
+ this.cdr.detectChanges();
258
+ }
259
+ else if ((_d = res === null || res === void 0 ? void 0 : res.m) === null || _d === void 0 ? void 0 : _d.OtherFields) {
260
+ const { conversation_id, bot_id, message_id, answer, web_results, search_results, graphs, execution_graphs, suggestions, } = (_e = res === null || res === void 0 ? void 0 : res.m) === null || _e === void 0 ? void 0 : _e.OtherFields;
261
+ console.log('message_id1');
262
+ console.log((_f = res === null || res === void 0 ? void 0 : res.m) === null || _f === void 0 ? void 0 : _f.OtherFields);
263
+ var currentChatMessage = this.chatLog.find((p) => p._id == message_id);
264
+ console.log(this.chatLog);
265
+ if (!currentChatMessage) {
266
+ console.log('message_id2');
267
+ console.log(message_id);
268
+ currentChatMessage = {
269
+ _id: message_id,
270
+ type: 'ai',
271
+ time: formatNow(this.timezone),
272
+ };
273
+ this.chatLog.push(currentChatMessage);
274
+ this.showFeedBackIconsIndex = this.chatLog.length - 1;
275
+ console.log('message_id3');
276
+ console.log(message_id);
277
+ this.cdr.detectChanges();
278
+ }
279
+ // Handle the fields based on their presence
280
+ if (search_results && Array.isArray(search_results)) {
281
+ console.log('Online Search Terms:', search_results);
282
+ currentChatMessage.searchTerms = search_results;
283
+ this.cdr.detectChanges();
284
+ }
285
+ if (web_results && Array.isArray(web_results)) {
286
+ console.log('Web Results:', web_results);
287
+ currentChatMessage.sourcesList = web_results;
288
+ currentChatMessage.displayedSources = web_results === null || web_results === void 0 ? void 0 : web_results.slice(0, 3); // First 3 cards
289
+ currentChatMessage.remainingSources = web_results === null || web_results === void 0 ? void 0 : web_results.slice(3); // Remaining items
290
+ this.cdr.detectChanges();
291
+ }
292
+ if (answer) {
293
+ this.isChatingWithAi = false;
294
+ console.log('Answer:', answer);
295
+ currentChatMessage.message = this.processMessageForDisplay(answer);
296
+ this.cdr.detectChanges();
297
+ this.scrollToBottom();
298
+ }
299
+ if (graphs && Array.isArray(graphs)) {
300
+ console.log('Graphs:', graphs);
301
+ currentChatMessage.graphs = graphs;
302
+ this.cdr.detectChanges();
303
+ }
304
+ if (execution_graphs && Array.isArray(execution_graphs)) {
305
+ console.log('Execution Graphs:', execution_graphs);
306
+ currentChatMessage.executionGraphs = execution_graphs;
307
+ this.cdr.detectChanges();
308
+ }
309
+ if (suggestions && Array.isArray(suggestions)) {
310
+ console.log('suggestions:', suggestions);
311
+ currentChatMessage.relatedListItems = suggestions;
312
+ this.cdr.detectChanges();
313
+ // Process online search terms as needed
314
+ }
315
+ // Add any other fields and their processing here
316
+ }
317
+ else {
318
+ console.warn('OtherFields is missing in the response');
319
+ }
320
+ }, (err) => {
321
+ this.eventSubscription.unsubscribe();
322
+ console.error('Error in fetching data from socket', err);
323
+ });
324
+ }
325
+ initializeSocketAndListen() { }
326
+ handleEvent(data, type) {
327
+ switch (type) {
328
+ case 'webresult':
329
+ break;
330
+ case 'answer':
331
+ break;
332
+ case 'graph':
333
+ break;
334
+ default:
335
+ break;
336
+ }
337
+ }
338
+ ngOnDestroy() {
339
+ if (this.eventSubscription) {
340
+ this.eventSubscription.unsubscribe();
341
+ }
342
+ this.socketService.disconnectSocketConnection();
343
+ //this.socketService.close();
344
+ }
345
+ changeTemperature(newTemperature) {
346
+ if (this.loading)
347
+ return;
348
+ this.temperature = newTemperature;
349
+ const wrapper = document.querySelector('.hivegpt-chat-wrapper');
350
+ // Remove existing theme classes from body
351
+ wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.remove('creative', 'balanced', 'precise');
352
+ switch (newTemperature) {
353
+ case 0:
354
+ wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('creative');
355
+ break;
356
+ case 1:
357
+ wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('balanced');
358
+ break;
359
+ case 2:
360
+ wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('precise');
361
+ break;
362
+ default:
363
+ break;
364
+ }
365
+ }
366
+ onStartAgain() {
367
+ if (this.loading)
368
+ return;
369
+ this.showStartAgain = false;
370
+ this.chatLog = [];
371
+ this.chatLog.push({
372
+ type: 'ai',
373
+ message: this.greetingMsg,
374
+ time: formatNow(this.timezone),
375
+ });
376
+ this.archieveMessages().subscribe();
377
+ }
378
+ archieveMessages() {
379
+ const headers = new HttpHeaders({
380
+ 'Content-Type': 'application/json',
381
+ 'x-api-key': this.apiKey,
382
+ 'hive-bot-id': this.botId,
383
+ 'domain-authority': this.domainAuthorityValue
384
+ });
385
+ const url = `${this.environment.BASE_URL}/bot/clear-history/${this.botId}/${this.userId}`;
386
+ return this.http.post(url, { headers }).pipe(switchMap((res) => {
387
+ return of(res);
388
+ }), catchError((error) => {
389
+ return of(null);
390
+ }));
391
+ }
392
+ triggerSupport() {
393
+ this.openSupport.emit();
394
+ }
395
+ fetchBotConfig() {
396
+ this.loading = true;
397
+ const headers = new HttpHeaders({
398
+ 'x-api-key': this.apiKey,
399
+ 'hive-bot-id': this.botId,
400
+ 'domain-authority': this.domainAuthorityValue
401
+ });
402
+ const url = `${this.environment.BASE_URL}/bots?bot_id=${this.botId}`;
403
+ return this.http.get(url, { headers }).pipe(switchMap((res) => {
404
+ var _a;
405
+ this.botName = res.Name;
406
+ this.botIcon = res.Icon;
407
+ this.botSkills = res === null || res === void 0 ? void 0 : res.Skills;
408
+ this.greetingMsg = res.Greeting;
409
+ this.thumbsDownMessages = ((_a = res === null || res === void 0 ? void 0 : res.NegativeResponses) === null || _a === void 0 ? void 0 : _a.length)
410
+ ? res.NegativeResponses
411
+ : [
412
+ `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;'><a style='color: inherit; text-decoration: none;' id='supportLink88' >Please click here</a></span> and a human agent will assist you as soon as possible`,
413
+ ];
414
+ this.quickPrompts = res.QuickPrompts;
415
+ this.cdr.markForCheck();
416
+ this.loading = false;
417
+ return of(res);
418
+ }), catchError((error) => {
419
+ console.error('Error fetching chatbot config: ', error);
420
+ this.loading = false;
421
+ return of(null);
422
+ }));
423
+ }
424
+ fetchChatHistory() {
425
+ this.loading = true;
426
+ this.conversationKey = this.conversationService.getKey(this.botId, false);
427
+ this.conSessionKey = this.conversationService.getSessionKey(this.botId, false);
428
+ const url = `${this.environment.BASE_URL}/conversations/${this.conversationKey}?session_id=${this.conSessionKey}`;
429
+ const headers = new HttpHeaders({
430
+ accept: 'application/json',
431
+ 'x-api-key': this.apiKey,
432
+ 'hive-bot-id': this.botId,
433
+ 'domain-authority': this.domainAuthorityValue
434
+ });
435
+ return this.http
436
+ .get(url, { headers })
437
+ .pipe(catchError(this.handleError('fetchConversation')));
438
+ }
439
+ handleError(operation = 'operation', result) {
440
+ return (error) => {
441
+ console.error(`${operation} failed: ${error.message}`);
442
+ return of(result);
443
+ };
444
+ }
445
+ // fetchChatHistory() {
446
+ // this.loading = true;
447
+ // const headers = new HttpHeaders({
448
+ // 'Content-Type': 'application/json',
449
+ // 'x-api-key': this.apiKey,
450
+ // });
451
+ // return this.http
452
+ // .get(`${this.environment.BASE_URL}/conversations/${this.conversationKey}`, { headers })
453
+ // .pipe(
454
+ // switchMap((res: any) => {
455
+ // this.loading = false;
456
+ // return of(res);
457
+ // }),
458
+ // catchError((error: any) => {
459
+ // console.error('Error fetching chat history: ', error);
460
+ // this.loading = false;
461
+ // return of(null);
462
+ // })
463
+ // );
464
+ // }
465
+ mapChatHistory(chats) {
466
+ var _a;
467
+ this.chatLog.push({
468
+ type: 'ai',
469
+ message: this.greetingMsg,
470
+ time: formatNow(this.timezone),
471
+ });
472
+ if (chats && ((_a = chats === null || chats === void 0 ? void 0 : chats.Messages) === null || _a === void 0 ? void 0 : _a.length)) {
473
+ chats === null || chats === void 0 ? void 0 : chats.Messages.forEach((chat) => {
474
+ if (chat.Type == 'user') {
475
+ this.chatLog.push({
476
+ type: 'user',
477
+ message: this.processMessageForDisplay(chat.Text),
478
+ time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
479
+ copied: false,
480
+ isCollapsedTrue: false,
481
+ WorkflowExecutionId: chat.WorkflowExecutionId,
482
+ _id: chat._id
483
+ });
484
+ }
485
+ if (chat.Type == 'ai') {
486
+ var sourcesList = chat.WebLinks || [];
487
+ var displayedSources = chat.WebLinks.slice(0, 3); // First 3 cards
488
+ var remainingSources = chat.WebLinks.slice(3); // Remaining items
489
+ this.chatLog.push({
490
+ type: 'ai',
491
+ message: this.processMessageForDisplay(chat.Text),
492
+ executionGraphs: chat.ExecutionGraphs,
493
+ graphs: chat.Graphs,
494
+ searchTerms: chat.SearchTerms,
495
+ sourcesList: sourcesList,
496
+ displayedSources: displayedSources,
497
+ remainingSources: remainingSources,
498
+ time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
499
+ copied: false,
500
+ isCollapsedTrue: false,
501
+ _id: chat._id
502
+ });
503
+ this.showFeedBackIconsIndex = this.chatLog.length - 1;
504
+ }
505
+ });
506
+ this.showStartAgain = true;
507
+ }
508
+ this.scrollToBottom();
509
+ this.cdr.markForCheck();
510
+ }
511
+ processMessage(message) {
512
+ if (!message || !((message === null || message === void 0 ? void 0 : message.length) > 0)) {
513
+ return '';
514
+ }
515
+ // console.log('here is my message')
516
+ // console.log(message);
517
+ message = message.trim();
518
+ const markdownLinkRegex = /\[([^[]+)]\(([^)]+)\)/g;
519
+ const urlRegex = /(?<!href=")\bhttps?:\/\/\S+(?<![.,])/gi;
520
+ if (markdownLinkRegex.test(message)) {
521
+ const html = message.replace(markdownLinkRegex, '<a href="$2" target="_blank">$1</a>');
522
+ //console.log('Sanitized message: ', message);
523
+ return this.sanitizeHtml(html);
524
+ }
525
+ if (urlRegex.test(message)) {
526
+ const html = message.replace(urlRegex, '<a href="$&" target="_blank">$&</a>');
527
+ // console.log('Sanitized message: ', message);
528
+ return this.sanitizeHtml(html);
529
+ }
530
+ message = message.replace(/(?:\r\n|\r|\n)/g, '<br>');
531
+ message = message.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
532
+ // Convert Markdown headers to HTML headers
533
+ message = message.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
534
+ const level = hashes.length;
535
+ return `<h${level}>${text}</h${level}>`;
536
+ });
537
+ this.cdr.markForCheck();
538
+ const sanitizedMessage = this.sanitizeHtml(message);
539
+ return sanitizedMessage;
540
+ }
541
+ ngAfterViewChecked() {
542
+ const feedbackLinks = this.elementRef.nativeElement.querySelectorAll('.feedback-link');
543
+ feedbackLinks.forEach((link) => {
544
+ link.addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
545
+ });
546
+ // if (this.elementRef.nativeElement.querySelector('.feedback-link')) {
547
+ // this.elementRef.nativeElement
548
+ // .querySelector('.feedback-link')
549
+ // .addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
550
+ // }
551
+ }
552
+ sanitizeHtml(html) {
553
+ return this.sanitizer.bypassSecurityTrustHtml(html);
554
+ }
555
+ onFeedbackClick(value) {
556
+ this.feedbackEvent.emit(value);
557
+ }
558
+ onClose() {
559
+ this.renderer.removeClass(document.body, this.bodyOverflowClass);
560
+ this.onCloseEvent.emit();
561
+ }
562
+ sendMessageWithTile(prompt) {
563
+ this.input = prompt;
564
+ this.fetchData();
565
+ this.scrollToBottom();
566
+ }
567
+ fetchData(msg = null) {
568
+ var _a;
569
+ this.input = msg || ((_a = this.input) === null || _a === void 0 ? void 0 : _a.trim());
570
+ this.msg = this.input;
571
+ if (!this.input || this.loading) {
572
+ return;
573
+ }
574
+ this.chatLog.push({
575
+ type: 'user',
576
+ message: this.processMessageForDisplay(this.input),
577
+ time: formatNow(this.timezone),
578
+ copied: false,
579
+ isCollapsedTrue: false,
580
+ });
581
+ try {
582
+ const textarea = this.myInput.nativeElement;
583
+ textarea.style.height = 'hidden'; // Reset the height
584
+ textarea.style.height = `62px`;
585
+ }
586
+ catch (error) { }
587
+ this.cdr.markForCheck();
588
+ this.aiResponse = '';
589
+ this.isChatingWithAi = true;
590
+ this.makeAskRequest(this.input, this.agents, this.conversationKey);
591
+ }
592
+ fetchDataFor(msg, chat) {
593
+ const inputMsg = msg === null || msg === void 0 ? void 0 : msg.trim();
594
+ if (!inputMsg || this.loading) {
595
+ return;
596
+ }
597
+ try {
598
+ chat.relatedListItems = [];
599
+ this.cdr.detectChanges();
600
+ }
601
+ catch (error) { }
602
+ this.scrollToBottom();
603
+ this.chatLog.push({
604
+ type: 'user',
605
+ message: this.processMessageForDisplay(inputMsg),
606
+ time: formatNow(this.timezone),
607
+ copied: false,
608
+ isCollapsedTrue: false,
609
+ });
610
+ this.cdr.markForCheck();
611
+ this.aiResponse = '';
612
+ this.isChatingWithAi = true;
613
+ this.makeAskRequest(inputMsg, this.agents, this.conversationKey, msg, chat);
614
+ }
615
+ fetchSmallTalk() {
616
+ this.loading = true;
617
+ this.cdr.markForCheck();
618
+ const url = `${this.environment.BASE_URL}/bot/small-talk/${this.botId}/${this.userId}`;
619
+ this.http
620
+ .get(url, {
621
+ headers: {
622
+ 'x-api-key': this.apiKey,
623
+ 'hive-bot-id': this.botId,
624
+ 'domain-authority': this.domainAuthorityValue
625
+ },
626
+ })
627
+ .pipe(catchError((error) => {
628
+ console.error('Error while fetching small talk:', error);
629
+ return of(null);
630
+ }))
631
+ .subscribe((response) => {
632
+ this.loading = false;
633
+ this.cdr.markForCheck();
634
+ if (!response) {
635
+ return;
636
+ }
637
+ if (response && response.smallTalk) {
638
+ this.chatLog.push({
639
+ type: 'ai',
640
+ message: this.processMessage(response.smallTalk),
641
+ time: formatNow(this.timezone),
642
+ isFeedbackMsg: true,
643
+ });
644
+ this.showFeedBackIconsIndex = this.chatLog.length - 2;
645
+ // this.scrollToBottom();
646
+ this.cdr.markForCheck();
647
+ }
648
+ });
649
+ }
650
+ pump(controller, reader, allSuggestions) {
651
+ reader.read().then(({ done, value }) => {
652
+ var _a, _b, _c, _d;
653
+ const lastItem = this.chatLog[this.chatLog.length - 1];
654
+ if (done) {
655
+ lastItem.message = this.processMessageForDisplay(lastItem.message);
656
+ this.chatLog.pop();
657
+ this.chatLog.push(lastItem);
658
+ if (allSuggestions === null || allSuggestions === void 0 ? void 0 : allSuggestions.length) {
659
+ this.chatLog.push({
660
+ type: 'suggestions',
661
+ suggestions: allSuggestions,
662
+ });
663
+ }
664
+ controller.close();
665
+ this.isChatingWithAi = false;
666
+ // this.scrollToBottom();
667
+ this.cdr.markForCheck();
668
+ this.showStartAgain = true;
669
+ // setTimeout(() => {
670
+ // this.fetchSmallTalk();
671
+ // },1000)
672
+ return;
673
+ }
674
+ let decodedChunk = this.decoder.decode(value, { stream: true });
675
+ this.aiResponse += decodedChunk;
676
+ if (lastItem.type === 'ai') {
677
+ const suggestionsMatch = this.aiResponse.match(/<sug>(.*?)<\/sug>/g);
678
+ if (suggestionsMatch) {
679
+ suggestionsMatch.forEach((match) => {
680
+ this.aiResponse = this.aiResponse.replace(match, '');
681
+ allSuggestions.push(match === null || match === void 0 ? void 0 : match.replace(/<\/?sug>/g, ''));
682
+ });
683
+ }
684
+ lastItem.message = this.aiResponse;
685
+ this.cdr.markForCheck();
686
+ }
687
+ else {
688
+ this.isChatingWithAi = false;
689
+ let aiFormattedData;
690
+ try {
691
+ console.log('parsing json ');
692
+ aiFormattedData = JSON.parse(JSON.parse(this.aiResponse));
693
+ }
694
+ catch (e) {
695
+ try {
696
+ console.log('parsing json 2');
697
+ aiFormattedData = JSON.parse(this.aiResponse);
698
+ }
699
+ catch (e) { }
700
+ }
701
+ console.log('parsing json done');
702
+ if (aiFormattedData && ((_a = aiFormattedData === null || aiFormattedData === void 0 ? void 0 : aiFormattedData.section_id) === null || _a === void 0 ? void 0 : _a.length) > 0) {
703
+ if (aiFormattedData.section_id == 'company_search' ||
704
+ aiFormattedData.section_id == 'user_search' ||
705
+ aiFormattedData.section_id == 'industry_company_search') {
706
+ this.fetchMyConnections().subscribe();
707
+ this.fetchPendingRequests().subscribe();
708
+ }
709
+ if (aiFormattedData.section_id == this.myUpcomingSessionAction) {
710
+ var speakerIds = [];
711
+ (_b = aiFormattedData.content) === null || _b === void 0 ? void 0 : _b.forEach((session) => {
712
+ speakerIds = [...speakerIds, ...session.speakers];
713
+ });
714
+ if ((speakerIds === null || speakerIds === void 0 ? void 0 : speakerIds.length) > 0)
715
+ this.getSpeakersByStaffIds(speakerIds);
716
+ }
717
+ if (aiFormattedData.section_id == this.addToMyAgendaAction &&
718
+ ((_c = aiFormattedData.content) === null || _c === void 0 ? void 0 : _c.length) > 0) {
719
+ this.openPage.next({
720
+ sectionId: aiFormattedData.section_id,
721
+ sessionIds: aiFormattedData.content,
722
+ });
723
+ }
724
+ if (aiFormattedData.section_id == this.connectOrFollowAction) {
725
+ let usersLen = (_d = aiFormattedData.content) === null || _d === void 0 ? void 0 : _d.length;
726
+ if (usersLen > 1) {
727
+ this.openPage.next({
728
+ sectionId: 'open_networking_drawer',
729
+ search: aiFormattedData.content,
730
+ });
731
+ }
732
+ else if (usersLen == 1) {
733
+ this.openPage.next({
734
+ sectionId: aiFormattedData.section_id,
735
+ connetUserIds: [aiFormattedData.content[0].userId],
736
+ });
737
+ }
738
+ }
739
+ if (aiFormattedData.is_open_page == 'true') {
740
+ this.openPage.next({
741
+ sectionId: aiFormattedData.section_id,
742
+ search: aiFormattedData.content,
743
+ });
744
+ if (this.isMobileBrowser()) {
745
+ aiFormattedData.message +=
746
+ '\n\n' + '<a id="closeBotNow">Click Here</a> to see results.';
747
+ }
748
+ }
749
+ this.chatLog.push({
750
+ type: 'ai',
751
+ message: aiFormattedData.message,
752
+ action: aiFormattedData,
753
+ time: formatNow(this.timezone),
754
+ });
755
+ if (this.isMobileBrowser()) {
756
+ setTimeout(() => {
757
+ this.addCloseBotClickEvent();
758
+ }, 500);
759
+ }
760
+ this.aiResponse = '';
761
+ }
762
+ else {
763
+ this.chatLog.push({
764
+ type: 'ai',
765
+ message: this.aiResponse,
766
+ time: formatNow(this.timezone),
767
+ });
768
+ }
769
+ this.showFeedBackIconsIndex = this.chatLog.length - 1;
770
+ this.cdr.markForCheck();
771
+ }
772
+ this.scrollToBottom();
773
+ // Enqueue the next data chunk into our target stream
774
+ controller.enqueue(value);
775
+ this.pump(controller, reader, allSuggestions);
776
+ });
777
+ }
778
+ submitFeedback(flag, message) {
779
+ console.log(message);
780
+ this.feedbackDone = true;
781
+ this.showFeedBackIconsIndex = null;
782
+ const conversation_id = this.conversationService.getKey(this.botId);
783
+ const url = `${this.environment.AGENTS_API}/Conversation/coPilot/${this.botId}/conversation/${conversation_id}/helpful-response`;
784
+ fetch(url, {
785
+ method: 'POST',
786
+ headers: {
787
+ 'Content-Type': 'application/json',
788
+ 'apiKey': 'Conversation_WIz/qAm+EEmfOkFaUA/weA==',
789
+ 'hive-bot-id': this.botId,
790
+ 'domain-authority': this.domainAuthorityValue
791
+ },
792
+ body: JSON.stringify({ messageId: message._id, isHelpful: flag }),
793
+ }).then(() => {
794
+ if (flag) {
795
+ this.chatLog.push({
796
+ type: 'ai',
797
+ message: this.thumbsUpMessage ||
798
+ `Great. May I assist you with anything else?`,
799
+ time: formatNow(this.timezone),
800
+ isFeedbackMsg: true,
801
+ });
802
+ this.scrollToBottom();
803
+ this.cdr.markForCheck();
804
+ this.feedbackDone = false;
805
+ this.showFeedBackIconsIndex = null;
806
+ return;
807
+ }
808
+ this.chatLog.push({
809
+ type: 'ai',
810
+ message: this.processMessage(this.thumbsDownMessages[this.thumbsDownMsgIndex]),
811
+ time: formatNow(this.timezone),
812
+ isFeedbackMsg: true,
813
+ });
814
+ this.thumbsDownMsgIndex =
815
+ (this.thumbsDownMsgIndex + 1) % this.thumbsDownMessages.length;
816
+ this.scrollToBottom();
817
+ this.cdr.markForCheck();
818
+ setTimeout(() => {
819
+ const supportLink = document.getElementById('supportLink88');
820
+ if (supportLink) {
821
+ supportLink.addEventListener('click', this.triggerSupport.bind(this));
822
+ }
823
+ }, 200);
824
+ this.feedbackDone = false;
825
+ this.showFeedBackIconsIndex = null;
826
+ });
827
+ }
828
+ handleKeydown(event) {
829
+ if (event.key === 'Enter' && !event.shiftKey) {
830
+ // Prevent default behavior (new line)
831
+ event.preventDefault();
832
+ // Call your submit function
833
+ this.handleSubmit(event);
834
+ }
835
+ }
836
+ handleSubmit(event) {
837
+ this.fetchData();
838
+ this.scrollToBottom();
839
+ }
840
+ handleUpClick(idx) {
841
+ if (this.feedbackDone) {
842
+ return;
843
+ }
844
+ this.submitFeedback(true, this.chatLog[idx]);
845
+ this.chatLog[idx].liked = !this.chatLog[idx].liked;
846
+ if (this.chatLog[idx].unliked) {
847
+ this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
848
+ }
849
+ this.cdr.markForCheck();
850
+ }
851
+ handleDownClick(idx) {
852
+ if (this.feedbackDone)
853
+ return;
854
+ this.submitFeedback(false, this.chatLog[idx]);
855
+ this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
856
+ if (this.chatLog[idx].liked)
857
+ this.chatLog[idx].liked = !this.chatLog[idx].liked;
858
+ }
859
+ // handleCopyClick(index: any) {
860
+ // // Copy the message to the clipboard
861
+ // const contentToCopy = this.chatLog[index].message;
862
+ // console.log('contentToCopy');
863
+ // console.log(contentToCopy);
864
+ // navigator.clipboard.writeText(contentToCopy).then(() => {
865
+ // // Indicate that the message was copied
866
+ // this.chatLog[index].copied = true;
867
+ // this.cdr.detectChanges();
868
+ // // Reset the copied state after a delay
869
+ // setTimeout(() => {
870
+ // this.chatLog[index].copied = false;
871
+ // this.cdr.detectChanges();
872
+ // }, 2000); // Reset after 2 seconds
873
+ // });
874
+ // }
875
+ copyText(id, index) {
876
+ // Get the text element
877
+ var textElement = document.getElementById(id);
878
+ // Create a temporary textarea element to copy the text
879
+ var tempTextArea = document.createElement('textarea');
880
+ tempTextArea.value = textElement.innerText;
881
+ // Append the textarea to the body (necessary for the execCommand to work)
882
+ document.body.appendChild(tempTextArea);
883
+ // Select the text inside the textarea
884
+ tempTextArea.select();
885
+ // Copy the text to the clipboard
886
+ document.execCommand('copy');
887
+ // Remove the temporary textarea
888
+ document.body.removeChild(tempTextArea);
889
+ // Optionally, you can alert the user or change the button text to indicate the copy was successful
890
+ // alert('Text copied to clipboard!');
891
+ this.chatLog[index].copied = true;
892
+ this.cdr.detectChanges();
893
+ // Reset the copied state after a delay
894
+ setTimeout(() => {
895
+ this.chatLog[index].copied = false;
896
+ this.cdr.detectChanges();
897
+ }, 2000); // Reset after 2 seconds
898
+ }
899
+ handleCopyClick(index) {
900
+ // Copy the message to the clipboard
901
+ const contentToCopy = this.chatLog[index].message;
902
+ const resutlt = this.copyText('messageText_' + index, index);
903
+ }
904
+ sanitizeHTML(html) {
905
+ const doc = new DOMParser().parseFromString(html, 'text/html');
906
+ // Create a new document fragment to hold the simplified content
907
+ const fragment = document.createDocumentFragment();
908
+ // Append the children of the body of the parsed document to the fragment
909
+ Array.from(doc.body.childNodes).forEach((node) => {
910
+ fragment.appendChild(node.cloneNode(true));
911
+ });
912
+ // Create a new div element to hold the simplified HTML
913
+ const simplifiedDiv = document.createElement('div');
914
+ simplifiedDiv.appendChild(fragment);
915
+ // Remove complex tags or attributes as needed
916
+ // Example: remove scripts
917
+ simplifiedDiv
918
+ .querySelectorAll('script')
919
+ .forEach((script) => script.remove());
920
+ // Return the simplified HTML as a string
921
+ return simplifiedDiv.innerHTML;
922
+ }
923
+ handleEditorClick(index) {
924
+ if (this.currentIndexForEditor == -1) {
925
+ this.currentIndexForEditor = index;
926
+ this.currentMessageForEditor = this.sanitizeHTML(this.chatLog[index].message);
927
+ this.currentMessageForEditor = this.currentMessageForEditor.replace('SafeValue must use [property]=binding:', '');
928
+ this.cdr.detectChanges();
929
+ }
930
+ else {
931
+ if (this.currentIndexForEditor == index) {
932
+ this.currentMessageForEditor += this.sanitizeHTML(this.chatLog[index].message);
933
+ this.currentMessageForEditor = this.currentMessageForEditor.replace('SafeValue must use [property]=binding:', '');
934
+ this.cdr.detectChanges();
935
+ }
936
+ else {
937
+ this.currentIndexForEditor = index;
938
+ this.currentMessageForEditor = this.sanitizeHTML(this.chatLog[index].message);
939
+ this.currentMessageForEditor = this.currentMessageForEditor.replace('SafeValue must use [property]=binding:', '');
940
+ this.cdr.detectChanges();
941
+ }
942
+ }
943
+ this.chatLog[index].isEditor = true;
944
+ this.cdr.detectChanges();
945
+ // Reset the copied state after a delay
946
+ setTimeout(() => {
947
+ this.chatLog[index].isEditor = false;
948
+ this.cdr.detectChanges();
949
+ }, 2000); // Reset after 2 seconds
950
+ this.editorsDrawer.open();
951
+ const button = document.getElementById('botcloseplaygroundbutton');
952
+ if (button) {
953
+ button.style.display = 'none';
954
+ }
955
+ this.cdr.detectChanges();
956
+ }
957
+ scrollToBottom() {
958
+ let counter = 0;
959
+ const interval = setInterval(() => {
960
+ this.chatMain.nativeElement.scrollTop = this.chatMain.nativeElement.scrollHeight;
961
+ if (counter++ > 5)
962
+ clearInterval(interval);
963
+ }, 5);
964
+ }
965
+ handleAction(action) {
966
+ console.info('incoming action from the chatbot AI');
967
+ console.info(action);
968
+ if (action === null || action === void 0 ? void 0 : action.content) {
969
+ }
970
+ }
971
+ ngAfterViewInit() {
972
+ // Check if the drawer is initially open and apply overflow hidden to body if so
973
+ if (this.drawer.opened) {
974
+ this.setBodyOverflow();
975
+ }
976
+ // Listen to changes in the drawer being opened or closed
977
+ this.drawer.openedChange.subscribe((opened) => {
978
+ if (opened) {
979
+ this.setBodyOverflow();
980
+ }
981
+ else {
982
+ this.removeBodyOverflow();
983
+ }
984
+ });
985
+ this.drawer.openedChange.subscribe((opened) => {
986
+ if (opened) {
987
+ setTimeout(() => {
988
+ if (this.myTextarea && this.myTextarea.nativeElement) {
989
+ this.myTextarea.nativeElement.focus(); // Focus on the textarea
990
+ }
991
+ });
992
+ }
993
+ });
994
+ }
995
+ setBodyOverflow() {
996
+ this.renderer.addClass(document.body, this.bodyOverflowClass);
997
+ }
998
+ removeBodyOverflow() {
999
+ this.renderer.removeClass(document.body, this.bodyOverflowClass);
1000
+ }
1001
+ getSpeakersByStaffIds(ids) {
1002
+ const url = `${this.environment.USERS_API}/events/${this.eventId}/users/get-by-staff-ids`;
1003
+ fetch(url, {
1004
+ method: 'POST',
1005
+ headers: {
1006
+ 'Content-Type': 'application/json',
1007
+ Authorization: 'Bearer ' + 'your_token_here',
1008
+ },
1009
+ body: JSON.stringify(ids),
1010
+ })
1011
+ .then((response) => {
1012
+ if (response.ok) {
1013
+ return response.json(); // Parse the JSON body of the response
1014
+ }
1015
+ else {
1016
+ throw new Error('Network response was not ok.');
1017
+ }
1018
+ })
1019
+ .then((data) => {
1020
+ if ((data === null || data === void 0 ? void 0 : data.length) > 0) {
1021
+ data.forEach((speaker) => {
1022
+ this.speakers[speaker.id] = speaker;
1023
+ });
1024
+ this.cdr.markForCheck();
1025
+ }
1026
+ })
1027
+ .catch((err) => {
1028
+ console.error('Error fetching data:', err);
1029
+ this.loading = false;
1030
+ });
1031
+ }
1032
+ performSessionAction(sessionId, action) {
1033
+ this.sessionActions.next({
1034
+ sessionId,
1035
+ action,
1036
+ });
1037
+ }
1038
+ addCloseBotClickEvent() {
1039
+ const element = this.elementRef.nativeElement.querySelector('#closeBotNow');
1040
+ if (element) {
1041
+ this.renderer.listen(element, 'click', () => {
1042
+ this.closeBot.next();
1043
+ });
1044
+ }
1045
+ }
1046
+ isMobileBrowser() {
1047
+ return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
1048
+ }
1049
+ connectToUser(userId) {
1050
+ this.connectWithUser.emit({
1051
+ connect: !this.canDisconnect(userId),
1052
+ userId,
1053
+ });
1054
+ setTimeout(() => {
1055
+ this.fetchMyConnections().subscribe((res) => {
1056
+ this.cdr.markForCheck();
1057
+ });
1058
+ this.fetchPendingRequests().subscribe((res) => {
1059
+ this.cdr.markForCheck();
1060
+ });
1061
+ }, 500);
1062
+ }
1063
+ scheduleMeetingWithUser(user) {
1064
+ this.scheduleMeeting.emit(user);
1065
+ }
1066
+ canConnect(userId) {
1067
+ return !(this.canDisconnect(userId) ||
1068
+ this.pendingRequests.find((a) => a == userId));
1069
+ }
1070
+ canDisconnect(userId) {
1071
+ return this.myConnections.find((conn) => conn.userId == userId);
1072
+ }
1073
+ fetchPendingRequests() {
1074
+ const headers = new HttpHeaders({
1075
+ 'Content-Type': 'application/json',
1076
+ apiKey: this.autogenKey,
1077
+ });
1078
+ return this.http
1079
+ .get(`${this.environment.USERS_API}/events/${this.eventId}/connection-requests/autogen/pending-sent-requests?userId=${this.userId}`, { headers })
1080
+ .pipe(switchMap((res) => {
1081
+ this.pendingRequests = res;
1082
+ this.cdr.markForCheck();
1083
+ return of(res);
1084
+ }), catchError((error) => {
1085
+ console.error('Error fetching pending requests: ', error);
1086
+ return of(null);
1087
+ }));
1088
+ }
1089
+ fetchMyConnections() {
1090
+ const headers = new HttpHeaders({
1091
+ 'Content-Type': 'application/json',
1092
+ apiKey: this.autogenKey,
1093
+ });
1094
+ return this.http
1095
+ .get(`${this.environment.USERS_API}/events/${this.eventId}/users-connections/autogen?userId=${this.userId}`, { headers })
1096
+ .pipe(switchMap((res) => {
1097
+ this.myConnections = res;
1098
+ this.cdr.markForCheck();
1099
+ return of(res);
1100
+ }), catchError((error) => {
1101
+ console.error('Error fetching pending requests: ', error);
1102
+ return of(null);
1103
+ }));
1104
+ }
1105
+ // Toggle the dropdown visibility
1106
+ toggleDropdown() {
1107
+ if (!this.agents)
1108
+ this.fetchAgents();
1109
+ this.isDropdownOpen = !this.isDropdownOpen;
1110
+ this.cdr.detectChanges();
1111
+ }
1112
+ onSelectAll(event) {
1113
+ var _a;
1114
+ (_a = this.agents) === null || _a === void 0 ? void 0 : _a.forEach((agent) => (agent.selected = false));
1115
+ this.cdr.detectChanges();
1116
+ }
1117
+ onAgentChange(agent) {
1118
+ //agent.selected = !agent.selected;
1119
+ //console.log(agent);
1120
+ let agentFound = this.agents.filter((p) => p.id == agent.id);
1121
+ if (agentFound && agentFound.length > 0) {
1122
+ agentFound[0].selected = !agentFound[0].selected;
1123
+ this.cdr.detectChanges();
1124
+ }
1125
+ this.cdr.detectChanges();
1126
+ }
1127
+ areAllSelected() {
1128
+ var _a;
1129
+ return (_a = this.agents) === null || _a === void 0 ? void 0 : _a.every((agent) => !agent.selected);
1130
+ }
1131
+ getDropdownHeaderText() {
1132
+ var _a;
1133
+ const selectedAgents = (_a = this.agents) === null || _a === void 0 ? void 0 : _a.filter((agent) => agent.selected);
1134
+ if (!selectedAgents) {
1135
+ return 'All Agents';
1136
+ }
1137
+ else {
1138
+ if (selectedAgents && (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) === 0) {
1139
+ return 'All Agents';
1140
+ }
1141
+ else {
1142
+ return (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) > 1
1143
+ ? `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agents Selected`
1144
+ : `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agent Selected`;
1145
+ }
1146
+ }
1147
+ }
1148
+ fetchAgents_http() {
1149
+ this.loading = true;
1150
+ const url = `${this.environment.AGENTS_API}/CoPilot/${this.botId}/active-agents`;
1151
+ const headers = new HttpHeaders({
1152
+ 'Content-Type': 'application/json',
1153
+ });
1154
+ return this.http.post(url, {}, { headers }).pipe(switchMap((res) => {
1155
+ if (res) {
1156
+ this.agents = res.map((agent) => (Object.assign(Object.assign({}, agent), { selected: false })));
1157
+ }
1158
+ this.cdr.markForCheck();
1159
+ return of(res);
1160
+ }), catchError((error) => {
1161
+ console.error('Error fetching chatbot config: ', error);
1162
+ return of(null);
1163
+ }));
1164
+ }
1165
+ fetchContent_http() {
1166
+ this.isDocInEditMode = false;
1167
+ this.isContentLoaded = false;
1168
+ console.log('API call function');
1169
+ this.loading = true;
1170
+ const conversation_id = this.conversationService.getKey(this.botId);
1171
+ this.conversationId = conversation_id;
1172
+ const url = `${this.environment.AGENTS_API}/ConversationDocuments?conversationId=${conversation_id}&botId=${this.botId}`;
1173
+ const headers = new HttpHeaders({
1174
+ 'Content-Type': 'application/json',
1175
+ apiKey: 'WIz/qAm+EEmfOkFaUA/weA==',
1176
+ 'domain-authority': this.domainAuthorityValue
1177
+ });
1178
+ return this.http.get(url, { headers }).pipe(switchMap((res) => {
1179
+ if (res) {
1180
+ this.isDocInEditMode = true;
1181
+ this.documentContent = res;
1182
+ console.log('Get API callled success');
1183
+ this.isContentLoaded = true;
1184
+ console.log(res);
1185
+ }
1186
+ this.cdr.markForCheck();
1187
+ return of(res);
1188
+ }), catchError((error) => {
1189
+ console.error('Error fetching chatbot config DJ: ', error);
1190
+ this.isDocInEditMode = false;
1191
+ this.isContentLoaded = true;
1192
+ if ((error === null || error === void 0 ? void 0 : error.status) == 404) {
1193
+ console.log('dash');
1194
+ this.isDocInEditMode = false;
1195
+ this.isContentLoaded = true;
1196
+ }
1197
+ return of(null);
1198
+ }));
1199
+ }
1200
+ fetchAgents() {
1201
+ this.fetchAgents_http().subscribe();
1202
+ }
1203
+ fetchEditorContent() {
1204
+ this.fetchContent_http().subscribe();
1205
+ }
1206
+ // events/${eventId}/users-connections
1207
+ processMessageForDisplay(markdown) {
1208
+ try {
1209
+ // Create a custom renderer to modify <a> tags
1210
+ const renderer = new marked.Renderer();
1211
+ // Customize anchor tags to include target="_blank"
1212
+ renderer.link = (href, title, text) => {
1213
+ return `<a href="${href}" title="${title || ''}" target="_blank">${text}</a>`;
1214
+ };
1215
+ // Parse the markdown content to HTML using marked with the custom renderer
1216
+ const markdownContent = marked.parse(markdown, { renderer: renderer });
1217
+ // Sanitize the parsed HTML using Angular's DomSanitizer
1218
+ const sanitizedHtml = this.sanitizer.bypassSecurityTrustHtml(markdownContent);
1219
+ // Return the safe HTML content for display
1220
+ return sanitizedHtml;
1221
+ }
1222
+ catch (error) {
1223
+ console.error('Error processing markdown:', error);
1224
+ return ''; // Return an empty string or handle the error appropriately
1225
+ }
1226
+ }
1227
+ prepareHtml(markdown) {
1228
+ if (!markdown || !(markdown.length > 0)) {
1229
+ console.error('Input Markdown is null or empty');
1230
+ return '';
1231
+ }
1232
+ // Convert Markdown headers (### or ##) to <strong> for bold headings
1233
+ let html = markdown.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
1234
+ const level = hashes.length;
1235
+ if (level === 3) {
1236
+ return `<h3><strong>${text}</strong></h3>`;
1237
+ }
1238
+ else if (level === 4) {
1239
+ return `<h4><strong>${text}</strong></h4>`;
1240
+ }
1241
+ return `<strong>${text}</strong>`;
1242
+ });
1243
+ // Convert Markdown code blocks with language to preformatted HTML
1244
+ html = html.replace(/```(\w+)?\n([\s\S]*?)```/g, (match, lang, code) => {
1245
+ const escapedCode = this.escapeHtml(code);
1246
+ const language = lang || 'plaintext';
1247
+ // Create a copy button for the code block
1248
+ return `
1249
+ <div class="code-container">
1250
+ <button id="copy-button" class="copy-button" (click)="copyToClipboard('\`${escapedCode}\`')">Copy</button>
1251
+ <pre class="code_block diff"><code class="language-${language}">${escapedCode}</code></pre>
1252
+ </div>`;
1253
+ });
1254
+ // Convert inline code (wrapped in `backticks`) to inline <code> tags
1255
+ html = html.replace(/`([^`]+)`/g, '<code>$1</code>');
1256
+ // Convert Markdown bold to HTML <strong>
1257
+ html = html.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
1258
+ // Convert numbered lists
1259
+ html = html.replace(/^\d+\.\s+(.*)$/gm, '<li>$1</li>');
1260
+ // Convert bullet point lists
1261
+ html = html.replace(/^\-\s+(.*)$/gm, '<li>$1</li>');
1262
+ // Convert Markdown links to HTML links
1263
+ html = html.replace(/\[([^\]]+)]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
1264
+ // Convert new lines to <br> tags for paragraphs
1265
+ html = html.replace(/(?:\r\n|\r|\n)/g, '<br>');
1266
+ return html;
1267
+ }
1268
+ // Helper function to escape HTML characters for code blocks
1269
+ escapeHtml(code) {
1270
+ return code
1271
+ .replace(/&/g, '&amp;')
1272
+ .replace(/</g, '&lt;')
1273
+ .replace(/>/g, '&gt;')
1274
+ .replace(/"/g, '&quot;')
1275
+ .replace(/'/g, '&#039;');
1276
+ }
1277
+ // Function to copy text to clipboard
1278
+ copyToClipboard(text) {
1279
+ navigator.clipboard.writeText(text).then(() => {
1280
+ alert('Code copied to clipboard!');
1281
+ }, (err) => {
1282
+ console.error('Could not copy text: ', err);
1283
+ });
1284
+ }
1285
+ toggleCollapse() {
1286
+ this.isCollapsed = !this.isCollapsed;
1287
+ this.cdr.detectChanges();
1288
+ }
1289
+ toggleCollapseGraph() {
1290
+ this.isCollapsedForGraph = !this.isCollapsedForGraph;
1291
+ this.cdr.detectChanges();
1292
+ }
1293
+ toggleCollapseFGraph() {
1294
+ this.isCollapsedForFGraph = !this.isCollapsedForFGraph;
1295
+ this.cdr.detectChanges();
1296
+ }
1297
+ // Extracts the domain from a URL
1298
+ getDomainName(url) {
1299
+ try {
1300
+ const { hostname } = new URL(url);
1301
+ return hostname.replace(/^www\./, ''); // Remove 'www.' if present
1302
+ }
1303
+ catch (_a) {
1304
+ return 'unknown';
1305
+ }
1306
+ }
1307
+ // Generates the favicon URL
1308
+ getFaviconUrl(url) {
1309
+ const domain = this.getDomainName(url);
1310
+ return `https://www.google.com/s2/favicons?sz=128&domain=${domain}`;
1311
+ }
1312
+ onCardClick(sources) {
1313
+ this.currentSourcesList = sources;
1314
+ this.cdr.detectChanges();
1315
+ this.sourcesDrawer.open();
1316
+ const button = document.getElementById('botcloseplaygroundbutton');
1317
+ if (button) {
1318
+ button.style.display = 'none';
1319
+ }
1320
+ }
1321
+ openOuterEditor() {
1322
+ this.fetchEditorContent();
1323
+ this.editorsDrawer.open();
1324
+ this.isDrawerOpen = true;
1325
+ this.isShowEditorButton = false;
1326
+ this.cdr.detectChanges();
1327
+ const button = document.getElementById('botcloseplaygroundbutton');
1328
+ if (button) {
1329
+ button.style.display = 'none';
1330
+ }
1331
+ }
1332
+ onCloseEditor() {
1333
+ this.editorsDrawer.close();
1334
+ this.isDrawerOpen = false;
1335
+ this.isShowEditorButton = true;
1336
+ this.cdr.detectChanges(); // Trigger change detection if needed
1337
+ this.onDrawerClosed();
1338
+ }
1339
+ onCloseSource() {
1340
+ this.sourcesDrawer.close();
1341
+ this.isDrawerOpen = false;
1342
+ this.cdr.detectChanges(); // Trigger change detection if needed
1343
+ this.onDrawerClosed();
1344
+ }
1345
+ onDrawerClosed() {
1346
+ setTimeout(() => {
1347
+ this.isDrawerOpen = true;
1348
+ this.cdr.detectChanges(); // Trigger change detection if needed
1349
+ // Use ngClass to dynamically apply the class
1350
+ const button = document.getElementById('botcloseplaygroundbutton');
1351
+ if (button) {
1352
+ button.style.display = 'block';
1353
+ }
1354
+ }, 800);
1355
+ }
1356
+ toggleDrawer(todo) {
1357
+ this.isDrawerOpen = todo;
1358
+ this.cdr.detectChanges();
1359
+ this.updateButtonVisibility();
1360
+ }
1361
+ updateButtonVisibility() {
1362
+ const button = document.getElementById('botcloseplaygroundbutton');
1363
+ if (button) {
1364
+ button.style.display = this.isDrawerOpen ? 'block' : 'none';
1365
+ }
1366
+ }
1367
+ openLinkInNewTab(link) {
1368
+ window.open(link, '_blank');
1369
+ }
1370
+ adjustTextareaHeight(event) {
1371
+ try {
1372
+ if (event.key === 'Enter' && !event.shiftKey) {
1373
+ // Prevents a new line from being added
1374
+ event.preventDefault();
1375
+ }
1376
+ }
1377
+ catch (error) {
1378
+ }
1379
+ const textarea = event.target;
1380
+ textarea.style.height = 'auto'; // Reset the height
1381
+ textarea.style.height = `${textarea.scrollHeight}px`; // Adjust height to match content
1382
+ // Ensure the height doesn't exceed the max-height set in CSS
1383
+ if (textarea.scrollHeight > 150) {
1384
+ textarea.style.height = `150px`; // Adjust height to match content
1385
+ textarea.style.overflowY = 'auto'; // Enable scrolling if content exceeds 400px
1386
+ }
1387
+ else {
1388
+ textarea.style.overflowY = 'hidden'; // Hide scrollbar if content is within limits
1389
+ }
1390
+ }
1391
+ toggleWorkflows(value = null) {
1392
+ if (!this.checkForCop29BotId()) {
1393
+ this.botService.getWorkflowsByOrgId(this.orgId).subscribe((res) => {
1394
+ this.orgWorkflows = res;
1395
+ this.isWorkflowOpen = value == null ? !this.isWorkflowOpen : value;
1396
+ if (!this.isWorkflowOpen) {
1397
+ this.selectedWorkflow = null;
1398
+ this.openWorkflowInput = false;
1399
+ }
1400
+ this.cdr.detectChanges();
1401
+ });
1402
+ }
1403
+ }
1404
+ initializeForm() {
1405
+ var _a, _b;
1406
+ // Create form controls dynamically based on selectedWorkflow.Trigger.InputSchema
1407
+ const formControls = {};
1408
+ if ((_b = (_a = this.selectedWorkflow) === null || _a === void 0 ? void 0 : _a.Trigger) === null || _b === void 0 ? void 0 : _b.InputSchema) {
1409
+ this.selectedWorkflow.Trigger.InputSchema.forEach((input) => {
1410
+ formControls[input.InputId] = [
1411
+ input.Value || '',
1412
+ input.Required ? Validators.required : null,
1413
+ ];
1414
+ });
1415
+ }
1416
+ // Initialize the form
1417
+ this.workflowForm = this.fb.group(formControls);
1418
+ }
1419
+ onWorkflowSelected(workflow) {
1420
+ this.selectedWorkflow = workflow;
1421
+ this.initializeForm();
1422
+ this.isWorkflowOpen = false;
1423
+ this.openWorkflowInput = true;
1424
+ }
1425
+ onWorkflowSubmit() {
1426
+ const container = document.getElementById('allChats');
1427
+ if (this.workflowForm.valid) {
1428
+ console.log(this.workflowForm.value);
1429
+ var input = this.prepareHtml(this.generateMarkdown(this.selectedWorkflow.Name, this.workflowForm.value));
1430
+ // update last two chatLog entries, set showWorkflowExecutionLoader = false
1431
+ try {
1432
+ this.chatLog[this.chatLog.length - 1]['showWorkflowExecutionLoader'] = false;
1433
+ this.chatLog[this.chatLog.length - 2]['showWorkflowExecutionLoader'] = false;
1434
+ }
1435
+ catch (error) { }
1436
+ this.chatLog.push({
1437
+ type: 'user',
1438
+ message: input,
1439
+ time: formatNow(this.timezone),
1440
+ copied: false,
1441
+ isCollapsedTrue: false,
1442
+ showWorkflowExecutionLoader: true,
1443
+ });
1444
+ console.log(input);
1445
+ this.currentWorkflowActionProgress = 0;
1446
+ this.currentWorkflowAction =
1447
+ 'Executing ' + this.selectedWorkflow.Actions[0].Name;
1448
+ this.isChatingWithAi = true;
1449
+ this.executingWorkflow = true;
1450
+ this.workflowExecutionDetails = {
1451
+ Actions: this.selectedWorkflow.Actions,
1452
+ Inputs: this.workflowForm.value,
1453
+ workflowInputs: this.workflowForm.value,
1454
+ WorkflowName: this.selectedWorkflow.Name,
1455
+ };
1456
+ this.currentWorkflowExecutionDetails = this.workflowExecutionDetails;
1457
+ this.scrollToBottom();
1458
+ this.cdr.detectChanges();
1459
+ // execute the ask endpoint with workflow input
1460
+ this.makeAskRequest(input, this.agents, this.conversationKey, '', null, this.selectedWorkflow['_id'], this.workflowForm.value);
1461
+ }
1462
+ }
1463
+ makeAskRequest(inputMsg, agents, conversationId, msg, chat, workflowId, workflow_inputs) {
1464
+ var _a;
1465
+ var url = `${this.environment.BASE_URL}/ai/ask`;
1466
+ var body = {
1467
+ user_question: inputMsg,
1468
+ user_id: this.userId,
1469
+ bot_id: this.botId,
1470
+ message_id: this.conversationService.generateKey(),
1471
+ session_id: this.conSessionKey,
1472
+ agents: (_a = agents === null || agents === void 0 ? void 0 : agents.filter((p) => p.selected).map((p) => p.id)) !== null && _a !== void 0 ? _a : [],
1473
+ conversation_id: conversationId,
1474
+ first_name: this.firstName,
1475
+ last_name: this.lastName
1476
+ };
1477
+ if (workflowId) {
1478
+ body['workflow_id'] = workflowId;
1479
+ body['workflow_inputs'] = workflow_inputs;
1480
+ }
1481
+ fetch(url, {
1482
+ method: 'POST',
1483
+ headers: {
1484
+ 'Content-Type': 'application/json',
1485
+ Authorization: 'Bearer ' + this.s27Token,
1486
+ 'x-api-key': this.apiKey,
1487
+ 'hive-bot-id': this.botId,
1488
+ 'domain-authority': this.domainAuthorityValue
1489
+ },
1490
+ body: JSON.stringify(body),
1491
+ })
1492
+ .then((response) => {
1493
+ if (response.status === 401 || response.status === 403) {
1494
+ this.is401 = true;
1495
+ this.refreshToken.emit();
1496
+ // If `msg` and `chat` exist, handle them
1497
+ if (msg && chat) {
1498
+ this.msg = msg;
1499
+ this.chat = chat;
1500
+ this.isFetchDataFor = true;
1501
+ }
1502
+ }
1503
+ else {
1504
+ this.is401 = false;
1505
+ }
1506
+ return response.json();
1507
+ })
1508
+ .then((data) => {
1509
+ console.log(data);
1510
+ // Additional response handling if needed
1511
+ })
1512
+ .catch((err) => {
1513
+ console.error('Error: ', err);
1514
+ this.isChatingWithAi = false;
1515
+ });
1516
+ this.input = '';
1517
+ this.selectedWorkflow = null;
1518
+ this.openWorkflowInput = false;
1519
+ this.isWorkflowOpen = false;
1520
+ this.scrollToBottom();
1521
+ this.cdr.markForCheck();
1522
+ }
1523
+ makeAskRequestold(inputMsg, agents, conversationId, msg, chat, workflowId, workflow_inputs) {
1524
+ var _a;
1525
+ const url = `${this.environment.BASE_URL}/ai/ask`;
1526
+ const body = {
1527
+ user_question: inputMsg,
1528
+ user_id: this.userId,
1529
+ bot_id: this.botId,
1530
+ message_id: this.conversationService.generateKey(),
1531
+ agents: (_a = agents === null || agents === void 0 ? void 0 : agents.filter((p) => p.selected).map((p) => p.id)) !== null && _a !== void 0 ? _a : [],
1532
+ conversation_id: conversationId,
1533
+ first_name: this.firstName,
1534
+ last_name: this.lastName,
1535
+ };
1536
+ if (workflowId) {
1537
+ body['workflow_id'] = workflowId;
1538
+ body['workflow_inputs'] = workflow_inputs;
1539
+ }
1540
+ const headers = new HttpHeaders({
1541
+ 'Content-Type': 'application/json',
1542
+ 'x-api-key': this.apiKey,
1543
+ 'hive-bot-id': this.botId,
1544
+ 'domain-authority': this.domainAuthorityValue,
1545
+ });
1546
+ this.http.post(url, body, { headers })
1547
+ .subscribe({
1548
+ next: (data) => {
1549
+ console.log(data);
1550
+ // Additional response handling if needed
1551
+ },
1552
+ error: (err) => {
1553
+ console.error('Error: ', err);
1554
+ this.isChatingWithAi = false;
1555
+ },
1556
+ });
1557
+ this.input = '';
1558
+ this.selectedWorkflow = null;
1559
+ this.openWorkflowInput = false;
1560
+ this.isWorkflowOpen = false;
1561
+ this.scrollToBottom();
1562
+ this.cdr.markForCheck();
1563
+ }
1564
+ generateMarkdown(title, obj) {
1565
+ var _a;
1566
+ // Initialize markdown with the title
1567
+ let markdown = `## ${title}\n`;
1568
+ // Loop through the object and append the field names and values
1569
+ for (const [key, value] of Object.entries(obj)) {
1570
+ var key_label = ((_a = this.selectedWorkflow.Trigger.InputSchema.find((input) => input.InputId === key)) === null || _a === void 0 ? void 0 : _a.Label) || key;
1571
+ markdown += `- **${key_label}**: ${value}\n`;
1572
+ }
1573
+ return markdown;
1574
+ }
1575
+ showWorkflowHistoryDetails(workflow_id) {
1576
+ if (!workflow_id) {
1577
+ this.workflowExecutionDetails = this.currentWorkflowExecutionDetails;
1578
+ this.showWorkflowExecutionDetails = true;
1579
+ this.cdr.detectChanges();
1580
+ return;
1581
+ }
1582
+ this.botService.getWorkflowExecutionById(workflow_id).subscribe((res) => {
1583
+ if (res && res.Actions && Array.isArray(res.Actions)) {
1584
+ res.Actions = res.Actions.map((action) => {
1585
+ if (action.InsertTimeStamp) {
1586
+ action.InsertTimeStamp = formatTimeStamps(this.timezone, action.InsertTimeStamp);
1587
+ }
1588
+ return action;
1589
+ });
1590
+ }
1591
+ res.InsertTimeStamp = formatTimeStamps(this.timezone, res.InsertTimeStamp);
1592
+ this.workflowExecutionDetails = res;
1593
+ this.showWorkflowExecutionDetails = true;
1594
+ this.cdr.detectChanges();
1595
+ });
1596
+ }
1597
+ closeModal() {
1598
+ this.showWorkflowExecutionDetails = false;
1599
+ }
1600
+ objectToArray(obj) {
1601
+ return Object.keys(obj).map((key) => ({ key, value: obj[key] }));
1602
+ }
1603
+ startNewConversation() {
1604
+ this.conversationKey = this.conversationService.getKey(this.botId, true);
1605
+ this.chatLog = [this.chatLog[0]];
1606
+ this.isChatingWithAi = false;
1607
+ setTimeout(() => {
1608
+ this.initializeSocket();
1609
+ }, 200);
1610
+ this.scrollToBottom();
1611
+ this.cdr.detectChanges();
1612
+ }
1613
+ initializeSpeechRecognizer(token) {
1614
+ this.speechConfig = SpeechSDK.SpeechConfig.fromAuthorizationToken(token, this.region);
1615
+ const audioConfig = SpeechSDK.AudioConfig.fromDefaultMicrophoneInput();
1616
+ this.recognizer = new SpeechSDK.SpeechRecognizer(this.speechConfig, audioConfig);
1617
+ this.recognizer.recognizing = (s, e) => {
1618
+ if (e.result.reason === SpeechSDK.ResultReason.RecognizingSpeech) {
1619
+ this.input = e.result.text;
1620
+ console.log(`Recognizing: ${e.result.text}`);
1621
+ this.cdr.markForCheck();
1622
+ }
1623
+ };
1624
+ this.recognizer.recognized = (s, e) => {
1625
+ if (e.result.reason === SpeechSDK.ResultReason.RecognizedSpeech) {
1626
+ this.input = e.result.text;
1627
+ console.log(`Recognized: ${e.result.text}`);
1628
+ this.toggleRecording();
1629
+ this.cdr.markForCheck();
1630
+ }
1631
+ };
1632
+ this.recognizer.canceled = (s, e) => {
1633
+ console.error('Canceled: ', e.errorDetails);
1634
+ };
1635
+ this.recognizer.sessionStopped = (s, e) => {
1636
+ console.log('Session stopped.');
1637
+ this.recognizer.stopContinuousRecognitionAsync();
1638
+ this.fetchData();
1639
+ };
1640
+ }
1641
+ toggleRecording() {
1642
+ this.isRecording = !this.isRecording;
1643
+ if (this.isRecording) {
1644
+ this.startRecognition();
1645
+ }
1646
+ else {
1647
+ this.stopRecognition();
1648
+ }
1649
+ }
1650
+ startRecognition() {
1651
+ this.recognizer.startContinuousRecognitionAsync();
1652
+ }
1653
+ stopRecognition() {
1654
+ this.recognizer.stopContinuousRecognitionAsync();
1655
+ }
1656
+ checkForCop29BotId() {
1657
+ return this.botId == '66fa3f276c5d71e2717bfea8' || this.botId == '671633545652dd78efec848d';
1658
+ }
1659
+ getLatestTime(time) {
1660
+ if (time) {
1661
+ return time;
1662
+ }
1663
+ return new Date().toLocaleTimeString([], {
1664
+ hour: '2-digit',
1665
+ minute: '2-digit',
1666
+ }); // returns current time in 'shortTime' format
1667
+ }
1668
+ }
1669
+ ChatDrawerComponent.decorators = [
1670
+ { type: Component, args: [{
1671
+ selector: 'hivegpt-chat-drawer-package',
1672
+ template: "<button *ngIf=\"isShowEditorButton && !checkForCop29BotId()\" (click)=\"openOuterEditor()\" class=\"fixed-btn\">\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\n create\n </span>\n Editor\n</button>\n\n<button *ngIf=\"!isShowEditorButton\" (click)=\"onCloseEditor()\" class=\"fixed-btn-close\">\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\n close\n </span>\n {{ getTranslation('Close') }}\n</button>\n\n<mat-drawer-container class=\"hivegpt-chat-wrapper\" [ngClass]=\"{ 'mat-drawer-container-has-open': isDrawerOpen }\"\n [class.ios-device]=\"isIOSDevice\" [hasBackdrop]=\"hasBackdropValue\">\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 <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 (click)=\"startNewConversation()\" class=\"new-conversationbutton\">\n {{ getTranslation('New Chat edit') }} <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14.061\" height=\"14.261\"\n viewBox=\"0 0 14.061 14.261\">\n <path id=\"Path_164\" data-name=\"Path 164\"\n d=\"M10.146,5.075H4.531A1.544,1.544,0,0,0,3,6.631v7.262A1.544,1.544,0,0,0,4.531,15.45h7.146a1.544,1.544,0,0,0,1.531-1.556V8.187m-7.146,4.15L15.25,3m0,0H11.677M15.25,3V6.631\"\n transform=\"translate(-2.25 -1.939)\" fill=\"none\" stroke=\"#06f\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" stroke-width=\"1.5\" />\n </svg>\n\n </span>\n </div>\n <div class=\"sticky-header-chat\">\n <div class=\"title_chat\">\n <h2>\n <span>\n {{ getTranslation(botName) }}\n <svg *ngIf=\"!checkForCop29BotId()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"31.499\" height=\"31.501\"\n viewBox=\"0 0 31.499 31.501\">\n <path id=\"Icon_ion-shield-checkmark\" data-name=\"Icon ion-shield-checkmark\"\n d=\"M33.685,7.83a1.125,1.125,0,0,0-.925-1.036,49.227,49.227,0,0,1-14.3-4.444,1.125,1.125,0,0,0-.927,0A49.226,49.226,0,0,1,3.24,6.794,1.125,1.125,0,0,0,2.315,7.83a27.621,27.621,0,0,0,1.718,11.9A24.572,24.572,0,0,0,9.07,27.641a25.712,25.712,0,0,0,8.513,6.028,1.125,1.125,0,0,0,.844,0,25.712,25.712,0,0,0,8.513-6.028,24.572,24.572,0,0,0,5.027-7.911,27.621,27.621,0,0,0,1.718-11.9Zm-9.211,5.281-7.791,9a1.125,1.125,0,0,1-.8.389h-.046a1.125,1.125,0,0,1-.788-.322L11.587,18.79a1.125,1.125,0,1,1,1.575-1.607l2.6,2.552,7.01-8.1a1.125,1.125,0,0,1,1.7,1.472Z\"\n transform=\"translate(-2.25 -2.25)\" fill=\"#06f\" />\n </svg>\n </span>\n <span *ngIf=\"!checkForCop29BotId()\">\n <p class=\"small-title\"> {{ getTranslation(\"AI-powered\") }}<span>{{ getTranslation(\"copilot\") }}</span></p>\n </span>\n </h2>\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\"> More Creative </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(1)\" class=\"fdssfd\">\n <button [ngClass]=\"{ active: temperature === 1 }\">\n <span class=\"top-section-title\"> More Balanced </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(2)\">\n <button [ngClass]=\"{ active: temperature === 2 }\">\n <span class=\"top-section-title\"> More Precise </span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n <!-- chattype -->\n <div id=\"allChats\" class=\"chat bot\" *ngFor=\"let chat of chatLog; let i = index\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\" [ngClass]=\"{\n 'time-cta din': showFeedBackIconsIndex === i,\n 'time-cta': showFeedBackIconsIndex != i\n }\">\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'ai'\">\n <!-- <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\" /> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\">\n <g id=\"Group_121\" data-name=\"Group 121\" transform=\"translate(4843 -371)\">\n <g id=\"Ellipse_18\" data-name=\"Ellipse 18\" transform=\"translate(-4843 371)\" fill=\"#fcfcfc\"\n stroke=\"#dfdfdf\" stroke-width=\"1\">\n <circle cx=\"22\" cy=\"22\" r=\"22\" stroke=\"none\" />\n <circle cx=\"22\" cy=\"22\" r=\"21.5\" fill=\"none\" />\n </g>\n <g id=\"Group_120\" data-name=\"Group 120\" transform=\"translate(-4835.141 378.855)\">\n <g id=\"Group_1\" data-name=\"Group 1\" transform=\"translate(7.29 0)\">\n <path id=\"Path_1\" data-name=\"Path 1\"\n d=\"M93.774,41.324,98.757,44.2v5.753l-4.983,2.877-4.983-2.877V44.2l4.983-2.877m0-2.034L87.03,43.183V50.97l6.744,3.893,6.744-3.893V43.183L93.774,39.29Z\"\n transform=\"translate(-87.03 -39.29)\" fill=\"gray\" />\n </g>\n <g id=\"Group_2\" data-name=\"Group 2\" transform=\"translate(0 12.717)\">\n <path id=\"Path_2\" data-name=\"Path 2\"\n d=\"M52.374,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L45.63,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\n transform=\"translate(-45.63 -111.51)\" fill=\"gray\" />\n </g>\n <g id=\"Group_3\" data-name=\"Group 3\" transform=\"translate(14.793 12.717)\">\n <path id=\"Path_3\" data-name=\"Path 3\"\n d=\"M136.384,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L129.64,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\n transform=\"translate(-129.64 -111.51)\" fill=\"gray\" />\n </g>\n </g>\n </g>\n </svg>\n\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n <span>{{ 'Assistant' }}</span> {{ chat?.time }}\n </div>\n </div>\n\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'user'\">\n <div class=\"user-Box\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\">\n <g id=\"Ellipse_17\" data-name=\"Ellipse 17\" fill=\"#fcfcfc\" stroke=\"#dfdfdf\" stroke-width=\"1\">\n <circle cx=\"22\" cy=\"22\" r=\"22\" stroke=\"none\" />\n <circle cx=\"22\" cy=\"22\" r=\"21.5\" fill=\"none\" />\n </g>\n <path id=\"Icon_grommet-user-expert\" data-name=\"Icon grommet-user-expert\"\n d=\"M14.24,20.443a9.472,9.472,0,1,0-9.472-9.472,9.472,9.472,0,0,0,9.472,9.472Zm10.329,5.225c-1.957-3.347-6.516-5.225-10.329-5.225-3.145,0-8.046.805-10.761,5.225\"\n transform=\"translate(7.976 8.416)\" fill=\"none\" stroke=\"gray\" stroke-width=\"1.5\" />\n </svg>\n\n <div class=\"dateTime\"><span>You</span> {{ chat?.time }}\n </div>\n </div>\n <div class=\"bards\">\n <div class=\"bars\" *ngIf=\"chat?.WorkflowExecutionId || chat?.showWorkflowExecutionLoader\">\n <button class=\"icon-button\" (click)=\"showWorkflowHistoryDetails(chat.WorkflowExecutionId)\">\n <i class=\"fas fa-bars\"></i>\n </button>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"researchingCard\">\n <div *ngIf=\"\n (chat?.searchTerms && chat?.searchTerms.length > 0) ||\n (chat?.sourcesList && chat?.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\n <i id=\"toggleIcon\" class=\"toggle-icon ml-2 fa\" [ngClass]=\"{\n 'fa-chevron-down': isCollapsed,\n 'fa-chevron-up': !isCollapsed\n }\"></i></span>\n </div>\n <div *ngIf=\"chat?.searchTerms && chat?.searchTerms.length > 0\" [ngClass]=\"{ collapse: isCollapsed }\">\n <ul class=\"list-group list-group-flush uptList\">\n <li *ngFor=\"let term of chat?.searchTerms\" class=\"list-group-item\">\n Searching for\n <strong>{{ term }}</strong>\n </li>\n </ul>\n\n <h5 class=\"mt-2\" *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\">\n <i class=\"bx bx-unite\"></i> Sources\n </h5>\n <div class=\"sources-container\" *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\">\n <div class=\"source-card\" *ngFor=\"\n let source of chat?.displayedSources;\n let i = index\n \">\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\" [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\" />\n {{ getDomainName(source.link) }}\n </div>\n <h5 (click)=\"openLinkInNewTab(source.link)\">\n {{ source.title }}\n </h5>\n <p (click)=\"openLinkInNewTab(source.link)\">\n {{ source.desc }}\n </p>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"\n chat?.remainingSources &&\n chat?.remainingSources.length > 0\n \">\n <div class=\"source-card\" (click)=\"onCardClick(chat?.sourcesList)\">\n <div>\n <div class=\"source-title\">\n <img *ngFor=\"\n let source of chat?.remainingSources;\n let i = index\n \" class=\"relative block\" [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\" />\n </div>\n <div class=\"source-url\">\n View {{ chat?.remainingSources.length }} more\n </div>\n </div>\n </div>\n </ng-container>\n </div>\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 <div id=\"messageText_{{ i }}\">\n <p *ngIf=\"chat?.type === 'ai' || chat?.type === 'user'\" [ngClass]=\"{\n 'SearchTitle ai': chat?.type === 'ai',\n 'SearchTitle user': chat?.type === 'user'\n }\" [ngStyle]=\"{\n background: chat?.type === 'ai' && messageTextColorAi ? messageTextColorAi : (chat?.type === 'user' && messageTextColorUser ? messageTextColorUser : 'defaultBackground'),\n color: chat?.type === 'ai' && messageTextColorAi ? messageTextColorAi : (chat?.type === 'user' && messageTextColorUser ? messageTextColorUser : 'defaultColor')\n }\" [innerHTML]=\"chat?.message\">\n </p>\n </div>\n </div>\n\n <div class=\"progress-container\" *ngIf=\"chat?.showWorkflowExecutionLoader\">\n <div class=\"circular-loader\">\n <div class=\"loader-spinner\" *ngIf=\"currentWorkflowActionProgress < 100\"\n [ngStyle]=\"{ 'transform': 'rotate(' + (percentage * 3.6) + 'deg)' }\">\n </div>\n <div class=\"checkmark\" *ngIf=\"currentWorkflowActionProgress == 100\">\n <svg viewBox=\"0 0 52 52\">\n <circle class=\"checkmark-circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkmark-check\" fill=\"none\" d=\"M14 27l7 7 16-16\" />\n </svg>\n </div>\n\n <div class=\"loader-text\" *ngIf=\"currentWorkflowActionProgress < 100\">{{\n currentWorkflowActionProgress\n }}%</div>\n </div>\n <div class=\"loader-label\">\n {{currentWorkflowAction}}...\n </div>\n </div>\n\n <div class=\"exicution mt-2\" *ngIf=\"\n chat?.type === 'ai' &&\n chat?.graphs &&\n chat?.graphs.length > 0\n \">\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-network-chart\"></i> Graphs\n <i (click)=\"toggleCollapseFGraph()\" class=\"toggle-icon ml-2 fa\" [ngClass]=\"{\n 'fas fa-chevron-down': isCollapsedForFGraph,\n 'fas fa-chevron-up': !isCollapsedForFGraph\n }\"></i>\n </h5>\n <img *ngFor=\"let image of chat?.graphs\" class=\"graph-img\"\n [ngClass]=\"{ collapse: isCollapsedForFGraph }\" [src]=\"image\" alt=\"\" />\n </div>\n <ng-container *ngIf=\"!checkForCop29BotId()\">\n <div class=\"exicution mt-2\" *ngIf=\"\n chat?.type === 'ai' &&\n chat?.executionGraphs &&\n chat?.executionGraphs?.length > 0\n \">\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-network-chart\"></i> Execution Path Diagram\n For Data Visualization Workflow\n <i (click)=\"toggleCollapseGraph()\" class=\"toggle-icon ml-2 fa\" [ngClass]=\"{\n 'fas fa-chevron-down': isCollapsedForGraph,\n 'fas fa-chevron-up': !isCollapsedForGraph\n }\"></i>\n </h5>\n <img *ngFor=\"let image of chat?.executionGraphs\" class=\"graph-img\"\n [ngClass]=\"{ collapse: isCollapsedForGraph }\" [src]=\"image\" alt=\"\" />\n </div>\n </ng-container>\n <div class=\"cta\" *ngIf=\"chat?.type === 'ai' && i > 0\">\n <div class=\"copyBox\" title=\"Copy\"\n [ngClass]=\"showFeedBackIconsIndex == i ? 'show-always' : 'show-hover'\">\n <button title=\"{{ chat?.copied ? 'Copied!' : 'Copy' }}\" class=\"copy\" [class.active]=\"chat?.copied\"\n (click)=\"handleCopyClick(i)\">\n <i *ngIf=\"chat?.copied\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" 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\" fill=\"#566563\" />\n </svg>\n </i>\n\n <i *ngIf=\"!chat?.copied\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" 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\n <button *ngIf=\"!checkForCop29BotId()\" class=\"up copy\"\n title=\"{{ chat?.isEditor ? 'Added!' : 'Add to editor' }}\" (click)=\"handleEditorClick(i)\">\n <svg *ngIf=\"!chat?.isEditor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20.152\" height=\"20.152\"\n viewBox=\"0 0 20.152 20.152\">\n <g id=\"Icon_feather-edit\" data-name=\"Icon feather-edit\" transform=\"translate(-2.5 -2.166)\">\n <path id=\"Path_166\" data-name=\"Path 166\"\n d=\"M11.5,6H4.889A1.889,1.889,0,0,0,3,7.889v13.22A1.889,1.889,0,0,0,4.889,23h13.22A1.889,1.889,0,0,0,20,21.108V14.5\"\n transform=\"translate(0 -1.179)\" fill=\"none\" stroke=\"#393939\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" stroke-width=\"1\" />\n <path id=\"Path_167\" data-name=\"Path 167\"\n d=\"M21.915,3.4a2,2,0,0,1,2.833,2.833l-8.971,8.971L12,16.152l.944-3.777Z\"\n transform=\"translate(-3.334 0)\" fill=\"none\" stroke=\"#393939\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" stroke-width=\"1\" />\n </g>\n </svg>\n\n <i *ngIf=\"chat?.isEditor\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" 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\" fill=\"#566563\" />\n </svg>\n </i>\n </button>\n\n <button class=\"up copy\" title=\"Like\" [class.active]=\"chat?.liked\" (click)=\"handleUpClick(i)\">\n <i *ngIf=\"chat?.liked\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" 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\" 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\" 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\" 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 </div>\n </div>\n <div class=\"Related mt-2\"\n *ngIf=\"showFeedBackIconsIndex === i && !isChatingWithAi && chat?.relatedListItems && chat?.relatedListItems.length > 0\">\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-list-check\"></i> Related\n </h5>\n <div class=\"card-container\" *ngIf=\"chat?.type === 'ai'\">\n <ul class=\"list-container\">\n <ng-container *ngFor=\"let item of chat?.relatedListItems\">\n <li (click)=\"fetchDataFor(item, chat)\">{{ item }}</li>\n </ng-container>\n </ul>\n </div>\n </div>\n </div>\n\n\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 </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 &nbsp;\n </div>\n </div>\n </div>\n <div *ngIf=\"chat?.suggestions?.length\">\n <h4 class=\"labelChat\">\n Here are some things EventsGPT Copilot can help you do:\n </h4>\n <div class=\"cta_suggestions\">\n <button *ngFor=\"let suggestion of chat?.suggestions\" (click)=\"sendMessageWithTile(suggestion)\">\n <ng-container *ngIf=\"suggestion\">{{\n suggestion\n }}</ng-container>\n </button>\n </div>\n </div>\n <div *ngIf=\"\n chat?.action?.section_id == 'company_search' ||\n chat?.action?.section_id == 'user_search' ||\n chat?.action?.section_id == 'industry_company_search'\n \">\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\" [currentUserId]=\"userId\"\n [videoObj]=\"user?.userVideosModel\" [user]=\"user\" [eventId]=\"eventId\" type=\"1\">\n </app-video-player>\n </ng-conatiner>\n </div>\n\n <div class=\"noPhoto\" *ngIf=\"!user?.photoPath && !user.userVideosModel\">\n <h3>\n {{ user.firstName | slice: 0:1\n }}{{ user.lastName | slice: 0:1 }}\n </h3>\n </div>\n <div class=\"overlymask\" *ngIf=\"!user.userVideosModel\"></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\" (click)=\"connectToUser(user.userId)\">\n {{\n canConnect(user.userId)\n ? 'Connect'\n : canDisconnect(user.userId)\n ? 'Disconnect'\n : 'Request\n Sent'\n }}\n </button>\n <button class=\"schedulebtn\" (click)=\"scheduleMeetingWithUser(user)\">\n Schedule\n </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\">\n <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\">\n <span class=\"material-icons notranslate\">\n 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 {{\n upcomingSession.dateTimeRange.start\n | date\n : 'MM-dd-yyyy\n HH:mm'\n : 'UTC'\n }}\n -\n {{\n upcomingSession.dateTimeRange.end\n | date: 'MM-dd-yyyy HH:mm':'UTC'\n }}\n {{ 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 (click)=\"\n performSessionAction(\n upcomingSession.id,\n 'view-session'\n )\n \" class=\"s27-btn-icon body-text-color\"\n title=\"View Session Information: Introduction to the Imaging Radar Academy\">\n <span class=\"material-icons notranslate\">\n remove_red_eye\n </span>\n </button>\n\n <button (click)=\"\n performSessionAction(\n upcomingSession.id,\n 'add-to-agenda'\n )\n \" class=\"s27-btn-icon body-text-color\">\n <span class=\"material-icons notranslate\"\n title=\"Add Session: Introduction to the Imaging Radar Academy to My agendaa\">\n event_available\n </span>\n </button>\n <!---->\n <!---->\n <!---->\n <!---->\n\n <button (click)=\"\n performSessionAction(upcomingSession.id, 'play')\n \" class=\"s27-btn-icon body-text-color\" title=\"Copy session link to share\">\n <span class=\"material-icons notranslate\">\n play_circle_outline\n </span>\n </button>\n <!---->\n </div>\n </div>\n <h2 class=\"body-text-color\">\n {{ upcomingSession.title }}\n </h2>\n <div class=\"session-description color-secondary\"\n [innerHTML]=\"sanitizeHtml(upcomingSession.description)\">\n </div>\n <ul class=\"speakers grid-2-cols\" *ngFor=\"let speakerId of upcomingSession.speakers\">\n <li class=\"\">\n <div class=\"image\" title=\"Blair Wunderlich\">\n <img alt=\"Blair Wunderlich\" [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 }}\n </div>\n <div class=\"color-secondary fs-xxs\">\n {{ speakers[speakerId]?.jobTitle }}\n </div>\n <div class=\"color-secondary fs-xxs\">\n {{ speakers[speakerId]?.company }}\n </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 && !executingWorkflow\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\">\n <g id=\"Group_121\" data-name=\"Group 121\" transform=\"translate(4843 -371)\">\n <g id=\"Ellipse_18\" data-name=\"Ellipse 18\" transform=\"translate(-4843 371)\" fill=\"#fcfcfc\"\n stroke=\"#dfdfdf\" stroke-width=\"1\">\n <circle cx=\"22\" cy=\"22\" r=\"22\" stroke=\"none\" />\n <circle cx=\"22\" cy=\"22\" r=\"21.5\" fill=\"none\" />\n </g>\n <g id=\"Group_120\" data-name=\"Group 120\" transform=\"translate(-4835.141 378.855)\">\n <g id=\"Group_1\" data-name=\"Group 1\" transform=\"translate(7.29 0)\">\n <path id=\"Path_1\" data-name=\"Path 1\"\n d=\"M93.774,41.324,98.757,44.2v5.753l-4.983,2.877-4.983-2.877V44.2l4.983-2.877m0-2.034L87.03,43.183V50.97l6.744,3.893,6.744-3.893V43.183L93.774,39.29Z\"\n transform=\"translate(-87.03 -39.29)\" fill=\"gray\" />\n </g>\n <g id=\"Group_2\" data-name=\"Group 2\" transform=\"translate(0 12.717)\">\n <path id=\"Path_2\" data-name=\"Path 2\"\n d=\"M52.374,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L45.63,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\n transform=\"translate(-45.63 -111.51)\" fill=\"gray\" />\n </g>\n <g id=\"Group_3\" data-name=\"Group 3\" transform=\"translate(14.793 12.717)\">\n <path id=\"Path_3\" data-name=\"Path 3\"\n d=\"M136.384,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L129.64,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\n transform=\"translate(-129.64 -111.51)\" fill=\"gray\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n <span> {{ 'Assistant' }}</span> {{ this.getLatestTime(chat?.time)}}\n </div>\n </div>\n </div>\n <div class=\"loaderbox\">\n <div class='loader-pkg'>\n <div class='loader--dot'></div>\n <div class='loader--dot'></div>\n <div class='loader--dot'></div>\n <div class='loader--dot'></div>\n <div class='loader--dot'></div>\n <div class='loader--dot'></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"chat bot\" *ngIf=\"loading\">\n <div class=\"chat-box\">\n <div class=\"message\">\n\n\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\">\n <g id=\"Group_121\" data-name=\"Group 121\" transform=\"translate(4843 -371)\">\n <g id=\"Ellipse_18\" data-name=\"Ellipse 18\" transform=\"translate(-4843 371)\" fill=\"#fcfcfc\"\n stroke=\"#dfdfdf\" stroke-width=\"1\">\n <circle cx=\"22\" cy=\"22\" r=\"22\" stroke=\"none\" />\n <circle cx=\"22\" cy=\"22\" r=\"21.5\" fill=\"none\" />\n </g>\n <g id=\"Group_120\" data-name=\"Group 120\" transform=\"translate(-4835.141 378.855)\">\n <g id=\"Group_1\" data-name=\"Group 1\" transform=\"translate(7.29 0)\">\n <path id=\"Path_1\" data-name=\"Path 1\"\n d=\"M93.774,41.324,98.757,44.2v5.753l-4.983,2.877-4.983-2.877V44.2l4.983-2.877m0-2.034L87.03,43.183V50.97l6.744,3.893,6.744-3.893V43.183L93.774,39.29Z\"\n transform=\"translate(-87.03 -39.29)\" fill=\"gray\" />\n </g>\n <g id=\"Group_2\" data-name=\"Group 2\" transform=\"translate(0 12.717)\">\n <path id=\"Path_2\" data-name=\"Path 2\"\n d=\"M52.374,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L45.63,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\n transform=\"translate(-45.63 -111.51)\" fill=\"gray\" />\n </g>\n <g id=\"Group_3\" data-name=\"Group 3\" transform=\"translate(14.793 12.717)\">\n <path id=\"Path_3\" data-name=\"Path 3\"\n d=\"M136.384,113.544l4.983,2.877v5.753l-4.983,2.877-4.983-2.877v-5.753l4.983-2.877m0-2.034L129.64,115.4v7.787l6.744,3.893,6.744-3.893V115.4l-6.744-3.893Z\"\n transform=\"translate(-129.64 -111.51)\" fill=\"gray\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n <span>{{ 'Loading ...' }}</span>\n </div>\n </div>\n </div>\n <div class=\"loaderbox\">\n <div class='loader-pkg'>\n <div class='loader--dot'></div>\n <div class='loader--dot'></div>\n <div class='loader--dot'></div>\n <div class='loader--dot'></div>\n <div class='loader--dot'></div>\n <div class='loader--dot'></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- <div #chatMain></div> -->\n <div *ngIf=\"openWorkflowInput && selectedWorkflow && !executingWorkflow\" class=\"chatFooterWrapper\">\n <!-- new UI for Chat Message Section by Amit -->\n <div class=\"chat-footer-upt\">\n <div class=\"topinfo-containerbox\">\n <div class=\"agents_note_wrapper\">\n <div>\n <h6>{{selectedWorkflow?.Name}}</h6>\n {{selectedWorkflow?.Description}}\n </div>\n </div>\n\n <div class=\"agents_note_wrapper\">\n <button mat-icon-button class=\"closeButtonSource\" (click)=\"toggleWorkflows(false)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"bottombox-wrapper\">\n <!-- here i need to loop through all the input fields selectedWorkflow.Trigger.InputSchema and render the input fields -->\n <!-- Form for Workflow Inputs -->\n <form [formGroup]=\"workflowForm\" (ngSubmit)=\"onWorkflowSubmit()\" class=\"form-container\">\n <div *ngFor=\"let input of selectedWorkflow?.Trigger?.InputSchema\" class=\"form-group\">\n <label>{{ input.Label }}</label>\n\n <!-- Handle Text Input or Text Area based on requirement -->\n <textarea *ngIf=\"input.Type === 'string'\" formControlName=\"{{input.InputId}}\"\n [placeholder]=\"input.Placeholder\" [rows]=\"2\" [required]=\"input.Required\"\n class=\"form-control\"></textarea>\n\n <!-- Dropdown for Select Options -->\n <select *ngIf=\"input.Type === 'select'\" formControlName=\"{{input.InputId}}\" class=\"form-control\">\n <option *ngFor=\"let option of input.Options\" [value]=\"option.Value\">{{\n option.Label }}</option>\n </select>\n </div>\n\n <!-- Submit button aligned to the right -->\n <div class=\"form-group\">\n <button type=\"submit\" class=\"btn btn-primary submit-button\">Submit</button>\n </div>\n </form>\n </div>\n </div>\n\n\n <!-- new UI for Chat Message Section by Amit -->\n </div>\n <div *ngIf=\"!openWorkflowInput\" class=\"chatFooterWrapper\">\n <!-- new UI for Chat Message Section by Amit -->\n <div class=\"chat-footer-upt\">\n <div class=\"topinfo-containerbox\" *ngIf=\"!checkForCop29BotId()\">\n <div class=\"agents_note_wrapper\">\n\n <div class=\"agents-dropdown-wrapper\">\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\" stroke=\"currentColor\"\n 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 </div>\n\n </div>\n\n <div class=\"agents_note_wrapper\">\n\n <div class=\"agents-dropdown-wrapper\">\n <div class=\"dropdown-wrapper\" (click)=\"toggleWorkflows()\">\n <div class=\"dropdown-header\">\n <svg stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 256 256\"\n class=\"h-5 w-5\" height=\"1.3em\" width=\"1.3em\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M245.66,74.34l-32-32a8,8,0,0,0-11.32,11.32L220.69,72H192a74.49,74.49,0,0,0-28.35,6.73c-13.62,6.29-30.83,19.71-35.54,48-5.32,31.94-29.1,39.22-41,40.86a40,40,0,1,0,.18,16.06A71.65,71.65,0,0,0,108.13,178C121.75,172,139,158.6,143.89,129.31,150.65,88.77,190.34,88,192,88h28.69l-18.35,18.34a8,8,0,0,0,11.32,11.32l32-32A8,8,0,0,0,245.66,74.34ZM48,200a24,24,0,1,1,24-24A24,24,0,0,1,48,200Z\">\n </path>\n </svg>&nbsp;\n Workflows\n </div>\n <div class=\"dropdown-menu\" *ngIf=\"isWorkflowOpen\">\n <label *ngFor=\"let orgWorkflow of orgWorkflows\" (click)=\"onWorkflowSelected(orgWorkflow)\">\n {{ orgWorkflow.Name }}\n </label>\n </div>\n </div>\n </div>\n\n </div>\n\n </div>\n <div class=\"bottombox-wrapper\">\n <!-- <input [disabled]=\"isChatingWithAi\" type=\"text\" class=\"form-control-1 s27-scroll\"\n \n placeholder=\"Ask anything...\" [style.background]=\"formFieldBgColor ? formFieldBgColor : ''\"\n [style.color]=\"formFieldTextColor ? formFieldTextColor : ''\" [(ngModel)]=\"input\"\n (keyup.enter)=\"handleSubmit()\" #myInput /> -->\n <textarea [disabled]=\"isChatingWithAi\" class=\"form-control-1 s27-scroll chat-textarea\"\n placeholder=\"{{ getTranslation('Ask anything') }}\" [(ngModel)]=\"input\" (keydown)=\"handleKeydown($event)\"\n (input)=\"adjustTextareaHeight($event)\" #myInput></textarea>\n\n <button (click)=\"toggleRecording()\" [disabled]=\"isChatingWithAi\"\n title=\"{{ isRecording ? 'Stop Recording' : 'Start Recording' }}\" class=\"btn cta-chat mr-1 vj-test\">\n <svg *ngIf=\"!isRecording\" 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 <!-- Mic Icon -->\n <path\n d=\"M256 320c53 0 96-43 96-96V96c0-53-43-96-96-96s-96 43-96 96v128c0 53 43 96 96 96zm144-96h-16c0 66.27-52.73 120-120 120s-120-53.73-120-120h-16c-17.67 0-32 14.33-32 32v32c0 53.87 38.13 100.64 91.21 112.27C210.13 457.77 231.58 464 256 464s45.87-6.23 65.79-17.73C374.87 388.64 416 341.87 416 288v-32c0-17.67-14.33-32-32-32z\">\n </path>\n </svg>\n <svg *ngIf=\"isRecording\" stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 24 24\"\n height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\">\n <!-- Square Stop Icon -->\n <path d=\"M5 5h14v14H5z\"></path>\n </svg>\n </button>\n\n\n <button class=\"btn cta-chat rotate\" (click)=\"handleSubmit()\"\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\" title=\"{{ getTranslation('Send Message') }}\">\n <svg stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 512 512\" height=\"1em\"\n 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\n\n <!-- new UI for Chat Message Section by Amit -->\n </div>\n\n <div class=\"NoteTxt\">\n <div class=\"note\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12.882\" height=\"12.883\" viewBox=\"0 0 12.882 12.883\">\n <path id=\"Icon_ion-shield-checkmark\" data-name=\"Icon ion-shield-checkmark\"\n d=\"M15.106,4.532a.46.46,0,0,0-.378-.424A20.132,20.132,0,0,1,8.881,2.291a.46.46,0,0,0-.379,0A20.132,20.132,0,0,1,2.655,4.108a.46.46,0,0,0-.378.424A11.3,11.3,0,0,0,2.98,9.4a10.049,10.049,0,0,0,2.06,3.235A10.516,10.516,0,0,0,8.521,15.1a.46.46,0,0,0,.345,0,10.516,10.516,0,0,0,3.481-2.465A10.049,10.049,0,0,0,14.4,9.4,11.3,11.3,0,0,0,15.106,4.532Zm-3.767,2.16L8.153,10.373a.46.46,0,0,1-.328.159H7.806a.46.46,0,0,1-.322-.131L6.069,9.014a.46.46,0,1,1,.644-.657L7.777,9.4,10.644,6.09a.46.46,0,0,1,.7.6Z\"\n transform=\"translate(-2.25 -2.25)\" fill=\"#06f\" />\n </svg>\n\n\n <span class=\"text\">Your personal or company information is kept\n private and secure\n within this chat.</span>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n <mat-drawer class=\"drawer edit-boxDrawer\" style=\"width: 45%\" #sourcesDrawer [position]=\"'end'\" [mode]=\"'over'\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \">\n <mat-drawer-content>\n <div class=\"sourceDraweContainer\">\n <div class=\"container-fluid\">\n <button mat-icon-button class=\"closeButtonSource\" (click)=\"onCloseSource()\">\n <mat-icon>close</mat-icon>\n </button>\n <h1>{{ currentSourcesList?.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 currentSourcesList; 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\n }}.</span>{{ item.title }}</span>\n <span class=\"image-container\">\n <img class=\"relative block\" [src]=\"getFaviconUrl(item.link)\"\n [alt]=\"getDomainName(item.link) + ' favicon'\" />\n <span> {{ getDomainName(item.link) }}</span>\n </span>\n <span class=\"source-description\">{{ item.desc }}</span>\n </label>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n <mat-drawer class=\"drawer edit-boxDrawer\" style=\"width: 45%\" #editorsDrawer [position]=\"'end'\" [mode]=\"'push'\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \">\n <mat-drawer-content>\n <lib-bot-html-editor *ngIf=\"isContentLoaded\" [editorContent]=\"currentMessageForEditor\"\n [isDocInEditMode]=\"isDocInEditMode\" [documentContent]=\"documentContent\" [conversationId]=\"conversationId\"\n [botId]=\"botId\"></lib-bot-html-editor>\n </mat-drawer-content>\n </mat-drawer>\n</mat-drawer-container>\n\n\n<div *ngIf=\"showWorkflowExecutionDetails\" class=\"modal\">\n <div class=\"modal-content\">\n <div class=\"close-wrapper\"><span class=\"close_pop\" (click)=\"closeModal()\">&times;</span></div>\n <div class=\"titleSection\">\n <!-- Workflow Title -->\n <h2>{{ workflowExecutionDetails.WorkflowName }}</h2>\n <!-- Workflow Title -->\n </div>\n <!-- Inputs Section -->\n <div class=\"inputs-section\">\n <h3>Inputs</h3>\n <ul>\n <li *ngFor=\"let input of objectToArray(workflowExecutionDetails.Inputs)\">\n {{ input.key }}: {{ input.value }}\n </li>\n </ul>\n </div>\n\n <!-- Actions Section (Displayed as Timeline) -->\n <div class=\"actions-section\">\n <h3>Agent Actions</h3>\n <div class=\"timeline\">\n <div *ngFor=\"let action of workflowExecutionDetails.Actions\" class=\"timeline-item\">\n <div class=\"timestamp-section\">\n <h4>{{ action.ActionName || action.Name }}</h4>\n <p><strong></strong> {{\n action.InsertTimeStamp }}</p>\n </div>\n <p [innerHTML]=\"processMessageForDisplay(action.Output)\"></p>\n <!-- <pre>{{ action.Output }}</pre> -->\n </div>\n </div>\n </div>\n\n <!-- Insert Timestamp -->\n <div class=\"timestamp-section\">\n <p><strong>Inserted At:</strong> {{\n workflowExecutionDetails.InsertTimeStamp }}</p>\n </div>\n </div>\n</div>",
1673
+ changeDetection: ChangeDetectionStrategy.OnPush,
1674
+ styles: ["@import url(\"https://e1cdn.social27.com/digitalevents/liteversion/fonts/segoe-ui/stylesheet.css\");.sticky-header-chat{background:#fff;border-bottom:1px solid #ddd;padding:0 0 10px;position:sticky;top:-21px;transition:all 1s;z-index:100}@media (max-width:768px){.sticky-header-chat{top:0}}::-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:#fff!important;background-image:none!important;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 .ai h3{font-size:1.3rem!important}.hivegpt-chat-wrapper .chat-main .chat-box{max-width:96%;width:100%}.hivegpt-chat-wrapper .chat-main .chat-box .message{margin-left:50px;margin-top:10px;min-height:40px;padding:0 20px 0 0;position:relative}@media (max-width:768px){.hivegpt-chat-wrapper .chat-main .chat-box .message{margin-left:0}}.hivegpt-chat-wrapper .chat-main .chat-box .message p{color:#000;color:#525252;font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:160%;margin:0;text-align:left}.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:flow-root;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.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:left;margin:0 -60px;width:auto}@media (max-width:768px){.hivegpt-chat-wrapper .chat-main .chat .Icon_TimeSTamp{margin:0}}.hivegpt-chat-wrapper .chat-main .chat .dateTime{color:#333232;font-size:15px;font-style:normal;font-weight:300;line-height:140%}.hivegpt-chat-wrapper .chat-main .chat .dateTime span{color:#06f;font-size:15px;font-style:normal;font-weight:500;line-height:140%;margin-left:15px;margin-right:5px}.hivegpt-chat-wrapper .chat-main .chat:last-of-type{margin-bottom:0}.hivegpt-chat-wrapper .chatFooterWrapper{background:#fff;border:2px solid hsla(0,0%,85.5%,.5882352941176471);border-radius:10px;box-shadow:2px 0 5px #e1e1e1;margin:0 auto 15px;margin-top:10px!important;transition:all .5s;width:75%}.hivegpt-chat-wrapper .chatFooterWrapper:hover{border:2px solid hsla(0,0%,72.2%,.5882352941176471);box-shadow:2px 0 4px #ddd}.hivegpt-chat-wrapper .chatFooterWrapper .chat-footer-upt{padding:4px}.hivegpt-chat-wrapper .chatFooterWrapper .note{align-items:center;background:rgba(27,117,187,.050980392156862744);border-radius:15px;color:#000;display:inline-flex;font-size:12px;gap:8px;line-height:1;margin:0 auto 4px;padding:10px 25px}.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: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::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;margin-bottom:10px;position:absolute;right:15px;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:20px}.title h2{font-size:22px;margin:0}.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{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:initial;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:initial!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{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 .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{border-radius:0;cursor:pointer;height:270px;object-fit:cover;outline:0;transition:.3s ease-in-out;width:100%}.tiktokwrapper .videoPhotobox img{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 2s 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%);z-index:0}@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:#f7f7f7;border-radius:13px;color:#566563;display:flex;float:right;gap:12px;padding:5px 10px;position:relative;width:135px}.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}.chat-footer{background:#fff;flex-direction:column;margin-bottom:10px}.chat-footer,.topinfo-containerbox{align-items:center;display:flex;width:100%}.topinfo-containerbox{background:#f9f9f9;border-bottom:1px solid #efefef;justify-content:space-between;margin:0;padding:5px 10px 8px}@media (max-width:768px){.topinfo-containerbox{flex-direction:column}}.agents_note_wrapper{display:flex;justify-content:space-around}.bottombox-wrapper{display:flex;padding:10px;width:100%}.dropdown-wrapper{margin-right:10px;position:relative}.dropdown-header{align-items:center;background:#fff;border:1px solid #ddd;border-radius:48px;color:#414141!important;cursor:pointer;display:flex;font-size:14px;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:230px;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,.text-left .note-section{align-items:center;display:flex}.text-left .note-section{background:#fff;border-radius:5px;box-shadow:0 2px 4px rgba(0,0,0,.1);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{background:#f5f5f5;border-radius:8px;font-size:13px;margin-bottom:5px;padding:6px 12px}.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:5px auto}.card-header{background:#eee;border-bottom:0;border-radius:8px 8px 0 0;display:flex!important;padding:8px 15px;width:auto}.icon{font-size:20px;line-height:5px}.rotate{transform:rotate(180deg)}.collapse{display:none}.uptList{background:rgba(245,222,179,.1411764705882353);border-radius:0 0 10px 10px;margin-bottom:20px!important}.list-group-item{color:#0f0f0f;font-size:15px;margin:1px 0;padding:0 18px}.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{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}.closeButtonEditor{border:0;border-radius:100%;height:32px;padding:3px 0 0;position:absolute;right:10px;top:5px;width:32px}.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}.graph-img{background:hsla(0,0%,99.6%,.23137254901960785);border-radius:15px;padding:15px;width:90%}.chat-textarea{background-color:#fff;border:none;box-sizing:border-box;font-size:15px;height:30px;line-height:1.5;overflow-y:hidden;padding:10px;resize:none;transition:all 1s;width:100%}.chat-textarea:focus,.chat-textarea:hover{height:60px}.chat-textarea:focus{outline:none}.fixed-btn{background-color:#000;border:none;border-radius:8px 8px 0 0;color:#fff;cursor:pointer;font-size:16px;padding:5px 12px;position:fixed;right:-22px;top:46%;transform:translateY(-50%) rotate(270deg);transform-origin:center;transition:all .5s;z-index:1000000}.fixed-btn:hover{background-color:#5b5b5b}.fixed-btn-close{background-color:#000;border:none;border-radius:8px 8px 0 0;color:#fff;cursor:pointer;font-size:16px;padding:5px 16px;position:fixed;right:549px;top:46%;transform:translateY(-50%) rotate(270deg);transform-origin:center;transition:all .5s;z-index:1000000}.fixed-btn-close:hover{background-color:#5b5b5b}.btn.rotate{transform:rotate(-15deg)}.btn.rotate:hover{transform:rotate(0deg)}.btn.cta-chat{align-items:center;background:#f3f3f3;border:none;border-radius:50%;color:#666;cursor:pointer;display:flex;height:40px;justify-content:center;margin:0 auto;padding:5px;text-align:center;transition:all .5s;width:40px}.btn.cta-chat:hover{background:#d7d7d7;color:#666}.btn.cta-chat svg{vertical-align:middle}.chat-footer-upt{padding:4px}.workflowbox{align-items:center;border:1px solid transparent;border-radius:48px;color:#414141!important;cursor:pointer;display:flex;font-size:14px;margin-bottom:0;padding:.5rem 1.5rem;transition:all .5s;white-space:nowrap}.workflowbox:hover{background:#fff;border:1px solid #ddd}.workflowbox svg{margin:0 10px}.edit-boxDrawer{border-left:1px solid #ddd;box-shadow:1px 1px 15px hsla(0,0%,86.7%,.7686274509803922)!important}.edit-boxDrawer mat-drawer-content,ng-deep .edit-boxDrawer mat-drawer-content{margin-left:0!important;margin-right:0!important}.SearchTitle{font-size:16px!important;text-transform:capitalize}.exicution{background:#f9f9f9;margin:30px 0!important;padding:15px 20px}.new-conversationbutton{align-items:center;background:#f5f5f5;border:1px solid #e3e3e3;border-radius:10px;cursor:pointer;display:flex;font-size:14px;justify-content:space-around;padding:6px;position:absolute;right:88px;top:10px;transition:all .5s;width:120px;z-index:1000}.new-conversationbutton:hover{background:#eee}@media (max-width:768px){.new-conversationbutton{align-items:center;font-size:11px!important;padding:0!important;position:fixed!important;right:18px!important;top:56px!important;width:90px!important}}.NoteTxt{margin:0 auto}.NoteTxt .text{margin:0 5px}.form-container{width:100%}.progress-container{align-items:center;display:flex}.circular-loader{border:4px solid rgba(0,0,0,.1);border-radius:50%;box-sizing:border-box;height:50px;position:relative;width:50px}.loader-spinner{animation:rotate-loader 1s linear infinite;border:2px solid #2196f3;border-radius:50%;border-top-color:transparent;box-sizing:border-box;height:100%;left:0;position:absolute;top:0;width:100%}.loader-text{color:#333;font-size:12px;font-weight:700;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.loader-label{color:#333;font-size:16px;margin-left:20px}.checkmark{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.checkmark-circle{animation:stroke .6s ease-in-out forwards;stroke:#4caf50;stroke-dasharray:166;stroke-dashoffset:166;stroke-width:4}.checkmark-check{animation:stroke-check .4s ease-in-out .4s forwards;stroke:#4caf50;stroke-dasharray:48;stroke-dashoffset:48;stroke-linecap:round;stroke-linejoin:round;stroke-width:4}@keyframes stroke{to{stroke-dashoffset:0}}@keyframes stroke-check{to{stroke-dashoffset:0}}@keyframes rotate-loader{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes checkmark-animation{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}.circular-loader.completed .loader-spinner{animation:none;transform:rotate(1turn)}.icon-button{background-color:initial;border:none;color:#333;cursor:pointer;font-size:24px}.icon-button:focus{outline:none}.icon-button:hover{color:#007bff}.modal{background-color:rgba(0,0,0,.4);display:block;height:100%;left:0;padding-top:0;position:fixed;top:0;width:100%;z-index:1000001}.modal-content{background-color:#fff;border-radius:8px;box-shadow:0 4px 8px rgba(0,0,0,.1);height:600px;margin:5% auto;padding:20px;position:relative;width:82%}.close{color:#aaa;float:right;font-size:28px;font-weight:700}.close:focus,.close:hover{color:#000;cursor:pointer;text-decoration:none}.SearchTitle.user{font-size:30px!important;text-transform:none!important}.SearchTitle.user h2,.SearchTitle.user p{font-size:1.7rem!important}.title_chat{display:flex;margin:0;padding:0}.title_chat h2{align-items:center;display:flex;font-size:20px;gap:10px;margin:10px 0}@media (max-width:768px){.title_chat h2{align-items:start;flex-direction:column;font-size:16px}}.small-title{font-size:12px;margin:2px 0}.titleSection{margin:0}.titleSection h2{color:#000;font-size:20px;margin:0}.inputs-section{background-color:#f7f7f7;border-radius:5px;margin:0 0 10px;padding:10px 15px 0}.inputs-section h3{font-size:16px}.actions-section{background-color:#f9f9f9;border-radius:5px;height:500px;margin-bottom:20px;overflow-y:auto;padding:15px}.timeline{margin-bottom:20px;padding-left:40px;position:relative}.timeline:before{border-right:2px dashed #cecece;content:\"\";height:100%;left:19px;position:absolute}.timeline-item{margin-bottom:20px;position:relative}.timeline-item:before{background-color:#007bff;border-radius:50%;content:\"\";height:20px;left:-30px;position:absolute;top:0;width:20px;z-index:1}.timeline-item h4{color:#000;font-size:16px;font-weight:700;margin:0}.timeline-item pre{background-color:#fff;border:1px solid #ddd;border-radius:5px;padding:10px;white-space:pre-wrap}.timestamp-section{color:#666;font-style:normal;justify-content:space-between}.mic-btn{background-color:#ff4d4d;border:none;border-radius:50%;color:#fff;cursor:pointer;font-size:1.5em;padding:10px}.mic-btn:active{background-color:#f66}.actions-section h3{font-size:16px}.close-wrapper{display:flex;justify-content:right;position:absolute;right:22px;top:0;width:100%}.close_pop{color:#aaa;cursor:pointer;font-size:30px;font-weight:400;justify-content:center}.close_pop,.user-Box{align-items:center;display:flex}.bards{position:absolute;right:0;top:20px}::ng-deep .code-container{margin:20px 0;position:relative}::ng-deep .copy-button{background-color:#007bff;border:none;border-radius:4px;color:#fff;cursor:pointer;padding:5px 10px;position:absolute;right:10px;top:10px}::ng-deep .copy-button:hover{background-color:#0056b3}::ng-deep .code_block.diff{background-color:#f8f8f8;border-left:4px solid #ccc;overflow:auto;padding:10px}::ng-deep .heading003{color:#06f;font-size:20px;font-weight:700}::ng-deep .listing{list-style:decimal;margin:0 25px;padding:0}.line{background-color:#e8e8e8;border-radius:15px;display:inline-block;height:15px;width:15px}.load-2 .line:last-child{animation:loadingB 1.5s 1s infinite;margin:5px 0}.load-2 .line:nth-last-child(2){animation:loadingB 1.5s .5s infinite;margin:5px 0}.load-2 .line:nth-last-child(3){animation:loadingB 1.5s 0s infinite;margin:5px 0}.load-1 .line:last-child{animation:loadingA 1.5s 1.2s infinite;margin:5px 0}.load-1 .line:nth-last-child(2){animation:loadingA 1.5s .8s infinite;margin:5px 0}.load-1 .line:nth-last-child(3){animation:loadingA 1.5s .2s infinite;margin:5px 0}@keyframes loadingB{0%{width:65px}50%{width:235px}to{width:65px}}@keyframes loadingA{0%{width:45px}50%{width:205px}to{width:45px}}.loaderbox{height:60px;margin:10px 0;position:relative}.loader-pkg{bottom:0;left:0;margin:0;top:0;width:250px}.loader--dot,.loader-pkg{height:20px;position:absolute}.loader--dot{animation-duration:3s;animation-iteration-count:infinite;animation-name:loader;animation-timing-function:ease-in-out;background-color:#1a6774;border-radius:100%;width:20px}.loader--dot:first-child{animation-delay:.5s;background-color:#618e93}.loader--dot:nth-child(5){animation-delay:.4s;background-color:#3fb0c3}.loader--dot:nth-child(4){animation-delay:.3s;background-color:#40b8cd}.loader--dot:nth-child(3){animation-delay:.2s;background-color:#ec8828}.loader--dot:nth-child(2){animation-delay:.1s;background-color:#fdc25d}.loader--dot:first-child{animation-delay:0s;background-color:#f4e3be}.loader--text{left:0;margin:0;position:absolute;top:200%;width:4rem}.loader--text:after{animation-duration:3s;animation-iteration-count:infinite;animation-name:loading-text;content:\"Loading\";font-weight:700}@keyframes loader{15%{transform:translateX(230px)}45%{transform:translateX(0)}65%{transform:translateX(230px)}95%{transform:translateX(0)}}@keyframes loading-text{0%{content:\"Loading\"}25%{content:\"Loading.\"}50%{content:\"Loading..\"}75%{content:\"Loading...\"}}::ng-deep .loaderbox{height:60px;margin:10px 0;position:relative}::ng-deep .loader-pkg{bottom:0;height:20px;left:0;margin:0;position:absolute;top:0;width:250px}::ng-deep .loader--dot{animation-duration:3s;animation-iteration-count:infinite;animation-name:loader;animation-timing-function:ease-in-out;background-color:#1a6774;border-radius:100%;height:20px;position:absolute;width:20px}::ng-deep .loader--dot:first-child{animation-delay:.5s;background-color:#618e93}::ng-deep .loader--dot:nth-child(5){animation-delay:.4s;background-color:#3fb0c3}::ng-deep .loader--dot:nth-child(4){animation-delay:.3s;background-color:#40b8cd}::ng-deep .loader--dot:nth-child(3){animation-delay:.2s;background-color:#ec8828}::ng-deep .loader--dot:nth-child(2){animation-delay:.1s;background-color:#fdc25d}::ng-deep .loader--dot:first-child{animation-delay:0s;background-color:#f4e3be}::ng-deep .loader--text{left:0;margin:0;position:absolute;top:200%;width:4rem}::ng-deep .loader--text:after{animation-duration:3s;animation-iteration-count:infinite;animation-name:loading-text;content:\"Loading\";font-weight:700}.agents-popwindowbox{background:#fff;padding:10px;width:100%}.agents-popwindowbox h3{color:#000;font-size:15px}.dropdown-menu-agents{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;padding:0;position:absolute;top:auto;width:270px;z-index:1000}.dropdown-menu-agents .scrollerbox{display:flex;flex:fit-content;flex-direction:column;height:215px;overflow-y:auto}.dropdown-menu-agents label{align-items:center;background:#f9f9f9;border-radius:2px;cursor:pointer;display:flex;font-size:13px;justify-content:start;line-height:16px;margin:2px 0;padding:7px}.dropdown-menu-agents label:hover{background:#ebebeb}.dropdown-menu-agents label input{opacity:0;position:absolute}.dropdown-menu-agents .input-check{border:2px solid #ccc;border-radius:4px;display:inline-block;height:23px;margin-right:5px;position:relative;top:0;transition:.5s;width:25px}.dropdown-menu-agents label input:checked~.input-check{animation:animate .7s ease;background:#06f;border-color:#06f}@keyframes animate{0%{transform:scale(1)}40%{transform:scale(1.3,.7)}55%{transform:scale(1)}70%{transform:scale(1.2,.8)}80%{transform:scale(1)}90%{transform:scale(1.1,.9)}to{transform:scale(1)}}.dropdown-menu-agents .input-check:before{border-bottom:3px solid #fff;border-left:3px solid #fff;content:\"\";height:6px;left:4px;position:absolute;top:6px;transform:scale(0) rotate(-45deg);transition:.5s;width:15px}.dropdown-menu-agents label input:checked~.input-check:before{transform:scale(1) rotate(-45deg)}::ng-deep .h1,::ng-deep h1{font-size:1.165rem}::ng-deep .h2,::ng-deep .h3,::ng-deep h2,::ng-deep h3{font-size:1.125rem}::ng-deep b,::ng-deep strong{font-weight:600}@media (max-width:768px){.note{line-height:15px;margin:0 auto;padding:3px 0 10px;width:90%}}.show-hover{display:none}.chat.bot:hover .show-hover{display:flex!important}"]
1675
+ },] }
1676
+ ];
1677
+ ChatDrawerComponent.ctorParameters = () => [
1678
+ { type: FormBuilder },
1679
+ { type: BotsService },
1680
+ { type: ChangeDetectorRef },
1681
+ { type: HttpClient },
1682
+ { type: DomSanitizer },
1683
+ { type: ElementRef },
1684
+ { type: Renderer2 },
1685
+ { type: SocketService },
1686
+ { type: ConversationService },
1687
+ { type: TranslationService }
1688
+ ];
1689
+ ChatDrawerComponent.propDecorators = {
1690
+ chatMain: [{ type: ViewChild, args: ['chatMain',] }],
1691
+ myInput: [{ type: ViewChild, args: ['myInput',] }],
1692
+ closePlaygroundButtons: [{ type: ViewChildren, args: ['closeplaygroundbutton',] }],
1693
+ drawer: [{ type: ViewChild, args: ['drawer',] }],
1694
+ sourcesDrawer: [{ type: ViewChild, args: ['sourcesDrawer',] }],
1695
+ editorsDrawer: [{ type: ViewChild, args: ['editorsDrawer',] }],
1696
+ myTextarea: [{ type: ViewChild, args: ['myTextarea', { static: false },] }],
1697
+ copilotName: [{ type: Input }],
1698
+ firstName: [{ type: Input }],
1699
+ lastName: [{ type: Input }],
1700
+ apiKey: [{ type: Input }],
1701
+ bgBubbleAi: [{ type: Input }],
1702
+ bgBubbleUser: [{ type: Input }],
1703
+ bgGradient: [{ type: Input }],
1704
+ botName: [{ type: Input }],
1705
+ botSkills: [{ type: Input }],
1706
+ botId: [{ type: Input }],
1707
+ orgId: [{ type: Input }],
1708
+ closeButtonColor: [{ type: Input }],
1709
+ closeButtonbgColor: [{ type: Input }],
1710
+ credentials: [{ type: Input }],
1711
+ dateTimeColor: [{ type: Input }],
1712
+ dateTextColor: [{ type: Input }],
1713
+ eventId: [{ type: Input }],
1714
+ s27Token: [{ type: Input }],
1715
+ eventName: [{ type: Input }],
1716
+ botIcon: [{ type: Input }],
1717
+ formFieldBgColor: [{ type: Input }],
1718
+ formFieldTextColor: [{ type: Input }],
1719
+ fullView: [{ type: Input }],
1720
+ gradientColors: [{ type: Input }],
1721
+ greeting: [{ type: Input }],
1722
+ messageTextColorAi: [{ type: Input }],
1723
+ messageTextColorUser: [{ type: Input }],
1724
+ rules: [{ type: Input }],
1725
+ sendButtonColor: [{ type: Input }],
1726
+ sendButtonTextColor: [{ type: Input }],
1727
+ showClose: [{ type: Input }],
1728
+ thumbsDownMessages: [{ type: Input }],
1729
+ thumbsUpMessage: [{ type: Input }],
1730
+ timezone: [{ type: Input }],
1731
+ unknownResponses: [{ type: Input }],
1732
+ useOpenAi: [{ type: Input }],
1733
+ userId: [{ type: Input }],
1734
+ isDev: [{ type: Input }],
1735
+ againButtonColor: [{ type: Input }],
1736
+ againButtonTextColor: [{ type: Input }],
1737
+ feedbackEvent: [{ type: Output }],
1738
+ onCloseEvent: [{ type: Output }],
1739
+ openPage: [{ type: Output }],
1740
+ sessionActions: [{ type: Output }],
1741
+ closeBot: [{ type: Output }],
1742
+ connectWithUser: [{ type: Output }],
1743
+ scheduleMeeting: [{ type: Output }],
1744
+ refreshToken: [{ type: Output }],
1745
+ openSupport: [{ type: Output }]
1746
+ };
1747
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1kcmF3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9EZXNrdG9wL0ZyZWVsYW5jZS9EYWx2aXIvUHJvLUV2ZW50cy1Gcm9udGVuZC9Bbmd1bGFyL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvY2hhdC1kcmF3ZXIvY2hhdC1kcmF3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9EQUFvRDtBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXpFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUVaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUVULFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hFLE9BQU8sRUFDTCxlQUFlLEVBQ2YsZ0JBQWdCLEdBQ2pCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTFELE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7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TSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RHJhd2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBmb3JtYXROb3csIGZvcm1hdFRpbWVTdGFtcHMgfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XG5pbXBvcnQge1xuICBkZXZfZW52aXJvbm1lbnQsXG4gIHByb2RfZW52aXJvbm1lbnQsXG59IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBDb252ZXJzYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29udmVyc2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU29ja2V0U2VydmljZSB9IGZyb20gJy4uL3NvY2tldC1zZXJ2aWNlLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCAqIGFzIFNwZWVjaFNESyBmcm9tICdtaWNyb3NvZnQtY29nbml0aXZlc2VydmljZXMtc3BlZWNoLXNkayc7XG5pbXBvcnQgeyBCb3RzU2VydmljZSB9IGZyb20gJy4uL2JvdC5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIG1hcmtlZCBmcm9tICdtYXJrZWQnOyAgLy8gSW1wb3J0IG1hcmtlZFxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoaXZlZ3B0LWNoYXQtZHJhd2VyLXBhY2thZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhdC1kcmF3ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGF0LWRyYXdlci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhdERyYXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZCgnY2hhdE1haW4nKSBwcml2YXRlIGNoYXRNYWluOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdteUlucHV0JykgcHJpdmF0ZSBteUlucHV0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkcmVuKCdjbG9zZXBsYXlncm91bmRidXR0b24nKVxuICBjbG9zZVBsYXlncm91bmRCdXR0b25zOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGQoJ2RyYXdlcicpIGRyYXdlciE6IE1hdERyYXdlcjtcbiAgQFZpZXdDaGlsZCgnc291cmNlc0RyYXdlcicpIHNvdXJjZXNEcmF3ZXIhOiBNYXREcmF3ZXI7XG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcnNEcmF3ZXInKSBlZGl0b3JzRHJhd2VyITogTWF0RHJhd2VyO1xuICBwcml2YXRlIGJvZHlPdmVyZmxvd0NsYXNzID0gJ2JvZHktb3ZlcmZsb3ctaGlkZGVuJztcbiAgQFZpZXdDaGlsZCgnbXlUZXh0YXJlYScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBteVRleHRhcmVhITogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjsgLy8gUmVmZXJlbmNlIHRvIHRoZSB0ZXh0YXJlYVxuICBpc0NvbGxhcHNlZFRydWUgPSBmYWxzZTtcbiAgQElucHV0KCkgY29waWxvdE5hbWU6IHN0cmluZyA9ICdIaXZlWEdQVCc7XG4gIEBJbnB1dCgpIGZpcnN0TmFtZSE6IHN0cmluZztcbiAgQElucHV0KCkgbGFzdE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwaUtleSE6IHN0cmluZztcbiAgQElucHV0KCkgYmdCdWJibGVBaSE6IHN0cmluZztcbiAgQElucHV0KCkgYmdCdWJibGVVc2VyITogc3RyaW5nO1xuICBASW5wdXQoKSBiZ0dyYWRpZW50ITogc3RyaW5nW107XG4gIEBJbnB1dCgpIGJvdE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJvdFNraWxscyE6IHN0cmluZztcbiAgQElucHV0KCkgYm90SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG9yZ0lkITogc3RyaW5nO1xuICBASW5wdXQoKSBjbG9zZUJ1dHRvbkNvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBjbG9zZUJ1dHRvbmJnQ29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNyZWRlbnRpYWxzITogW107XG4gIEBJbnB1dCgpIGRhdGVUaW1lQ29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRhdGVUZXh0Q29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGV2ZW50SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHMyN1Rva2VuITogc3RyaW5nO1xuICBASW5wdXQoKSBldmVudE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJvdEljb24hOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1GaWVsZEJnQ29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1GaWVsZFRleHRDb2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgZnVsbFZpZXchOiBib29sZWFuO1xuICBASW5wdXQoKSBncmFkaWVudENvbG9ycyE6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBncmVldGluZyE6IHN0cmluZztcbiAgQElucHV0KCkgbWVzc2FnZVRleHRDb2xvckFpITogc3RyaW5nO1xuICBASW5wdXQoKSBtZXNzYWdlVGV4dENvbG9yVXNlciE6IHN0cmluZztcbiAgQElucHV0KCkgcnVsZXMhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNlbmRCdXR0b25Db2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgc2VuZEJ1dHRvblRleHRDb2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgc2hvd0Nsb3NlITogYm9vbGVhbjtcbiAgQElucHV0KCkgdGh1bWJzRG93bk1lc3NhZ2VzITogc3RyaW5nW107XG4gIEBJbnB1dCgpIHRodW1ic1VwTWVzc2FnZSE6IHN0cmluZztcbiAgQElucHV0KCkgdGltZXpvbmUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHVua25vd25SZXNwb25zZXMhOiBbXTtcbiAgQElucHV0KCkgdXNlT3BlbkFpITogYm9vbGVhbjtcbiAgQElucHV0KCkgdXNlcklkITogc3RyaW5nO1xuICBASW5wdXQoKSBpc0RldiE6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgYWdhaW5CdXR0b25Db2xvciE6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBhZ2FpbkJ1dHRvblRleHRDb2xvciE6IHN0cmluZ1tdO1xuICBAT3V0cHV0KCkgZmVlZGJhY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgb25DbG9zZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgb3BlblBhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlc3Npb25BY3Rpb25zID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBjbG9zZUJvdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgY29ubmVjdFdpdGhVc2VyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzY2hlZHVsZU1lZXRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJlZnJlc2hUb2tlbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb3BlblN1cHBvcnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBhdXRvZ2VuS2V5ID0gJ0F1dG9nZW5fZURKVHRFVS1OQjBSdElwenExdyc7XG4gIGFkZFRvTXlBZ2VuZGFBY3Rpb24gPSAnYWRkX3RvX215X2FnZW5kYSc7XG4gIG15VXBjb21pbmdTZXNzaW9uQWN0aW9uID0gJ215X3VwY29tbWluZ19zZXNzaW9uJztcbiAgY29ubmVjdE9yRm9sbG93QWN0aW9uID0gJ2Nvbm5lY3Rfb3JfZm9sbG93JztcbiAgYWlSZXNwb25zZTogc3RyaW5nID0gJyc7XG4gIGNoYXRMb2c6IGFueVtdID0gW107XG4gIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgZmVlZGJhY2tEb25lOiBib29sZWFuID0gZmFsc2U7XG4gIGdyZWV0aW5nTXNnOiBzdHJpbmcgPSAnJztcbiAgaGFzQmFja2Ryb3BWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpbnB1dDogc3RyaW5nID0gJyc7XG4gIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTtcbiAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBtb2RlOiBzdHJpbmcgPSAnb3Zlcic7XG4gIHF1aWNrUHJvbXB0czogYW55W10gPSBbXTtcbiAgdGh1bWJzRG93bk1zZ0luZGV4ID0gMDtcbiAgdXNlck5hbWU6IHN0cmluZyA9ICcnO1xuICBzaG93U3RhcnRBZ2FpbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0lPU0RldmljZTogYm9vbGVhbiA9IGZhbHNlO1xuICBzaG93RmVlZEJhY2tJY29uc0luZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgdGVtcGVyYXR1cmU6IG51bWJlciA9IDE7XG4gIHNwZWFrZXJzID0gW107XG4gIGVudmlyb25tZW50OiB7XG4gICAgVVNFUlNfQVBJO1xuICAgIEJBU0VfVVJMO1xuICAgIEFHRU5UU19BUEk7XG4gIH07XG4gIHBlbmRpbmdSZXF1ZXN0czogYW55O1xuICBteUNvbm5lY3Rpb25zOiBhbnk7XG4gIGNvbnZlcnNhdGlvbktleTogc3RyaW5nO1xuICBjb25TZXNzaW9uS2V5OiBzdHJpbmcgPSAnJztcbiAgaXNGZXRjaERhdGFGb3I6IGJvb2xlYW47XG4gIGlzNDAxOiBib29sZWFuO1xuICBtc2c6IGFueTtcbiAgY2hhdDogYW55O1xuICBpc1dvcmtmbG93T3BlbjogYm9vbGVhbjtcbiAgb3JnV29ya2Zsb3dzOiBhbnk7XG4gIG9wZW5Xb3JrZmxvd0lucHV0OiBib29sZWFuO1xuICBzZWxlY3RlZFdvcmtmbG93OiBhbnk7XG4gIHdvcmtmbG93Rm9ybTogYW55O1xuICBjdXJyZW50V29ya2Zsb3dBY3Rpb25Qcm9ncmVzczogbnVtYmVyID0gMDtcbiAgY3VycmVudFdvcmtmbG93QWN0aW9uOiBzdHJpbmcgPSAnJztcbiAgZXhlY3V0aW5nV29ya2Zsb3c6IGJvb2xlYW47XG4gIHdvcmtmbG93RXhlY3V0aW9uRGV0YWlsczogYW55O1xuICBzaG93V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzOiBhbnk7XG4gIGN1cnJlbnRXb3JrZmxvd0V4ZWN1dGlvbkRldGFpbHM6IGFueTtcblxuICBzcGVlY2hDb25maWc6IFNwZWVjaFNESy5TcGVlY2hDb25maWc7XG4gIHJlY29nbml6ZXI6IFNwZWVjaFNESy5TcGVlY2hSZWNvZ25pemVyO1xuICByZWNvZ25pemVkVGV4dDogc3RyaW5nID0gJyc7XG4gIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nID0gJyc7XG4gIHJlZ2lvbjogc3RyaW5nID0gJ3dlc3RldXJvcGUnOyAvLyBTZXQgeW91ciBBenVyZSByZWdpb24gaGVyZVxuICBpc1JlY29yZGluZzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGJvdFNlcnZpY2U6IEJvdHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgc29ja2V0U2VydmljZTogU29ja2V0U2VydmljZSxcbiAgICBwcml2YXRlIGNvbnZlcnNhdGlvblNlcnZpY2U6IENvbnZlcnNhdGlvblNlcnZpY2UsIC8vIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZVxuICApIHtcbiAgICB0aGlzLmNoYXRNYWluID0gbmV3IEVsZW1lbnRSZWYobnVsbCk7XG5cbiAgICAvLyBpZiAodGhpcy5wbGF0Zm9ybS5JT1MpIHtcbiAgICAvLyAgIHRoaXMuaXNJT1NEZXZpY2UgPSB0cnVlO1xuICAgIC8vIH1cbiAgfVxuZ2V0VHJhbnNsYXRpb24oa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZ2V0VHJhbnNsYXRpb24oa2V5KTtcbiAgfVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGV2ZW50SWQgY2hhbmdlcyB0byB1cGRhdGUgdHJhbnNsYXRpb24gc2VydmljZVxuICAgIGlmIChjaGFuZ2VzLmV2ZW50SWQgJiYgY2hhbmdlcy5ldmVudElkLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2Uuc2V0RXZlbnRJZChjaGFuZ2VzLmV2ZW50SWQuY3VycmVudFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5zMjdUb2tlbikge1xuICAgICAgaWYgKGNoYW5nZXMuczI3VG9rZW4uY3VycmVudFZhbHVlICE9IGNoYW5nZXMuczI3VG9rZW4ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICB0aGlzLnMyN1Rva2VuID0gY2hhbmdlcy5zMjdUb2tlbi5jdXJyZW50VmFsdWU7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2lzRmV0Y2hEYXRhRm9yOiAnLCB0aGlzLmlzRmV0Y2hEYXRhRm9yKTtcbiAgICAgICAgY29uc29sZS5sb2coJ21zZzogJywgdGhpcy5tc2cpO1xuICAgICAgICBjb25zb2xlLmxvZygnY2hhdDogJywgdGhpcy5jaGF0KTtcbiAgICAgICAgaWYgKHRoaXMuaXM0MDEpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc0ZldGNoRGF0YUZvcikge1xuICAgICAgICAgICAgdGhpcy5mZXRjaERhdGFGb3IodGhpcy5tc2csIHRoaXMuY2hhdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hEYXRhKHRoaXMubXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5vcmdJZCkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzLm9yZ0lkLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzLm9yZ0lkLnByZXZpb3VzVmFsdWUgJiZcbiAgICAgICAgY2hhbmdlcy5vcmdJZC5jdXJyZW50VmFsdWVcbiAgICAgICkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVTb2NrZXQoKTtcblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgZG9tYWluQXV0aG9yaXR5VmFsdWU6IGFueSA9IFwicHJvZC1saXRlXCI7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gU2V0IHRoZSBldmVudElkIGluIHRyYW5zbGF0aW9uIHNlcnZpY2UgdG8gZ2V0IHRoZSBjb3JyZWN0IGxhbmd1YWdlIGZyb20gbG9jYWxTdG9yYWdlXG4gICAgY29uc29sZS5sb2coJ1JvaGl0ID4+PicsdGhpcy5ldmVudElkKTsgICAgXG4gICAgY29uc29sZS5sb2coJ1JvaGl0IG5hbWUgPj4+Jyx0aGlzLmZpcnN0TmFtZSk7ICAgIFxuICAgIGlmICh0aGlzLmV2ZW50SWQpIHtcbiAgICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnNldEV2ZW50SWQodGhpcy5ldmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLmVudmlyb25tZW50ID0gdGhpcy5pc0RldiA/IGRldl9lbnZpcm9ubWVudCA6IHByb2RfZW52aXJvbm1lbnQ7XG4gICAgY29uc29sZS5sb2coJ1JvaGl0ID4+PicsdGhpcy5ldmVudElkKTsgICAgXG4gICAgY29uc29sZS5sb2coJ1JvaGl0IG5hbWUgPj4+Jyx0aGlzLmZpcnN0TmFtZSk7ICAgIFxuICAgIGNvbnN0IGRvbWFpbiA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtcblxuICAgIC8vIERldGVybWluZSB0aGUgaGVhZGVyIHZhbHVlIGJhc2VkIG9uIHRoZSBkb21haW5cblxuXG4gICAgaWYgKGRvbWFpbi5pbmNsdWRlcygncHJlLWFwcC5zb2NpYWwyNy5jb20nKSkge1xuICAgICAgdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSA9ICdwcmUtcHJvZC1saXRlJztcbiAgICB9IGVsc2UgaWYgKGRvbWFpbi5pbmNsdWRlcygnYXBwLnNvY2lhbDI3LmNvbScpKSB7XG4gICAgICB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlID0gJ3Byb2QtbGl0ZSc7XG4gICAgfSBlbHNlIGlmIChkb21haW4uaW5jbHVkZXMoJ2hpdmVncHQuaW8nKSkge1xuICAgICAgdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSA9ICdoaXZlZ3B0JztcbiAgICB9XG5cbiAgICAvLyB0aGlzLmZldGNoTXlDb25uZWN0aW9ucygpLnN1YnNjcmliZSgpO1xuICAgIC8vIHRoaXMuZmV0Y2hQZW5kaW5nUmVxdWVzdHMoKS5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuY2hhbmdlVGVtcGVyYXR1cmUodGhpcy50ZW1wZXJhdHVyZSk7XG4gICAgdGhpcy5mZXRjaEJvdENvbmZpZygpLnN1YnNjcmliZShcbiAgICAgIChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgdGhpcy5mZXRjaENoYXRIaXN0b3J5KCkuc3Vic2NyaWJlKFxuICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm1hcENoYXRIaXN0b3J5KHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5OicsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5OicsIGVycik7XG4gICAgICB9XG4gICAgKTtcbiAgICAvLyB0aGlzLmZldGNoQWdlbnRzKCk7XG4gICAgLy8gdGhpcy5mZXRjaEVkaXRvckNvbnRlbnQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAvLyB0aGlzLmluaXRpYWxpemVTb2NrZXQoKTtcbiAgICB0aGlzLmJvdFNlcnZpY2UuZmV0Y2hTcGVlY2hBdXRob3JpemF0aW9uVG9rZW4odGhpcy5ib3RJZCwgdGhpcy5hcGlLZXksIHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUpLnN1YnNjcmliZSgodG9rZW4pID0+IHtcbiAgICAgIHRoaXMuYXV0aG9yaXphdGlvblRva2VuID0gdG9rZW47XG4gICAgICB0aGlzLmluaXRpYWxpemVTcGVlY2hSZWNvZ25pemVyKHRva2VuKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZXZlbnRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgaW5pdGlhbGl6ZVNvY2tldCgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zb2NrZXRTZXJ2aWNlLmRpc2Nvbm5lY3RTb2NrZXRDb25uZWN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXRTZXJ2aWNlLmNvbm5lY3RTb2NrZXRDb25uZWN0aW9uKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1lFUyBJTklUJyk7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbl9pZCA9IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZXRLZXkodGhpcy5ib3RJZCk7XG5cbiAgICAgICAgdGhpcy5zb2NrZXRTZXJ2aWNlLnJlZ2lzdGVyVXNlclNwZWNpZmljSGl2ZVNvY2tldChcbiAgICAgICAgICB0aGlzLmJvdElkLFxuICAgICAgICAgIGNvbnZlcnNhdGlvbl9pZCxcbiAgICAgICAgICB0aGlzLm9yZ0lkXG4gICAgICAgICk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubGlzdGVuU29ja2V0cygpO1xuICAgICAgICB9LCAzMDApO1xuICAgICAgfSwgMjAwKTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgc3Vic2NyaXB0aW9uTmV3OiBhbnk7XG4gIHNvY2tldERhdGE6IGFueTtcblxuICBsaXN0ZW5Tb2NrZXRzKCkge1xuICAgIGlmICh0aGlzLmV2ZW50U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmV2ZW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdMaXN0ZW4gU29ja2V0Jyk7XG4gICAgdGhpcy5ldmVudFN1YnNjcmlwdGlvbiA9IHRoaXMuY29udmVyc2F0aW9uU2VydmljZVxuICAgICAgLmdldFVzZXJTcGVjaWZpY05vdGlmaWNhdGlvbigpXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0xpc3RlbiBTb2NrZXQgcmVzcG9uc2UnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICAgIC8vIENoZWNrIGlmIE90aGVyRmllbGRzIGV4aXN0cyBpbiB0aGUgcmVzcG9uc2VcbiAgICAgICAgICBpZiAocmVzPy5tPy5PdGhlckZpZWxkcz8ud29ya2Zsb3dfaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgcGVyY2VudGFnZSxcbiAgICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgICBhY3Rpb25fbmFtZSxcbiAgICAgICAgICAgICAgY3VycmVudF9hY3Rpb25fbmFtZSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dfZXhlY3V0aW9uX2lkLFxuICAgICAgICAgICAgICB0aW1lX3N0YW1wLFxuICAgICAgICAgICAgfSA9IHJlcz8ubT8uT3RoZXJGaWVsZHM7XG5cbiAgICAgICAgICAgIHRoaXMuY3VycmVudFdvcmtmbG93QWN0aW9uUHJvZ3Jlc3MgPSBwZXJjZW50YWdlO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50V29ya2Zsb3dBY3Rpb24gPSBhY3Rpb25fbmFtZTtcblxuICAgICAgICAgICAgY29uc3QgYWN0aW9uSW5kZXggPSB0aGlzLndvcmtmbG93RXhlY3V0aW9uRGV0YWlscy5BY3Rpb25zLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgKGEpID0+IGEuTmFtZSA9PSBjdXJyZW50X2FjdGlvbl9uYW1lXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoYWN0aW9uSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIHRoaXMud29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzLkFjdGlvbnNbYWN0aW9uSW5kZXhdW1xuICAgICAgICAgICAgICAgICdPdXRwdXQnXG4gICAgICAgICAgICAgIF0gPSBvdXRwdXQ7XG4gICAgICAgICAgICAgIHRoaXMud29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzLkFjdGlvbnNbYWN0aW9uSW5kZXhdW1xuICAgICAgICAgICAgICAgICdJbnNlcnRUaW1lU3RhbXAnXG4gICAgICAgICAgICAgIF0gPSBmb3JtYXRUaW1lU3RhbXBzKHRoaXMudGltZXpvbmUsIHRpbWVfc3RhbXApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQWN0aW9uIHdpdGggbmFtZSAke2FjdGlvbl9uYW1lfSBub3QgZm91bmRgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzID0gdGhpcy53b3JrZmxvd0V4ZWN1dGlvbkRldGFpbHM7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRXb3JrZmxvd0FjdGlvblByb2dyZXNzID09IDEwMCkge1xuICAgICAgICAgICAgICB0aGlzLmNoYXRMb2dbdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDFdW1xuICAgICAgICAgICAgICAgICdXb3JrZmxvd0V4ZWN1dGlvbklkJ1xuICAgICAgICAgICAgICBdID0gd29ya2Zsb3dfZXhlY3V0aW9uX2lkO1xuICAgICAgICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGluZ1dvcmtmbG93ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcz8ubT8uT3RoZXJGaWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgY29udmVyc2F0aW9uX2lkLFxuICAgICAgICAgICAgICBib3RfaWQsXG4gICAgICAgICAgICAgIG1lc3NhZ2VfaWQsXG4gICAgICAgICAgICAgIGFuc3dlcixcbiAgICAgICAgICAgICAgd2ViX3Jlc3VsdHMsXG4gICAgICAgICAgICAgIHNlYXJjaF9yZXN1bHRzLFxuICAgICAgICAgICAgICBncmFwaHMsXG4gICAgICAgICAgICAgIGV4ZWN1dGlvbl9ncmFwaHMsXG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLFxuICAgICAgICAgICAgfSA9IHJlcz8ubT8uT3RoZXJGaWVsZHM7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbWVzc2FnZV9pZDEnKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcz8ubT8uT3RoZXJGaWVsZHMpO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRDaGF0TWVzc2FnZSA9IHRoaXMuY2hhdExvZy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT4gcC5faWQgPT0gbWVzc2FnZV9pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY2hhdExvZyk7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRDaGF0TWVzc2FnZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbWVzc2FnZV9pZDInKTtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZV9pZCk7XG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBfaWQ6IG1lc3NhZ2VfaWQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goY3VycmVudENoYXRNZXNzYWdlKTtcblxuICAgICAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ21lc3NhZ2VfaWQzJyk7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2VfaWQpO1xuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgZmllbGRzIGJhc2VkIG9uIHRoZWlyIHByZXNlbmNlXG4gICAgICAgICAgICBpZiAoc2VhcmNoX3Jlc3VsdHMgJiYgQXJyYXkuaXNBcnJheShzZWFyY2hfcmVzdWx0cykpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ09ubGluZSBTZWFyY2ggVGVybXM6Jywgc2VhcmNoX3Jlc3VsdHMpO1xuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2Uuc2VhcmNoVGVybXMgPSBzZWFyY2hfcmVzdWx0cztcbiAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAod2ViX3Jlc3VsdHMgJiYgQXJyYXkuaXNBcnJheSh3ZWJfcmVzdWx0cykpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1dlYiBSZXN1bHRzOicsIHdlYl9yZXN1bHRzKTtcbiAgICAgICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnNvdXJjZXNMaXN0ID0gd2ViX3Jlc3VsdHM7XG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5kaXNwbGF5ZWRTb3VyY2VzID0gd2ViX3Jlc3VsdHM/LnNsaWNlKDAsIDMpOyAvLyBGaXJzdCAzIGNhcmRzXG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5yZW1haW5pbmdTb3VyY2VzID0gd2ViX3Jlc3VsdHM/LnNsaWNlKDMpOyAvLyBSZW1haW5pbmcgaXRlbXNcbiAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYW5zd2VyKSB7XG4gICAgICAgICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbnN3ZXI6JywgYW5zd2VyKTtcblxuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UubWVzc2FnZSA9IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KFxuICAgICAgICAgICAgICAgIGFuc3dlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdyYXBocyAmJiBBcnJheS5pc0FycmF5KGdyYXBocykpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dyYXBoczonLCBncmFwaHMpO1xuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UuZ3JhcGhzID0gZ3JhcGhzO1xuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleGVjdXRpb25fZ3JhcGhzICYmIEFycmF5LmlzQXJyYXkoZXhlY3V0aW9uX2dyYXBocykpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0V4ZWN1dGlvbiBHcmFwaHM6JywgZXhlY3V0aW9uX2dyYXBocyk7XG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5leGVjdXRpb25HcmFwaHMgPSBleGVjdXRpb25fZ3JhcGhzO1xuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdWdnZXN0aW9ucyAmJiBBcnJheS5pc0FycmF5KHN1Z2dlc3Rpb25zKSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3VnZ2VzdGlvbnM6Jywgc3VnZ2VzdGlvbnMpO1xuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UucmVsYXRlZExpc3RJdGVtcyA9IHN1Z2dlc3Rpb25zO1xuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIC8vIFByb2Nlc3Mgb25saW5lIHNlYXJjaCB0ZXJtcyBhcyBuZWVkZWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIGFueSBvdGhlciBmaWVsZHMgYW5kIHRoZWlyIHByb2Nlc3NpbmcgaGVyZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ090aGVyRmllbGRzIGlzIG1pc3NpbmcgaW4gdGhlIHJlc3BvbnNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5ldmVudFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGZldGNoaW5nIGRhdGEgZnJvbSBzb2NrZXQnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgaW5pdGlhbGl6ZVNvY2tldEFuZExpc3RlbigpIHsgfVxuICBoYW5kbGVFdmVudChkYXRhOiBhbnksIHR5cGU6IHN0cmluZykge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnd2VicmVzdWx0JzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbnN3ZXInOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dyYXBoJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZXZlbnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5zb2NrZXRTZXJ2aWNlLmRpc2Nvbm5lY3RTb2NrZXRDb25uZWN0aW9uKCk7XG4gICAgLy90aGlzLnNvY2tldFNlcnZpY2UuY2xvc2UoKTtcbiAgfVxuICBjaGFuZ2VUZW1wZXJhdHVyZShuZXdUZW1wZXJhdHVyZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xuICAgIHRoaXMudGVtcGVyYXR1cmUgPSBuZXdUZW1wZXJhdHVyZTtcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpdmVncHQtY2hhdC13cmFwcGVyJyk7XG4gICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHRoZW1lIGNsYXNzZXMgZnJvbSBib2R5XG4gICAgd3JhcHBlcj8uY2xhc3NMaXN0LnJlbW92ZSgnY3JlYXRpdmUnLCAnYmFsYW5jZWQnLCAncHJlY2lzZScpO1xuXG4gICAgc3dpdGNoIChuZXdUZW1wZXJhdHVyZSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB3cmFwcGVyPy5jbGFzc0xpc3QuYWRkKCdjcmVhdGl2ZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgd3JhcHBlcj8uY2xhc3NMaXN0LmFkZCgnYmFsYW5jZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHdyYXBwZXI/LmNsYXNzTGlzdC5hZGQoJ3ByZWNpc2UnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvblN0YXJ0QWdhaW4oKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xuICAgIHRoaXMuc2hvd1N0YXJ0QWdhaW4gPSBmYWxzZTtcbiAgICB0aGlzLmNoYXRMb2cgPSBbXTtcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICB0eXBlOiAnYWknLFxuICAgICAgbWVzc2FnZTogdGhpcy5ncmVldGluZ01zZyxcblxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgIH0pO1xuICAgIHRoaXMuYXJjaGlldmVNZXNzYWdlcygpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgYXJjaGlldmVNZXNzYWdlcygpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgICAnaGl2ZS1ib3QtaWQnOiB0aGlzLmJvdElkLFxuICAgICAgJ2RvbWFpbi1hdXRob3JpdHknOiB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYm90L2NsZWFyLWhpc3RvcnkvJHt0aGlzLmJvdElkfS8ke3RoaXMudXNlcklkfWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwgeyBoZWFkZXJzIH0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBvZihyZXMpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICB0cmlnZ2VyU3VwcG9ydCgpIHtcblxuICAgIHRoaXMub3BlblN1cHBvcnQuZW1pdCgpO1xuICB9XG4gIGZldGNoQm90Q29uZmlnKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgICAnaGl2ZS1ib3QtaWQnOiB0aGlzLmJvdElkLFxuICAgICAgJ2RvbWFpbi1hdXRob3JpdHknOiB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYm90cz9ib3RfaWQ9JHt0aGlzLmJvdElkfWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IGhlYWRlcnMgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5ib3ROYW1lID0gcmVzLk5hbWU7XG4gICAgICAgIHRoaXMuYm90SWNvbiA9IHJlcy5JY29uO1xuICAgICAgICB0aGlzLmJvdFNraWxscyA9IHJlcz8uU2tpbGxzO1xuICAgICAgICB0aGlzLmdyZWV0aW5nTXNnID0gcmVzLkdyZWV0aW5nO1xuXG4gICAgICAgIHRoaXMudGh1bWJzRG93bk1lc3NhZ2VzID0gcmVzPy5OZWdhdGl2ZVJlc3BvbnNlcz8ubGVuZ3RoXG4gICAgICAgICAgPyByZXMuTmVnYXRpdmVSZXNwb25zZXNcbiAgICAgICAgICA6IFtcbiAgICAgICAgICAgIGBXZSBhcmUgc29ycnkgd2UndmUgbm90IGJlZW4gYWJsZSB0byBhbnN3ZXIgeW91ciBxdWVzdGlvbi48YnIvPiBIb3dldmVyLCBvdXIgZGVkaWNhdGVkIHN1cHBvcnQgdGVhbSBpcyBoYXBweSB0byBoZWxwLiA8c3BhbiBjbGFzcz0nZmVlZGJhY2stbGluaycgc3R5bGU9J2N1cnNvcjogcG9pbnRlcjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAjMTcyMzVCOyc+PGEgc3R5bGU9J2NvbG9yOiBpbmhlcml0OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7JyBpZD0nc3VwcG9ydExpbms4OCcgPlBsZWFzZSBjbGljayBoZXJlPC9hPjwvc3Bhbj4gYW5kIGEgaHVtYW4gYWdlbnQgd2lsbCBhc3Npc3QgeW91IGFzIHNvb24gYXMgcG9zc2libGVgLFxuICAgICAgICAgIF07XG4gICAgICAgIHRoaXMucXVpY2tQcm9tcHRzID0gcmVzLlF1aWNrUHJvbXB0cztcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gb2YocmVzKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdGJvdCBjb25maWc6ICcsIGVycm9yKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoQ2hhdEhpc3RvcnkoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5jb252ZXJzYXRpb25LZXkgPSB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2V0S2V5KHRoaXMuYm90SWQsIGZhbHNlKTtcbiAgICB0aGlzLmNvblNlc3Npb25LZXkgPSB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2V0U2Vzc2lvbktleSh0aGlzLmJvdElkLCBmYWxzZSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vY29udmVyc2F0aW9ucy8ke3RoaXMuY29udmVyc2F0aW9uS2V5fT9zZXNzaW9uX2lkPSR7dGhpcy5jb25TZXNzaW9uS2V5fWA7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXG4gICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQodXJsLCB7IGhlYWRlcnMgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcjxhbnk+KCdmZXRjaENvbnZlcnNhdGlvbicpKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yPFQ+KG9wZXJhdGlvbiA9ICdvcGVyYXRpb24nLCByZXN1bHQ/OiBUKSB7XG4gICAgcmV0dXJuIChlcnJvcjogYW55KTogT2JzZXJ2YWJsZTxUPiA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gb2YocmVzdWx0IGFzIFQpO1xuICAgIH07XG4gIH1cbiAgLy8gZmV0Y2hDaGF0SGlzdG9yeSgpIHtcbiAgLy8gICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAvLyAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAvLyAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgLy8gICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgLy8gICB9KTtcbiAgLy8gICByZXR1cm4gdGhpcy5odHRwXG4gIC8vICAgICAuZ2V0KGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbktleX1gLCB7IGhlYWRlcnMgfSlcbiAgLy8gICAgIC5waXBlKFxuICAvLyAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIC8vICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gIC8vICAgICAgIH0pLFxuICAvLyAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XG4gIC8vICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5OiAnLCBlcnJvcik7XG4gIC8vICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIC8vICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAvLyAgICAgICB9KVxuICAvLyAgICAgKTtcbiAgLy8gfVxuXG4gIG1hcENoYXRIaXN0b3J5KGNoYXRzOiBhbnkpIHtcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICB0eXBlOiAnYWknLFxuICAgICAgbWVzc2FnZTogdGhpcy5ncmVldGluZ01zZyxcbiAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICB9KTtcbiAgICBpZiAoY2hhdHMgJiYgY2hhdHM/Lk1lc3NhZ2VzPy5sZW5ndGgpIHtcbiAgICAgIGNoYXRzPy5NZXNzYWdlcy5mb3JFYWNoKChjaGF0OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNoYXQuVHlwZSA9PSAndXNlcicpIHtcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAndXNlcicsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShjaGF0LlRleHQpLFxuICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXG4gICAgICAgICAgICBjb3BpZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZSxcbiAgICAgICAgICAgIFdvcmtmbG93RXhlY3V0aW9uSWQ6IGNoYXQuV29ya2Zsb3dFeGVjdXRpb25JZCxcbiAgICAgICAgICAgIF9pZDogY2hhdC5faWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdC5UeXBlID09ICdhaScpIHtcbiAgICAgICAgICB2YXIgc291cmNlc0xpc3QgPSBjaGF0LldlYkxpbmtzIHx8IFtdO1xuICAgICAgICAgIHZhciBkaXNwbGF5ZWRTb3VyY2VzID0gY2hhdC5XZWJMaW5rcy5zbGljZSgwLCAzKTsgLy8gRmlyc3QgMyBjYXJkc1xuICAgICAgICAgIHZhciByZW1haW5pbmdTb3VyY2VzID0gY2hhdC5XZWJMaW5rcy5zbGljZSgzKTsgLy8gUmVtYWluaW5nIGl0ZW1zXG5cbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYWknLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KSxcbiAgICAgICAgICAgIGV4ZWN1dGlvbkdyYXBoczogY2hhdC5FeGVjdXRpb25HcmFwaHMsXG4gICAgICAgICAgICBncmFwaHM6IGNoYXQuR3JhcGhzLFxuICAgICAgICAgICAgc2VhcmNoVGVybXM6IGNoYXQuU2VhcmNoVGVybXMsXG4gICAgICAgICAgICBzb3VyY2VzTGlzdDogc291cmNlc0xpc3QsXG4gICAgICAgICAgICBkaXNwbGF5ZWRTb3VyY2VzOiBkaXNwbGF5ZWRTb3VyY2VzLFxuICAgICAgICAgICAgcmVtYWluaW5nU291cmNlczogcmVtYWluaW5nU291cmNlcyxcbiAgICAgICAgICAgIHRpbWU6IGZvcm1hdFRpbWVTdGFtcHModGhpcy50aW1lem9uZSwgY2hhdC5JbnNlcnRUaW1lc3RhbXApLFxuICAgICAgICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgICAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2UsXG4gICAgICAgICAgICBfaWQ6IGNoYXQuX2lkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zaG93U3RhcnRBZ2FpbiA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb2Nlc3NNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgIShtZXNzYWdlPy5sZW5ndGggPiAwKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKCdoZXJlIGlzIG15IG1lc3NhZ2UnKVxuICAgIC8vIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UudHJpbSgpO1xuXG4gICAgY29uc3QgbWFya2Rvd25MaW5rUmVnZXggPSAvXFxbKFteW10rKV1cXCgoW14pXSspXFwpL2c7XG4gICAgY29uc3QgdXJsUmVnZXggPSAvKD88IWhyZWY9XCIpXFxiaHR0cHM/OlxcL1xcL1xcUysoPzwhWy4sXSkvZ2k7XG5cbiAgICBpZiAobWFya2Rvd25MaW5rUmVnZXgudGVzdChtZXNzYWdlKSkge1xuICAgICAgY29uc3QgaHRtbCA9IG1lc3NhZ2UucmVwbGFjZShcbiAgICAgICAgbWFya2Rvd25MaW5rUmVnZXgsXG4gICAgICAgICc8YSBocmVmPVwiJDJcIiB0YXJnZXQ9XCJfYmxhbmtcIj4kMTwvYT4nXG4gICAgICApO1xuICAgICAgLy9jb25zb2xlLmxvZygnU2FuaXRpemVkIG1lc3NhZ2U6ICcsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVIdG1sKGh0bWwpO1xuICAgIH1cblxuICAgIGlmICh1cmxSZWdleC50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICBjb25zdCBodG1sID0gbWVzc2FnZS5yZXBsYWNlKFxuICAgICAgICB1cmxSZWdleCxcbiAgICAgICAgJzxhIGhyZWY9XCIkJlwiIHRhcmdldD1cIl9ibGFua1wiPiQmPC9hPidcbiAgICAgICk7XG4gICAgICAvLyBjb25zb2xlLmxvZygnU2FuaXRpemVkIG1lc3NhZ2U6ICcsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVIdG1sKGh0bWwpO1xuICAgIH1cblxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoLyg/OlxcclxcbnxcXHJ8XFxuKS9nLCAnPGJyPicpO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXFwqXFwqKC4qPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKTtcbiAgICAvLyBDb252ZXJ0IE1hcmtkb3duIGhlYWRlcnMgdG8gSFRNTCBoZWFkZXJzXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXigjezEsNn0pXFxzKyguKikkL2dtLCAobWF0Y2gsIGhhc2hlcywgdGV4dCkgPT4ge1xuICAgICAgY29uc3QgbGV2ZWwgPSBoYXNoZXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIGA8aCR7bGV2ZWx9PiR7dGV4dH08L2gke2xldmVsfT5gO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgY29uc3Qgc2FuaXRpemVkTWVzc2FnZSA9IHRoaXMuc2FuaXRpemVIdG1sKG1lc3NhZ2UpO1xuICAgIHJldHVybiBzYW5pdGl6ZWRNZXNzYWdlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIGNvbnN0IGZlZWRiYWNrTGlua3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgJy5mZWVkYmFjay1saW5rJ1xuICAgICk7XG4gICAgZmVlZGJhY2tMaW5rcy5mb3JFYWNoKChsaW5rOiBhbnkpID0+IHtcbiAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2NsaWNrJyxcbiAgICAgICAgdGhpcy5vbkZlZWRiYWNrQ2xpY2suYmluZCh0aGlzLCAnemVuZGVzaycpXG4gICAgICApO1xuICAgIH0pO1xuICAgIC8vIGlmICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZmVlZGJhY2stbGluaycpKSB7XG4gICAgLy8gICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxuICAgIC8vICAgICAucXVlcnlTZWxlY3RvcignLmZlZWRiYWNrLWxpbmsnKVxuICAgIC8vICAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uRmVlZGJhY2tDbGljay5iaW5kKHRoaXMsICd6ZW5kZXNrJykpO1xuICAgIC8vIH1cbiAgfVxuXG4gIHNhbml0aXplSHRtbChodG1sOiBzdHJpbmcpOiBTYWZlSHRtbCB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWwpO1xuICB9XG5cbiAgb25GZWVkYmFja0NsaWNrKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZlZWRiYWNrRXZlbnQuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkNsb3NlKCkge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgdGhpcy5ib2R5T3ZlcmZsb3dDbGFzcyk7XG4gICAgdGhpcy5vbkNsb3NlRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgc2VuZE1lc3NhZ2VXaXRoVGlsZShwcm9tcHQ6IHN0cmluZykge1xuICAgIHRoaXMuaW5wdXQgPSBwcm9tcHQ7XG4gICAgdGhpcy5mZXRjaERhdGEoKTtcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gIH1cbiAgaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gIGZldGNoRGF0YShtc2cgPSBudWxsKSB7XG4gICAgdGhpcy5pbnB1dCA9IG1zZyB8fCB0aGlzLmlucHV0Py50cmltKCk7XG4gICAgdGhpcy5tc2cgPSB0aGlzLmlucHV0O1xuICAgIGlmICghdGhpcy5pbnB1dCB8fCB0aGlzLmxvYWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICB0eXBlOiAndXNlcicsXG4gICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheSh0aGlzLmlucHV0KSxcbiAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgIGNvcGllZDogZmFsc2UsXG4gICAgICBpc0NvbGxhcHNlZFRydWU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5teUlucHV0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnaGlkZGVuJzsgLy8gUmVzZXQgdGhlIGhlaWdodFxuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gYDYycHhgO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRoaXMuYWlSZXNwb25zZSA9ICcnO1xuICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gdHJ1ZTtcblxuICAgIHRoaXMubWFrZUFza1JlcXVlc3QodGhpcy5pbnB1dCwgdGhpcy5hZ2VudHMsIHRoaXMuY29udmVyc2F0aW9uS2V5KTtcbiAgfVxuICBmZXRjaERhdGFGb3IobXNnLCBjaGF0KSB7XG4gICAgY29uc3QgaW5wdXRNc2cgPSBtc2c/LnRyaW0oKTtcbiAgICBpZiAoIWlucHV0TXNnIHx8IHRoaXMubG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY2hhdC5yZWxhdGVkTGlzdEl0ZW1zID0gW107XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxuXG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgIHR5cGU6ICd1c2VyJyxcbiAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGlucHV0TXNnKSxcbiAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgIGNvcGllZDogZmFsc2UsXG4gICAgICBpc0NvbGxhcHNlZFRydWU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0aGlzLmFpUmVzcG9uc2UgPSAnJztcbiAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IHRydWU7XG5cbiAgICB0aGlzLm1ha2VBc2tSZXF1ZXN0KGlucHV0TXNnLCB0aGlzLmFnZW50cywgdGhpcy5jb252ZXJzYXRpb25LZXksIG1zZywgY2hhdCk7XG4gIH1cbiAgZmV0Y2hTbWFsbFRhbGsoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2JvdC9zbWFsbC10YWxrLyR7dGhpcy5ib3RJZH0vJHt0aGlzLnVzZXJJZH1gO1xuXG4gICAgdGhpcy5odHRwXG4gICAgICAuZ2V0PHsgc21hbGxUYWxrOiBzdHJpbmcgfT4odXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgICAgICAgJ2hpdmUtYm90LWlkJzogdGhpcy5ib3RJZCxcbiAgICAgICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWVcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGlsZSBmZXRjaGluZyBzbWFsbCB0YWxrOicsIGVycm9yKTtcblxuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnNtYWxsVGFsaykge1xuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlKHJlc3BvbnNlLnNtYWxsVGFsayksXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgICAgICBpc0ZlZWRiYWNrTXNnOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAyO1xuICAgICAgICAgIC8vIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICByZWFkQWxsQ2h1bmtzID0gKHN0cmVhbTogYW55KSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgIGNvbnN0IGFsbFN1Z2dlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcmVhZGVyLmNsb3NlZC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVhZGluZyBzdHJlYW06ICcsIGVycik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgIHN0YXJ0OiAoY29udHJvbGxlcikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wdW1wKGNvbnRyb2xsZXIsIHJlYWRlciwgYWxsU3VnZ2VzdGlvbnMpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcblxuICBwdW1wKGNvbnRyb2xsZXI6IGFueSwgcmVhZGVyOiBhbnksIGFsbFN1Z2dlc3Rpb25zOiBzdHJpbmdbXSkge1xuICAgIHJlYWRlci5yZWFkKCkudGhlbigoeyBkb25lLCB2YWx1ZSB9OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGxhc3RJdGVtID0gdGhpcy5jaGF0TG9nW3RoaXMuY2hhdExvZy5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgbGFzdEl0ZW0ubWVzc2FnZSA9IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGxhc3RJdGVtLm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmNoYXRMb2cucG9wKCk7XG4gICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKGxhc3RJdGVtKTtcbiAgICAgICAgaWYgKGFsbFN1Z2dlc3Rpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnc3VnZ2VzdGlvbnMnLFxuICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGFsbFN1Z2dlc3Rpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgICAvLyB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLnNob3dTdGFydEFnYWluID0gdHJ1ZTtcblxuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gICB0aGlzLmZldGNoU21hbGxUYWxrKCk7XG4gICAgICAgIC8vIH0sMTAwMClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGVjb2RlZENodW5rID0gdGhpcy5kZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7XG4gICAgICB0aGlzLmFpUmVzcG9uc2UgKz0gZGVjb2RlZENodW5rO1xuICAgICAgaWYgKGxhc3RJdGVtLnR5cGUgPT09ICdhaScpIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnNNYXRjaCA9IHRoaXMuYWlSZXNwb25zZS5tYXRjaCgvPHN1Zz4oLio/KTxcXC9zdWc+L2cpO1xuICAgICAgICBpZiAoc3VnZ2VzdGlvbnNNYXRjaCkge1xuICAgICAgICAgIHN1Z2dlc3Rpb25zTWF0Y2guZm9yRWFjaCgobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWlSZXNwb25zZSA9IHRoaXMuYWlSZXNwb25zZS5yZXBsYWNlKG1hdGNoLCAnJyk7XG4gICAgICAgICAgICBhbGxTdWdnZXN0aW9ucy5wdXNoKG1hdGNoPy5yZXBsYWNlKC88XFwvP3N1Zz4vZywgJycpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RJdGVtLm1lc3NhZ2UgPSB0aGlzLmFpUmVzcG9uc2U7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcblxuICAgICAgICBsZXQgYWlGb3JtYXR0ZWREYXRhOiBhbnk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygncGFyc2luZyBqc29uICcpO1xuICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5wYXJzZSh0aGlzLmFpUmVzcG9uc2UpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygncGFyc2luZyBqc29uIDInKTtcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YSA9IEpTT04ucGFyc2UodGhpcy5haVJlc3BvbnNlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdwYXJzaW5nIGpzb24gZG9uZScpO1xuXG4gICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEgJiYgYWlGb3JtYXR0ZWREYXRhPy5zZWN0aW9uX2lkPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gJ2NvbXBhbnlfc2VhcmNoJyB8fFxuICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gJ3VzZXJfc2VhcmNoJyB8fFxuICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gJ2luZHVzdHJ5X2NvbXBhbnlfc2VhcmNoJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaE15Q29ubmVjdGlvbnMoKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hQZW5kaW5nUmVxdWVzdHMoKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gdGhpcy5teVVwY29taW5nU2Vzc2lvbkFjdGlvbikge1xuICAgICAgICAgICAgdmFyIHNwZWFrZXJJZHMgPSBbXTtcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5jb250ZW50Py5mb3JFYWNoKChzZXNzaW9uKSA9PiB7XG4gICAgICAgICAgICAgIHNwZWFrZXJJZHMgPSBbLi4uc3BlYWtlcklkcywgLi4uc2Vzc2lvbi5zcGVha2Vyc107XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHNwZWFrZXJJZHM/Lmxlbmd0aCA+IDApIHRoaXMuZ2V0U3BlYWtlcnNCeVN0YWZmSWRzKHNwZWFrZXJJZHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09IHRoaXMuYWRkVG9NeUFnZW5kYUFjdGlvbiAmJlxuICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQ/Lmxlbmd0aCA+IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMub3BlblBhZ2UubmV4dCh7XG4gICAgICAgICAgICAgIHNlY3Rpb25JZDogYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQsXG4gICAgICAgICAgICAgIHNlc3Npb25JZHM6IGFpRm9ybWF0dGVkRGF0YS5jb250ZW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09IHRoaXMuY29ubmVjdE9yRm9sbG93QWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdXNlcnNMZW4gPSBhaUZvcm1hdHRlZERhdGEuY29udGVudD8ubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHVzZXJzTGVuID4gMSkge1xuICAgICAgICAgICAgICB0aGlzLm9wZW5QYWdlLm5leHQoe1xuICAgICAgICAgICAgICAgIHNlY3Rpb25JZDogJ29wZW5fbmV0d29ya2luZ19kcmF3ZXInLFxuICAgICAgICAgICAgICAgIHNlYXJjaDogYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh1c2Vyc0xlbiA9PSAxKSB7XG4gICAgICAgICAgICAgIHRoaXMub3BlblBhZ2UubmV4dCh7XG4gICAgICAgICAgICAgICAgc2VjdGlvbklkOiBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCxcbiAgICAgICAgICAgICAgICBjb25uZXRVc2VySWRzOiBbYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnRbMF0udXNlcklkXSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YS5pc19vcGVuX3BhZ2UgPT0gJ3RydWUnKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5QYWdlLm5leHQoe1xuICAgICAgICAgICAgICBzZWN0aW9uSWQ6IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkLFxuICAgICAgICAgICAgICBzZWFyY2g6IGFpRm9ybWF0dGVkRGF0YS5jb250ZW50LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlQnJvd3NlcigpKSB7XG4gICAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5tZXNzYWdlICs9XG4gICAgICAgICAgICAgICAgJ1xcblxcbicgKyAnPGEgaWQ9XCJjbG9zZUJvdE5vd1wiPkNsaWNrIEhlcmU8L2E+IHRvIHNlZSByZXN1bHRzLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGFpRm9ybWF0dGVkRGF0YS5tZXNzYWdlLFxuICAgICAgICAgICAgYWN0aW9uOiBhaUZvcm1hdHRlZERhdGEsXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZUJyb3dzZXIoKSkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkQ2xvc2VCb3RDbGlja0V2ZW50KCk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuYWlSZXNwb25zZSA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmFpUmVzcG9uc2UsXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcblxuICAgICAgLy8gRW5xdWV1ZSB0aGUgbmV4dCBkYXRhIGNodW5rIGludG8gb3VyIHRhcmdldCBzdHJlYW1cbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh2YWx1ZSk7XG4gICAgICB0aGlzLnB1bXAoY29udHJvbGxlciwgcmVhZGVyLCBhbGxTdWdnZXN0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICBzdWJtaXRGZWVkYmFjayhmbGFnOiBib29sZWFuLCBtZXNzYWdlKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG5cbiAgICB0aGlzLmZlZWRiYWNrRG9uZSA9IHRydWU7XG4gICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gbnVsbDtcbiAgICBjb25zdCBjb252ZXJzYXRpb25faWQgPSB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2V0S2V5KHRoaXMuYm90SWQpO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQUdFTlRTX0FQSX0vQ29udmVyc2F0aW9uL2NvUGlsb3QvJHt0aGlzLmJvdElkfS9jb252ZXJzYXRpb24vJHtjb252ZXJzYXRpb25faWR9L2hlbHBmdWwtcmVzcG9uc2VgO1xuICAgIGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdhcGlLZXknOiAnQ29udmVyc2F0aW9uX1dJei9xQW0rRUVtZk9rRmFVQS93ZUE9PScsXG4gICAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXG4gICAgICAgICdkb21haW4tYXV0aG9yaXR5JzogdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZVxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZUlkOiBtZXNzYWdlLl9pZCwgaXNIZWxwZnVsOiBmbGFnIH0pLFxuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKGZsYWcpIHtcbiAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgIHRoaXMudGh1bWJzVXBNZXNzYWdlIHx8XG4gICAgICAgICAgICBgR3JlYXQuIE1heSBJIGFzc2lzdCB5b3Ugd2l0aCBhbnl0aGluZyBlbHNlP2AsXG4gICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgICAgIGlzRmVlZGJhY2tNc2c6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuZmVlZGJhY2tEb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICB0eXBlOiAnYWknLFxuICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlKFxuICAgICAgICAgIHRoaXMudGh1bWJzRG93bk1lc3NhZ2VzW3RoaXMudGh1bWJzRG93bk1zZ0luZGV4XVxuICAgICAgICApLFxuICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgIGlzRmVlZGJhY2tNc2c6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMudGh1bWJzRG93bk1zZ0luZGV4ID1cbiAgICAgICAgKHRoaXMudGh1bWJzRG93bk1zZ0luZGV4ICsgMSkgJSB0aGlzLnRodW1ic0Rvd25NZXNzYWdlcy5sZW5ndGg7XG4gICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdXBwb3J0TGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdXBwb3J0TGluazg4Jyk7XG4gICAgICAgIGlmIChzdXBwb3J0TGluaykge1xuICAgICAgICAgIHN1cHBvcnRMaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy50cmlnZ2VyU3VwcG9ydC5iaW5kKHRoaXMpKTtcblxuICAgICAgICB9XG4gICAgICB9LCAyMDApO1xuICAgICAgdGhpcy5mZWVkYmFja0RvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IG51bGw7XG4gICAgfSk7XG4gIH1cbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAvLyBQcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgKG5ldyBsaW5lKVxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIENhbGwgeW91ciBzdWJtaXQgZnVuY3Rpb25cbiAgICAgIHRoaXMuaGFuZGxlU3VibWl0KGV2ZW50KTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlU3VibWl0KGV2ZW50KSB7XG4gICAgdGhpcy5mZXRjaERhdGEoKTtcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG5cbiAgfVxuXG4gIGhhbmRsZVVwQ2xpY2soaWR4OiBhbnkpIHtcbiAgICBpZiAodGhpcy5mZWVkYmFja0RvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN1Ym1pdEZlZWRiYWNrKHRydWUsIHRoaXMuY2hhdExvZ1tpZHhdKTtcbiAgICB0aGlzLmNoYXRMb2dbaWR4XS5saWtlZCA9ICF0aGlzLmNoYXRMb2dbaWR4XS5saWtlZDtcblxuICAgIGlmICh0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkKSB7XG4gICAgICB0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkID0gIXRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBoYW5kbGVEb3duQ2xpY2soaWR4OiBhbnkpIHtcbiAgICBpZiAodGhpcy5mZWVkYmFja0RvbmUpIHJldHVybjtcbiAgICB0aGlzLnN1Ym1pdEZlZWRiYWNrKGZhbHNlLCB0aGlzLmNoYXRMb2dbaWR4XSk7XG4gICAgdGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZCA9ICF0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkO1xuICAgIGlmICh0aGlzLmNoYXRMb2dbaWR4XS5saWtlZClcbiAgICAgIHRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkID0gIXRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkO1xuICB9XG4gIC8vIGhhbmRsZUNvcHlDbGljayhpbmRleDogYW55KSB7XG4gIC8vICAgLy8gQ29weSB0aGUgbWVzc2FnZSB0byB0aGUgY2xpcGJvYXJkXG4gIC8vICAgY29uc3QgY29udGVudFRvQ29weSA9IHRoaXMuY2hhdExvZ1tpbmRleF0ubWVzc2FnZTtcbiAgLy8gICBjb25zb2xlLmxvZygnY29udGVudFRvQ29weScpO1xuICAvLyAgIGNvbnNvbGUubG9nKGNvbnRlbnRUb0NvcHkpO1xuICAvLyAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbnRlbnRUb0NvcHkpLnRoZW4oKCkgPT4ge1xuICAvLyAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgbWVzc2FnZSB3YXMgY29waWVkXG4gIC8vICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IHRydWU7XG4gIC8vICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIC8vICAgICAvLyBSZXNldCB0aGUgY29waWVkIHN0YXRlIGFmdGVyIGEgZGVsYXlcbiAgLy8gICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAvLyAgICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IGZhbHNlO1xuICAvLyAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIC8vICAgICB9LCAyMDAwKTsgLy8gUmVzZXQgYWZ0ZXIgMiBzZWNvbmRzXG4gIC8vICAgfSk7XG4gIC8vIH1cbiAgY29weVRleHQoaWQsIGluZGV4KSB7XG4gICAgLy8gR2V0IHRoZSB0ZXh0IGVsZW1lbnRcbiAgICB2YXIgdGV4dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cbiAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgdGV4dGFyZWEgZWxlbWVudCB0byBjb3B5IHRoZSB0ZXh0XG4gICAgdmFyIHRlbXBUZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdGVtcFRleHRBcmVhLnZhbHVlID0gdGV4dEVsZW1lbnQuaW5uZXJUZXh0O1xuXG4gICAgLy8gQXBwZW5kIHRoZSB0ZXh0YXJlYSB0byB0aGUgYm9keSAobmVjZXNzYXJ5IGZvciB0aGUgZXhlY0NvbW1hbmQgdG8gd29yaylcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBUZXh0QXJlYSk7XG5cbiAgICAvLyBTZWxlY3QgdGhlIHRleHQgaW5zaWRlIHRoZSB0ZXh0YXJlYVxuICAgIHRlbXBUZXh0QXJlYS5zZWxlY3QoKTtcblxuICAgIC8vIENvcHkgdGhlIHRleHQgdG8gdGhlIGNsaXBib2FyZFxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHRlbXBvcmFyeSB0ZXh0YXJlYVxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVtcFRleHRBcmVhKTtcblxuICAgIC8vIE9wdGlvbmFsbHksIHlvdSBjYW4gYWxlcnQgdGhlIHVzZXIgb3IgY2hhbmdlIHRoZSBidXR0b24gdGV4dCB0byBpbmRpY2F0ZSB0aGUgY29weSB3YXMgc3VjY2Vzc2Z1bFxuICAgIC8vIGFsZXJ0KCdUZXh0IGNvcGllZCB0byBjbGlwYm9hcmQhJyk7XG5cbiAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IHRydWU7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIC8vIFJlc2V0IHRoZSBjb3BpZWQgc3RhdGUgYWZ0ZXIgYSBkZWxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5jb3BpZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LCAyMDAwKTsgLy8gUmVzZXQgYWZ0ZXIgMiBzZWNvbmRzXG4gIH1cbiAgaGFuZGxlQ29weUNsaWNrKGluZGV4OiBhbnkpIHtcbiAgICAvLyBDb3B5IHRoZSBtZXNzYWdlIHRvIHRoZSBjbGlwYm9hcmRcbiAgICBjb25zdCBjb250ZW50VG9Db3B5ID0gdGhpcy5jaGF0TG9nW2luZGV4XS5tZXNzYWdlO1xuICAgIGNvbnN0IHJlc3V0bHQgPSB0aGlzLmNvcHlUZXh0KCdtZXNzYWdlVGV4dF8nICsgaW5kZXgsIGluZGV4KTtcbiAgfVxuXG4gIHNhbml0aXplSFRNTChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGRvY3VtZW50IGZyYWdtZW50IHRvIGhvbGQgdGhlIHNpbXBsaWZpZWQgY29udGVudFxuICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgLy8gQXBwZW5kIHRoZSBjaGlsZHJlbiBvZiB0aGUgYm9keSBvZiB0aGUgcGFyc2VkIGRvY3VtZW50IHRvIHRoZSBmcmFnbWVudFxuICAgIEFycmF5LmZyb20oZG9jLmJvZHkuY2hpbGROb2RlcykuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZS5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGRpdiBlbGVtZW50IHRvIGhvbGQgdGhlIHNpbXBsaWZpZWQgSFRNTFxuICAgIGNvbnN0IHNpbXBsaWZpZWREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzaW1wbGlmaWVkRGl2LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcblxuICAgIC8vIFJlbW92ZSBjb21wbGV4IHRhZ3Mgb3IgYXR0cmlidXRlcyBhcyBuZWVkZWRcbiAgICAvLyBFeGFtcGxlOiByZW1vdmUgc2NyaXB0c1xuICAgIHNpbXBsaWZpZWREaXZcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKVxuICAgICAgLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKTtcblxuICAgIC8vIFJldHVybiB0aGUgc2ltcGxpZmllZCBIVE1MIGFzIGEgc3RyaW5nXG4gICAgcmV0dXJuIHNpbXBsaWZpZWREaXYuaW5uZXJIVE1MO1xuICB9XG5cbiAgY3VycmVudE1lc3NhZ2VGb3JFZGl0b3I6IGFueSA9ICcnO1xuICBjdXJyZW50SW5kZXhGb3JFZGl0b3I6IGFueSA9IC0xO1xuICBoYW5kbGVFZGl0b3JDbGljayhpbmRleDogYW55KSB7XG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4Rm9yRWRpdG9yID09IC0xKSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleEZvckVkaXRvciA9IGluZGV4O1xuICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvciA9IHRoaXMuc2FuaXRpemVIVE1MKFxuICAgICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLm1lc3NhZ2VcbiAgICAgICk7XG4gICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yID0gdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvci5yZXBsYWNlKFxuICAgICAgICAnU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzonLFxuICAgICAgICAnJ1xuICAgICAgKTtcblxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50SW5kZXhGb3JFZGl0b3IgPT0gaW5kZXgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvciArPSB0aGlzLnNhbml0aXplSFRNTChcbiAgICAgICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLm1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvciA9IHRoaXMuY3VycmVudE1lc3NhZ2VGb3JFZGl0b3IucmVwbGFjZShcbiAgICAgICAgICAnU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzonLFxuICAgICAgICAgICcnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4Rm9yRWRpdG9yID0gaW5kZXg7XG4gICAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2VGb3JFZGl0b3IgPSB0aGlzLnNhbml0aXplSFRNTChcbiAgICAgICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLm1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvciA9IHRoaXMuY3VycmVudE1lc3NhZ2VGb3JFZGl0b3IucmVwbGFjZShcbiAgICAgICAgICAnU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzonLFxuICAgICAgICAgICcnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaGF0TG9nW2luZGV4XS5pc0VkaXRvciA9IHRydWU7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIC8vIFJlc2V0IHRoZSBjb3BpZWQgc3RhdGUgYWZ0ZXIgYSBkZWxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5pc0VkaXRvciA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0sIDIwMDApOyAvLyBSZXNldCBhZnRlciAyIHNlY29uZHNcbiAgICB0aGlzLmVkaXRvcnNEcmF3ZXIub3BlbigpO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gIHNjcm9sbFRvQm90dG9tKCkge1xuICAgIGxldCBjb3VudGVyID0gMDtcbiAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuY2hhdE1haW4ubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLmNoYXRNYWluLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgaWYgKGNvdW50ZXIrKyA+IDUpIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIH0sIDUpO1xuICB9XG5cbiAgaGFuZGxlQWN0aW9uKGFjdGlvbjogYW55KSB7XG4gICAgY29uc29sZS5pbmZvKCdpbmNvbWluZyBhY3Rpb24gZnJvbSB0aGUgY2hhdGJvdCBBSScpO1xuICAgIGNvbnNvbGUuaW5mbyhhY3Rpb24pO1xuXG4gICAgaWYgKGFjdGlvbj8uY29udGVudCkge1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZHJhd2VyIGlzIGluaXRpYWxseSBvcGVuIGFuZCBhcHBseSBvdmVyZmxvdyBoaWRkZW4gdG8gYm9keSBpZiBzb1xuICAgIGlmICh0aGlzLmRyYXdlci5vcGVuZWQpIHtcbiAgICAgIHRoaXMuc2V0Qm9keU92ZXJmbG93KCk7XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIHRvIGNoYW5nZXMgaW4gdGhlIGRyYXdlciBiZWluZyBvcGVuZWQgb3IgY2xvc2VkXG4gICAgdGhpcy5kcmF3ZXIub3BlbmVkQ2hhbmdlLnN1YnNjcmliZSgob3BlbmVkOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAob3BlbmVkKSB7XG4gICAgICAgIHRoaXMuc2V0Qm9keU92ZXJmbG93KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUJvZHlPdmVyZmxvdygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5kcmF3ZXIub3BlbmVkQ2hhbmdlLnN1YnNjcmliZSgob3BlbmVkKSA9PiB7XG4gICAgICBpZiAob3BlbmVkKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm15VGV4dGFyZWEgJiYgdGhpcy5teVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMubXlUZXh0YXJlYS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7IC8vIEZvY3VzIG9uIHRoZSB0ZXh0YXJlYVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cblxuXG4gIH1cblxuICBwcml2YXRlIHNldEJvZHlPdmVyZmxvdygpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVCb2R5T3ZlcmZsb3coKSB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCB0aGlzLmJvZHlPdmVyZmxvd0NsYXNzKTtcbiAgfVxuXG4gIGdldFNwZWFrZXJzQnlTdGFmZklkcyhpZHMpIHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LlVTRVJTX0FQSX0vZXZlbnRzLyR7dGhpcy5ldmVudElkfS91c2Vycy9nZXQtYnktc3RhZmYtaWRzYDtcbiAgICBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICBBdXRob3JpemF0aW9uOiAnQmVhcmVyICcgKyAneW91cl90b2tlbl9oZXJlJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpLFxuICAgIH0pXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTsgLy8gUGFyc2UgdGhlIEpTT04gYm9keSBvZiB0aGUgcmVzcG9uc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvay4nKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChkYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZGF0YS5mb3JFYWNoKChzcGVha2VyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNwZWFrZXJzW3NwZWFrZXIuaWRdID0gc3BlYWtlcjtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgZGF0YTonLCBlcnIpO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcGVyZm9ybVNlc3Npb25BY3Rpb24oc2Vzc2lvbklkLCBhY3Rpb24pIHtcbiAgICB0aGlzLnNlc3Npb25BY3Rpb25zLm5leHQoe1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgYWN0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgYWRkQ2xvc2VCb3RDbGlja0V2ZW50KCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY2xvc2VCb3ROb3cnKTtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlQm90Lm5leHQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzTW9iaWxlQnJvd3NlcigpIHtcbiAgICByZXR1cm4gL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KFxuICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudFxuICAgICk7XG4gIH1cblxuICBjb25uZWN0VG9Vc2VyKHVzZXJJZCkge1xuICAgIHRoaXMuY29ubmVjdFdpdGhVc2VyLmVtaXQoe1xuICAgICAgY29ubmVjdDogIXRoaXMuY2FuRGlzY29ubmVjdCh1c2VySWQpLFxuICAgICAgdXNlcklkLFxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZldGNoTXlDb25uZWN0aW9ucygpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZldGNoUGVuZGluZ1JlcXVlc3RzKCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgc2NoZWR1bGVNZWV0aW5nV2l0aFVzZXIodXNlcikge1xuICAgIHRoaXMuc2NoZWR1bGVNZWV0aW5nLmVtaXQodXNlcik7XG4gIH1cblxuICBjYW5Db25uZWN0KHVzZXJJZCkge1xuICAgIHJldHVybiAhKFxuICAgICAgdGhpcy5jYW5EaXNjb25uZWN0KHVzZXJJZCkgfHxcbiAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmZpbmQoKGEpID0+IGEgPT0gdXNlcklkKVxuICAgICk7XG4gIH1cblxuICBjYW5EaXNjb25uZWN0KHVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLm15Q29ubmVjdGlvbnMuZmluZCgoY29ubikgPT4gY29ubi51c2VySWQgPT0gdXNlcklkKTtcbiAgfVxuXG4gIGZldGNoUGVuZGluZ1JlcXVlc3RzKCkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIGFwaUtleTogdGhpcy5hdXRvZ2VuS2V5LFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQoXG4gICAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuVVNFUlNfQVBJfS9ldmVudHMvJHt0aGlzLmV2ZW50SWR9L2Nvbm5lY3Rpb24tcmVxdWVzdHMvYXV0b2dlbi9wZW5kaW5nLXNlbnQtcmVxdWVzdHM/dXNlcklkPSR7dGhpcy51c2VySWR9YCxcbiAgICAgICAgeyBoZWFkZXJzIH1cbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSByZXM7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcGVuZGluZyByZXF1ZXN0czogJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBmZXRjaE15Q29ubmVjdGlvbnMoKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgYXBpS2V5OiB0aGlzLmF1dG9nZW5LZXksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldChcbiAgICAgICAgYCR7dGhpcy5lbnZpcm9ubWVudC5VU0VSU19BUEl9L2V2ZW50cy8ke3RoaXMuZXZlbnRJZH0vdXNlcnMtY29ubmVjdGlvbnMvYXV0b2dlbj91c2VySWQ9JHt0aGlzLnVzZXJJZH1gLFxuICAgICAgICB7IGhlYWRlcnMgfVxuICAgICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLm15Q29ubmVjdGlvbnMgPSByZXM7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcGVuZGluZyByZXF1ZXN0czogJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBpc0Ryb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBhZ2VudHM6IGFueTtcbiAgc2VsZWN0ZWRBZ2VudHMgPSBbXTtcbiAgYWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgLy8gVG9nZ2xlIHRoZSBkcm9wZG93biB2aXNpYmlsaXR5XG4gIHRvZ2dsZURyb3Bkb3duKCkge1xuICAgIGlmICghdGhpcy5hZ2VudHMpXG4gICAgICB0aGlzLmZldGNoQWdlbnRzKCk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzRHJvcGRvd25PcGVuO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG9uU2VsZWN0QWxsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYWdlbnRzPy5mb3JFYWNoKChhZ2VudCkgPT4gKGFnZW50LnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvbkFnZW50Q2hhbmdlKGFnZW50OiBhbnkpOiB2b2lkIHtcbiAgICAvL2FnZW50LnNlbGVjdGVkID0gIWFnZW50LnNlbGVjdGVkO1xuICAgIC8vY29uc29sZS5sb2coYWdlbnQpO1xuICAgIGxldCBhZ2VudEZvdW5kID0gdGhpcy5hZ2VudHMuZmlsdGVyKChwKSA9PiBwLmlkID09IGFnZW50LmlkKTtcbiAgICBpZiAoYWdlbnRGb3VuZCAmJiBhZ2VudEZvdW5kLmxlbmd0aCA+IDApIHtcbiAgICAgIGFnZW50Rm91bmRbMF0uc2VsZWN0ZWQgPSAhYWdlbnRGb3VuZFswXS5zZWxlY3RlZDtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgYXJlQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWdlbnRzPy5ldmVyeSgoYWdlbnQpID0+ICFhZ2VudC5zZWxlY3RlZCk7XG4gIH1cblxuICBnZXREcm9wZG93bkhlYWRlclRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWxlY3RlZEFnZW50cyA9IHRoaXMuYWdlbnRzPy5maWx0ZXIoKGFnZW50KSA9PiBhZ2VudC5zZWxlY3RlZCk7XG4gICAgaWYgKCFzZWxlY3RlZEFnZW50cykge1xuICAgICAgcmV0dXJuICdBbGwgQWdlbnRzJztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNlbGVjdGVkQWdlbnRzICYmIHNlbGVjdGVkQWdlbnRzPy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICdBbGwgQWdlbnRzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZEFnZW50cz8ubGVuZ3RoID4gMVxuICAgICAgICAgID8gYCR7c2VsZWN0ZWRBZ2VudHM/Lmxlbmd0aH0gQWdlbnRzIFNlbGVjdGVkYFxuICAgICAgICAgIDogYCR7c2VsZWN0ZWRBZ2VudHM/Lmxlbmd0aH0gQWdlbnQgU2VsZWN0ZWRgO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmZXRjaEFnZW50c19odHRwKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5BR0VOVFNfQVBJfS9Db1BpbG90LyR7dGhpcy5ib3RJZH0vYWN0aXZlLWFnZW50c2A7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwge30sIHsgaGVhZGVycyB9KS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgdGhpcy5hZ2VudHMgPSByZXMubWFwKChhZ2VudCkgPT4gKHtcbiAgICAgICAgICAgIC4uLmFnZW50LFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICByZXR1cm4gb2YocmVzKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdGJvdCBjb25maWc6ICcsIGVycm9yKTtcblxuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgaXNEb2NJbkVkaXRNb2RlID0gZmFsc2U7XG4gIGRvY3VtZW50Q29udGVudDogYW55O1xuXG4gIGNvbnZlcnNhdGlvbklkOiBhbnk7XG4gIGlzQ29udGVudExvYWRlZCA9IGZhbHNlO1xuXG4gIGZldGNoQ29udGVudF9odHRwKCkge1xuICAgIHRoaXMuaXNEb2NJbkVkaXRNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5pc0NvbnRlbnRMb2FkZWQgPSBmYWxzZTtcbiAgICBjb25zb2xlLmxvZygnQVBJIGNhbGwgZnVuY3Rpb24nKTtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IGNvbnZlcnNhdGlvbl9pZCA9IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZXRLZXkodGhpcy5ib3RJZCk7XG4gICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbl9pZDtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkFHRU5UU19BUEl9L0NvbnZlcnNhdGlvbkRvY3VtZW50cz9jb252ZXJzYXRpb25JZD0ke2NvbnZlcnNhdGlvbl9pZH0mYm90SWQ9JHt0aGlzLmJvdElkfWA7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgYXBpS2V5OiAnV0l6L3FBbStFRW1mT2tGYVVBL3dlQT09JyxcbiAgICAgICdkb21haW4tYXV0aG9yaXR5JzogdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IGhlYWRlcnMgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIHRoaXMuaXNEb2NJbkVkaXRNb2RlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmRvY3VtZW50Q29udGVudCA9IHJlcztcbiAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IEFQSSBjYWxsbGVkIHN1Y2Nlc3MnKTtcbiAgICAgICAgICB0aGlzLmlzQ29udGVudExvYWRlZCA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICByZXR1cm4gb2YocmVzKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdGJvdCBjb25maWcgREo6ICcsIGVycm9yKTtcbiAgICAgICAgdGhpcy5pc0RvY0luRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0NvbnRlbnRMb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChlcnJvcj8uc3RhdHVzID09IDQwNCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdkYXNoJyk7XG4gICAgICAgICAgdGhpcy5pc0RvY0luRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmlzQ29udGVudExvYWRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZmV0Y2hBZ2VudHMoKSB7XG4gICAgdGhpcy5mZXRjaEFnZW50c19odHRwKCkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBmZXRjaEVkaXRvckNvbnRlbnQoKSB7XG4gICAgdGhpcy5mZXRjaENvbnRlbnRfaHR0cCgpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gZXZlbnRzLyR7ZXZlbnRJZH0vdXNlcnMtY29ubmVjdGlvbnNcbiAgcHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KG1hcmtkb3duOiBzdHJpbmcpOiBTYWZlSHRtbCB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIGN1c3RvbSByZW5kZXJlciB0byBtb2RpZnkgPGE+IHRhZ3NcbiAgICAgIGNvbnN0IHJlbmRlcmVyID0gbmV3IG1hcmtlZC5SZW5kZXJlcigpO1xuXG4gICAgICAvLyBDdXN0b21pemUgYW5jaG9yIHRhZ3MgdG8gaW5jbHVkZSB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgcmVuZGVyZXIubGluayA9IChocmVmOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYDxhIGhyZWY9XCIke2hyZWZ9XCIgdGl0bGU9XCIke3RpdGxlIHx8ICcnXG4gICAgICAgICAgfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7dGV4dH08L2E+YDtcbiAgICAgIH07XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBtYXJrZG93biBjb250ZW50IHRvIEhUTUwgdXNpbmcgbWFya2VkIHdpdGggdGhlIGN1c3RvbSByZW5kZXJlclxuICAgICAgY29uc3QgbWFya2Rvd25Db250ZW50ID0gbWFya2VkLnBhcnNlKG1hcmtkb3duLCB7IHJlbmRlcmVyOiByZW5kZXJlciB9KTtcblxuICAgICAgLy8gU2FuaXRpemUgdGhlIHBhcnNlZCBIVE1MIHVzaW5nIEFuZ3VsYXIncyBEb21TYW5pdGl6ZXJcbiAgICAgIGNvbnN0IHNhbml0aXplZEh0bWwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcbiAgICAgICAgbWFya2Rvd25Db250ZW50XG4gICAgICApO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIHNhZmUgSFRNTCBjb250ZW50IGZvciBkaXNwbGF5XG4gICAgICByZXR1cm4gc2FuaXRpemVkSHRtbDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyBtYXJrZG93bjonLCBlcnJvcik7XG4gICAgICByZXR1cm4gJyc7IC8vIFJldHVybiBhbiBlbXB0eSBzdHJpbmcgb3IgaGFuZGxlIHRoZSBlcnJvciBhcHByb3ByaWF0ZWx5XG4gICAgfVxuICB9XG5cbiAgcHJlcGFyZUh0bWwobWFya2Rvd246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFtYXJrZG93biB8fCAhKG1hcmtkb3duLmxlbmd0aCA+IDApKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnB1dCBNYXJrZG93biBpcyBudWxsIG9yIGVtcHR5Jyk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBoZWFkZXJzICgjIyMgb3IgIyMpIHRvIDxzdHJvbmc+IGZvciBib2xkIGhlYWRpbmdzXG4gICAgbGV0IGh0bWwgPSBtYXJrZG93bi5yZXBsYWNlKC9eKCN7MSw2fSlcXHMrKC4qKSQvZ20sIChtYXRjaCwgaGFzaGVzLCB0ZXh0KSA9PiB7XG4gICAgICBjb25zdCBsZXZlbCA9IGhhc2hlcy5sZW5ndGg7XG4gICAgICBpZiAobGV2ZWwgPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIGA8aDM+PHN0cm9uZz4ke3RleHR9PC9zdHJvbmc+PC9oMz5gO1xuICAgICAgfSBlbHNlIGlmIChsZXZlbCA9PT0gNCkge1xuICAgICAgICByZXR1cm4gYDxoND48c3Ryb25nPiR7dGV4dH08L3N0cm9uZz48L2g0PmA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYDxzdHJvbmc+JHt0ZXh0fTwvc3Ryb25nPmA7XG4gICAgfSk7XG5cbiAgICAvLyBDb252ZXJ0IE1hcmtkb3duIGNvZGUgYmxvY2tzIHdpdGggbGFuZ3VhZ2UgdG8gcHJlZm9ybWF0dGVkIEhUTUxcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9gYGAoXFx3Kyk/XFxuKFtcXHNcXFNdKj8pYGBgL2csIChtYXRjaCwgbGFuZywgY29kZSkgPT4ge1xuICAgICAgY29uc3QgZXNjYXBlZENvZGUgPSB0aGlzLmVzY2FwZUh0bWwoY29kZSk7XG4gICAgICBjb25zdCBsYW5ndWFnZSA9IGxhbmcgfHwgJ3BsYWludGV4dCc7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgYnV0dG9uIGZvciB0aGUgY29kZSBibG9ja1xuICAgICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2RlLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29weS1idXR0b25cIiBjbGFzcz1cImNvcHktYnV0dG9uXCIgKGNsaWNrKT1cImNvcHlUb0NsaXBib2FyZCgnXFxgJHtlc2NhcGVkQ29kZX1cXGAnKVwiPkNvcHk8L2J1dHRvbj5cbiAgICAgICAgPHByZSBjbGFzcz1cImNvZGVfYmxvY2sgZGlmZlwiPjxjb2RlIGNsYXNzPVwibGFuZ3VhZ2UtJHtsYW5ndWFnZX1cIj4ke2VzY2FwZWRDb2RlfTwvY29kZT48L3ByZT5cbiAgICAgIDwvZGl2PmA7XG4gICAgfSk7XG5cbiAgICAvLyBDb252ZXJ0IGlubGluZSBjb2RlICh3cmFwcGVkIGluIGBiYWNrdGlja3NgKSB0byBpbmxpbmUgPGNvZGU+IHRhZ3NcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpO1xuXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBib2xkIHRvIEhUTUwgPHN0cm9uZz5cbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9cXCpcXCooLio/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpO1xuXG4gICAgLy8gQ29udmVydCBudW1iZXJlZCBsaXN0c1xuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL15cXGQrXFwuXFxzKyguKikkL2dtLCAnPGxpPiQxPC9saT4nKTtcblxuICAgIC8vIENvbnZlcnQgYnVsbGV0IHBvaW50IGxpc3RzXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXlxcLVxccysoLiopJC9nbSwgJzxsaT4kMTwvbGk+Jyk7XG5cbiAgICAvLyBDb252ZXJ0IE1hcmtkb3duIGxpbmtzIHRvIEhUTUwgbGlua3NcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9cXFsoW15cXF1dKyldXFwoKFteKV0rKVxcKS9nLCAnPGEgaHJlZj1cIiQyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+Jyk7XG5cbiAgICAvLyBDb252ZXJ0IG5ldyBsaW5lcyB0byA8YnI+IHRhZ3MgZm9yIHBhcmFncmFwaHNcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC8oPzpcXHJcXG58XFxyfFxcbikvZywgJzxicj4nKTtcblxuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGVzY2FwZSBIVE1MIGNoYXJhY3RlcnMgZm9yIGNvZGUgYmxvY2tzXG4gIGVzY2FwZUh0bWwoY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29kZVxuICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAgIC5yZXBsYWNlKC8nL2csICcmIzAzOTsnKTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uIHRvIGNvcHkgdGV4dCB0byBjbGlwYm9hcmRcbiAgcHVibGljIGNvcHlUb0NsaXBib2FyZCh0ZXh0OiBzdHJpbmcpIHtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KS50aGVuKCgpID0+IHtcbiAgICAgIGFsZXJ0KCdDb2RlIGNvcGllZCB0byBjbGlwYm9hcmQhJyk7XG4gICAgfSwgKGVycikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGNvcHkgdGV4dDogJywgZXJyKTtcbiAgICB9KTtcbiAgfVxuXG5cblxuXG5cblxuICBpc0NvbGxhcHNlZCA9IGZhbHNlO1xuICBpc0NvbGxhcHNlZEZvckdyYXBoID0gZmFsc2U7XG4gIGlzQ29sbGFwc2VkRm9yRkdyYXBoID0gZmFsc2U7XG4gIHRvZ2dsZUNvbGxhcHNlKCkge1xuICAgIHRoaXMuaXNDb2xsYXBzZWQgPSAhdGhpcy5pc0NvbGxhcHNlZDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICB0b2dnbGVDb2xsYXBzZUdyYXBoKCkge1xuICAgIHRoaXMuaXNDb2xsYXBzZWRGb3JHcmFwaCA9ICF0aGlzLmlzQ29sbGFwc2VkRm9yR3JhcGg7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gIHRvZ2dsZUNvbGxhcHNlRkdyYXBoKCkge1xuICAgIHRoaXMuaXNDb2xsYXBzZWRGb3JGR3JhcGggPSAhdGhpcy5pc0NvbGxhcHNlZEZvckZHcmFwaDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgLy8gICBbXG4gIC8vICAge1xuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkFJIE5ld3MgSmFudWFyeSAyMDI0OiBJbi1EZXB0aCBhbmQgQ29uY2lzZSAtIFRoZSBBSSBUcmFja1wiLFxuICAvLyAgICAgXCJkZXNjXCI6IFwiRWFjaCBtb250aCwgd2UgY29tcGlsZSBzaWduaWZpY2FudCBuZXdzLCB0cmVuZHMsIGFuZCBoYXBwZW5pbmdzIGluIEFJLCBwcm92aWRpbmcgZGV0YWlsZWQgc3VtbWFyaWVzIHdpdGgga2V5IHBvaW50cyBpbiBidWxsZXQgZm9ybSBmb3IgY29uY2lzZSB5ZXQgY29tcGxldGUgdW5kZXJzdGFuZGluZy5cIixcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vdGhlYWl0cmFjay5jb20vYWktbmV3cy1qYW51YXJ5LTIwMjQvXCJcbiAgLy8gICB9LFxuICAvLyAgIHtcbiAgLy8gICAgIFwidGl0bGVcIjogXCJUb3AgQUkgTmV3cywgSmFudWFyeSAyMDI0IC0gRXZlcnlwaXhlbCBKb3VybmFsXCIsXG4gIC8vICAgICBcImRlc2NcIjogXCJJbiB0aGlzIG1vbnRobHkgcm91bmR1cCwgd2Ugc3BvdGxpZ2h0IHRoZSB0b3AgQUkgbmV3cyBzdG9yaWVzIGZyb20gSmFudWFyeSwgaW5jbHVkaW5nIHRoZSBPcGVuQUkgdnMuIFRoZSBOZXcgWW9yayBUaW1lcyBMYXdzdWl0LlwiLFxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly9qb3VybmFsLmV2ZXJ5cGl4ZWwuY29tL3RvcC1haS1uZXdzLWphbnVhcnktMjAyNFwiXG4gIC8vICAgfSxcbiAgLy8gICB7XG4gIC8vICAgICBcInRpdGxlXCI6IFwiQUkgTmV3cyBKdWx5IDIwMjQ6IEluLURlcHRoIGFuZCBDb25jaXNlIC0gVGhlIEFJIFRyYWNrXCIsXG4gIC8vICAgICBcImRlc2NcIjogXCJUaGlzIHBhZ2UgZmVhdHVyZXMgQUkgTmV3cyBmb3IgSnVseSAyMDI0LCBoaWdobGlnaHRpbmcgc2lnbmlmaWNhbnQgZXZlbnRzIHN1Y2ggYXMgQ2FudmEgYWNxdWlyaW5nIExlb25hcmRvIEFJLlwiLFxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly90aGVhaXRyYWNrLmNvbS9haS1uZXdzLWp1bHktMjAyNC1pbi1kZXB0aC1hbmQtY29uY2lzZS9cIlxuICAvLyAgIH0sXG4gIC8vICAge1xuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkphbnVhcnkgbmV3cyByb3VuZHVwOiBXaGF0J3MgbmV3IGluIHRoZSB3b3JsZCBvZiBBST8gLSBQbHVyYWxzaWdodFwiLFxuICAvLyAgICAgXCJkZXNjXCI6IFwiT3BlbkFJ4oCZcyBuZXcgR1BUIHN0b3JlLCBidXNpbmVzcy1yZWFkeSBDaGF0R1BUIHBsYW5zLCBhbmQgYSBwcmVkaWN0ZWQgcmlzZSBpbiBBSS1wb3dlcmVkIGN5YmVyY3JpbWUuXCIsXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL3d3dy5wbHVyYWxzaWdodC5jb20vcmVzb3VyY2VzL2Jsb2cvZGF0YS9haS10aGlzLW1vbnRoLWphbnVhcnktMjAyNFwiXG4gIC8vICAgfSxcbiAgLy8gICB7XG4gIC8vICAgICBcInRpdGxlXCI6IFwiQUkgTmV3cyBBdWd1c3QgMjAyNDogSW4tRGVwdGggYW5kIENvbmNpc2UgLSBUaGUgQUkgVHJhY2tcIixcbiAgLy8gICAgIFwiZGVzY1wiOiBcIlRoaXMgcGFnZSBmZWF0dXJlcyBBSSBOZXdzIGZvciBBdWd1c3QgMjAyNCwgd2l0aCBoaWdobGlnaHRzIHN1Y2ggYXMgTnZpZGlhIGRlbGF5aW5nIHRoZSDigJxCbGFja3dlbGzigJ0gQjIwMCBBSSBjaGlwcyBkZWxpdmVyeS5cIixcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vdGhlYWl0cmFjay5jb20vYWktbmV3cy1hdWd1c3QtMjAyNC1pbi1kZXB0aC1hbmQtY29uY2lzZS1kdXBsaWNhdGUvXCJcbiAgLy8gICB9XG4gIC8vIF1cbiAgZGF0ZVRpbWUgPSB7IG5vdzogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH07XG4gIC8vIEV4dHJhY3RzIHRoZSBkb21haW4gZnJvbSBhIFVSTFxuICBnZXREb21haW5OYW1lKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBob3N0bmFtZSB9ID0gbmV3IFVSTCh1cmwpO1xuICAgICAgcmV0dXJuIGhvc3RuYW1lLnJlcGxhY2UoL153d3dcXC4vLCAnJyk7IC8vIFJlbW92ZSAnd3d3LicgaWYgcHJlc2VudFxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICB9XG4gIH1cblxuICAvLyBHZW5lcmF0ZXMgdGhlIGZhdmljb24gVVJMXG4gIGdldEZhdmljb25VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRvbWFpbiA9IHRoaXMuZ2V0RG9tYWluTmFtZSh1cmwpO1xuICAgIHJldHVybiBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zMi9mYXZpY29ucz9zej0xMjgmZG9tYWluPSR7ZG9tYWlufWA7XG4gIH1cbiAgY3VycmVudFNvdXJjZXNMaXN0OiBhbnkgPSBbXTtcbiAgb25DYXJkQ2xpY2soc291cmNlcyk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFNvdXJjZXNMaXN0ID0gc291cmNlcztcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5zb3VyY2VzRHJhd2VyLm9wZW4oKTtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm90Y2xvc2VwbGF5Z3JvdW5kYnV0dG9uJyk7XG4gICAgaWYgKGJ1dHRvbikge1xuICAgICAgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgaXNTaG93RWRpdG9yQnV0dG9uID0gdHJ1ZTtcblxuICBvcGVuT3V0ZXJFZGl0b3IoKSB7XG4gICAgdGhpcy5mZXRjaEVkaXRvckNvbnRlbnQoKTtcbiAgICB0aGlzLmVkaXRvcnNEcmF3ZXIub3BlbigpO1xuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLmlzU2hvd0VkaXRvckJ1dHRvbiA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICBvbkNsb3NlRWRpdG9yKCkge1xuICAgIHRoaXMuZWRpdG9yc0RyYXdlci5jbG9zZSgpO1xuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5pc1Nob3dFZGl0b3JCdXR0b24gPSB0cnVlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIGlmIG5lZWRlZFxuICAgIHRoaXMub25EcmF3ZXJDbG9zZWQoKTtcbiAgfVxuXG4gIG9uQ2xvc2VTb3VyY2UoKSB7XG4gICAgdGhpcy5zb3VyY2VzRHJhd2VyLmNsb3NlKCk7XG4gICAgdGhpcy5pc0RyYXdlck9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWVkZWRcbiAgICB0aGlzLm9uRHJhd2VyQ2xvc2VkKCk7XG4gIH1cbiAgb25EcmF3ZXJDbG9zZWQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmlzRHJhd2VyT3BlbiA9IHRydWU7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWVkZWRcbiAgICAgIC8vIFVzZSBuZ0NsYXNzIHRvIGR5bmFtaWNhbGx5IGFwcGx5IHRoZSBjbGFzc1xuICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdGNsb3NlcGxheWdyb3VuZGJ1dHRvbicpO1xuICAgICAgaWYgKGJ1dHRvbikge1xuICAgICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9XG4gICAgfSwgODAwKTtcbiAgfVxuICBpc0RyYXdlck9wZW4gPSB0cnVlO1xuXG4gIHRvZ2dsZURyYXdlcih0b2RvKSB7XG4gICAgdGhpcy5pc0RyYXdlck9wZW4gPSB0b2RvO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvblZpc2liaWxpdHkoKTtcbiAgfVxuICB1cGRhdGVCdXR0b25WaXNpYmlsaXR5KCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9IHRoaXMuaXNEcmF3ZXJPcGVuID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICB9XG4gIH1cbiAgb3BlbkxpbmtJbk5ld1RhYihsaW5rOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB3aW5kb3cub3BlbihsaW5rLCAnX2JsYW5rJyk7XG4gIH1cbiAgYWRqdXN0VGV4dGFyZWFIZWlnaHQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAvLyBQcmV2ZW50cyBhIG5ldyBsaW5lIGZyb20gYmVpbmcgYWRkZWRcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuXG4gICAgfVxuICAgIGNvbnN0IHRleHRhcmVhID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG4gICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nOyAvLyBSZXNldCB0aGUgaGVpZ2h0XG4gICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gYCR7dGV4dGFyZWEuc2Nyb2xsSGVpZ2h0fXB4YDsgLy8gQWRqdXN0IGhlaWdodCB0byBtYXRjaCBjb250ZW50XG4gICAgLy8gRW5zdXJlIHRoZSBoZWlnaHQgZG9lc24ndCBleGNlZWQgdGhlIG1heC1oZWlnaHQgc2V0IGluIENTU1xuICAgIGlmICh0ZXh0YXJlYS5zY3JvbGxIZWlnaHQgPiAxNTApIHtcbiAgICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9IGAxNTBweGA7IC8vIEFkanVzdCBoZWlnaHQgdG8gbWF0Y2ggY29udGVudFxuICAgICAgdGV4dGFyZWEuc3R5bGUub3ZlcmZsb3dZID0gJ2F1dG8nOyAvLyBFbmFibGUgc2Nyb2xsaW5nIGlmIGNvbnRlbnQgZXhjZWVkcyA0MDBweFxuICAgIH0gZWxzZSB7XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJzsgLy8gSGlkZSBzY3JvbGxiYXIgaWYgY29udGVudCBpcyB3aXRoaW4gbGltaXRzXG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlV29ya2Zsb3dzKHZhbHVlID0gbnVsbCkge1xuXG4gICAgaWYgKCF0aGlzLmNoZWNrRm9yQ29wMjlCb3RJZCgpKSB7XG4gICAgICB0aGlzLmJvdFNlcnZpY2UuZ2V0V29ya2Zsb3dzQnlPcmdJZCh0aGlzLm9yZ0lkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICB0aGlzLm9yZ1dvcmtmbG93cyA9IHJlcztcbiAgICAgICAgdGhpcy5pc1dvcmtmbG93T3BlbiA9IHZhbHVlID09IG51bGwgPyAhdGhpcy5pc1dvcmtmbG93T3BlbiA6IHZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1dvcmtmbG93T3Blbikge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvdyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vcGVuV29ya2Zsb3dJbnB1dCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuICBpbml0aWFsaXplRm9ybSgpIHtcbiAgICAvLyBDcmVhdGUgZm9ybSBjb250cm9scyBkeW5hbWljYWxseSBiYXNlZCBvbiBzZWxlY3RlZFdvcmtmbG93LlRyaWdnZXIuSW5wdXRTY2hlbWFcbiAgICBjb25zdCBmb3JtQ29udHJvbHMgPSB7fTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFdvcmtmbG93Py5UcmlnZ2VyPy5JbnB1dFNjaGVtYSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93LlRyaWdnZXIuSW5wdXRTY2hlbWEuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgICAgZm9ybUNvbnRyb2xzW2lucHV0LklucHV0SWRdID0gW1xuICAgICAgICAgIGlucHV0LlZhbHVlIHx8ICcnLFxuICAgICAgICAgIGlucHV0LlJlcXVpcmVkID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IG51bGwsXG4gICAgICAgIF07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBmb3JtXG4gICAgdGhpcy53b3JrZmxvd0Zvcm0gPSB0aGlzLmZiLmdyb3VwKGZvcm1Db250cm9scyk7XG4gIH1cblxuICBvbldvcmtmbG93U2VsZWN0ZWQod29ya2Zsb3cpIHtcbiAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3cgPSB3b3JrZmxvdztcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgdGhpcy5pc1dvcmtmbG93T3BlbiA9IGZhbHNlO1xuICAgIHRoaXMub3BlbldvcmtmbG93SW5wdXQgPSB0cnVlO1xuICB9XG5cbiAgb25Xb3JrZmxvd1N1Ym1pdCgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxsQ2hhdHMnKTtcbiAgICBpZiAodGhpcy53b3JrZmxvd0Zvcm0udmFsaWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMud29ya2Zsb3dGb3JtLnZhbHVlKTtcblxuICAgICAgdmFyIGlucHV0ID0gdGhpcy5wcmVwYXJlSHRtbChcbiAgICAgICAgdGhpcy5nZW5lcmF0ZU1hcmtkb3duKFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvdy5OYW1lLFxuICAgICAgICAgIHRoaXMud29ya2Zsb3dGb3JtLnZhbHVlXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIC8vIHVwZGF0ZSBsYXN0IHR3byBjaGF0TG9nIGVudHJpZXMsIHNldCBzaG93V29ya2Zsb3dFeGVjdXRpb25Mb2FkZXIgPSBmYWxzZVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5jaGF0TG9nW3RoaXMuY2hhdExvZy5sZW5ndGggLSAxXVtcbiAgICAgICAgICAnc2hvd1dvcmtmbG93RXhlY3V0aW9uTG9hZGVyJ1xuICAgICAgICBdID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhdExvZ1t0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMl1bXG4gICAgICAgICAgJ3Nob3dXb3JrZmxvd0V4ZWN1dGlvbkxvYWRlcidcbiAgICAgICAgXSA9IGZhbHNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxuXG4gICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgIHR5cGU6ICd1c2VyJyxcbiAgICAgICAgbWVzc2FnZTogaW5wdXQsXG4gICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZSxcbiAgICAgICAgc2hvd1dvcmtmbG93RXhlY3V0aW9uTG9hZGVyOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKGlucHV0KTtcblxuICAgICAgdGhpcy5jdXJyZW50V29ya2Zsb3dBY3Rpb25Qcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLmN1cnJlbnRXb3JrZmxvd0FjdGlvbiA9XG4gICAgICAgICdFeGVjdXRpbmcgJyArIHRoaXMuc2VsZWN0ZWRXb3JrZmxvdy5BY3Rpb25zWzBdLk5hbWU7XG4gICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IHRydWU7XG4gICAgICB0aGlzLmV4ZWN1dGluZ1dvcmtmbG93ID0gdHJ1ZTtcbiAgICAgIHRoaXMud29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzID0ge1xuICAgICAgICBBY3Rpb25zOiB0aGlzLnNlbGVjdGVkV29ya2Zsb3cuQWN0aW9ucyxcbiAgICAgICAgSW5wdXRzOiB0aGlzLndvcmtmbG93Rm9ybS52YWx1ZSxcbiAgICAgICAgd29ya2Zsb3dJbnB1dHM6IHRoaXMud29ya2Zsb3dGb3JtLnZhbHVlLFxuICAgICAgICBXb3JrZmxvd05hbWU6IHRoaXMuc2VsZWN0ZWRXb3JrZmxvdy5OYW1lLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY3VycmVudFdvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IHRoaXMud29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzO1xuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgIC8vIGV4ZWN1dGUgdGhlIGFzayBlbmRwb2ludCB3aXRoIHdvcmtmbG93IGlucHV0XG4gICAgICB0aGlzLm1ha2VBc2tSZXF1ZXN0KFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgdGhpcy5hZ2VudHMsXG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uS2V5LFxuICAgICAgICAnJyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93WydfaWQnXSxcbiAgICAgICAgdGhpcy53b3JrZmxvd0Zvcm0udmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbWFrZUFza1JlcXVlc3QoXG4gICAgaW5wdXRNc2c6IHN0cmluZyxcbiAgICBhZ2VudHM6IGFueVtdLFxuICAgIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsXG4gICAgbXNnPzogYW55LFxuICAgIGNoYXQ/OiBhbnksXG4gICAgd29ya2Zsb3dJZD86IHN0cmluZyxcbiAgICB3b3JrZmxvd19pbnB1dHM/OiBhbnlcbiAgKTogdm9pZCB7XG4gICAgdmFyIHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2FpL2Fza2A7XG5cbiAgICB2YXIgYm9keSA9IHtcbiAgICAgIHVzZXJfcXVlc3Rpb246IGlucHV0TXNnLFxuICAgICAgdXNlcl9pZDogdGhpcy51c2VySWQsXG4gICAgICBib3RfaWQ6IHRoaXMuYm90SWQsXG4gICAgICBtZXNzYWdlX2lkOiB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2VuZXJhdGVLZXkoKSxcbiAgICAgIHNlc3Npb25faWQ6IHRoaXMuY29uU2Vzc2lvbktleSxcbiAgICAgIGFnZW50czogYWdlbnRzPy5maWx0ZXIoKHApID0+IHAuc2VsZWN0ZWQpLm1hcCgocCkgPT4gcC5pZCkgPz8gW10sXG4gICAgICBjb252ZXJzYXRpb25faWQ6IGNvbnZlcnNhdGlvbklkLFxuICAgICAgZmlyc3RfbmFtZTogdGhpcy5maXJzdE5hbWUsXG4gICAgICBsYXN0X25hbWU6IHRoaXMubGFzdE5hbWVcbiAgICB9O1xuXG4gICAgaWYgKHdvcmtmbG93SWQpIHtcbiAgICAgIGJvZHlbJ3dvcmtmbG93X2lkJ10gPSB3b3JrZmxvd0lkO1xuICAgICAgYm9keVsnd29ya2Zsb3dfaW5wdXRzJ10gPSB3b3JrZmxvd19pbnB1dHM7XG4gICAgfVxuXG5cbiAgICBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICBBdXRob3JpemF0aW9uOiAnQmVhcmVyICcgKyB0aGlzLnMyN1Rva2VuLFxuICAgICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXG4gICAgICAgICdkb21haW4tYXV0aG9yaXR5JzogdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZVxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgdGhpcy5pczQwMSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4uZW1pdCgpO1xuXG4gICAgICAgICAgLy8gSWYgYG1zZ2AgYW5kIGBjaGF0YCBleGlzdCwgaGFuZGxlIHRoZW1cbiAgICAgICAgICBpZiAobXNnICYmIGNoYXQpIHtcbiAgICAgICAgICAgIHRoaXMubXNnID0gbXNnO1xuICAgICAgICAgICAgdGhpcy5jaGF0ID0gY2hhdDtcbiAgICAgICAgICAgIHRoaXMuaXNGZXRjaERhdGFGb3IgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzNDAxID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH0pXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgICAgLy8gQWRkaXRpb25hbCByZXNwb25zZSBoYW5kbGluZyBpZiBuZWVkZWRcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogJywgZXJyKTtcbiAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5pbnB1dCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvdyA9IG51bGw7XG4gICAgdGhpcy5vcGVuV29ya2Zsb3dJbnB1dCA9IGZhbHNlO1xuICAgIHRoaXMuaXNXb3JrZmxvd09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuXG4gIG1ha2VBc2tSZXF1ZXN0b2xkKFxuICAgIGlucHV0TXNnOiBzdHJpbmcsXG4gICAgYWdlbnRzOiBhbnlbXSxcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxuICAgIG1zZz86IGFueSxcbiAgICBjaGF0PzogYW55LFxuICAgIHdvcmtmbG93SWQ/OiBzdHJpbmcsXG4gICAgd29ya2Zsb3dfaW5wdXRzPzogYW55XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2FpL2Fza2A7XG5cbiAgICBjb25zdCBib2R5OiBhbnkgPSB7XG4gICAgICB1c2VyX3F1ZXN0aW9uOiBpbnB1dE1zZyxcbiAgICAgIHVzZXJfaWQ6IHRoaXMudXNlcklkLFxuICAgICAgYm90X2lkOiB0aGlzLmJvdElkLFxuICAgICAgbWVzc2FnZV9pZDogdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdlbmVyYXRlS2V5KCksXG4gICAgICBhZ2VudHM6IGFnZW50cz8uZmlsdGVyKChwKSA9PiBwLnNlbGVjdGVkKS5tYXAoKHApID0+IHAuaWQpID8/IFtdLFxuICAgICAgY29udmVyc2F0aW9uX2lkOiBjb252ZXJzYXRpb25JZCxcbiAgICAgIGZpcnN0X25hbWU6IHRoaXMuZmlyc3ROYW1lLFxuICAgICAgbGFzdF9uYW1lOiB0aGlzLmxhc3ROYW1lLFxuICAgIH07XG5cbiAgICBpZiAod29ya2Zsb3dJZCkge1xuICAgICAgYm9keVsnd29ya2Zsb3dfaWQnXSA9IHdvcmtmbG93SWQ7XG4gICAgICBib2R5Wyd3b3JrZmxvd19pbnB1dHMnXSA9IHdvcmtmbG93X2lucHV0cztcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgICAnaGl2ZS1ib3QtaWQnOiB0aGlzLmJvdElkLFxuICAgICAgJ2RvbWFpbi1hdXRob3JpdHknOiB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCBib2R5LCB7IGhlYWRlcnMgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICAgIC8vIEFkZGl0aW9uYWwgcmVzcG9uc2UgaGFuZGxpbmcgaWYgbmVlZGVkXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6ICcsIGVycik7XG4gICAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5pbnB1dCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvdyA9IG51bGw7XG4gICAgdGhpcy5vcGVuV29ya2Zsb3dJbnB1dCA9IGZhbHNlO1xuICAgIHRoaXMuaXNXb3JrZmxvd09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgfVxuXG4gIGdlbmVyYXRlTWFya2Rvd24odGl0bGUsIG9iaikge1xuICAgIC8vIEluaXRpYWxpemUgbWFya2Rvd24gd2l0aCB0aGUgdGl0bGVcbiAgICBsZXQgbWFya2Rvd24gPSBgIyMgJHt0aXRsZX1cXG5gO1xuXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBvYmplY3QgYW5kIGFwcGVuZCB0aGUgZmllbGQgbmFtZXMgYW5kIHZhbHVlc1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIHZhciBrZXlfbGFiZWwgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3cuVHJpZ2dlci5JbnB1dFNjaGVtYS5maW5kKFxuICAgICAgICAgIChpbnB1dCkgPT4gaW5wdXQuSW5wdXRJZCA9PT0ga2V5XG4gICAgICAgICk/LkxhYmVsIHx8IGtleTtcbiAgICAgIG1hcmtkb3duICs9IGAtICoqJHtrZXlfbGFiZWx9Kio6ICR7dmFsdWV9XFxuYDtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFya2Rvd247XG4gIH1cblxuICBzaG93V29ya2Zsb3dIaXN0b3J5RGV0YWlscyh3b3JrZmxvd19pZCkge1xuICAgIGlmICghd29ya2Zsb3dfaWQpIHtcbiAgICAgIHRoaXMud29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzID0gdGhpcy5jdXJyZW50V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzO1xuICAgICAgdGhpcy5zaG93V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJvdFNlcnZpY2UuZ2V0V29ya2Zsb3dFeGVjdXRpb25CeUlkKHdvcmtmbG93X2lkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgaWYgKHJlcyAmJiByZXMuQWN0aW9ucyAmJiBBcnJheS5pc0FycmF5KHJlcy5BY3Rpb25zKSkge1xuICAgICAgICByZXMuQWN0aW9ucyA9IHJlcy5BY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKGFjdGlvbi5JbnNlcnRUaW1lU3RhbXApIHtcbiAgICAgICAgICAgIGFjdGlvbi5JbnNlcnRUaW1lU3RhbXAgPSBmb3JtYXRUaW1lU3RhbXBzKFxuICAgICAgICAgICAgICB0aGlzLnRpbWV6b25lLFxuICAgICAgICAgICAgICBhY3Rpb24uSW5zZXJ0VGltZVN0YW1wXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmVzLkluc2VydFRpbWVTdGFtcCA9IGZvcm1hdFRpbWVTdGFtcHMoXG4gICAgICAgIHRoaXMudGltZXpvbmUsXG4gICAgICAgIHJlcy5JbnNlcnRUaW1lU3RhbXBcbiAgICAgICk7XG4gICAgICB0aGlzLndvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IHJlcztcbiAgICAgIHRoaXMuc2hvd1dvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IHRydWU7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZU1vZGFsKCkge1xuICAgIHRoaXMuc2hvd1dvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IGZhbHNlO1xuICB9XG5cbiAgb2JqZWN0VG9BcnJheShvYmo6IGFueSk6IGFueVtdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoKGtleSkgPT4gKHsga2V5LCB2YWx1ZTogb2JqW2tleV0gfSkpO1xuICB9XG5cbiAgc3RhcnROZXdDb252ZXJzYXRpb24oKSB7XG4gICAgdGhpcy5jb252ZXJzYXRpb25LZXkgPSB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2V0S2V5KHRoaXMuYm90SWQsIHRydWUpO1xuICAgIHRoaXMuY2hhdExvZyA9IFt0aGlzLmNoYXRMb2dbMF1dO1xuICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmluaXRpYWxpemVTb2NrZXQoKTtcbiAgICB9LCAyMDApO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBpbml0aWFsaXplU3BlZWNoUmVjb2duaXplcih0b2tlbjogc3RyaW5nKSB7XG4gICAgdGhpcy5zcGVlY2hDb25maWcgPSBTcGVlY2hTREsuU3BlZWNoQ29uZmlnLmZyb21BdXRob3JpemF0aW9uVG9rZW4oXG4gICAgICB0b2tlbixcbiAgICAgIHRoaXMucmVnaW9uXG4gICAgKTtcbiAgICBjb25zdCBhdWRpb0NvbmZpZyA9IFNwZWVjaFNESy5BdWRpb0NvbmZpZy5mcm9tRGVmYXVsdE1pY3JvcGhvbmVJbnB1dCgpO1xuICAgIHRoaXMucmVjb2duaXplciA9IG5ldyBTcGVlY2hTREsuU3BlZWNoUmVjb2duaXplcihcbiAgICAgIHRoaXMuc3BlZWNoQ29uZmlnLFxuICAgICAgYXVkaW9Db25maWdcbiAgICApO1xuXG4gICAgdGhpcy5yZWNvZ25pemVyLnJlY29nbml6aW5nID0gKHMsIGUpID0+IHtcbiAgICAgIGlmIChlLnJlc3VsdC5yZWFzb24gPT09IFNwZWVjaFNESy5SZXN1bHRSZWFzb24uUmVjb2duaXppbmdTcGVlY2gpIHtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGUucmVzdWx0LnRleHQ7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZWNvZ25pemluZzogJHtlLnJlc3VsdC50ZXh0fWApO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5yZWNvZ25pemVyLnJlY29nbml6ZWQgPSAocywgZSkgPT4ge1xuICAgICAgaWYgKGUucmVzdWx0LnJlYXNvbiA9PT0gU3BlZWNoU0RLLlJlc3VsdFJlYXNvbi5SZWNvZ25pemVkU3BlZWNoKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBlLnJlc3VsdC50ZXh0O1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVjb2duaXplZDogJHtlLnJlc3VsdC50ZXh0fWApO1xuICAgICAgICB0aGlzLnRvZ2dsZVJlY29yZGluZygpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5yZWNvZ25pemVyLmNhbmNlbGVkID0gKHMsIGUpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0NhbmNlbGVkOiAnLCBlLmVycm9yRGV0YWlscyk7XG4gICAgfTtcblxuICAgIHRoaXMucmVjb2duaXplci5zZXNzaW9uU3RvcHBlZCA9IChzLCBlKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnU2Vzc2lvbiBzdG9wcGVkLicpO1xuICAgICAgdGhpcy5yZWNvZ25pemVyLnN0b3BDb250aW51b3VzUmVjb2duaXRpb25Bc3luYygpO1xuICAgICAgdGhpcy5mZXRjaERhdGEoKTtcbiAgICB9O1xuICB9XG5cbiAgdG9nZ2xlUmVjb3JkaW5nKCkge1xuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSAhdGhpcy5pc1JlY29yZGluZztcblxuICAgIGlmICh0aGlzLmlzUmVjb3JkaW5nKSB7XG4gICAgICB0aGlzLnN0YXJ0UmVjb2duaXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9wUmVjb2duaXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBzdGFydFJlY29nbml0aW9uKCkge1xuICAgIHRoaXMucmVjb2duaXplci5zdGFydENvbnRpbnVvdXNSZWNvZ25pdGlvbkFzeW5jKCk7XG4gIH1cblxuICBzdG9wUmVjb2duaXRpb24oKSB7XG4gICAgdGhpcy5yZWNvZ25pemVyLnN0b3BDb250aW51b3VzUmVjb2duaXRpb25Bc3luYygpO1xuICB9XG5cbiAgY2hlY2tGb3JDb3AyOUJvdElkKCkge1xuICAgIHJldHVybiB0aGlzLmJvdElkID09ICc2NmZhM2YyNzZjNWQ3MWUyNzE3YmZlYTgnIHx8IHRoaXMuYm90SWQgPT0gJzY3MTYzMzU0NTY1MmRkNzhlZmVjODQ4ZCc7XG5cbiAgfVxuXG4gIGdldExhdGVzdFRpbWUodGltZSk6IHN0cmluZyB7XG4gICAgaWYgKHRpbWUpIHtcbiAgICAgIHJldHVybiB0aW1lO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoW10sIHtcbiAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgIH0pOyAvLyByZXR1cm5zIGN1cnJlbnQgdGltZSBpbiAnc2hvcnRUaW1lJyBmb3JtYXRcbiAgfVxufVxuIl19