From 148eee822d0a7dc909011360c7ec87ea7624f6b9 Mon Sep 17 00:00:00 2001 From: Rebbecca Bishop Date: Tue, 8 Aug 2023 11:45:46 -0500 Subject: [PATCH] Patch: Adjust Gemmy State Management in preparation for Animation Changes (#6) Co-authored-by: mProjectsCode --- main.js | 105 ++++++++++++++++++++++------------------- src/Gemmy.ts | 125 +++++++++++++++++++++++++++++-------------------- src/Setting.ts | 2 +- 3 files changed, 134 insertions(+), 98 deletions(-) diff --git a/main.js b/main.js index 9fe67f9..4f18253 100644 --- a/main.js +++ b/main.js @@ -48,7 +48,7 @@ var GemmySettingTab = class extends import_obsidian.PluginSettingTab { (dropdown) => dropdown.addOption("original" /* ORIGINAL */, "Original").addOption("draconic" /* DRACTONIC */, "Draconic").setValue(this.plugin.settings.animationSource).onChange(async (value) => { const animationSource = value; this.plugin.settings.animationSource = animationSource; - this.plugin.gemmy.appear(); + this.plugin.gemmy.reset(); await this.plugin.saveSettings(); }) ); @@ -207,11 +207,10 @@ var WRITING_MODE_QUOTES = [ var BUBBLE_DURATION = 5e3; var Gemmy = class { constructor(plugin) { - this.appeared = false; - this.isDisappearing = false; this.inWritingMode = false; this.plugin = plugin; this.animations = new Animations(this.plugin); + this.state = "INVISIBLE" /* INVISIBLE */; this.createGemmyEl(); this.startNextIdleTimeout(); } @@ -235,49 +234,64 @@ var Gemmy = class { this.animations.play(this.imageEl, "idle_motion" /* IDLE_MOTION */); this.startNextIdleTimeout(); }); - } - appear() { - console.log("gemmy appear"); - window.clearTimeout(this.disappearTimeout); - this.isDisappearing = false; - this.animations.play(this.imageEl, "emerge" /* EMERGE */); - if (this.inWritingMode) { - this.animations.play(this.imageEl, "pop_motion" /* POP_MOTION */); - window.setTimeout(() => { - this.appeared = true; - this.saySomething(WRITING_MODE_QUOTES, true); - }, 1800); - } else { - this.animations.play(this.imageEl, "emerge" /* EMERGE */); - window.setTimeout(() => { - this.animations.play(this.imageEl, "idle_motion" /* IDLE_MOTION */); - this.appeared = true; - }, 3800); - } + this.gemmyEl.hidden = true; document.body.appendChild(this.gemmyEl); - this.gemmyEl.hidden = false; - this.appeared = true; } - disappear() { - if (this.isDisappearing) { + async appear() { + if (this.state === "APPEARING" /* APPEARING */ || this.state === "VISIBLE" /* VISIBLE */) { return; } - this.isDisappearing = true; - this.idleTimeout && window.clearTimeout(this.idleTimeout); - this.writingModeTimeout && window.clearTimeout(this.writingModeTimeout); + this.state = "APPEARING" /* APPEARING */; + this.gemmyEl.hidden = false; + if (this.inWritingMode) { + this.animations.play(this.imageEl, "pop_motion" /* POP_MOTION */); + await sleep(1800); + if (this.state !== "APPEARING" /* APPEARING */) { + return; + } + this.state = "VISIBLE" /* VISIBLE */; + this.saySomething(WRITING_MODE_QUOTES, true); + } else { + this.animations.play(this.imageEl, "emerge" /* EMERGE */); + await sleep(3800); + if (this.state !== "APPEARING" /* APPEARING */) { + return; + } + this.state = "VISIBLE" /* VISIBLE */; + this.animations.play(this.imageEl, "idle_motion" /* IDLE_MOTION */); + } + } + async disappear() { + if (this.state === "DISAPPEARING" /* DISAPPEARING */ || this.state === "INVISIBLE" /* INVISIBLE */) { + return; + } + this.state = "DISAPPEARING" /* DISAPPEARING */; + if (this.idleTimeout) + window.clearTimeout(this.idleTimeout); + if (this.writingModeTimeout) + window.clearTimeout(this.writingModeTimeout); this.animations.play(this.imageEl, "disappear_motion" /* DISAPPEAR_MOTION */); this.gemmyEl.dispatchEvent(new MouseEvent("mouseout", { bubbles: true, clientX: 10, clientY: 10 })); - this.disappearTimeout = window.setTimeout(() => { - this.gemmyEl.hidden = true; - this.appeared = false; - this.isDisappearing = false; - }, 1300); + await sleep(1300); + if (this.state !== "DISAPPEARING" /* DISAPPEARING */) { + return; + } + this.state = "INVISIBLE" /* INVISIBLE */; + this.gemmyEl.hidden = true; + } + async reset() { + if (this.state === "DISAPPEARING" /* DISAPPEARING */ || this.state === "INVISIBLE" /* INVISIBLE */) { + await this.appear(); + } + this.animations.play(this.imageEl, "idle_motion" /* IDLE_MOTION */); } onEditorChange() { if (!this.inWritingMode) { return; } - this.disappear(); + if (this.state !== "DISAPPEARING" /* DISAPPEARING */ && this.state !== "INVISIBLE" /* INVISIBLE */) { + this.disappear(); + } this.setWritingModeTimeout(); } enterWritingMode() { @@ -287,7 +301,7 @@ var Gemmy = class { } leaveWritingMode() { this.inWritingMode = false; - this.appear(); + this.reset(); window.clearTimeout(this.writingModeTimeout); } setWritingModeTimeout() { @@ -314,28 +328,25 @@ var Gemmy = class { this.startNextIdleTimeout(); }, randomizedTimeout); } - saySomething(quotes, persistent) { - if (!this.appeared) { + async saySomething(quotes, persistent) { + if (this.state !== "VISIBLE" /* VISIBLE */) { return; } - console.log(this.inWritingMode); const randomThing = quotes[Math.floor(Math.random() * quotes.length)]; this.gemmyEl.setAttr("aria-label", randomThing); this.gemmyEl.setAttr("aria-label-position", "top"); this.gemmyEl.dispatchEvent(new MouseEvent("mouseover", { bubbles: true, clientX: 10, clientY: 10 })); if (this.inWritingMode) { this.animations.play(this.imageEl, "angry_motion" /* ANGRY_MOTION */); - window.setTimeout(() => { - this.animations.play(this.imageEl, "disappoint_ing" /* DISAPPOINT_IMG */); - }, 1e3); + await sleep(1e3); + this.animations.play(this.imageEl, "disappoint_ing" /* DISAPPOINT_IMG */); } else { this.animations.play(this.imageEl, "look_motion" /* LOOK_MOTION */); } if (!persistent) { - window.setTimeout(() => { - this.gemmyEl.dispatchEvent(new MouseEvent("mouseout", { bubbles: true, clientX: 10, clientY: 10 })); - this.animations.play(this.imageEl, "idle_motion" /* IDLE_MOTION */); - }, BUBBLE_DURATION); + await sleep(BUBBLE_DURATION); + this.gemmyEl.dispatchEvent(new MouseEvent("mouseout", { bubbles: true, clientX: 10, clientY: 10 })); + this.animations.play(this.imageEl, "idle_motion" /* IDLE_MOTION */); } } }; @@ -394,4 +405,4 @@ var GemmyPlugin = class extends import_obsidian2.Plugin { await this.saveData(this.settings); } }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL1NldHRpbmcudHMiLCAic3JjL0FuaW1hdGlvbnMudHMiLCAic3JjL1F1b3Rlcy50cyIsICJzcmMvR2VtbXkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGRlYm91bmNlLCBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBERUZBVUxUX1NFVFRJTkdTLCBHZW1teVNldHRpbmdzLCBHZW1teVNldHRpbmdUYWIgfSBmcm9tICcuL1NldHRpbmcnO1xuaW1wb3J0IHsgR2VtbXkgfSBmcm9tICcuL0dlbW15JztcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHZW1teVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cdHNldHRpbmdzOiBHZW1teVNldHRpbmdzO1xuXHRnZW1teTogR2VtbXk7XG5cblxuXHRhc3luYyBvbmxvYWQoKSB7XG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblxuXHRcdHRoaXMuZ2VtbXkgPSBuZXcgR2VtbXkodGhpcyk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6ICdzaG93Jyxcblx0XHRcdG5hbWU6ICdTaG93IEdlbW15Jyxcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2VtbXkuYXBwZWFyKCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiAnaGlkZScsXG5cdFx0XHRuYW1lOiAnSGlkZSBHZW1teScsXG5cdFx0XHRjYWxsYmFjazogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmdlbW15LmRpc2FwcGVhcigpO1xuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XG5cdFx0XHRpZDogJ2VudGVyLXdyaXRpbmctbW9kZScsXG5cdFx0XHRuYW1lOiAnRW50ZXIgd3JpdGluZyBtb2RlJyxcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2VtbXkuZW50ZXJXcml0aW5nTW9kZSgpO1xuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XG5cdFx0XHRpZDogJ2xlYXZlLXdyaXRpbmctbW9kZScsXG5cdFx0XHRuYW1lOiAnTGVhdmUgd3JpdGluZyBtb2RlJyxcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2VtbXkubGVhdmVXcml0aW5nTW9kZSgpO1xuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBHZW1teVNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcblxuXHRcdC8vIGRlYm91bmNlIGVkaXRvci1jaGFuZ2UgZXZlbnQgb24gd29ya3NwYWNlXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50KFxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uKFxuXHRcdFx0XHQnZWRpdG9yLWNoYW5nZScsXG5cdFx0XHRcdGRlYm91bmNlKCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLmdlbW15Lm9uRWRpdG9yQ2hhbmdlKCk7XG5cdFx0XHRcdH0sIDUwMCksXG5cdFx0XHQpLFxuXHRcdCk7XG5cblx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSgoKSA9PiB0aGlzLmdlbW15LmFwcGVhcigpKTtcblx0fVxuXG5cdG9udW5sb2FkKCkge1xuXHRcdHRoaXMuZ2VtbXkuZGlzYXBwZWFyKCk7XG5cdH1cblxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG5cdH1cblxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcblx0fVxufVxuXG4iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IEdlbW15UGx1Z2luIGZyb20gJy4vbWFpbic7XG5cbmV4cG9ydCBlbnVtIEFuaW1hdGlvblNvdXJjZVR5cGUge1xuXHRPUklHSU5BTCA9IFwib3JpZ2luYWxcIixcblx0RFJBQ1RPTklDID0gXCJkcmFjb25pY1wiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VtbXlTZXR0aW5ncyB7XG5cdC8vIEFkZCB0aGUgYW5pbWF0aW9uU291cmNlIHByb3BlcnR5IHRvIHRoZSBzZXR0aW5ncyBpbnRlcmZhY2Vcblx0YW5pbWF0aW9uU291cmNlOiBBbmltYXRpb25Tb3VyY2VUeXBlO1xuXHQvLyBob3cgb2Z0ZW4gZG9lcyBHZW1teSB0YWxrIGluIGlkbGUgbW9kZSwgaW4gbWludXRlc1xuXHRpZGxlVGFsa0ZyZXF1ZW5jeTogbnVtYmVyO1xuXHQvLyB0aGUgbnVtYmVyIG9mIG1pbnV0ZXMgeW91IG11c3Qgd3JpdGUgYmVmb3JlIEdlbW15IGFwcGVhcnMgdG8gbW9jayB5b3Vcblx0d3JpdGluZ01vZGVHcmFjZVBlcmlvZDogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogR2VtbXlTZXR0aW5ncyA9IHtcblx0YW5pbWF0aW9uU291cmNlOiBBbmltYXRpb25Tb3VyY2VUeXBlLk9SSUdJTkFMLFxuXHRpZGxlVGFsa0ZyZXF1ZW5jeTogMSxcblx0d3JpdGluZ01vZGVHcmFjZVBlcmlvZDogMSxcbn07XG5cbmV4cG9ydCBjbGFzcyBHZW1teVNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBHZW1teVBsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBHZW1teVBsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdBbmltYXRpb24gU291cmNlJylcblx0XHRcdC5zZXREZXNjKCdDaG9vc2UgdGhlIHNvdXJjZSBvZiBHZW1teSBhbmltYXRpb25zLicpXG5cdFx0XHQuYWRkRHJvcGRvd24oZHJvcGRvd24gPT5cblx0XHRcdFx0ZHJvcGRvd25cblx0XHRcdFx0XHQuYWRkT3B0aW9uKEFuaW1hdGlvblNvdXJjZVR5cGUuT1JJR0lOQUwsICdPcmlnaW5hbCcpXG5cdFx0XHRcdFx0LmFkZE9wdGlvbihBbmltYXRpb25Tb3VyY2VUeXBlLkRSQUNUT05JQywgJ0RyYWNvbmljJylcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYW5pbWF0aW9uU291cmNlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyB2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBFeHBsaWNpdGx5IGNhc3QgdGhlIHZhbHVlIHRvIHRoZSBjb3JyZWN0IHR5cGVcblx0XHRcdFx0XHRcdGNvbnN0IGFuaW1hdGlvblNvdXJjZSA9IHZhbHVlIGFzIEFuaW1hdGlvblNvdXJjZVR5cGU7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hbmltYXRpb25Tb3VyY2UgPSBhbmltYXRpb25Tb3VyY2U7XG5cblx0XHRcdFx0XHRcdC8vIFNob3cgR2VtbXkgd2l0aCB0aGUgbmV3IGFuaW1hdGlvbnMgYWZ0ZXIgY2hhbmdpbmcgdGhlIHNvdXJjZVxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uZ2VtbXkuYXBwZWFyKCk7XG5cblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnSWRsZSB0YWxrIGZyZXF1ZW5jeScpXG5cdFx0XHQuc2V0RGVzYygnSG93IG9mdGVuIGRvZXMgR2VtbXkgc3BlYWsgd2hlbiBpZGxlLCBpbiBtaW51dGVzLicpXG5cdFx0XHQuYWRkU2xpZGVyKHNsaWRlciA9PlxuXHRcdFx0XHRzbGlkZXJcblx0XHRcdFx0XHQuc2V0TGltaXRzKDUsIDYwLCA1KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5pZGxlVGFsa0ZyZXF1ZW5jeSlcblx0XHRcdFx0XHQuc2V0RHluYW1pY1Rvb2x0aXAoKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyB2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5pZGxlVGFsa0ZyZXF1ZW5jeSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdXcml0aW5nIG1vZGUgZ3JhY2UgcGVyaW9kJylcblx0XHRcdC5zZXREZXNjKCdIb3cgc29vbiBHZW1teSBzdGFydHMgdG8gZ2V0IGRpc2FwcG9pbnRlZCBhZnRlciB5b3Ugc3RvcCB0eWluZyBpbiB3cml0aW5nIG1vZGUsIGluIHNlY29uZHMuJylcblx0XHRcdC5hZGRTbGlkZXIoc2xpZGVyID0+XG5cdFx0XHRcdHNsaWRlclxuXHRcdFx0XHRcdC5zZXRMaW1pdHMoNSwgMTgwLCA1KVxuXHRcdFx0XHRcdC5zZXREeW5hbWljVG9vbHRpcCgpXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLndyaXRpbmdNb2RlR3JhY2VQZXJpb2QpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jIHZhbHVlID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLndyaXRpbmdNb2RlR3JhY2VQZXJpb2QgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHR9XG59XG4iLCAiaW1wb3J0IEdlbW15UGx1Z2luIGZyb20gJy4vbWFpbic7XG5pbXBvcnQgeyBBbmltYXRpb25Tb3VyY2VUeXBlIH0gZnJvbSAnLi9TZXR0aW5nJztcblxuLy8gT3JpZ2luYWwgQW5pbWF0aW9uc1xuaW1wb3J0IEVNRVJHRV9NT1RJT05fT1JJR0lOQUwgZnJvbSAnLi4vYW5pbWF0aW9ucy9vcmlnaW5hbC9nZW1teV9lbWVyZ2UuZ2lmJztcbmltcG9ydCBQT1BfTU9USU9OX09SSUdJTkFMIGZyb20gJy4uL2FuaW1hdGlvbnMvb3JpZ2luYWwvZ2VtbXlfcG9wLmdpZic7XG5pbXBvcnQgRElTQVBQRUFSX01PVElPTl9PUklHSU5BTCBmcm9tICcuLi9hbmltYXRpb25zL29yaWdpbmFsL2dlbW15X2Rpc2FwcGVhci5naWYnO1xuaW1wb3J0IEFOR1JZX01PVElPTl9PUklHSU5BTCBmcm9tICcuLi9hbmltYXRpb25zL29yaWdpbmFsL2dlbW15X2FuZ3J5LmdpZic7XG5pbXBvcnQgTE9PS19NT1RJT05fT1JJR0lOQUwgZnJvbSAnLi4vYW5pbWF0aW9ucy9vcmlnaW5hbC9nZW1teV9sb29rQXJvdW5kLmdpZic7XG5pbXBvcnQgSURMRV9NT1RJT05fT1JJR0lOQUwgZnJvbSAnLi4vYW5pbWF0aW9ucy9vcmlnaW5hbC9nZW1teV9pZGxlLmdpZic7XG5pbXBvcnQgRElTQVBQT0lOVF9JTUdfT1JJR0lOQUwgZnJvbSAnLi4vYW5pbWF0aW9ucy9vcmlnaW5hbC9nZW1teV9kaXNhcHBvaW50LmdpZic7XG5cbi8vIERyYWNvbmljIEFuaW1hdGlvbnNcbmltcG9ydCBFTUVSR0VfTU9USU9OX0RSQUNPTklDIGZyb20gJy4uL2FuaW1hdGlvbnMvZHJhY29uaWMvZ2VtbXlfZW1lcmdlLmdpZic7XG5pbXBvcnQgUE9QX01PVElPTl9EUkFDT05JQyBmcm9tICcuLi9hbmltYXRpb25zL2RyYWNvbmljL2dlbW15X3BvcC5naWYnO1xuaW1wb3J0IERJU0FQUEVBUl9NT1RJT05fRFJBQ09OSUMgZnJvbSAnLi4vYW5pbWF0aW9ucy9kcmFjb25pYy9nZW1teV9kaXNhcHBlYXIuZ2lmJztcbmltcG9ydCBBTkdSWV9NT1RJT05fRFJBQ09OSUMgZnJvbSAnLi4vYW5pbWF0aW9ucy9kcmFjb25pYy9nZW1teV9hbmdyeS5naWYnO1xuaW1wb3J0IExPT0tfTU9USU9OX0RSQUNPTklDIGZyb20gJy4uL2FuaW1hdGlvbnMvZHJhY29uaWMvZ2VtbXlfbG9va0Fyb3VuZC5naWYnO1xuaW1wb3J0IElETEVfTU9USU9OX0RSQUNPTklDIGZyb20gJy4uL2FuaW1hdGlvbnMvZHJhY29uaWMvZ2VtbXlfaWRsZS5naWYnO1xuaW1wb3J0IERJU0FQUE9JTlRfSU1HX0RSQUNPTklDIGZyb20gJy4uL2FuaW1hdGlvbnMvZHJhY29uaWMvZ2VtbXlfZGlzYXBwb2ludC5naWYnO1xuXG5leHBvcnQgZW51bSBBbmltYXRpb25UeXBlIHtcblx0RU1FUkdFID0gJ2VtZXJnZScsXG5cdFBPUF9NT1RJT04gPSAncG9wX21vdGlvbicsXG5cdERJU0FQUEVBUl9NT1RJT04gPSAnZGlzYXBwZWFyX21vdGlvbicsXG5cdEFOR1JZX01PVElPTiA9ICdhbmdyeV9tb3Rpb24nLFxuXHRMT09LX01PVElPTiA9ICdsb29rX21vdGlvbicsXG5cdElETEVfTU9USU9OID0gJ2lkbGVfbW90aW9uJyxcblx0RElTQVBQT0lOVF9JTUcgPSAnZGlzYXBwb2ludF9pbmcnLFxufVxuXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9ucyB7XG5cdHB1YmxpYyByZWFkb25seSBwbHVnaW46IEdlbW15UGx1Z2luO1xuXG5cdC8vIHRoZSBtYXBwaW5ncyBmcm9tIGFuIGFuaW1hdGlvbiB0eXBlIHRvIGFuIGFjdHVhbCBpbWFnZSBmaWxlIGZvciB0aGUgZHJhY29uaWMgZ2VtbXlcblx0cHVibGljIHJlYWRvbmx5IGRyYWNvbmljQW5pbWF0aW9uTWFwOiBSZWNvcmQ8QW5pbWF0aW9uVHlwZSwgc3RyaW5nPjtcblx0Ly8gdGhlIG1hcHBpbmdzIGZyb20gYW4gYW5pbWF0aW9uIHR5cGUgdG8gYW4gYWN0dWFsIGltYWdlIGZpbGUgZm9yIHRoZSBvcmlnaW5hbCBnZW1teVxuXHRwdWJsaWMgcmVhZG9ubHkgb3JpZ2luYWxBbmltYXRpb25NYXA6IFJlY29yZDxBbmltYXRpb25UeXBlLCBzdHJpbmc+O1xuXG5cdC8vIG1hcHMgYW4gYW5pbWF0aW9uIHNvdXJjZSB0byB0aGUgY29ycmVzcG9uZGluZyBhbmltYXRpb24gbWFwXG5cdHB1YmxpYyByZWFkb25seSBhbmltYXRpb25Tb3VyY2VNYXA6IFJlY29yZDxBbmltYXRpb25Tb3VyY2VUeXBlLCBSZWNvcmQ8QW5pbWF0aW9uVHlwZSwgc3RyaW5nPj47XG5cblx0Y29uc3RydWN0b3IocGx1Z2luOiBHZW1teVBsdWdpbikge1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXG5cdFx0dGhpcy5kcmFjb25pY0FuaW1hdGlvbk1hcCA9IHtcblx0XHRcdFtBbmltYXRpb25UeXBlLkVNRVJHRV06IEVNRVJHRV9NT1RJT05fRFJBQ09OSUMsXG5cdFx0XHRbQW5pbWF0aW9uVHlwZS5QT1BfTU9USU9OXTogUE9QX01PVElPTl9EUkFDT05JQyxcblx0XHRcdFtBbmltYXRpb25UeXBlLkRJU0FQUEVBUl9NT1RJT05dOiBESVNBUFBFQVJfTU9USU9OX0RSQUNPTklDLFxuXHRcdFx0W0FuaW1hdGlvblR5cGUuQU5HUllfTU9USU9OXTogQU5HUllfTU9USU9OX0RSQUNPTklDLFxuXHRcdFx0W0FuaW1hdGlvblR5cGUuTE9PS19NT1RJT05dOiBMT09LX01PVElPTl9EUkFDT05JQyxcblx0XHRcdFtBbmltYXRpb25UeXBlLklETEVfTU9USU9OXTogSURMRV9NT1RJT05fRFJBQ09OSUMsXG5cdFx0XHRbQW5pbWF0aW9uVHlwZS5ESVNBUFBPSU5UX0lNR106IERJU0FQUE9JTlRfSU1HX0RSQUNPTklDLFxuXHRcdH1cblxuXHRcdHRoaXMub3JpZ2luYWxBbmltYXRpb25NYXAgPSB7XG5cdFx0XHRbQW5pbWF0aW9uVHlwZS5FTUVSR0VdOiBFTUVSR0VfTU9USU9OX09SSUdJTkFMLFxuXHRcdFx0W0FuaW1hdGlvblR5cGUuUE9QX01PVElPTl06IFBPUF9NT1RJT05fT1JJR0lOQUwsXG5cdFx0XHRbQW5pbWF0aW9uVHlwZS5ESVNBUFBFQVJfTU9USU9OXTogRElTQVBQRUFSX01PVElPTl9PUklHSU5BTCxcblx0XHRcdFtBbmltYXRpb25UeXBlLkFOR1JZX01PVElPTl06IEFOR1JZX01PVElPTl9PUklHSU5BTCxcblx0XHRcdFtBbmltYXRpb25UeXBlLkxPT0tfTU9USU9OXTogTE9PS19NT1RJT05fT1JJR0lOQUwsXG5cdFx0XHRbQW5pbWF0aW9uVHlwZS5JRExFX01PVElPTl06IElETEVfTU9USU9OX09SSUdJTkFMLFxuXHRcdFx0W0FuaW1hdGlvblR5cGUuRElTQVBQT0lOVF9JTUddOiBESVNBUFBPSU5UX0lNR19PUklHSU5BTCxcblx0XHR9XG5cblx0XHR0aGlzLmFuaW1hdGlvblNvdXJjZU1hcCA9IHtcblx0XHRcdFtBbmltYXRpb25Tb3VyY2VUeXBlLkRSQUNUT05JQ106IHRoaXMuZHJhY29uaWNBbmltYXRpb25NYXAsXG5cdFx0XHRbQW5pbWF0aW9uU291cmNlVHlwZS5PUklHSU5BTF06IHRoaXMub3JpZ2luYWxBbmltYXRpb25NYXAsXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFBsYXlzIGEgZ2VtbXkgYW5pbWF0aW9uIGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYW5pbWF0aW9uIHNvdXJjZSB0eXBlIGluc2lkZSBhbiBlbGVtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gZWwgdGhlIGVsZW1lbnQgdG8gcGxheSB0aGUgYW5pbWF0aW9uIGluXG5cdCAqIEBwYXJhbSBhbmltYXRpb24gdGhlIGFuaW1hdGlvbiB0byBwbGF5XG5cdCAqL1xuXHRwdWJsaWMgcGxheShlbDogSFRNTEVsZW1lbnQsIGFuaW1hdGlvbjogQW5pbWF0aW9uVHlwZSk6IHZvaWQge1xuXHRcdGNvbnN0IGFuaW1hdGlvbkZpbGUgPSB0aGlzLmFuaW1hdGlvblNvdXJjZU1hcFt0aGlzLnBsdWdpbi5zZXR0aW5ncy5hbmltYXRpb25Tb3VyY2VdW2FuaW1hdGlvbl07XG5cblx0XHRlbC5zZXRBdHRyaWJ1dGUoJ3NyYycsIGFuaW1hdGlvbkZpbGUpO1xuXHR9XG59XG4iLCAiZXhwb3J0IGNvbnN0IEdFTU1ZX0lETEVfUVVPVEVTID0gW1xuXHQnWW91IGNhblxcJ3QgYXJyZXN0IHVzISBXZSBhbHJlYWR5IGF0ZSB0aGUgZXZpZGVuY2UhJyxcblx0J0RvblxcJ3QgZXZlciBzcGxpdCB0aGUgcGFydHkhJyxcblx0J0lmIHlvdSBraWxsIGEgaGl2ZSBtaW5kLCBpcyB0aGF0IG11cmRlciBvciBnZW5vY2lkZT8nLFxuXHQnUm9sbCBpbml0aWF0aXZlIScsXG5cdCdZb3UgY2FuIHRyeSEnLFxuXHQnSVxcJ20gbm90IHNob3J0LCBJXFwnbSBjb25jZW50cmF0ZWQgYXdlc29tZS4nLFxuXHQnSVxcJ20gbm90IGdyZWVkeSwgSVxcJ20ganVzdCBhbGxlcmdpYyB0byBwb3ZlcnR5LicsXG5cdCdJIGRvblxcJ3QgYWx3YXlzIGNhc3Qgc3BlbGxzLCBidXQgd2hlbiBJIGRvLCBpdFxcJ3MgZmlyZWJhbGwuJyxcblx0J0kgZG9uXFwndCBuZWVkIGx1Y2ssIEkgaGF2ZSBhIGhpZ2ggY2hhcmlzbWEgc3RhdC4nLFxuXHQnSSBkb25cXCd0IGFsd2F5cyBkcmluayBhbGUsIGJ1dCB3aGVuIEkgZG8sIGl0XFwncyB3aXRoIG15IGZlbGxvdyBhZHZlbnR1cmVycyBhZnRlciBzbGF5aW5nIGEgZHJhZ29uLicsXG5cdCdJIGRvblxcJ3QgYWx3YXlzIHJvbGwgYSBjcml0aWNhbCBoaXQsIGJ1dCB3aGVuIEkgZG8sIHRoZSBETSBmb3JnZXRzIHRvIG1ha2UgbWUgcmVyb2xsIHRoZSBkYW1hZ2UuJyxcblx0J0kgbWF5IGJlIGNoYW90aWMgbmV1dHJhbCBvbiBwYXBlciwgYnV0IGluIHJlYWxpdHksIEkganVzdCBsaWtlIHRvIHdhdGNoIHRoZSB3b3JsZCBidXJuLicsXG5cdCdJdFx1MjAxOXMgbm90IHN0ZWFsaW5nIGlmIGl0IGJlbG9uZ3MgdG8gYSBkZWFkIGd1eS4nLFxuXHQnV2hvIG5lZWRzIGFuIGFybXkgd2hlbiB5b3UgaGF2ZSBhIGJhZyBvZiBob2xkaW5nIGZ1bGwgb2Ygcm9ja3M/Jyxcblx0J0xldCBtZSBzaG93IHlvdSBob3cgdG8gd2VhciBhIHNuYWtlLicsXG5cdCdXSFkgV09VTEQgWU9VIERPIFRIQVQhJyxcblx0J1RoYXQgZGljZSBuZWVkcyB0byBiZSByZXRpcmVkIScsXG5cdCdJIGRvblxcJ3Qga2lsbCB3aXRob3V0IHJlYXNvbi4gRm9ydHVuYXRlbHksIElcXCdtIGJvcmVkLiBSZWFzb24gZW5vdWdoIScsXG5cdCdBaCwgbXkgZmF2b3VyZWQgZW5lbXkuIFNvbWV0aGluZyBhbGl2ZS4nLFxuXHQnSSBzbGFwIHRoZSBiYXJyZWwgd2l0aCBteSBtZW1iZXIhLi4uIHRoZSBcXCdiYXJyZWxcXCcgb3BlblxcJ3MgaXRzIG1vdXRoIScsXG5cdCdJXFwnbSBub3QgZGVwcml2ZWQsIElcXCdtIGRlcHJhdmVkLicsXG5cdCdZb3UgbmVlZCBhIGZyZWUgaGFuZCB0byBhdHRlbXB0IGEgZ3JhcHBsZScsXG5cdGBDYXJlZnVsIGhvdyBtdWNoIHlvdSBjYXJyeTsgdGhlIEdNIG1pZ2h0IGFjdHVhbGx5IGFzayB5b3UgdG8gY2FsY3VsYXRlIHlvdXIgaW52ZW50b3J5IHdlaWdodCFgLFxuXHRgRG9uJ3QgZG8gdGhhdCEgVGhlbiB3ZSdsbCBoYXZlIHRvIGdvIGxvb2sgdXAgdGhlIGdyYXBwbGUgcnVsZXMhYCxcblx0YDUwIHBhZ2UgYmFja3N0b3J5Li4uIE5PUEVgLFxuXHRgSXQncyBhc3RvdW5kaW5nIGFueW9uZSBjYW4gdW5kZXJzdGFuZCB5b3UsIHdpdGggYWxsIHRob3NlIE5hdCAxIENoYXJpc21hIHJvbGxzLmAsXG5cdGBUaGUgY2hlZGRhciBtb25rcyBhcmUgaGVyZSB0byBzYXZlIHRoZSBkYXkhYCxcblx0YFlvdSd2ZSBiZWVuIEd5Z2F4ZWQuYCxcblx0YFNURVAgQVdBWSBGUk9NIFRIRSBQVVJDSEFTRSBNT1JFIERJQ0UgQlVUVE9OYCxcblx0YEFmdGVyIHRob3VzYW5kcyBvZiB5ZWFycywgSSBoYXZlIGF0dGFpbmVkIG15IGN1cnJlbnQgc3RhdGUsIHdoaWxlIHlvdSBzdHJ1Z2dsZSB0byBjb21wbGV0ZSB0aGlzIHNpbXBsZSBub3RlLmAsXG5cdGBZb3UgYXJlIGEgYmFja2dyb3VuZCBjaGFyYWN0ZXIgaW4geW91ciBvd24gbGlmZS5gXG5dO1xuXG5leHBvcnQgY29uc3QgV1JJVElOR19NT0RFX1FVT1RFUyA9IFtcblx0YFBsYXllcidzIGRvbnQgdGFrZSBub3Rlcy4uLiBtYXliZSB5b3Ugc2hvdWxkIHRyeSB0aGF0P2AsXG5cdGBJcyB0aGF0IHRoZSBiZXN0IHlvdSBjYW4gZG8/IEtlZXAgd3JpdGluZyFgLFxuXHRgV3JpdGUgZmlyc3QsIGVkaXRvciBsYXRlci5gLFxuXHRgQUkgY291bGQgcHJvYmFibHkgd3JpdGUgYSBiZXR0ZXIgbm90ZS4uLmAsXG5cdGBJIGxvdmUgaGVhcmluZyB5b3VyIGtleWJvYXJkLiBEb24ndCBzdG9wLmAsXG5cdGBIb3cgYWJvdXQgd2UgcmV2aWV3IHNvbWUgb2xkIG5vdGVzIHRvZGF5P2AsXG5cdGBXaHkgbm90IGp1c3QgdXNlIGEgdGVtcGxhdGU/YCxcblx0YERvZXNuJ3QgbWF0dGVyIGhvdyBtdWNoIHlvdSBwbGFuLi4uIHRoZXkgd2lsbCBkZXJhaWwgYW55d2F5IWAsXG5cdGBNYXliZSBpdCdzIHRpbWUgdG8gZ28gZ2V0IHNvbWUgd2F0ZXIgb3IgY29mZmVlLmAsXG5cdGBUaGF0J3Mgbm90IGhvdyByaXZlcnMgYXJlIGluIHJlYWwtbGlmZS4uLmAsXG5cdGBBbnl0aGluZyBpcyBiZXR0ZXIgdGhhbiBhIGJsYW5rIHBhZ2UsIGV2ZW4gbWUuIFdyaXRlIHNvbWV0aGluZyFgLFxuXHRgSGF2ZSB5b3UgZ2l2ZW4gb3V0IEluc3BpcmF0aW9uIHJlY2VudGx5P2AsXG5cdGBDYWxsIG1lIEplZXZlcy4gSS4gRGFyZS4gWW91LmAsXG5cdGBJIGNhc3QgJ1N1bW1vbiBCaWdnZXIgRmlzaGAsXG5cdGBEbyB5b3UgdG91Y2ggaXQ/YCxcblx0YFdoYXQgd291bGQgTWF0dCBNZXJjZXIgZG8/YCxcblx0YFRvIGNvbnRpbnVlLCBwbGVhc2UgaW5zZXJ0IG1vcmUgY3JlZGl0c2AsXG5cdGBIYXZlIHlvdSBjb25zaWRlcmVkIGp1c3QuLi4gTm90P2Bcbl07XG4iLCAiaW1wb3J0IHsgQW5pbWF0aW9ucywgQW5pbWF0aW9uVHlwZSB9IGZyb20gJy4vQW5pbWF0aW9ucyc7XG5pbXBvcnQgR2VtbXlQbHVnaW4gZnJvbSAnLi9tYWluJztcbmltcG9ydCB7IEdFTU1ZX0lETEVfUVVPVEVTLCBXUklUSU5HX01PREVfUVVPVEVTIH0gZnJvbSAnLi9RdW90ZXMnO1xuXG5jb25zdCBCVUJCTEVfRFVSQVRJT046IG51bWJlciA9IDUwMDA7XG5cbmV4cG9ydCBjbGFzcyBHZW1teSB7XG5cdHB1YmxpYyByZWFkb25seSBwbHVnaW46IEdlbW15UGx1Z2luO1xuXHRwcml2YXRlIHJlYWRvbmx5IGFuaW1hdGlvbnM6IEFuaW1hdGlvbnM7XG5cblx0Z2VtbXlFbDogSFRNTEVsZW1lbnQ7XG5cdGltYWdlRWw6IEhUTUxFbGVtZW50O1xuXG5cdGFwcGVhcmVkOiBib29sZWFuID0gZmFsc2U7XG5cdGlzRGlzYXBwZWFyaW5nOiBib29sZWFuID0gZmFsc2U7XG5cdGluV3JpdGluZ01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRpZGxlVGltZW91dDogbnVtYmVyO1xuXHR3cml0aW5nTW9kZVRpbWVvdXQ6IG51bWJlcjtcblx0ZGlzYXBwZWFyVGltZW91dDogbnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yKHBsdWdpbjogR2VtbXlQbHVnaW4pIHtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblxuXHRcdHRoaXMuYW5pbWF0aW9ucyA9IG5ldyBBbmltYXRpb25zKHRoaXMucGx1Z2luKTtcblxuXHRcdHRoaXMuY3JlYXRlR2VtbXlFbCgpO1xuXG5cdFx0dGhpcy5zdGFydE5leHRJZGxlVGltZW91dCgpO1xuXHR9XG5cblx0Y3JlYXRlR2VtbXlFbCgpIHtcblx0XHR0aGlzLmdlbW15RWwgPSBjcmVhdGVEaXYoJ2dlbW15LWNvbnRhaW5lcicpO1xuXHRcdHRoaXMuZ2VtbXlFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwtcG9zaXRpb24nLCAndG9wJyk7XG5cdFx0dGhpcy5nZW1teUVsLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbC1kZWxheScsICcwJyk7XG5cdFx0dGhpcy5nZW1teUVsLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbC1jbGFzc2VzJywgJ2dlbW15LXRvb2x0aXAnKTtcblxuXHRcdHRoaXMuaW1hZ2VFbCA9IHRoaXMuZ2VtbXlFbC5jcmVhdGVFbCgnaW1nJywge30pO1xuXG5cdFx0dGhpcy5nZW1teUVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5pbldyaXRpbmdNb2RlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zYXlTb21ldGhpbmcoR0VNTVlfSURMRV9RVU9URVMsIHRydWUpO1xuXHRcdFx0dGhpcy5pZGxlVGltZW91dCAmJiBjbGVhclRpbWVvdXQodGhpcy5pZGxlVGltZW91dCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmdlbW15RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcblx0XHRcdGlmICh0aGlzLmluV3JpdGluZ01vZGUpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmFuaW1hdGlvbnMucGxheSh0aGlzLmltYWdlRWwsIEFuaW1hdGlvblR5cGUuSURMRV9NT1RJT04pO1xuXHRcdFx0dGhpcy5zdGFydE5leHRJZGxlVGltZW91dCgpO1xuXHRcdH0pO1xuXHR9XG5cblxuXHRhcHBlYXIoKSB7XG5cdFx0Y29uc29sZS5sb2coJ2dlbW15IGFwcGVhcicpO1xuXG5cdFx0Ly8gc3RvcCBoaW0gZnJvbSBsZWF2aW5nXG5cdFx0d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmRpc2FwcGVhclRpbWVvdXQpO1xuXHRcdHRoaXMuaXNEaXNhcHBlYXJpbmcgPSBmYWxzZTtcblxuXHRcdC8vIHNob3cgaGltXG5cdFx0dGhpcy5hbmltYXRpb25zLnBsYXkodGhpcy5pbWFnZUVsLCBBbmltYXRpb25UeXBlLkVNRVJHRSk7XG5cblx0XHQvLyBRdWlja2VyIGlmIHdlJ3JlIGluIHdyaXRpbmcgbW9kZVxuXHRcdGlmICh0aGlzLmluV3JpdGluZ01vZGUpIHtcblx0XHRcdHRoaXMuYW5pbWF0aW9ucy5wbGF5KHRoaXMuaW1hZ2VFbCwgQW5pbWF0aW9uVHlwZS5QT1BfTU9USU9OKTtcblxuXHRcdFx0d2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmFwcGVhcmVkID0gdHJ1ZTtcblxuXHRcdFx0XHR0aGlzLnNheVNvbWV0aGluZyhXUklUSU5HX01PREVfUVVPVEVTLCB0cnVlKTtcblx0XHRcdH0sIDE4MDApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmFuaW1hdGlvbnMucGxheSh0aGlzLmltYWdlRWwsIEFuaW1hdGlvblR5cGUuRU1FUkdFKTtcblxuXHRcdFx0d2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmFuaW1hdGlvbnMucGxheSh0aGlzLmltYWdlRWwsIEFuaW1hdGlvblR5cGUuSURMRV9NT1RJT04pO1xuXHRcdFx0XHR0aGlzLmFwcGVhcmVkID0gdHJ1ZTtcblx0XHRcdH0sIDM4MDApO1xuXHRcdH1cblxuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5nZW1teUVsKTtcblx0XHR0aGlzLmdlbW15RWwuaGlkZGVuID0gZmFsc2U7XG5cdFx0dGhpcy5hcHBlYXJlZCA9IHRydWU7XG5cdH1cblxuXHRkaXNhcHBlYXIoKSB7XG5cdFx0Ly8gZG9uJ3QgbWFrZSBnZW1teSBkaXNhcHBlYXIgd2hpbGUgaGUgaXMgYWxyZWFkeSBsZWF2aW5nXG5cdFx0aWYgKHRoaXMuaXNEaXNhcHBlYXJpbmcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmlzRGlzYXBwZWFyaW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuaWRsZVRpbWVvdXQgJiYgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmlkbGVUaW1lb3V0KTtcblx0XHR0aGlzLndyaXRpbmdNb2RlVGltZW91dCAmJiB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud3JpdGluZ01vZGVUaW1lb3V0KTtcblxuXHRcdHRoaXMuYW5pbWF0aW9ucy5wbGF5KHRoaXMuaW1hZ2VFbCwgQW5pbWF0aW9uVHlwZS5ESVNBUFBFQVJfTU9USU9OKTtcblx0XHQvLyByZW1vdGUgdG9vbHRpcFxuXHRcdHRoaXMuZ2VtbXlFbC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZW91dCcsIHsgYnViYmxlczogdHJ1ZSwgY2xpZW50WDogMTAsIGNsaWVudFk6IDEwIH0pKTtcblxuXHRcdHRoaXMuZGlzYXBwZWFyVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdC8vIGdlbW15IGZpbmlzaGVkIGxlYXZpbmdcblx0XHRcdHRoaXMuZ2VtbXlFbC5oaWRkZW4gPSB0cnVlO1xuXHRcdFx0dGhpcy5hcHBlYXJlZCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5pc0Rpc2FwcGVhcmluZyA9IGZhbHNlO1xuXHRcdH0sIDEzMDApO1xuXG5cdFx0Ly8gdGhpcy5hcHBlYXJlZCA9IGZhbHNlO1xuXHR9XG5cblx0b25FZGl0b3JDaGFuZ2UoKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLmluV3JpdGluZ01vZGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmRpc2FwcGVhcigpO1xuXHRcdHRoaXMuc2V0V3JpdGluZ01vZGVUaW1lb3V0KCk7XG5cdH1cblxuXHRlbnRlcldyaXRpbmdNb2RlKCkge1xuXHRcdHRoaXMuaW5Xcml0aW5nTW9kZSA9IHRydWU7XG5cdFx0dGhpcy5kaXNhcHBlYXIoKTtcblxuXHRcdHRoaXMuc2V0V3JpdGluZ01vZGVUaW1lb3V0KCk7XG5cdH1cblxuXHRsZWF2ZVdyaXRpbmdNb2RlKCkge1xuXHRcdHRoaXMuaW5Xcml0aW5nTW9kZSA9IGZhbHNlO1xuXHRcdHRoaXMuYXBwZWFyKCk7XG5cblx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud3JpdGluZ01vZGVUaW1lb3V0KTtcblx0fVxuXG5cdHNldFdyaXRpbmdNb2RlVGltZW91dCgpIHtcblx0XHRpZiAodGhpcy53cml0aW5nTW9kZVRpbWVvdXQpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53cml0aW5nTW9kZVRpbWVvdXQpO1xuXHRcdH1cblxuXHRcdHRoaXMud3JpdGluZ01vZGVUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuaW5Xcml0aW5nTW9kZSkge1xuXHRcdFx0XHR0aGlzLmFwcGVhcigpO1xuXHRcdFx0fVxuXHRcdH0sIHRoaXMucGx1Z2luLnNldHRpbmdzLndyaXRpbmdNb2RlR3JhY2VQZXJpb2QgKiAxMDAwKTtcblx0fVxuXG5cdHN0YXJ0TmV4dElkbGVUaW1lb3V0KCkge1xuXHRcdC8vIGlmIHRoZSBzZXQgdGltZSBpcyA1IG1pbnV0ZXMsIHRoaXMgd2lsbCBzZXQgdGltZW91dCB0byBiZSBhIHJhbmRvbSB0aW1lIGJldHdlZW4gNC02IG1pbnV0ZXNcblx0XHQvLyB0aGUgcmFuZ2Ugd2lsbCBiZSA4MCUgLSAxMjAlXG5cdFx0Y29uc3QgcmFuZG9tRmFjdG9yID0gMC44ICsgMC40ICogTWF0aC5yYW5kb20oKTtcblx0XHRjb25zdCByYW5kb21pemVkVGltZW91dCA9IHJhbmRvbUZhY3RvciAqIHRoaXMucGx1Z2luLnNldHRpbmdzLmlkbGVUYWxrRnJlcXVlbmN5ICogNjAwMDA7XG5cblx0XHRpZiAodGhpcy5pZGxlVGltZW91dCkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmlkbGVUaW1lb3V0KTtcblx0XHR9XG5cblx0XHR0aGlzLmlkbGVUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuaW5Xcml0aW5nTW9kZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuc2F5U29tZXRoaW5nKEdFTU1ZX0lETEVfUVVPVEVTLCBmYWxzZSk7XG5cdFx0XHR0aGlzLnN0YXJ0TmV4dElkbGVUaW1lb3V0KCk7XG5cdFx0fSwgcmFuZG9taXplZFRpbWVvdXQpO1xuXHR9XG5cblx0c2F5U29tZXRoaW5nKHF1b3Rlczogc3RyaW5nW10sIHBlcnNpc3RlbnQ6IGJvb2xlYW4pIHtcblx0XHRpZiAoIXRoaXMuYXBwZWFyZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zb2xlLmxvZyh0aGlzLmluV3JpdGluZ01vZGUpO1xuXG5cdFx0Y29uc3QgcmFuZG9tVGhpbmcgPSBxdW90ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcXVvdGVzLmxlbmd0aCldO1xuXG5cdFx0dGhpcy5nZW1teUVsLnNldEF0dHIoJ2FyaWEtbGFiZWwnLCByYW5kb21UaGluZyk7XG5cdFx0dGhpcy5nZW1teUVsLnNldEF0dHIoJ2FyaWEtbGFiZWwtcG9zaXRpb24nLCAndG9wJyk7XG5cdFx0dGhpcy5nZW1teUVsLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ21vdXNlb3ZlcicsIHsgYnViYmxlczogdHJ1ZSwgY2xpZW50WDogMTAsIGNsaWVudFk6IDEwIH0pKTtcblxuXHRcdGlmICh0aGlzLmluV3JpdGluZ01vZGUpIHtcblx0XHRcdHRoaXMuYW5pbWF0aW9ucy5wbGF5KHRoaXMuaW1hZ2VFbCwgQW5pbWF0aW9uVHlwZS5BTkdSWV9NT1RJT04pO1xuXG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuYW5pbWF0aW9ucy5wbGF5KHRoaXMuaW1hZ2VFbCwgQW5pbWF0aW9uVHlwZS5ESVNBUFBPSU5UX0lNRyk7XG5cdFx0XHR9LCAxMDAwKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5hbmltYXRpb25zLnBsYXkodGhpcy5pbWFnZUVsLCBBbmltYXRpb25UeXBlLkxPT0tfTU9USU9OKTtcblx0XHR9XG5cblx0XHRpZiAoIXBlcnNpc3RlbnQpIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dGhpcy5nZW1teUVsLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ21vdXNlb3V0JywgeyBidWJibGVzOiB0cnVlLCBjbGllbnRYOiAxMCwgY2xpZW50WTogMTAgfSkpO1xuXHRcdFx0XHR0aGlzLmFuaW1hdGlvbnMucGxheSh0aGlzLmltYWdlRWwsIEFuaW1hdGlvblR5cGUuSURMRV9NT1RJT04pO1xuXHRcdFx0fSwgQlVCQkxFX0RVUkFUSU9OKTtcblx0XHR9XG5cdH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQSxtQkFBaUM7OztBQ0FqQyxzQkFBK0M7QUFpQnhDLElBQU0sbUJBQWtDO0FBQUEsRUFDOUMsaUJBQWlCO0FBQUEsRUFDakIsbUJBQW1CO0FBQUEsRUFDbkIsd0JBQXdCO0FBQ3pCO0FBRU8sSUFBTSxrQkFBTixjQUE4QixpQ0FBaUI7QUFBQSxFQUdyRCxZQUFZLEtBQVUsUUFBcUI7QUFDMUMsVUFBTSxLQUFLLE1BQU07QUFDakIsU0FBSyxTQUFTO0FBQUEsRUFDZjtBQUFBLEVBRUEsVUFBZ0I7QUFDZixVQUFNLEVBQUUsWUFBWSxJQUFJO0FBRXhCLGdCQUFZLE1BQU07QUFFbEIsUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsa0JBQWtCLEVBQzFCLFFBQVEsd0NBQXdDLEVBQ2hEO0FBQUEsTUFBWSxjQUNa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LE1BQ3RCO0FBQUEsSUFDRCxDQUFDO0FBRUQsU0FBSyxXQUFXO0FBQUEsTUFDZixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixVQUFVLE1BQU07QUFDZixhQUFLLE1BQU0saUJBQWlCO0FBQUEsTUFDN0I7QUFBQSxJQUNELENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNmLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLFVBQVUsTUFBTTtBQUNmLGFBQUssTUFBTSxpQkFBaUI7QUFBQSxNQUM3QjtBQUFBLElBQ0QsQ0FBQztBQUdELFNBQUssY0FBYyxJQUFJLGdCQUFnQixLQUFLLEtBQUssSUFBSSxDQUFDO0FBR3RELFNBQUs7QUFBQSxNQUNKLEtBQUssSUFBSSxVQUFVO0FBQUEsUUFDbEI7QUFBQSxZQUNBLDJCQUFTLE1BQU07QUFDZCxlQUFLLE1BQU0sZUFBZTtBQUFBLFFBQzNCLEdBQUcsR0FBRztBQUFBLE1BQ1A7QUFBQSxJQUNEO0FBRUEsU0FBSyxJQUFJLFVBQVUsY0FBYyxNQUFNLEtBQUssTUFBTSxPQUFPLENBQUM7QUFBQSxFQUMzRDtBQUFBLEVBRUEsV0FBVztBQUNWLFNBQUssTUFBTSxVQUFVO0FBQUEsRUFDdEI7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNwQixTQUFLLFdBQVcsT0FBTyxPQUFPLENBQUMsR0FBRyxrQkFBa0IsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUFBLEVBQzFFO0FBQUEsRUFFQSxNQUFNLGVBQWU7QUFDcEIsVUFBTSxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBQUEsRUFDbEM7QUFDRDsiLAogICJuYW1lcyI6IFsiaW1wb3J0X29ic2lkaWFuIiwgImdlbW15X2VtZXJnZV9kZWZhdWx0IiwgImdlbW15X3BvcF9kZWZhdWx0IiwgImdlbW15X2Rpc2FwcGVhcl9kZWZhdWx0IiwgImdlbW15X2FuZ3J5X2RlZmF1bHQiLCAiZ2VtbXlfbG9va0Fyb3VuZF9kZWZhdWx0IiwgImdlbW15X2lkbGVfZGVmYXVsdCIsICJnZW1teV9kaXNhcHBvaW50X2RlZmF1bHQiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL1NldHRpbmcudHMiLCAic3JjL0FuaW1hdGlvbnMudHMiLCAic3JjL1F1b3Rlcy50cyIsICJzcmMvR2VtbXkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGRlYm91bmNlLCBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBERUZBVUxUX1NFVFRJTkdTLCBHZW1teVNldHRpbmdzLCBHZW1teVNldHRpbmdUYWIgfSBmcm9tICcuL1NldHRpbmcnO1xuaW1wb3J0IHsgR2VtbXkgfSBmcm9tICcuL0dlbW15JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2VtbXlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuXHRzZXR0aW5nczogR2VtbXlTZXR0aW5ncztcblx0Z2VtbXk6IEdlbW15O1xuXG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXG5cdFx0dGhpcy5nZW1teSA9IG5ldyBHZW1teSh0aGlzKTtcblxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XG5cdFx0XHRpZDogJ3Nob3cnLFxuXHRcdFx0bmFtZTogJ1Nob3cgR2VtbXknLFxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5nZW1teS5hcHBlYXIoKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6ICdoaWRlJyxcblx0XHRcdG5hbWU6ICdIaWRlIEdlbW15Jyxcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2VtbXkuZGlzYXBwZWFyKCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiAnZW50ZXItd3JpdGluZy1tb2RlJyxcblx0XHRcdG5hbWU6ICdFbnRlciB3cml0aW5nIG1vZGUnLFxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5nZW1teS5lbnRlcldyaXRpbmdNb2RlKCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiAnbGVhdmUtd3JpdGluZy1tb2RlJyxcblx0XHRcdG5hbWU6ICdMZWF2ZSB3cml0aW5nIG1vZGUnLFxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5nZW1teS5sZWF2ZVdyaXRpbmdNb2RlKCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0Ly8gVGhpcyBhZGRzIGEgc2V0dGluZ3MgdGFiIHNvIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbHVnaW5cblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEdlbW15U2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG5cdFx0Ly8gZGVib3VuY2UgZWRpdG9yLWNoYW5nZSBldmVudCBvbiB3b3Jrc3BhY2Vcblx0XHR0aGlzLnJlZ2lzdGVyRXZlbnQoXG5cdFx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub24oXG5cdFx0XHRcdCdlZGl0b3ItY2hhbmdlJyxcblx0XHRcdFx0ZGVib3VuY2UoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZ2VtbXkub25FZGl0b3JDaGFuZ2UoKTtcblx0XHRcdFx0fSwgNTAwKSxcblx0XHRcdCksXG5cdFx0KTtcblxuXHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KCgpID0+IHRoaXMuZ2VtbXkuYXBwZWFyKCkpO1xuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdFx0dGhpcy5nZW1teS5kaXNhcHBlYXIoKTtcblx0fVxuXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcblx0fVxuXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IEdlbW15UGx1Z2luIGZyb20gJy4vbWFpbic7XG5cbmV4cG9ydCBlbnVtIEFuaW1hdGlvblNvdXJjZVR5cGUge1xuXHRPUklHSU5BTCA9ICdvcmlnaW5hbCcsXG5cdERSQUNUT05JQyA9ICdkcmFjb25pYycsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VtbXlTZXR0aW5ncyB7XG5cdC8vIEFkZCB0aGUgYW5pbWF0aW9uU291cmNlIHByb3BlcnR5IHRvIHRoZSBzZXR0aW5ncyBpbnRlcmZhY2Vcblx0YW5pbWF0aW9uU291cmNlOiBBbmltYXRpb25Tb3VyY2VUeXBlO1xuXHQvLyBob3cgb2Z0ZW4gZG9lcyBHZW1teSB0YWxrIGluIGlkbGUgbW9kZSwgaW4gbWludXRlc1xuXHRpZGxlVGFsa0ZyZXF1ZW5jeTogbnVtYmVyO1xuXHQvLyB0aGUgbnVtYmVyIG9mIG1pbnV0ZXMgeW91IG11c3Qgd3JpdGUgYmVmb3JlIEdlbW15IGFwcGVhcnMgdG8gbW9jayB5b3Vcblx0d3JpdGluZ01vZGVHcmFjZVBlcmlvZDogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogR2VtbXlTZXR0aW5ncyA9IHtcblx0YW5pbWF0aW9uU291cmNlOiBBbmltYXRpb25Tb3VyY2VUeXBlLk9SSUdJTkFMLFxuXHRpZGxlVGFsa0ZyZXF1ZW5jeTogMSxcblx0d3JpdGluZ01vZGVHcmFjZVBlcmlvZDogMSxcbn07XG5cbmV4cG9ydCBjbGFzcyBHZW1teVNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBHZW1teVBsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBHZW1teVBsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdBbmltYXRpb24gU291cmNlJylcblx0XHRcdC5zZXREZXNjKCdDaG9vc2UgdGhlIHNvdXJjZSBvZiBHZW1teSBhbmltYXRpb25zLicpXG5cdFx0XHQuYWRkRHJvcGRvd24oZHJvcGRvd24gPT5cblx0XHRcdFx0ZHJvcGRvd25cblx0XHRcdFx0XHQuYWRkT3B0aW9uKEFuaW1hdGlvblNvdXJjZVR5cGUuT1JJR0lOQUwsICdPcmlnaW5hbCcpXG5cdFx0XHRcdFx0LmFkZE9wdGlvbihBbmltYXRpb25Tb3VyY2VUeXBlLkRSQUNUT05JQywgJ0RyYWNvbmljJylcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYW5pbWF0aW9uU291cmNlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyB2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBFeHBsaWNpdGx5IGNhc3QgdGhlIHZhbHVlIHRvIHRoZSBjb3JyZWN0IHR5cGVcblx0XHRcdFx0XHRcdGNvbnN0IGFuaW1hdGlvblNvdXJjZSA9IHZhbHVlIGFzIEFuaW1hdGlvblNvdXJjZVR5cGU7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hbmltYXRpb25Tb3VyY2UgPSBhbmltYXRpb25Tb3VyY2U7XG5cblx0XHRcdFx0XHRcdC8vIFNob3cgR2VtbXkgd2l0aCB0aGUgbmV3IGFuaW1hdGlvbnMgYWZ0ZXIgY2hhbmdpbmcgdGhlIHNvdXJjZVxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uZ2VtbXkucmVzZXQoKTtcblxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSksXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnSWRsZSB0YWxrIGZyZXF1ZW5jeScpXG5cdFx0XHQuc2V0RGVzYygnSG93IG9mdGVuIGRvZXMgR2VtbXkgc3BlYWsgd2hlbiBpZGxlLCBpbiBtaW51dGVzLicpXG5cdFx0XHQuYWRkU2xpZGVyKHNsaWRlciA9PlxuXHRcdFx0XHRzbGlkZXJcblx0XHRcdFx0XHQuc2V0TGltaXRzKDUsIDYwLCA1KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5pZGxlVGFsa0ZyZXF1ZW5jeSlcblx0XHRcdFx0XHQuc2V0RHluYW1pY1Rvb2x0aXAoKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyB2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5pZGxlVGFsa0ZyZXF1ZW5jeSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSksXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnV3JpdGluZyBtb2RlIGdyYWNlIHBlcmlvZCcpXG5cdFx0XHQuc2V0RGVzYygnSG93IHNvb24gR2VtbXkgc3RhcnRzIHRvIGdldCBkaXNhcHBvaW50ZWQgYWZ0ZXIgeW91IHN0b3AgdHlpbmcgaW4gd3JpdGluZyBtb2RlLCBpbiBzZWNvbmRzLicpXG5cdFx0XHQuYWRkU2xpZGVyKHNsaWRlciA9PlxuXHRcdFx0XHRzbGlkZXJcblx0XHRcdFx0XHQuc2V0TGltaXRzKDUsIDE4MCwgNSlcblx0XHRcdFx0XHQuc2V0RHluYW1pY1Rvb2x0aXAoKVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy53cml0aW5nTW9kZUdyYWNlUGVyaW9kKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyB2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy53cml0aW5nTW9kZUdyYWNlUGVyaW9kID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KSxcblx0XHRcdCk7XG5cdH1cbn1cbiIsICJpbXBvcnQgR2VtbXlQbHVnaW4gZnJvbSAnLi9tYWluJztcbmltcG9ydCB7IEFuaW1hdGlvblNvdXJjZVR5cGUgfSBmcm9tICcuL1NldHRpbmcnO1xuXG4vLyBPcmlnaW5hbCBBbmltYXRpb25zXG5pbXBvcnQgRU1FUkdFX01PVElPTl9PUklHSU5BTCBmcm9tICcuLi9hbmltYXRpb25zL29yaWdpbmFsL2dlbW15X2VtZXJnZS5naWYnO1xuaW1wb3J0IFBPUF9NT1RJT05fT1JJR0lOQUwgZnJvbSAnLi4vYW5pbWF0aW9ucy9vcmlnaW5hbC9nZW1teV9wb3AuZ2lmJztcbmltcG9ydCBESVNBUFBFQVJfTU9USU9OX09SSUdJTkFMIGZyb20gJy4uL2FuaW1hdGlvbnMvb3JpZ2luYWwvZ2VtbXlfZGlzYXBwZWFyLmdpZic7XG5pbXBvcnQgQU5HUllfTU9USU9OX09SSUdJTkFMIGZyb20gJy4uL2FuaW1hdGlvbnMvb3JpZ2luYWwvZ2VtbXlfYW5ncnkuZ2lmJztcbmltcG9ydCBMT09LX01PVElPTl9PUklHSU5BTCBmcm9tICcuLi9hbmltYXRpb25zL29yaWdpbmFsL2dlbW15X2xvb2tBcm91bmQuZ2lmJztcbmltcG9ydCBJRExFX01PVElPTl9PUklHSU5BTCBmcm9tICcuLi9hbmltYXRpb25zL29yaWdpbmFsL2dlbW15X2lkbGUuZ2lmJztcbmltcG9ydCBESVNBUFBPSU5UX0lNR19PUklHSU5BTCBmcm9tICcuLi9hbmltYXRpb25zL29yaWdpbmFsL2dlbW15X2Rpc2FwcG9pbnQuZ2lmJztcblxuLy8gRHJhY29uaWMgQW5pbWF0aW9uc1xuaW1wb3J0IEVNRVJHRV9NT1RJT05fRFJBQ09OSUMgZnJvbSAnLi4vYW5pbWF0aW9ucy9kcmFjb25pYy9nZW1teV9lbWVyZ2UuZ2lmJztcbmltcG9ydCBQT1BfTU9USU9OX0RSQUNPTklDIGZyb20gJy4uL2FuaW1hdGlvbnMvZHJhY29uaWMvZ2VtbXlfcG9wLmdpZic7XG5pbXBvcnQgRElTQVBQRUFSX01PVElPTl9EUkFDT05JQyBmcm9tICcuLi9hbmltYXRpb25zL2RyYWNvbmljL2dlbW15X2Rpc2FwcGVhci5naWYnO1xuaW1wb3J0IEFOR1JZX01PVElPTl9EUkFDT05JQyBmcm9tICcuLi9hbmltYXRpb25zL2RyYWNvbmljL2dlbW15X2FuZ3J5LmdpZic7XG5pbXBvcnQgTE9PS19NT1RJT05fRFJBQ09OSUMgZnJvbSAnLi4vYW5pbWF0aW9ucy9kcmFjb25pYy9nZW1teV9sb29rQXJvdW5kLmdpZic7XG5pbXBvcnQgSURMRV9NT1RJT05fRFJBQ09OSUMgZnJvbSAnLi4vYW5pbWF0aW9ucy9kcmFjb25pYy9nZW1teV9pZGxlLmdpZic7XG5pbXBvcnQgRElTQVBQT0lOVF9JTUdfRFJBQ09OSUMgZnJvbSAnLi4vYW5pbWF0aW9ucy9kcmFjb25pYy9nZW1teV9kaXNhcHBvaW50LmdpZic7XG5cbmV4cG9ydCBlbnVtIEFuaW1hdGlvblR5cGUge1xuXHRFTUVSR0UgPSAnZW1lcmdlJyxcblx0UE9QX01PVElPTiA9ICdwb3BfbW90aW9uJyxcblx0RElTQVBQRUFSX01PVElPTiA9ICdkaXNhcHBlYXJfbW90aW9uJyxcblx0QU5HUllfTU9USU9OID0gJ2FuZ3J5X21vdGlvbicsXG5cdExPT0tfTU9USU9OID0gJ2xvb2tfbW90aW9uJyxcblx0SURMRV9NT1RJT04gPSAnaWRsZV9tb3Rpb24nLFxuXHRESVNBUFBPSU5UX0lNRyA9ICdkaXNhcHBvaW50X2luZycsXG59XG5cbmV4cG9ydCBjbGFzcyBBbmltYXRpb25zIHtcblx0cHVibGljIHJlYWRvbmx5IHBsdWdpbjogR2VtbXlQbHVnaW47XG5cblx0Ly8gdGhlIG1hcHBpbmdzIGZyb20gYW4gYW5pbWF0aW9uIHR5cGUgdG8gYW4gYWN0dWFsIGltYWdlIGZpbGUgZm9yIHRoZSBkcmFjb25pYyBnZW1teVxuXHRwdWJsaWMgcmVhZG9ubHkgZHJhY29uaWNBbmltYXRpb25NYXA6IFJlY29yZDxBbmltYXRpb25UeXBlLCBzdHJpbmc+O1xuXHQvLyB0aGUgbWFwcGluZ3MgZnJvbSBhbiBhbmltYXRpb24gdHlwZSB0byBhbiBhY3R1YWwgaW1hZ2UgZmlsZSBmb3IgdGhlIG9yaWdpbmFsIGdlbW15XG5cdHB1YmxpYyByZWFkb25seSBvcmlnaW5hbEFuaW1hdGlvbk1hcDogUmVjb3JkPEFuaW1hdGlvblR5cGUsIHN0cmluZz47XG5cblx0Ly8gbWFwcyBhbiBhbmltYXRpb24gc291cmNlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGFuaW1hdGlvbiBtYXBcblx0cHVibGljIHJlYWRvbmx5IGFuaW1hdGlvblNvdXJjZU1hcDogUmVjb3JkPEFuaW1hdGlvblNvdXJjZVR5cGUsIFJlY29yZDxBbmltYXRpb25UeXBlLCBzdHJpbmc+PjtcblxuXHRjb25zdHJ1Y3RvcihwbHVnaW46IEdlbW15UGx1Z2luKSB7XG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cblx0XHR0aGlzLmRyYWNvbmljQW5pbWF0aW9uTWFwID0ge1xuXHRcdFx0W0FuaW1hdGlvblR5cGUuRU1FUkdFXTogRU1FUkdFX01PVElPTl9EUkFDT05JQyxcblx0XHRcdFtBbmltYXRpb25UeXBlLlBPUF9NT1RJT05dOiBQT1BfTU9USU9OX0RSQUNPTklDLFxuXHRcdFx0W0FuaW1hdGlvblR5cGUuRElTQVBQRUFSX01PVElPTl06IERJU0FQUEVBUl9NT1RJT05fRFJBQ09OSUMsXG5cdFx0XHRbQW5pbWF0aW9uVHlwZS5BTkdSWV9NT1RJT05dOiBBTkdSWV9NT1RJT05fRFJBQ09OSUMsXG5cdFx0XHRbQW5pbWF0aW9uVHlwZS5MT09LX01PVElPTl06IExPT0tfTU9USU9OX0RSQUNPTklDLFxuXHRcdFx0W0FuaW1hdGlvblR5cGUuSURMRV9NT1RJT05dOiBJRExFX01PVElPTl9EUkFDT05JQyxcblx0XHRcdFtBbmltYXRpb25UeXBlLkRJU0FQUE9JTlRfSU1HXTogRElTQVBQT0lOVF9JTUdfRFJBQ09OSUMsXG5cdFx0fTtcblxuXHRcdHRoaXMub3JpZ2luYWxBbmltYXRpb25NYXAgPSB7XG5cdFx0XHRbQW5pbWF0aW9uVHlwZS5FTUVSR0VdOiBFTUVSR0VfTU9USU9OX09SSUdJTkFMLFxuXHRcdFx0W0FuaW1hdGlvblR5cGUuUE9QX01PVElPTl06IFBPUF9NT1RJT05fT1JJR0lOQUwsXG5cdFx0XHRbQW5pbWF0aW9uVHlwZS5ESVNBUFBFQVJfTU9USU9OXTogRElTQVBQRUFSX01PVElPTl9PUklHSU5BTCxcblx0XHRcdFtBbmltYXRpb25UeXBlLkFOR1JZX01PVElPTl06IEFOR1JZX01PVElPTl9PUklHSU5BTCxcblx0XHRcdFtBbmltYXRpb25UeXBlLkxPT0tfTU9USU9OXTogTE9PS19NT1RJT05fT1JJR0lOQUwsXG5cdFx0XHRbQW5pbWF0aW9uVHlwZS5JRExFX01PVElPTl06IElETEVfTU9USU9OX09SSUdJTkFMLFxuXHRcdFx0W0FuaW1hdGlvblR5cGUuRElTQVBQT0lOVF9JTUddOiBESVNBUFBPSU5UX0lNR19PUklHSU5BTCxcblx0XHR9O1xuXG5cdFx0dGhpcy5hbmltYXRpb25Tb3VyY2VNYXAgPSB7XG5cdFx0XHRbQW5pbWF0aW9uU291cmNlVHlwZS5EUkFDVE9OSUNdOiB0aGlzLmRyYWNvbmljQW5pbWF0aW9uTWFwLFxuXHRcdFx0W0FuaW1hdGlvblNvdXJjZVR5cGUuT1JJR0lOQUxdOiB0aGlzLm9yaWdpbmFsQW5pbWF0aW9uTWFwLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUGxheXMgYSBnZW1teSBhbmltYXRpb24gaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBhbmltYXRpb24gc291cmNlIHR5cGUgaW5zaWRlIGFuIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbCB0aGUgZWxlbWVudCB0byBwbGF5IHRoZSBhbmltYXRpb24gaW5cblx0ICogQHBhcmFtIGFuaW1hdGlvbiB0aGUgYW5pbWF0aW9uIHRvIHBsYXlcblx0ICovXG5cdHB1YmxpYyBwbGF5KGVsOiBIVE1MRWxlbWVudCwgYW5pbWF0aW9uOiBBbmltYXRpb25UeXBlKTogdm9pZCB7XG5cdFx0Y29uc3QgYW5pbWF0aW9uRmlsZSA9IHRoaXMuYW5pbWF0aW9uU291cmNlTWFwW3RoaXMucGx1Z2luLnNldHRpbmdzLmFuaW1hdGlvblNvdXJjZV1bYW5pbWF0aW9uXTtcblxuXHRcdGVsLnNldEF0dHJpYnV0ZSgnc3JjJywgYW5pbWF0aW9uRmlsZSk7XG5cdH1cbn1cbiIsICJleHBvcnQgY29uc3QgR0VNTVlfSURMRV9RVU9URVMgPSBbXG5cdFwiWW91IGNhbid0IGFycmVzdCB1cyEgV2UgYWxyZWFkeSBhdGUgdGhlIGV2aWRlbmNlIVwiLFxuXHRcIkRvbid0IGV2ZXIgc3BsaXQgdGhlIHBhcnR5IVwiLFxuXHQnSWYgeW91IGtpbGwgYSBoaXZlIG1pbmQsIGlzIHRoYXQgbXVyZGVyIG9yIGdlbm9jaWRlPycsXG5cdCdSb2xsIGluaXRpYXRpdmUhJyxcblx0J1lvdSBjYW4gdHJ5IScsXG5cdFwiSSdtIG5vdCBzaG9ydCwgSSdtIGNvbmNlbnRyYXRlZCBhd2Vzb21lLlwiLFxuXHRcIkknbSBub3QgZ3JlZWR5LCBJJ20ganVzdCBhbGxlcmdpYyB0byBwb3ZlcnR5LlwiLFxuXHRcIkkgZG9uJ3QgYWx3YXlzIGNhc3Qgc3BlbGxzLCBidXQgd2hlbiBJIGRvLCBpdCdzIGZpcmViYWxsLlwiLFxuXHRcIkkgZG9uJ3QgbmVlZCBsdWNrLCBJIGhhdmUgYSBoaWdoIGNoYXJpc21hIHN0YXQuXCIsXG5cdFwiSSBkb24ndCBhbHdheXMgZHJpbmsgYWxlLCBidXQgd2hlbiBJIGRvLCBpdCdzIHdpdGggbXkgZmVsbG93IGFkdmVudHVyZXJzIGFmdGVyIHNsYXlpbmcgYSBkcmFnb24uXCIsXG5cdFwiSSBkb24ndCBhbHdheXMgcm9sbCBhIGNyaXRpY2FsIGhpdCwgYnV0IHdoZW4gSSBkbywgdGhlIERNIGZvcmdldHMgdG8gbWFrZSBtZSByZXJvbGwgdGhlIGRhbWFnZS5cIixcblx0J0kgbWF5IGJlIGNoYW90aWMgbmV1dHJhbCBvbiBwYXBlciwgYnV0IGluIHJlYWxpdHksIEkganVzdCBsaWtlIHRvIHdhdGNoIHRoZSB3b3JsZCBidXJuLicsXG5cdCdJdFx1MjAxOXMgbm90IHN0ZWFsaW5nIGlmIGl0IGJlbG9uZ3MgdG8gYSBkZWFkIGd1eS4nLFxuXHQnV2hvIG5lZWRzIGFuIGFybXkgd2hlbiB5b3UgaGF2ZSBhIGJhZyBvZiBob2xkaW5nIGZ1bGwgb2Ygcm9ja3M/Jyxcblx0J0xldCBtZSBzaG93IHlvdSBob3cgdG8gd2VhciBhIHNuYWtlLicsXG5cdCdXSFkgV09VTEQgWU9VIERPIFRIQVQhJyxcblx0J1RoYXQgZGljZSBuZWVkcyB0byBiZSByZXRpcmVkIScsXG5cdFwiSSBkb24ndCBraWxsIHdpdGhvdXQgcmVhc29uLiBGb3J0dW5hdGVseSwgSSdtIGJvcmVkLiBSZWFzb24gZW5vdWdoIVwiLFxuXHQnQWgsIG15IGZhdm91cmVkIGVuZW15LiBTb21ldGhpbmcgYWxpdmUuJyxcblx0XCJJIHNsYXAgdGhlIGJhcnJlbCB3aXRoIG15IG1lbWJlciEuLi4gdGhlICdiYXJyZWwnIG9wZW4ncyBpdHMgbW91dGghXCIsXG5cdFwiSSdtIG5vdCBkZXByaXZlZCwgSSdtIGRlcHJhdmVkLlwiLFxuXHQnWW91IG5lZWQgYSBmcmVlIGhhbmQgdG8gYXR0ZW1wdCBhIGdyYXBwbGUnLFxuXHRgQ2FyZWZ1bCBob3cgbXVjaCB5b3UgY2Fycnk7IHRoZSBHTSBtaWdodCBhY3R1YWxseSBhc2sgeW91IHRvIGNhbGN1bGF0ZSB5b3VyIGludmVudG9yeSB3ZWlnaHQhYCxcblx0YERvbid0IGRvIHRoYXQhIFRoZW4gd2UnbGwgaGF2ZSB0byBnbyBsb29rIHVwIHRoZSBncmFwcGxlIHJ1bGVzIWAsXG5cdGA1MCBwYWdlIGJhY2tzdG9yeS4uLiBOT1BFYCxcblx0YEl0J3MgYXN0b3VuZGluZyBhbnlvbmUgY2FuIHVuZGVyc3RhbmQgeW91LCB3aXRoIGFsbCB0aG9zZSBOYXQgMSBDaGFyaXNtYSByb2xscy5gLFxuXHRgVGhlIGNoZWRkYXIgbW9ua3MgYXJlIGhlcmUgdG8gc2F2ZSB0aGUgZGF5IWAsXG5cdGBZb3UndmUgYmVlbiBHeWdheGVkLmAsXG5cdGBTVEVQIEFXQVkgRlJPTSBUSEUgUFVSQ0hBU0UgTU9SRSBESUNFIEJVVFRPTmAsXG5cdGBBZnRlciB0aG91c2FuZHMgb2YgeWVhcnMsIEkgaGF2ZSBhdHRhaW5lZCBteSBjdXJyZW50IHN0YXRlLCB3aGlsZSB5b3Ugc3RydWdnbGUgdG8gY29tcGxldGUgdGhpcyBzaW1wbGUgbm90ZS5gLFxuXHRgWW91IGFyZSBhIGJhY2tncm91bmQgY2hhcmFjdGVyIGluIHlvdXIgb3duIGxpZmUuYCxcbl07XG5cbmV4cG9ydCBjb25zdCBXUklUSU5HX01PREVfUVVPVEVTID0gW1xuXHRgUGxheWVyJ3MgZG9udCB0YWtlIG5vdGVzLi4uIG1heWJlIHlvdSBzaG91bGQgdHJ5IHRoYXQ/YCxcblx0YElzIHRoYXQgdGhlIGJlc3QgeW91IGNhbiBkbz8gS2VlcCB3cml0aW5nIWAsXG5cdGBXcml0ZSBmaXJzdCwgZWRpdG9yIGxhdGVyLmAsXG5cdGBBSSBjb3VsZCBwcm9iYWJseSB3cml0ZSBhIGJldHRlciBub3RlLi4uYCxcblx0YEkgbG92ZSBoZWFyaW5nIHlvdXIga2V5Ym9hcmQuIERvbid0IHN0b3AuYCxcblx0YEhvdyBhYm91dCB3ZSByZXZpZXcgc29tZSBvbGQgbm90ZXMgdG9kYXk/YCxcblx0YFdoeSBub3QganVzdCB1c2UgYSB0ZW1wbGF0ZT9gLFxuXHRgRG9lc24ndCBtYXR0ZXIgaG93IG11Y2ggeW91IHBsYW4uLi4gdGhleSB3aWxsIGRlcmFpbCBhbnl3YXkhYCxcblx0YE1heWJlIGl0J3MgdGltZSB0byBnbyBnZXQgc29tZSB3YXRlciBvciBjb2ZmZWUuYCxcblx0YFRoYXQncyBub3QgaG93IHJpdmVycyBhcmUgaW4gcmVhbC1saWZlLi4uYCxcblx0YEFueXRoaW5nIGlzIGJldHRlciB0aGFuIGEgYmxhbmsgcGFnZSwgZXZlbiBtZS4gV3JpdGUgc29tZXRoaW5nIWAsXG5cdGBIYXZlIHlvdSBnaXZlbiBvdXQgSW5zcGlyYXRpb24gcmVjZW50bHk/YCxcblx0YENhbGwgbWUgSmVldmVzLiBJLiBEYXJlLiBZb3UuYCxcblx0YEkgY2FzdCAnU3VtbW9uIEJpZ2dlciBGaXNoYCxcblx0YERvIHlvdSB0b3VjaCBpdD9gLFxuXHRgV2hhdCB3b3VsZCBNYXR0IE1lcmNlciBkbz9gLFxuXHRgVG8gY29udGludWUsIHBsZWFzZSBpbnNlcnQgbW9yZSBjcmVkaXRzYCxcblx0YEhhdmUgeW91IGNvbnNpZGVyZWQganVzdC4uLiBOb3Q/YCxcbl07XG4iLCAiaW1wb3J0IHsgQW5pbWF0aW9ucywgQW5pbWF0aW9uVHlwZSB9IGZyb20gJy4vQW5pbWF0aW9ucyc7XG5pbXBvcnQgR2VtbXlQbHVnaW4gZnJvbSAnLi9tYWluJztcbmltcG9ydCB7IEdFTU1ZX0lETEVfUVVPVEVTLCBXUklUSU5HX01PREVfUVVPVEVTIH0gZnJvbSAnLi9RdW90ZXMnO1xuXG5jb25zdCBCVUJCTEVfRFVSQVRJT046IG51bWJlciA9IDUwMDA7XG5cbmV4cG9ydCBlbnVtIEdlbW15U3RhdGUge1xuXHRWSVNJQkxFID0gXCJWSVNJQkxFXCIsXG5cdElOVklTSUJMRSA9IFwiSU5WSVNJQkxFXCIsXG5cdERJU0FQUEVBUklORyA9IFwiRElTQVBQRUFSSU5HXCIsXG5cdEFQUEVBUklORyA9IFwiQVBQRUFSSU5HXCIsXG59XG5cbmV4cG9ydCBjbGFzcyBHZW1teSB7XG5cdHB1YmxpYyByZWFkb25seSBwbHVnaW46IEdlbW15UGx1Z2luO1xuXHRwcml2YXRlIHJlYWRvbmx5IGFuaW1hdGlvbnM6IEFuaW1hdGlvbnM7XG5cblx0Z2VtbXlFbDogSFRNTEVsZW1lbnQ7XG5cdGltYWdlRWw6IEhUTUxFbGVtZW50O1xuXG5cdHN0YXRlOiBHZW1teVN0YXRlO1xuXHRpbldyaXRpbmdNb2RlOiBib29sZWFuID0gZmFsc2U7XG5cblx0aWRsZVRpbWVvdXQ6IG51bWJlcjtcblx0d3JpdGluZ01vZGVUaW1lb3V0OiBudW1iZXI7XG5cblx0Y29uc3RydWN0b3IocGx1Z2luOiBHZW1teVBsdWdpbikge1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXG5cdFx0dGhpcy5hbmltYXRpb25zID0gbmV3IEFuaW1hdGlvbnModGhpcy5wbHVnaW4pO1xuXG5cdFx0dGhpcy5zdGF0ZSA9IEdlbW15U3RhdGUuSU5WSVNJQkxFO1xuXG5cdFx0dGhpcy5jcmVhdGVHZW1teUVsKCk7XG5cblx0XHR0aGlzLnN0YXJ0TmV4dElkbGVUaW1lb3V0KCk7XG5cdH1cblxuXHRjcmVhdGVHZW1teUVsKCkge1xuXHRcdHRoaXMuZ2VtbXlFbCA9IGNyZWF0ZURpdignZ2VtbXktY29udGFpbmVyJyk7XG5cdFx0dGhpcy5nZW1teUVsLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbC1wb3NpdGlvbicsICd0b3AnKTtcblx0XHR0aGlzLmdlbW15RWwuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsLWRlbGF5JywgJzAnKTtcblx0XHR0aGlzLmdlbW15RWwuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsLWNsYXNzZXMnLCAnZ2VtbXktdG9vbHRpcCcpO1xuXG5cdFx0dGhpcy5pbWFnZUVsID0gdGhpcy5nZW1teUVsLmNyZWF0ZUVsKCdpbWcnLCB7fSk7XG5cblx0XHR0aGlzLmdlbW15RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsICgpID0+IHtcblx0XHRcdC8vIGlnbm9yZSBtb3VzZSBldmVudHMgaW4gd3JpdGluZyBtb2RlXG5cdFx0XHRpZiAodGhpcy5pbldyaXRpbmdNb2RlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zYXlTb21ldGhpbmcoR0VNTVlfSURMRV9RVU9URVMsIHRydWUpO1xuXHRcdFx0dGhpcy5pZGxlVGltZW91dCAmJiBjbGVhclRpbWVvdXQodGhpcy5pZGxlVGltZW91dCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmdlbW15RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcblx0XHRcdC8vIGlnbm9yZSBtb3VzZSBldmVudHMgaW4gd3JpdGluZyBtb2RlXG5cdFx0XHRpZiAodGhpcy5pbldyaXRpbmdNb2RlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5hbmltYXRpb25zLnBsYXkodGhpcy5pbWFnZUVsLCBBbmltYXRpb25UeXBlLklETEVfTU9USU9OKTtcblx0XHRcdHRoaXMuc3RhcnROZXh0SWRsZVRpbWVvdXQoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuZ2VtbXlFbC5oaWRkZW4gPSB0cnVlO1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5nZW1teUVsKTtcblx0fVxuXG5cdGFzeW5jIGFwcGVhcigpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5zdGF0ZSA9PT0gR2VtbXlTdGF0ZS5BUFBFQVJJTkcgfHwgdGhpcy5zdGF0ZSA9PT0gR2VtbXlTdGF0ZS5WSVNJQkxFKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gc2hvdyBoaW1cblx0XHR0aGlzLnN0YXRlID0gR2VtbXlTdGF0ZS5BUFBFQVJJTkc7XG5cdFx0dGhpcy5nZW1teUVsLmhpZGRlbiA9IGZhbHNlO1xuXG5cdFx0Ly8gUXVpY2tlciBpZiB3ZSdyZSBpbiB3cml0aW5nIG1vZGVcblx0XHRpZiAodGhpcy5pbldyaXRpbmdNb2RlKSB7XG5cdFx0XHR0aGlzLmFuaW1hdGlvbnMucGxheSh0aGlzLmltYWdlRWwsIEFuaW1hdGlvblR5cGUuUE9QX01PVElPTik7XG5cblx0XHRcdGF3YWl0IHNsZWVwKDE4MDApO1xuXG5cdFx0XHQvLyBhbm90aGVyIGFuaW1hdGlvbiBvdmVycm9kZSB0aGlzIGFuaW1hdGlvbiwgc28gd2UgcXVpdFxuXHRcdFx0aWYgKHRoaXMuc3RhdGUgIT09IEdlbW15U3RhdGUuQVBQRUFSSU5HKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zdGF0ZSA9IEdlbW15U3RhdGUuVklTSUJMRTtcblx0XHRcdHRoaXMuc2F5U29tZXRoaW5nKFdSSVRJTkdfTU9ERV9RVU9URVMsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmFuaW1hdGlvbnMucGxheSh0aGlzLmltYWdlRWwsIEFuaW1hdGlvblR5cGUuRU1FUkdFKTtcblxuXHRcdFx0YXdhaXQgc2xlZXAoMzgwMCk7XG5cblx0XHRcdC8vIGFub3RoZXIgYW5pbWF0aW9uIG92ZXJyb2RlIHRoaXMgYW5pbWF0aW9uLCBzbyB3ZSBxdWl0XG5cdFx0XHRpZiAodGhpcy5zdGF0ZSAhPT0gR2VtbXlTdGF0ZS5BUFBFQVJJTkcpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnN0YXRlID0gR2VtbXlTdGF0ZS5WSVNJQkxFO1xuXHRcdFx0dGhpcy5hbmltYXRpb25zLnBsYXkodGhpcy5pbWFnZUVsLCBBbmltYXRpb25UeXBlLklETEVfTU9USU9OKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBkaXNhcHBlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gZG9uJ3QgbWFrZSBnZW1teSBkaXNhcHBlYXIgd2hpbGUgaGUgaXMgYWxyZWFkeSBsZWF2aW5nXG5cdFx0aWYgKHRoaXMuc3RhdGUgPT09IEdlbW15U3RhdGUuRElTQVBQRUFSSU5HIHx8IHRoaXMuc3RhdGUgPT09IEdlbW15U3RhdGUuSU5WSVNJQkxFKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5zdGF0ZSA9IEdlbW15U3RhdGUuRElTQVBQRUFSSU5HXG5cblx0XHRpZiAodGhpcy5pZGxlVGltZW91dCkgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmlkbGVUaW1lb3V0KTtcblx0XHRpZiAodGhpcy53cml0aW5nTW9kZVRpbWVvdXQpIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53cml0aW5nTW9kZVRpbWVvdXQpO1xuXG5cdFx0dGhpcy5hbmltYXRpb25zLnBsYXkodGhpcy5pbWFnZUVsLCBBbmltYXRpb25UeXBlLkRJU0FQUEVBUl9NT1RJT04pO1xuXHRcdC8vIHJlbW90ZSB0b29sdGlwXG5cdFx0dGhpcy5nZW1teUVsLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ21vdXNlb3V0JywgeyBidWJibGVzOiB0cnVlLCBjbGllbnRYOiAxMCwgY2xpZW50WTogMTAgfSkpO1xuXG5cdFx0YXdhaXQgc2xlZXAoMTMwMCk7XG5cblx0XHQvLyBhbm90aGVyIGFuaW1hdGlvbiBvdmVycm9kZSB0aGlzIGFuaW1hdGlvbiwgc28gd2UgcXVpdFxuXHRcdGlmICh0aGlzLnN0YXRlICE9PSBHZW1teVN0YXRlLkRJU0FQUEVBUklORykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RhdGUgPSBHZW1teVN0YXRlLklOVklTSUJMRTtcblx0XHR0aGlzLmdlbW15RWwuaGlkZGVuID0gdHJ1ZTtcblx0fVxuXG5cdGFzeW5jIHJlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLnN0YXRlID09PSBHZW1teVN0YXRlLkRJU0FQUEVBUklORyB8fCB0aGlzLnN0YXRlID09PSBHZW1teVN0YXRlLklOVklTSUJMRSkge1xuXHRcdFx0YXdhaXQgdGhpcy5hcHBlYXIoKTtcblx0XHR9XG5cblx0XHR0aGlzLmFuaW1hdGlvbnMucGxheSh0aGlzLmltYWdlRWwsIEFuaW1hdGlvblR5cGUuSURMRV9NT1RJT04pO1xuXHR9XG5cblx0b25FZGl0b3JDaGFuZ2UoKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLmluV3JpdGluZ01vZGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zdGF0ZSAhPT0gR2VtbXlTdGF0ZS5ESVNBUFBFQVJJTkcgJiYgdGhpcy5zdGF0ZSAhPT0gR2VtbXlTdGF0ZS5JTlZJU0lCTEUpIHtcblx0XHRcdHRoaXMuZGlzYXBwZWFyKCk7XG5cdFx0fVxuXHRcdHRoaXMuc2V0V3JpdGluZ01vZGVUaW1lb3V0KCk7XG5cdH1cblxuXHRlbnRlcldyaXRpbmdNb2RlKCk6IHZvaWQge1xuXHRcdHRoaXMuaW5Xcml0aW5nTW9kZSA9IHRydWU7XG5cdFx0dGhpcy5kaXNhcHBlYXIoKTtcblxuXHRcdHRoaXMuc2V0V3JpdGluZ01vZGVUaW1lb3V0KCk7XG5cdH1cblxuXHRsZWF2ZVdyaXRpbmdNb2RlKCkge1xuXHRcdHRoaXMuaW5Xcml0aW5nTW9kZSA9IGZhbHNlO1xuXHRcdHRoaXMucmVzZXQoKTtcblxuXHRcdHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53cml0aW5nTW9kZVRpbWVvdXQpO1xuXHR9XG5cblx0c2V0V3JpdGluZ01vZGVUaW1lb3V0KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLndyaXRpbmdNb2RlVGltZW91dCkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCh0aGlzLndyaXRpbmdNb2RlVGltZW91dCk7XG5cdFx0fVxuXG5cdFx0dGhpcy53cml0aW5nTW9kZVRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5pbldyaXRpbmdNb2RlKSB7XG5cdFx0XHRcdHRoaXMuYXBwZWFyKCk7XG5cdFx0XHR9XG5cdFx0fSwgdGhpcy5wbHVnaW4uc2V0dGluZ3Mud3JpdGluZ01vZGVHcmFjZVBlcmlvZCAqIDEwMDApO1xuXHR9XG5cblx0c3RhcnROZXh0SWRsZVRpbWVvdXQoKTogdm9pZCB7XG5cdFx0Ly8gaWYgdGhlIHNldCB0aW1lIGlzIDUgbWludXRlcywgdGhpcyB3aWxsIHNldCB0aW1lb3V0IHRvIGJlIGEgcmFuZG9tIHRpbWUgYmV0d2VlbiA0LTYgbWludXRlc1xuXHRcdC8vIHRoZSByYW5nZSB3aWxsIGJlIDgwJSAtIDEyMCVcblx0XHRjb25zdCByYW5kb21GYWN0b3IgPSAwLjggKyAwLjQgKiBNYXRoLnJhbmRvbSgpO1xuXHRcdGNvbnN0IHJhbmRvbWl6ZWRUaW1lb3V0ID0gcmFuZG9tRmFjdG9yICogdGhpcy5wbHVnaW4uc2V0dGluZ3MuaWRsZVRhbGtGcmVxdWVuY3kgKiA2MDAwMDtcblxuXHRcdGlmICh0aGlzLmlkbGVUaW1lb3V0KSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuaWRsZVRpbWVvdXQpO1xuXHRcdH1cblxuXHRcdHRoaXMuaWRsZVRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5pbldyaXRpbmdNb2RlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zYXlTb21ldGhpbmcoR0VNTVlfSURMRV9RVU9URVMsIGZhbHNlKTtcblx0XHRcdHRoaXMuc3RhcnROZXh0SWRsZVRpbWVvdXQoKTtcblx0XHR9LCByYW5kb21pemVkVGltZW91dCk7XG5cdH1cblxuXHRhc3luYyBzYXlTb21ldGhpbmcocXVvdGVzOiBzdHJpbmdbXSwgcGVyc2lzdGVudDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLnN0YXRlICE9PSBHZW1teVN0YXRlLlZJU0lCTEUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCByYW5kb21UaGluZyA9IHF1b3Rlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBxdW90ZXMubGVuZ3RoKV07XG5cblx0XHR0aGlzLmdlbW15RWwuc2V0QXR0cignYXJpYS1sYWJlbCcsIHJhbmRvbVRoaW5nKTtcblx0XHR0aGlzLmdlbW15RWwuc2V0QXR0cignYXJpYS1sYWJlbC1wb3NpdGlvbicsICd0b3AnKTtcblx0XHR0aGlzLmdlbW15RWwuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2VvdmVyJywgeyBidWJibGVzOiB0cnVlLCBjbGllbnRYOiAxMCwgY2xpZW50WTogMTAgfSkpO1xuXG5cdFx0aWYgKHRoaXMuaW5Xcml0aW5nTW9kZSkge1xuXHRcdFx0dGhpcy5hbmltYXRpb25zLnBsYXkodGhpcy5pbWFnZUVsLCBBbmltYXRpb25UeXBlLkFOR1JZX01PVElPTik7XG5cblx0XHRcdGF3YWl0IHNsZWVwKDEwMDApO1xuXG5cdFx0XHR0aGlzLmFuaW1hdGlvbnMucGxheSh0aGlzLmltYWdlRWwsIEFuaW1hdGlvblR5cGUuRElTQVBQT0lOVF9JTUcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmFuaW1hdGlvbnMucGxheSh0aGlzLmltYWdlRWwsIEFuaW1hdGlvblR5cGUuTE9PS19NT1RJT04pO1xuXHRcdH1cblxuXHRcdGlmICghcGVyc2lzdGVudCkge1xuXHRcdFx0YXdhaXQgc2xlZXAoQlVCQkxFX0RVUkFUSU9OKTtcblxuXHRcdFx0dGhpcy5nZW1teUVsLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ21vdXNlb3V0JywgeyBidWJibGVzOiB0cnVlLCBjbGllbnRYOiAxMCwgY2xpZW50WTogMTAgfSkpO1xuXHRcdFx0dGhpcy5hbmltYXRpb25zLnBsYXkodGhpcy5pbWFnZUVsLCBBbmltYXRpb25UeXBlLklETEVfTU9USU9OKTtcblx0XHR9XG5cdH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQSxtQkFBaUM7OztBQ0FqQyxzQkFBK0M7QUFpQnhDLElBQU0sbUJBQWtDO0FBQUEsRUFDOUMsaUJBQWlCO0FBQUEsRUFDakIsbUJBQW1CO0FBQUEsRUFDbkIsd0JBQXdCO0FBQ3pCO0FBRU8sSUFBTSxrQkFBTixjQUE4QixpQ0FBaUI7QUFBQSxFQUdyRCxZQUFZLEtBQVUsUUFBcUI7QUFDMUMsVUFBTSxLQUFLLE1BQU07QUFDakIsU0FBSyxTQUFTO0FBQUEsRUFDZjtBQUFBLEVBRUEsVUFBZ0I7QUFDZixVQUFNLEVBQUUsWUFBWSxJQUFJO0FBRXhCLGdCQUFZLE1BQU07QUFFbEIsUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsa0JBQWtCLEVBQzFCLFFBQVEsd0NBQXdDLEVBQ2hEO0FBQUEsTUFBWSxjQUNaLFNBQ0UsVUFBVSwyQkFBOEIsVUFBVSxFQUNsRCxVQUFVLDRCQUErQixVQUFVLEVBQ25ELFNBQVMsS0FBSyxPQUFPLFNBQVMsZUFBZSxFQUM3QyxTQUFTLE9BQU0sVUFBUztB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LFNBQUssV0FBVztBQUFBLE1BQ2YsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sVUFBVSxNQUFNO0FBQ2YsYUFBSyxNQUFNLFVBQVU7QUFBQSxNQUN0QjtBQUFBLElBQ0QsQ0FBQztBQUVELFNBQUssV0FBVztBQUFBLE1BQ2YsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sVUFBVSxNQUFNO0FBQ2YsYUFBSyxNQUFNLGlCQUFpQjtBQUFBLE1BQzdCO0FBQUEsSUFDRCxDQUFDO0FBRUQsU0FBSyxXQUFXO0FBQUEsTUFDZixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixVQUFVLE1BQU07QUFDZixhQUFLLE1BQU0saUJBQWlCO0FBQUEsTUFDN0I7QUFBQSxJQUNELENBQUM7QUFHRCxTQUFLLGNBQWMsSUFBSSxnQkFBZ0IsS0FBSyxLQUFLLElBQUksQ0FBQztBQUd0RCxTQUFLO0FBQUEsTUFDSixLQUFLLElBQUksVUFBVTtBQUFBLFFBQ2xCO0FBQUEsWUFDQSwyQkFBUyxNQUFNO0FBQ2QsZUFBSyxNQUFNLGVBQWU7QUFBQSxRQUMzQixHQUFHLEdBQUc7QUFBQSxNQUNQO0FBQUEsSUFDRDtBQUVBLFNBQUssSUFBSSxVQUFVLGNBQWMsTUFBTSxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQUEsRUFDM0Q7QUFBQSxFQUVBLFdBQVc7QUFDVixTQUFLLE1BQU0sVUFBVTtBQUFBLEVBQ3RCO0FBQUEsRUFFQSxNQUFNLGVBQWU7QUFDcEIsU0FBSyxXQUFXLE9BQU8sT0FBTyxDQUFDLEdBQUcsa0JBQWtCLE1BQU0sS0FBSyxTQUFTLENBQUM7QUFBQSxFQUMxRTtBQUFBLEVBRUEsTUFBTSxlQUFlO0FBQ3BCLFVBQU0sS0FBSyxTQUFTLEtBQUssUUFBUTtBQUFBLEVBQ2xDO0FBQ0Q7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJnZW1teV9lbWVyZ2VfZGVmYXVsdCIsICJnZW1teV9wb3BfZGVmYXVsdCIsICJnZW1teV9kaXNhcHBlYXJfZGVmYXVsdCIsICJnZW1teV9hbmdyeV9kZWZhdWx0IiwgImdlbW15X2xvb2tBcm91bmRfZGVmYXVsdCIsICJnZW1teV9pZGxlX2RlZmF1bHQiLCAiZ2VtbXlfZGlzYXBwb2ludF9kZWZhdWx0Il0KfQo= diff --git a/src/Gemmy.ts b/src/Gemmy.ts index c3296ee..037a0a0 100644 --- a/src/Gemmy.ts +++ b/src/Gemmy.ts @@ -4,6 +4,13 @@ import { GEMMY_IDLE_QUOTES, WRITING_MODE_QUOTES } from './Quotes'; const BUBBLE_DURATION: number = 5000; +export enum GemmyState { + VISIBLE = 'VISIBLE', + INVISIBLE = 'INVISIBLE', + DISAPPEARING = 'DISAPPEARING', + APPEARING = 'APPEARING', +} + export class Gemmy { public readonly plugin: GemmyPlugin; private readonly animations: Animations; @@ -11,19 +18,19 @@ export class Gemmy { gemmyEl: HTMLElement; imageEl: HTMLElement; - appeared: boolean = false; - isDisappearing: boolean = false; + state: GemmyState; inWritingMode: boolean = false; idleTimeout: number; writingModeTimeout: number; - disappearTimeout: number; constructor(plugin: GemmyPlugin) { this.plugin = plugin; this.animations = new Animations(this.plugin); + this.state = GemmyState.INVISIBLE; + this.createGemmyEl(); this.startNextIdleTimeout(); @@ -38,6 +45,7 @@ export class Gemmy { this.imageEl = this.gemmyEl.createEl('img', {}); this.gemmyEl.addEventListener('mouseenter', () => { + // ignore mouse events in writing mode if (this.inWritingMode) { return; } @@ -47,6 +55,7 @@ export class Gemmy { }); this.gemmyEl.addEventListener('mouseleave', () => { + // ignore mouse events in writing mode if (this.inWritingMode) { return; } @@ -54,64 +63,80 @@ export class Gemmy { this.animations.play(this.imageEl, AnimationType.IDLE_MOTION); this.startNextIdleTimeout(); }); + + this.gemmyEl.hidden = true; + document.body.appendChild(this.gemmyEl); } - appear() { - console.log('gemmy appear'); - - // stop him from leaving - window.clearTimeout(this.disappearTimeout); - this.isDisappearing = false; + async appear(): Promise { + if (this.state === GemmyState.APPEARING || this.state === GemmyState.VISIBLE) { + return; + } // show him - this.animations.play(this.imageEl, AnimationType.EMERGE); + this.state = GemmyState.APPEARING; + this.gemmyEl.hidden = false; // Quicker if we're in writing mode if (this.inWritingMode) { this.animations.play(this.imageEl, AnimationType.POP_MOTION); - window.setTimeout(() => { - this.appeared = true; + await sleep(1800); - this.saySomething(WRITING_MODE_QUOTES, true); - }, 1800); + // another animation overrode this animation, so we quit + if (this.state !== GemmyState.APPEARING) { + return; + } + + this.state = GemmyState.VISIBLE; + this.saySomething(WRITING_MODE_QUOTES, true); } else { this.animations.play(this.imageEl, AnimationType.EMERGE); - window.setTimeout(() => { - this.animations.play(this.imageEl, AnimationType.IDLE_MOTION); - this.appeared = true; - }, 3800); - } + await sleep(3800); - document.body.appendChild(this.gemmyEl); - this.gemmyEl.hidden = false; - this.appeared = true; + // another animation overrode this animation, so we quit + if (this.state !== GemmyState.APPEARING) { + return; + } + + this.state = GemmyState.VISIBLE; + this.animations.play(this.imageEl, AnimationType.IDLE_MOTION); + } } - disappear() { + async disappear(): Promise { // don't make gemmy disappear while he is already leaving - if (this.isDisappearing) { + if (this.state === GemmyState.DISAPPEARING || this.state === GemmyState.INVISIBLE) { return; } - this.isDisappearing = true; + this.state = GemmyState.DISAPPEARING; - this.idleTimeout && window.clearTimeout(this.idleTimeout); - this.writingModeTimeout && window.clearTimeout(this.writingModeTimeout); + if (this.idleTimeout) window.clearTimeout(this.idleTimeout); + if (this.writingModeTimeout) window.clearTimeout(this.writingModeTimeout); this.animations.play(this.imageEl, AnimationType.DISAPPEAR_MOTION); // remote tooltip this.gemmyEl.dispatchEvent(new MouseEvent('mouseout', { bubbles: true, clientX: 10, clientY: 10 })); - this.disappearTimeout = window.setTimeout(() => { - // gemmy finished leaving - this.gemmyEl.hidden = true; - this.appeared = false; - this.isDisappearing = false; - }, 1300); + await sleep(1300); - // this.appeared = false; + // another animation overrode this animation, so we quit + if (this.state !== GemmyState.DISAPPEARING) { + return; + } + + this.state = GemmyState.INVISIBLE; + this.gemmyEl.hidden = true; + } + + async reset(): Promise { + if (this.state === GemmyState.DISAPPEARING || this.state === GemmyState.INVISIBLE) { + await this.appear(); + } + + this.animations.play(this.imageEl, AnimationType.IDLE_MOTION); } onEditorChange(): void { @@ -119,11 +144,13 @@ export class Gemmy { return; } - this.disappear(); + if (this.state !== GemmyState.DISAPPEARING && this.state !== GemmyState.INVISIBLE) { + this.disappear(); + } this.setWritingModeTimeout(); } - enterWritingMode() { + enterWritingMode(): void { this.inWritingMode = true; this.disappear(); @@ -132,12 +159,12 @@ export class Gemmy { leaveWritingMode() { this.inWritingMode = false; - this.appear(); + this.reset(); window.clearTimeout(this.writingModeTimeout); } - setWritingModeTimeout() { + setWritingModeTimeout(): void { if (this.writingModeTimeout) { window.clearTimeout(this.writingModeTimeout); } @@ -149,7 +176,7 @@ export class Gemmy { }, this.plugin.settings.writingModeGracePeriod * 1000); } - startNextIdleTimeout() { + startNextIdleTimeout(): void { // if the set time is 5 minutes, this will set timeout to be a random time between 4-6 minutes // the range will be 80% - 120% const randomFactor = 0.8 + 0.4 * Math.random(); @@ -169,13 +196,11 @@ export class Gemmy { }, randomizedTimeout); } - saySomething(quotes: string[], persistent: boolean) { - if (!this.appeared) { + async saySomething(quotes: string[], persistent: boolean): Promise { + if (this.state !== GemmyState.VISIBLE) { return; } - console.log(this.inWritingMode); - const randomThing = quotes[Math.floor(Math.random() * quotes.length)]; this.gemmyEl.setAttr('aria-label', randomThing); @@ -185,18 +210,18 @@ export class Gemmy { if (this.inWritingMode) { this.animations.play(this.imageEl, AnimationType.ANGRY_MOTION); - window.setTimeout(() => { - this.animations.play(this.imageEl, AnimationType.DISAPPOINT_IMG); - }, 1000); + await sleep(1000); + + this.animations.play(this.imageEl, AnimationType.DISAPPOINT_IMG); } else { this.animations.play(this.imageEl, AnimationType.LOOK_MOTION); } if (!persistent) { - window.setTimeout(() => { - this.gemmyEl.dispatchEvent(new MouseEvent('mouseout', { bubbles: true, clientX: 10, clientY: 10 })); - this.animations.play(this.imageEl, AnimationType.IDLE_MOTION); - }, BUBBLE_DURATION); + await sleep(BUBBLE_DURATION); + + this.gemmyEl.dispatchEvent(new MouseEvent('mouseout', { bubbles: true, clientX: 10, clientY: 10 })); + this.animations.play(this.imageEl, AnimationType.IDLE_MOTION); } } } diff --git a/src/Setting.ts b/src/Setting.ts index ae92778..403a5e9 100644 --- a/src/Setting.ts +++ b/src/Setting.ts @@ -48,7 +48,7 @@ export class GemmySettingTab extends PluginSettingTab { this.plugin.settings.animationSource = animationSource; // Show Gemmy with the new animations after changing the source - this.plugin.gemmy.appear(); + this.plugin.gemmy.reset(); await this.plugin.saveSettings(); }),