matrix-react-sdk
Version:
SDK for matrix.org using React
131 lines (127 loc) • 22.7 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _logger = require("matrix-js-sdk/src/logger");
var _Exporter = _interopRequireDefault(require("./Exporter"));
var _languageHandler = require("../../languageHandler");
var _TextForEvent = require("../../TextForEvent");
var _EventTileFactory = require("../../events/EventTileFactory");
var _SettingsStore = _interopRequireDefault(require("../../settings/SettingsStore"));
var _DateUtils = require("../../DateUtils");
/*
Copyright 2024 New Vector Ltd.
Copyright 2021, 2022 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
class PlainTextExporter extends _Exporter.default {
constructor(room, exportType, exportOptions, setProgressText) {
super(room, exportType, exportOptions, setProgressText);
(0, _defineProperty2.default)(this, "totalSize", void 0);
(0, _defineProperty2.default)(this, "mediaOmitText", void 0);
(0, _defineProperty2.default)(this, "textForReplyEvent", content => {
const REPLY_REGEX = /> <(.*?)>(.*?)\n\n(.*)/s;
const REPLY_SOURCE_MAX_LENGTH = 32;
const match = REPLY_REGEX.exec(content.body);
// if the reply format is invalid, then return the body
if (!match) return content.body;
let rplSource;
const rplName = match[1];
const rplText = match[3];
rplSource = match[2].substring(1);
// Get the first non-blank line from the source.
const lines = rplSource.split("\n").filter(line => !/^\s*$/.test(line));
if (lines.length > 0) {
// Cut to a maximum length.
rplSource = lines[0].substring(0, REPLY_SOURCE_MAX_LENGTH);
// Ellipsis if needed.
if (lines[0].length > REPLY_SOURCE_MAX_LENGTH) {
rplSource = rplSource + "...";
}
// Wrap in formatting
rplSource = ` "${rplSource}"`;
} else {
// Don't show a source because we couldn't format one.
rplSource = "";
}
return `<${rplName}${rplSource}> ${rplText}`;
});
(0, _defineProperty2.default)(this, "plainTextForEvent", async mxEv => {
const senderDisplayName = mxEv.sender && mxEv.sender.name ? mxEv.sender.name : mxEv.getSender();
let mediaText = "";
if (this.isAttachment(mxEv)) {
if (this.exportOptions.attachmentsIncluded) {
try {
const blob = await this.getMediaBlob(mxEv);
if (this.totalSize + blob.size > this.exportOptions.maxSize) {
mediaText = ` (${this.mediaOmitText})`;
} else {
this.totalSize += blob.size;
const filePath = this.getFilePath(mxEv);
mediaText = " (" + (0, _languageHandler._t)("export_chat|file_attached") + ")";
this.addFile(filePath, blob);
if (this.totalSize == this.exportOptions.maxSize) {
this.exportOptions.attachmentsIncluded = false;
}
}
} catch (error) {
mediaText = " (" + (0, _languageHandler._t)("export_chat|error_fetching_file") + ")";
_logger.logger.log("Error fetching file " + error);
}
} else mediaText = ` (${this.mediaOmitText})`;
}
if (this.isReply(mxEv)) return senderDisplayName + ": " + this.textForReplyEvent(mxEv.getContent()) + mediaText;else return (0, _TextForEvent.textForEvent)(mxEv, this.room.client) + mediaText;
});
this.totalSize = 0;
this.mediaOmitText = !this.exportOptions.attachmentsIncluded ? (0, _languageHandler._t)("export_chat|media_omitted") : (0, _languageHandler._t)("export_chat|media_omitted_file_size");
}
get destinationFileName() {
return this.makeFileNameNoExtension() + ".txt";
}
async createOutput(events) {
let content = "";
for (let i = 0; i < events.length; i++) {
const event = events[i];
this.updateProgress((0, _languageHandler._t)("export_chat|processing_event_n", {
number: i + 1,
total: events.length
}), false, true);
if (this.cancelled) return this.cleanUp();
if (!(0, _EventTileFactory.haveRendererForEvent)(event, this.room.client, false)) continue;
const textForEvent = await this.plainTextForEvent(event);
content += textForEvent && `${(0, _DateUtils.formatFullDate)(new Date(event.getTs()), _SettingsStore.default.getValue("showTwelveHourTimestamps"))} - ${textForEvent}\n`;
}
return content;
}
async export() {
this.updateProgress((0, _languageHandler._t)("export_chat|starting_export"));
this.updateProgress((0, _languageHandler._t)("export_chat|fetching_events"));
const fetchStart = performance.now();
const res = await this.getRequiredEvents();
const fetchEnd = performance.now();
_logger.logger.log(`Fetched ${res.length} events in ${(fetchEnd - fetchStart) / 1000}s`);
this.updateProgress((0, _languageHandler._t)("export_chat|creating_output"));
const text = await this.createOutput(res);
if (this.files.length) {
this.addFile("export.txt", new Blob([text]));
await this.downloadZIP();
} else {
const fileName = this.destinationFileName;
this.downloadPlainText(fileName, text);
}
const exportEnd = performance.now();
if (this.cancelled) {
_logger.logger.info("Export cancelled successfully");
} else {
_logger.logger.info("Export successful!");
_logger.logger.log(`Exported ${res.length} events in ${(exportEnd - fetchStart) / 1000} seconds`);
}
this.cleanUp();
}
}
exports.default = PlainTextExporter;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9FeHBvcnRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX1RleHRGb3JFdmVudCIsIl9FdmVudFRpbGVGYWN0b3J5IiwiX1NldHRpbmdzU3RvcmUiLCJfRGF0ZVV0aWxzIiwiUGxhaW5UZXh0RXhwb3J0ZXIiLCJFeHBvcnRlciIsImNvbnN0cnVjdG9yIiwicm9vbSIsImV4cG9ydFR5cGUiLCJleHBvcnRPcHRpb25zIiwic2V0UHJvZ3Jlc3NUZXh0IiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJjb250ZW50IiwiUkVQTFlfUkVHRVgiLCJSRVBMWV9TT1VSQ0VfTUFYX0xFTkdUSCIsIm1hdGNoIiwiZXhlYyIsImJvZHkiLCJycGxTb3VyY2UiLCJycGxOYW1lIiwicnBsVGV4dCIsInN1YnN0cmluZyIsImxpbmVzIiwic3BsaXQiLCJmaWx0ZXIiLCJsaW5lIiwidGVzdCIsImxlbmd0aCIsIm14RXYiLCJzZW5kZXJEaXNwbGF5TmFtZSIsInNlbmRlciIsIm5hbWUiLCJnZXRTZW5kZXIiLCJtZWRpYVRleHQiLCJpc0F0dGFjaG1lbnQiLCJhdHRhY2htZW50c0luY2x1ZGVkIiwiYmxvYiIsImdldE1lZGlhQmxvYiIsInRvdGFsU2l6ZSIsInNpemUiLCJtYXhTaXplIiwibWVkaWFPbWl0VGV4dCIsImZpbGVQYXRoIiwiZ2V0RmlsZVBhdGgiLCJfdCIsImFkZEZpbGUiLCJlcnJvciIsImxvZ2dlciIsImxvZyIsImlzUmVwbHkiLCJ0ZXh0Rm9yUmVwbHlFdmVudCIsImdldENvbnRlbnQiLCJ0ZXh0Rm9yRXZlbnQiLCJjbGllbnQiLCJkZXN0aW5hdGlvbkZpbGVOYW1lIiwibWFrZUZpbGVOYW1lTm9FeHRlbnNpb24iLCJjcmVhdGVPdXRwdXQiLCJldmVudHMiLCJpIiwiZXZlbnQiLCJ1cGRhdGVQcm9ncmVzcyIsIm51bWJlciIsInRvdGFsIiwiY2FuY2VsbGVkIiwiY2xlYW5VcCIsImhhdmVSZW5kZXJlckZvckV2ZW50IiwicGxhaW5UZXh0Rm9yRXZlbnQiLCJmb3JtYXRGdWxsRGF0ZSIsIkRhdGUiLCJnZXRUcyIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsImV4cG9ydCIsImZldGNoU3RhcnQiLCJwZXJmb3JtYW5jZSIsIm5vdyIsInJlcyIsImdldFJlcXVpcmVkRXZlbnRzIiwiZmV0Y2hFbmQiLCJ0ZXh0IiwiZmlsZXMiLCJCbG9iIiwiZG93bmxvYWRaSVAiLCJmaWxlTmFtZSIsImRvd25sb2FkUGxhaW5UZXh0IiwiZXhwb3J0RW5kIiwiaW5mbyIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvZXhwb3J0VXRpbHMvUGxhaW5UZXh0RXhwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIxLCAyMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IFJvb20sIElDb250ZW50LCBNYXRyaXhFdmVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IEV4cG9ydGVyIGZyb20gXCIuL0V4cG9ydGVyXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IEV4cG9ydFR5cGUsIElFeHBvcnRPcHRpb25zIH0gZnJvbSBcIi4vZXhwb3J0VXRpbHNcIjtcbmltcG9ydCB7IHRleHRGb3JFdmVudCB9IGZyb20gXCIuLi8uLi9UZXh0Rm9yRXZlbnRcIjtcbmltcG9ydCB7IGhhdmVSZW5kZXJlckZvckV2ZW50IH0gZnJvbSBcIi4uLy4uL2V2ZW50cy9FdmVudFRpbGVGYWN0b3J5XCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IHsgZm9ybWF0RnVsbERhdGUgfSBmcm9tIFwiLi4vLi4vRGF0ZVV0aWxzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsYWluVGV4dEV4cG9ydGVyIGV4dGVuZHMgRXhwb3J0ZXIge1xuICAgIHByb3RlY3RlZCB0b3RhbFNpemU6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgbWVkaWFPbWl0VGV4dDogc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICByb29tOiBSb29tLFxuICAgICAgICBleHBvcnRUeXBlOiBFeHBvcnRUeXBlLFxuICAgICAgICBleHBvcnRPcHRpb25zOiBJRXhwb3J0T3B0aW9ucyxcbiAgICAgICAgc2V0UHJvZ3Jlc3NUZXh0OiBSZWFjdC5EaXNwYXRjaDxSZWFjdC5TZXRTdGF0ZUFjdGlvbjxzdHJpbmc+PixcbiAgICApIHtcbiAgICAgICAgc3VwZXIocm9vbSwgZXhwb3J0VHlwZSwgZXhwb3J0T3B0aW9ucywgc2V0UHJvZ3Jlc3NUZXh0KTtcbiAgICAgICAgdGhpcy50b3RhbFNpemUgPSAwO1xuICAgICAgICB0aGlzLm1lZGlhT21pdFRleHQgPSAhdGhpcy5leHBvcnRPcHRpb25zLmF0dGFjaG1lbnRzSW5jbHVkZWRcbiAgICAgICAgICAgID8gX3QoXCJleHBvcnRfY2hhdHxtZWRpYV9vbWl0dGVkXCIpXG4gICAgICAgICAgICA6IF90KFwiZXhwb3J0X2NoYXR8bWVkaWFfb21pdHRlZF9maWxlX3NpemVcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZXN0aW5hdGlvbkZpbGVOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ha2VGaWxlTmFtZU5vRXh0ZW5zaW9uKCkgKyBcIi50eHRcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGV4dEZvclJlcGx5RXZlbnQgPSAoY29udGVudDogSUNvbnRlbnQpOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBSRVBMWV9SRUdFWCA9IC8+IDwoLio/KT4oLio/KVxcblxcbiguKikvcztcbiAgICAgICAgY29uc3QgUkVQTFlfU09VUkNFX01BWF9MRU5HVEggPSAzMjtcblxuICAgICAgICBjb25zdCBtYXRjaCA9IFJFUExZX1JFR0VYLmV4ZWMoY29udGVudC5ib2R5KTtcblxuICAgICAgICAvLyBpZiB0aGUgcmVwbHkgZm9ybWF0IGlzIGludmFsaWQsIHRoZW4gcmV0dXJuIHRoZSBib2R5XG4gICAgICAgIGlmICghbWF0Y2gpIHJldHVybiBjb250ZW50LmJvZHk7XG5cbiAgICAgICAgbGV0IHJwbFNvdXJjZTogc3RyaW5nO1xuICAgICAgICBjb25zdCBycGxOYW1lID0gbWF0Y2hbMV07XG4gICAgICAgIGNvbnN0IHJwbFRleHQgPSBtYXRjaFszXTtcblxuICAgICAgICBycGxTb3VyY2UgPSBtYXRjaFsyXS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIC8vIEdldCB0aGUgZmlyc3Qgbm9uLWJsYW5rIGxpbmUgZnJvbSB0aGUgc291cmNlLlxuICAgICAgICBjb25zdCBsaW5lcyA9IHJwbFNvdXJjZS5zcGxpdChcIlxcblwiKS5maWx0ZXIoKGxpbmUpID0+ICEvXlxccyokLy50ZXN0KGxpbmUpKTtcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIEN1dCB0byBhIG1heGltdW0gbGVuZ3RoLlxuICAgICAgICAgICAgcnBsU291cmNlID0gbGluZXNbMF0uc3Vic3RyaW5nKDAsIFJFUExZX1NPVVJDRV9NQVhfTEVOR1RIKTtcbiAgICAgICAgICAgIC8vIEVsbGlwc2lzIGlmIG5lZWRlZC5cbiAgICAgICAgICAgIGlmIChsaW5lc1swXS5sZW5ndGggPiBSRVBMWV9TT1VSQ0VfTUFYX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgIHJwbFNvdXJjZSA9IHJwbFNvdXJjZSArIFwiLi4uXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXcmFwIGluIGZvcm1hdHRpbmdcbiAgICAgICAgICAgIHJwbFNvdXJjZSA9IGAgXCIke3JwbFNvdXJjZX1cImA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEb24ndCBzaG93IGEgc291cmNlIGJlY2F1c2Ugd2UgY291bGRuJ3QgZm9ybWF0IG9uZS5cbiAgICAgICAgICAgIHJwbFNvdXJjZSA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYDwke3JwbE5hbWV9JHtycGxTb3VyY2V9PiAke3JwbFRleHR9YDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIHBsYWluVGV4dEZvckV2ZW50ID0gYXN5bmMgKG14RXY6IE1hdHJpeEV2ZW50KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgY29uc3Qgc2VuZGVyRGlzcGxheU5hbWUgPSBteEV2LnNlbmRlciAmJiBteEV2LnNlbmRlci5uYW1lID8gbXhFdi5zZW5kZXIubmFtZSA6IG14RXYuZ2V0U2VuZGVyKCk7XG4gICAgICAgIGxldCBtZWRpYVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5pc0F0dGFjaG1lbnQobXhFdikpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4cG9ydE9wdGlvbnMuYXR0YWNobWVudHNJbmNsdWRlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCB0aGlzLmdldE1lZGlhQmxvYihteEV2KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudG90YWxTaXplICsgYmxvYi5zaXplID4gdGhpcy5leHBvcnRPcHRpb25zLm1heFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVGV4dCA9IGAgKCR7dGhpcy5tZWRpYU9taXRUZXh0fSlgO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b3RhbFNpemUgKz0gYmxvYi5zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKG14RXYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUZXh0ID0gXCIgKFwiICsgX3QoXCJleHBvcnRfY2hhdHxmaWxlX2F0dGFjaGVkXCIpICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEZpbGUoZmlsZVBhdGgsIGJsb2IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudG90YWxTaXplID09IHRoaXMuZXhwb3J0T3B0aW9ucy5tYXhTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBvcnRPcHRpb25zLmF0dGFjaG1lbnRzSW5jbHVkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lZGlhVGV4dCA9IFwiIChcIiArIF90KFwiZXhwb3J0X2NoYXR8ZXJyb3JfZmV0Y2hpbmdfZmlsZVwiKSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFwiRXJyb3IgZmV0Y2hpbmcgZmlsZSBcIiArIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgbWVkaWFUZXh0ID0gYCAoJHt0aGlzLm1lZGlhT21pdFRleHR9KWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNSZXBseShteEV2KSkgcmV0dXJuIHNlbmRlckRpc3BsYXlOYW1lICsgXCI6IFwiICsgdGhpcy50ZXh0Rm9yUmVwbHlFdmVudChteEV2LmdldENvbnRlbnQoKSkgKyBtZWRpYVRleHQ7XG4gICAgICAgIGVsc2UgcmV0dXJuIHRleHRGb3JFdmVudChteEV2LCB0aGlzLnJvb20uY2xpZW50KSArIG1lZGlhVGV4dDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZU91dHB1dChldmVudHM6IE1hdHJpeEV2ZW50W10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgY29udGVudCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGV2ZW50c1tpXTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3MoXG4gICAgICAgICAgICAgICAgX3QoXCJleHBvcnRfY2hhdHxwcm9jZXNzaW5nX2V2ZW50X25cIiwge1xuICAgICAgICAgICAgICAgICAgICBudW1iZXI6IGkgKyAxLFxuICAgICAgICAgICAgICAgICAgICB0b3RhbDogZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbmNlbGxlZCkgcmV0dXJuIHRoaXMuY2xlYW5VcCgpO1xuICAgICAgICAgICAgaWYgKCFoYXZlUmVuZGVyZXJGb3JFdmVudChldmVudCwgdGhpcy5yb29tLmNsaWVudCwgZmFsc2UpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHRleHRGb3JFdmVudCA9IGF3YWl0IHRoaXMucGxhaW5UZXh0Rm9yRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgY29udGVudCArPVxuICAgICAgICAgICAgICAgIHRleHRGb3JFdmVudCAmJlxuICAgICAgICAgICAgICAgIGAke2Zvcm1hdEZ1bGxEYXRlKFxuICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShldmVudC5nZXRUcygpKSxcbiAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcInNob3dUd2VsdmVIb3VyVGltZXN0YW1wc1wiKSxcbiAgICAgICAgICAgICAgICApfSAtICR7dGV4dEZvckV2ZW50fVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4cG9ydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy51cGRhdGVQcm9ncmVzcyhfdChcImV4cG9ydF9jaGF0fHN0YXJ0aW5nX2V4cG9ydFwiKSk7XG4gICAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3MoX3QoXCJleHBvcnRfY2hhdHxmZXRjaGluZ19ldmVudHNcIikpO1xuXG4gICAgICAgIGNvbnN0IGZldGNoU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5nZXRSZXF1aXJlZEV2ZW50cygpO1xuICAgICAgICBjb25zdCBmZXRjaEVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICAgIGxvZ2dlci5sb2coYEZldGNoZWQgJHtyZXMubGVuZ3RofSBldmVudHMgaW4gJHsoZmV0Y2hFbmQgLSBmZXRjaFN0YXJ0KSAvIDEwMDB9c2ApO1xuXG4gICAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3MoX3QoXCJleHBvcnRfY2hhdHxjcmVhdGluZ19vdXRwdXRcIikpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVPdXRwdXQocmVzKTtcblxuICAgICAgICBpZiAodGhpcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShcImV4cG9ydC50eHRcIiwgbmV3IEJsb2IoW3RleHRdKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRvd25sb2FkWklQKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMuZGVzdGluYXRpb25GaWxlTmFtZTtcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWRQbGFpblRleHQoZmlsZU5hbWUsIHRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwb3J0RW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcIkV4cG9ydCBjYW5jZWxsZWQgc3VjY2Vzc2Z1bGx5XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJFeHBvcnQgc3VjY2Vzc2Z1bCFcIik7XG4gICAgICAgICAgICBsb2dnZXIubG9nKGBFeHBvcnRlZCAke3Jlcy5sZW5ndGh9IGV2ZW50cyBpbiAkeyhleHBvcnRFbmQgLSBmZXRjaFN0YXJ0KSAvIDEwMDB9IHNlY29uZHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYW5VcCgpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFTQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFHQSxJQUFBQyxTQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksYUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssaUJBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGNBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFPLFVBQUEsR0FBQVAsT0FBQTtBQWxCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFjZSxNQUFNUSxpQkFBaUIsU0FBU0MsaUJBQVEsQ0FBQztFQUk3Q0MsV0FBV0EsQ0FDZEMsSUFBVSxFQUNWQyxVQUFzQixFQUN0QkMsYUFBNkIsRUFDN0JDLGVBQTZELEVBQy9EO0lBQ0UsS0FBSyxDQUFDSCxJQUFJLEVBQUVDLFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxlQUFlLENBQUM7SUFBQyxJ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