diff --git a/src/tracker.ts b/src/tracker.ts index da30f05..e871f9d 100644 --- a/src/tracker.ts +++ b/src/tracker.ts @@ -1,4 +1,4 @@ -import { App, MarkdownSectionInformation } from "obsidian"; +import { moment, App, MarkdownSectionInformation } from "obsidian"; export class Tracker { entries: Entry[]; @@ -11,14 +11,15 @@ export interface Entry { } export function startEntry(tracker: Tracker, name: string): void { - // date constructor returns the current date - let entry: Entry = { name: name, startTime: Date.now(), endTime: null }; + if (!name) + name = `Segment ${tracker.entries.length + 1}`; + let entry: Entry = { name: name, startTime: moment().unix(), endTime: null }; tracker.entries.push(entry); }; export function endEntry(tracker: Tracker): void { let last = tracker.entries.last(); - last.endTime = Date.now(); + last.endTime = moment().unix(); } export function isRunning(tracker: Tracker): boolean { @@ -52,32 +53,64 @@ export function loadTracker(json: string): Tracker { } export function displayTracker(tracker: Tracker, element: HTMLElement): void { + // add timers let timer = element.createDiv({ cls: "simple-time-tracker-timers" }); - let current = timer.createEl("div", { cls: "simple-time-tracker-timer" }); - current.createEl("span", { cls: "simple-time-tracker-timer-time", text: "00:00" }); - current.createEl("span", { text: "CURRENT" }); - let total = timer.createEl("div", { cls: "simple-time-tracker-timer" }); - total.createEl("span", { cls: "simple-time-tracker-timer-time", text: "01:00" }); - total.createEl("span", { text: "TOTAL" }); + let currentDiv = timer.createEl("div", { cls: "simple-time-tracker-timer" }); + let current = currentDiv.createEl("span", { cls: "simple-time-tracker-timer-time", text: "00:00" }); + currentDiv.createEl("span", { text: "CURRENT" }); + let totalDiv = timer.createEl("div", { cls: "simple-time-tracker-timer" }); + let total = totalDiv.createEl("span", { cls: "simple-time-tracker-timer-time", text: "00:00" }); + totalDiv.createEl("span", { text: "TOTAL" }); - let list = element.createEl("ul"); - for (let entry of tracker.entries) - list.createEl("li", { text: displayEntry(entry) }); -}; - -export function displayEntry(entry: Entry): string { - // TODO add an option to display this as an interval rather than a from - to string - let ret = ""; - if (entry.name) - ret += `${entry.name}: `; - - let start = new Date(entry.startTime); - ret += `${start.toLocaleString()} - `; - - if (entry.endTime) { - let end = new Date(entry.endTime); - ret += `${end.toLocaleString()}`; + // add list + let table = element.createEl("table", { cls: "simple-time-tracker-table" }); + for (let entry of tracker.entries) { + let row = table.createEl("tr"); + row.createEl("td", { text: entry.name }); + row.createEl("td", { text: moment.unix(entry.startTime).format("YY-MM-DD hh:mm:ss") }); + if (entry.endTime) { + row.createEl("td", { text: moment.unix(entry.endTime).format("YY-MM-DD hh:mm:ss") }); + let duration = moment.unix(entry.endTime).diff(moment.unix(entry.startTime)); + row.createEl("td", { text: getCountdownDisplay(moment.duration(duration)) }); + } } + setCountdownValues(tracker, current, total, currentDiv); + let intervalId = window.setInterval(() => { + // we delete the interval timer when the element is removed + if (!element.isConnected) { + window.clearInterval(intervalId); + return; + } + setCountdownValues(tracker, current, total, currentDiv); + }, 1000); + +}; + +function getCountdownDisplay(duration: moment.Duration): string { + let ret = ""; + if (duration.hours() > 0) + ret += duration.hours().toString().padStart(2, "0") + ":"; + ret += duration.minutes().toString().padStart(2, "0") + ":" + duration.seconds().toString().padStart(2, "0"); return ret; } + +function setCountdownValues(tracker: Tracker, current: HTMLElement, total: HTMLElement, currentDiv: HTMLDivElement) { + let currEntry = tracker.entries.last(); + if (currEntry) { + let currDuration = moment().diff(moment.unix(currEntry.startTime)); + if (!currEntry.endTime) + current.setText(getCountdownDisplay(moment.duration(currDuration))); + + let totalDuration = 0; + for (let entry of tracker.entries) { + if (entry == currEntry && !currEntry.endTime) { + totalDuration += currDuration; + } else { + totalDuration += moment.unix(entry.endTime).diff(moment.unix(entry.startTime)); + } + } + total.setText(getCountdownDisplay(moment.duration(totalDuration))); + } + currentDiv.toggleClass("simple-time-tracker-grayed", !currEntry || !!currEntry.endTime); +} diff --git a/styles.css b/styles.css index 66c0b36..825a6cb 100644 --- a/styles.css +++ b/styles.css @@ -11,6 +11,10 @@ margin-right: auto; } +.simple-time-tracker-txt { + text-align: center; +} + .simple-time-tracker-btn { margin-top: 10px; margin-bottom: 10px; @@ -34,3 +38,16 @@ font-size: xx-large; font-weight: bolder; } + +.simple-time-tracker-grayed { + opacity: 25%; +} + +.simple-time-tracker-table { + width: 100%; + margin-top: 20px; +} + +.simple-time-tracker-table td { + border: none; +} diff --git a/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js b/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js index afc5d4e..8890a7a 100644 --- a/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js +++ b/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js @@ -50,7 +50,7 @@ var __async = (__this, __arguments, generator) => { __export(exports, { default: () => SimpleTimeTrackerPlugin }); -var import_obsidian2 = __toModule(require("obsidian")); +var import_obsidian3 = __toModule(require("obsidian")); // src/settings.ts var defaultSettings = {}; @@ -72,13 +72,16 @@ var SimpleTimeTrackerSettingsTab = class extends import_obsidian.PluginSettingTa }; // src/tracker.ts +var import_obsidian2 = __toModule(require("obsidian")); function startEntry(tracker, name) { - let entry = { name, startTime: Date.now(), endTime: null }; + if (!name) + name = `Segment ${tracker.entries.length + 1}`; + let entry = { name, startTime: (0, import_obsidian2.moment)().unix(), endTime: null }; tracker.entries.push(entry); } function endEntry(tracker) { let last = tracker.entries.last(); - last.endTime = Date.now(); + last.endTime = (0, import_obsidian2.moment)().unix(); } function isRunning(tracker) { let last = tracker.entries.last(); @@ -109,31 +112,60 @@ function loadTracker(json) { } function displayTracker(tracker, element) { let timer = element.createDiv({ cls: "simple-time-tracker-timers" }); - let current = timer.createEl("div", { cls: "simple-time-tracker-timer" }); - current.createEl("span", { cls: "simple-time-tracker-timer-time", text: "00:00" }); - current.createEl("span", { text: "CURRENT" }); - let total = timer.createEl("div", { cls: "simple-time-tracker-timer" }); - total.createEl("span", { cls: "simple-time-tracker-timer-time", text: "01:00" }); - total.createEl("span", { text: "TOTAL" }); - let list = element.createEl("ul"); - for (let entry of tracker.entries) - list.createEl("li", { text: displayEntry(entry) }); -} -function displayEntry(entry) { - let ret = ""; - if (entry.name) - ret += `${entry.name}: `; - let start = new Date(entry.startTime); - ret += `${start.toLocaleString()} - `; - if (entry.endTime) { - let end = new Date(entry.endTime); - ret += `${end.toLocaleString()}`; + let currentDiv = timer.createEl("div", { cls: "simple-time-tracker-timer" }); + let current = currentDiv.createEl("span", { cls: "simple-time-tracker-timer-time", text: "00:00" }); + currentDiv.createEl("span", { text: "CURRENT" }); + let totalDiv = timer.createEl("div", { cls: "simple-time-tracker-timer" }); + let total = totalDiv.createEl("span", { cls: "simple-time-tracker-timer-time", text: "00:00" }); + totalDiv.createEl("span", { text: "TOTAL" }); + let table = element.createEl("table", { cls: "simple-time-tracker-table" }); + for (let entry of tracker.entries) { + let row = table.createEl("tr"); + row.createEl("td", { text: entry.name }); + row.createEl("td", { text: import_obsidian2.moment.unix(entry.startTime).format("YY-MM-DD hh:mm:ss") }); + if (entry.endTime) { + row.createEl("td", { text: import_obsidian2.moment.unix(entry.endTime).format("YY-MM-DD hh:mm:ss") }); + let duration = import_obsidian2.moment.unix(entry.endTime).diff(import_obsidian2.moment.unix(entry.startTime)); + row.createEl("td", { text: getCountdownDisplay(import_obsidian2.moment.duration(duration)) }); + } } + setCountdownValues(tracker, current, total, currentDiv); + let intervalId = window.setInterval(() => { + if (!element.isConnected) { + window.clearInterval(intervalId); + return; + } + setCountdownValues(tracker, current, total, currentDiv); + }, 1e3); +} +function getCountdownDisplay(duration) { + let ret = ""; + if (duration.hours() > 0) + ret += duration.hours().toString().padStart(2, "0") + ":"; + ret += duration.minutes().toString().padStart(2, "0") + ":" + duration.seconds().toString().padStart(2, "0"); return ret; } +function setCountdownValues(tracker, current, total, currentDiv) { + let currEntry = tracker.entries.last(); + if (currEntry) { + let currDuration = (0, import_obsidian2.moment)().diff(import_obsidian2.moment.unix(currEntry.startTime)); + if (!currEntry.endTime) + current.setText(getCountdownDisplay(import_obsidian2.moment.duration(currDuration))); + let totalDuration = 0; + for (let entry of tracker.entries) { + if (entry == currEntry && !currEntry.endTime) { + totalDuration += currDuration; + } else { + totalDuration += import_obsidian2.moment.unix(entry.endTime).diff(import_obsidian2.moment.unix(entry.startTime)); + } + } + total.setText(getCountdownDisplay(import_obsidian2.moment.duration(totalDuration))); + } + currentDiv.toggleClass("simple-time-tracker-grayed", !currEntry || !!currEntry.endTime); +} // src/main.ts -var SimpleTimeTrackerPlugin = class extends import_obsidian2.Plugin { +var SimpleTimeTrackerPlugin = class extends import_obsidian3.Plugin { onload() { return __async(this, null, function* () { yield this.loadSettings(); @@ -142,7 +174,7 @@ var SimpleTimeTrackerPlugin = class extends import_obsidian2.Plugin { e.empty(); let tracker = loadTracker(s); let running = isRunning(tracker); - let btn = new import_obsidian2.ButtonComponent(e).setButtonText(running ? "End" : "Start").onClick(() => __async(this, null, function* () { + let btn = new import_obsidian3.ButtonComponent(e).setButtonText(running ? "End" : "Start").onClick(() => __async(this, null, function* () { if (running) { endEntry(tracker); } else { @@ -151,7 +183,7 @@ var SimpleTimeTrackerPlugin = class extends import_obsidian2.Plugin { yield saveTracker(tracker, this.app, i.getSectionInfo(e)); })); btn.buttonEl.addClass("simple-time-tracker-btn"); - let name = new import_obsidian2.TextComponent(e).setPlaceholder("Segment Name").setDisabled(running); + let name = new import_obsidian3.TextComponent(e).setPlaceholder("Segment Name").setDisabled(running); name.inputEl.addClass("simple-time-tracker-txt"); displayTracker(tracker, e); }); @@ -168,4 +200,4 @@ var SimpleTimeTrackerPlugin = class extends import_obsidian2.Plugin { }); } }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy9zZXR0aW5ncy10YWIudHMiLCAic3JjL3RyYWNrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCwgUGx1Z2luLCBUZXh0Q29tcG9uZW50IH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRlZmF1bHRTZXR0aW5ncywgU2ltcGxlVGltZVRyYWNrZXJTZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XHJcbmltcG9ydCB7IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3NUYWIgfSBmcm9tIFwiLi9zZXR0aW5ncy10YWJcIjtcclxuaW1wb3J0IHsgZGlzcGxheVRyYWNrZXIsIGVuZEVudHJ5LCBpc1J1bm5pbmcsIGxvYWRUcmFja2VyLCBzYXZlVHJhY2tlciwgc3RhcnRFbnRyeSwgVHJhY2tlciB9IGZyb20gXCIuL3RyYWNrZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHJcblx0c2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3M7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFwic2ltcGxlLXRpbWUtdHJhY2tlclwiLCAocywgZSwgaSkgPT4ge1xyXG5cdFx0XHRlLmVtcHR5KCk7XHJcblxyXG5cdFx0XHRsZXQgdHJhY2tlciA9IGxvYWRUcmFja2VyKHMpO1xyXG5cdFx0XHRsZXQgcnVubmluZyA9IGlzUnVubmluZyh0cmFja2VyKTtcclxuXHJcblx0XHRcdGxldCBidG4gPSBuZXcgQnV0dG9uQ29tcG9uZW50KGUpXHJcblx0XHRcdFx0LnNldEJ1dHRvblRleHQocnVubmluZyA/IFwiRW5kXCIgOiBcIlN0YXJ0XCIpXHJcblx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHJ1bm5pbmcpIHtcclxuXHRcdFx0XHRcdFx0ZW5kRW50cnkodHJhY2tlcik7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRzdGFydEVudHJ5KHRyYWNrZXIsIG5hbWUuZ2V0VmFsdWUoKSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRhd2FpdCBzYXZlVHJhY2tlcih0cmFja2VyLCB0aGlzLmFwcCwgaS5nZXRTZWN0aW9uSW5mbyhlKSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdGJ0bi5idXR0b25FbC5hZGRDbGFzcyhcInNpbXBsZS10aW1lLXRyYWNrZXItYnRuXCIpO1xyXG5cclxuXHRcdFx0bGV0IG5hbWUgPSBuZXcgVGV4dENvbXBvbmVudChlKVxyXG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIlNlZ21lbnQgTmFtZVwiKVxyXG5cdFx0XHRcdC5zZXREaXNhYmxlZChydW5uaW5nKTtcclxuXHRcdFx0bmFtZS5pbnB1dEVsLmFkZENsYXNzKFwic2ltcGxlLXRpbWUtdHJhY2tlci10eHRcIik7XHJcblxyXG5cdFx0XHRkaXNwbGF5VHJhY2tlcih0cmFja2VyLCBlKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG59XHJcbiIsICJleHBvcnQgY29uc3QgZGVmYXVsdFNldHRpbmdzOiBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzID0ge1xyXG5cclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxlVGltZVRyYWNrZXJTZXR0aW5ncyB7XHJcblxyXG59XHJcbiIsICJpbXBvcnQgeyBBcHAsIFBsdWdpblNldHRpbmdUYWIgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luIGZyb20gXCIuL21haW5cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblxyXG4gICAgcGx1Z2luOiBTaW1wbGVUaW1lVHJhY2tlclBsdWdpbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBTaW1wbGVUaW1lVHJhY2tlclBsdWdpbikge1xyXG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIH1cclxuXHJcbiAgICBkaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDJcIiwgeyB0ZXh0OiBcIlNpbXBsZSBUaW1lIFRyYWNrZXIgU2V0dGluZ3NcIiB9KTtcclxuXHJcbiAgICAgICAgLy8gVE9ETyBzZXR0aW5ncyBnbyBoZXJlXHJcblxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoclwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IFwiSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4gYW5kIHdhbnQgdG8gc3VwcG9ydCBpdHMgZGV2ZWxvcG1lbnQsIHlvdSBjYW4gZG8gc28gdGhyb3VnaCBteSB3ZWJzaXRlIGJ5IGNsaWNraW5nIHRoaXMgZmFuY3kgaW1hZ2UhXCIgfSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImFcIiwgeyBocmVmOiBcImh0dHBzOi8vZWxscGVjay5kZS9zdXBwb3J0XCIgfSlcclxuICAgICAgICAgICAgLmNyZWF0ZUVsKFwiaW1nXCIsIHsgYXR0cjogeyBzcmM6IFwiaHR0cHM6Ly9lbGxwZWNrLmRlL3Jlcy9nZW5lcmFsc3VwcG9ydC5wbmdcIiB9LCBjbHM6IFwic2ltcGxlLXRpbWUtdHJhY2tlci1zdXBwb3J0XCIgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwgImltcG9ydCB7IEFwcCwgTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24gfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUcmFja2VyIHtcclxuICAgIGVudHJpZXM6IEVudHJ5W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50cnkge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgc3RhcnRUaW1lOiBudW1iZXI7XHJcbiAgICBlbmRUaW1lOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdGFydEVudHJ5KHRyYWNrZXI6IFRyYWNrZXIsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gZGF0ZSBjb25zdHJ1Y3RvciByZXR1cm5zIHRoZSBjdXJyZW50IGRhdGVcclxuICAgIGxldCBlbnRyeTogRW50cnkgPSB7IG5hbWU6IG5hbWUsIHN0YXJ0VGltZTogRGF0ZS5ub3coKSwgZW5kVGltZTogbnVsbCB9O1xyXG4gICAgdHJhY2tlci5lbnRyaWVzLnB1c2goZW50cnkpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVuZEVudHJ5KHRyYWNrZXI6IFRyYWNrZXIpOiB2b2lkIHtcclxuICAgIGxldCBsYXN0ID0gdHJhY2tlci5lbnRyaWVzLmxhc3QoKTtcclxuICAgIGxhc3QuZW5kVGltZSA9IERhdGUubm93KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1J1bm5pbmcodHJhY2tlcjogVHJhY2tlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGxhc3QgPSB0cmFja2VyLmVudHJpZXMubGFzdCgpO1xyXG4gICAgcmV0dXJuIGxhc3QgIT0gbnVsbCAmJiAhbGFzdC5lbmRUaW1lO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVRyYWNrZXIodHJhY2tlcjogVHJhY2tlciwgYXBwOiBBcHAsIHNlY3Rpb246IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZmlsZSA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG4gICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChmaWxlKTtcclxuXHJcbiAgICAvLyBmaWd1cmUgb3V0IHdoYXQgcGFydCBvZiB0aGUgY29udGVudCB3ZSBoYXZlIHRvIGVkaXRcclxuICAgIGxldCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcbiAgICBsZXQgcHJldiA9IGxpbmVzLmZpbHRlcigoXywgaSkgPT4gaSA8PSBzZWN0aW9uLmxpbmVTdGFydCkuam9pbihcIlxcblwiKTtcclxuICAgIGxldCBuZXh0ID0gbGluZXMuZmlsdGVyKChfLCBpKSA9PiBpID49IHNlY3Rpb24ubGluZUVuZCkuam9pbihcIlxcblwiKTtcclxuICAgIC8vIGVkaXQgb25seSB0aGUgY29kZSBibG9jayBjb250ZW50LCBsZWF2ZSB0aGUgcmVzdCB1bnRvdWNoZWRcclxuICAgIGNvbnRlbnQgPSBgJHtwcmV2fVxcbiR7SlNPTi5zdHJpbmdpZnkodHJhY2tlcil9XFxuJHtuZXh0fWA7XHJcblxyXG4gICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRUcmFja2VyKGpzb246IHN0cmluZyk6IFRyYWNrZXIge1xyXG4gICAgaWYgKGpzb24pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGYWlsZWQgdG8gcGFyc2UgVHJhY2tlciBmcm9tICR7anNvbn1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBlbnRyaWVzOiBbXSB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheVRyYWNrZXIodHJhY2tlcjogVHJhY2tlciwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGxldCB0aW1lciA9IGVsZW1lbnQuY3JlYXRlRGl2KHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXJzXCIgfSk7XHJcbiAgICBsZXQgY3VycmVudCA9IHRpbWVyLmNyZWF0ZUVsKFwiZGl2XCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXJcIiB9KTtcclxuICAgIGN1cnJlbnQuY3JlYXRlRWwoXCJzcGFuXCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXItdGltZVwiLCB0ZXh0OiBcIjAwOjAwXCIgfSk7XHJcbiAgICBjdXJyZW50LmNyZWF0ZUVsKFwic3BhblwiLCB7IHRleHQ6IFwiQ1VSUkVOVFwiIH0pO1xyXG4gICAgbGV0IHRvdGFsID0gdGltZXIuY3JlYXRlRWwoXCJkaXZcIiwgeyBjbHM6IFwic2ltcGxlLXRpbWUtdHJhY2tlci10aW1lclwiIH0pO1xyXG4gICAgdG90YWwuY3JlYXRlRWwoXCJzcGFuXCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXItdGltZVwiLCB0ZXh0OiBcIjAxOjAwXCIgfSk7XHJcbiAgICB0b3RhbC5jcmVhdGVFbChcInNwYW5cIiwgeyB0ZXh0OiBcIlRPVEFMXCIgfSk7XHJcblxyXG4gICAgbGV0IGxpc3QgPSBlbGVtZW50LmNyZWF0ZUVsKFwidWxcIik7XHJcbiAgICBmb3IgKGxldCBlbnRyeSBvZiB0cmFja2VyLmVudHJpZXMpXHJcbiAgICAgICAgbGlzdC5jcmVhdGVFbChcImxpXCIsIHsgdGV4dDogZGlzcGxheUVudHJ5KGVudHJ5KSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5RW50cnkoZW50cnk6IEVudHJ5KTogc3RyaW5nIHtcclxuICAgIC8vIFRPRE8gYWRkIGFuIG9wdGlvbiB0byBkaXNwbGF5IHRoaXMgYXMgYW4gaW50ZXJ2YWwgcmF0aGVyIHRoYW4gYSBmcm9tIC0gdG8gc3RyaW5nXHJcbiAgICBsZXQgcmV0ID0gXCJcIjtcclxuICAgIGlmIChlbnRyeS5uYW1lKVxyXG4gICAgICAgIHJldCArPSBgJHtlbnRyeS5uYW1lfTogYDtcclxuXHJcbiAgICBsZXQgc3RhcnQgPSBuZXcgRGF0ZShlbnRyeS5zdGFydFRpbWUpO1xyXG4gICAgcmV0ICs9IGAke3N0YXJ0LnRvTG9jYWxlU3RyaW5nKCl9IC0gYDtcclxuXHJcbiAgICBpZiAoZW50cnkuZW5kVGltZSkge1xyXG4gICAgICAgIGxldCBlbmQgPSBuZXcgRGF0ZShlbnRyeS5lbmRUaW1lKTtcclxuICAgICAgICByZXQgKz0gYCR7ZW5kLnRvTG9jYWxlU3RyaW5nKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmV0O1xyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFBdUQ7OztBQ0FoRCxJQUFNLGtCQUE2Qzs7O0FDQTFELHNCQUFzQztBQUcvQixpREFBMkMsaUNBQWlCO0FBQUEsRUFJL0QsWUFBWSxLQUFVLFFBQWlDO0FBQ25ELFVBQU0sS0FBSztBQUNYLFNBQUssU0FBUztBQUFBO0FBQUEsRUFHbEIsVUFBZ0I7QUFDWixTQUFLLFlBQVk7QUFDakIsU0FBSyxZQUFZ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 +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy9zZXR0aW5ncy10YWIudHMiLCAic3JjL3RyYWNrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCwgUGx1Z2luLCBUZXh0Q29tcG9uZW50IH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRlZmF1bHRTZXR0aW5ncywgU2ltcGxlVGltZVRyYWNrZXJTZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XHJcbmltcG9ydCB7IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3NUYWIgfSBmcm9tIFwiLi9zZXR0aW5ncy10YWJcIjtcclxuaW1wb3J0IHsgZGlzcGxheVRyYWNrZXIsIGVuZEVudHJ5LCBpc1J1bm5pbmcsIGxvYWRUcmFja2VyLCBzYXZlVHJhY2tlciwgc3RhcnRFbnRyeSwgVHJhY2tlciB9IGZyb20gXCIuL3RyYWNrZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHJcblx0c2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3M7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFwic2ltcGxlLXRpbWUtdHJhY2tlclwiLCAocywgZSwgaSkgPT4ge1xyXG5cdFx0XHRlLmVtcHR5KCk7XHJcblxyXG5cdFx0XHRsZXQgdHJhY2tlciA9IGxvYWRUcmFja2VyKHMpO1xyXG5cdFx0XHRsZXQgcnVubmluZyA9IGlzUnVubmluZyh0cmFja2VyKTtcclxuXHJcblx0XHRcdGxldCBidG4gPSBuZXcgQnV0dG9uQ29tcG9uZW50KGUpXHJcblx0XHRcdFx0LnNldEJ1dHRvblRleHQocnVubmluZyA/IFwiRW5kXCIgOiBcIlN0YXJ0XCIpXHJcblx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHJ1bm5pbmcpIHtcclxuXHRcdFx0XHRcdFx0ZW5kRW50cnkodHJhY2tlcik7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRzdGFydEVudHJ5KHRyYWNrZXIsIG5hbWUuZ2V0VmFsdWUoKSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRhd2FpdCBzYXZlVHJhY2tlcih0cmFja2VyLCB0aGlzLmFwcCwgaS5nZXRTZWN0aW9uSW5mbyhlKSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdGJ0bi5idXR0b25FbC5hZGRDbGFzcyhcInNpbXBsZS10aW1lLXRyYWNrZXItYnRuXCIpO1xyXG5cclxuXHRcdFx0bGV0IG5hbWUgPSBuZXcgVGV4dENvbXBvbmVudChlKVxyXG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIlNlZ21lbnQgTmFtZVwiKVxyXG5cdFx0XHRcdC5zZXREaXNhYmxlZChydW5uaW5nKTtcclxuXHRcdFx0bmFtZS5pbnB1dEVsLmFkZENsYXNzKFwic2ltcGxlLXRpbWUtdHJhY2tlci10eHRcIik7XHJcblxyXG5cdFx0XHRkaXNwbGF5VHJhY2tlcih0cmFja2VyLCBlKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG59XHJcbiIsICJleHBvcnQgY29uc3QgZGVmYXVsdFNldHRpbmdzOiBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzID0ge1xyXG5cclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxlVGltZVRyYWNrZXJTZXR0aW5ncyB7XHJcblxyXG59XHJcbiIsICJpbXBvcnQgeyBBcHAsIFBsdWdpblNldHRpbmdUYWIgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luIGZyb20gXCIuL21haW5cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblxyXG4gICAgcGx1Z2luOiBTaW1wbGVUaW1lVHJhY2tlclBsdWdpbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBTaW1wbGVUaW1lVHJhY2tlclBsdWdpbikge1xyXG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIH1cclxuXHJcbiAgICBkaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDJcIiwgeyB0ZXh0OiBcIlNpbXBsZSBUaW1lIFRyYWNrZXIgU2V0dGluZ3NcIiB9KTtcclxuXHJcbiAgICAgICAgLy8gVE9ETyBzZXR0aW5ncyBnbyBoZXJlXHJcblxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoclwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IFwiSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4gYW5kIHdhbnQgdG8gc3VwcG9ydCBpdHMgZGV2ZWxvcG1lbnQsIHlvdSBjYW4gZG8gc28gdGhyb3VnaCBteSB3ZWJzaXRlIGJ5IGNsaWNraW5nIHRoaXMgZmFuY3kgaW1hZ2UhXCIgfSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImFcIiwgeyBocmVmOiBcImh0dHBzOi8vZWxscGVjay5kZS9zdXBwb3J0XCIgfSlcclxuICAgICAgICAgICAgLmNyZWF0ZUVsKFwiaW1nXCIsIHsgYXR0cjogeyBzcmM6IFwiaHR0cHM6Ly9lbGxwZWNrLmRlL3Jlcy9nZW5lcmFsc3VwcG9ydC5wbmdcIiB9LCBjbHM6IFwic2ltcGxlLXRpbWUtdHJhY2tlci1zdXBwb3J0XCIgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwgImltcG9ydCB7IG1vbWVudCwgQXBwLCBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRyYWNrZXIge1xyXG4gICAgZW50cmllczogRW50cnlbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFbnRyeSB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBzdGFydFRpbWU6IG51bWJlcjtcclxuICAgIGVuZFRpbWU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0RW50cnkodHJhY2tlcjogVHJhY2tlciwgbmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIW5hbWUpXHJcbiAgICAgICAgbmFtZSA9IGBTZWdtZW50ICR7dHJhY2tlci5lbnRyaWVzLmxlbmd0aCArIDF9YDtcclxuICAgIGxldCBlbnRyeTogRW50cnkgPSB7IG5hbWU6IG5hbWUsIHN0YXJ0VGltZTogbW9tZW50KCkudW5peCgpLCBlbmRUaW1lOiBudWxsIH07XHJcbiAgICB0cmFja2VyLmVudHJpZXMucHVzaChlbnRyeSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZW5kRW50cnkodHJhY2tlcjogVHJhY2tlcik6IHZvaWQge1xyXG4gICAgbGV0IGxhc3QgPSB0cmFja2VyLmVudHJpZXMubGFzdCgpO1xyXG4gICAgbGFzdC5lbmRUaW1lID0gbW9tZW50KCkudW5peCgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNSdW5uaW5nKHRyYWNrZXI6IFRyYWNrZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBsYXN0ID0gdHJhY2tlci5lbnRyaWVzLmxhc3QoKTtcclxuICAgIHJldHVybiBsYXN0ICE9IG51bGwgJiYgIWxhc3QuZW5kVGltZTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVUcmFja2VyKHRyYWNrZXI6IFRyYWNrZXIsIGFwcDogQXBwLCBzZWN0aW9uOiBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZpbGUgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcclxuICAgIGxldCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XHJcblxyXG4gICAgLy8gZmlndXJlIG91dCB3aGF0IHBhcnQgb2YgdGhlIGNvbnRlbnQgd2UgaGF2ZSB0byBlZGl0XHJcbiAgICBsZXQgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xyXG4gICAgbGV0IHByZXYgPSBsaW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgPD0gc2VjdGlvbi5saW5lU3RhcnQpLmpvaW4oXCJcXG5cIik7XHJcbiAgICBsZXQgbmV4dCA9IGxpbmVzLmZpbHRlcigoXywgaSkgPT4gaSA+PSBzZWN0aW9uLmxpbmVFbmQpLmpvaW4oXCJcXG5cIik7XHJcbiAgICAvLyBlZGl0IG9ubHkgdGhlIGNvZGUgYmxvY2sgY29udGVudCwgbGVhdmUgdGhlIHJlc3QgdW50b3VjaGVkXHJcbiAgICBjb250ZW50ID0gYCR7cHJldn1cXG4ke0pTT04uc3RyaW5naWZ5KHRyYWNrZXIpfVxcbiR7bmV4dH1gO1xyXG5cclxuICAgIGF3YWl0IGFwcC52YXVsdC5tb2RpZnkoZmlsZSwgY29udGVudCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkVHJhY2tlcihqc29uOiBzdHJpbmcpOiBUcmFja2VyIHtcclxuICAgIGlmIChqc29uKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbik7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIHBhcnNlIFRyYWNrZXIgZnJvbSAke2pzb259YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgZW50cmllczogW10gfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlUcmFja2VyKHRyYWNrZXI6IFRyYWNrZXIsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAvLyBhZGQgdGltZXJzXHJcbiAgICBsZXQgdGltZXIgPSBlbGVtZW50LmNyZWF0ZURpdih7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRpbWVyc1wiIH0pO1xyXG4gICAgbGV0IGN1cnJlbnREaXYgPSB0aW1lci5jcmVhdGVFbChcImRpdlwiLCB7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRpbWVyXCIgfSk7XHJcbiAgICBsZXQgY3VycmVudCA9IGN1cnJlbnREaXYuY3JlYXRlRWwoXCJzcGFuXCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXItdGltZVwiLCB0ZXh0OiBcIjAwOjAwXCIgfSk7XHJcbiAgICBjdXJyZW50RGl2LmNyZWF0ZUVsKFwic3BhblwiLCB7IHRleHQ6IFwiQ1VSUkVOVFwiIH0pO1xyXG4gICAgbGV0IHRvdGFsRGl2ID0gdGltZXIuY3JlYXRlRWwoXCJkaXZcIiwgeyBjbHM6IFwic2ltcGxlLXRpbWUtdHJhY2tlci10aW1lclwiIH0pO1xyXG4gICAgbGV0IHRvdGFsID0gdG90YWxEaXYuY3JlYXRlRWwoXCJzcGFuXCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXItdGltZVwiLCB0ZXh0OiBcIjAwOjAwXCIgfSk7XHJcbiAgICB0b3RhbERpdi5jcmVhdGVFbChcInNwYW5cIiwgeyB0ZXh0OiBcIlRPVEFMXCIgfSk7XHJcblxyXG4gICAgLy8gYWRkIGxpc3RcclxuICAgIGxldCB0YWJsZSA9IGVsZW1lbnQuY3JlYXRlRWwoXCJ0YWJsZVwiLCB7IGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXRhYmxlXCIgfSk7XHJcbiAgICBmb3IgKGxldCBlbnRyeSBvZiB0cmFja2VyLmVudHJpZXMpIHtcclxuICAgICAgICBsZXQgcm93ID0gdGFibGUuY3JlYXRlRWwoXCJ0clwiKTtcclxuICAgICAgICByb3cuY3JlYXRlRWwoXCJ0ZFwiLCB7IHRleHQ6IGVudHJ5Lm5hbWUgfSk7XHJcbiAgICAgICAgcm93LmNyZWF0ZUVsKFwidGRcIiwgeyB0ZXh0OiBtb21lbnQudW5peChlbnRyeS5zdGFydFRpbWUpLmZvcm1hdChcIllZLU1NLUREIGhoOm1tOnNzXCIpIH0pO1xyXG4gICAgICAgIGlmIChlbnRyeS5lbmRUaW1lKSB7XHJcbiAgICAgICAgICAgIHJvdy5jcmVhdGVFbChcInRkXCIsIHsgdGV4dDogbW9tZW50LnVuaXgoZW50cnkuZW5kVGltZSkuZm9ybWF0KFwiWVktTU0tREQgaGg6bW06c3NcIikgfSk7XHJcbiAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IG1vbWVudC51bml4KGVudHJ5LmVuZFRpbWUpLmRpZmYobW9tZW50LnVuaXgoZW50cnkuc3RhcnRUaW1lKSk7XHJcbiAgICAgICAgICAgIHJvdy5jcmVhdGVFbChcInRkXCIsIHsgdGV4dDogZ2V0Q291bnRkb3duRGlzcGxheShtb21lbnQuZHVyYXRpb24oZHVyYXRpb24pKSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q291bnRkb3duVmFsdWVzKHRyYWNrZXIsIGN1cnJlbnQsIHRvdGFsLCBjdXJyZW50RGl2KTtcclxuICAgIGxldCBpbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAvLyB3ZSBkZWxldGUgdGhlIGludGVydmFsIHRpbWVyIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZFxyXG4gICAgICAgIGlmICghZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRDb3VudGRvd25WYWx1ZXModHJhY2tlciwgY3VycmVudCwgdG90YWwsIGN1cnJlbnREaXYpO1xyXG4gICAgfSwgMTAwMCk7XHJcblxyXG59O1xyXG5cclxuZnVuY3Rpb24gZ2V0Q291bnRkb3duRGlzcGxheShkdXJhdGlvbjogbW9tZW50LkR1cmF0aW9uKTogc3RyaW5nIHtcclxuICAgIGxldCByZXQgPSBcIlwiO1xyXG4gICAgaWYgKGR1cmF0aW9uLmhvdXJzKCkgPiAwKVxyXG4gICAgICAgIHJldCArPSBkdXJhdGlvbi5ob3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpICsgXCI6XCI7XHJcbiAgICByZXQgKz0gZHVyYXRpb24ubWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpICsgXCI6XCIgKyBkdXJhdGlvbi5zZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIik7XHJcbiAgICByZXR1cm4gcmV0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRDb3VudGRvd25WYWx1ZXModHJhY2tlcjogVHJhY2tlciwgY3VycmVudDogSFRNTEVsZW1lbnQsIHRvdGFsOiBIVE1MRWxlbWVudCwgY3VycmVudERpdjogSFRNTERpdkVsZW1lbnQpIHtcclxuICAgIGxldCBjdXJyRW50cnkgPSB0cmFja2VyLmVudHJpZXMubGFzdCgpO1xyXG4gICAgaWYgKGN1cnJFbnRyeSkge1xyXG4gICAgICAgIGxldCBjdXJyRHVyYXRpb24gPSBtb21lbnQoKS5kaWZmKG1vbWVudC51bml4KGN1cnJFbnRyeS5zdGFydFRpbWUpKTtcclxuICAgICAgICBpZiAoIWN1cnJFbnRyeS5lbmRUaW1lKVxyXG4gICAgICAgICAgICBjdXJyZW50LnNldFRleHQoZ2V0Q291bnRkb3duRGlzcGxheShtb21lbnQuZHVyYXRpb24oY3VyckR1cmF0aW9uKSkpO1xyXG5cclxuICAgICAgICBsZXQgdG90YWxEdXJhdGlvbiA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgdHJhY2tlci5lbnRyaWVzKSB7XHJcbiAgICAgICAgICAgIGlmIChlbnRyeSA9PSBjdXJyRW50cnkgJiYgIWN1cnJFbnRyeS5lbmRUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9IGN1cnJEdXJhdGlvbjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsRHVyYXRpb24gKz0gbW9tZW50LnVuaXgoZW50cnkuZW5kVGltZSkuZGlmZihtb21lbnQudW5peChlbnRyeS5zdGFydFRpbWUpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0b3RhbC5zZXRUZXh0KGdldENvdW50ZG93bkRpc3BsYXkobW9tZW50LmR1cmF0aW9uKHRvdGFsRHVyYXRpb24pKSk7XHJcbiAgICB9XHJcbiAgICBjdXJyZW50RGl2LnRvZ2dsZUNsYXNzKFwic2ltcGxlLXRpbWUtdHJhY2tlci1ncmF5ZWRcIiwgIWN1cnJFbnRyeSB8fCAhIWN1cnJFbnRyeS5lbmRUaW1lKTtcclxufVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBQXVEOzs7QUNBaEQsSUFBTSxrQkFBNkM7OztBQ0ExRCxzQkFBc0M7QUFHL0IsaURBQTJDLGlDQUFpQjtBQUFBLEVBSS9ELFlBQVksS0FBVSxRQUFpQztBQUNuRCxVQUFNLEtBQUs7QUFDWCxTQUFL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 diff --git a/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/styles.css b/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/styles.css index 66c0b36..825a6cb 100644 --- a/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/styles.css +++ b/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/styles.css @@ -11,6 +11,10 @@ margin-right: auto; } +.simple-time-tracker-txt { + text-align: center; +} + .simple-time-tracker-btn { margin-top: 10px; margin-bottom: 10px; @@ -34,3 +38,16 @@ font-size: xx-large; font-weight: bolder; } + +.simple-time-tracker-grayed { + opacity: 25%; +} + +.simple-time-tracker-table { + width: 100%; + margin-top: 20px; +} + +.simple-time-tracker-table td { + border: none; +} diff --git a/test-vault/track-note-test.md b/test-vault/track-note-test.md index e70fc66..cc05429 100644 --- a/test-vault/track-note-test.md +++ b/test-vault/track-note-test.md @@ -1,7 +1,7 @@ This is a time tracker: ```simple-time-tracker -{"entries":[{"name":"Test segment my dudes!","startTime":1664298280695,"endTime":1664298283168},{"name":"","startTime":1664298304811,"endTime":1664298305748},{"name":"","startTime":1664298308288,"endTime":1664298322668},{"name":"","startTime":1664298323435,"endTime":1664298324617},{"name":"","startTime":1664298325410,"endTime":1664298326481},{"name":"","startTime":1664298328460,"endTime":1664298788945},{"name":"","startTime":1664298940959,"endTime":1664298943024},{"name":"","startTime":1664299161618,"endTime":1664299162696},{"name":"","startTime":1664299510766,"endTime":1664299511737}]} +{"entries":[{"name":"Segment 1","startTime":1664306406,"endTime":1664306408},{"name":"Segment 2","startTime":1664306409,"endTime":1664306410},{"name":"Segment 3","startTime":1664306411,"endTime":1664306412},{"name":"Segment 4","startTime":1664306413,"endTime":1664306422},{"name":"Segment 5","startTime":1664306455,"endTime":1664306458},{"name":"Segment 6","startTime":1664306543,"endTime":1664306545},{"name":"Segment 7","startTime":1664306581,"endTime":1664306599}]} ```