ngx-rumbletalk
Version:
RumbleTalk Angular integration
178 lines • 22.8 kB
JavaScript
import { Injectable } from '@angular/core';
import { map } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
export class NgxRumbletalkService {
constructor(http) {
this.http = http;
this.server = '';
this.iframeLoaded = new Promise((resolve, reject) => {
this.handleResolve = resolve;
this.handleReject = reject;
});
this.postMessageEvents = {
LOGOUT_CB: 'pm.1',
LOGOUT_CB_RECEIVED: 'pm.2',
LOGIN: 'pm.3',
LOGIN_SUCCESS: 'pm.4',
LOGIN_ALREADY_LOGGED_IN: 'pm.5',
LOGOUT: 'pm.6',
OPEN_PRIVATE_CHAT: 'pm.7',
};
}
address(hash) {
return this.http
.get(`https://rumbletalk.com/client/service.php?hash=${hash}`)
.pipe(map((data) => data.address));
}
reload(url) {
return this.http.get(url);
}
login(data) {
return new Promise((resolve, reject) => {
const message = {};
/* handle username value */
message.username = this.trim(data.username);
if (!this.validateUsername(message.username)) {
reject('Error: invalid username in "login" function');
}
/* handle, if set, password value */
if (data.password) {
if (!this.validatePassword(data.password)) {
reject('Error: invalid password in "login" function');
}
message.password = data.password;
}
/* handle, if set, image URL */
if (data.image) {
if (!this.validateUrl(data.image)) {
reject('Error: invalid image in "login" function');
}
message.image = data.image;
}
message.type = this.postMessageEvents.LOGIN;
message.hash = data.hash;
message.forceLogin = data.forceLogin;
/* keep sending the data to the chat until the chat responds */
const intervalHandle = setInterval(() => {
this.postMessage(message);
}, 1000);
window.addEventListener('message', function handlePostMessage(event) {
/* validates the origin to be from a chat */
if (!this.validateChatOrigin(event.origin)) {
console.log('Error: invalid origin in "login" function');
}
if (typeof event.data !== 'object') {
console.log(`Error: invalid data received in RumbleTalk SDK: ${event.data}`);
}
/* different chat callback */
if (event.data.hash !== data.hash) {
reject('Error: chat hash mismatch');
}
/* validate that the message is of a successful login of the specific chat */
if (event.data.type === this.postMessageEvents.LOGIN_SUCCESS ||
event.data.type === this.postMessageEvents.LOGIN_ALREADY_LOGGED_IN) {
clearInterval(intervalHandle);
window.removeEventListener('message', handlePostMessage);
resolve({
status: event.data.type,
message: event.data.type === this.postMessageEvents.LOGIN_SUCCESS ? 'success' : 'already logged in',
});
}
}.bind(this), false);
});
}
logout(data) {
const message = {
type: this.postMessageEvents.LOGOUT,
hash: data.hash,
};
if (data.userId) {
message.userId = data.userId;
}
if (data.username) {
message.username = data.username;
}
this.postMessage(message);
}
logoutCB(data) {
const intervalHandle = setInterval(() => {
this.postMessage({ type: this.postMessageEvents.LOGOUT_CB });
}, 1000);
window.addEventListener('message', (event) => {
/* validates the origin to be from a chat */
if (!this.validateChatOrigin(event.origin)) {
return;
}
/* expecting an object */
if (typeof event.data !== 'object') {
return;
}
/* different chat callback */
if (event.data.hash !== data.hash) {
return;
}
/* callback registered */
if (event.data.type === this.postMessageEvents.LOGOUT_CB_RECEIVED) {
clearInterval(intervalHandle);
return;
}
/* validate event type */
if (event.data.type !== this.postMessageEvents.LOGOUT_CB) {
return;
}
data.callback(event.data.reason);
}, false);
}
openPrivateChat(data) {
const message = {
type: this.postMessageEvents.OPEN_PRIVATE_CHAT,
hash: data.hash,
};
if (data.userId) {
message.userId = data.userId;
}
if (data.username) {
message.username = data.username;
}
this.postMessage(message);
}
postMessage(data) {
try {
const target = this.iframe instanceof HTMLIFrameElement ? this.iframe.contentWindow : this.iframe;
target.postMessage(data, `https://${this.server}`);
}
catch (error) {
console.log(error.name, error.message);
}
}
trim(str) {
return str.replace(/^\s+|\s+$/g, '');
}
validateUsername(username) {
return !/^-?\d+$/.test(username) && username.length < 64;
}
validatePassword(password) {
return 0 < password.length && password.length < 51;
}
validateUrl(url) {
return /(https?:)?\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/.test(url);
}
/**
* checks if the given origin is of a chat service
* @param origin - the URL of the origin
* returns boolean
*/
validateChatOrigin(origin) {
return /^https:\/\/.+\.rumbletalk\.(net|com)(:4433)?$/.test(origin);
}
}
NgxRumbletalkService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: NgxRumbletalkService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
NgxRumbletalkService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: NgxRumbletalkService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: NgxRumbletalkService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXJ1bWJsZXRhbGsuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1ydW1ibGV0YWxrL3NyYy9saWIvbmd4LXJ1bWJsZXRhbGsuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBV3JDLE1BQU0sT0FBTyxvQkFBb0I7SUFvQi9CLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFsQjdCLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFHWixpQkFBWSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3BELElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1lBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRU0sc0JBQWlCLEdBQVE7WUFDaEMsU0FBUyxFQUFFLE1BQU07WUFDakIsa0JBQWtCLEVBQUUsTUFBTTtZQUMxQixLQUFLLEVBQUUsTUFBTTtZQUNiLGFBQWEsRUFBRSxNQUFNO1lBQ3JCLHVCQUF1QixFQUFFLE1BQU07WUFDL0IsTUFBTSxFQUFFLE1BQU07WUFDZCxpQkFBaUIsRUFBRSxNQUFNO1NBQzFCLENBQUM7SUFFcUMsQ0FBQztJQUV4QyxPQUFPLENBQUMsSUFBWTtRQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJO2FBQ2IsR0FBRyxDQUFTLGtEQUFrRCxJQUFJLEVBQUUsQ0FBQzthQUNyRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQVc7UUFDaEIsT0FB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YSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2xHLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDcEQ7UUFBQyxPQUFPLEtBQVUsRUFBRTtZQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxHQUFXO1FBQ2QsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDL0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQWdCO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFXO1FBQ3JCLE9BQU8sZ0dBQWdHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsTUFBTTtRQUN2QixPQUFPLCtDQUErQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RSxDQUFDOztpSEFqTlUsb0JBQW9CO3FIQUFwQixvQkFBb0IsY0FGbkIsTUFBTTsyRkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTG9naW5EYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2UvbG9naW4tZGF0YSc7XG5pbXBvcnQgeyBMb2dvdXREYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2UvbG9nb3V0LWRhdGEnO1xuaW1wb3J0IHsgTG9nb3V0Q2JEYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2UvbG9nb3V0LWNiLWRhdGEnO1xuaW1wb3J0IHsgT3BlblByaXZhdGVDaGF0RGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlL29wZW4tcHJpdmF0ZS1jaGF0LWRhdGEnO1xuZGVjbGFyZSBjb25zdCB3aW5kb3c6IGFueTtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE5neFJ1bWJsZXRhbGtTZXJ2aWNlIHtcbiAgcHVibGljIGlmcmFtZTogYW55O1xuICBwdWJsaWMgc2VydmVyID0gJyc7XG4gIHB1YmxpYyBoYW5kbGVSZXNvbHZlO1xuICBwdWJsaWMgaGFuZGxlUmVqZWN0O1xuICBwdWJsaWMgaWZyYW1lTG9hZGVkID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRoaXMuaGFuZGxlUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgdGhpcy5oYW5kbGVSZWplY3QgPSByZWplY3Q7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHBvc3RNZXNzYWdlRXZlbnRzOiBhbnkgPSB7XG4gICAgTE9HT1VUX0NCOiAncG0uMScsXG4gICAgTE9HT1VUX0NCX1JFQ0VJVkVEOiAncG0uMicsXG4gICAgTE9HSU46ICdwbS4zJyxcbiAgICBMT0dJTl9TVUNDRVNTOiAncG0uNCcsXG4gICAgTE9HSU5fQUxSRUFEWV9MT0dHRURfSU46ICdwbS41JyxcbiAgICBMT0dPVVQ6ICdwbS42JyxcbiAgICBPUEVOX1BSSVZBVEVfQ0hBVDogJ3BtLjcnLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge31cblxuICBhZGRyZXNzKGhhc2g6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDxzdHJpbmc+KGBodHRwczovL3J1bWJsZXRhbGsuY29tL2NsaWVudC9zZXJ2aWNlLnBocD9oYXNoPSR7aGFzaH1gKVxuICAgICAgLnBpcGUobWFwKChkYXRhOiBhbnkpID0+IGRhdGEuYWRkcmVzcykpO1xuICB9XG5cbiAgcmVsb2FkKHVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KHVybCk7XG4gIH1cblxuICBsb2dpbihkYXRhOiBMb2dpbkRhdGEpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlOiBhbnkgPSB7fTtcblxuICAgICAgLyogaGFuZGxlIHVzZXJuYW1lIHZhbHVlICovXG4gICAgICBtZXNzYWdlLnVzZXJuYW1lID0gdGhpcy50cmltKGRhdGEudXNlcm5hbWUpO1xuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlVXNlcm5hbWUobWVzc2FnZS51c2VybmFtZSkpIHtcbiAgICAgICAgcmVqZWN0KCdFcnJvcjogaW52YWxpZCB1c2VybmFtZSBpbiBcImxvZ2luXCIgZnVuY3Rpb24nKTtcbiAgICAgIH1cblxuICAgICAgLyogaGFuZGxlLCBpZiBzZXQsIHBhc3N3b3JkIHZhbHVlICovXG4gICAgICBpZiAoZGF0YS5wYXNzd29yZCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVQYXNzd29yZChkYXRhLnBhc3N3b3JkKSkge1xuICAgICAgICAgIHJlamVjdCgnRXJyb3I6IGludmFsaWQgcGFzc3dvcmQgaW4gXCJsb2dpblwiIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZS5wYXNzd29yZCA9IGRhdGEucGFzc3dvcmQ7XG4gICAgICB9XG5cbiAgICAgIC8qIGhhbmRsZSwgaWYgc2V0LCBpbWFnZSBVUkwgKi9cbiAgICAgIGlmIChkYXRhLmltYWdlKSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZVVybChkYXRhLmltYWdlKSkge1xuICAgICAgICAgIHJlamVjdCgnRXJyb3I6IGludmFsaWQgaW1hZ2UgaW4gXCJsb2dpblwiIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZS5pbWFnZSA9IGRhdGEuaW1hZ2U7XG4gICAgICB9XG5cbiAgICAgIG1lc3NhZ2UudHlwZSA9IHRoaXMucG9zdE1lc3NhZ2VFdmVudHMuTE9HSU47XG4gICAgICBtZXNzYWdlLmhhc2ggPSBkYXRhLmhhc2g7XG4gICAgICBtZXNzYWdlLmZvcmNlTG9naW4gPSBkYXRhLmZvcmNlTG9naW47XG5cbiAgICAgIC8qIGtlZXAgc2VuZGluZyB0aGUgZGF0YSB0byB0aGUgY2hhdCB1bnRpbCB0aGUgY2hhdCByZXNwb25kcyAqL1xuICAgICAgY29uc3QgaW50ZXJ2YWxIYW5kbGUgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB9LCAxMDAwKTtcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdtZXNzYWdlJyxcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUG9zdE1lc3NhZ2UodGhpczogTmd4UnVtYmxldGFsa1NlcnZpY2UsIGV2ZW50KSB7XG4gICAgICAgICAgLyogdmFsaWRhdGVzIHRoZSBvcmlnaW4gdG8gYmUgZnJvbSBhIGNoYXQgKi9cbiAgICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVDaGF0T3JpZ2luKGV2ZW50Lm9yaWdpbikpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvcjogaW52YWxpZCBvcmlnaW4gaW4gXCJsb2dpblwiIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBldmVudC5kYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yOiBpbnZhbGlkIGRhdGEgcmVjZWl2ZWQgaW4gUnVtYmxlVGFsayBTREs6ICR7ZXZlbnQuZGF0YX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKiBkaWZmZXJlbnQgY2hhdCBjYWxsYmFjayAqL1xuICAgICAgICAgIGlmIChldmVudC5kYXRhLmhhc2ggIT09IGRhdGEuaGFzaCkge1xuICAgICAgICAgICAgcmVqZWN0KCdFcnJvcjogY2hhdCBoYXNoIG1pc21hdGNoJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLyogdmFsaWRhdGUgdGhhdCB0aGUgbWVzc2FnZSBpcyBvZiBhIHN1Y2Nlc3NmdWwgbG9naW4gb2YgdGhlIHNwZWNpZmljIGNoYXQgKi9cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBldmVudC5kYXRhLnR5cGUgPT09IHRoaXMucG9zdE1lc3NhZ2VFdmVudHMuTE9HSU5fU1VDQ0VTUyB8fFxuICAgICAgICAgICAgZXZlbnQuZGF0YS50eXBlID09PSB0aGlzLnBvc3RNZXNzYWdlRXZlbnRzLkxPR0lOX0FMUkVBRFlfTE9HR0VEX0lOXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSGFuZGxlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlUG9zdE1lc3NhZ2UpO1xuXG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBldmVudC5kYXRhLnR5cGUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGV2ZW50LmRhdGEudHlwZSA9PT0gdGhpcy5wb3N0TWVzc2FnZUV2ZW50cy5MT0dJTl9TVUNDRVNTID8gJ3N1Y2Nlc3MnIDogJ2FscmVhZHkgbG9nZ2VkIGluJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvZ291dChkYXRhOiBMb2dvdXREYXRhKTogdm9pZCB7XG4gICAgY29uc3QgbWVzc2FnZTogYW55ID0ge1xuICAgICAgdHlwZTogdGhpcy5wb3N0TWVzc2FnZUV2ZW50cy5MT0dPVVQsXG4gICAgICBoYXNoOiBkYXRhLmhhc2gsXG4gICAgfTtcblxuICAgIGlmIChkYXRhLnVzZXJJZCkge1xuICAgICAgbWVzc2FnZS51c2VySWQgPSBkYXRhLnVzZXJJZDtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS51c2VybmFtZSkge1xuICAgICAgbWVzc2FnZS51c2VybmFtZSA9IGRhdGEudXNlcm5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIGxvZ291dENCKGRhdGE6IExvZ291dENiRGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IGludGVydmFsSGFuZGxlID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5wb3N0TWVzc2FnZSh7IHR5cGU6IHRoaXMucG9zdE1lc3NhZ2VFdmVudHMuTE9HT1VUX0NCIH0pO1xuICAgIH0sIDEwMDApO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnbWVzc2FnZScsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgLyogdmFsaWRhdGVzIHRoZSBvcmlnaW4gdG8gYmUgZnJvbSBhIGNoYXQgKi9cbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlQ2hhdE9yaWdpbihldmVudC5vcmlnaW4pKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogZXhwZWN0aW5nIGFuIG9iamVjdCAqL1xuICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogZGlmZmVyZW50IGNoYXQgY2FsbGJhY2sgKi9cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuaGFzaCAhPT0gZGF0YS5oYXNoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogY2FsbGJhY2sgcmVnaXN0ZXJlZCAqL1xuICAgICAgICBpZiAoZXZlbnQuZGF0YS50eXBlID09PSB0aGlzLnBvc3RNZXNzYWdlRXZlbnRzLkxPR09VVF9DQl9SRUNFSVZFRCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxIYW5kbGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIHZhbGlkYXRlIGV2ZW50IHR5cGUgKi9cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEudHlwZSAhPT0gdGhpcy5wb3N0TWVzc2FnZUV2ZW50cy5MT0dPVVRfQ0IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLmNhbGxiYWNrKGV2ZW50LmRhdGEucmVhc29uKTtcbiAgICAgIH0sXG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cblxuICBvcGVuUHJpdmF0ZUNoYXQoZGF0YTogT3BlblByaXZhdGVDaGF0RGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IG1lc3NhZ2U6IGFueSA9IHtcbiAgICAgIHR5cGU6IHRoaXMucG9zdE1lc3NhZ2VFdmVudHMuT1BFTl9QUklWQVRFX0NIQVQsXG4gICAgICBoYXNoOiBkYXRhLmhhc2gsXG4gICAgfTtcblxuICAgIGlmIChkYXRhLnVzZXJJZCkge1xuICAgICAgbWVzc2FnZS51c2VySWQgPSBkYXRhLnVzZXJJZDtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS51c2VybmFtZSkge1xuICAgICAgbWVzc2FnZS51c2VybmFtZSA9IGRhdGEudXNlcm5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHBvc3RNZXNzYWdlKGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5pZnJhbWUgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCA/IHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cgOiB0aGlzLmlmcmFtZTtcbiAgICAgIHRhcmdldC5wb3N0TWVzc2FnZShkYXRhLCBgaHR0cHM6Ly8ke3RoaXMuc2VydmVyfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHRyaW0oc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xuICB9XG5cbiAgdmFsaWRhdGVVc2VybmFtZSh1c2VybmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEvXi0/XFxkKyQvLnRlc3QodXNlcm5hbWUpICYmIHVzZXJuYW1lLmxlbmd0aCA8IDY0O1xuICB9XG5cbiAgdmFsaWRhdGVQYXNzd29yZChwYXNzd29yZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIDAgPCBwYXNzd29yZC5sZW5ndGggJiYgcGFzc3dvcmQubGVuZ3RoIDwgNTE7XG4gIH1cblxuICB2YWxpZGF0ZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvKGh0dHBzPzopP1xcL1xcLyh3d3dcXC4pP1stYS16QS1aMC05QDolLl9cXCt+Iz1dezIsMjU2fVxcLlthLXpdezIsNn1cXGIoWy1hLXpBLVowLTlAOiVfXFwrLn4jPyYvLz1dKikvLnRlc3QodXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVja3MgaWYgdGhlIGdpdmVuIG9yaWdpbiBpcyBvZiBhIGNoYXQgc2VydmljZVxuICAgKiBAcGFyYW0gb3JpZ2luIC0gdGhlIFVSTCBvZiB0aGUgb3JpZ2luXG4gICAqIHJldHVybnMgYm9vbGVhblxuICAgKi9cbiAgdmFsaWRhdGVDaGF0T3JpZ2luKG9yaWdpbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXmh0dHBzOlxcL1xcLy4rXFwucnVtYmxldGFsa1xcLihuZXR8Y29tKSg6NDQzMyk/JC8udGVzdChvcmlnaW4pO1xuICB9XG59XG4iXX0=