UNPKG

@hsaadawy/ngx-chat

Version:
163 lines 25.4 kB
import { __awaiter } from "tslib"; import { HttpClient } from '@angular/common/http'; import { Component, ElementRef, EventEmitter, Inject, Input, Optional, Output } from '@angular/core'; import { Direction, MessageState } from '../../core/message'; import { extractUrls } from '../../core/utils-links'; import { MessageStatePlugin } from '../../services/adapters/xmpp/plugins/message-state.plugin'; import { XmppChatAdapter } from '../../services/adapters/xmpp/xmpp-chat-adapter.service'; import { CONTACT_CLICK_HANDLER_TOKEN } from '../../services/chat-contact-click-handler'; import { CHAT_SERVICE_TOKEN } from '../../services/chat-service'; import { ReplyMessageEvent } from '../../events/reply-message-event'; import { ForwardMessageEvent } from '../../events/forward-message-event'; export const MAX_IMAGE_SIZE = 250 * 1024; export class ChatMessageComponent { constructor(chatService, httpClient, eRef, replyMessageEvent, forwordMessageEvent, contactClickHandler) { this.chatService = chatService; this.httpClient = httpClient; this.eRef = eRef; this.replyMessageEvent = replyMessageEvent; this.forwordMessageEvent = forwordMessageEvent; this.contactClickHandler = contactClickHandler; this.showForward = false; this.selectedContact = []; this.ReplySent = new EventEmitter(); this.showMessageReadState = true; this.showImagePlaceholder = true; this.Direction = Direction; this.showMenu = false; this.messageStatePlugin = this.chatService.getPlugin(MessageStatePlugin); } ngOnInit() { this.tryFindImageLink(); if (!this.contacts) { this.contacts = this.chatService.contactsSubscribed$; } } tryFindImageLink() { if (this.chatService instanceof XmppChatAdapter) { const candidateUrls = extractUrls(this.message.body); if (candidateUrls.length === 0) { this.showImagePlaceholder = false; return; } void this.tryFindEmbedImageUrls(candidateUrls); } } tryFindEmbedImageUrls(candidateUrls) { return __awaiter(this, void 0, void 0, function* () { for (const url of candidateUrls) { try { const headRequest = yield this.httpClient.head(url, { observe: 'response' }).toPromise(); const contentType = headRequest.headers.get('Content-Type'); const isImage = contentType && contentType.startsWith('image'); const isAudio = url.includes('mp3'); const isVideo = url.includes('ogg') || url.includes('mp4'); if (isImage || isAudio || isVideo) { this.imageLink = url; break; } } catch (e) { } } if (!this.imageLink) { this.showImagePlaceholder = false; } }); } getMessageState() { if (this.showMessageReadState) { if (this.message.state) { return this.message.state; } else if (this.messageStatePlugin && this.contact) { const date = this.message.datetime; const states = this.messageStatePlugin.getContactMessageState(this.contact.jidBare.toString()); return this.getStateForDate(date, states); } } return undefined; } getStateForDate(date, states) { if (date <= states.lastRecipientSeen) { return MessageState.RECIPIENT_SEEN; } else if (date <= states.lastRecipientReceived) { return MessageState.RECIPIENT_RECEIVED; } else if (date <= states.lastSent) { return MessageState.SENT; } return undefined; } onContactClick() { if (this.contactClickHandler) { this.contactClickHandler.onClick(this.contact); } } getAvatar() { if (this.showAvatars) { if (this.message.direction === Direction.in) { return this.avatar; } else { return this.chatService.userAvatar$.getValue(); } } return undefined; } reply(message) { console.log(message); // this.replyMessageEvent.changeReplyMessage(message); this.ReplySent.emit(message); } forward(message) { this.showForward = true; this.forwardMessage = message; // this.forwordMessageEvent.changeForwardMessage(`<div class="messageItem">forworded</div>` + message); } selectReceiver(contact, event) { if (event.target.checked) { this.selectedContact.push(contact); } else { this.selectedContact = this.selectedContact.filter(x => x.jidBare.local != contact.jidBare.local); } } forwordMessage() { this.selectedContact.forEach((element, index) => { if (this.forwardMessage.includes("fa-share")) { this.chatService.sendMessage(element, this.forwardMessage); } else { this.chatService.sendMessage(element, `<div class=""><i style="font-family: 'Font Awesome 5 Pro' !important" class="fas fa-share"></i></div>` + this.forwardMessage); } }); this.showForward = false; } } ChatMessageComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-chat-message', template: "<div style=\" width: 10px;\r\nposition: absolute;\r\ntop: 10px;\r\ndisplay: inline-block;\" class=\"showMenuposition\">\r\n\r\n <i style=\"\r\ncolor: #88898b;\" (click)=\"showMenu=!showMenu\" class=\"fa fa-ellipsis-v\" aria-hidden=\"true\"></i>\r\n <div *ngIf=\"showMenu\" style=\" position: absolute;\r\n top: 15px;\r\n width: 100px;\r\n background: #fff;\r\n right: 5px;\r\n box-shadow: 0 1px 3px grey;\r\n padding: 8px;\r\n z-index: 99;\">\r\n <span role=\"button\" *ngIf=\"message.direction === Direction.in\" (click)=\"reply(message.body);showMenu=false\"\r\n style=\"display: block;padding: 5px;font-size: 14px;\">\r\n <i class=\"fa fa-reply\" aria-hidden=\"true\"></i>\r\n Reply\r\n </span>\r\n\r\n <span role=\"button\" (click)=\"forward(message.body);showMenu=false\"\r\n style=\"display: block;padding: 5px;font-size: 14px\">\r\n <i class=\"fa fa-forward\" aria-hidden=\"true\"></i>\r\n Forward\r\n </span>\r\n </div>\r\n</div>\r\n<div *ngIf=\"showMenu\" (click)=\"showMenu=!showMenu\" style=\"position: fixed;\r\n background-color: transparent;\r\n width: 100%;\r\n height: 100vh;\r\n top: 0;\r\n right: 0;\r\n z-index: 2;\"></div>\r\n\r\n\r\n\r\n\r\n<ngx-chat-message-simple style=\"display: inline-block;\" [imageLink]=\"imageLink\"\r\n [showImagePlaceholder]=\"showImagePlaceholder\" [avatar]=\"getAvatar()\"\r\n [avatarInteractive]=\"message.direction === Direction.in\" (avatarClickHandler)=\"onContactClick()\"\r\n [direction]=\"message.direction\" [messageState]=\"getMessageState()\"\r\n [formattedDate]=\"message.datetime | date:chatService.translations.timeFormat\" [nick]=\"nick\">\r\n <span [ngxChatLinks]=\"message.body\"></span>\r\n</ngx-chat-message-simple>\r\n\r\n\r\n<div *ngIf=\"showForward\" style=\"position: fixed;\r\nbackground: #8080807a;\r\nwidth: 100%;\r\nheight: 100vh;\r\ntop: 0;\r\nright: 0;\r\nz-index: 9999999999999999999999999999900;\" class=\"showforward\">\r\n\r\n <div *ngIf=\"contacts\" class=\"row\" style=\" display: block;\r\n width: 50%;\r\n margin: 3% auto;\r\n padding: 15px;\r\n background: #fff;border-radius: 10px;\">\r\n <p style=\" font-size: 18px;\r\n margin: 0;\r\n margin-bottom: 12px;position: relative;\">Select Contacts <i class=\"fas fa-times\" style=\"font-family: 'Font Awesome 5 Pro' !important;float: right;padding: 0 5px; position: absolute;\r\n right: 0;\r\n top: 4px;\" (click)=\"showForward=false\" aria-hidden=\"true\"></i></p>\r\n <div *ngFor=\"let contact of (contacts | async)\" class=\"col-md-6\"\r\n style=\"width: 50%;display: inline-block;margin:4px 0 0 0; \">\r\n <input type=\"checkbox\" (change)=\"selectReceiver(contact,$event)\">\r\n <div class=\"roster-recipient-name\" style=\"display:inline\">\r\n {{contact.name}}\r\n </div>\r\n\r\n </div>\r\n\r\n <div style=\"width: 100%;display: inline-block;\">\r\n <button type=\"button\" style=\"padding: 8px 20px;float:right\" (click)=\"forwordMessage()\">Forword</button>\r\n </div>\r\n\r\n </div>\r\n\r\n</div>\r\n", styles: [":host.chat-message--out{align-self:flex-end}:host.chat-message--in{align-self:flex-start}\n"] },] } ]; ChatMessageComponent.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [CHAT_SERVICE_TOKEN,] }] }, { type: HttpClient }, { type: ElementRef }, { type: ReplyMessageEvent, decorators: [{ type: Inject, args: [ReplyMessageEvent,] }] }, { type: ForwardMessageEvent, decorators: [{ type: Inject, args: [ForwardMessageEvent,] }] }, { type: undefined, decorators: [{ type: Inject, args: [CONTACT_CLICK_HANDLER_TOKEN,] }, { type: Optional }] } ]; ChatMessageComponent.propDecorators = { ReplySent: [{ type: Output }], showAvatars: [{ type: Input }], avatar: [{ type: Input }], message: [{ type: Input }], nick: [{ type: Input }], contact: [{ type: Input }], showMessageReadState: [{ type: Input }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhenpuZXR3b3JrL25neC1jaGF0L3NyYy9saWIvY29tcG9uZW50cy9jaGF0LW1lc3NhZ2UvY2hhdC1tZXNzYWdlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFeEgsT0FBTyxFQUFFLFNBQVMsRUFBVyxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFhLE1BQU0sMkRBQTJELENBQUM7QUFDMUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3pGLE9BQU8sRUFBMkIsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQWUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUd6RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztBQU96QyxNQUFNLE9BQU8sb0JBQW9CO0lBdUM3QixZQUN1QyxXQUF3QixFQUNuRCxVQUFzQixFQUN0QixJQUFnQixFQUNVLGlCQUFvQyxFQUNsQyxtQkFBd0MsRUFDcEIsbUJBQTRDO1FBTGpFLGdCQUFXLEdBQVgsV0FBVyxDQUFh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QkFDUCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1Qiwwc0dBQTRDOzthQUUvQzs7OzRDQXlDUSxNQUFNLFNBQUMsa0JBQWtCO1lBNUR6QixVQUFVO1lBQ0MsVUFBVTtZQVFyQixpQkFBaUIsdUJBc0RqQixNQUFNLFNBQUMsaUJBQWlCO1lBckR4QixtQkFBbUIsdUJBc0RuQixNQUFNLFNBQUMsbUJBQW1COzRDQUMxQixNQUFNLFNBQUMsMkJBQTJCLGNBQUcsUUFBUTs7O3dCQXRDakQsTUFBTTswQkFHTixLQUFLO3FCQUdMLEtBQUs7c0JBR0wsS0FBSzttQkFHTCxLQUFLO3NCQUdMLEtBQUs7bUNBR0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250YWN0IH0gZnJvbSAnLi4vLi4vY29yZS9jb250YWN0JztcclxuaW1wb3J0IHsgRGlyZWN0aW9uLCBNZXNzYWdlLCBNZXNzYWdlU3RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL21lc3NhZ2UnO1xyXG5pbXBvcnQgeyBleHRyYWN0VXJscyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMtbGlua3MnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU3RhdGVQbHVnaW4sIFN0YXRlRGF0ZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FkYXB0ZXJzL3htcHAvcGx1Z2lucy9tZXNzYWdlLXN0YXRlLnBsdWdpbic7XHJcbmltcG9ydCB7IFhtcHBDaGF0QWRhcHRlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FkYXB0ZXJzL3htcHAveG1wcC1jaGF0LWFkYXB0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENoYXRDb250YWN0Q2xpY2tIYW5kbGVyLCBDT05UQUNUX0NMSUNLX0hBTkRMRVJfVE9LRU4gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jaGF0LWNvbnRhY3QtY2xpY2staGFuZGxlcic7XHJcbmltcG9ydCB7IENIQVRfU0VSVklDRV9UT0tFTiwgQ2hhdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jaGF0LXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXBseU1lc3NhZ2VFdmVudCB9IGZyb20gJy4uLy4uL2V2ZW50cy9yZXBseS1tZXNzYWdlLWV2ZW50JztcclxuaW1wb3J0IHsgRm9yd2FyZE1lc3NhZ2VFdmVudCB9IGZyb20gJy4uLy4uL2V2ZW50cy9mb3J3YXJkLW1lc3NhZ2UtZXZlbnQnO1xyXG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UgfSBmcm9tICdodHRwJztcclxuXHJcbmV4cG9ydCBjb25zdCBNQVhfSU1BR0VfU0laRSA9IDI1MCAqIDEwMjQ7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbmd4LWNoYXQtbWVzc2FnZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NoYXQtbWVzc2FnZS5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0TWVzc2FnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgc2hvd0ZvcndhcmQgPSBmYWxzZTtcclxuICAgIGNvbnRhY3RzO1xyXG4gICAgc2VsZWN0ZWRDb250YWN0OiBDb250YWN0W10gPSBbXTtcclxuICAgIGZvcndhcmRNZXNzYWdlO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIFJlcGx5U2VudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2hvd0F2YXRhcnM6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGF2YXRhcj86IHN0cmluZztcclxuICAgIHRleHQ7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgbWVzc2FnZTogTWVzc2FnZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgbmljazogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBjb250YWN0OiBDb250YWN0O1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzaG93TWVzc2FnZVJlYWRTdGF0ZSA9IHRydWU7XHJcblxyXG4gICAgc2hvd0ltYWdlUGxhY2Vob2xkZXIgPSB0cnVlO1xyXG4gICAgaW1hZ2VMaW5rOiBzdHJpbmc7XHJcblxyXG4gICAgRGlyZWN0aW9uID0gRGlyZWN0aW9uO1xyXG5cclxuXHJcblxyXG4gICAgc2hvd01lbnUgPSBmYWxzZVxyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVN0YXRlUGx1Z2luOiBNZXNzYWdlU3RhdGVQbHVnaW47XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQEluamVjdChDSEFUX1NFUlZJQ0VfVE9LRU4pIHB1YmxpYyBjaGF0U2VydmljZTogQ2hhdFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIHByaXZhdGUgZVJlZjogRWxlbWVudFJlZixcclxuICAgICAgICBASW5qZWN0KFJlcGx5TWVzc2FnZUV2ZW50KSBwdWJsaWMgcmVwbHlNZXNzYWdlRXZlbnQ6IFJlcGx5TWVzc2FnZUV2ZW50LFxyXG4gICAgICAgIEBJbmplY3QoRm9yd2FyZE1lc3NhZ2VFdmVudCkgcHVibGljIGZvcndvcmRNZXNzYWdlRXZlbnQ6IEZvcndhcmRNZXNzYWdlRXZlbnQsXHJcbiAgICAgICAgQEluamVjdChDT05UQUNUX0NMSUNLX0hBTkRMRVJfVE9LRU4pIEBPcHRpb25hbCgpIHB1YmxpYyBjb250YWN0Q2xpY2tIYW5kbGVyOiBDaGF0Q29udGFjdENsaWNrSGFuZGxlclxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU3RhdGVQbHVnaW4gPSB0aGlzLmNoYXRTZXJ2aWNlLmdldFBsdWdpbihNZXNzYWdlU3RhdGVQbHVnaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMudHJ5RmluZEltYWdlTGluaygpO1xyXG4gICAgICAgIGlmICghdGhpcy5jb250YWN0cykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RzID0gdGhpcy5jaGF0U2VydmljZS5jb250YWN0c1N1YnNjcmliZWQkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRyeUZpbmRJbWFnZUxpbmsoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhdFNlcnZpY2UgaW5zdGFuY2VvZiBYbXBwQ2hhdEFkYXB0ZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlVXJscyA9IGV4dHJhY3RVcmxzKHRoaXMubWVzc2FnZS5ib2R5KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjYW5kaWRhdGVVcmxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93SW1hZ2VQbGFjZWhvbGRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2b2lkIHRoaXMudHJ5RmluZEVtYmVkSW1hZ2VVcmxzKGNhbmRpZGF0ZVVybHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHRyeUZpbmRFbWJlZEltYWdlVXJscyhjYW5kaWRhdGVVcmxzOiBSZWdFeHBNYXRjaEFycmF5KSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB1cmwgb2YgY2FuZGlkYXRlVXJscykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZFJlcXVlc3QgPSBhd2FpdCB0aGlzLmh0dHBDbGllbnQuaGVhZCh1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZFJlcXVlc3QuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNJbWFnZSA9IGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ2ltYWdlJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc0F1ZGlvID0gdXJsLmluY2x1ZGVzKCdtcDMnKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNWaWRlbyA9IHVybC5pbmNsdWRlcygnb2dnJykgfHwgdXJsLmluY2x1ZGVzKCdtcDQnKVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNJbWFnZSB8fCBpc0F1ZGlvIHx8IGlzVmlkZW8pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlTGluayA9IHVybDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VMaW5rKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0ltYWdlUGxhY2Vob2xkZXIgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TWVzc2FnZVN0YXRlKCk6IE1lc3NhZ2VTdGF0ZSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd01lc3NhZ2VSZWFkU3RhdGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZS5zdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZS5zdGF0ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1lc3NhZ2VTdGF0ZVBsdWdpbiAmJiB0aGlzLmNvbnRhY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLm1lc3NhZ2UuZGF0ZXRpbWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLm1lc3NhZ2VTdGF0ZVBsdWdpbi5nZXRDb250YWN0TWVzc2FnZVN0YXRlKHRoaXMuY29udGFjdC5qaWRCYXJlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGVGb3JEYXRlKGRhdGUsIHN0YXRlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN0YXRlRm9yRGF0ZShkYXRlOiBEYXRlLCBzdGF0ZXM6IFN0YXRlRGF0ZSk6IE1lc3NhZ2VTdGF0ZSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKGRhdGUgPD0gc3RhdGVzLmxhc3RSZWNpcGllbnRTZWVuKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBNZXNzYWdlU3RhdGUuUkVDSVBJRU5UX1NFRU47XHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRlIDw9IHN0YXRlcy5sYXN0UmVjaXBpZW50UmVjZWl2ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VTdGF0ZS5SRUNJUElFTlRfUkVDRUlWRUQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRlIDw9IHN0YXRlcy5sYXN0U2VudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTWVzc2FnZVN0YXRlLlNFTlQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgb25Db250YWN0Q2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFjdENsaWNrSGFuZGxlcikge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhY3RDbGlja0hhbmRsZXIub25DbGljayh0aGlzLmNvbnRhY3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRBdmF0YXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5zaG93QXZhdGFycykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlLmRpcmVjdGlvbiA9PT0gRGlyZWN0aW9uLmluKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hdmF0YXI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGF0U2VydmljZS51c2VyQXZhdGFyJC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICByZXBseShtZXNzYWdlOiBhbnkpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcclxuICAgICAgICAvLyB0aGlzLnJlcGx5TWVzc2FnZUV2ZW50LmNoYW5nZVJlcGx5TWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLlJlcGx5U2VudC5lbWl0KG1lc3NhZ2UpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmb3J3YXJkKG1lc3NhZ2U6IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2hvd0ZvcndhcmQgPSB0cnVlXHJcbiAgICAgICAgdGhpcy5mb3J3YXJkTWVzc2FnZSA9IG1lc3NhZ2VcclxuICAgICAgICAvLyB0aGlzLmZvcndvcmRNZXNzYWdlRXZlbnQuY2hhbmdlRm9yd2FyZE1lc3NhZ2UoYDxkaXYgIGNsYXNzPVwibWVzc2FnZUl0ZW1cIj5mb3J3b3JkZWQ8L2Rpdj5gICsgbWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0UmVjZWl2ZXIoY29udGFjdDogQ29udGFjdCwgZXZlbnQpIHtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb250YWN0LnB1c2goY29udGFjdCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbnRhY3QgPSB0aGlzLnNlbGVjdGVkQ29udGFjdC5maWx0ZXIoeCA9PiB4LmppZEJhcmUubG9jYWwgIT0gY29udGFjdC5qaWRCYXJlLmxvY2FsKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZvcndvcmRNZXNzYWdlKCkge1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29udGFjdC5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3J3YXJkTWVzc2FnZS5pbmNsdWRlcyhcImZhLXNoYXJlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLnNlbmRNZXNzYWdlKGVsZW1lbnQsIHRoaXMuZm9yd2FyZE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5zZW5kTWVzc2FnZShlbGVtZW50LCBgPGRpdiBjbGFzcz1cIlwiPjxpICBzdHlsZT1cImZvbnQtZmFtaWx5OiAnRm9udCBBd2Vzb21lIDUgUHJvJyAhaW1wb3J0YW50XCIgY2xhc3M9XCJmYXMgZmEtc2hhcmVcIj48L2k+PC9kaXY+YCArIHRoaXMuZm9yd2FyZE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zaG93Rm9yd2FyZCA9IGZhbHNlXHJcbiAgICB9XHJcbn1cclxuIl19