/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); var __export = (target, all) => { __markAsModule(target); for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __reExport = (target, module2, desc) => { if (module2 && typeof module2 === "object" || typeof module2 === "function") { for (let key of __getOwnPropNames(module2)) if (!__hasOwnProp.call(target, key) && key !== "default") __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); } return target; }; var __toModule = (module2) => { return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); }; var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // main.ts __export(exports, { default: () => main_default }); // src/App.ts var import_obsidian3 = __toModule(require("obsidian")); // src/Modal.ts var import_obsidian = __toModule(require("obsidian")); var CameraModal = class extends import_obsidian.Modal { constructor(app2, cameraSettings) { super(app2); this.chosenFolderPath = cameraSettings.chosenFolderPath; } onOpen() { return __async(this, null, function* () { const { contentEl } = this; const webCamContainer = contentEl.createDiv(); const videoEl = webCamContainer.createEl("video"); videoEl.autoplay = true; videoEl.muted = true; const recordVideoButton = webCamContainer.createEl("button", { text: "Start recording" }); const switchCameraButton = webCamContainer.createEl("button", { text: "Switch Camera" }); const snapPhotoButton = webCamContainer.createEl("button", { text: "Take a snap" }); const filePicker = webCamContainer.createEl("input", { placeholder: "Choose image file from system", type: "file" }); filePicker.accept = "image/*,video/*"; filePicker.capture = "camera"; const filePicker2 = webCamContainer.createEl("input", { placeholder: "Choose image file from system", type: "file" }); filePicker2.accept = "image/*"; filePicker2.capture = "camera"; const chunks = []; let recorder = null; let videoStream = null; const cameras = (yield navigator.mediaDevices.enumerateDevices()).filter((d) => d.kind === "videoinput"); if (cameras.length <= 1) switchCameraButton.style.display = "none"; let cameraIndex = 0; const getVideoStream = () => __async(this, null, function* () { try { return yield navigator.mediaDevices.getUserMedia({ video: { deviceId: cameras[cameraIndex].deviceId }, audio: true }); } catch (error) { console.log(error); return null; } }); videoStream = yield getVideoStream(); if (!videoStream) { videoEl.style.display = "none"; snapPhotoButton.style.display = "none"; recordVideoButton.style.display = "none"; switchCameraButton.style.display = "none"; filePicker2.style.display = "block"; } const handleImageSelectChange = (file) => __async(this, null, function* () { const chosenFile = file; const bufferFile = yield chosenFile.arrayBuffer(); saveFile(bufferFile, false, chosenFile.name.split(" ").join("-")); }); filePicker.onchange = () => handleImageSelectChange(filePicker.files[0]); filePicker2.onchange = () => handleImageSelectChange(filePicker2.files[0]); const view = this.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView); const saveFile = (file, isImage = false, fileName = "") => __async(this, null, function* () { if (!fileName) { const dateString = (new Date() + "").slice(4, 28).split(" ").join("_").split(":").join("-"); fileName = isImage ? `image_${dateString}.png` : `video_${dateString}.webm`; } if (!isImage) new import_obsidian.Notice("Adding video to vault..."); const filePath = this.chosenFolderPath + "/" + fileName; const folderExists = app.vault.getAbstractFileByPath(this.chosenFolderPath); if (!folderExists) yield app.vault.createFolder(this.chosenFolderPath); const fileExists = app.vault.getAbstractFileByPath(filePath); if (!fileExists) yield app.vault.createBinary(filePath, file); if (!view) return new import_obsidian.Notice(`Saved to ${filePath}`); const cursor = view.editor.getCursor(); view.editor.replaceRange(isImage ? `![${fileName}](${filePath}) ` : ` ![[${filePath}]] `, cursor); videoStream && videoStream.getTracks().forEach((track) => { track.stop(); }); this.close(); }); switchCameraButton.onclick = () => __async(this, null, function* () { cameraIndex = (cameraIndex + 1) % cameras.length; videoStream = yield getVideoStream(); }); snapPhotoButton.onclick = () => { const canvas = webCamContainer.createEl("canvas"); canvas.style.display = "none"; const { videoHeight, videoWidth } = videoEl; canvas.height = videoHeight; canvas.width = videoWidth; canvas.getContext("2d").drawImage(videoEl, 0, 0, videoWidth, videoHeight); canvas.toBlob((blob) => __async(this, null, function* () { const bufferFile = yield blob.arrayBuffer(); saveFile(bufferFile, true); }), "image/png"); }; videoEl.srcObject = videoStream; recordVideoButton.onclick = () => __async(this, null, function* () { switchCameraButton.disabled = true; let isRecording = recorder && recorder.state === "recording"; if (isRecording) recorder.stop(); isRecording = !isRecording; recordVideoButton.innerText = isRecording ? "Stop Recording" : "Start Recording"; if (!recorder) { recorder = new MediaRecorder(videoStream, { mimeType: "video/webm" }); } recorder.ondataavailable = (e) => chunks.push(e.data); recorder.onstop = (e) => __async(this, null, function* () { const blob = new Blob(chunks, { type: "audio/ogg; codecs=opus" }); const bufferFile = yield blob.arrayBuffer(); saveFile(bufferFile, false); }); recorder.start(); }); }); } onClose() { const { contentEl } = this; contentEl.empty(); } }; var Modal_default = CameraModal; // src/SettingsTab.ts var import_obsidian2 = __toModule(require("obsidian")); var DEFAULT_SETTINGS = { chosenFolderPath: "attachments/snaps" }; var CameraSettingsTab = class extends import_obsidian2.PluginSettingTab { constructor(app2, plugin) { super(app2, plugin); this.plugin = plugin; } display() { const { containerEl } = this; containerEl.empty(); containerEl.createEl("h2", { text: "Obsidian-Camera settings" }); new import_obsidian2.Setting(containerEl).setName("Folder Path").setDesc("Folder where the videos and snaps should be saved").addText((text) => text.setPlaceholder("Enter your secret").setValue(this.plugin.settings.chosenFolderPath).onChange((value) => __async(this, null, function* () { console.log("Chosen Folder Path: " + value); this.plugin.settings.chosenFolderPath = value; yield this.plugin.saveSettings(); }))); } }; // src/App.ts var ObsidianCamera = class extends import_obsidian3.Plugin { onload() { return __async(this, null, function* () { yield this.loadSettings(); this.addRibbonIcon("camera", "Obsidian Camera", (evt) => { new Modal_default(this.app, this.settings).open(); }); this.addSettingTab(new CameraSettingsTab(this.app, this)); this.addCommand({ id: "Open camera modal", name: "Open camera modal / File Picker", callback: () => { new Modal_default(this.app, this.settings).open(); } }); }); } loadSettings() { return __async(this, null, function* () { this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); }); } saveSettings() { return __async(this, null, function* () { yield this.saveData(this.settings); }); } }; // main.ts var main_default = ObsidianCamera; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJzcmMvQXBwLnRzIiwgInNyYy9Nb2RhbC50cyIsICJzcmMvU2V0dGluZ3NUYWIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBPYnNpZGlhbkNhbWVyYSBmcm9tIFwic3JjL0FwcFwiO1xuXG5leHBvcnQgZGVmYXVsdCBPYnNpZGlhbkNhbWVyYSIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBDYW1lcmFNb2RhbCBmcm9tIFwiLi9Nb2RhbFwiO1xuaW1wb3J0IENhbWVyYVNldHRpbmdzVGFiLCB7IERFRkFVTFRfU0VUVElOR1MsIENhbWVyYVBsdWdpblNldHRpbmdzIH0gZnJvbSBcIi4vU2V0dGluZ3NUYWJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JzaWRpYW5DYW1lcmEgZXh0ZW5kcyBQbHVnaW4ge1xuICBzZXR0aW5nczogQ2FtZXJhUGx1Z2luU2V0dGluZ3M7XG4gIGFzeW5jIG9ubG9hZCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuICAgIHRoaXMuYWRkUmliYm9uSWNvbihcImNhbWVyYVwiLCBcIk9ic2lkaWFuIENhbWVyYVwiLCAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBuZXcgQ2FtZXJhTW9kYWwodGhpcy5hcHAsIHRoaXMuc2V0dGluZ3MpLm9wZW4oKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IENhbWVyYVNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cbiAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6IFwiT3BlbiBjYW1lcmEgbW9kYWxcIixcbiAgICAgIG5hbWU6IFwiT3BlbiBjYW1lcmEgbW9kYWwgLyBGaWxlIFBpY2tlclwiLFxuICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgbmV3IENhbWVyYU1vZGFsKHRoaXMuYXBwLCB0aGlzLnNldHRpbmdzKS5vcGVuKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cblxuICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG4gIH1cblxuICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEFwcCwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nXG5pbXBvcnQgeyBDYW1lcmFQbHVnaW5TZXR0aW5ncyB9IGZyb20gJy4vU2V0dGluZ3NUYWInO1xuXG5jbGFzcyBDYW1lcmFNb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgY2hvc2VuRm9sZGVyUGF0aDogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgY2FtZXJhU2V0dGluZ3M6IENhbWVyYVBsdWdpblNldHRpbmdzKSB7XG4gICAgc3VwZXIoYXBwKTtcbiAgICB0aGlzLmNob3NlbkZvbGRlclBhdGggPSBjYW1lcmFTZXR0aW5ncy5jaG9zZW5Gb2xkZXJQYXRoXG4gIH1cblxuICBhc3luYyBvbk9wZW4oKSB7XG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG4gICAgY29uc3Qgd2ViQ2FtQ29udGFpbmVyID0gY29udGVudEVsLmNyZWF0ZURpdigpO1xuICAgIC8vIGNvbnN0IHBUZXh0ID0gd2ViQ2FtQ29udGFpbmVyLmNyZWF0ZUVsXG4gICAgLy8gKCdwJywgeyB0ZXh0OiAnZ2V0VmlkZW9TdHJlYW0gbm90IHlldCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuJyB9KTtcbiAgICAvLyBwVGV4dC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgY29uc3QgdmlkZW9FbCA9IHdlYkNhbUNvbnRhaW5lci5jcmVhdGVFbChcInZpZGVvXCIpO1xuICAgIHZpZGVvRWwuYXV0b3BsYXkgPSB0cnVlO1xuICAgIHZpZGVvRWwubXV0ZWQgPSB0cnVlXG4gICAgY29uc3QgcmVjb3JkVmlkZW9CdXR0b24gPSB3ZWJDYW1Db250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuICAgICAgdGV4dDogXCJTdGFydCByZWNvcmRpbmdcIixcbiAgICB9KTtcbiAgICBjb25zdCBzd2l0Y2hDYW1lcmFCdXR0b24gPSB3ZWJDYW1Db250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuICAgICAgdGV4dDogXCJTd2l0Y2ggQ2FtZXJhXCIsXG4gICAgfSk7XG4gICAgY29uc3Qgc25hcFBob3RvQnV0dG9uID0gd2ViQ2FtQ29udGFpbmVyLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHtcbiAgICAgIHRleHQ6IFwiVGFrZSBhIHNuYXBcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbGVQaWNrZXIgPSB3ZWJDYW1Db250YWluZXIuY3JlYXRlRWwoXCJpbnB1dFwiLCB7XG4gICAgICBwbGFjZWhvbGRlcjogXCJDaG9vc2UgaW1hZ2UgZmlsZSBmcm9tIHN5c3RlbVwiLFxuICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgfSk7XG4gICAgZmlsZVBpY2tlci5hY2NlcHQgPSBcImltYWdlLyosdmlkZW8vKlwiO1xuICAgIGZpbGVQaWNrZXIuY2FwdHVyZSA9IFwiY2FtZXJhXCI7IC8vIGJhY2sgY2FtZXJhIGJ5IGRlZmF1bHQgZm9yIG1vYmlsZSBzY3JlZW5zXG5cbiAgICBjb25zdCBmaWxlUGlja2VyMiA9IHdlYkNhbUNvbnRhaW5lci5jcmVhdGVFbChcImlucHV0XCIsIHtcbiAgICAgIHBsYWNlaG9sZGVyOiBcIkNob29zZSBpbWFnZSBmaWxlIGZyb20gc3lzdGVtXCIsXG4gICAgICB0eXBlOiBcImZpbGVcIixcbiAgICB9KTtcbiAgICBmaWxlUGlja2VyMi5hY2NlcHQgPSBcImltYWdlLypcIjtcbiAgICBmaWxlUGlja2VyMi5jYXB0dXJlID0gXCJjYW1lcmFcIjsgLy8gYmFjayBjYW1lcmEgYnkgZGVmYXVsdCBmb3IgbW9iaWxlIHNjcmVlbnNcbiAgICAvLyBmaWxlUGlja2VyMi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG5cblxuICAgIGNvbnN0IGNodW5rczogQmxvYlBhcnRbXSA9IFtdO1xuICAgIGxldCByZWNvcmRlcjogTWVkaWFSZWNvcmRlciA9IG51bGw7XG4gICAgbGV0IHZpZGVvU3RyZWFtOiBNZWRpYVN0cmVhbSA9IG51bGw7XG5cbiAgICBjb25zdCBjYW1lcmFzID0gKFxuICAgICAgYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKClcbiAgICApLmZpbHRlcigoZCkgPT4gZC5raW5kID09PSBcInZpZGVvaW5wdXRcIik7XG5cbiAgICBpZiAoY2FtZXJhcy5sZW5ndGggPD0gMSkgc3dpdGNoQ2FtZXJhQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICBsZXQgY2FtZXJhSW5kZXggPSAwO1xuXG4gICAgY29uc3QgZ2V0VmlkZW9TdHJlYW0gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xuICAgICAgICAgIHZpZGVvOiB7IGRldmljZUlkOiBjYW1lcmFzW2NhbWVyYUluZGV4XS5kZXZpY2VJZCB9LFxuICAgICAgICAgIGF1ZGlvOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZpZGVvU3RyZWFtID0gYXdhaXQgZ2V0VmlkZW9TdHJlYW0oKTtcbiAgICBpZiAoIXZpZGVvU3RyZWFtKSB7XG4gICAgICB2aWRlb0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgIC8vIHBUZXh0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXG4gICAgICBzbmFwUGhvdG9CdXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgICAgcmVjb3JkVmlkZW9CdXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgICAgc3dpdGNoQ2FtZXJhQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgIGZpbGVQaWNrZXIyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlSW1hZ2VTZWxlY3RDaGFuZ2UgPSBhc3luYyAoZmlsZTogRmlsZSkgPT4ge1xuICAgICAgY29uc3QgY2hvc2VuRmlsZSA9IGZpbGU7XG4gICAgICBjb25zdCBidWZmZXJGaWxlID0gYXdhaXQgY2hvc2VuRmlsZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgc2F2ZUZpbGUoYnVmZmVyRmlsZSwgZmFsc2UsIGNob3NlbkZpbGUubmFtZS5zcGxpdCgnICcpLmpvaW4oJy0nKSk7XG4gICAgfTtcbiAgICBmaWxlUGlja2VyLm9uY2hhbmdlID0gKCkgPT4gaGFuZGxlSW1hZ2VTZWxlY3RDaGFuZ2UoZmlsZVBpY2tlci5maWxlc1swXSlcbiAgICBmaWxlUGlja2VyMi5vbmNoYW5nZSA9ICgpID0+IGhhbmRsZUltYWdlU2VsZWN0Q2hhbmdlKGZpbGVQaWNrZXIyLmZpbGVzWzBdKVxuXG5cbiAgICBjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcblxuICAgIGNvbnN0IHNhdmVGaWxlID0gYXN5bmMgKGZpbGU6IEFycmF5QnVmZmVyLCBpc0ltYWdlID0gZmFsc2UsIGZpbGVOYW1lID0gJycpID0+IHtcbiAgICAgIGlmICghZmlsZU5hbWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZVN0cmluZyA9IChuZXcgRGF0ZSgpICsgXCJcIilcbiAgICAgICAgICAuc2xpY2UoNCwgMjgpXG4gICAgICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgICAgIC5qb2luKFwiX1wiKVxuICAgICAgICAgIC5zcGxpdChcIjpcIilcbiAgICAgICAgICAuam9pbihcIi1cIik7XG4gICAgICAgIGZpbGVOYW1lID0gaXNJbWFnZVxuICAgICAgICAgID8gYGltYWdlXyR7ZGF0ZVN0cmluZ30ucG5nYFxuICAgICAgICAgIDogYHZpZGVvXyR7ZGF0ZVN0cmluZ30ud2VibWA7XG4gICAgICB9XG4gICAgICBpZiAoIWlzSW1hZ2UpIG5ldyBOb3RpY2UoXCJBZGRpbmcgdmlkZW8gdG8gdmF1bHQuLi5cIilcblxuICAgICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmNob3NlbkZvbGRlclBhdGggKyBcIi9cIiArIGZpbGVOYW1lO1xuICAgICAgY29uc3QgZm9sZGVyRXhpc3RzID1cbiAgICAgICAgYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aCh0aGlzLmNob3NlbkZvbGRlclBhdGgpO1xuICAgICAgaWYgKCFmb2xkZXJFeGlzdHMpIGF3YWl0IGFwcC52YXVsdC5jcmVhdGVGb2xkZXIodGhpcy5jaG9zZW5Gb2xkZXJQYXRoKTtcbiAgICAgIGNvbnN0IGZpbGVFeGlzdHMgPVxuICAgICAgICBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZpbGVQYXRoKTtcbiAgICAgIGlmICghZmlsZUV4aXN0cylcbiAgICAgICAgYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUJpbmFyeShmaWxlUGF0aCwgZmlsZSk7XG5cbiAgICAgIGlmICghdmlldykgcmV0dXJuIG5ldyBOb3RpY2UoYFNhdmVkIHRvICR7ZmlsZVBhdGh9YCk7XG5cbiAgICAgIGNvbnN0IGN1cnNvciA9IHZpZXcuZWRpdG9yLmdldEN1cnNvcigpO1xuICAgICAgdmlldy5lZGl0b3IucmVwbGFjZVJhbmdlKFxuICAgICAgICBpc0ltYWdlXG4gICAgICAgICAgPyBgIVske2ZpbGVOYW1lfV0oJHtmaWxlUGF0aH0pXFxuYFxuICAgICAgICAgIDogYFxcbiFbWyR7ZmlsZVBhdGh9XV1cXG5gLFxuICAgICAgICBjdXJzb3JcbiAgICAgICk7XG4gICAgICB2aWRlb1N0cmVhbSAmJiB2aWRlb1N0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2xvc2UoKTsgLy8gY2xvc2luZyB0aGUgbW9kYWxcbiAgICB9O1xuXG5cbiAgICBzd2l0Y2hDYW1lcmFCdXR0b24ub25jbGljayA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNhbWVyYUluZGV4ID0gKGNhbWVyYUluZGV4ICsgMSkgJSBjYW1lcmFzLmxlbmd0aDtcbiAgICAgIHZpZGVvU3RyZWFtID0gYXdhaXQgZ2V0VmlkZW9TdHJlYW0oKTtcbiAgICB9O1xuXG4gICAgc25hcFBob3RvQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjYW52YXMgPSB3ZWJDYW1Db250YWluZXIuY3JlYXRlRWwoXCJjYW52YXNcIik7XG4gICAgICBjYW52YXMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgY29uc3QgeyB2aWRlb0hlaWdodCwgdmlkZW9XaWR0aCB9ID0gdmlkZW9FbFxuICAgICAgY2FudmFzLmhlaWdodCA9IHZpZGVvSGVpZ2h0O1xuICAgICAgY2FudmFzLndpZHRoID0gdmlkZW9XaWR0aDtcblxuICAgICAgY2FudmFzLmdldENvbnRleHQoXCIyZFwiKS5kcmF3SW1hZ2UodmlkZW9FbCwgMCwgMCwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQpO1xuICAgICAgY2FudmFzLnRvQmxvYihhc3luYyAoYmxvYikgPT4ge1xuICAgICAgICBjb25zdCBidWZmZXJGaWxlID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuICAgICAgICBzYXZlRmlsZShidWZmZXJGaWxlLCB0cnVlKTtcbiAgICAgIH0sIFwiaW1hZ2UvcG5nXCIpO1xuICAgIH07XG5cbiAgICB2aWRlb0VsLnNyY09iamVjdCA9IHZpZGVvU3RyZWFtO1xuXG4gICAgcmVjb3JkVmlkZW9CdXR0b24ub25jbGljayA9IGFzeW5jICgpID0+IHtcbiAgICAgIHN3aXRjaENhbWVyYUJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBsZXQgaXNSZWNvcmRpbmc6IGJvb2xlYW4gPVxuICAgICAgICByZWNvcmRlciAmJiByZWNvcmRlci5zdGF0ZSA9PT0gXCJyZWNvcmRpbmdcIjtcbiAgICAgIGlmIChpc1JlY29yZGluZykgcmVjb3JkZXIuc3RvcCgpO1xuICAgICAgaXNSZWNvcmRpbmcgPSAhaXNSZWNvcmRpbmc7XG4gICAgICByZWNvcmRWaWRlb0J1dHRvbi5pbm5lclRleHQgPSBpc1JlY29yZGluZ1xuICAgICAgICA/IFwiU3RvcCBSZWNvcmRpbmdcIlxuICAgICAgICA6IFwiU3RhcnQgUmVjb3JkaW5nXCI7XG5cbiAgICAgIGlmICghcmVjb3JkZXIpIHtcbiAgICAgICAgcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlcih2aWRlb1N0cmVhbSwge1xuICAgICAgICAgIG1pbWVUeXBlOiBcInZpZGVvL3dlYm1cIixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJlY29yZGVyLm9uZGF0YWF2YWlsYWJsZSA9IChlKSA9PiBjaHVua3MucHVzaChlLmRhdGEpO1xuICAgICAgcmVjb3JkZXIub25zdG9wID0gYXN5bmMgKGUpID0+IHtcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKGNodW5rcywge1xuICAgICAgICAgIHR5cGU6IFwiYXVkaW8vb2dnOyBjb2RlY3M9b3B1c1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYnVmZmVyRmlsZSA9IGF3YWl0IGJsb2IuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgc2F2ZUZpbGUoYnVmZmVyRmlsZSwgZmFsc2UpO1xuICAgICAgfTtcbiAgICAgIHJlY29yZGVyLnN0YXJ0KCk7XG4gICAgfTtcblxuXG4gIH1cblxuICBvbkNsb3NlKCkge1xuICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENhbWVyYU1vZGFsIiwgIlxuaW1wb3J0IE9ic2lkaWFuQ2FtZXJhIGZyb20gXCJtYWluXCI7XG5pbXBvcnQgeyBBcHAsIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuZXhwb3J0IGludGVyZmFjZSBDYW1lcmFQbHVnaW5TZXR0aW5ncyB7XG4gIGNob3NlbkZvbGRlclBhdGg6IHN0cmluZztcblxufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogQ2FtZXJhUGx1Z2luU2V0dGluZ3MgPSB7XG4gIGNob3NlbkZvbGRlclBhdGg6ICdhdHRhY2htZW50cy9zbmFwcydcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FtZXJhU2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcGx1Z2luOiBPYnNpZGlhbkNhbWVyYTtcblxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBPYnNpZGlhbkNhbWVyYSkge1xuICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgfVxuXG4gIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcbiAgICBjb250YWluZXJFbC5lbXB0eSgpO1xuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ09ic2lkaWFuLUNhbWVyYSBzZXR0aW5ncycgfSk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKCdGb2xkZXIgUGF0aCcpXG4gICAgICAuc2V0RGVzYygnRm9sZGVyIHdoZXJlIHRoZSB2aWRlb3MgYW5kIHNuYXBzIHNob3VsZCBiZSBzYXZlZCcpXG4gICAgICAuYWRkVGV4dCh0ZXh0ID0+IHRleHRcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKCdFbnRlciB5b3VyIHNlY3JldCcpXG4gICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jaG9zZW5Gb2xkZXJQYXRoKVxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0Nob3NlbiBGb2xkZXIgUGF0aDogJyArIHZhbHVlKTtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jaG9zZW5Gb2xkZXJQYXRoID0gdmFsdWU7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgIH0pKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7OztBQ0FBLHVCQUF1Qjs7O0FDQXZCLHNCQUFpRDtBQUdqRCxnQ0FBMEIsc0JBQU07QUFBQSxFQUU5QixZQUFZLE1BQVUsZ0JBQXNDO0FBQzFELFVBQU07QUFDTixTQUFLLG1CQUFtQixlQUFlO0FBQUE7QUFBQSxFQUduQyxTQUFTO0FBQUE7QUFDYixZQUFNLEVBQUUsY0FBYztBQUN0QixZQUFNLGtCQUFrQixVQUFVO0FBSWxDLFlBQU0sVUFBVSxnQkFBZ0IsU0FBUztBQUN6QyxjQUFRLFdBQVc7QUFDbkIsY0FBUSxRQUFRO0FBQ2hCLFlBQU0sb0JBQW9CLGdCQUFnQixTQUFTLFVBQVU7QUFBQSxRQUMzRCxNQUFNO0FBQUE7QUFFUixZQUFNLHFCQUFxQixnQkFBZ0IsU0FBUyxVQUFVO0FBQUEsUUFDNUQsTUFBTTtBQUFBO0FBRVIsWUFBTSxrQkFBa0IsZ0JBQWdCLFNBQVMsVUFBVTtBQUFBLFFBQ3pELE1BQU07QUFBQTtBQUdSLFlBQU0sYUFBYSxnQkFBZ0IsU0FBUyxTQUFTO0FBQUEsUUFDbkQsYUFBYTtBQUFBLFFBQ2IsTUFBTTtBQUFBO0FBRVIsaUJBQVcsU0FBUztBQUNwQixpQkFBVyxVQUFVO0FBRXJCLFlBQU0sY0FBYyxnQkFBZ0IsU0FBUyxTQUFTO0FBQUEsUUFDcEQsYUFBYTtBQUFBLFFBQ2IsTUFBTTtBQUFBO0FBRVIsa0JBQVksU0FBUztBQUNyQixrQkFBWSxVQUFVO0FBSXRCLFlBQU0sU0FBcUI7QUFDM0IsVUFBSSxXQUEwQjtBQUM5QixVQUFJLGNBQTJCO0FBRS9CLFlBQU0sVUFDSixPQUFNLFVBQVUsYUFBYSxvQkFDN0IsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTO0FBRTNCLFVBQUksUUFBUSxVQUFVO0FBQUcsMkJBQW1CLE1BQU0sVUFBVTtBQUM1RCxVQUFJLGNBQWM7QUFFbEIsWUFBTSxpQkFBaUIsTUFBWTtBQUNqQyxZQUFJO0FBQ0YsaUJBQU8sTUFBTSxVQUFVLGFBQWEsYUFBYTtBQUFBLFlBQy9DLE9BQU8sRUFBRSxVQUFVLFFBQVEsYUFBYTtBQUFBLFlBQ3hDLE9BQU87QUFBQTtBQUFBLGlCQUVGLE9BQVA7QUFDQSxrQkFBUSxJQUFJO0FBQ1osaUJBQU87QUFBQTtBQUFBO0FBSVgsb0JBQWMsTUFBTTtBQUNwQixVQUFJLENBQUMsYUFBYTtBQUNoQixnQkFBUSxNQUFNLFVBQVU7QUFFeEIsd0JBQWdCLE1BQU0sVUFBVTtBQUNoQywwQkFBa0IsTUFBTSxVQUFVO0FBQ2xDLDJCQUFtQixNQUFNLFVBQVU7QUFDbkMsb0JBQVksTUFBTSxVQUFVO0FBQUE7QUFHOUIsWUFBTSwwQkFBMEIsQ0FBTyxTQUFlO0FBQ3BELGNBQU0sYUFBYTtBQUNuQixjQUFNLGFBQWEsTUFBTSxXQUFXO0FBQ3BDLGlCQUFTLFlBQVksT0FBTyxXQUFXLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQTtBQUU5RCxpQkFBVyxXQUFXLE1BQU0sd0JBQXdCLFdBQVcsTUFBTTtBQUNyRSxrQkFBWSxXQUFXLE1BQU0sd0JBQXdCLFlBQVksTUFBTTtBQUd2RSxZQUFNLE9BQU8sS0FBSyxJQUFJLFVBQVUsb0JBQW9CO0FBRXBELFlBQU0sV0FBVyxDQUFPLE1BQW1CLFVBQVUsT0FBTyxXQUFXLE9BQU87QUFDNUUsWUFBSSxDQUFDLFVBQVU7QUFDYixnQkFBTSxhQUFjLEtBQUksU0FBUyxJQUM5QixNQUFNLEdBQUcsSUFDVCxNQUFNLEtBQ04sS0FBSyxLQUNMLE1BQU0sS0FDTixLQUFLO0FBQ1IscUJBQVcsVUFDUCxTQUFTLG1CQUNULFNBQVM7QUFBQTtBQUVmLFlBQUksQ0FBQztBQUFTLGNBQUksdUJBQU87QUFFekIsY0FBTSxXQUFXLEtBQUssbUJBQW1CLE1BQU07QUFDL0MsY0FBTSxlQUNKLElBQUksTUFBTSxzQkFBc0IsS0FBSztBQUN2QyxZQUFJLENBQUM7QUFBYyxnQkFBTSxJQUFJLE1BQU0sYUFBYSxLQUFLO0FBQ3JELGNBQU0sYUFDSixJQUFJLE1BQU0sc0JBQXNCO0FBQ2xDLFlBQUksQ0FBQztBQUNILGdCQUFNLElBQUksTUFBTSxhQUFhLFVBQVU7QUFFekMsWUFBSSxDQUFDO0FBQU0saUJBQU8sSUFBSSx1QkFBTyxZQUFZO0FBRXpDLGNBQU0sU0FBUyxLQUFLLE9BQU87QUFDM0IsYUFBSyxPQUFPLGFBQ1YsVUFDSSxLQUFLLGFBQWE7QUFBQSxJQUNsQjtBQUFBLEtBQVE7QUFBQSxHQUNaO0FBRUYsdUJBQWUsWUFBWSxZQUFZLFFBQVEsQ0FBQyxVQUFVO0FBQ3hELGdCQUFNO0FBQUE7QUFFUixhQUFLO0FBQUE7QUFJUCx5QkFBbUIsVUFBVSxNQUFZO0FBQ3ZDLHNCQUFlLGVBQWMsS0FBSyxRQUFRO0FBQzFDLHNCQUFjLE1BQU07QUFBQTtBQUd0QixzQkFBZ0IsVUFBVSxNQUFNO0FBQzlCLGNBQU0sU0FBUyxnQkFBZ0IsU0FBUztBQUN4QyxlQUFPLE1BQU0sVUFBVTtBQUN2QixjQUFNLEVBQUUsYUFBYSxlQUFlO0FBQ3BDLGVBQU8sU0FBUztBQUNoQixlQUFPLFFBQVE7QUFFZixlQUFPLFdBQVcsTUFBTSxVQUFVLFNBQVMsR0FBRyxHQUFHLFlBQVk7QUFDN0QsZUFBTyxPQUFPLENBQU8sU0FBUztBQUM1QixnQkFBTSxhQUFhLE1BQU0sS0FBSztBQUM5QixtQkFBUyxZQUFZO0FBQUEsWUFDcEI7QUFBQTtBQUdMLGNBQVEsWUFBWTtBQUVwQix3QkFBa0IsVUFBVSxNQUFZO0FBQ3RDLDJCQUFtQixXQUFXO0FBQzlCLFlBQUksY0FDRixZQUFZLFNBQVMsVUFBVTtBQUNqQyxZQUFJO0FBQWEsbUJBQVM7QUFDMUIsc0JBQWMsQ0FBQztBQUNmLDBCQUFrQixZQUFZLGNBQzFCLG1CQUNBO0FBRUosWUFBSSxDQUFDLFVBQVU7QUFDYixxQkFBVyxJQUFJLGNBQWMsYUFBYTtBQUFBLFlBQ3hDLFVBQVU7QUFBQTtBQUFBO0FBSWQsaUJBQVMsa0JBQWtCLENBQUMsTUFBTSxPQUFPLEtBQUssRUFBRTtBQUNoRCxpQkFBUyxTQUFTLENBQU8sTUFBTTtBQUM3QixnQkFBTSxPQUFPLElBQUksS0FBSyxRQUFRO0FBQUEsWUFDNUIsTUFBTTtBQUFBO0FBRVIsZ0JBQU0sYUFBYSxNQUFNLEtBQUs7QUFDOUIsbUJBQVMsWUFBWTtBQUFBO0FBRXZCLGlCQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNYixVQUFVO0FBQ1IsVUFBTSxFQUFFLGNBQWM7QUFDdEIsY0FBVTtBQUFBO0FBQUE7QUFJZCxJQUFPLGdCQUFROzs7QUN2TGYsdUJBQStDO0FBT3hDLElBQU0sbUJBQXlDO0FBQUEsRUFDcEQsa0JBQWtCO0FBQUE7QUFHcEIsc0NBQStDLGtDQUFpQjtBQUFBLEVBRzlELFlBQVksTUFBVSxRQUF3QjtBQUM1QyxVQUFNLE1BQUs7QUFDWCxTQUFLLFNBQVM7QUFBQTtBQUFBLEVBR2hCLFVBQWdCO0FBQ2QsVUFBTSxFQUFFLGdCQUFnQjtBQUN4QixnQkFBWTtBQUNaLGdCQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU07QUFFbkMsUUFBSSx5QkFBUSxhQUNULFFBQVEsZUFDUixRQUFRLHFEQUNSLFFBQVEsVUFBUSxLQUNkLGVBQWUscUJBQ2YsU0FBUyxLQUFLLE9BQU8sU0FBUyxrQkFDOUIsU0FBUyxDQUFPLFVBQVU7QUFDekIsY0FBUSxJQUFJLHlCQUF5QjtBQUNyQyxXQUFLLE9BQU8sU0FBUyxtQkFBbUI7QUFDeEMsWUFBTSxLQUFLLE9BQU87QUFBQTtBQUFBO0FBQUE7OztBRi9CNUIsbUNBQTRDLHdCQUFPO0FBQUEsRUFFM0MsU0FBUztBQUFBO0FBQ2IsWUFBTSxLQUFLO0FBQ1gsV0FBSyxjQUFjLFVBQVUsbUJBQW1CLENBQUMsUUFBb0I7QUFDbkUsWUFBSSxjQUFZLEtBQUssS0FBSyxLQUFLLFVBQVU7QUFBQTtBQUUzQyxXQUFLLGNBQWMsSUFBSSxrQkFBa0IsS0FBSyxLQUFLO0FBRW5ELFdBQUssV0FBVztBQUFBLFFBQ2QsSUFBSTtBQUFBLFFBQ0osTUFBTTtBQUFBLFFBQ04sVUFBVSxNQUFNO0FBQ2QsY0FBSSxjQUFZLEtBQUssS0FBSyxLQUFLLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTXpDLGVBQWU7QUFBQTtBQUNuQixXQUFLLFdBQVcsT0FBTyxPQUFPLElBQUksa0JBQWtCLE1BQU0sS0FBSztBQUFBO0FBQUE7QUFBQSxFQUczRCxlQUFlO0FBQUE7QUFDbkIsWUFBTSxLQUFLLFNBQVMsS0FBSztBQUFBO0FBQUE7QUFBQTs7O0FEMUI3QixJQUFPLGVBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==