fmode-ng 0.0.243 → 0.0.245
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +56 -30
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +3 -3
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -6
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +2 -2
- package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +6 -2
- package/esm2022/lib/core/agent/chat/fmode-chat.mjs +110 -81
- package/esm2022/lib/core/agent/chat/message/message-manager.mjs +131 -62
- package/esm2022/lib/core/parse/fmode.cloud.mjs +17 -3
- package/esm2022/lib/core/parse/fmode.object.mjs +4 -3
- package/fesm2022/fmode-ng.mjs +329 -183
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/chat/chat-message-area/comp-message-area.component.d.ts +9 -3
- package/lib/aigc/service-fmai/service-chat/chat.service.d.ts +3 -2
- package/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.d.ts +1 -1
- package/lib/core/agent/chat/fmode-chat.d.ts +12 -5
- package/lib/core/agent/chat/message/message-manager.d.ts +22 -2
- package/package.json +1 -1
|
@@ -18,12 +18,12 @@ export function getMessageContentText(content) {
|
|
|
18
18
|
if (typeof content == "string")
|
|
19
19
|
text = content;
|
|
20
20
|
if (typeof content == "object")
|
|
21
|
-
text = content?.content
|
|
21
|
+
text = content?.content || "";
|
|
22
22
|
return text;
|
|
23
23
|
}
|
|
24
24
|
export function getMessageImageUrl(content) {
|
|
25
25
|
if (typeof content == "object")
|
|
26
|
-
return content?.
|
|
26
|
+
return content?.image_url?.url || "";
|
|
27
27
|
return null;
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
@@ -184,20 +184,17 @@ export class FmodeChat {
|
|
|
184
184
|
this.navCtrl = navCtrl;
|
|
185
185
|
this.ncloud = ncloud;
|
|
186
186
|
this.storage = storage;
|
|
187
|
-
//
|
|
187
|
+
// 初始化企业信息(异步,不阻塞)
|
|
188
188
|
this.initCompany();
|
|
189
189
|
if (chatSession?.id) {
|
|
190
190
|
this.chatSession = chatSession;
|
|
191
191
|
this.sessionId = chatSession?.id;
|
|
192
|
-
// 初始化消息管理器
|
|
193
|
-
this.initMessageManager();
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
// 即使没有chatSession,也尝试初始化消息管理器(用于新会话)
|
|
197
|
-
setTimeout(() => {
|
|
198
|
-
this.initMessageManager();
|
|
199
|
-
}, 100);
|
|
200
192
|
}
|
|
193
|
+
// 延迟初始化消息管理器(懒加载模式)
|
|
194
|
+
// 确保company先初始化完成
|
|
195
|
+
setTimeout(() => {
|
|
196
|
+
this.ensureMessageManager();
|
|
197
|
+
}, 0);
|
|
201
198
|
if (this.role?.id) {
|
|
202
199
|
this.voiceConfig = this.role?.get("voiceConfig");
|
|
203
200
|
if (this.voiceConfig?.autoTalk) {
|
|
@@ -268,6 +265,8 @@ export class FmodeChat {
|
|
|
268
265
|
* 获取消息列表(兼容老版本)
|
|
269
266
|
*/
|
|
270
267
|
async getMessageList() {
|
|
268
|
+
// 确保 messageManager 已初始化
|
|
269
|
+
await this.ensureMessageManager();
|
|
271
270
|
if (!this.messageManager) {
|
|
272
271
|
return [];
|
|
273
272
|
}
|
|
@@ -302,17 +301,33 @@ export class FmodeChat {
|
|
|
302
301
|
}
|
|
303
302
|
/**
|
|
304
303
|
* 初始化消息管理器
|
|
304
|
+
* 关键:即使没有chatSession.id也能初始化(新会话场景)
|
|
305
305
|
*/
|
|
306
|
-
initMessageManager() {
|
|
307
|
-
|
|
306
|
+
async initMessageManager() {
|
|
307
|
+
// 确保 company 已初始化
|
|
308
|
+
if (!this.company) {
|
|
309
|
+
await this.initCompany();
|
|
310
|
+
}
|
|
311
|
+
if (this.role && this.company) {
|
|
308
312
|
// 使用智能体对话场景的消息管理器
|
|
309
|
-
|
|
313
|
+
// chatSession可能暂时没有id(新会话),但manager仍然可以工作
|
|
314
|
+
this.messageManager = MessageManager.createForRole(this.chatSession || new Parse.Object("ChatSession"), this.role, this.company);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* 确保消息管理器已初始化(懒加载)
|
|
319
|
+
*/
|
|
320
|
+
async ensureMessageManager() {
|
|
321
|
+
if (!this.messageManager) {
|
|
322
|
+
await this.initMessageManager();
|
|
310
323
|
}
|
|
311
324
|
}
|
|
312
325
|
/**
|
|
313
326
|
* 初始化企业信息
|
|
314
327
|
*/
|
|
315
328
|
async initCompany() {
|
|
329
|
+
if (this.company)
|
|
330
|
+
return; // 已经初始化
|
|
316
331
|
const companyId = localStorage.getItem("company");
|
|
317
332
|
if (companyId) {
|
|
318
333
|
this.company = {
|
|
@@ -327,8 +342,10 @@ export class FmodeChat {
|
|
|
327
342
|
* 直接添加到MessageManager的_messageList,延迟保存
|
|
328
343
|
*/
|
|
329
344
|
async addMessage(content, scene = MessageScene.ROLE) {
|
|
345
|
+
// 确保 messageManager 已初始化
|
|
346
|
+
await this.ensureMessageManager();
|
|
330
347
|
if (!this.messageManager) {
|
|
331
|
-
console.warn("MessageManager
|
|
348
|
+
console.warn("MessageManager初始化失败,无法添加消息");
|
|
332
349
|
return;
|
|
333
350
|
}
|
|
334
351
|
try {
|
|
@@ -336,8 +353,9 @@ export class FmodeChat {
|
|
|
336
353
|
const messageObj = this.messageManager.addMessage(content, scene);
|
|
337
354
|
// 异步保存,不阻塞主流程
|
|
338
355
|
setTimeout(() => {
|
|
339
|
-
this.messageManager
|
|
356
|
+
this.messageManager?.saveMessage(messageObj);
|
|
340
357
|
}, 0);
|
|
358
|
+
return messageObj;
|
|
341
359
|
}
|
|
342
360
|
catch (error) {
|
|
343
361
|
console.error("添加消息失败:", error);
|
|
@@ -347,16 +365,18 @@ export class FmodeChat {
|
|
|
347
365
|
* 更新消息(优化版)
|
|
348
366
|
* 直接通过下标更新MessageManager中的消息
|
|
349
367
|
*/
|
|
350
|
-
updateMessage(
|
|
368
|
+
updateMessage(messageObj, content) {
|
|
351
369
|
if (!this.messageManager) {
|
|
352
370
|
console.warn("MessageManager未初始化,无法更新消息");
|
|
353
371
|
return;
|
|
354
372
|
}
|
|
355
373
|
try {
|
|
356
374
|
// 直接更新MessageManager中的消息
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
375
|
+
content = {
|
|
376
|
+
...messageObj.get("content"),
|
|
377
|
+
...content
|
|
378
|
+
};
|
|
379
|
+
messageObj.set("content", content);
|
|
360
380
|
if (messageObj) {
|
|
361
381
|
setTimeout(() => {
|
|
362
382
|
this.messageManager.saveMessage(messageObj);
|
|
@@ -471,37 +491,25 @@ export class FmodeChat {
|
|
|
471
491
|
// 提示词已经存在
|
|
472
492
|
return;
|
|
473
493
|
}
|
|
474
|
-
// 补全提示词
|
|
475
|
-
|
|
476
|
-
let insertIndex = systemIndex + 1;
|
|
477
|
-
let msgObj = new Parse.Object("Message");
|
|
478
|
-
msgObj.set("content", promptMsg);
|
|
479
|
-
this.messageList.splice(insertIndex, 0, msgObj);
|
|
494
|
+
// 补全提示词 - 使用 addMessage 确保正确保存
|
|
495
|
+
this.addMessage(promptMsg, MessageScene.ROLE);
|
|
480
496
|
return;
|
|
481
497
|
}
|
|
482
498
|
/**
|
|
483
499
|
* 角色提示词
|
|
484
500
|
* @returns
|
|
485
501
|
*/
|
|
486
|
-
loadRolePrompt() {
|
|
502
|
+
async loadRolePrompt() {
|
|
503
|
+
// 确保 messageManager 已初始化
|
|
504
|
+
await this.ensureMessageManager();
|
|
487
505
|
// 角色提示
|
|
488
506
|
let prompt = this.role?.get("prompt");
|
|
489
|
-
let promptMsg = { role: "user", content: prompt, hidden: true };
|
|
490
507
|
if (!prompt)
|
|
491
508
|
return; // 无提示词无需添加
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
return;
|
|
497
|
-
}
|
|
498
|
-
// 补全提示词
|
|
499
|
-
let systemIndex = this.messageList?.findIndex(item => this.getMessageProperty(item, 'role') == "system");
|
|
500
|
-
let insertIndex = systemIndex + 1;
|
|
501
|
-
let msgObj = new Parse.Object("Message");
|
|
502
|
-
msgObj.set("content", promptMsg);
|
|
503
|
-
this.messageList.splice(insertIndex, 0, msgObj);
|
|
504
|
-
// console.log(this.messageList)
|
|
509
|
+
this.rolePrompt = prompt;
|
|
510
|
+
// 使用 addMessage 添加提示词,确保正确保存
|
|
511
|
+
// let promptMsg:FmodeChatMessage = {role:"user",content:prompt,hidden:true}
|
|
512
|
+
// await this.addMessage(promptMsg, MessageScene.ROLE);
|
|
505
513
|
}
|
|
506
514
|
/**
|
|
507
515
|
* 发送消息
|
|
@@ -509,12 +517,14 @@ export class FmodeChat {
|
|
|
509
517
|
* @param imageUrl
|
|
510
518
|
*/
|
|
511
519
|
async sendMessage(message = "FmodeAiTest测试问题", imageUrl, onComplete, eventMap, voice) {
|
|
520
|
+
// 确保 messageManager 已初始化
|
|
521
|
+
await this.ensureMessageManager();
|
|
512
522
|
// 发消息自动置底
|
|
513
523
|
this.scrollToBottom && this.scrollToBottom();
|
|
514
524
|
// 为消息列表补全提示词
|
|
515
525
|
// await this.loadTalkSystemPrompt(this.role);
|
|
516
526
|
this.isPromptMessageAreaShow = false; // 发送第一条消息后,关闭提示看板
|
|
517
|
-
this.loadRolePrompt();
|
|
527
|
+
await this.loadRolePrompt();
|
|
518
528
|
// 构建用户消息
|
|
519
529
|
let userMessage;
|
|
520
530
|
if (!imageUrl) { // 纯文本
|
|
@@ -549,11 +559,14 @@ export class FmodeChat {
|
|
|
549
559
|
}
|
|
550
560
|
}
|
|
551
561
|
// 添加用户消息
|
|
552
|
-
|
|
562
|
+
this.addMessage(userMessage, MessageScene.ROLE);
|
|
553
563
|
// 获取最新消息列表用于补全
|
|
554
564
|
const messages = await this.getMessageList();
|
|
555
565
|
// 创建并发起一条新的消息补全
|
|
556
|
-
let completion = new FmodeChatCompletion(
|
|
566
|
+
let completion = new FmodeChatCompletion([
|
|
567
|
+
{ role: "user", content: this.rolePrompt }, // 角色提示词 不在消息列表
|
|
568
|
+
...this.fixMessageList(this.convertMessages(messages)) // 列表形式,确保灵活的图片消息格式接收
|
|
569
|
+
], {
|
|
557
570
|
model: this.currentModel?.get?.("code") || "fmode-1.6-cn"
|
|
558
571
|
});
|
|
559
572
|
// 生命周期:消息获取完成
|
|
@@ -577,9 +590,7 @@ export class FmodeChat {
|
|
|
577
590
|
createdAt: new Date()
|
|
578
591
|
};
|
|
579
592
|
// 添加AI回复消息占位符
|
|
580
|
-
await this.addMessage(aiMessagePlaceholder, MessageScene.ROLE);
|
|
581
|
-
const currentMessages = await this.getMessageList();
|
|
582
|
-
const aiMessageIndex = currentMessages.length - 1;
|
|
593
|
+
let newAiMessage = await this.addMessage(aiMessagePlaceholder, MessageScene.ROLE);
|
|
583
594
|
// 生命周期:用户发送消息回调
|
|
584
595
|
if (this.onUserSend) {
|
|
585
596
|
let sendResult = await this.onUserSend(this, userMessage);
|
|
@@ -590,29 +601,26 @@ export class FmodeChat {
|
|
|
590
601
|
isDirect: isDirect,
|
|
591
602
|
onComplete: onComplete || null
|
|
592
603
|
}).pipe(finalize(async () => {
|
|
593
|
-
let currentMessage = currentMessages[aiMessageIndex];
|
|
594
604
|
// 标记消息完成
|
|
595
|
-
this.
|
|
596
|
-
await this.updateMessage(aiMessageIndex, currentMessage);
|
|
605
|
+
this.updateMessage(newAiMessage, { complete: true });
|
|
597
606
|
// 在消息完成后生成语音(TalkMode)
|
|
598
607
|
if (this.isTalkMode) {
|
|
599
|
-
let content =
|
|
608
|
+
let content = newAiMessage?.get("content");
|
|
600
609
|
if (this.hasValidContent(content)) {
|
|
601
610
|
try {
|
|
602
611
|
let voice = await this.getVoiceByContentText(content, eventMap);
|
|
603
612
|
if (voice && voice.id) {
|
|
604
|
-
|
|
605
|
-
|
|
613
|
+
// 更新消息的voice属性
|
|
614
|
+
this.updateMessage(newAiMessage, { voice: voice });
|
|
606
615
|
// 通知SSML完成
|
|
607
616
|
eventMap?.onSSMLComplete && eventMap?.onSSMLComplete(voice);
|
|
608
617
|
// 播放语音
|
|
609
618
|
this.playChatVoice(this.voiceMap[voice?.id], {
|
|
610
619
|
onResult: (result) => {
|
|
611
620
|
if (result?.duration) {
|
|
612
|
-
|
|
613
|
-
voice
|
|
614
|
-
|
|
615
|
-
this.updateMessage(aiMessageIndex, currentMessage);
|
|
621
|
+
// 更新语音时长
|
|
622
|
+
const updatedVoice = { ...voice, duration: result?.duration };
|
|
623
|
+
this.updateMessage(newAiMessage, { voice: updatedVoice });
|
|
616
624
|
}
|
|
617
625
|
}
|
|
618
626
|
});
|
|
@@ -624,27 +632,24 @@ export class FmodeChat {
|
|
|
624
632
|
}
|
|
625
633
|
}
|
|
626
634
|
// 生命周期:消息获取完成
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
635
|
+
if (newAiMessage?.id) {
|
|
636
|
+
this.onMessage && this.onMessage(this, newAiMessage?.get("content"));
|
|
637
|
+
}
|
|
638
|
+
// 保存AI消息到数据库(必须在session保存之后)
|
|
639
|
+
if (newAiMessage) {
|
|
640
|
+
await this.messageManager?.saveMessage(newAiMessage);
|
|
630
641
|
}
|
|
631
642
|
})).subscribe(async (message) => {
|
|
632
|
-
|
|
633
|
-
await this.updateMessage(aiMessageIndex, message);
|
|
643
|
+
let content = message.content;
|
|
634
644
|
// 更新最新回复内容
|
|
635
|
-
this.latestAIResponse = this.getContentText(
|
|
645
|
+
this.latestAIResponse = this.getContentText(content);
|
|
636
646
|
// 生命周期:消息更新回调(实时更新)
|
|
637
647
|
if (this.onMessage && !message?.complete) {
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
this.onMessage(this, currentMsgs[currentMsgs?.length - 1]?.get("content"));
|
|
641
|
-
}
|
|
648
|
+
newAiMessage.set("content", message?.content);
|
|
649
|
+
this.onMessage(this, message);
|
|
642
650
|
}
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
let savedList = this.chatSession?.get("messageList")?.length;
|
|
646
|
-
if (currentMsgs?.length > savedList) {
|
|
647
|
-
await this.saveChatSession();
|
|
651
|
+
if (message?.complete) {
|
|
652
|
+
this.updateMessage(newAiMessage, content);
|
|
648
653
|
}
|
|
649
654
|
// 滚动到底部
|
|
650
655
|
this.scrollToBottom && this.scrollToBottom();
|
|
@@ -883,9 +888,11 @@ export class FmodeChat {
|
|
|
883
888
|
}
|
|
884
889
|
/**
|
|
885
890
|
* 保存单次会话
|
|
891
|
+
* 关键:在session保存后,立即更新消息管理器中的session引用并保存所有待处理消息
|
|
886
892
|
*/
|
|
887
893
|
async saveChatSession() {
|
|
888
|
-
|
|
894
|
+
const isNewSession = this.sessionId == "new";
|
|
895
|
+
if (isNewSession) {
|
|
889
896
|
this.chatSession = new this.ChatSession();
|
|
890
897
|
}
|
|
891
898
|
this.chatSession.set("title", this.genTitle());
|
|
@@ -899,8 +906,18 @@ export class FmodeChat {
|
|
|
899
906
|
this.chatSession.set("messageList", []);
|
|
900
907
|
}
|
|
901
908
|
this.chatSession = await this.chatSession.save();
|
|
902
|
-
|
|
909
|
+
// 关键:更新sessionId
|
|
910
|
+
const oldSessionId = this.sessionId;
|
|
903
911
|
this.sessionId = this.chatSession?.id;
|
|
912
|
+
// 关键:更新MessageManager中的session引用
|
|
913
|
+
if (this.messageManager) {
|
|
914
|
+
this.messageManager.updateChatSession(this.chatSession);
|
|
915
|
+
// 保存所有待处理的消息(新会话的消息或之前因缺少session而未保存的消息)
|
|
916
|
+
// if (this.sessionId) {
|
|
917
|
+
await this.messageManager.savePendingMessages();
|
|
918
|
+
// }
|
|
919
|
+
}
|
|
920
|
+
this.onChatSaved && this.onChatSaved(this);
|
|
904
921
|
if (this.sessionId) {
|
|
905
922
|
// 修改URL地址为sessionId,方便分享或切换 角色页面 => 会话页面
|
|
906
923
|
let newHref = `${window.location.origin}/chat/pro/chat/${this.sessionId}`;
|
|
@@ -916,11 +933,16 @@ export class FmodeChat {
|
|
|
916
933
|
const messages = await this.getMessageList();
|
|
917
934
|
const lastMessage = messages[messages?.length - 1];
|
|
918
935
|
let messagePreview = "";
|
|
919
|
-
|
|
920
|
-
|
|
936
|
+
// 处理不同格式的content
|
|
937
|
+
const content = lastMessage?.get("content");
|
|
938
|
+
if (typeof content === "string") {
|
|
939
|
+
messagePreview = content.slice(0, 20);
|
|
940
|
+
}
|
|
941
|
+
else if (content?.text) {
|
|
942
|
+
messagePreview = content.text.slice(0, 20);
|
|
921
943
|
}
|
|
922
|
-
else if (Array.isArray(
|
|
923
|
-
const textItem =
|
|
944
|
+
else if (Array.isArray(content)) {
|
|
945
|
+
const textItem = content.find(item => item?.text);
|
|
924
946
|
messagePreview = textItem?.text?.slice(0, 20) || "";
|
|
925
947
|
}
|
|
926
948
|
let newChat = {
|
|
@@ -932,13 +954,18 @@ export class FmodeChat {
|
|
|
932
954
|
};
|
|
933
955
|
if (this.chatServ && !this.chatServ?.chatList?.length)
|
|
934
956
|
this.chatServ.chatList = [];
|
|
935
|
-
let index = this.chatServ?.chatList?.
|
|
957
|
+
let index = this.chatServ?.chatList?.findIndex(item => item?.sid == newChat?.sid);
|
|
936
958
|
if (index > -1) {
|
|
937
959
|
this.chatServ.chatList[index] = newChat;
|
|
938
960
|
}
|
|
939
961
|
else {
|
|
940
962
|
this.chatServ?.chatList.unshift(newChat);
|
|
941
963
|
}
|
|
964
|
+
// 更新chatServ中的chatMap(将new的key替换为真实sessionId)
|
|
965
|
+
if (isNewSession && oldSessionId === "new") {
|
|
966
|
+
this.chatServ.chatMap[this.sessionId] = this;
|
|
967
|
+
delete this.chatServ.chatMap["new"];
|
|
968
|
+
}
|
|
942
969
|
}
|
|
943
970
|
}
|
|
944
971
|
getInviteUrl(url) {
|
|
@@ -962,11 +989,13 @@ export class FmodeChat {
|
|
|
962
989
|
return this.title;
|
|
963
990
|
}
|
|
964
991
|
fixMessageList(messages) {
|
|
965
|
-
|
|
992
|
+
let list = messages.filter((msg) => { return typeof msg.content.role == "string" && msg.content.content; }).map((msg) => { return { role: msg.content.role, content: msg.content.content }; });
|
|
993
|
+
console.log("messages", messages, list);
|
|
994
|
+
return list;
|
|
966
995
|
}
|
|
967
996
|
nowStr() {
|
|
968
997
|
let now = new Date();
|
|
969
998
|
return `${now.getFullYear()}/${now.getMonth() + 1}/${now.getDate()} ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`;
|
|
970
999
|
}
|
|
971
1000
|
}
|
|
972
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm1vZGUtY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvY29yZS9hZ2VudC9jaGF0L2Ztb2RlLWNoYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxRCxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDbEYsdUdBQXVHO0FBQ3ZHLE9BQU8sRUFBQyxVQUFVLEVBQWtDLE1BQU0scUJBQXFCLENBQUM7QUFBQSxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RILE9BQU8sRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUduRSxrREFBa0Q7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekQsNERBQTREO0FBQzVELDhDQUE4QztBQUM5QyxxQkFBcUI7QUFHckIsTUFBTSwyQkFBMkIsR0FBRyxzQkFBc0IsQ0FBQztBQUMzRCxNQUFNLHlCQUF5QixHQUFHLG9CQUFvQixDQUFDO0FBSXZELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxPQUE4QztJQUNoRixJQUFJLElBQUksR0FBRyxFQUFFLENBQUE7SUFDYixJQUFHLE9BQU8sT0FBTyxJQUFJLFFBQVE7UUFBRSxJQUFJLEdBQUcsT0FBTyxDQUFBO0lBQzdDLElBQUcsT0FBTyxPQUFPLElBQUksUUFBUTtRQUFFLElBQUksR0FBRyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUE7SUFDbEUsT0FBTyxJQUFJLENB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QUFJLENBQUEsRUFBRSxDQUFBLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzVELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUE7SUFDckIsQ0FBQztJQUNELGNBQWMsQ0FBQyxRQUEyQjtRQUN0QyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFBLEVBQUUsR0FBQyxPQUFPLEVBQUMsSUFBSSxFQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUMsT0FBTyxFQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFFRCxNQUFNO1FBQ0YsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQixPQUFPLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUE7SUFDaEksQ0FBQztDQUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVmZmVyVGltZSwgY29uY2F0TWFwLCBPYnNlcnZhYmxlLCBPYnNlcnZlcixkZWxheSwgZmluYWxpemUgfSBmcm9tIFwicnhqc1wiXHJcbi8vIHZhciBidWZmZXJUaW1lOmFueSwgY29uY2F0TWFwOmFueSwgT2JzZXJ2YWJsZTphbnksIE9ic2VydmVyOmFueSxkZWxheTphbnksIGZpbmFsaXplOmFueSxPYnNlcnZlcjphbnlcclxuaW1wb3J0IHtGbW9kZVBhcnNlLEZtb2RlT2JqZWN0LEZtb2RlUXVlcnksRm1vZGVVc2VyfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9wYXJzZVwiO2NvbnN0IFBhcnNlID0gRm1vZGVQYXJzZS53aXRoKFwibm92YVwiKTtcclxuaW1wb3J0IHsgRm1vZGVUVFMsIEZtb2RlVFRTUHJvdmlkZXJEb3ViYW8gfSBmcm9tIFwiLi4vLi4vdm9pY2UvdHRzXCI7XHJcbmltcG9ydCB7IE5vdmFDbG91ZFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vbm92YS1jbG91ZFwiO1xyXG5pbXBvcnQgeyBOb3ZhU3RvcmFnZSB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3N0b3JhZ2VcIjtcclxuLy8gaW1wb3J0IHsgTmF2Q29udHJvbGxlciB9IGZyb20gXCJAaW9uaWMvYW5ndWxhclwiO1xyXG5pbXBvcnQgeyBQcm9tcHRUZW1wbGF0ZSB9IGZyb20gXCJAbGFuZ2NoYWluL2NvcmUvcHJvbXB0c1wiO1xyXG5pbXBvcnQgeyBnZXRGb3JtYXRUcGwgfSBmcm9tIFwiLi4vcHJvbXB0L3Byb21wdC11dGlsXCI7XHJcbmltcG9ydCB7IENoYXRJbWFnZUNvbnRlbnRJdGVtLCBGbW9kZUNoYXRFdmVudE1hcCwgRm1vZGVDaGF0TWVzc2FnZSwgRm1vZGVDaGF0TWVzc2FnZVZvaWNlLCBGbW9kZUNoYXRWb2ljZUNvbmZpZyB9IGZyb20gXCIuL2ludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBGbW9kZUNoYXRDb21wbGV0aW9uIH0gZnJvbSBcIi4vY29tcGxldGlvblwiO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2NlbmUsIE1lc3NhZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vbWVzc2FnZVwiO1xyXG4vLyBpbXBvcnQgeyBQcm9tcHRUZW1wbGF0ZSB9IGZyb20gXCIuL2xpYi9sYW5nY2hhaW4vcHJvbXB0c1wiO1xyXG4vLyBpbXBvcnQgeyBFbGVtZW50UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuLy8gdmFyIFBhcnNlOmFueSA9IHt9XHJcblxyXG5cclxuY29uc3QgUHJvbXB0VHBsVGFsa1NTTUxPdXRwdXRDb2RlID0gXCJ0YWxrLXNzbWwtb3V0cHV0LXRwbFwiO1xyXG5jb25zdCBQcm9tcHRUcGxUYWxrVGV4dFNTTUxDb2RlID0gXCJ0YWxrLXRleHQtc3NtbC10cGxcIjtcclxuXHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldE1lc3NhZ2VDb250ZW50VGV4dChjb250ZW50OmFueXxzdHJpbmd8QXJyYXk8Q2hhdEltYWdlQ29udGVudEl0ZW0+KXtcclxuICAgIGxldCB0ZXh0ID0gXCJcIlxyXG4gICAgaWYodHlwZW9mIGNvbnRlbnQgPT0gXCJzdHJpbmdcIikgdGV4dCA9IGNvbnRlbnRcclxuICAgIGlmKHR5cGVvZiBjb250ZW50ID09IFwib2JqZWN0XCIpIHRleHQgPSBjb250ZW50Py5jb250ZW50Py50ZXh0IHx8IFwiXCJcclxuICAgIHJldHVybiB0ZXh0XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldE1lc3NhZ2VJbWFnZVVybChjb250ZW50OmFueXxzdHJpbmd8QXJyYXk8Q2hhdEltYWdlQ29udGVudEl0ZW0+KXtcclxuICAgIGlmKHR5cGVvZiBjb250ZW50ID09IFwib2JqZWN0XCIpIHJldHVybiBjb250ZW50Py5jb250ZW50Py5pbWFnZV91cmw/LnVybCB8fCBcIlwiXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbi8qKlxyXG4gKiBGbW9kZUNoYXQg6IGK5aSp5a+56K+d57G7XHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBGbW9kZUNoYXR7XHJcblxyXG4gICAgdGl0bGU6c3RyaW5nXHJcbiAgICBzZXNzaW9uSWQ6c3RyaW5nXHJcbiAgICBDaGF0U2Vzc2lvbiA9IFBhcnNlLk9iamVjdC5leHRlbmQoXCJDaGF0U2Vzc2lvblwiKVxyXG4gICAgY2hhdFNlc3Npb246Rm1vZGVPYmplY3RcclxuICAgIHJvbGU6YW55XHJcbiAgICBwcml2YXRlIG1lc3NhZ2VNYW5hZ2VyOiBNZXNzYWdlTWFuYWdlciB8IG51bGwgPSBudWxsOyAvLyDmtojmga/nrqHnkIblmahcclxuICAgIHByaXZhdGUgY29tcGFueTogRm1vZGVPYmplY3R8YW55OyAvLyDkvIHkuJrlr7nosaFcclxuICAgIGxhdGVzdEFJUmVzcG9uc2U6c3RyaW5nfHVuZGVmaW5lZCA9IGBgXHJcbiAgICBjaGF0U2VydjphbnlcclxuICAgIHB1YmxpYyB1c2VySW5wdXQ6c3RyaW5nID0gYGA7XHJcbiAgICBwdWJsaWMgdXNlckltYWdlOnN0cmluZyA9IGBgO1xyXG4gICAgaXNEaXJlY3Q6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIG1vZGU6XCJtb2RhbFwifFwicGFnZVwiID0gXCJwYWdlXCI7XHJcbiAgICAvKipcclxuICAgICAqIOWHveaVsOeUn+WRveWRqOacn1xyXG4gICAgICovXHJcbiAgICBvbkNoYXRTYXZlZDooY2hhdDpGbW9kZUNoYXQpPT52b2lkXHJcbiAgICBvbk1lc3NhZ2U6KGNoYXQ6Rm1vZGVDaGF0LG1lc3NhZ2U6Rm1vZGVDaGF0TWVzc2FnZSk9PnZvaWRcclxuICAgIG9uVXNlclNlbmQ6KGNoYXQ6Rm1vZGVDaGF0LG1lc3NhZ2U6Rm1vZGVDaGF0TWVzc2FnZSk9PmJvb2xlYW58UHJvbWlzZTxib29sZWFuPlxyXG4gICAgb25DbG9zZTooY2hhdDpGbW9kZUNoYXQpPT5ib29sZWFufFByb21pc2U8Ym9vbGVhbj5cclxuICAgIC8vIG9uVXNlcklucHV0OihjaGF0OkZtb2RlQ2hhdCxtZXNzYWdlOkZtb2RlQ2hhdE1lc3NhZ2UpPT5ib29sZWFufFByb21pc2U8Ym9vbGVhbj5cclxuXHJcbiAgICAvLyDnlYzpnaLlip/og73mmL7npLrmjqfliLZcclxuICAgIGhpZGVTaGFyZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICBoaWRlTW9kYWxTZWxlY3Q6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaGlkZUlucHV0UHJldmlldzpib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Y+v6YCJ5qih5Z6L5YiX6KGo5Yqg6L29XHJcbiAgICAgKi9cclxuICAgIG1vZGVsTGlzdDpBcnJheTxGbW9kZU9iamVjdD5cclxuICAgIGN1cnJlbnRNb2RlbDpGbW9kZU9iamVjdFxyXG4gICAgYXN5bmMgbG9hZE1vZGVsTGlzdChtb2RlbD86Rm1vZGVPYmplY3Qpe1xyXG4gICAgICAgIGlmKHRoaXMubW9kZWxMaXN0Py5sZW5ndGgpIHJldHVyblxyXG4gICAgICAgIGxldCBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShcIkNoYXRNb2RlbFwiKVxyXG4gICAgICAgIHF1ZXJ5Lm5vdEVxdWFsVG8oXCJpc0RlbGV0ZWRcIix0cnVlKVxyXG4gICAgICAgIHF1ZXJ5LmVxdWFsVG8oXCJpc0VuYWJsZWRcIix0cnVlKVxyXG4gICAgICAgIHF1ZXJ5LmFkZEFzY2VuZGluZyhcImluZGV4XCIpXHJcbiAgICAgICAgdGhpcy5tb2RlbExpc3QgPSBhd2FpdCBxdWVyeS5maW5kKCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TW9kZWwgPSBtb2RlbCB8fCB0aGlzLm1vZGVsTGlzdD8uZmluZChpdGVtPT5pdGVtLmdldChcImNvZGVcIik9PVwiZm1vZGUtMS42LWNuXCIpXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0aGlzLmN1cnJlbnRNb2RlbFwiLHRoaXMuY3VycmVudE1vZGVsKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIOiZmuaLn+W9ouixoeWxleekuueKtuaAgVxyXG4gICAgICovXHJcbiAgICBpc0F2YXRhclNob3c6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgYXZhdGFyTW9kZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgYXZhdGFyQ29uZmlnOmFueXx1bmRlZmluZWQ7XHJcbiAgICBzaG93QXZhdGFyKCl7XHJcbiAgICAgICAgdGhpcy5hdmF0YXJDb25maWcgPSB0aGlzLnJvbGU/LmdldChcImF2YXRhckNvbmZpZ1wiKVxyXG4gICAgICAgIGlmKHRoaXMuYXZhdGFyQ29uZmlnKXtcclxuICAgICAgICAgICAgdGhpcy5pc0F2YXRhclNob3cgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZih0aGlzLmF2YXRhckNvbmZpZz8uaW1hZ2Upe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdmF0YXJDb25maWcuaW1hZ2Uud2FpdGluZyA9IHRoaXMuYXZhdGFyQ29uZmlnLmltYWdlLndhaXRpbmcgfHwgdGhpcy5yb2xlPy5nZXQoXCJ0aHVtYlwiKSB8fCB0aGlzLnJvbGU/LmdldChcImF2YXRhclwiKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hdmF0YXJNb2RlID0gXCJpbWFnZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodGhpcy5hdmF0YXJDb25maWc/LnZpZGVvKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXZhdGFyQ29uZmlnLnZpZGVvLndhaXRpbmcgPSB0aGlzLmF2YXRhckNvbmZpZy52aWRlby53YWl0aW5nXHJcbiAgICAgICAgICAgICAgICB0aGlzLmF2YXRhck1vZGUgPSBcInZpZGVvXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmihOe9ruaPkOekuuivjeW8ueeql+aYr+WQpuWxleekulxyXG4gICAgICovXHJcbiAgICBpc1Byb21wdE1vZGFsT3Blbjpib29sZWFuID0gZmFsc2U7XHJcbiAgICBpc1Byb21wdE1lc3NhZ2VBcmVhU2hvdzpib29sZWFuID0gdHJ1ZTtcclxuICAgIHByb21wdExpc3Q6YW55ID0gW11cclxuXHJcbiAgICAvKipcclxuICAgICAqIOi+k+WFpeaMiemSruWMuuWfn1xyXG4gICAgICovXHJcbiAgICBmb2N1c1VzZXJJbnB1dDpGdW5jdGlvbiA9ICgpPT57fVxyXG4gICAgbmF2Q3RybDphbnkgLy8gTmF2Q29udHJvbGxlclxyXG4gICAgIGxlZnRCdXR0b25zOkFycmF5PGFueXx7dGl0bGU/OnN0cmluZyxzaG93VGl0bGU/OnN0cmluZ30+ID0gW1xyXG4gICAgICAgIC8vIOaPkOekuiDlvZPop5LoibLphY3nva7pooTorr7mj5DnpLror43ml7Yg5pi+56S6XHJcbiAgICAgICAge3RpdGxlOlwi54G15oSfXCIsaWNvbjpcImNvbG9yLXdhbmQtb3V0bGluZVwiLG9uQ2xpY2s6KCk9PntcclxuICAgICAgICAgIHRoaXMuaXNQcm9tcHRNb2RhbE9wZW4gPSB0cnVlXHJcbiAgICAgICAgfSxzaG93OigpPT57XHJcbiAgICAgICAgICByZXR1cm4gdGhpcz8ucHJvbXB0TGlzdD8ubGVuZ3RoXHJcbiAgICAgICAgfX0sXHJcbiAgICAgICAge3RpdGxlOlwi6KeS6ImyXCIsaWNvbjpcInBlb3BsZS1vdXRsaW5lXCIsb25DbGljazooKT0+e1xyXG4gICAgICAgICAgdGhpcy5uYXZDdHJsPy5uYXZpZ2F0ZVJvb3QoXCIvY2hhdC9wcm8vbWFza1wiKTtcclxuICAgICAgICB9LHNob3c6KCk9PntyZXR1cm4gdHJ1ZX19LFxyXG4gICAgICAgIHt0aXRsZTpcIuWRvOWPq1wiLGljb246XCJjYWxsLW91dGxpbmVcIixvbkNsaWNrOigpPT57XHJcbiAgICAgICAgICAgIHRoaXMuY2hhdFNlcnY/LmNhbGxSb2xlKHRoaXMucm9sZSlcclxuICAgICAgICB9LHNob3c6KCk9PntcclxuICAgICAgICAgIHJldHVybiB0aGlzPy5yb2xlPy5nZXQoJ3ZvaWNlQ29uZmlnJyk7XHJcbiAgICAgICAgfX0sXHJcbiAgICAgIF1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKblvIDlkK/or63pn7Pmtojmga/mqKHlvI/vvIjljZXmrKHvvIlcclxuICAgICAqL1xyXG4gICAgaXNWb2ljZUlucHV0TW9kZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICBpc1RleHRpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5byA5ZCv5a6e5pe25a+56K+d5qih5byP77yI5a6e5pe277yJXHJcbiAgICAgKiBAZGVzY1xyXG4gICAgICog5byA5ZCvc3NtbCBzeXN0ZW3mj5DnpLror41cclxuICAgICAqIOW8gOWQr+WbnuetlOaWh+acrOmZpHhtbOaYvuekuuaooeW8j1xyXG4gICAgICovXHJcbiAgICB2b2ljZUNvbmZpZzpGbW9kZUNoYXRWb2ljZUNvbmZpZ3x1bmRlZmluZWRcclxuICAgIGlzVGFsa01vZGU6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgU1NNTFJvbGVWb2ljZTpzdHJpbmcgPSBcInpoLUNOLVhpYW94aWFvTmV1cmFsXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmu5rliqjoh7Pmtojmga/ljLrln5/lupXpg6jmlrnms5VcclxuICAgICAqIEBkZXNjIOmAmui/h2NoYXQtcGFuZWznrYnogYrlpKnpnaLmnb/vvIzotYvlgLzor6Xmlrnms5VcclxuICAgICAqL1xyXG4gICAgc2Nyb2xsQ29tcDphbnkgLy8gRWxlbWVudFJlZjtcclxuICAgIC8vIHNjcm9sbFRvQm90dG9tOkZ1bmN0aW9uO1xyXG4gICAgc2Nyb2xsVG9Cb3R0b20oY29tcD86YW55KXtcclxuICAgICAgICBjb21wID0gY29tcCB8fCB0aGlzLnNjcm9sbENvbXA7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coY29tcClcclxuICAgICAgICBpZihjb21wPy5uYXRpdmVFbGVtZW50Py5zY3JvbGxIZWlnaHQpe1xyXG4gICAgICAgICAgY29tcC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IGNvbXAubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS+nei1luacjeWKoVxyXG4gICAgICovXHJcbiAgICBuY2xvdWQ6Tm92YUNsb3VkU2VydmljZTtcclxuICAgIHN0b3JhZ2U6Tm92YVN0b3JhZ2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgc2Vzc2lvbklkOnN0cmluZyxyb2xlPzpGbW9kZU9iamVjdCxjaGF0U2Vzc2lvbj86Rm1vZGVPYmplY3QsY2hhdFNlcnY/OmFueSxcclxuICAgICAgICBuYXZDdHJsPzphbnksLy9OYXZDb250cm9sbGVyLFxyXG4gICAgICAgIG5jbG91ZD86Tm92YUNsb3VkU2VydmljZSxcclxuICAgICAgICBzdG9yYWdlPzpOb3ZhU3RvcmFnZSxcclxuICAgICAgICApe1xyXG4gICAgICAgIHRoaXMuY2hhdFNlcnYgPSBjaGF0U2VydlxyXG4gICAgICAgIHRoaXMucm9sZSA9IHJvbGVcclxuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZFxyXG4gICAgICAgIHRoaXMubmF2Q3RybCA9IG5hdkN0cmxcclxuICAgICAgICB0aGlzLm5jbG91ZCA9IG5jbG91ZFxyXG4gICAgICAgIHRoaXMuc3RvcmFnZSA9IHN0b3JhZ2VcclxuXHJcbiAgICAgICAgLy8g5Yid5aeL5YyW5LyB5Lia5L+h5oGvXHJcbiAgICAgICAgdGhpcy5pbml0Q29tcGFueSgpO1xyXG5cclxuICAgICAgICBpZihjaGF0U2Vzc2lvbj8uaWQpe1xyXG4gICAgICAgICAgICB0aGlzLmNoYXRTZXNzaW9uID0gY2hhdFNlc3Npb247XHJcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gY2hhdFNlc3Npb24/LmlkO1xyXG5cclxuICAgICAgICAgICAgLy8g5Yid5aeL5YyW5raI5oGv566h55CG5ZmoXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdE1lc3NhZ2VNYW5hZ2VyKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8g5Y2z5L2/5rKh5pyJY2hhdFNlc3Npb27vvIzkuZ/lsJ3or5XliJ3lp4vljJbmtojmga/nrqHnkIblmajvvIjnlKjkuo7mlrDkvJror53vvIlcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRNZXNzYWdlTWFuYWdlcigpO1xyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodGhpcy5yb2xlPy5pZCl7XHJcbiAgICAgICAgICAgIHRoaXMudm9pY2VDb25maWcgPSB0aGlzLnJvbGU/LmdldChcInZvaWNlQ29uZmlnXCIpXHJcbiAgICAgICAgICAgIGlmKHRoaXMudm9pY2VDb25maWc/LmF1dG9UYWxrKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUYWxrTW9kZSA9IHRoaXMuaXNUYWxrTW9kZSB8fCB0aGlzLnZvaWNlQ29uZmlnPy5hdXRvVGFsaztcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNEaXJlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vID09PT09PT09PT0g5raI5oGv5YiX6KGo5o6l5Y+jID09PT09PT09PT1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIm+W7uumihOiniOa2iOaBr+eahEZtb2RlT2JqZWN0XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVByZXZpZXdNZXNzYWdlKHJvbGU6IHN0cmluZywgY29udGVudDogYW55LCB2b2ljZT86IGFueSk6IEZtb2RlT2JqZWN0IHtcclxuICAgICAgICBjb25zdCBNZXNzYWdlID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIk1lc3NhZ2VcIik7XHJcbiAgICAgICAgY29uc3QgcHJldmlld01lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpO1xyXG5cclxuICAgICAgICBwcmV2aWV3TWVzc2FnZS5zZXQoXCJyb2xlXCIsIHJvbGUpO1xyXG4gICAgICAgIHByZXZpZXdNZXNzYWdlLnNldChcImNvbnRlbnRcIiwgY29udGVudCk7XHJcbiAgICAgICAgcHJldmlld01lc3NhZ2Uuc2V0KFwiY29tcGxldGVcIiwgdHJ1ZSk7XHJcbiAgICAgICAgcHJldmlld01lc3NhZ2Uuc2V0KFwiY3JlYXRlZEF0XCIsIG5ldyBEYXRlKCkpO1xyXG5cclxuICAgICAgICBpZiAodm9pY2UpIHtcclxuICAgICAgICAgICAgcHJldmlld01lc3NhZ2Uuc2V0KFwidm9pY2VcIiwgdm9pY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByZXZpZXdNZXNzYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5raI5oGv5bGe5oCn55qE6L6F5Yqp5pa55rOVXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0TWVzc2FnZVByb3BlcnR5KG1zZzogRm1vZGVPYmplY3QgfCB1bmRlZmluZWQsIHByb3A6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgaWYgKCFtc2cpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuIG1zZy5nZXQocHJvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDorr7nva7mtojmga/lsZ7mgKfnmoTovoXliqnmlrnms5VcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRNZXNzYWdlUHJvcGVydHkobXNnOiBGbW9kZU9iamVjdCB8IHVuZGVmaW5lZCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFtc2cpIHJldHVybjtcclxuICAgICAgICBtc2cuc2V0KHByb3AsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWwhkZtb2RlT2JqZWN06L2s5o2i5Li6Rm1vZGVDaGF0TWVzc2FnZeagvOW8j+eahOWFvOWuueaWueazlVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbnZlcnRUb01lc3NhZ2VGb3JtYXQobXNnOiBGbW9kZU9iamVjdCB8IHVuZGVmaW5lZCk6IGFueSB7XHJcbiAgICAgICAgaWYgKCFtc2cpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IG1zZy5pZCxcclxuICAgICAgICAgICAgcm9sZTogdGhpcy5nZXRNZXNzYWdlUHJvcGVydHkobXNnLCAncm9sZScpLFxyXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShtc2csICdjb250ZW50JyksXHJcbiAgICAgICAgICAgIGNvbXBsZXRlOiB0aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShtc2csICdjb21wbGV0ZScpLFxyXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IHRoaXMuZ2V0TWVzc2FnZVByb3BlcnR5KG1zZywgJ2NyZWF0ZWRBdCcpIHx8IG1zZy5jcmVhdGVkQXQsXHJcbiAgICAgICAgICAgIHZvaWNlOiB0aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShtc2csICd2b2ljZScpLFxyXG4gICAgICAgICAgICBjaWQ6IHRoaXMuZ2V0TWVzc2FnZVByb3BlcnR5KG1zZywgJ2NpZCcpLFxyXG4gICAgICAgICAgICBqc29uOiB0aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShtc2csICdqc29uJyksXHJcbiAgICAgICAgICAgIGhpZGRlbjogdGhpcy5nZXRNZXNzYWdlUHJvcGVydHkobXNnLCAnaGlkZGVuJyksXHJcbiAgICAgICAgICAgIC8vIOS/neWtmOWOn+Wni+WvueixoeW8leeUqFxyXG4gICAgICAgICAgICBfb3JpZ2luYWw6IG1zZ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmibnph4/ovazmjaLmtojmga/liJfooahcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb252ZXJ0TWVzc2FnZXMobWVzc2FnZXM6IEZtb2RlT2JqZWN0W10pOiBhbnlbXSB7XHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLm1hcChtc2cgPT4gdGhpcy5jb252ZXJ0VG9NZXNzYWdlRm9ybWF0KG1zZykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5raI5oGv5YiX6KGo77yI5YW85a656ICB54mI5pys77yJXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldE1lc3NhZ2VMaXN0KCk6IFByb21pc2U8Rm1vZGVPYmplY3RbXT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlTWFuYWdlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOebtOaOpei/lOWbnkZtb2RlT2JqZWN05pWw57uE77yM5peg6ZyA6L2s5o2iXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPlua2iOaBr+WIl+ihqO+8iOWQjOatpeeJiOacrO+8jOS8mOWMlueJiO+8iVxyXG4gICAgICog55u05o6l6L+U5ZueTWVzc2FnZU1hbmFnZXLnmoRGbW9kZU9iamVjdFtd77yM6YG/5YWN5qC85byP6L2s5o2iXHJcbiAgICAgKi9cclxuICAgIGdldCBtZXNzYWdlTGlzdCgpOiBGbW9kZU9iamVjdFtdIHtcclxuICAgICAgICAvLyDlpoLmnpzmsqHmnInmtojmga/nrqHnkIblmajvvIzov5Tlm57nqbrmlbDnu4RcclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g55u05o6l6K6/6ZeuTWVzc2FnZU1hbmFnZXLnmoRfbWVzc2FnZUxpc3TvvIzov5Tlm55GbW9kZU9iamVjdFtdXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZU9iamVjdHMgPSB0aGlzLm1lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VMaXN0KCk7XHJcblxyXG4gICAgICAgIGlmICghbWVzc2FnZU9iamVjdHMgfHwgbWVzc2FnZU9iamVjdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOebtOaOpei/lOWbnkZtb2RlT2JqZWN05pWw57uE77yM5peg6ZyA6L2s5o2iXHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VPYmplY3RzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K6+572u5raI5oGv5YiX6KGo77yI5Li76KaB55So5LqO5YW85a656ICB54mI5pys77yJXHJcbiAgICAgKi9cclxuICAgIHNldCBtZXNzYWdlTGlzdChtZXNzYWdlczogRm1vZGVPYmplY3RbXSkge1xyXG4gICAgICAgIC8vIOi/meS4quaWueazleS4u+imgeeUqOS6juWFvOWuue+8jOWunumZheaVsOaNrueUsU1lc3NhZ2VNYW5hZ2Vy566h55CGXHJcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlTWFuYWdlci5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5raI5oGv566h55CG5ZmoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdE1lc3NhZ2VNYW5hZ2VyKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNoYXRTZXNzaW9uICYmIHRoaXMucm9sZSAmJiB0aGlzLmNvbXBhbnkpIHtcclxuICAgICAgICAgICAgLy8g5L2/55So5pm66IO95L2T5a+56K+d5Zy65pmv55qE5raI5oGv566h55CG5ZmoXHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZU1hbmFnZXIgPSBNZXNzYWdlTWFuYWdlci5jcmVhdGVGb3JSb2xlKHRoaXMuY2hhdFNlc3Npb24sIHRoaXMucm9sZSwgdGhpcy5jb21wYW55KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMluS8geS4muS/oeaBr1xyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0Q29tcGFueSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBjb21wYW55SWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNvbXBhbnlcIik7XHJcbiAgICAgICAgaWYgKGNvbXBhbnlJZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBhbnkgPSB7XHJcbiAgICAgICAgICAgICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNvbXBhbnlcIixcclxuICAgICAgICAgICAgICAgIG9iamVjdElkOiBjb21wYW55SWRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmt7vliqDmtojmga/vvIjkvJjljJbniYjvvIlcclxuICAgICAqIOebtOaOpea3u+WKoOWIsE1lc3NhZ2VNYW5hZ2Vy55qEX21lc3NhZ2VMaXN077yM5bu26L+f5L+d5a2YXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFkZE1lc3NhZ2UoXHJcbiAgICAgICAgY29udGVudDogRm1vZGVDaGF0TWVzc2FnZSxcclxuICAgICAgICBzY2VuZTogTWVzc2FnZVNjZW5lID0gTWVzc2FnZVNjZW5lLlJPTEVcclxuICAgICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlTWFuYWdlcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJNZXNzYWdlTWFuYWdlcuacquWIneWni+WMlu+8jOaXoOazlea3u+WKoOa2iOaBr1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8g55u05o6l5re75Yqg5YiwTWVzc2FnZU1hbmFnZXLvvIzojrflj5ZGbW9kZU9iamVjdFxyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlT2JqID0gdGhpcy5tZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlKGNvbnRlbnQsIHNjZW5lKTtcclxuXHJcbiAgICAgICAgICAgIC8vIOW8guatpeS/neWtmO+8jOS4jemYu+WhnuS4u+a1geeoi1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZU1hbmFnZXIuc2F2ZU1lc3NhZ2UobWVzc2FnZU9iaik7XHJcbiAgICAgICAgICAgIH0sIDApO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwi5re75Yqg5raI5oGv5aSx6LSlOlwiLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pu05paw5raI5oGv77yI5LyY5YyW54mI77yJXHJcbiAgICAgKiDnm7TmjqXpgJrov4fkuIvmoIfmm7TmlrBNZXNzYWdlTWFuYWdlcuS4reeahOa2iOaBr1xyXG4gICAgICovXHJcbiAgICB1cGRhdGVNZXNzYWdlKFxyXG4gICAgICAgIGluZGV4OiBudW1iZXIsXHJcbiAgICAgICAgY29udGVudDogUGFydGlhbDxGbW9kZUNoYXRNZXNzYWdlPlxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk1lc3NhZ2VNYW5hZ2Vy5pyq5Yid5aeL5YyW77yM5peg5rOV5pu05paw5raI5oGvXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyDnm7TmjqXmm7TmlrBNZXNzYWdlTWFuYWdlcuS4reeahOa2iOaBr1xyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VNYW5hZ2VyLnVwZGF0ZU1lc3NhZ2UoaW5kZXgsIGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgLy8g5byC5q2l5L+d5a2Y77yM5LiN6Zi75aGe5Li75rWB56iLXHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VPYmogPSB0aGlzLm1lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2UoaW5kZXgpO1xyXG4gICAgICAgICAgICBpZiAobWVzc2FnZU9iaikge1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTWFuYWdlci5zYXZlTWVzc2FnZShtZXNzYWdlT2JqKTtcclxuICAgICAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLmm7TmlrDmtojmga/lpLHotKU6XCIsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgJrov4fkuIvmoIfojrflj5bmtojmga/vvIjkvJjljJbniYjvvIlcclxuICAgICAqL1xyXG4gICAgZ2V0TWVzc2FnZShpbmRleDogbnVtYmVyKTogRm1vZGVPYmplY3QgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlTWFuYWdlcikgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgLy8g55u05o6l6L+U5ZueRm1vZGVPYmplY3TvvIzml6DpnIDovazmjaJcclxuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlTWFuYWdlci5nZXRNZXNzYWdlKGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluacgOaWsOa2iOaBr1xyXG4gICAgICovXHJcbiAgICBnZXRMYXN0TWVzc2FnZSgpOiBGbW9kZU9iamVjdCB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VNYW5hZ2VyKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAvLyDnm7TmjqXov5Tlm55GbW9kZU9iamVjdO+8jOaXoOmcgOi9rOaNolxyXG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VNYW5hZ2VyLmdldExhc3RNZXNzYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmtojmga/mlbDph49cclxuICAgICAqL1xyXG4gICAgZ2V0TWVzc2FnZUNvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZU1hbmFnZXIgPyB0aGlzLm1lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VDb3VudCgpIDogMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmAmui/h+S4i+agh+S/neWtmOa2iOaBr+WvueixoVxyXG4gICAgICovXHJcbiAgICBhc3luYyBzYXZlTWVzc2FnZShpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VNYW5hZ2VyKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VPYmogPSB0aGlzLm1lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2UoaW5kZXgpO1xyXG4gICAgICAgIGlmIChtZXNzYWdlT2JqKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWVzc2FnZU1hbmFnZXIuc2F2ZU1lc3NhZ2UobWVzc2FnZU9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDph43mlrDliqDovb3mtojmga9cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcmVsb2FkTWVzc2FnZXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tZXNzYWdlTWFuYWdlci5yZWxvYWRNZXNzYWdlcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS8muivnUF2YXRhcuaOp+WItlxyXG4gICAgICovXHJcbiAgICBwbGF5QW5pbWF0aW9uID0gKGFuaW1OYW1lOnN0cmluZyk9PntcclxuICAgICAgICBjb25zb2xlLmxvZyhhbmltTmFtZSlcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHdlbGNvbWUgPSBhc3luYyAoKT0+e1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgdGhpcy5nZXRNZXNzYWdlTGlzdCgpO1xyXG4gICAgICAgIGxldCBtc2dsaXN0ID0gbWVzc2FnZXM/LmZpbHRlcihpdGVtPT50aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShpdGVtLCAncm9sZScpPT1cImFzc2lzdGFudFwiKTtcclxuICAgICAgICBpZihtc2dsaXN0Py5sZW5ndGgpIHJldHVybiAvLyDlt7LmnInlr7nor53kuI3lvIDlnLrpl67lgJlcclxuXHJcbiAgICAgICAgbGV0IHVzZXIgPSBQYXJzZS5Vc2VyLmN1cnJlbnQoKTtcclxuICAgICAgICBsZXQgcGVyc29uID0gYXdhaXQgdGhpcy5sb2FkU2VsZihcIlBlcnNvblwiLFwidXNlclZlcmlmeVwiKVxyXG4gICAgICAgIGxldCBwcm9maWxlID0gYXdhaXQgdGhpcy5sb2FkU2VsZihcIlByb2ZpbGVcIixcInVzZXJcIilcclxuICAgICAgICBsZXQgcGVyc29uTmFtZSA9IHBlcnNvbj8uZ2V0KFwibmFtZVwiKSB8fCBwZXJzb24/LmdldChcInVzZXJWZWZpcnlcIik/LmdldChcInJlYWxuYW1lXCIpIHx8IHBlcnNvbj8uZ2V0KFwidXNlclZlZmlyeVwiKT8uZ2V0KFwibmlja25hbWVcIilcclxuICAgICAgICBsZXQgdXNlck5hbWUgPSB1c2VyPy5nZXQoXCJuaWNrbmFtZVwiKSB8fCBwcm9maWxlPy5nZXQoXCJuYW1lXCIpIHx8IHVzZXI/LmdldChcInJlYWxuYW1lXCIpIHx8IHVzZXI/LmdldChcIm5hbWVcIilcclxuICAgICAgICBpZihwZXJzb24/LmdldChcInVzZXJWZXJpZnlcIik/LmlkID09IHVzZXI/LmlkKXtcclxuICAgICAgICAgICAgcGVyc29uTmFtZSA9IFwi5oKoXCIgLy8g5b2T5pys5Lq65pe277yM56ew5ZG86KeS6Imy5Li65oKoXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCF1c2VyTmFtZSl7IC8vIOiLpeeUqOaIt+aXoOWnk+WQje+8jOWImeeUqOW9k+WJjeW4kOWPt+WQjeensOWBmuensOWRvFxyXG4gICAgICAgICAgICB1c2VyTmFtZSA9IHBlcnNvbk5hbWVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOmXruWAmeivrS/pppbkuKror53pophcclxuICAgICAgICAvLyDljZXkuKrpl67lgJnor63nm7TmjqXliqDovb1cclxuICAgICAgICBsZXQgdHBsID0gdGhpcy5yb2xlLmdldChcInZvaWNlQ29uZmlnXCIpPy53ZWxjb21lPy5wcm9tcHRcclxuICAgICAgICAvLyDlpJrmnaHpl67lgJnor63pmo/ljbPliqDovb1cclxuICAgICAgICBpZih0aGlzLnJvbGUuZ2V0KFwidm9pY2VDb25maWdcIik/LndlbGNvbWU/LnByb21wdExpc3Q/Lmxlbmd0aCl7XHJcbiAgICAgICAgICAgIGxldCB0cGxMaXN0ID0gdGhpcy5yb2xlLmdldChcInZvaWNlQ29uZmlnXCIpPy53ZWxjb21lPy5wcm9tcHRMaXN0O1xyXG4gICAgICAgICAgICBsZXQgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0cGxMaXN0Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgIHRwbCA9IHRwbExpc3RbcmFuZG9tSW5kZXhdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIXRwbCkgcmV0dXJuIC8vIOaXoOaooeadv+WImei/lOWbnlxyXG4gICAgICAgIGxldCB3ZWxjb21lQ29udGVudCA9IGF3YWl0IFByb21wdFRlbXBsYXRlLmZyb21UZW1wbGF0ZSh0cGwse1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZUZvcm1hdDpcIm11c3RhY2hlXCJcclxuICAgICAgICB9KS5mb3JtYXQoe1xyXG4gICAgICAgICAgICBuYW1lOnVzZXJOYW1lLCAvLyDnlKjmiLfnp7DlkbxcclxuICAgICAgICAgICAgdXNlck5hbWU6dXNlck5hbWUsIC8vIOeUqOaIt+ensOWRvFxyXG4gICAgICAgICAgICBwZXJzb25OYW1lOnBlcnNvbk5hbWUsIC8vIOinkuiJsuensOWRvFxyXG4gICAgICAgICAgICB0aW1lT2ZEYXk6dGhpcy5nZXRUaW1lT2ZEYXkoKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLy8gbGV0IGNhbGxOYW1lID0gbmFtZT9gJHtuYW1lfe+8jGA6XCJcIjtcclxuICAgICAgICAvLyBsZXQgY2FsbFRpbWUgPSBgJHt0aGlzLmdldFRpbWVPZkRheSgpfeWlvWA7XHJcbiAgICAgICAgLy8gbGV0IHdlbGNvbWVDb250ZW50ID0gYCR7Y2FsbE5hbWV9JHtjYWxsVGltZX3vvIzmnJ/lvoXogYblkKzmgqjnmoTkurrnlJ/mlYXkuovvvIzmg7PlkozmiJHogYrkupvku4DkuYjlkaLvvJ9gO1xyXG5cclxuICAgICAgICAvLyDnlJ/miJBDaGF0Vm9pY2Xlubbmkq3mlL5cclxuICAgICAgICBsZXQgdm9pY2UgPSBhd2FpdCB0aGlzLmdldFZvaWNlQnlDb250ZW50VGV4dCh3ZWxjb21lQ29udGVudCk7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICAgIHJvbGU6XCJhc3Npc3RhbnRcIixcclxuICAgICAgICAgICAgdm9pY2U6IHZvaWNlLFxyXG4gICAgICAgICAgICBjb250ZW50OndlbGNvbWVDb250ZW50LFxyXG4gICAgICAgICAgICBjb21wbGV0ZTp0cnVlLFxyXG4gICAgICAgICAgICBjcmVhdGVkQXQ6bmV3IERhdGUoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5re75Yqg5raI5oGv5Yiw5YiX6KGoXHJcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UsIE1lc3NhZ2VTY2VuZS5ST0xFKTtcclxuXHJcbiAgICAgICAgdGhpcy52b2ljZU1hcFt2b2ljZT8uaWRdXHJcbiAgICAgICAgdGhpcy5wbGF5Q2hhdFZvaWNlKHRoaXMudm9pY2VNYXBbdm9pY2U/LmlkXSlcclxuICAgIH1cclxuICAgIGdldFRpbWVPZkRheSgpIHtcclxuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IGhvdXJzID0gbm93LmdldEhvdXJzKCk7XHJcbiAgICAgICAgaWYgKGhvdXJzID49IDUgJiYgaG91cnMgPCAxMikge1xyXG4gICAgICAgICAgICByZXR1cm4gXCLml6nkuIpcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKGhvdXJzID49IDEyICYmIGhvdXJzIDwgMTQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwi5Lit5Y2IXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChob3VycyA+PSAxNCAmJiBob3VycyA8IDE4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIuS4i+WNiFwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIuaZmuS4ilwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNlbGY6e1xyXG4gICAgICAgIFBlcnNvbj86Rm1vZGVPYmplY3R8dW5kZWZpbmVkXHJcbiAgICAgICAgUHJvZmlsZT86Rm1vZGVPYmplY3R8dW5kZWZpbmVkXHJcbiAgICB9ID0ge31cclxuICAgIGFzeW5jIGxvYWRTZWxmKGNsYXNzTmFtZSx1c2VyS2V5KXtcclxuICAgICAgICBpZih0aGlzLnNlbGZbY2xhc3NOYW1lXSkgcmV0dXJuIHRoaXMuc2VsZltjbGFzc05hbWVdXHJcbiAgICAgICAgbGV0IHVzZXIgPSBQYXJzZS5Vc2VyLmN1cnJlbnQoKTtcclxuICAgICAgICBsZXQgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoY2xhc3NOYW1lKTtcclxuICAgICAgICBxdWVyeS5pbmNsdWRlKHVzZXJLZXkpXHJcbiAgICAgICAgcXVlcnkuZXF1YWxUbyh1c2VyS2V5LHVzZXI/LmlkKTtcclxuICAgICAgICB0aGlzLnNlbGZbY2xhc3NOYW1lXSA9IGF3YWl0IHF1ZXJ5LmZpcnN0KCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZltjbGFzc05hbWVdXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5a+56K+d5qih5Z6L5o+Q56S66K+NXHJcbiAgICAgKi9cclxuICAgICBhc3luYyBsb2FkVGFsa1N5c3RlbVByb21wdChyb2xlOkZtb2RlT2JqZWN0KXtcclxuICAgICAgICBpZighdGhpcy5pc1RhbGtNb2RlKSByZXR1cm5cclxuICAgICAgICBpZighcm9sZSkgcmV0dXJuXHJcbiAgICAgICAgbGV0IHZvaWNlQ29uZmlnOmFueSA9IHJvbGU/LmdldChcInZvaWNlQ29uZmlnXCIpXHJcblxyXG4gICAgICAgIC8vIOWKoOi9veWjsOmfs+aooeWei++8mum7mOiupOS4uuaZk+aZk1xyXG4gICAgICAgIGlmKHJvbGU/LmdldCgnZ2VuZGVyJyk9PSfnlLcnKXtcclxuICAgICAgICAgIHRoaXMuU1NNTFJvbGVWb2ljZSA9IFwiemgtQ04tWXVueWVOZXVyYWxcIlxyXG4gICAgICAgICAgaWYodm9pY2VDb25maWcucHJvdmlkZXI9PVwiZG91YmFvXCIpe1xyXG4gICAgICAgICAgICB0aGlzLlNTTUxSb2xlVm9pY2UgPSBcInpoX21hbGVfeWFuZ2d1YW5ncWluZ25pYW5fZW1vX3YyX21hcnNfYmlndHRzXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuU1NNTFJvbGVWb2ljZSA9IFwiemgtQ04tWGlhb3hpYW9OZXVyYWxcIlxyXG4gICAgICAgICAgaWYodm9pY2VDb25maWcucHJvdmlkZXI9PVwiZG91YmFvXCIpe1xyXG4gICAgICAgICAgICB0aGlzLlNTTUxSb2xlVm9pY2UgPSBcInpoX2ZlbWFsZV9zaHVhbmdrdWFpc2lzaV9lbW9fdjJfbWFyc19iaWd0dHNcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5TU01MUm9sZVZvaWNlID0gcm9sZT8uZ2V0KFwidm9pY2VDb25maWdcIik/LnZvaWNlIHx8IHRoaXMuU1NNTFJvbGVWb2ljZSBcclxuICAgICAgICBsZXQgU1NNTFByb21wdFRlbXBsYXRlID0gYXdhaXQgZ2V0Rm9ybWF0VHBsKFByb21wdFRwbFRhbGtTU01MT3V0cHV0Q29kZSx7XHJcbiAgICAgICAgICAgIFNTTUxSb2xlVm9pY2U6IHRoaXMuU1NNTFJvbGVWb2ljZSwgLy8gU1NNTCBcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBsZXQgcHJvbXB0ID0gcm9sZS5nZXQoXCJwcm9tcHRcIikgfHwgXCLor7fkvaDmia7mvJTpo57noIFBSeeahOS6uuW3peaZuuiDveS4k+WutuOAglwiXHJcbiAgICAgICAgcHJvbXB0ICs9IFNTTUxQcm9tcHRUZW1wbGF0ZTtcclxuICAgICAgICBsZXQgcHJvbXB0TXNnOkZtb2RlQ2hhdE1lc3NhZ2UgPSB7cm9sZTpcInVzZXJcIixjb250ZW50OnByb21wdCxoaWRkZW46dHJ1ZX1cclxuXHJcbiAgICAgICAgLy8g5p+l6YeNXHJcbiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLm1lc3NhZ2VMaXN0Py5tYXAoaXRlbT0+dGhpcy5nZXRNZXNzYWdlUHJvcGVydHkoaXRlbSwgJ2NvbnRlbnQnKSkuam9pbigpXHJcbiAgICAgICAgaWYoY29udGVudC5pbmRleE9mKHByb21wdCk+LTEpe1xyXG4gICAgICAgICAgICAvLyDmj5DnpLror43lt7Lnu4/lrZjlnKhcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOihpeWFqOaPkOekuuivjVxyXG4gICAgICAgIGxldCBzeXN0ZW1JbmRleCA9IHRoaXMubWVzc2FnZUxpc3Q/LmZpbmRJbmRleChpdGVtPT50aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShpdGVtLCAncm9sZScpPT1cInN5c3RlbVwiKTtcclxuICAgICAgICBsZXQgaW5zZXJ0SW5kZXggPSBzeXN0ZW1JbmRleCsxXHJcbiAgICAgICAgbGV0IG1zZ09iaiA9IG5ldyBQYXJzZS5PYmplY3QoXCJNZXNzYWdlXCIpXHJcbiAgICAgICAgbXNnT2JqLnNldChcImNvbnRlbnRcIixwcm9tcHRNc2cpXHJcbiAgICAgICAgdGhpcy5tZXNzYWdlTGlzdC5zcGxpY2UoaW5zZXJ0SW5kZXgsMCxtc2dPYmopXHJcbiAgICAgICAgcmV0dXJuIFxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDop5LoibLmj5DnpLror41cclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBsb2FkUm9sZVByb21wdCgpe1xyXG4gICAgICAgIC8vIOinkuiJsuaPkOekulxyXG4gICAgICAgIGxldCBwcm9tcHQgPSB0aGlzLnJvbGU/LmdldChcInByb21wdFwiKVxyXG4gICAgICAgIGxldCBwcm9tcHRNc2c6Rm1vZGVDaGF0TWVzc2FnZSA9IHtyb2xlOlwidXNlclwiLGNvbnRlbnQ6cHJvbXB0LGhpZGRlbjp0cnVlfVxyXG4gICAgICAgIGlmKCFwcm9tcHQpIHJldHVybiAvLyDml6Dmj5DnpLror43ml6DpnIDmt7vliqBcclxuICAgICAgICAvLyDlhoXlrrnmo4Dmn6VcclxuICAgICAgICBsZXQgY29udGVudCA9IHRoaXMubWVzc2FnZUxpc3Q/Lm1hcChpdGVtPT50aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShpdGVtLCAnY29udGVudCcpKS5qb2luKClcclxuICAgICAgICBpZihjb250ZW50LmluZGV4T2YocHJvbXB0KT4tMSl7XHJcbiAgICAgICAgICAgIC8vIOaPkOekuuivjeW3sue7j+WtmOWcqFxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g6KGl5YWo5o+Q56S66K+NXHJcbiAgICAgICAgbGV0IHN5c3RlbUluZGV4ID0gdGhpcy5tZXNzYWdlTGlzdD8uZmluZEluZGV4KGl0ZW09PnRoaXMuZ2V0TWVzc2FnZVByb3BlcnR5KGl0ZW0sICdyb2xlJyk9PVwic3lzdGVtXCIpO1xyXG4gICAgICAgIGxldCBpbnNlcnRJbmRleCA9IHN5c3RlbUluZGV4KzFcclxuICAgICAgICBsZXQgbXNnT2JqID0gbmV3IFBhcnNlLk9iamVjdChcIk1lc3NhZ2VcIilcclxuICAgICAgICBtc2dPYmouc2V0KFwiY29udGVudFwiLHByb21wdE1zZylcclxuICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0LnNwbGljZShpbnNlcnRJbmRleCwwLG1zZ09iailcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLm1lc3NhZ2VMaXN0KVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDlj5HpgIHmtojmga9cclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFxyXG4gICAgICogQHBhcmFtIGltYWdlVXJsIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBzZW5kTWVzc2FnZShtZXNzYWdlOnN0cmluZz1cIkZtb2RlQWlUZXN05rWL6K+V6Zeu6aKYXCIsaW1hZ2VVcmw/OnN0cmluZyxvbkNvbXBsZXRlPzpGdW5jdGlvbixldmVudE1hcD86Rm1vZGVDaGF0RXZlbnRNYXAsdm9pY2U/OkZtb2RlQ2hhdE1lc3NhZ2VWb2ljZSl7XHJcbiAgICAgICAgLy8g5Y+R5raI5oGv6Ieq5Yqo572u5bqVXHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSYmdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG5cclxuICAgICAgICAvLyDkuLrmtojmga/liJfooajooaXlhajmj5DnpLror41cclxuICAgICAgICAvLyBhd2FpdCB0aGlzLmxvYWRUYWxrU3lzdGVtUHJvbXB0KHRoaXMucm9sZSk7XHJcbiAgICAgICAgdGhpcy5pc1Byb21wdE1lc3NhZ2VBcmVhU2hvdyA9IGZhbHNlOyAvLyDlj5HpgIHnrKzkuIDmnaHmtojmga/lkI7vvIzlhbPpl63mj5DnpLrnnIvmnb9cclxuICAgICAgICB0aGlzLmxvYWRSb2xlUHJvbXB0KCk7XHJcblxyXG4gICAgICAgIC8vIOaehOW7uueUqOaIt+a2iOaBr1xyXG4gICAgICAgIGxldCB1c2VyTWVzc2FnZTpGbW9kZUNoYXRNZXNzYWdlO1xyXG4gICAgICAgIGlmKCFpbWFnZVVybCl7IC8vIOe6r+aWh+acrFxyXG4gICAgICAgICAgICB1c2VyTWVzc2FnZSA9IHtcclxuICAgICAgICAgICAgICAgIHJvbGU6XCJ1c2VyXCIsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50Om1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTp0cnVlLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0Om5ldyBEYXRlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih2b2ljZSl7XHJcbiAgICAgICAgICAgICAgICB1c2VyTWVzc2FnZS52b2ljZSA9IHtpZDp2b2ljZT8uaWQsZHVyYXRpb246dm9pY2U/LmR1cmF0aW9ufVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7IC8vIOW4puWbvueJh1xyXG4gICAgICAgICAgICB1c2VyTWVzc2FnZSA9IHtcclxuICAgICAgICAgICAgICAgIFwicm9sZVwiOiBcInVzZXJcIixcclxuICAgICAgICAgICAgICAgIFwiY29udGVudFwiOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJpbWFnZV91cmxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpbWFnZV91cmxcIjoge1widXJsXCI6aW1hZ2VVcmx9LFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJ0ZXh0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidGV4dFwiOiBtZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTp0cnVlLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0Om5ldyBEYXRlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih2b2ljZSl7XHJcbiAgICAgICAgICAgICAgICB1c2VyTWVzc2FnZS52b2ljZSA9IHtpZDp2b2ljZT8uaWR9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOa3u+WKoOeUqOaIt+a2iOaBr1xyXG4gICAgICAgIGF3YWl0IHRoaXMuYWRkTWVzc2FnZSh1c2VyTWVzc2FnZSwgTWVzc2FnZVNjZW5lLlJPTEUpO1xyXG5cclxuICAgICAgICAvLyDojrflj5bmnIDmlrDmtojmga/liJfooajnlKjkuo7ooaXlhahcclxuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUxpc3QoKTtcclxuXHJcbiAgICAgICAgLy8g5Yib5bu65bm25Y+R6LW35LiA5p2h5paw55qE5raI5oGv6KGl5YWoXHJcbiAgICAgICAgbGV0IGNvbXBsZXRpb24gPSBuZXcgRm1vZGVDaGF0Q29tcGxldGlvbih0aGlzLmZpeE1lc3NhZ2VMaXN0KHRoaXMuY29udmVydE1lc3NhZ2VzKG1lc3NhZ2VzKSkse1xyXG4gICAgICAgICAgICBtb2RlbDp0aGlzLmN1cnJlbnRNb2RlbD8uZ2V0Py4oXCJjb2RlXCIpIHx8IFwiZm1vZGUtMS42LWNuXCJcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAvLyDnlJ/lkb3lkajmnJ/vvJrmtojmga/ojrflj5blrozmiJBcclxuICAgICAgICBpZih0aGlzLm9uVXNlclNlbmQpe1xyXG4gICAgICAgICAgICBsZXQgc2VuZFJlc3VsdCA9IGF3YWl0IHRoaXMub25Vc2VyU2VuZCh0aGlzLHVzZXJNZXNzYWdlKVxyXG4gICAgICAgICAgICBpZighc2VuZFJlc3VsdCkgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51c2VySW5wdXQgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMudXNlckltYWdlID0gXCJcIjtcclxuICAgICAgICAvLyDmjIHnu63mm7TmlrDkuovku7bmjqjpgIHnmoTmtojmga/kvZPlhoXlrrnoh7Pmtojmga/liJfooahcclxuICAgICAgICBsZXQgaXNEaXJlY3QgPSB0aGlzLmlzRGlyZWN0IHx8IGZhbHNlXHJcbiAgICAgICAgaWYodGhpcy5pc1RhbGtNb2RlKXtcclxuICAgICAgICAgICAgaXNEaXJlY3QgPSB0cnVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDliJ3lp4vljJZBSeWbnuWkjea2iOaBr+WNoOS9jeesplxyXG4gICAgICAgIGNvbnN0IGFpTWVzc2FnZVBsYWNlaG9sZGVyOiBGbW9kZUNoYXRNZXNzYWdlID0ge1xyXG4gICAgICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxyXG4gICAgICAgICAgICBjb250ZW50OiBcIlwiLFxyXG4gICAgICAgICAgICBjb21wbGV0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIOa3u+WKoEFJ5Zue5aSN5raI5oGv5Y2g5L2N56ymXHJcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRNZXNzYWdlKGFpTWVzc2FnZVBsYWNlaG9sZGVyLCBNZXNzYWdlU2NlbmUuUk9MRSk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudE1lc3NhZ2VzID0gYXdhaXQgdGhpcy5nZXRNZXNzYWdlTGlzdCgpO1xyXG4gICAgICAgIGNvbnN0IGFpTWVzc2FnZUluZGV4ID0gY3VycmVudE1lc3NhZ2VzLmxlbmd0aCAtIDE7XHJcblxyXG4gICAgICAgIC8vIOeUn+WRveWRqOacn++8mueUqOaIt+WPkemAgea2iOaBr+Wbnuiwg1xyXG4gICAgICAgIGlmKHRoaXMub25Vc2VyU2VuZCl7XHJcbiAgICAgICAgICAgIGxldCBzZW5kUmVzdWx0ID0gYXdhaXQgdGhpcy5vblVzZXJTZW5kKHRoaXMsdXNlck1lc3NhZ2UpXHJcbiAgICAgICAgICAgIGlmKCFzZW5kUmVzdWx0KSByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2VuZCQgPSBjb21wbGV0aW9uLnNlbmRDb21wbGV0aW9uKHtcclxuICAgICAgICAgICAgaXNEaXJlY3Q6aXNEaXJlY3QsXHJcbiAgICAgICAgICAgIG9uQ29tcGxldGU6b25Db21wbGV0ZXx8bnVsbFxyXG4gICAgICAgIH0pLnBpcGUoZmluYWxpemUoYXN5bmMgKCk9PnsgLy8g566h6YGTZmluYWxpemXmm7/ku6Pkuobml6fniYjnmoQoY29tcGxldGUpPT57fVxyXG5cclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRNZXNzYWdlID0gY3VycmVudE1lc3NhZ2VzW2FpTWVzc2FnZUluZGV4XTtcclxuXHJcbiAgICAgICAgICAgIC8vIOagh+iusOa2iOaBr+WujOaIkFxyXG4gICAgICAgICAgICB0aGlzLnNldE1lc3NhZ2VQcm9wZXJ0eShjdXJyZW50TWVzc2FnZSwgJ2NvbXBsZXRlJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlTWVzc2FnZShhaU1lc3NhZ2VJbmRleCwgY3VycmVudE1lc3NhZ2UpO1xyXG5cclxuICAgICAgICAgICAgLy8g5Zyo5raI5oGv5a6M5oiQ5ZCO55Sf5oiQ6K+t6Z+z77yIVGFsa01vZGXvvIlcclxuICAgICAgICAgICAgaWYodGhpcy5pc1RhbGtNb2RlKXtcclxuICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gY3VycmVudE1lc3NhZ2U/LmdldChcImNvbnRlbnRcIik7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLmhhc1ZhbGlkQ29udGVudChjb250ZW50KSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZvaWNlID0gYXdhaXQgdGhpcy5nZXRWb2ljZUJ5Q29udGVudFRleHQoY29udGVudCxldmVudE1hcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZvaWNlICYmIHZvaWNlLmlkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZXNzYWdlLnNldChcInZvaWNlXCIsdm9pY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVNZXNzYWdlKGFpTWVzc2FnZUluZGV4LCBjdXJyZW50TWVzc2FnZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6YCa55+lU1NNTOWujOaIkFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNYXA/Lm9uU1NNTENvbXBsZXRlJiZldmVudE1hcD8ub25TU01MQ29tcGxldGUodm9pY2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaSreaUvuivremfs1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5Q2hhdFZvaWNlKHRoaXMudm9pY2VNYXBbdm9pY2U/LmlkXSx7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZXN1bHQ6KHJlc3VsdDphbnkpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3VsdD8uZHVyYXRpb24pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZvaWNlID0gY3VycmVudE1lc3NhZ2UuZ2V0KFwidm9pY2VcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWNlLmR1cmF0aW9uID0gcmVzdWx0Py5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZXNzYWdlLnNldChcInZvaWNlXCIsdm9pY2UpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1lc3NhZ2UoYWlNZXNzYWdlSW5kZXgsIGN1cnJlbnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcign55Sf5oiQ6K+t6Z+z5aSx6LSlOicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIOeUn+WRveWRqOacn++8mua2iOaBr+iOt+WPluWujOaIkFxyXG4gICAgICAgICAgICBjb25zdCBmaW5hbE1zZ3MgPSBhd2FpdCB0aGlzLmdldE1lc3NhZ2VMaXN0KCk7XHJcbiAgICAgICAgICAgIGlmKGZpbmFsTXNncz8ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uTWVzc2FnZSYmdGhpcy5vbk1lc3NhZ2UodGhpcyxmaW5hbE1zZ3NbZmluYWxNc2dzPy5sZW5ndGgtMV0/LmdldChcImNvbnRlbnRcIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpLnN1YnNjcmliZShhc3luYyAobWVzc2FnZTpGbW9kZUNoYXRNZXNzYWdlKT0+e1xyXG4gICAgICAgICAgICAvLyDlrp7ml7bmm7TmlrDmtojmga/lhoXlrrlcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVNZXNzYWdlKGFpTWVzc2FnZUluZGV4LCBtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIOabtOaWsOacgOaWsOWbnuWkjeWGheWuuVxyXG4gICAgICAgICAgICB0aGlzLmxhdGVzdEFJUmVzcG9uc2UgPSB0aGlzLmdldENvbnRlbnRUZXh0KG1lc3NhZ2U/LmNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgLy8g55Sf5ZG95ZGo5pyf77ya5raI5oGv5pu05paw5Zue6LCD77yI5a6e5pe25pu05paw77yJXHJcbiAgICAgICAgICAgIGlmKHRoaXMub25NZXNzYWdlICYmICFtZXNzYWdlPy5jb21wbGV0ZSl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TXNncyA9IGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUxpc3QoKTtcclxuICAgICAgICAgICAgICAgIGlmKGN1cnJlbnRNc2dzPy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTWVzc2FnZSh0aGlzLCBjdXJyZW50TXNnc1tjdXJyZW50TXNncz8ubGVuZ3RoLTFdPy5nZXQoXCJjb250ZW50XCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8g5L+d5a2Y6IGK5aSp5Lya6K+d77yI5a6e5pe25L+d5a2Y77yJXHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNc2dzID0gYXdhaXQgdGhpcy5nZXRNZXNzYWdlTGlzdCgpO1xyXG4gICAgICAgICAgICBsZXQgc2F2ZWRMaXN0ID0gdGhpcy5jaGF0U2Vzc2lvbj8uZ2V0KFwibWVzc2FnZUxpc3RcIik/Lmxlbmd0aDtcclxuICAgICAgICAgICAgaWYoY3VycmVudE1zZ3M/Lmxlbmd0aCA+IHNhdmVkTGlzdCl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVDaGF0U2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyDmu5rliqjliLDlupXpg6hcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSYmdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Vm9pY2VCeUNvbnRlbnRUZXh0KGNvbnRlbnQ6c3RyaW5nfENoYXRJbWFnZUNvbnRlbnRJdGVtW10sZXZlbnRNYXA/OkZtb2RlQ2hhdEV2ZW50TWFwLHByb21wdEVuYWJsZWQ6Ym9vbGVhbj1mYWxzZSk6UHJvbWlzZTxGbW9kZUNoYXRNZXNzYWdlVm9pY2U+e1xyXG4gICAgICAgIGlmKCF0aGlzLmhhc1ZhbGlkQ29udGVudChjb250ZW50KSl7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe2lkOiAnJ30pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGNvbnRlbnRUZXh0ID0gdGhpcy5nZXRDb250ZW50VGV4dChjb250ZW50KTtcclxuXHJcbiAgICAgICAgbGV0IENoYXRWb2ljZSA9IFBhcnNlLk9iamVjdC5leHRlbmQoXCJDaGF0Vm9pY2VcIik7XHJcbiAgICAgICAgbGV0IGNoYXRWb2ljZSA9IG5ldyBDaGF0Vm9pY2UoKTtcclxuICAgICAgICBsZXQgY29udGVudFNTTUwgPSBgYDtcclxuICAgICAgICBsZXQgdm9pY2VDb25maWc6YW55ID0gdGhpcy52b2ljZUNvbmZpZyB8fCB0aGlzLnJvbGU/LmdldChcInZvaWNlQ29uZmlnXCIpXHJcbiAgICAgICAgdGhpcy5TU01MUm9sZVZvaWNlID0gdm9pY2VDb25maWc/LnZvaWNlIHx8IHRoaXMuU1NNTFJvbGVWb2ljZVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUscmVqZWN0KT0+e1xyXG4gICAgICAgICAgICBsZXQgcmVzb2x2ZUNoYXRWb2ljZSA9IGFzeW5jICgpPT57XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJjb250ZW50XCIsY29udGVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJzc21sXCIsY29udGVudFNTTUwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJyb2xlXCIsXCJhc3Npc3RhbnRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21wYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY29tcGFueSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJjb21wYW55XCIse19fdHlwZTpcIlBvaW50ZXJcIixjbGFzc05hbWU6XCJDb21wYW55XCIsb2JqZWN0SWQ6Y29tcGFueX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRVc2VyID0gUGFyc2UuVXNlci5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY3VycmVudFVzZXI/LmlkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhdFZvaWNlLnNldChcInVzZXJcIixjdXJyZW50VXNlci50b1BvaW50ZXIoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNoYXRTZXNzaW9uPy5pZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJzZXNzaW9uXCIsdGhpcy5jaGF0U2Vzc2lvbj8udG9Qb2ludGVyKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5Yiw5pWw5o2u5bqTXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhdFZvaWNlID0gYXdhaXQgY2hhdFZvaWNlLnNhdmUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8g56Gu5L+d5L+d5a2Y5oiQ5Yqf5ZCO5YaN5re75Yqg5Yiw5pig5bCEXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY2hhdFZvaWNlPy5pZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VNYXBbY2hhdFZvaWNlPy5pZF0gPSBjaGF0Vm9pY2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDpqozor4FTU01M5piv5ZCm5q2j56Gu5L+d5a2YXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhdmVkVm9pY2UgPSBhd2FpdCBuZXcgUGFyc2UuUXVlcnkoXCJDaGF0Vm9pY2VcIikuZ2V0KGNoYXRWb2ljZS5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNhdmVkVm9pY2UgJiYgc2F2ZWRWb2ljZS5nZXQoXCJzc21sXCIpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfor63pn7Plr7nosaHkv53lrZjmiJDlip/vvIxTU01MOicsIHNhdmVkVm9pY2UuZ2V0KFwic3NtbFwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ+ivremfs+WvueixoeS/neWtmOS9hlNTTUzkuLrnqbonKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDpjaGF0Vm9pY2U/LmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NtbDogc2F2ZWRWb2ljZT8uZ2V0KFwic3NtbFwiKSB8fCBjb250ZW50U1NNTFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCfkv53lrZjor63pn7Plr7nosaHlpLHotKUnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCfkv53lrZjor63pn7Plr7nosaHml7blh7rplJk6JywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIOaWueazleS4gO+8mumrmOe6p+ivremfs+ebtOaOpeivu+aWh+acrO+8jOmAn+W6puW/q++8jOS9hue7huiKguaDhee7quagh+iusOS4jei2s+OAglxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgIGlmKHByb21wdEVuYWJsZWQ9PWZhbHNlKXtcclxuICAgICAgICAgICAgICAgIGxldCBwcm92aWRlciA9IHZvaWNlQ29uZmlnPy5wcm92aWRlciB8fCBcIm1pY3Jvc29mdFwiXHJcbiAgICAgICAgICAgICAgICBsZXQgcmF0ZSA9IHZvaWNlQ29uZmlnPy5yYXRlXHJcbiAgICAgICAgICAgICAgICBsZXQgcmF0ZVN0YXJ0ID0gcmF0ZT9gPHByb3NvZHkgcmF0ZT1cIiR7cmF0ZX1cIj5gOlwiXCJcclxuICAgICAgICAgICAgICAgIGxldCByYXRlRW5kID0gcmF0ZT9gPC9wcm9zb2R5PmA6XCJcIlxyXG4gICAgICAgICAgICAgICAgY29udGVudFNTTUwgPSBgPHNwZWFrIHByb3ZpZGVyPVwiJHtwcm92aWRlcn1cIj4ke3JhdGVTdGFydH08dm9pY2UgbmFtZT1cIiR7dGhpcy5TU01MUm9sZVZvaWNlfVwiPiR7Y29udGVudFRleHR9PC92b2ljZT4ke3JhdGVFbmR9PC9zcGVhaz5gXHJcbiAgICAgICAgICAgICAgICBpZihwcm92aWRlcj09XCJkb3ViYW9cIil7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFNTTUwgPSBjb250ZW50VGV4dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUNoYXRWb2ljZSgpXHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBwcm9tcHRFbmFibGVkID09IHRydWVcclxuICAgICAgICAgICAgICog5pa55rOV5LqM77ya6YCa6L+H5aSn5qih5Z6L5YaN5qyh5ou85o6lU1NNTOiEmuacrO+8jOWunueOsOabtOS8mOi0qOeahOivremfs+agh+iusO+8jOS9huaYr+eUn+aIkOaXtumXtOWkquaFolxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYocHJvbXB0RW5hYmxlZD09dHJ1ZSl7XHJcbiAgICAgICAgICAgICAgICAvLyDmi7zmjqVQcm9tcHRcclxuICAgICAgICAgICAgICAgIGxldCBUZXh0U1NNTFByb21wdCA9IGF3YWl0IGdldEZvcm1hdFRwbChQcm9tcHRUcGxUYWxrVGV4dFNTTUxDb2RlLHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OmNvbnRlbnRUZXh0LCAvLyDmlofmnKzlhoXlrrlcclxuICAgICAgICAgICAgICAgICAgICBTU01MUm9sZVZvaWNlOiB0aGlzLlNTTUxSb2xlVm9pY2UsIC8vIFNTTUwg5ryU6K+06ICFXHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIOeUn+aIkFNTTUxcclxuICAgICAgICAgICAgICAgIGxldCBjb21wbGV0aW9uID0gbmV3IEZtb2RlQ2hhdENvbXBsZXRpb24odGhpcy5maXhNZXNzYWdlTGlzdChbe1xyXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6XCJ1c2VyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDpUZXh0U1NNTFByb21wdFxyXG4gICAgICAgICAgICAgICAgfV0pLHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlbDp0aGlzLmN1cnJlbnRNb2RlbD8uZ2V0Py4oXCJjb2RlXCIpIHx8IFwiZm1vZGUtMS42LWNuXCJcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBsZXQgc2VuZCQgPSBjb21wbGV0aW9uLnNlbmRDb21wbGV0aW9uKHtcclxuICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdDp0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSkuc3Vic2NyaWJlKGFzeW5jIG1lc3NhZ2U9PntcclxuICAgICAgICAgICAgICAgICAgICBpZihtZXNzYWdlPy5jb21wbGV0ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTU01MID0gdGhpcy5nZXRDb250ZW50VGV4dChtZXNzYWdlPy5jb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQ2hhdFZvaWNlKClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBnZXRDb250ZW50VGV4dChjb250ZW50OnN0cmluZ3xDaGF0SW1hZ2VDb250ZW50SXRlbVtdKXtcclxuICAgICAgICBpZih0eXBlb2YgY29udGVudCA9PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ/LlswXT8udGV4dCB8fCBgYFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOajgOafpeWGheWuueaYr+WQpuacieacieaViOaWh+acrFxyXG4gICAgICovXHJcbiAgICBoYXNWYWxpZENvbnRlbnQoY29udGVudDpzdHJpbmd8Q2hhdEltYWdlQ29udGVudEl0ZW1bXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmdldENvbnRlbnRUZXh0KGNvbnRlbnQpO1xyXG4gICAgICAgIHJldHVybiB0ZXh0ICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRUUyAtIOivremfs+WQiOaIkFxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXRUVFMoKTpQcm9taXNlPEZtb2RlVFRTfG51bGw+e1xyXG4gICAgICAgIHRoaXMudm9pY2VDb25maWcgPSB0aGlzLnZvaWNlQ29uZmlnIHx8IHRoaXMucm9sZT8uZ2V0KFwidm9pY2VDb25maWdcIilcclxuXHJcbiAgICAgICAgLy8gaWYodGhpcy50dHMpIHJldHVybiAvLyDlvoXmmI7noa5zdHPmnInmlYjmnJ/lkozmrKHmlbDov5vooYzkvJjljJbvvIzpgb/lhY3mr4/mrKHph43lpI3ojrflj5ZcclxuICAgICAgICBsZXQgY29uZmlnOmFueSA9IGF3YWl0IHRoaXMubmNsb3VkLmFwaWcoXCJ2b2ljZS90dHMvdG9rZW5cIix7XHJcbiAgICAgICAgICAgIGNvbXBhbnk6bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpLFxyXG4gICAgICAgICAgICBwcm92aWRlcjp0aGlzLnZvaWNlQ29uZmlnPy5wcm92aWRlciB8fCBcIm1pY3Jvc29mdFwiXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25maWcucHJvdmlkZXIgPSB0aGlzLnZvaWNlQ29uZmlnPy5wcm92aWRlclxyXG4gICAgICAgIGlmKCghY29uZmlnPy5wcm92aWRlcil8fGNvbmZpZz8ucHJvdmlkZXIgPT0gXCJtaWNyb3NvZnRcIil7XHJcbiAgICAgICAgICAgIC8vIGNvbmZpZy5wcm92aWRlciA9IG5ldyBGbW9kZVRUU1Byb3ZpZGVyTWljcm9zb2Z0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGNvbmZpZz8ucHJvdmlkZXIgPT0gXCJkb3ViYW9cIil7XHJcbiAgICAgICAgICAgIGNvbmZpZy5wcm92aWRlciA9IG5ldyBGbW9kZVRUU1Byb3ZpZGVyRG91YmFvKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbmZpZy52b2ljZUNvbmZpZyA9IHRoaXMudm9pY2VDb25maWdcclxuICAgICAgICAvLyDmnIlUVFPotYTmupDvvIzkvb/nlKjmg4Xnu6rlkIjmiJBcclxuICAgICAgICBjb25zb2xlLmxvZyhcImluaXRUVFNcIixjb25maWcpXHJcbiAgICAgICAgaWYoY29uZmlnPy50b2tlbiB8fCBjb25maWc/LnN0c1Rva2VuKXtcclxuICAgICAgICAgICAgLy8g5Yib5bu66YCC6YWN5Zmo77yM5bCGTm92YVN0b3JhZ2XpgILphY3kuLpOb3ZhVXBsb2FkU2VydmljZeaOpeWPo1xyXG4gICAgICAgICAgICBjb25zdCB1cGxvYWRBZGFwdGVyID0ge1xyXG4gICAgICAgICAgICAgICAgZ2VuTWQ1OiAoY29udGVudDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g566A5Y2V55qETUQ155Sf5oiQ5a6e546w77yM5oiW6ICF5a+85YWlTUQ15bqTXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ0b2EoY29udGVudCkucmVwbGFjZSgvW15hLXpBLVowLTldL2csICcnKS5zdWJzdHJpbmcoMCwgMzIpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHVwbG9hZDogKGZpbGU6IEZpbGUpID0+IHRoaXMuc3RvcmFnZS51cGxvYWQoZmlsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgbGV0IHR0cyA9IG5ldyBGbW9kZVRUUyhjb25maWcsIHVwbG9hZEFkYXB0ZXIgYXMgYW55KTtcclxuICAgICAgICAgICAgcmV0dXJuIHR0c1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHZvaWNlTWFwOmFueSA9IHt9XHJcbiAgICBWb2ljZVRUU01hcDp7XHJcbiAgICAgICAgW2tleTpzdHJpbmddOkZtb2RlVFRTXHJcbiAgICB9ID0ge31cclxuICAgIHN0b3BQbGF5aW5nVm9pY2UoKXtcclxuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuVm9pY2VUVFNNYXApLmZvckVhY2godHRzPT57XHJcbiAgICAgICAgICAgIGlmKHR0cz8uaXNQbGF5aW5nKXtcclxuICAgICAgICAgICAgICAgIHR0cz8uc3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIGFzeW5jIHBsYXlDaGF0Vm9pY2Uodm9pY2U6Rm1vZGVPYmplY3QsZXZlbnRNYXA/OmFueSk6UHJvbWlzZTxGbW9kZVRUU3xudWxsPntcclxuICAgICAgICBsZXQgdHRzID0gYXdhaXQgdGhpcy5pbml0VFRTKCk7XHJcblxyXG4gICAgICAgIGlmKCF0dHMpe1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RUU+WIneWni+WMluWksei0pe+8jOaXoOazleaSreaUvuivremfsycpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCF2b2ljZT8uaWQpe1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ+ivremfs+WvueixoUlE5Li656m677yM5peg5rOV5pKt5pS+Jyk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJwbGF5Q2hhdFZvaWNlXCIsIHR0cywgdm9pY2U/LmlkKTtcclxuXHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAvLyDojrflj5ZTU01M5YaF5a6577yM5LyY5YWI5LuOdm9pY2VNYXDkuK3ojrflj5bvvIzlpoLmnpzmsqHmnInliJnph43mlrDmn6Xor6JcclxuICAgICAgICAgICAgbGV0IHNzbWxDb250ZW50ID0gdm9pY2U/LmdldChcInNzbWxcIik7XHJcblxyXG4gICAgICAgICAgICBpZighc3NtbENvbnRlbnQpe1xyXG4gICAgICAgICAgICAgICAgLy8g5LuOdm9pY2VNYXDkuK3ojrflj5ZcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZvaWNlRnJvbU1hcCA9IHRoaXMudm9pY2VNYXBbdm9pY2UuaWRdO1xyXG4gICAgICAgICAgICAgICAgaWYodm9pY2VGcm9tTWFwKXtcclxuICAgICAgICAgICAgICAgICAgICBzc21sQ29udGVudCA9IHZvaWNlRnJvbU1hcC5nZXQoXCJzc21sXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZighc3NtbENvbnRlbnQpe1xyXG4gICAgICAgICAgICAgICAgLy8g6YeN5paw5p+l6K+i5pWw5o2u5bqTXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyZXNoVm9pY2UgPSBhd2FpdCBuZXcgUGFyc2UuUXVlcnkoXCJDaGF0Vm9pY2VcIikuZ2V0KHZvaWNlLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZihmcmVzaFZvaWNlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3NtbENvbnRlbnQgPSBmcmVzaFZvaWNlLmdldChcInNzbWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOabtOaWsHZvaWNlTWFwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VNYXBbdm9pY2UuaWRdID0gZnJlc2hWb2ljZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+afpeivouivremfs+WvueixoeWksei0pTonLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmKCFzc21sQ29udGVudCl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ+aXoOazleiOt+WPllNTTUzlhoXlrrnvvIzor63pn7Pmkq3mlL7lpLHotKUnKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygn5YeG5aSH5pKt5pS+U1NNTDonLCBzc21sQ29udGVudCk7XHJcblxyXG4gICAgICAgICAgICB0dHMudm9pY2VDb25maWcgPSB0aGlzLnZvaWNlQ29uZmlnXHJcbiAgICAgICAgICAgIC8vIOaSreaUvuWKqOeUu1xyXG4gICAgICAgICAgICB0aGlzLnBsYXlBbmltYXRpb24oXCJ0YWxraW5nXCIpXHJcblxyXG4gICAgICAgICAgICAvLyDmkq3mlL7or63pn7NcclxuICAgICAgICAgICAgYXdhaXQgdHRzLnNwZWFrQXN5bmMoc3NtbENvbnRlbnQsIHZvaWNlLCB7XHJcbiAgICAgICAgICAgICAgICBvblN0YXJ0OihjaGF0Vm9pY2U/OmFueSk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6K+t6Z+z5pKt5pS+5byA5aeLJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRNYXA/Lm9uU3RhcnQmJmV2ZW50TWFwPy5vblN0YXJ0KGNoYXRWb2ljZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb25Mb2FkZWQ6KGF1ZGlvOmFueSk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6K+t6Z+z5Yqg6L295a6M5oiQJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRNYXA/Lm9uTG9hZGVkJiZldmVudE1hcD8ub25Mb2FkZWQoYXVkaW8pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uUmVzdWx0OihyZXN1bHQ6YW55KT0+eyAvLyB7ZHVyYXRpb246bnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfor63pn7Pmkq3mlL7nu5Pmnpw6JywgcmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudE1hcD8ub25SZXN1bHQmJmV2ZW50TWFwPy5vblJlc3VsdChyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uU3RvcDogKCk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6K+t6Z+z5pKt5pS+5YGc5q2iJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRNYXA/Lm9uU3RvcCYmZXZlbnRNYXA/Lm9uU3RvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheUFuaW1hdGlvbihcIndhaXRpbmdcIikgLy8g5Zue5Yiw562J5b6F5Yqo55S7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb25FcnJvcjooZXJyb3I6YW55KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+ivremfs+aSreaUvumUmeivrzonLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5QW5pbWF0aW9uKFwid2FpdGluZ1wiKSAvLyDlm57liLDnrYnlvoXliqjnlLtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLlZvaWNlVFRTTWFwW3ZvaWNlLmlkXSA9IHR0cztcclxuICAgICAgICAgICAgcmV0dXJuIHR0c1xyXG5cclxuICAgICAgICB9Y2F0Y2godHRzZXJyKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcign5pKt5pS+6K+t6Z+z5pe25Ye66ZSZOicsIHR0c2Vycik7XHJcbiAgICAgICAgICAgIHRoaXMucGxheUFuaW1hdGlvbihcIndhaXRpbmdcIikgLy8g5Zue5Yiw562J5b6F5Yqo55S7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog5L+d5a2Y5Y2V5qyh5Lya6K+dXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNhdmVDaGF0U2Vzc2lvbigpe1xyXG4gICAgICAgIGlmKHRoaXMuc2Vzc2lvbklkID09IFwibmV3XCIpe1xyXG4gICAgICAgICAgICB0aGlzLmNoYXRTZXNzaW9uID0gbmV3IHRoaXMuQ2hhdFNlc3Npb24oKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGF0U2Vzc2lvbi5zZXQoXCJ0aXRsZVwiLHRoaXMuZ2VuVGl0bGUoKSlcclxuICAgICAgICB0aGlzLmNoYXRTZXNzaW9uLnNldChcInJvbGVcIix0aGlzLnJvbGU/LnRvUG9pbnRlcigpKVxyXG4gICAgICAgIHRoaXMuY2hhdFNlc3Npb24uc2V0KFwidXNlclwiLFBhcnNlLlVzZXIuY3VycmVudCgpPy50b1BvaW50ZXIoKSlcclxuXHJcbiAgICAgICAgLy8g6ICB57O757uf5raI5oGv5L+d5oyB5LiN5Y+Y77yM5LiN5YGa5Lu75L2V566h55CGXHJcbiAgICAgICAgLy8g5paw57O757uf5raI5oGv6YCa6L+HIE1lc3NhZ2Ug6KGo54us56uL566h55CGXHJcbiAgICAgICAgLy8gY2hhdFNlc3Npb24ubWVzc2FnZUxpc3Qg5LuF55So5LqO5Y6G5Y+y5pWw5o2u5bGV56S6XHJcbiAgICAgICAgLy8g5aaC5p6c5piv5paw5Lya6K+d5LiU5rKh5pyJ6ICB5raI5oGv77yM5Yid5aeL5YyW5Li656m65pWw57uEXHJcbiAgICAgICAgaWYgKCF0aGlzLmNoYXRTZXNzaW9uLmdldChcIm1lc3NhZ2VMaXN0XCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhdFNlc3Npb24uc2V0KFwibWVzc2FnZUxpc3RcIiwgW10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGF0U2Vzc2lvbiA9IGF3YWl0IHRoaXMuY2hhdFNlc3Npb24uc2F2ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLm9uQ2hhdFNhdmVkJiZ0aGlzLm9uQ2hhdFNhdmVkKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHRoaXMuY2hhdFNlc3Npb24/LmlkXHJcbiAgICAgICAgaWYodGhpcy5zZXNzaW9uSWQpe1xyXG4gICAgICAgICAgICAvLyDkv67mlLlVUkzlnLDlnYDkuLpzZXNzaW9uSWTvvIzmlrnkvr/liIbkuqvmiJbliIfmjaIg6KeS6Imy6aG16Z2iID0+IOS8muivnemhtemdolxyXG4gICAgICAgICAgICBsZXQgbmV3SHJlZiA9IGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2NoYXQvcHJvL2NoYXQvJHt0aGlzLnNlc3Npb25JZH1gXHJcbiAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbj8ucGF0aG5hbWU/LmluZGV4T2YoXCJjaGF0L3Nlc3Npb25cIik+LTEpe1xyXG4gICAgICAgICAgICAgICAgbmV3SHJlZiA9IGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2NoYXQvc2Vzc2lvbi9jaGF0LyR7dGhpcy5zZXNzaW9uSWR9YFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRoaXMubW9kZT09XCJtb2RhbFwiKXtcclxuICAgICAgICAgICAgICAgIG5ld0hyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXdIcmVmID0gdGhpcy5nZXRJbnZpdGVVcmwobmV3SHJlZilcclxuICAgICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIG51bGwsIG5ld0hyZWYrd2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XHJcbiAgICAgICAgICAgIC8vIOS/ruaUueacgOaWsOadoWNoYXRMaXN05pWw5o2uXHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgdGhpcy5nZXRNZXNzYWdlTGlzdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzPy5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUHJldmlldyA9IFwiXCI7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGFzdE1lc3NhZ2UuZ2V0KFwiY29udGVudFwiKSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZVByZXZpZXcgPSBsYXN0TWVzc2FnZS5nZXQoXCJjb250ZW50XCIpLnNsaWNlKDAsIDIwKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGxhc3RNZXNzYWdlLmdldChcImNvbnRlbnRcIikpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0SXRlbSA9IGxhc3RNZXNzYWdlLmdldChcImNvbnRlbnRcIikuZmluZChpdGVtID0+IGl0ZW0/LnRleHQpO1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZVByZXZpZXcgPSB0ZXh0SXRlbT8udGV4dD8uc2xpY2UoMCwgMjApIHx8IFwiXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBuZXdDaGF0ID0ge1xyXG4gICAgICAgICAgICAgICAgc2lkOnRoaXMuY2hhdFNlc3Npb24/LmlkLFxyXG4gICAgICAgICAgICAgICAgcmlkOnRoaXMucm9sZT8uaWQsXHJcbiAgICAgICAgICAgICAgICBuYW1lOnRoaXMucm9sZT8uZ2V0KCduYW1lJyksXHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOm1lc3NhZ2VQcmV2aWV3LFxyXG4gICAgICAgICAgICAgICAgbGF0ZXN0OnRoaXMuY2hhdFNlc3Npb24/LmNyZWF0ZWRBdFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY2hhdFNlcnYmJiF0aGlzLmNoYXRTZXJ2Py5jaGF0TGlzdD8ubGVuZ3RoKSB0aGlzLmNoYXRTZXJ2LmNoYXRMaXN0ID0gW11cclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5jaGF0U2Vydj8uY2hhdExpc3Q/LmZpbmQoaXRlbT0+aXRlbT8uc2lkPT1uZXdDaGF0Py5zaWQpXHJcbiAgICAgICAgICAgIGlmKGluZGV4Pi0xKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhdFNlcnYuY2hhdExpc3RbaW5kZXhdID0gbmV3Q2hhdDtcclxuICAgICAgICAgICAgfSBlbHNle1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGF0U2Vydj8uY2hhdExpc3QudW5zaGlmdChuZXdDaGF0KVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldEludml0ZVVybCh1cmwpe1xyXG4gICAgICAgIGxldCB1ID0gbmV3IFVSTCh1cmwpO1xyXG4gICAgICAgIGxldCBpZCA9IFBhcnNlLlVzZXI/LmN1cnJlbnQoKT8uaWRcclxuICAgICAgICAvLyDpmYTliqBpbnZpdGXlj4LmlbBcclxuICAgICAgICB1LnNlYXJjaFBhcmFtcy5zZXQoXCJpbnZpdGVcIixpZClcclxuICAgICAgICByZXR1cm4gdS5ocmVmXHJcbiAgICAgIH1cclxuICAgIC8vIOagueaNruiBiuWkqeWGheWuueWPiumXrumimO+8jOeUn+aIkOagh+mimFxyXG4gICAgZ2VuVGl0bGUoKXtcclxuICAgICAgICBpZih0aGlzLnRpdGxlKSByZXR1cm4gdGhpcy50aXRsZVxyXG4gICAgICAgIGxldCBjb250ZW50OnN0cmluZ3xBcnJheTxDaGF0SW1hZ2VDb250ZW50SXRlbT4gPSAgdGhpcy5tZXNzYWdlTGlzdC5maW5kKGl0ZW09PnRoaXMuZ2V0TWVzc2FnZVByb3BlcnR5KGl0ZW0sICdyb2xlJyk9PVwidXNlclwiKT8uZ2V0KFwiY29udGVudFwiKVxyXG4gICAgICAgIGlmKHR5cGVvZiBjb250ZW50PT1cInN0cmluZ1wiKXsgLy8g5oiq5Zu+5paH5pys5YaF5a655paH5a2X6YOo5YiGXHJcbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSBjb250ZW50Py5zbGljZSgwLDE1KSB8fCBcIlwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHR5cGVvZiBjb250ZW50PT1cIm9iamVjdFwiKXsgLy8g5oiq5Zu+5aSN5ZCI5YaF5a655paH5a2X6YOo5YiGXHJcbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSBjb250ZW50Py5maW5kKGl0ZW09Pml0ZW0/LnRleHQpPy50ZXh0IHx8IFwiXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGl0bGVcclxuICAgIH1cclxuICAgIGZpeE1lc3NhZ2VMaXN0KG1lc3NhZ2VzOkZtb2RlQ2hhdE1lc3NhZ2VbXSl7XHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLm1hcChtc2c9PntyZXR1cm4ge3JvbGU6bXNnLnJvbGUsY29udGVudDptc2cuY29udGVudH19KVxyXG4gICAgfVxyXG5cclxuICAgIG5vd1N0cigpe1xyXG4gICAgICAgIGxldCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHJldHVybiBgJHtub3cuZ2V0RnVsbFllYXIoKX0vJHtub3cuZ2V0TW9udGgoKSsxfS8ke25vdy5nZXREYXRlKCl9ICR7bm93LmdldEhvdXJzKCl9OiR7bm93LmdldE1pbnV0ZXMoKX06JHtub3cuZ2V0U2Vjb25kcygpfWBcclxuICAgIH1cclxuICAgIFxyXG59XHJcblxyXG4iXX0=
|
|
1001
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm1vZGUtY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvY29yZS9hZ2VudC9jaGF0L2Ztb2RlLWNoYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxRCxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDbEYsdUdBQXVHO0FBQ3ZHLE9BQU8sRUFBQyxVQUFVLEVBQWtDLE1BQU0scUJBQXFCLENBQUM7QUFBQSxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RILE9BQU8sRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUduRSxrREFBa0Q7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekQsNERBQTREO0FBQzVELDhDQUE4QztBQUM5QyxxQkFBcUI7QUFHckIsTUFBTSwyQkFBMkIsR0FBRyxzQkFBc0IsQ0FBQztBQUMzRCxNQUFNLHlCQUF5QixHQUFHLG9CQUFvQixDQUFDO0FBSXZELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxPQUE4QztJQUNoRixJQUFJLElBQUksR0FBRyxFQUFFLENBQUE7SUFDYixJQUFHLE9BQU8sT0FBTyxJQUFJLFFBQVE7UUFBRSxJQUFJLEdBQUcsT0FBTyxDQUFBO0lBQzdDLElBQUcsT0FBTyxPQUFPLElBQUksUUFBUTtRQUFFLElBQUksR0FBRyxPQUFPLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUM1RCxPQUFPLElBQUksQ0FBQTtBQUNmLENB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Q0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFDLEVBQUUsR0FBQyxPQUFPLEVBQUMsSUFBSSxFQUFFLEdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFDLE9BQU8sRUFBRSxHQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBQyxDQUFBLENBQUEsQ0FBQyxDQUFDLENBQUE7UUFDdE0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3JDLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELE1BQU07UUFDRixJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3JCLE9BQU8sR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQTtJQUNoSSxDQUFDO0NBRUoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBidWZmZXJUaW1lLCBjb25jYXRNYXAsIE9ic2VydmFibGUsIE9ic2VydmVyLGRlbGF5LCBmaW5hbGl6ZSB9IGZyb20gXCJyeGpzXCJcclxuLy8gdmFyIGJ1ZmZlclRpbWU6YW55LCBjb25jYXRNYXA6YW55LCBPYnNlcnZhYmxlOmFueSwgT2JzZXJ2ZXI6YW55LGRlbGF5OmFueSwgZmluYWxpemU6YW55LE9ic2VydmVyOmFueVxyXG5pbXBvcnQge0Ztb2RlUGFyc2UsRm1vZGVPYmplY3QsRm1vZGVRdWVyeSxGbW9kZVVzZXJ9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3BhcnNlXCI7Y29uc3QgUGFyc2UgPSBGbW9kZVBhcnNlLndpdGgoXCJub3ZhXCIpO1xyXG5pbXBvcnQgeyBGbW9kZVRUUywgRm1vZGVUVFNQcm92aWRlckRvdWJhbyB9IGZyb20gXCIuLi8uLi92b2ljZS90dHNcIjtcclxuaW1wb3J0IHsgTm92YUNsb3VkU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9ub3ZhLWNsb3VkXCI7XHJcbmltcG9ydCB7IE5vdmFTdG9yYWdlIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvc3RvcmFnZVwiO1xyXG4vLyBpbXBvcnQgeyBOYXZDb250cm9sbGVyIH0gZnJvbSBcIkBpb25pYy9hbmd1bGFyXCI7XHJcbmltcG9ydCB7IFByb21wdFRlbXBsYXRlIH0gZnJvbSBcIkBsYW5nY2hhaW4vY29yZS9wcm9tcHRzXCI7XHJcbmltcG9ydCB7IGdldEZvcm1hdFRwbCB9IGZyb20gXCIuLi9wcm9tcHQvcHJvbXB0LXV0aWxcIjtcclxuaW1wb3J0IHsgQ2hhdEltYWdlQ29udGVudEl0ZW0sIEZtb2RlQ2hhdEV2ZW50TWFwLCBGbW9kZUNoYXRNZXNzYWdlLCBGbW9kZUNoYXRNZXNzYWdlVm9pY2UsIEZtb2RlQ2hhdFZvaWNlQ29uZmlnIH0gZnJvbSBcIi4vaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IEZtb2RlQ2hhdENvbXBsZXRpb24gfSBmcm9tIFwiLi9jb21wbGV0aW9uXCI7XHJcbmltcG9ydCB7IE1lc3NhZ2VTY2VuZSwgTWVzc2FnZU1hbmFnZXIgfSBmcm9tIFwiLi9tZXNzYWdlXCI7XHJcbi8vIGltcG9ydCB7IFByb21wdFRlbXBsYXRlIH0gZnJvbSBcIi4vbGliL2xhbmdjaGFpbi9wcm9tcHRzXCI7XHJcbi8vIGltcG9ydCB7IEVsZW1lbnRSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG4vLyB2YXIgUGFyc2U6YW55ID0ge31cclxuXHJcblxyXG5jb25zdCBQcm9tcHRUcGxUYWxrU1NNTE91dHB1dENvZGUgPSBcInRhbGstc3NtbC1vdXRwdXQtdHBsXCI7XHJcbmNvbnN0IFByb21wdFRwbFRhbGtUZXh0U1NNTENvZGUgPSBcInRhbGstdGV4dC1zc21sLXRwbFwiO1xyXG5cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVzc2FnZUNvbnRlbnRUZXh0KGNvbnRlbnQ6YW55fHN0cmluZ3xBcnJheTxDaGF0SW1hZ2VDb250ZW50SXRlbT4pe1xyXG4gICAgbGV0IHRleHQgPSBcIlwiXHJcbiAgICBpZih0eXBlb2YgY29udGVudCA9PSBcInN0cmluZ1wiKSB0ZXh0ID0gY29udGVudFxyXG4gICAgaWYodHlwZW9mIGNvbnRlbnQgPT0gXCJvYmplY3RcIikgdGV4dCA9IGNvbnRlbnQ/LmNvbnRlbnQgfHwgXCJcIlxyXG4gICAgcmV0dXJuIHRleHRcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVzc2FnZUltYWdlVXJsKGNvbnRlbnQ6YW55fHN0cmluZ3xBcnJheTxDaGF0SW1hZ2VDb250ZW50SXRlbT4pe1xyXG4gICAgaWYodHlwZW9mIGNvbnRlbnQgPT0gXCJvYmplY3RcIikgcmV0dXJuIGNvbnRlbnQ/LmltYWdlX3VybD8udXJsIHx8IFwiXCJcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuLyoqXHJcbiAqIEZtb2RlQ2hhdCDogYrlpKnlr7nor53nsbtcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEZtb2RlQ2hhdHtcclxuXHJcbiAgICB0aXRsZTpzdHJpbmdcclxuICAgIHNlc3Npb25JZDpzdHJpbmdcclxuICAgIENoYXRTZXNzaW9uID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIkNoYXRTZXNzaW9uXCIpXHJcbiAgICBjaGF0U2Vzc2lvbjpGbW9kZU9iamVjdFxyXG4gICAgcm9sZTphbnlcclxuICAgIHByaXZhdGUgbWVzc2FnZU1hbmFnZXI6IE1lc3NhZ2VNYW5hZ2VyIHwgbnVsbCA9IG51bGw7IC8vIOa2iOaBr+euoeeQhuWZqFxyXG4gICAgcHJpdmF0ZSBjb21wYW55OiBGbW9kZU9iamVjdHxhbnk7IC8vIOS8geS4muWvueixoVxyXG4gICAgbGF0ZXN0QUlSZXNwb25zZTpzdHJpbmd8dW5kZWZpbmVkID0gYGBcclxuICAgIGNoYXRTZXJ2OmFueVxyXG4gICAgcHVibGljIHVzZXJJbnB1dDpzdHJpbmcgPSBgYDtcclxuICAgIHB1YmxpYyB1c2VySW1hZ2U6c3RyaW5nID0gYGA7XHJcbiAgICBpc0RpcmVjdDpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgbW9kZTpcIm1vZGFsXCJ8XCJwYWdlXCIgPSBcInBhZ2VcIjtcclxuICAgIC8qKlxyXG4gICAgICog5Ye95pWw55Sf5ZG95ZGo5pyfXHJcbiAgICAgKi9cclxuICAgIG9uQ2hhdFNhdmVkOihjaGF0OkZtb2RlQ2hhdCk9PnZvaWRcclxuICAgIG9uTWVzc2FnZTooY2hhdDpGbW9kZUNoYXQsbWVzc2FnZTpGbW9kZUNoYXRNZXNzYWdlKT0+dm9pZFxyXG4gICAgb25Vc2VyU2VuZDooY2hhdDpGbW9kZUNoYXQsbWVzc2FnZTpGbW9kZUNoYXRNZXNzYWdlKT0+Ym9vbGVhbnxQcm9taXNlPGJvb2xlYW4+XHJcbiAgICBvbkNsb3NlOihjaGF0OkZtb2RlQ2hhdCk9PmJvb2xlYW58UHJvbWlzZTxib29sZWFuPlxyXG4gICAgLy8gb25Vc2VySW5wdXQ6KGNoYXQ6Rm1vZGVDaGF0LG1lc3NhZ2U6Rm1vZGVDaGF0TWVzc2FnZSk9PmJvb2xlYW58UHJvbWlzZTxib29sZWFuPlxyXG5cclxuICAgIC8vIOeVjOmdouWKn+iDveaYvuekuuaOp+WItlxyXG4gICAgaGlkZVNoYXJlOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGhpZGVNb2RhbFNlbGVjdDpib29sZWFuID0gZmFsc2U7XHJcbiAgICBoaWRlSW5wdXRQcmV2aWV3OmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlj6/pgInmqKHlnovliJfooajliqDovb1cclxuICAgICAqL1xyXG4gICAgbW9kZWxMaXN0OkFycmF5PEZtb2RlT2JqZWN0PlxyXG4gICAgY3VycmVudE1vZGVsOkZtb2RlT2JqZWN0XHJcbiAgICBhc3luYyBsb2FkTW9kZWxMaXN0KG1vZGVsPzpGbW9kZU9iamVjdCl7XHJcbiAgICAgICAgaWYodGhpcy5tb2RlbExpc3Q/Lmxlbmd0aCkgcmV0dXJuXHJcbiAgICAgICAgbGV0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiQ2hhdE1vZGVsXCIpXHJcbiAgICAgICAgcXVlcnkubm90RXF1YWxUbyhcImlzRGVsZXRlZFwiLHRydWUpXHJcbiAgICAgICAgcXVlcnkuZXF1YWxUbyhcImlzRW5hYmxlZFwiLHRydWUpXHJcbiAgICAgICAgcXVlcnkuYWRkQXNjZW5kaW5nKFwiaW5kZXhcIilcclxuICAgICAgICB0aGlzLm1vZGVsTGlzdCA9IGF3YWl0IHF1ZXJ5LmZpbmQoKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRNb2RlbCA9IG1vZGVsIHx8IHRoaXMubW9kZWxMaXN0Py5maW5kKGl0ZW09Pml0ZW0uZ2V0KFwiY29kZVwiKT09XCJmbW9kZS0xLjYtY25cIilcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInRoaXMuY3VycmVudE1vZGVsXCIsdGhpcy5jdXJyZW50TW9kZWwpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICog6Jma5ouf5b2i6LGh5bGV56S654q25oCBXHJcbiAgICAgKi9cclxuICAgIGlzQXZhdGFyU2hvdzpib29sZWFuID0gZmFsc2U7XHJcbiAgICBhdmF0YXJNb2RlOnN0cmluZyA9IFwiXCI7XHJcbiAgICBhdmF0YXJDb25maWc6YW55fHVuZGVmaW5lZDtcclxuICAgIHNob3dBdmF0YXIoKXtcclxuICAgICAgICB0aGlzLmF2YXRhckNvbmZpZyA9IHRoaXMucm9sZT8uZ2V0KFwiYXZhdGFyQ29uZmlnXCIpXHJcbiAgICAgICAgaWYodGhpcy5hdmF0YXJDb25maWcpe1xyXG4gICAgICAgICAgICB0aGlzLmlzQXZhdGFyU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuYXZhdGFyQ29uZmlnPy5pbWFnZSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF2YXRhckNvbmZpZy5pbWFnZS53YWl0aW5nID0gdGhpcy5hdmF0YXJDb25maWcuaW1hZ2Uud2FpdGluZyB8fCB0aGlzLnJvbGU/LmdldChcInRodW1iXCIpIHx8IHRoaXMucm9sZT8uZ2V0KFwiYXZhdGFyXCIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmF2YXRhck1vZGUgPSBcImltYWdlXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aGlzLmF2YXRhckNvbmZpZz8udmlkZW8pe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdmF0YXJDb25maWcudmlkZW8ud2FpdGluZyA9IHRoaXMuYXZhdGFyQ29uZmlnLnZpZGVvLndhaXRpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMuYXZhdGFyTW9kZSA9IFwidmlkZW9cIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6aKE572u5o+Q56S66K+N5by556qX5piv5ZCm5bGV56S6XHJcbiAgICAgKi9cclxuICAgIGlzUHJvbXB0TW9kYWxPcGVuOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlzUHJvbXB0TWVzc2FnZUFyZWFTaG93OmJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJvbXB0TGlzdDphbnkgPSBbXVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6L6T5YWl5oyJ6ZKu5Yy65Z+fXHJcbiAgICAgKi9cclxuICAgIGZvY3VzVXNlcklucHV0OkZ1bmN0aW9uID0gKCk9Pnt9XHJcbiAgICBuYXZDdHJsOmFueSAvLyBOYXZDb250cm9sbGVyXHJcbiAgICAgbGVmdEJ1dHRvbnM6QXJyYXk8YW55fHt0aXRsZT86c3RyaW5nLHNob3dUaXRsZT86c3RyaW5nfT4gPSBbXHJcbiAgICAgICAgLy8g5o+Q56S6IOW9k+inkuiJsumFjee9rumihOiuvuaPkOekuuivjeaXtiDmmL7npLpcclxuICAgICAgICB7dGl0bGU6XCLngbXmhJ9cIixpY29uOlwiY29sb3Itd2FuZC1vdXRsaW5lXCIsb25DbGljazooKT0+e1xyXG4gICAgICAgICAgdGhpcy5pc1Byb21wdE1vZGFsT3BlbiA9IHRydWVcclxuICAgICAgICB9LHNob3c6KCk9PntcclxuICAgICAgICAgIHJldHVybiB0aGlzPy5wcm9tcHRMaXN0Py5sZW5ndGhcclxuICAgICAgICB9fSxcclxuICAgICAgICB7dGl0bGU6XCLop5LoibJcIixpY29uOlwicGVvcGxlLW91dGxpbmVcIixvbkNsaWNrOigpPT57XHJcbiAgICAgICAgICB0aGlzLm5hdkN0cmw/Lm5hdmlnYXRlUm9vdChcIi9jaGF0L3Byby9tYXNrXCIpO1xyXG4gICAgICAgIH0sc2hvdzooKT0+e3JldHVybiB0cnVlfX0sXHJcbiAgICAgICAge3RpdGxlOlwi5ZG85Y+rXCIsaWNvbjpcImNhbGwtb3V0bGluZVwiLG9uQ2xpY2s6KCk9PntcclxuICAgICAgICAgICAgdGhpcy5jaGF0U2Vydj8uY2FsbFJvbGUodGhpcy5yb2xlKVxyXG4gICAgICAgIH0sc2hvdzooKT0+e1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXM/LnJvbGU/LmdldCgndm9pY2VDb25maWcnKTtcclxuICAgICAgICB9fSxcclxuICAgICAgXVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuW8gOWQr+ivremfs+a2iOaBr+aooeW8j++8iOWNleasoe+8iVxyXG4gICAgICovXHJcbiAgICBpc1ZvaWNlSW5wdXRNb2RlOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlzVGV4dGluZzpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKblvIDlkK/lrp7ml7blr7nor53mqKHlvI/vvIjlrp7ml7bvvIlcclxuICAgICAqIEBkZXNjXHJcbiAgICAgKiDlvIDlkK9zc21sIHN5c3RlbeaPkOekuuivjVxyXG4gICAgICog5byA5ZCv5Zue562U5paH5pys6ZmkeG1s5pi+56S65qih5byPXHJcbiAgICAgKi9cclxuICAgIHZvaWNlQ29uZmlnOkZtb2RlQ2hhdFZvaWNlQ29uZmlnfHVuZGVmaW5lZFxyXG4gICAgaXNUYWxrTW9kZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICBTU01MUm9sZVZvaWNlOnN0cmluZyA9IFwiemgtQ04tWGlhb3hpYW9OZXVyYWxcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOa7muWKqOiHs+a2iOaBr+WMuuWfn+W6lemDqOaWueazlVxyXG4gICAgICogQGRlc2Mg6YCa6L+HY2hhdC1wYW5lbOetieiBiuWkqemdouadv++8jOi1i+WAvOivpeaWueazlVxyXG4gICAgICovXHJcbiAgICBzY3JvbGxDb21wOmFueSAvLyBFbGVtZW50UmVmO1xyXG4gICAgLy8gc2Nyb2xsVG9Cb3R0b206RnVuY3Rpb247XHJcbiAgICBzY3JvbGxUb0JvdHRvbShjb21wPzphbnkpe1xyXG4gICAgICAgIGNvbXAgPSBjb21wIHx8IHRoaXMuc2Nyb2xsQ29tcDtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhjb21wKVxyXG4gICAgICAgIGlmKGNvbXA/Lm5hdGl2ZUVsZW1lbnQ/LnNjcm9sbEhlaWdodCl7XHJcbiAgICAgICAgICBjb21wLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gY29tcC5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5L6d6LWW5pyN5YqhXHJcbiAgICAgKi9cclxuICAgIG5jbG91ZDpOb3ZhQ2xvdWRTZXJ2aWNlO1xyXG4gICAgc3RvcmFnZTpOb3ZhU3RvcmFnZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBzZXNzaW9uSWQ6c3RyaW5nLHJvbGU/OkZtb2RlT2JqZWN0LGNoYXRTZXNzaW9uPzpGbW9kZU9iamVjdCxjaGF0U2Vydj86YW55LFxyXG4gICAgICAgIG5hdkN0cmw/OmFueSwvL05hdkNvbnRyb2xsZXIsXHJcbiAgICAgICAgbmNsb3VkPzpOb3ZhQ2xvdWRTZXJ2aWNlLFxyXG4gICAgICAgIHN0b3JhZ2U/Ok5vdmFTdG9yYWdlLFxyXG4gICAgICAgICl7XHJcbiAgICAgICAgdGhpcy5jaGF0U2VydiA9IGNoYXRTZXJ2XHJcbiAgICAgICAgdGhpcy5yb2xlID0gcm9sZVxyXG4gICAgICAgIHRoaXMuc2Vzc2lvbklkID0gc2Vzc2lvbklkXHJcbiAgICAgICAgdGhpcy5uYXZDdHJsID0gbmF2Q3RybFxyXG4gICAgICAgIHRoaXMubmNsb3VkID0gbmNsb3VkXHJcbiAgICAgICAgdGhpcy5zdG9yYWdlID0gc3RvcmFnZVxyXG5cclxuICAgICAgICAvLyDliJ3lp4vljJbkvIHkuJrkv6Hmga/vvIjlvILmraXvvIzkuI3pmLvloZ7vvIlcclxuICAgICAgICB0aGlzLmluaXRDb21wYW55KCk7XHJcblxyXG4gICAgICAgIGlmKGNoYXRTZXNzaW9uPy5pZCl7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhdFNlc3Npb24gPSBjaGF0U2Vzc2lvbjtcclxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBjaGF0U2Vzc2lvbj8uaWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDlu7bov5/liJ3lp4vljJbmtojmga/nrqHnkIblmajvvIjmh5LliqDovb3mqKHlvI/vvIlcclxuICAgICAgICAvLyDnoa7kv51jb21wYW555YWI5Yid5aeL5YyW5a6M5oiQXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlTWVzc2FnZU1hbmFnZXIoKTtcclxuICAgICAgICB9LCAwKTtcclxuXHJcbiAgICAgICAgaWYodGhpcy5yb2xlPy5pZCl7XHJcbiAgICAgICAgICAgIHRoaXMudm9pY2VDb25maWcgPSB0aGlzLnJvbGU/LmdldChcInZvaWNlQ29uZmlnXCIpXHJcbiAgICAgICAgICAgIGlmKHRoaXMudm9pY2VDb25maWc/LmF1dG9UYWxrKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUYWxrTW9kZSA9IHRoaXMuaXNUYWxrTW9kZSB8fCB0aGlzLnZvaWNlQ29uZmlnPy5hdXRvVGFsaztcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNEaXJlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vID09PT09PT09PT0g5raI5oGv5YiX6KGo5o6l5Y+jID09PT09PT09PT1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIm+W7uumihOiniOa2iOaBr+eahEZtb2RlT2JqZWN0XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVByZXZpZXdNZXNzYWdlKHJvbGU6IHN0cmluZywgY29udGVudDogYW55LCB2b2ljZT86IGFueSk6IEZtb2RlT2JqZWN0IHtcclxuICAgICAgICBjb25zdCBNZXNzYWdlID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIk1lc3NhZ2VcIik7XHJcbiAgICAgICAgY29uc3QgcHJldmlld01lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpO1xyXG5cclxuICAgICAgICBwcmV2aWV3TWVzc2FnZS5zZXQoXCJyb2xlXCIsIHJvbGUpO1xyXG4gICAgICAgIHByZXZpZXdNZXNzYWdlLnNldChcImNvbnRlbnRcIiwgY29udGVudCk7XHJcbiAgICAgICAgcHJldmlld01lc3NhZ2Uuc2V0KFwiY29tcGxldGVcIiwgdHJ1ZSk7XHJcbiAgICAgICAgcHJldmlld01lc3NhZ2Uuc2V0KFwiY3JlYXRlZEF0XCIsIG5ldyBEYXRlKCkpO1xyXG5cclxuICAgICAgICBpZiAodm9pY2UpIHtcclxuICAgICAgICAgICAgcHJldmlld01lc3NhZ2Uuc2V0KFwidm9pY2VcIiwgdm9pY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByZXZpZXdNZXNzYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5raI5oGv5bGe5oCn55qE6L6F5Yqp5pa55rOVXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0TWVzc2FnZVByb3BlcnR5KG1zZzogRm1vZGVPYmplY3QgfCB1bmRlZmluZWQsIHByb3A6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgaWYgKCFtc2cpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuIG1zZy5nZXQocHJvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDorr7nva7mtojmga/lsZ7mgKfnmoTovoXliqnmlrnms5VcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRNZXNzYWdlUHJvcGVydHkobXNnOiBGbW9kZU9iamVjdCB8IHVuZGVmaW5lZCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFtc2cpIHJldHVybjtcclxuICAgICAgICBtc2cuc2V0KHByb3AsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWwhkZtb2RlT2JqZWN06L2s5o2i5Li6Rm1vZGVDaGF0TWVzc2FnZeagvOW8j+eahOWFvOWuueaWueazlVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbnZlcnRUb01lc3NhZ2VGb3JtYXQobXNnOiBGbW9kZU9iamVjdCB8IHVuZGVmaW5lZCk6IGFueSB7XHJcbiAgICAgICAgaWYgKCFtc2cpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IG1zZy5pZCxcclxuICAgICAgICAgICAgcm9sZTogdGhpcy5nZXRNZXNzYWdlUHJvcGVydHkobXNnLCAncm9sZScpLFxyXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShtc2csICdjb250ZW50JyksXHJcbiAgICAgICAgICAgIGNvbXBsZXRlOiB0aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShtc2csICdjb21wbGV0ZScpLFxyXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IHRoaXMuZ2V0TWVzc2FnZVByb3BlcnR5KG1zZywgJ2NyZWF0ZWRBdCcpIHx8IG1zZy5jcmVhdGVkQXQsXHJcbiAgICAgICAgICAgIHZvaWNlOiB0aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShtc2csICd2b2ljZScpLFxyXG4gICAgICAgICAgICBjaWQ6IHRoaXMuZ2V0TWVzc2FnZVByb3BlcnR5KG1zZywgJ2NpZCcpLFxyXG4gICAgICAgICAgICBqc29uOiB0aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShtc2csICdqc29uJyksXHJcbiAgICAgICAgICAgIGhpZGRlbjogdGhpcy5nZXRNZXNzYWdlUHJvcGVydHkobXNnLCAnaGlkZGVuJyksXHJcbiAgICAgICAgICAgIC8vIOS/neWtmOWOn+Wni+WvueixoeW8leeUqFxyXG4gICAgICAgICAgICBfb3JpZ2luYWw6IG1zZ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmibnph4/ovazmjaLmtojmga/liJfooahcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb252ZXJ0TWVzc2FnZXMobWVzc2FnZXM6IEZtb2RlT2JqZWN0W10pOiBhbnlbXSB7XHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLm1hcChtc2cgPT4gdGhpcy5jb252ZXJ0VG9NZXNzYWdlRm9ybWF0KG1zZykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5raI5oGv5YiX6KGo77yI5YW85a656ICB54mI5pys77yJXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldE1lc3NhZ2VMaXN0KCk6IFByb21pc2U8Rm1vZGVPYmplY3RbXT4ge1xyXG4gICAgICAgIC8vIOehruS/nSBtZXNzYWdlTWFuYWdlciDlt7LliJ3lp4vljJZcclxuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZU1lc3NhZ2VNYW5hZ2VyKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlTWFuYWdlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOebtOaOpei/lOWbnkZtb2RlT2JqZWN05pWw57uE77yM5peg6ZyA6L2s5o2iXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPlua2iOaBr+WIl+ihqO+8iOWQjOatpeeJiOacrO+8jOS8mOWMlueJiO+8iVxyXG4gICAgICog55u05o6l6L+U5ZueTWVzc2FnZU1hbmFnZXLnmoRGbW9kZU9iamVjdFtd77yM6YG/5YWN5qC85byP6L2s5o2iXHJcbiAgICAgKi9cclxuICAgIGdldCBtZXNzYWdlTGlzdCgpOiBGbW9kZU9iamVjdFtdIHtcclxuICAgICAgICAvLyDlpoLmnpzmsqHmnInmtojmga/nrqHnkIblmajvvIzov5Tlm57nqbrmlbDnu4RcclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g55u05o6l6K6/6ZeuTWVzc2FnZU1hbmFnZXLnmoRfbWVzc2FnZUxpc3TvvIzov5Tlm55GbW9kZU9iamVjdFtdXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZU9iamVjdHMgPSB0aGlzLm1lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VMaXN0KCk7XHJcblxyXG4gICAgICAgIGlmICghbWVzc2FnZU9iamVjdHMgfHwgbWVzc2FnZU9iamVjdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOebtOaOpei/lOWbnkZtb2RlT2JqZWN05pWw57uE77yM5peg6ZyA6L2s5o2iXHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VPYmplY3RzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K6+572u5raI5oGv5YiX6KGo77yI5Li76KaB55So5LqO5YW85a656ICB54mI5pys77yJXHJcbiAgICAgKi9cclxuICAgIHNldCBtZXNzYWdlTGlzdChtZXNzYWdlczogRm1vZGVPYmplY3RbXSkge1xyXG4gICAgICAgIC8vIOi/meS4quaWueazleS4u+imgeeUqOS6juWFvOWuue+8jOWunumZheaVsOaNrueUsU1lc3NhZ2VNYW5hZ2Vy566h55CGXHJcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlTWFuYWdlci5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5raI5oGv566h55CG5ZmoXHJcbiAgICAgKiDlhbPplK7vvJrljbPkvb/msqHmnIljaGF0U2Vzc2lvbi5pZOS5n+iDveWIneWni+WMlu+8iOaWsOS8muivneWcuuaZr++8iVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGluaXRNZXNzYWdlTWFuYWdlcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICAvLyDnoa7kv50gY29tcGFueSDlt7LliJ3lp4vljJZcclxuICAgICAgICBpZiAoIXRoaXMuY29tcGFueSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXRDb21wYW55KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5yb2xlICYmIHRoaXMuY29tcGFueSkge1xyXG4gICAgICAgICAgICAvLyDkvb/nlKjmmbrog73kvZPlr7nor53lnLrmma/nmoTmtojmga/nrqHnkIblmahcclxuICAgICAgICAgICAgLy8gY2hhdFNlc3Npb27lj6/og73mmoLml7bmsqHmnIlpZO+8iOaWsOS8muivne+8ie+8jOS9hm1hbmFnZXLku43nhLblj6/ku6Xlt6XkvZxcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlTWFuYWdlciA9IE1lc3NhZ2VNYW5hZ2VyLmNyZWF0ZUZvclJvbGUoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRTZXNzaW9uIHx8IG5ldyBQYXJzZS5PYmplY3QoXCJDaGF0U2Vzc2lvblwiKSxcclxuICAgICAgICAgICAgICAgIHRoaXMucm9sZSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFueVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOehruS/nea2iOaBr+euoeeQhuWZqOW3suWIneWni+WMlu+8iOaHkuWKoOi9ve+8iVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGVuc3VyZU1lc3NhZ2VNYW5hZ2VyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlTWFuYWdlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXRNZXNzYWdlTWFuYWdlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5LyB5Lia5L+h5oGvXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXRDb21wYW55KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbXBhbnkpIHJldHVybjsgLy8g5bey57uP5Yid5aeL5YyWXHJcblxyXG4gICAgICAgIGNvbnN0IGNvbXBhbnlJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY29tcGFueVwiKTtcclxuICAgICAgICBpZiAoY29tcGFueUlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGFueSA9IHtcclxuICAgICAgICAgICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQ29tcGFueVwiLFxyXG4gICAgICAgICAgICAgICAgb2JqZWN0SWQ6IGNvbXBhbnlJZFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoOa2iOaBr++8iOS8mOWMlueJiO+8iVxyXG4gICAgICog55u05o6l5re75Yqg5YiwTWVzc2FnZU1hbmFnZXLnmoRfbWVzc2FnZUxpc3TvvIzlu7bov5/kv53lrZhcclxuICAgICAqL1xyXG4gICAgYXN5bmMgYWRkTWVzc2FnZShcclxuICAgICAgICBjb250ZW50OiBGbW9kZUNoYXRNZXNzYWdlLFxyXG4gICAgICAgIHNjZW5lOiBNZXNzYWdlU2NlbmUgPSBNZXNzYWdlU2NlbmUuUk9MRVxyXG4gICAgKTogUHJvbWlzZTxGbW9kZU9iamVjdD4ge1xyXG4gICAgICAgIC8vIOehruS/nSBtZXNzYWdlTWFuYWdlciDlt7LliJ3lp4vljJZcclxuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZU1lc3NhZ2VNYW5hZ2VyKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlTWFuYWdlcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJNZXNzYWdlTWFuYWdlcuWIneWni+WMluWksei0pe+8jOaXoOazlea3u+WKoOa2iOaBr1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8g55u05o6l5re75Yqg5YiwTWVzc2FnZU1hbmFnZXLvvIzojrflj5ZGbW9kZU9iamVjdFxyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlT2JqID0gdGhpcy5tZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlKGNvbnRlbnQsIHNjZW5lKTtcclxuXHJcbiAgICAgICAgICAgIC8vIOW8guatpeS/neWtmO+8jOS4jemYu+WhnuS4u+a1geeoi1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZU1hbmFnZXI/LnNhdmVNZXNzYWdlKG1lc3NhZ2VPYmopO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VPYmpcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIua3u+WKoOa2iOaBr+Wksei0pTpcIiwgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOabtOaWsOa2iOaBr++8iOS8mOWMlueJiO+8iVxyXG4gICAgICog55u05o6l6YCa6L+H5LiL5qCH5pu05pawTWVzc2FnZU1hbmFnZXLkuK3nmoTmtojmga9cclxuICAgICAqL1xyXG4gICAgdXBkYXRlTWVzc2FnZShcclxuICAgICAgICBtZXNzYWdlT2JqOiBGbW9kZU9iamVjdCxcclxuICAgICAgICBjb250ZW50OiBQYXJ0aWFsPEZtb2RlQ2hhdE1lc3NhZ2U+XHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiTWVzc2FnZU1hbmFnZXLmnKrliJ3lp4vljJbvvIzml6Dms5Xmm7TmlrDmtojmga9cIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIOebtOaOpeabtOaWsE1lc3NhZ2VNYW5hZ2Vy5Lit55qE5raI5oGvXHJcbiAgICAgICAgICAgIGNvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5tZXNzYWdlT2JqLmdldChcImNvbnRlbnRcIiksXHJcbiAgICAgICAgICAgICAgICAuLi5jb250ZW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJjb250ZW50XCIsY29udGVudClcclxuXHJcbiAgICAgICAgICAgIGlmIChtZXNzYWdlT2JqKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VNYW5hZ2VyLnNhdmVNZXNzYWdlKG1lc3NhZ2VPYmopO1xyXG4gICAgICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIuabtOaWsOa2iOaBr+Wksei0pTpcIiwgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmAmui/h+S4i+agh+iOt+WPlua2iOaBr++8iOS8mOWMlueJiO+8iVxyXG4gICAgICovXHJcbiAgICBnZXRNZXNzYWdlKGluZGV4OiBudW1iZXIpOiBGbW9kZU9iamVjdCB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VNYW5hZ2VyKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAvLyDnm7TmjqXov5Tlm55GbW9kZU9iamVjdO+8jOaXoOmcgOi9rOaNolxyXG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2UoaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5pyA5paw5raI5oGvXHJcbiAgICAgKi9cclxuICAgIGdldExhc3RNZXNzYWdlKCk6IEZtb2RlT2JqZWN0IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZU1hbmFnZXIpIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIC8vIOebtOaOpei/lOWbnkZtb2RlT2JqZWN077yM5peg6ZyA6L2s5o2iXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZU1hbmFnZXIuZ2V0TGFzdE1lc3NhZ2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPlua2iOaBr+aVsOmHj1xyXG4gICAgICovXHJcbiAgICBnZXRNZXNzYWdlQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlTWFuYWdlciA/IHRoaXMubWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZUNvdW50KCkgOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCa6L+H5LiL5qCH5L+d5a2Y5raI5oGv5a+56LGhXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNhdmVNZXNzYWdlKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZU1hbmFnZXIpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZU9iaiA9IHRoaXMubWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZShpbmRleCk7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2VPYmopIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tZXNzYWdlTWFuYWdlci5zYXZlTWVzc2FnZShtZXNzYWdlT2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOmHjeaWsOWKoOi9vea2iOaBr1xyXG4gICAgICovXHJcbiAgICBhc3luYyByZWxvYWRNZXNzYWdlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5tZXNzYWdlTWFuYWdlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2VNYW5hZ2VyLnJlbG9hZE1lc3NhZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Lya6K+dQXZhdGFy5o6n5Yi2XHJcbiAgICAgKi9cclxuICAgIHBsYXlBbmltYXRpb24gPSAoYW5pbU5hbWU6c3RyaW5nKT0+e1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGFuaW1OYW1lKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgd2VsY29tZSA9IGFzeW5jICgpPT57XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBhd2FpdCB0aGlzLmdldE1lc3NhZ2VMaXN0KCk7XHJcbiAgICAgICAgbGV0IG1zZ2xpc3QgPSBtZXNzYWdlcz8uZmlsdGVyKGl0ZW09PnRoaXMuZ2V0TWVzc2FnZVByb3BlcnR5KGl0ZW0sICdyb2xlJyk9PVwiYXNzaXN0YW50XCIpO1xyXG4gICAgICAgIGlmKG1zZ2xpc3Q/Lmxlbmd0aCkgcmV0dXJuIC8vIOW3suacieWvueivneS4jeW8gOWcuumXruWAmVxyXG5cclxuICAgICAgICBsZXQgdXNlciA9IFBhcnNlLlVzZXIuY3VycmVudCgpO1xyXG4gICAgICAgIGxldCBwZXJzb24gPSBhd2FpdCB0aGlzLmxvYWRTZWxmKFwiUGVyc29uXCIsXCJ1c2VyVmVyaWZ5XCIpXHJcbiAgICAgICAgbGV0IHByb2ZpbGUgPSBhd2FpdCB0aGlzLmxvYWRTZWxmKFwiUHJvZmlsZVwiLFwidXNlclwiKVxyXG4gICAgICAgIGxldCBwZXJzb25OYW1lID0gcGVyc29uPy5nZXQoXCJuYW1lXCIpIHx8IHBlcnNvbj8uZ2V0KFwidXNlclZlZmlyeVwiKT8uZ2V0KFwicmVhbG5hbWVcIikgfHwgcGVyc29uPy5nZXQoXCJ1c2VyVmVmaXJ5XCIpPy5nZXQoXCJuaWNrbmFtZVwiKVxyXG4gICAgICAgIGxldCB1c2VyTmFtZSA9IHVzZXI/LmdldChcIm5pY2tuYW1lXCIpIHx8IHByb2ZpbGU/LmdldChcIm5hbWVcIikgfHwgdXNlcj8uZ2V0KFwicmVhbG5hbWVcIikgfHwgdXNlcj8uZ2V0KFwibmFtZVwiKVxyXG4gICAgICAgIGlmKHBlcnNvbj8uZ2V0KFwidXNlclZlcmlmeVwiKT8uaWQgPT0gdXNlcj8uaWQpe1xyXG4gICAgICAgICAgICBwZXJzb25OYW1lID0gXCLmgqhcIiAvLyDlvZPmnKzkurrml7bvvIznp7Dlkbzop5LoibLkuLrmgqhcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIXVzZXJOYW1lKXsgLy8g6Iul55So5oi35peg5aeT5ZCN77yM5YiZ55So5b2T5YmN5biQ5Y+35ZCN56ew5YGa56ew5ZG8XHJcbiAgICAgICAgICAgIHVzZXJOYW1lID0gcGVyc29uTmFtZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g6Zeu5YCZ6K+tL+mmluS4quivnemimFxyXG4gICAgICAgIC8vIOWNleS4qumXruWAmeivreebtOaOpeWKoOi9vVxyXG4gICAgICAgIGxldCB0cGwgPSB0aGlzLnJvbGUuZ2V0KFwidm9pY2VDb25maWdcIik/LndlbGNvbWU/LnByb21wdFxyXG4gICAgICAgIC8vIOWkmuadoemXruWAmeivremaj+WNs+WKoOi9vVxyXG4gICAgICAgIGlmKHRoaXMucm9sZS5nZXQoXCJ2b2ljZUNvbmZpZ1wiKT8ud2VsY29tZT8ucHJvbXB0TGlzdD8ubGVuZ3RoKXtcclxuICAgICAgICAgICAgbGV0IHRwbExpc3QgPSB0aGlzLnJvbGUuZ2V0KFwidm9pY2VDb25maWdcIik/LndlbGNvbWU/LnByb21wdExpc3Q7XHJcbiAgICAgICAgICAgIGxldCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRwbExpc3QubGVuZ3RoKTtcclxuICAgICAgICAgICAgdHBsID0gdHBsTGlzdFtyYW5kb21JbmRleF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZighdHBsKSByZXR1cm4gLy8g5peg5qih5p2/5YiZ6L+U5ZueXHJcbiAgICAgICAgbGV0IHdlbGNvbWVDb250ZW50ID0gYXdhaXQgUHJvbXB0VGVtcGxhdGUuZnJvbVRlbXBsYXRlKHRwbCx7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlRm9ybWF0OlwibXVzdGFjaGVcIlxyXG4gICAgICAgIH0pLmZvcm1hdCh7XHJcbiAgICAgICAgICAgIG5hbWU6dXNlck5hbWUsIC8vIOeUqOaIt+ensOWRvFxyXG4gICAgICAgICAgICB1c2VyTmFtZTp1c2VyTmFtZSwgLy8g55So5oi356ew5ZG8XHJcbiAgICAgICAgICAgIHBlcnNvbk5hbWU6cGVyc29uTmFtZSwgLy8g6KeS6Imy56ew5ZG8XHJcbiAgICAgICAgICAgIHRpbWVPZkRheTp0aGlzLmdldFRpbWVPZkRheSgpXHJcbiAgICAgICAgfSlcclxuICAgICAgICAvLyBsZXQgY2FsbE5hbWUgPSBuYW1lP2Ake25hbWV977yMYDpcIlwiO1xyXG4gICAgICAgIC8vIGxldCBjYWxsVGltZSA9IGAke3RoaXMuZ2V0VGltZU9mRGF5KCl95aW9YDtcclxuICAgICAgICAvLyBsZXQgd2VsY29tZUNvbnRlbnQgPSBgJHtjYWxsTmFtZX0ke2NhbGxUaW1lfe+8jOacn+W+heiBhuWQrOaCqOeahOS6uueUn+aVheS6i++8jOaDs+WSjOaIkeiBiuS6m+S7gOS5iOWRou+8n2A7XHJcblxyXG4gICAgICAgIC8vIOeUn+aIkENoYXRWb2ljZeW5tuaSreaUvlxyXG4gICAgICAgIGxldCB2b2ljZSA9IGF3YWl0IHRoaXMuZ2V0Vm9pY2VCeUNvbnRlbnRUZXh0KHdlbGNvbWVDb250ZW50KTtcclxuICAgICAgICBsZXQgbWVzc2FnZSA9IHtcclxuICAgICAgICAgICAgcm9sZTpcImFzc2lzdGFudFwiLFxyXG4gICAgICAgICAgICB2b2ljZTogdm9pY2UsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6d2VsY29tZUNvbnRlbnQsXHJcbiAgICAgICAgICAgIGNvbXBsZXRlOnRydWUsXHJcbiAgICAgICAgICAgIGNyZWF0ZWRBdDpuZXcgRGF0ZSgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDmt7vliqDmtojmga/liLDliJfooahcclxuICAgICAgICBhd2FpdCB0aGlzLmFkZE1lc3NhZ2UobWVzc2FnZSwgTWVzc2FnZVNjZW5lLlJPTEUpO1xyXG5cclxuICAgICAgICB0aGlzLnZvaWNlTWFwW3ZvaWNlPy5pZF1cclxuICAgICAgICB0aGlzLnBsYXlDaGF0Vm9pY2UodGhpcy52b2ljZU1hcFt2b2ljZT8uaWRdKVxyXG4gICAgfVxyXG4gICAgZ2V0VGltZU9mRGF5KCkge1xyXG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgY29uc3QgaG91cnMgPSBub3cuZ2V0SG91cnMoKTtcclxuICAgICAgICBpZiAoaG91cnMgPj0gNSAmJiBob3VycyA8IDEyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIuaXqeS4ilwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPj0gMTIgJiYgaG91cnMgPCAxNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCLkuK3ljYhcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKGhvdXJzID49IDE0ICYmIGhvdXJzIDwgMTgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwi5LiL5Y2IXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwi5pma5LiKXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2VsZjp7XHJcbiAgICAgICAgUGVyc29uPzpGbW9kZU9iamVjdHx1bmRlZmluZWRcclxuICAgICAgICBQcm9maWxlPzpGbW9kZU9iamVjdHx1bmRlZmluZWRcclxuICAgIH0gPSB7fVxyXG4gICAgYXN5bmMgbG9hZFNlbGYoY2xhc3NOYW1lLHVzZXJLZXkpe1xyXG4gICAgICAgIGlmKHRoaXMuc2VsZltjbGFzc05hbWVdKSByZXR1cm4gdGhpcy5zZWxmW2NsYXNzTmFtZV1cclxuICAgICAgICBsZXQgdXNlciA9IFBhcnNlLlVzZXIuY3VycmVudCgpO1xyXG4gICAgICAgIGxldCBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShjbGFzc05hbWUpO1xyXG4gICAgICAgIHF1ZXJ5LmluY2x1ZGUodXNlcktleSlcclxuICAgICAgICBxdWVyeS5lcXVhbFRvKHVzZXJLZXksdXNlcj8uaWQpO1xyXG4gICAgICAgIHRoaXMuc2VsZltjbGFzc05hbWVdID0gYXdhaXQgcXVlcnkuZmlyc3QoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWxmW2NsYXNzTmFtZV1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlr7nor53mqKHlnovmj5DnpLror41cclxuICAgICAqL1xyXG4gICAgIGFzeW5jIGxvYWRUYWxrU3lzdGVtUHJvbXB0KHJvbGU6Rm1vZGVPYmplY3Qpe1xyXG4gICAgICAgIGlmKCF0aGlzLmlzVGFsa01vZGUpIHJldHVyblxyXG4gICAgICAgIGlmKCFyb2xlKSByZXR1cm5cclxuICAgICAgICBsZXQgdm9pY2VDb25maWc6YW55ID0gcm9sZT8uZ2V0KFwidm9pY2VDb25maWdcIilcclxuXHJcbiAgICAgICAgLy8g5Yqg6L295aOw6Z+z5qih5Z6L77ya6buY6K6k5Li65pmT5pmTXHJcbiAgICAgICAgaWYocm9sZT8uZ2V0KCdnZW5kZXInKT09J+eUtycpe1xyXG4gICAgICAgICAgdGhpcy5TU01MUm9sZVZvaWNlID0gXCJ6aC1DTi1ZdW55ZU5ldXJhbFwiXHJcbiAgICAgICAgICBpZih2b2ljZUNvbmZpZy5wcm92aWRlcj09XCJkb3ViYW9cIil7XHJcbiAgICAgICAgICAgIHRoaXMuU1NNTFJvbGVWb2ljZSA9IFwiemhfbWFsZV95YW5nZ3VhbmdxaW5nbmlhbl9lbW9fdjJfbWFyc19iaWd0dHNcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5TU01MUm9sZVZvaWNlID0gXCJ6aC1DTi1YaWFveGlhb05ldXJhbFwiXHJcbiAgICAgICAgICBpZih2b2ljZUNvbmZpZy5wcm92aWRlcj09XCJkb3ViYW9cIil7XHJcbiAgICAgICAgICAgIHRoaXMuU1NNTFJvbGVWb2ljZSA9IFwiemhfZmVtYWxlX3NodWFuZ2t1YWlzaXNpX2Vtb192Ml9tYXJzX2JpZ3R0c1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLlNTTUxSb2xlVm9pY2UgPSByb2xlPy5nZXQoXCJ2b2ljZUNvbmZpZ1wiKT8udm9pY2UgfHwgdGhpcy5TU01MUm9sZVZvaWNlIFxyXG4gICAgICAgIGxldCBTU01MUHJvbXB0VGVtcGxhdGUgPSBhd2FpdCBnZXRGb3JtYXRUcGwoUHJvbXB0VHBsVGFsa1NTTUxPdXRwdXRDb2RlLHtcclxuICAgICAgICAgICAgU1NNTFJvbGVWb2ljZTogdGhpcy5TU01MUm9sZVZvaWNlLCAvLyBTU01MIFxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIGxldCBwcm9tcHQgPSByb2xlLmdldChcInByb21wdFwiKSB8fCBcIuivt+S9oOaJrua8lOmjnueggUFJ55qE5Lq65bel5pm66IO95LiT5a6244CCXCJcclxuICAgICAgICBwcm9tcHQgKz0gU1NNTFByb21wdFRlbXBsYXRlO1xyXG4gICAgICAgIGxldCBwcm9tcHRNc2c6Rm1vZGVDaGF0TWVzc2FnZSA9IHtyb2xlOlwidXNlclwiLGNvbnRlbnQ6cHJvbXB0LGhpZGRlbjp0cnVlfVxyXG5cclxuICAgICAgICAvLyDmn6Xph41cclxuICAgICAgICBsZXQgY29udGVudCA9IHRoaXMubWVzc2FnZUxpc3Q/Lm1hcChpdGVtPT50aGlzLmdldE1lc3NhZ2VQcm9wZXJ0eShpdGVtLCAnY29udGVudCcpKS5qb2luKClcclxuICAgICAgICBpZihjb250ZW50LmluZGV4T2YocHJvbXB0KT4tMSl7XHJcbiAgICAgICAgICAgIC8vIOaPkOekuuivjeW3sue7j+WtmOWcqFxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g6KGl5YWo5o+Q56S66K+NIC0g5L2/55SoIGFkZE1lc3NhZ2Ug56Gu5L+d5q2j56Gu5L+d5a2YXHJcbiAgICAgICAgdGhpcy5hZGRNZXNzYWdlKHByb21wdE1zZywgTWVzc2FnZVNjZW5lLlJPTEUpO1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIHJvbGVQcm9tcHQ6c3RyaW5nXHJcbiAgICAvKipcclxuICAgICAqIOinkuiJsuaPkOekuuivjVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgYXN5bmMgbG9hZFJvbGVQcm9tcHQoKXtcclxuICAgICAgICAvLyDnoa7kv50gbWVzc2FnZU1hbmFnZXIg5bey5Yid5aeL5YyWXHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVNZXNzYWdlTWFuYWdlcigpO1xyXG5cclxuICAgICAgICAvLyDop5LoibLmj5DnpLpcclxuICAgICAgICBsZXQgcHJvbXB0ID0gdGhpcy5yb2xlPy5nZXQoXCJwcm9tcHRcIilcclxuICAgICAgICBpZighcHJvbXB0KSByZXR1cm4gLy8g5peg5o+Q56S66K+N5peg6ZyA5re75YqgXHJcbiAgICAgICAgdGhpcy5yb2xlUHJvbXB0ID0gcHJvbXB0XHJcbiAgICAgICAgLy8g5L2/55SoIGFkZE1lc3NhZ2Ug5re75Yqg5o+Q56S66K+N77yM56Gu5L+d5q2j56Gu5L+d5a2YXHJcbiAgICAgICAgLy8gbGV0IHByb21wdE1zZzpGbW9kZUNoYXRNZXNzYWdlID0ge3JvbGU6XCJ1c2VyXCIsY29udGVudDpwcm9tcHQsaGlkZGVuOnRydWV9XHJcbiAgICAgICAgLy8gYXdhaXQgdGhpcy5hZGRNZXNzYWdlKHByb21wdE1zZywgTWVzc2FnZVNjZW5lLlJPTEUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDlj5HpgIHmtojmga9cclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFxyXG4gICAgICogQHBhcmFtIGltYWdlVXJsIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBzZW5kTWVzc2FnZShtZXNzYWdlOnN0cmluZz1cIkZtb2RlQWlUZXN05rWL6K+V6Zeu6aKYXCIsaW1hZ2VVcmw/OnN0cmluZyxvbkNvbXBsZXRlPzpGdW5jdGlvbixldmVudE1hcD86Rm1vZGVDaGF0RXZlbnRNYXAsdm9pY2U/OkZtb2RlQ2hhdE1lc3NhZ2VWb2ljZSl7XHJcbiAgICAgICAgLy8g56Gu5L+dIG1lc3NhZ2VNYW5hZ2VyIOW3suWIneWni+WMllxyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTWVzc2FnZU1hbmFnZXIoKTtcclxuICAgICAgICAvLyDlj5Hmtojmga/oh6rliqjnva7lupVcclxuICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tJiZ0aGlzLnNjcm9sbFRvQm90dG9tKCk7XHJcblxyXG4gICAgICAgIC8vIOS4uua2iOaBr+WIl+ihqOihpeWFqOaPkOekuuivjVxyXG4gICAgICAgIC8vIGF3YWl0IHRoaXMubG9hZFRhbGtTeXN0ZW1Qcm9tcHQodGhpcy5yb2xlKTtcclxuICAgICAgICB0aGlzLmlzUHJvbXB0TWVzc2FnZUFyZWFTaG93ID0gZmFsc2U7IC8vIOWPkemAgeesrOS4gOadoea2iOaBr+WQju+8jOWFs+mXreaPkOekuueci+adv1xyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFJvbGVQcm9tcHQoKTtcclxuXHJcbiAgICAgICAgLy8g5p6E5bu655So5oi35raI5oGvXHJcbiAgICAgICAgbGV0IHVzZXJNZXNzYWdlOkZtb2RlQ2hhdE1lc3NhZ2U7XHJcbiAgICAgICAgaWYoIWltYWdlVXJsKXsgLy8g57qv5paH5pysXHJcbiAgICAgICAgICAgIHVzZXJNZXNzYWdlID0ge1xyXG4gICAgICAgICAgICAgICAgcm9sZTpcInVzZXJcIixcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6bWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIGNvbXBsZXRlOnRydWUsXHJcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6bmV3IERhdGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHZvaWNlKXtcclxuICAgICAgICAgICAgICAgIHVzZXJNZXNzYWdlLnZvaWNlID0ge2lkOnZvaWNlPy5pZCxkdXJhdGlvbjp2b2ljZT8uZHVyYXRpb259XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXsgLy8g5bim5Zu+54mHXHJcbiAgICAgICAgICAgIHVzZXJNZXNzYWdlID0ge1xyXG4gICAgICAgICAgICAgICAgXCJyb2xlXCI6IFwidXNlclwiLFxyXG4gICAgICAgICAgICAgICAgXCJjb250ZW50XCI6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImltYWdlX3VybFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImltYWdlX3VybFwiOiB7XCJ1cmxcIjppbWFnZVVybH0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInRleHRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0ZXh0XCI6IG1lc3NhZ2VcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgIGNvbXBsZXRlOnRydWUsXHJcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6bmV3IERhdGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHZvaWNlKXtcclxuICAgICAgICAgICAgICAgIHVzZXJNZXNzYWdlLnZvaWNlID0ge2lkOnZvaWNlPy5pZH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5re75Yqg55So5oi35raI5oGvXHJcbiAgICAgICAgdGhpcy5hZGRNZXNzYWdlKHVzZXJNZXNzYWdlLCBNZXNzYWdlU2NlbmUuUk9MRSk7XHJcblxyXG4gICAgICAgIC8vIOiOt+WPluacgOaWsOa2iOaBr+WIl+ihqOeUqOS6juihpeWFqFxyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgdGhpcy5nZXRNZXNzYWdlTGlzdCgpO1xyXG5cclxuICAgICAgICAvLyDliJvlu7rlubblj5HotbfkuIDmnaHmlrDnmoTmtojmga/ooaXlhahcclxuICAgICAgICBsZXQgY29tcGxldGlvbiA9IG5ldyBGbW9kZUNoYXRDb21wbGV0aW9uKFtcclxuICAgICAgICAgICAge3JvbGU6XCJ1c2VyXCIsY29udGVudDp0aGlzLnJvbGVQcm9tcHR9LCAvLyDop5LoibLmj5DnpLror40g5LiN5Zyo5raI5oGv5YiX6KGoXHJcbiAgICAgICAgICAgIC4uLnRoaXMuZml4TWVzc2FnZUxpc3QodGhpcy5jb252ZXJ0TWVzc2FnZXMobWVzc2FnZXMpKSAvLyDliJfooajlvaLlvI/vvIznoa7kv53ngbXmtLvnmoTlm77niYfmtojmga/moLzlvI/mjqXmlLZcclxuICAgICAgICBdLHtcclxuICAgICAgICAgICAgbW9kZWw6dGhpcy5jdXJyZW50TW9kZWw/LmdldD8uKFwiY29kZVwiKSB8fCBcImZtb2RlLTEuNi1jblwiXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLy8g55Sf5ZG95ZGo5pyf77ya5raI5oGv6I635Y+W5a6M5oiQXHJcbiAgICAgICAgaWYodGhpcy5vblVzZXJTZW5kKXtcclxuICAgICAgICAgICAgbGV0IHNlbmRSZXN1bHQgPSBhd2FpdCB0aGlzLm9uVXNlclNlbmQodGhpcyx1c2VyTWVzc2FnZSlcclxuICAgICAgICAgICAgaWYoIXNlbmRSZXN1bHQpIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXNlcklucHV0ID0gXCJcIjtcclxuICAgICAgICB0aGlzLnVzZXJJbWFnZSA9IFwiXCI7XHJcbiAgICAgICAgLy8g5oyB57ut5pu05paw5LqL5Lu25o6o6YCB55qE5raI5oGv5L2T5YaF5a656Iez5raI5oGv5YiX6KGoXHJcbiAgICAgICAgbGV0IGlzRGlyZWN0ID0gdGhpcy5pc0RpcmVjdCB8fCBmYWxzZVxyXG4gICAgICAgIGlmKHRoaXMuaXNUYWxrTW9kZSl7XHJcbiAgICAgICAgICAgIGlzRGlyZWN0ID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5Yid5aeL5YyWQUnlm57lpI3mtojmga/ljaDkvY3nrKZcclxuICAgICAgICBjb25zdCBhaU1lc3NhZ2VQbGFjZWhvbGRlcjogRm1vZGVDaGF0TWVzc2FnZSA9IHtcclxuICAgICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcclxuICAgICAgICAgICAgY29udGVudDogXCJcIixcclxuICAgICAgICAgICAgY29tcGxldGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyDmt7vliqBBSeWbnuWkjea2iOaBr+WNoOS9jeesplxyXG4gICAgICAgIGxldCBuZXdBaU1lc3NhZ2UgPSBhd2FpdCB0aGlzLmFkZE1lc3NhZ2UoYWlNZXNzYWdlUGxhY2Vob2xkZXIsIE1lc3NhZ2VTY2VuZS5ST0xFKTtcclxuXHJcbiAgICAgICAgLy8g55Sf5ZG95ZGo5pyf77ya55So5oi35Y+R6YCB5raI5oGv5Zue6LCDXHJcbiAgICAgICAgaWYodGhpcy5vblVzZXJTZW5kKXtcclxuICAgICAgICAgICAgbGV0IHNlbmRSZXN1bHQgPSBhd2FpdCB0aGlzLm9uVXNlclNlbmQodGhpcyx1c2VyTWVzc2FnZSlcclxuICAgICAgICAgICAgaWYoIXNlbmRSZXN1bHQpIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzZW5kJCA9IGNvbXBsZXRpb24uc2VuZENvbXBsZXRpb24oe1xyXG4gICAgICAgICAgICBpc0RpcmVjdDppc0RpcmVjdCxcclxuICAgICAgICAgICAgb25Db21wbGV0ZTpvbkNvbXBsZXRlfHxudWxsXHJcbiAgICAgICAgfSkucGlwZShmaW5hbGl6ZShhc3luYyAoKT0+eyAvLyDnrqHpgZNmaW5hbGl6Zeabv+S7o+S6huaXp+eJiOeahChjb21wbGV0ZSk9Pnt9XHJcblxyXG4gICAgICAgICAgICAvLyDmoIforrDmtojmga/lrozmiJBcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVNZXNzYWdlKG5ld0FpTWVzc2FnZSwgeyBjb21wbGV0ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIOWcqOa2iOaBr+WujOaIkOWQjueUn+aIkOivremfs++8iFRhbGtNb2Rl77yJXHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNUYWxrTW9kZSl7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IG5ld0FpTWVzc2FnZT8uZ2V0KFwiY29udGVudFwiKTtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuaGFzVmFsaWRDb250ZW50KGNvbnRlbnQpKXtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdm9pY2UgPSBhd2FpdCB0aGlzLmdldFZvaWNlQnlDb250ZW50VGV4dChjb250ZW50LGV2ZW50TWFwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodm9pY2UgJiYgdm9pY2UuaWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5pu05paw5raI5oGv55qEdm9pY2XlsZ7mgKdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTWVzc2FnZShuZXdBaU1lc3NhZ2UsIHsgdm9pY2U6IHZvaWNlIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOmAmuefpVNTTUzlrozmiJBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TWFwPy5vblNTTUxDb21wbGV0ZSYmZXZlbnRNYXA/Lm9uU1NNTENvbXBsZXRlKHZvaWNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmkq3mlL7or63pn7NcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheUNoYXRWb2ljZSh0aGlzLnZvaWNlTWFwW3ZvaWNlPy5pZF0se1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVzdWx0OihyZXN1bHQ6YW55KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXN1bHQ/LmR1cmF0aW9uKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOabtOaWsOivremfs+aXtumVv1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZFZvaWNlID0geyAuLi52b2ljZSwgZHVyYXRpb246IHJlc3VsdD8uZHVyYXRpb24gfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTWVzc2FnZShuZXdBaU1lc3NhZ2UsIHsgdm9pY2U6IHVwZGF0ZWRWb2ljZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcign55Sf5oiQ6K+t6Z+z5aSx6LSlOicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIOeUn+WRveWRqOacn++8mua2iOaBr+iOt+WPluWujOaIkFxyXG4gICAgICAgICAgICBpZihuZXdBaU1lc3NhZ2U/LmlkKXtcclxuICAgICAgICAgICAgICAgIHRoaXMub25NZXNzYWdlJiZ0aGlzLm9uTWVzc2FnZSh0aGlzLG5ld0FpTWVzc2FnZT8uZ2V0KFwiY29udGVudFwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIOS/neWtmEFJ5raI5oGv5Yiw5pWw5o2u5bqT77yI5b+F6aG75Zyoc2Vzc2lvbuS/neWtmOS5i+WQju+8iVxyXG4gICAgICAgICAgICBpZiAobmV3QWlNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2VNYW5hZ2VyPy5zYXZlTWVzc2FnZShuZXdBaU1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpLnN1YnNjcmliZShhc3luYyAobWVzc2FnZTpGbW9kZUNoYXRNZXNzYWdlKT0+e1xyXG4gICAgICAgICAgICBsZXQgY29udGVudDphbnkgPSBtZXNzYWdlLmNvbnRlbnRcclxuICAgICAgICAgICAgLy8g5pu05paw5pyA5paw5Zue5aSN5YaF5a65XHJcbiAgICAgICAgICAgIHRoaXMubGF0ZXN0QUlSZXNwb25zZSA9IHRoaXMuZ2V0Q29udGVudFRleHQoY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICAvLyDnlJ/lkb3lkajmnJ/vvJrmtojmga/mm7TmlrDlm57osIPvvIjlrp7ml7bmm7TmlrDvvIlcclxuICAgICAgICAgICAgaWYodGhpcy5vbk1lc3NhZ2UgJiYgIW1lc3NhZ2U/LmNvbXBsZXRlKXtcclxuICAgICAgICAgICAgICAgIG5ld0FpTWVzc2FnZS5zZXQoXCJjb250ZW50XCIsbWVzc2FnZT8uY29udGVudClcclxuICAgICAgICAgICAgICAgIHRoaXMub25NZXNzYWdlKHRoaXMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKG1lc3NhZ2U/LmNvbXBsZXRlKXtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTWVzc2FnZShuZXdBaU1lc3NhZ2UsIGNvbnRlbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyDmu5rliqjliLDlupXpg6hcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSYmdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Vm9pY2VCeUNvbnRlbnRUZXh0KGNvbnRlbnQ6c3RyaW5nfENoYXRJbWFnZUNvbnRlbnRJdGVtW10sZXZlbnRNYXA/OkZtb2RlQ2hhdEV2ZW50TWFwLHByb21wdEVuYWJsZWQ6Ym9vbGVhbj1mYWxzZSk6UHJvbWlzZTxGbW9kZUNoYXRNZXNzYWdlVm9pY2U+e1xyXG4gICAgICAgIGlmKCF0aGlzLmhhc1ZhbGlkQ29udGVudChjb250ZW50KSl7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe2lkOiAnJ30pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGNvbnRlbnRUZXh0ID0gdGhpcy5nZXRDb250ZW50VGV4dChjb250ZW50KTtcclxuXHJcbiAgICAgICAgbGV0IENoYXRWb2ljZSA9IFBhcnNlLk9iamVjdC5leHRlbmQoXCJDaGF0Vm9pY2VcIik7XHJcbiAgICAgICAgbGV0IGNoYXRWb2ljZSA9IG5ldyBDaGF0Vm9pY2UoKTtcclxuICAgICAgICBsZXQgY29udGVudFNTTUwgPSBgYDtcclxuICAgICAgICBsZXQgdm9pY2VDb25maWc6YW55ID0gdGhpcy52b2ljZUNvbmZpZyB8fCB0aGlzLnJvbGU/LmdldChcInZvaWNlQ29uZmlnXCIpXHJcbiAgICAgICAgdGhpcy5TU01MUm9sZVZvaWNlID0gdm9pY2VDb25maWc/LnZvaWNlIHx8IHRoaXMuU1NNTFJvbGVWb2ljZVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUscmVqZWN0KT0+e1xyXG4gICAgICAgICAgICBsZXQgcmVzb2x2ZUNoYXRWb2ljZSA9IGFzeW5jICgpPT57XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJjb250ZW50XCIsY29udGVudFRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJzc21sXCIsY29udGVudFNTTUwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJyb2xlXCIsXCJhc3Npc3RhbnRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21wYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY29tcGFueSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJjb21wYW55XCIse19fdHlwZTpcIlBvaW50ZXJcIixjbGFzc05hbWU6XCJDb21wYW55XCIsb2JqZWN0SWQ6Y29tcGFueX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRVc2VyID0gUGFyc2UuVXNlci5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY3VycmVudFVzZXI/LmlkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhdFZvaWNlLnNldChcInVzZXJcIixjdXJyZW50VXNlci50b1BvaW50ZXIoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNoYXRTZXNzaW9uPy5pZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJzZXNzaW9uXCIsdGhpcy5jaGF0U2Vzc2lvbj8udG9Qb2ludGVyKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5Yiw5pWw5o2u5bqTXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhdFZvaWNlID0gYXdhaXQgY2hhdFZvaWNlLnNhdmUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8g56Gu5L+d5L+d5a2Y5oiQ5Yqf5ZCO5YaN5re75Yqg5Yiw5pig5bCEXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY2hhdFZvaWNlPy5pZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VNYXBbY2hhdFZvaWNlPy5pZF0gPSBjaGF0Vm9pY2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDpqozor4FTU01M5piv5ZCm5q2j56Gu5L+d5a2YXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhdmVkVm9pY2UgPSBhd2FpdCBuZXcgUGFyc2UuUXVlcnkoXCJDaGF0Vm9pY2VcIikuZ2V0KGNoYXRWb2ljZS5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNhdmVkVm9pY2UgJiYgc2F2ZWRWb2ljZS5nZXQoXCJzc21sXCIpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfor63pn7Plr7nosaHkv53lrZjmiJDlip/vvIxTU01MOicsIHNhdmVkVm9pY2UuZ2V0KFwic3NtbFwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ+ivremfs+WvueixoeS/neWtmOS9hlNTTUzkuLrnqbonKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDpjaGF0Vm9pY2U/LmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NtbDogc2F2ZWRWb2ljZT8uZ2V0KFwic3NtbFwiKSB8fCBjb250ZW50U1NNTFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCfkv53lrZjor63pn7Plr7nosaHlpLHotKUnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCfkv53lrZjor63pn7Plr7nosaHml7blh7rplJk6JywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIOaWueazleS4gO+8mumrmOe6p+ivremfs+ebtOaOpeivu+aWh+acrO+8jOmAn+W6puW/q++8jOS9hue7huiKguaDhee7quagh+iusOS4jei2s+OAglxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgIGlmKHByb21wdEVuYWJsZWQ9PWZhbHNlKXtcclxuICAgICAgICAgICAgICAgIGxldCBwcm92aWRlciA9IHZvaWNlQ29uZmlnPy5wcm92aWRlciB8fCBcIm1pY3Jvc29mdFwiXHJcbiAgICAgICAgICAgICAgICBsZXQgcmF0ZSA9IHZvaWNlQ29uZmlnPy5yYXRlXHJcbiAgICAgICAgICAgICAgICBsZXQgcmF0ZVN0YXJ0ID0gcmF0ZT9gPHByb3NvZHkgcmF0ZT1cIiR7cmF0ZX1cIj5gOlwiXCJcclxuICAgICAgICAgICAgICAgIGxldCByYXRlRW5kID0gcmF0ZT9gPC9wcm9zb2R5PmA6XCJcIlxyXG4gICAgICAgICAgICAgICAgY29udGVudFNTTUwgPSBgPHNwZWFrIHByb3ZpZGVyPVwiJHtwcm92aWRlcn1cIj4ke3JhdGVTdGFydH08dm9pY2UgbmFtZT1cIiR7dGhpcy5TU01MUm9sZVZvaWNlfVwiPiR7Y29udGVudFRleHR9PC92b2ljZT4ke3JhdGVFbmR9PC9zcGVhaz5gXHJcbiAgICAgICAgICAgICAgICBpZihwcm92aWRlcj09XCJkb3ViYW9cIil7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFNTTUwgPSBjb250ZW50VGV4dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUNoYXRWb2ljZSgpXHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBwcm9tcHRFbmFibGVkID09IHRydWVcclxuICAgICAgICAgICAgICog5pa55rOV5LqM77ya6YCa6L+H5aSn5qih5Z6L5YaN5qyh5ou85o6lU1NNTOiEmuacrO+8jOWunueOsOabtOS8mOi0qOeahOivremfs+agh+iusO+8jOS9huaYr+eUn+aIkOaXtumXtOWkquaFolxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYocHJvbXB0RW5hYmxlZD09dHJ1ZSl7XHJcbiAgICAgICAgICAgICAgICAvLyDmi7zmjqVQcm9tcHRcclxuICAgICAgICAgICAgICAgIGxldCBUZXh0U1NNTFByb21wdCA9IGF3YWl0IGdldEZvcm1hdFRwbChQcm9tcHRUcGxUYWxrVGV4dFNTTUxDb2RlLHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OmNvbnRlbnRUZXh0LCAvLyDmlofmnKzlhoXlrrlcclxuICAgICAgICAgICAgICAgICAgICBTU01MUm9sZVZvaWNlOiB0aGlzLlNTTUxSb2xlVm9pY2UsIC8vIFNTTUwg5ryU6K+06ICFXHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIOeUn+aIkFNTTUxcclxuICAgICAgICAgICAgICAgIGxldCBjb21wbGV0aW9uID0gbmV3IEZtb2RlQ2hhdENvbXBsZXRpb24odGhpcy5maXhNZXNzYWdlTGlzdChbe1xyXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6XCJ1c2VyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDpUZXh0U1NNTFByb21wdFxyXG4gICAgICAgICAgICAgICAgfV0pLHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlbDp0aGlzLmN1cnJlbnRNb2RlbD8uZ2V0Py4oXCJjb2RlXCIpIHx8IFwiZm1vZGUtMS42LWNuXCJcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBsZXQgc2VuZCQgPSBjb21wbGV0aW9uLnNlbmRDb21wbGV0aW9uKHtcclxuICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdDp0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSkuc3Vic2NyaWJlKGFzeW5jIG1lc3NhZ2U9PntcclxuICAgICAgICAgICAgICAgICAgICBpZihtZXNzYWdlPy5jb21wbGV0ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTU01MID0gdGhpcy5nZXRDb250ZW50VGV4dChtZXNzYWdlPy5jb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQ2hhdFZvaWNlKClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBnZXRDb250ZW50VGV4dChjb250ZW50OnN0cmluZ3xDaGF0SW1hZ2VDb250ZW50SXRlbVtdKXtcclxuICAgICAgICBpZih0eXBlb2YgY29udGVudCA9PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ/LlswXT8udGV4dCB8fCBgYFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOajgOafpeWGheWuueaYr+WQpuacieacieaViOaWh+acrFxyXG4gICAgICovXHJcbiAgICBoYXNWYWxpZENvbnRlbnQoY29udGVudDpzdHJpbmd8Q2hhdEltYWdlQ29udGVudEl0ZW1bXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmdldENvbnRlbnRUZXh0KGNvbnRlbnQpO1xyXG4gICAgICAgIHJldHVybiB0ZXh0ICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRUUyAtIOivremfs+WQiOaIkFxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXRUVFMoKTpQcm9taXNlPEZtb2RlVFRTfG51bGw+e1xyXG4gICAgICAgIHRoaXMudm9pY2VDb25maWcgPSB0aGlzLnZvaWNlQ29uZmlnIHx8IHRoaXMucm9sZT8uZ2V0KFwidm9pY2VDb25maWdcIilcclxuXHJcbiAgICAgICAgLy8gaWYodGhpcy50dHMpIHJldHVybiAvLyDlvoXmmI7noa5zdHPmnInmlYjmnJ/lkozmrKHmlbDov5vooYzkvJjljJbvvIzpgb/lhY3mr4/mrKHph43lpI3ojrflj5ZcclxuICAgICAgICBsZXQgY29uZmlnOmFueSA9IGF3YWl0IHRoaXMubmNsb3VkLmFwaWcoXCJ2b2ljZS90dHMvdG9rZW5cIix7XHJcbiAgICAgICAgICAgIGNvbXBhbnk6bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpLFxyXG4gICAgICAgICAgICBwcm92aWRlcjp0aGlzLnZvaWNlQ29uZmlnPy5wcm92aWRlciB8fCBcIm1pY3Jvc29mdFwiXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25maWcucHJvdmlkZXIgPSB0aGlzLnZvaWNlQ29uZmlnPy5wcm92aWRlclxyXG4gICAgICAgIGlmKCghY29uZmlnPy5wcm92aWRlcil8fGNvbmZpZz8ucHJvdmlkZXIgPT0gXCJtaWNyb3NvZnRcIil7XHJcbiAgICAgICAgICAgIC8vIGNvbmZpZy5wcm92aWRlciA9IG5ldyBGbW9kZVRUU1Byb3ZpZGVyTWljcm9zb2Z0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGNvbmZpZz8ucHJvdmlkZXIgPT0gXCJkb3ViYW9cIil7XHJcbiAgICAgICAgICAgIGNvbmZpZy5wcm92aWRlciA9IG5ldyBGbW9kZVRUU1Byb3ZpZGVyRG91YmFvKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbmZpZy52b2ljZUNvbmZpZyA9IHRoaXMudm9pY2VDb25maWdcclxuICAgICAgICAvLyDmnIlUVFPotYTmupDvvIzkvb/nlKjmg4Xnu6rlkIjmiJBcclxuICAgICAgICBjb25zb2xlLmxvZyhcImluaXRUVFNcIixjb25maWcpXHJcbiAgICAgICAgaWYoY29uZmlnPy50b2tlbiB8fCBjb25maWc/LnN0c1Rva2VuKXtcclxuICAgICAgICAgICAgLy8g5Yib5bu66YCC6YWN5Zmo77yM5bCGTm92YVN0b3JhZ2XpgILphY3kuLpOb3ZhVXBsb2FkU2VydmljZeaOpeWPo1xyXG4gICAgICAgICAgICBjb25zdCB1cGxvYWRBZGFwdGVyID0ge1xyXG4gICAgICAgICAgICAgICAgZ2VuTWQ1OiAoY29udGVudDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g566A5Y2V55qETUQ155Sf5oiQ5a6e546w77yM5oiW6ICF5a+85YWlTUQ15bqTXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ0b2EoY29udGVudCkucmVwbGFjZSgvW15hLXpBLVowLTldL2csICcnKS5zdWJzdHJpbmcoMCwgMzIpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHVwbG9hZDogKGZpbGU6IEZpbGUpID0+IHRoaXMuc3RvcmFnZS51cGxvYWQoZmlsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgbGV0IHR0cyA9IG5ldyBGbW9kZVRUUyhjb25maWcsIHVwbG9hZEFkYXB0ZXIgYXMgYW55KTtcclxuICAgICAgICAgICAgcmV0dXJuIHR0c1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHZvaWNlTWFwOmFueSA9IHt9XHJcbiAgICBWb2ljZVRUU01hcDp7XHJcbiAgICAgICAgW2tleTpzdHJpbmddOkZtb2RlVFRTXHJcbiAgICB9ID0ge31cclxuICAgIHN0b3BQbGF5aW5nVm9pY2UoKXtcclxuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuVm9pY2VUVFNNYXApLmZvckVhY2godHRzPT57XHJcbiAgICAgICAgICAgIGlmKHR0cz8uaXNQbGF5aW5nKXtcclxuICAgICAgICAgICAgICAgIHR0cz8uc3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIGFzeW5jIHBsYXlDaGF0Vm9pY2Uodm9pY2U6Rm1vZGVPYmplY3QsZXZlbnRNYXA/OmFueSk6UHJvbWlzZTxGbW9kZVRUU3xudWxsPntcclxuICAgICAgICBsZXQgdHRzID0gYXdhaXQgdGhpcy5pbml0VFRTKCk7XHJcblxyXG4gICAgICAgIGlmKCF0dHMpe1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RUU+WIneWni+WMluWksei0pe+8jOaXoOazleaSreaUvuivremfsycpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCF2b2ljZT8uaWQpe1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ+ivremfs+WvueixoUlE5Li656m677yM5peg5rOV5pKt5pS+Jyk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJwbGF5Q2hhdFZvaWNlXCIsIHR0cywgdm9pY2U/LmlkKTtcclxuXHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAvLyDojrflj5ZTU01M5YaF5a6577yM5LyY5YWI5LuOdm9pY2VNYXDkuK3ojrflj5bvvIzlpoLmnpzmsqHmnInliJnph43mlrDmn6Xor6JcclxuICAgICAgICAgICAgbGV0IHNzbWxDb250ZW50ID0gdm9pY2U/LmdldChcInNzbWxcIik7XHJcblxyXG4gICAgICAgICAgICBpZighc3NtbENvbnRlbnQpe1xyXG4gICAgICAgICAgICAgICAgLy8g5LuOdm9pY2VNYXDkuK3ojrflj5ZcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZvaWNlRnJvbU1hcCA9IHRoaXMudm9pY2VNYXBbdm9pY2UuaWRdO1xyXG4gICAgICAgICAgICAgICAgaWYodm9pY2VGcm9tTWFwKXtcclxuICAgICAgICAgICAgICAgICAgICBzc21sQ29udGVudCA9IHZvaWNlRnJvbU1hcC5nZXQoXCJzc21sXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZighc3NtbENvbnRlbnQpe1xyXG4gICAgICAgICAgICAgICAgLy8g6YeN5paw5p+l6K+i5pWw5o2u5bqTXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyZXNoVm9pY2UgPSBhd2FpdCBuZXcgUGFyc2UuUXVlcnkoXCJDaGF0Vm9pY2VcIikuZ2V0KHZvaWNlLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZihmcmVzaFZvaWNlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3NtbENvbnRlbnQgPSBmcmVzaFZvaWNlLmdldChcInNzbWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOabtOaWsHZvaWNlTWFwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VNYXBbdm9pY2UuaWRdID0gZnJlc2hWb2ljZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+afpeivouivremfs+WvueixoeWksei0pTonLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmKCFzc21sQ29udGVudCl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ+aXoOazleiOt+WPllNTTUzlhoXlrrnvvIzor63pn7Pmkq3mlL7lpLHotKUnKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygn5YeG5aSH5pKt5pS+U1NNTDonLCBzc21sQ29udGVudCk7XHJcblxyXG4gICAgICAgICAgICB0dHMudm9pY2VDb25maWcgPSB0aGlzLnZvaWNlQ29uZmlnXHJcbiAgICAgICAgICAgIC8vIOaSreaUvuWKqOeUu1xyXG4gICAgICAgICAgICB0aGlzLnBsYXlBbmltYXRpb24oXCJ0YWxraW5nXCIpXHJcblxyXG4gICAgICAgICAgICAvLyDmkq3mlL7or63pn7NcclxuICAgICAgICAgICAgYXdhaXQgdHRzLnNwZWFrQXN5bmMoc3NtbENvbnRlbnQsIHZvaWNlLCB7XHJcbiAgICAgICAgICAgICAgICBvblN0YXJ0OihjaGF0Vm9pY2U/OmFueSk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6K+t6Z+z5pKt5pS+5byA5aeLJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRNYXA/Lm9uU3RhcnQmJmV2ZW50TWFwPy5vblN0YXJ0KGNoYXRWb2ljZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb25Mb2FkZWQ6KGF1ZGlvOmFueSk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6K+t6Z+z5Yqg6L295a6M5oiQJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRNYXA/Lm9uTG9hZGVkJiZldmVudE1hcD8ub25Mb2FkZWQoYXVkaW8pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uUmVzdWx0OihyZXN1bHQ6YW55KT0+eyAvLyB7ZHVyYXRpb246bnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfor63pn7Pmkq3mlL7nu5Pmnpw6JywgcmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudE1hcD8ub25SZXN1bHQmJmV2ZW50TWFwPy5vblJlc3VsdChyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uU3RvcDogKCk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6K+t6Z+z5pKt5pS+5YGc5q2iJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRNYXA/Lm9uU3RvcCYmZXZlbnRNYXA/Lm9uU3RvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheUFuaW1hdGlvbihcIndhaXRpbmdcIikgLy8g5Zue5Yiw562J5b6F5Yqo55S7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb25FcnJvcjooZXJyb3I6YW55KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+ivremfs+aSreaUvumUmeivrzonLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5QW5pbWF0aW9uKFwid2FpdGluZ1wiKSAvLyDlm57liLDnrYnlvoXliqjnlLtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLlZvaWNlVFRTTWFwW3ZvaWNlLmlkXSA9IHR0cztcclxuICAgICAgICAgICAgcmV0dXJuIHR0c1xyXG5cclxuICAgICAgICB9Y2F0Y2godHRzZXJyKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcign5pKt5pS+6K+t6Z+z5pe25Ye66ZSZOicsIHR0c2Vycik7XHJcbiAgICAgICAgICAgIHRoaXMucGxheUFuaW1hdGlvbihcIndhaXRpbmdcIikgLy8g5Zue5Yiw562J5b6F5Yqo55S7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog5L+d5a2Y5Y2V5qyh5Lya6K+dXHJcbiAgICAgKiDlhbPplK7vvJrlnKhzZXNzaW9u5L+d5a2Y5ZCO77yM56uL5Y2z5pu05paw5raI5oGv566h55CG5Zmo5Lit55qEc2Vzc2lvbuW8leeUqOW5tuS/neWtmOaJgOacieW+heWkhOeQhua2iOaBr1xyXG4gICAgICovXHJcbiAgICBhc3luYyBzYXZlQ2hhdFNlc3Npb24oKXtcclxuICAgICAgICBjb25zdCBpc05ld1Nlc3Npb24gPSB0aGlzLnNlc3Npb25JZCA9PSBcIm5ld1wiO1xyXG4gICAgICAgIGlmKGlzTmV3U2Vzc2lvbil7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhdFNlc3Npb24gPSBuZXcgdGhpcy5DaGF0U2Vzc2lvbigpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNoYXRTZXNzaW9uLnNldChcInRpdGxlXCIsdGhpcy5nZW5UaXRsZSgpKVxyXG4gICAgICAgIHRoaXMuY2hhdFNlc3Npb24uc2V0KFwicm9sZVwiLHRoaXMucm9sZT8udG9Qb2ludGVyKCkpXHJcbiAgICAgICAgdGhpcy5jaGF0U2Vzc2lvbi5zZXQoXCJ1c2VyXCIsUGFyc2UuVXNlci5jdXJyZW50KCk/LnRvUG9pbnRlcigpKVxyXG5cclxuICAgICAgICAvLyDogIHns7vnu5/mtojmga/kv53mjIHkuI3lj5jvvIzkuI3lgZrku7vkvZXnrqHnkIZcclxuICAgICAgICAvLyDmlrDns7vnu5/mtojmga/pgJrov4cgTWVzc2FnZSDooajni6znq4vnrqHnkIZcclxuICAgICAgICAvLyBjaGF0U2Vzc2lvbi5tZXNzYWdlTGlzdCDku4XnlKjkuo7ljoblj7LmlbDmja7lsZXnpLpcclxuICAgICAgICAvLyDlpoLmnpzmmK/mlrDkvJror53kuJTmsqHmnInogIHmtojmga/vvIzliJ3lp4vljJbkuLrnqbrmlbDnu4RcclxuICAgICAgICBpZiAoIXRoaXMuY2hhdFNlc3Npb24uZ2V0KFwibWVzc2FnZUxpc3RcIikpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGF0U2Vzc2lvbi5zZXQoXCJtZXNzYWdlTGlzdFwiLCBbXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNoYXRTZXNzaW9uID0gYXdhaXQgdGhpcy5jaGF0U2Vzc2lvbi5zYXZlKCk7XHJcblxyXG4gICAgICAgIC8vIOWFs+mUru+8muabtOaWsHNlc3Npb25JZFxyXG4gICAgICAgIGNvbnN0IG9sZFNlc3Npb25JZCA9IHRoaXMuc2Vzc2lvbklkO1xyXG4gICAgICAgIHRoaXMuc2Vzc2lvbklkID0gdGhpcy5jaGF0U2Vzc2lvbj8uaWQ7XHJcblxyXG4gICAgICAgIC8vIOWFs+mUru+8muabtOaWsE1lc3NhZ2VNYW5hZ2Vy5Lit55qEc2Vzc2lvbuW8leeUqFxyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZU1hbmFnZXIudXBkYXRlQ2hhdFNlc3Npb24odGhpcy5jaGF0U2Vzc2lvbik7XHJcblxyXG4gICAgICAgICAgICAvLyDkv53lrZjmiYDmnInlvoXlpITnkIbnmoTmtojmga/vvIjmlrDkvJror53nmoTmtojmga/miJbkuYvliY3lm6DnvLrlsJFzZXNzaW9u6ICM5pyq5L+d5a2Y55qE5raI5oGv77yJXHJcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLnNlc3Npb25JZCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tZXNzYWdlTWFuYWdlci5zYXZlUGVuZGluZ01lc3NhZ2VzKCk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub25DaGF0U2F2ZWQmJnRoaXMub25DaGF0U2F2ZWQodGhpcyk7XHJcblxyXG4gICAgICAgIGlmKHRoaXMuc2Vzc2lvbklkKXtcclxuICAgICAgICAgICAgLy8g5L+u5pS5VVJM5Zyw5Z2A5Li6c2Vzc2lvbklk77yM5pa55L6/5YiG5Lqr5oiW5YiH5o2iIOinkuiJsumhtemdoiA9PiDkvJror53pobXpnaJcclxuICAgICAgICAgICAgbGV0IG5ld0hyZWYgPSBgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2lufS9jaGF0L3Byby9jaGF0LyR7dGhpcy5zZXNzaW9uSWR9YFxyXG4gICAgICAgICAgICBpZih3aW5kb3cubG9jYXRpb24/LnBhdGhuYW1lPy5pbmRleE9mKFwiY2hhdC9zZXNzaW9uXCIpPi0xKXtcclxuICAgICAgICAgICAgICAgIG5ld0hyZWYgPSBgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2lufS9jaGF0L3Nlc3Npb24vY2hhdC8ke3RoaXMuc2Vzc2lvbklkfWBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aGlzLm1vZGU9PVwibW9kYWxcIil7XHJcbiAgICAgICAgICAgICAgICBuZXdIcmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV3SHJlZiA9IHRoaXMuZ2V0SW52aXRlVXJsKG5ld0hyZWYpXHJcbiAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBudWxsLCBuZXdIcmVmK3dpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xyXG4gICAgICAgICAgICAvLyDkv67mlLnmnIDmlrDmnaFjaGF0TGlzdOaVsOaNrlxyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUxpc3QoKTtcclxuICAgICAgICAgICAgY29uc3QgbGFzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcz8ubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICBsZXQgbWVzc2FnZVByZXZpZXcgPSBcIlwiO1xyXG5cclxuICAgICAgICAgICAgLy8g5aSE55CG5LiN5ZCM5qC85byP55qEY29udGVudFxyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gbGFzdE1lc3NhZ2U/LmdldChcImNvbnRlbnRcIik7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZVByZXZpZXcgPSBjb250ZW50LnNsaWNlKDAsIDIwKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50Py50ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlUHJldmlldyA9IGNvbnRlbnQudGV4dC5zbGljZSgwLCAyMCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dEl0ZW0gPSBjb250ZW50LmZpbmQoaXRlbSA9PiBpdGVtPy50ZXh0KTtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2VQcmV2aWV3ID0gdGV4dEl0ZW0/LnRleHQ/LnNsaWNlKDAsIDIwKSB8fCBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgbmV3Q2hhdCA9IHtcclxuICAgICAgICAgICAgICAgIHNpZDp0aGlzLmNoYXRTZXNzaW9uPy5pZCxcclxuICAgICAgICAgICAgICAgIHJpZDp0aGlzLnJvbGU/LmlkLFxyXG4gICAgICAgICAgICAgICAgbmFtZTp0aGlzLnJvbGU/LmdldCgnbmFtZScpLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTptZXNzYWdlUHJldmlldyxcclxuICAgICAgICAgICAgICAgIGxhdGVzdDp0aGlzLmNoYXRTZXNzaW9uPy5jcmVhdGVkQXRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aGlzLmNoYXRTZXJ2JiYhdGhpcy5jaGF0U2Vydj8uY2hhdExpc3Q/Lmxlbmd0aCkgdGhpcy5jaGF0U2Vydi5jaGF0TGlzdCA9IFtdXHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY2hhdFNlcnY/LmNoYXRMaXN0Py5maW5kSW5kZXgoaXRlbT0+aXRlbT8uc2lkPT1uZXdDaGF0Py5zaWQpXHJcbiAgICAgICAgICAgIGlmKGluZGV4Pi0xKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhdFNlcnYuY2hhdExpc3RbaW5kZXhdID0gbmV3Q2hhdDtcclxuICAgICAgICAgICAgfSBlbHNle1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGF0U2Vydj8uY2hhdExpc3QudW5zaGlmdChuZXdDaGF0KVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyDmm7TmlrBjaGF0U2VyduS4reeahGNoYXRNYXDvvIjlsIZuZXfnmoRrZXnmm7/mjaLkuLrnnJ/lrp5zZXNzaW9uSWTvvIlcclxuICAgICAgICAgICAgaWYgKGlzTmV3U2Vzc2lvbiAmJiBvbGRTZXNzaW9uSWQgPT09IFwibmV3XCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhdFNlcnYuY2hhdE1hcFt0aGlzLnNlc3Npb25JZF0gPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hhdFNlcnYuY2hhdE1hcFtcIm5ld1wiXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldEludml0ZVVybCh1cmwpe1xyXG4gICAgICAgIGxldCB1ID0gbmV3IFVSTCh1cmwpO1xyXG4gICAgICAgIGxldCBpZCA9IFBhcnNlLlVzZXI/LmN1cnJlbnQoKT8uaWRcclxuICAgICAgICAvLyDpmYTliqBpbnZpdGXlj4LmlbBcclxuICAgICAgICB1LnNlYXJjaFBhcmFtcy5zZXQoXCJpbnZpdGVcIixpZClcclxuICAgICAgICByZXR1cm4gdS5ocmVmXHJcbiAgICAgIH1cclxuICAgIC8vIOagueaNruiBiuWkqeWGheWuueWPiumXrumimO+8jOeUn+aIkOagh+mimFxyXG4gICAgZ2VuVGl0bGUoKXtcclxuICAgICAgICBpZih0aGlzLnRpdGxlKSByZXR1cm4gdGhpcy50aXRsZVxyXG4gICAgICAgIGxldCBjb250ZW50OnN0cmluZ3xBcnJheTxDaGF0SW1hZ2VDb250ZW50SXRlbT4gPSAgdGhpcy5tZXNzYWdlTGlzdC5maW5kKGl0ZW09PnRoaXMuZ2V0TWVzc2FnZVByb3BlcnR5KGl0ZW0sICdyb2xlJyk9PVwidXNlclwiKT8uZ2V0KFwiY29udGVudFwiKVxyXG4gICAgICAgIGlmKHR5cGVvZiBjb250ZW50PT1cInN0cmluZ1wiKXsgLy8g5oiq5Zu+5paH5pys5YaF5a655paH5a2X6YOo5YiGXHJcbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSBjb250ZW50Py5zbGljZSgwLDE1KSB8fCBcIlwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHR5cGVvZiBjb250ZW50PT1cIm9iamVjdFwiKXsgLy8g5oiq5Zu+5aSN5ZCI5YaF5a655paH5a2X6YOo5YiGXHJcbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSBjb250ZW50Py5maW5kKGl0ZW09Pml0ZW0/LnRleHQpPy50ZXh0IHx8IFwiXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGl0bGVcclxuICAgIH1cclxuICAgIGZpeE1lc3NhZ2VMaXN0KG1lc3NhZ2VzOkZtb2RlQ2hhdE1lc3NhZ2VbXSl7XHJcbiAgICAgICAgbGV0IGxpc3QgPSBtZXNzYWdlcy5maWx0ZXIoIChtc2c6YW55KSA9PiB7cmV0dXJuIHR5cGVvZiBtc2cuY29udGVudC5yb2xlID09IFwic3RyaW5nXCImJm1zZy5jb250ZW50LmNvbnRlbnR9KS5tYXAoKG1zZyk9PntyZXR1cm4ge3JvbGU6KG1zZyBhcyBhbnkpLmNvbnRlbnQucm9sZSxjb250ZW50Oihtc2cgYXMgYW55KS5jb250ZW50LmNvbnRlbnR9fSlcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm1lc3NhZ2VzXCIsbWVzc2FnZXMsbGlzdClcclxuICAgICAgICByZXR1cm4gbGlzdFxyXG4gICAgfVxyXG5cclxuICAgIG5vd1N0cigpe1xyXG4gICAgICAgIGxldCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHJldHVybiBgJHtub3cuZ2V0RnVsbFllYXIoKX0vJHtub3cuZ2V0TW9udGgoKSsxfS8ke25vdy5nZXREYXRlKCl9ICR7bm93LmdldEhvdXJzKCl9OiR7bm93LmdldE1pbnV0ZXMoKX06JHtub3cuZ2V0U2Vjb25kcygpfWBcclxuICAgIH1cclxuICAgIFxyXG59XHJcblxyXG4iXX0=
|