import { $t as e, A as t, B as n, C as r, D as i, E as a, Ft as o, G as s, Gt as c, H as l, Ht as u, It as d, J as f, Jt as p, Kt as m, L as h, Lt as g, M as _, N as v, O as y, P as b, Qt as x, Rt as S, S as C, Tt as w, U as T, V as E, Vt as D, W as O, Zt as k, _ as A, _t as j, b as M, bt as N, c as P, d as F, dt as ee, en as te, f as I, ft as ne, g as re, gt as ie, h as ae, ht as oe, in as se, j as ce, k as le, kt as ue, l as de, lt as fe, m as pe, mt as me, nn as he, o as ge, ot as _e, pt as ve, q as ye, qt as be, rn as xe, s as Se, tn as Ce, u as we, vt as Te, w as Ee, y as De, yt as Oe, z as ke, zt as Ae } from "./chunks/viewerRuntimeHosts-DC1iA_jY.js"; import { $ as je, A as Me, Ct as Ne, F as Pe, G as Fe, H as Ie, K as Le, L as Re, Q as ze, St as Be, U as Ve, W as He, X as Ue, Z as We, _ as Ge, at as Ke, bt as qe, ct as Je, dt as Ye, et as Xe, ft as Ze, g as Qe, h as $e, it as et, j as tt, lt as L, m as R, n as nt, o as z, ot as rt, pt as it, q as at, r as B, rt as ot, st, t as ct, tt as lt, ut, xt as dt, yt as ft } from "./chunks/events-DjjLASfV.js"; import { a as pt, i as mt, n as ht, t as gt } from "./chunks/graphTraversal-BIYmTTPW.js"; import { A as _t, B as vt, C as yt, D as bt, E as xt, F as St, G as Ct, H as wt, I as Tt, J as Et, L as Dt, M as Ot, N as kt, O as At, P as jt, R as Mt, S as Nt, T as Pt, U as Ft, V as It, W as Lt, Y as Rt, _ as zt, b as Bt, d as Vt, g as Ht, j as Ut, k as Wt, q as Gt, v as Kt, x as qt, y as Jt, z as Yt } from "./chunks/Viewer-GH30s1No.js"; import { $ as Xt, A as Zt, B as Qt, C as $t, D as en, E as tn, F as nn, G as rn, H as an, I as on, J as sn, K as cn, L as ln, M as un, N as dn, O as fn, P as pn, Q as mn, R as hn, S as gn, T as _n, U as vn, V as yn, W as bn, X as xn, Y as Sn, Z as Cn, a as wn, c as Tn, d as En, f as Dn, g as On, h as kn, i as An, j as jn, k as Mn, l as Nn, m as Pn, n as Fn, o as In, p as Ln, q as Rn, s as zn, t as Bn, u as Vn, w as Hn, z as Un } from "./chunks/SidebarWorkflowSection-DckvqBNY.js"; import { _ as Wn, i as Gn, n as Kn, p as qn, t as Jn } from "./chunks/openMajoorSettings-CHrLP8DR.js"; import { a as Yn, c as Xn, l as Zn, o as Qn, s as $n, u as er } from "./chunks/floatingViewerManager-BVG4XDLW.js"; import { A as tr, B as V, C as H, D as nr, E as U, F as rr, G as ir, H as ar, I as or, J as sr, K as cr, L as lr, M as ur, N as dr, O as W, R as fr, S as pr, T as G, U as mr, V as hr, W as gr, b as _r, ct as K, dt as q, et as vr, it as yr, j as J, k as Y, lt as X, nt as Z, q as Q, rt as br, st as xr, tt as Sr, ut as Cr, v as wr, w as Tr, x as Er, y as Dr, z as Or } from "./chunks/mjr-primevue-DtKnnCVn.js"; import { n as kr, r as Ar } from "./chunks/mjr-vue-vendor-BU1tBlvz.js"; import { t as jr } from "./chunks/TagsEditor-B8xpRa5e.js"; import { app as Mr } from "../../scripts/app.js"; function Nr(e = null) { return null; } function Pr() { return null; } try { typeof window < "u" && lt && lt.LIST; } catch {} //#endregion //#region ui/integration/comfy_send_to_am.ts var Fr = "MajoorAssetsManager.SendTo", Ir = "Send to Asset Manager", Lr = /* @__PURE__ */ new Set([ "SaveImage", "PreviewImage", "VHS_VideoCombine", "VHS_SaveImageSequence", "Image Save", "SaveAnimatedWEBP", "SaveAnimatedPNG", "SaveAudio" ]); function Rr(e) { let t = String(e?.comfyClass || e?.type || "").trim(); return Lr.has(t); } function zr(e) { let t = []; try { let n = e?.imgs && Array.isArray(e.imgs) ? e.imgs : null, r = []; if (Array.isArray(e?.images) && r.push(...e.images), Array.isArray(e?.output?.images) && r.push(...e.output.images), Array.isArray(e?.output?.gifs) && r.push(...e.output.gifs), Array.isArray(e?.outputs)) for (let t of e.outputs) t && Array.isArray(t.images) && r.push(...t.images), t && Array.isArray(t.gifs) && r.push(...t.gifs); for (let e of r) { if (!e || typeof e != "object") continue; let n = String(e.filename || "").trim(); n && t.push({ filename: n, subfolder: String(e.subfolder || ""), type: String(e.type || "output") }); } if (t.length === 0 && n && n.length) for (let e of n) try { let n = e?.src ? new URL(e.src, window.location.origin) : null; if (!n) continue; let r = n.searchParams.get("filename"); if (!r) continue; t.push({ filename: r, subfolder: n.searchParams.get("subfolder") || "", type: n.searchParams.get("type") || "output" }); } catch {} } catch {} return t; } async function Br(e) { let t = tt(), n = Me(t); if (!e.length) { at({ severity: "warn", summary: "Majoor Assets Manager", detail: "No output to send (run the node first).", life: 3500 }); return; } if (!n || typeof n.fetchApi != "function") { at({ severity: "error", summary: "Majoor Assets Manager", detail: "ComfyUI API unavailable.", life: 4e3 }); return; } try { let r = await n.fetchApi("/mjr/am/integration/send-from-node", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ items: e }) }); if (!r.ok && r.status !== 404) throw Error(`HTTP ${r.status}`); Ge(t, "majoor-assets"), at({ severity: "success", summary: "Majoor Assets Manager", detail: `Sent ${e.length} item(s) to the asset grid.`, life: 2500 }); } catch (e) { at({ severity: "error", summary: "Majoor Assets Manager", detail: `Failed to send: ${e?.message || e}`, life: 4e3 }); } } function Vr() { let e = tt(); if (!e || typeof e.registerExtension != "function") { setTimeout(Vr, 100); return; } e.registerExtension({ name: Fr, getNodeMenuItems(e) { try { return Rr(e) ? [{ content: Ir, callback: () => { Br(zr(e)); } }] : []; } catch { return []; } } }); } Vr(); //#endregion //#region ui/integration/majoor_save_placeholders.ts var Hr = "MajoorAssetsManager.SavePlaceholders", Ur = /* @__PURE__ */ new Set(["MajoorSaveImage", "MajoorSaveVideo"]), Wr = /dd?|MM?|hh?|mm?|ss?|yyy?y?/g; function Gr(e, t) { return e.replace(Wr, (e) => { if (e === "yyyy") return String(t.getFullYear()); if (e === "yy") return String(t.getFullYear()).substring(2, 4); let n; switch (e[0]) { case "d": n = t.getDate(); break; case "M": n = t.getMonth() + 1; break; case "h": n = t.getHours(); break; case "m": n = t.getMinutes(); break; case "s": n = t.getSeconds(); break; default: return e; } return String(n).padStart(e.length, "0"); }); } var Kr = /[/?<>\\:*|"\x00-\x1F\x7F]/g; function qr(e) { let t = e?.nodes ?? e?._nodes; return Array.isArray(t) ? t : []; } function Jr(e, t) { return String(t ?? "").replace(/%([^%]+)%/g, (t, n) => { let r = String(n).split("."); if (r.length !== 2) return r[0].startsWith("date:") ? Gr(r[0].substring(5), /* @__PURE__ */ new Date()) : t; let i = qr(e), a = i.filter((e) => e?.properties?.["Node name for S&R"] === r[0]); a.length || (a = i.filter((e) => e?.title === r[0])); let o = a[0]; if (!o) return t; let s = Array.isArray(o.widgets) ? o.widgets.find((e) => e?.name === r[1]) : null; return s ? String(s.value ?? "").replace(Kr, "_") : t; }); } function Yr(e, t) { try { let n = Array.isArray(e?.widgets) ? e.widgets.find((e) => e?.name === "filename_prefix") : null; if (!n || typeof n.serializeValue == "function") return; n.serializeValue = () => Jr(e?.graph || t?.graph, n.value); } catch {} } function Xr() { let e = tt(); if (!e || typeof e.registerExtension != "function") { setTimeout(Xr, 100); return; } e.registerExtension({ name: Hr, nodeCreated(t) { try { let n = String(t?.comfyClass || t?.type || ""); if (!Ur.has(n)) return; Yr(t, e); } catch {} } }); } Xr(); //#endregion //#region ui/app/bootstrap.ts var Zr = !1, Qr = null, $r = !1, ei = null; function ti() { try { let e = window?.__MJR_EXECUTION_RUNTIME__; return !String(e?.active_prompt_id || "").trim(); } catch (e) { return console.debug?.(e), !0; } } async function ni(e = {}) { if (!z || typeof z != "object" || !z.AUTO_SCAN_ON_STARTUP || Zr) return; let t = Math.max(0, Number(e?.delayMs) || 0), n = e?.idleOnly !== !1; if (t > 0) { Qr && clearTimeout(Qr), Qr = setTimeout(() => { Qr = null, ni({ ...e, delayMs: 0 }); }, t); return; } if (n && !ti()) { Qr && clearTimeout(Qr), Qr = setTimeout(() => { Qr = null, ni({ ...e, delayMs: 0 }); }, 5e3); return; } Zr = !0; try { we("[Majoor] Starting startup scan of output directory..."); let e = await le(lt.SCAN, { recursive: !0, incremental: !0, fast: !0, background_metadata: !0 }); if (e.ok) { let t = e.data; we(`[Majoor] Startup scan complete - added: ${t.added}, updated: ${t.updated}, skipped: ${t.skipped}`); } else console.warn("[Majoor] Majoor [WARN]: Startup scan failed:", e.error); } catch (e) { console.error("[Majoor] ERROR: Startup scan error:", e); } } async function ri() { try { await Promise.allSettled([ ae(lt.HEALTH), ae(`${lt.HEALTH_COUNTERS}?scope=output`), ae(lt.HEALTH_DB) ]); } catch (e) { console.debug?.(e); } } async function ii(e = {}) { return $r ? ei || Promise.resolve() : ($r = !0, ei = (async () => { await ai(), await ri(), await ni(e); })(), ei); } function ai() { return new Promise((e) => { try { if (typeof window > "u") { e(); return; } let t = window.requestIdleCallback; if (typeof t == "function") { t(() => e(), { timeout: 1500 }); return; } let n = window.requestAnimationFrame || ((e) => setTimeout(e, 16)); n(() => n(() => setTimeout(e, 250))); } catch { e(); } }); } async function oi() { try { we("[Majoor] Testing API connection..."); let e = await ae(lt.HEALTH); e?.ok ? we("[Majoor] API connection successful, health:", e.data.overall) : console.error("[Majoor] ERROR: API health check failed:", e?.error); } catch (e) { console.error("[Majoor] ERROR: Failed to connect to API:", e); } } //#endregion //#region ui/app/versionCheck.ts var si = "mjr:version-update-available", ci = "__MJR_VERSION_UPDATE_STATE__", li = "https://api.github.com/repos/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/latest", ui = "https://api.github.com/repos/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/tags/nightly", di = "majoor_last_update_check", fi = "majoor_version_toast_notice_version", pi = "majoor_nightly_release_marker", mi = 864e5, hi = { available: !1, timestamp: Date.now() }; function gi(e) { return e ? String(e).trim().replace(/^v/i, "") : ""; } function _i(e, t) { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(), i = [ "nightly", "dev", "alpha", "experimental" ].some((e) => n.includes(e) || r.includes(e)), a = n.includes("+") || n.length > 10 && /^[a-f0-9]+$/i.test(n); return i || a; } function vi(e) { return String(e || "").split("-")[0].split(".").map((e) => { let t = parseInt(e, 10); return Number.isFinite(t) ? Math.max(0, t) : 0; }); } function yi(e, t) { if (!e || !t) return !1; let n = vi(e), r = vi(t), i = Math.max(n.length, r.length); for (let e = 0; e < i; e += 1) { let t = Number.isFinite(n[e]) ? n[e] : 0, i = Number.isFinite(r[e]) ? r[e] : 0; if (t > i) return !0; if (t < i) return !1; } return !1; } function bi(e) { let t = Math.max(1, Number(e) || 1e4); try { if (typeof AbortSignal < "u" && typeof AbortSignal.timeout == "function") return { signal: AbortSignal.timeout(t), cleanup: () => {} }; } catch (e) { console.debug?.(e); } try { if (typeof AbortController < "u") { let e = new AbortController(), n = setTimeout(() => { try { e.abort(); } catch (e) { console.debug?.(e); } }, t); return { signal: e.signal, cleanup: () => { try { clearTimeout(n); } catch (e) { console.debug?.(e); } } }; } } catch (e) { console.debug?.(e); } return { signal: void 0, cleanup: () => {} }; } async function xi(e) { let { signal: t, cleanup: n } = bi(1e4), r = await fetch(e, { cache: "no-cache", signal: t, headers: { Accept: "application/vnd.github+json" } }).finally(() => n()); if (!r.ok) throw Error(`GitHub release request failed (${r.status})`); let i = await r.json().catch(() => null); if (!i || typeof i != "object") throw Error("GitHub release returned invalid payload"); return i; } async function Si() { return gi((await xi(li)).tag_name); } async function Ci() { let e = await xi(ui); return String(e.published_at || e.created_at || e.updated_at || e.target_commitish || e.tag_name || "").trim(); } function wi(e) { hi = { ...e, timestamp: Date.now() }; let t = typeof window < "u" ? window : null; if (t) { try { t[ci] = hi; } catch (e) { console.debug?.(e); } try { t.dispatchEvent(new CustomEvent(si, { detail: hi })); } catch (e) { console.debug?.(e); } } } function Ti() { return hi; } async function Ei({ force: e = !1 } = {}) { if (typeof window > "u") return null; let t, n; try { let e = await ae(lt.VERSION); if (!e?.ok) return wi({ available: !1 }), null; t = gi(e.data?.version), n = String(e.data?.branch || "").trim().toLowerCase(); } catch { return wi({ available: !1 }), null; } let r = !1; try { if (!e) { let e = Number($e.get(di) || 0); Number.isFinite(e) && Date.now() - e < mi && (r = !0); } } catch {} if (!t || _i(t, n)) { if (r) return wi({ available: !1 }), null; let e; try { e = await Ci(); let n = String($e.get(pi) || "").trim(), r = !!(n && e && n !== e); if (wi({ available: r, current: t || "nightly", latest: "nightly", channel: "nightly" }), r && k({ summary: R("msg.nightlyUpdateTitle", "Nightly update available"), detail: R("msg.nightlyUpdateDetail", "A newer nightly build is available. Download it here: https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/tag/nightly") }, "info", 0), e) try { $e.set(pi, e); } catch (e) { console.debug?.(e); } } catch (e) { console.warn("Unable to check Majoor nightly updates:", e), wi({ available: !1 }); } finally { try { $e.set(di, String(Date.now())); } catch {} } return null; } if (r) return null; let i; try { i = await Si(); } catch (e) { return console.warn("Unable to check Majoor updates:", e), wi({ available: !1 }), null; } finally { try { $e.set(di, String(Date.now())); } catch {} } if (!i || !yi(i, t)) return wi({ available: !1 }), null; wi({ available: !0, current: t, latest: i }); try { if (String($e.get(fi) || "").trim() !== i) { k({ summary: R("msg.newVersionTitle", "Majoor Assets Manager update available"), detail: R("msg.newVersionDetail", "Version {latest} is available. You are currently using {current}.", { latest: i, current: t }) }, "info", 0); try { $e.set(fi, i); } catch (e) { console.debug?.(e); } } } catch (e) { console.debug?.(e); } return { current: t, latest: i }; } //#endregion //#region ui/app/style.ts function Di() { let e = "mjr-feed-selection-override"; if (typeof document > "u" || document.getElementById(e)) return; let t = document.createElement("style"); t.id = e, t.textContent = "\n .mjr-bottom-feed .mjr-asset-card.is-selected,\n .mjr-bottom-feed .mjr-card.is-selected {\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 78%, #ffffff 22%), 0 0 0 6px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 34%, transparent), 0 0 24px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 52%, transparent), 0 10px 28px rgba(0, 0, 0, 0.32) !important;\n outline: 2px solid color-mix(in srgb, var(--mjr-accent, #5fb3ff) 85%, #ffffff 15%) !important;\n outline-offset: 0 !important;\n border-color: color-mix(in srgb, var(--mjr-accent, #5fb3ff) 62%, var(--mjr-border, rgba(255, 255, 255, 0.12))) !important;\n overflow: visible !important;\n z-index: 12 !important;\n }\n ", document.head.appendChild(t); } function Oi({ enabled: e = !0 } = {}) { if (!e) return; let t = "mjr-theme-comfy-css"; if (document.getElementById(t)) { Di(); return; } try { let e = new URL("data:text/css;base64,LyoqCiAqIE1ham9vciBBc3NldHMgTWFuYWdlciAtIENvbWZ5LWxpa2UgdGhlbWUgbGF5ZXIKICoKICogUlVMRVM6CiAqIC0gRG8gTk9UIGhhcmRjb2RlIGEgY3VzdG9tIHBhbGV0dGU7IHVzZSBleGlzdGluZyBDb21meVVJIENTUyB2YXJpYWJsZXMgdmlhIHZhciguLi4pLgogKiAtIEtlZXAgZXZlcnl0aGluZyBzY29wZWQgdW5kZXIgYC5tanItYXNzZXRzLW1hbmFnZXJgIHRvIGF2b2lkIGxlYWtpbmcgc3R5bGVzIHRvIENvbWZ5VUkgKGV4Y2VwdCBgLm1qci1wb3BvdmVyKmAgd2hpY2ggY2FuIGJlIHBvcnRhbGVkIHRvIGBkb2N1bWVudC5ib2R5YCkuCiAqLwoKLm1qci1hc3NldHMtbWFuYWdlciB7CiAgICAvKiBUeXBvZ3JhcGh5ICovCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB2YXIoCiAgICAgICAgICAgIC0tZm9udC1pbnRlciwKICAgICAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICAgICAgc3lzdGVtLXVpLAogICAgICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgICAgICBSb2JvdG8sCiAgICAgICAgICAgIEFyaWFsLAogICAgICAgICAgICBzYW5zLXNlcmlmCiAgICAgICAgKQogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSkpOwoKICAgIC8qCiAgICAgKiBTdXJmYWNlcyAtIHByaW9yaXR5OiBDb21meVVJIHYxLjQyIGRlc2lnbi1zeXN0ZW0gdG9rZW4gLT4gbGVnYWN5IHRva2VuIC0+IGhhcmQgZmFsbGJhY2sKICAgICAqIE5ldyB0b2tlbnM6IC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwKICAgICAqICAgICAgICAgICAgIC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAtLWJ1dHRvbi1zdXJmYWNlLCAtLWJ1dHRvbi1ob3Zlci1zdXJmYWNlLAogICAgICogICAgICAgICAgICAgLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgLS1wcmltYXJ5LWJhY2tncm91bmQsIC0tbXV0ZWQtZm9yZWdyb3VuZCwKICAgICAqICAgICAgICAgICAgIC0tYm9yZGVyLWRlZmF1bHQsIC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCAtLXdhcm5pbmctYmFja2dyb3VuZCwgLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kCiAgICAgKi8KICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpKTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKSk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIC0tbWpyLWFjY2VudC1ob3ZlcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWhvdmVyLCB2YXIoLS1jb21meS1hY2NlbnQsICM3ZWM4ZmYpKTsKICAgIC0tbWpyLWJ0bi1zdXJmYWNlOiB2YXIoLS1idXR0b24tc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItYnRuLWhvdmVyOiB2YXIoLS1idXR0b24taG92ZXItc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItc2VsZWN0ZWQtc3VyZmFjZTogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE1KSk7CgogICAgLyogUmFkaWkgLSB1c2UgQ29tZnlVSSBkZXNpZ24tc3lzdGVtIHJhZGl1cyB0b2tlbnMgd2hlbiBhdmFpbGFibGUgKi8KICAgIC0tbWpyLXItc206IHZhcigtLXJhZGl1cy1zbSwgOHB4KTsKICAgIC0tbWpyLXItbWQ6IHZhcigtLXJhZGl1cy1tZCwgMTBweCk7CiAgICAtLW1qci1yLWxnOiB2YXIoLS1yYWRpdXMtbGcsIDEycHgpOwoKICAgIC8qIFNwYWNpbmcgKi8KICAgIC0tbWpyLXBhZC1zbTogOHB4OwogICAgLS1tanItcGFkLW1kOiAxMnB4OwogICAgLS1tanItcGFkLWxnOiAxNnB4OwoKICAgIC8qIFNlbWFudGljIFN0YXR1cyBDb2xvcnMgLSBwcmVmZXIgQ29tZnlVSSB2MS40MiBzZW1hbnRpYyB0b2tlbnMgKi8KICAgIC0tbWpyLXN0YXR1cy1zdWNjZXNzOiB2YXIoLS1zdWNjZXNzLWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci1zdGF0dXMtd2FybmluZzogdmFyKC0td2FybmluZy1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItc3RhdHVzLWVycm9yOiB2YXIoLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtZXJyb3IsICNmNDQzMzYpKTsKICAgIC0tbWpyLXN0YXR1cy1pbmZvOiB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMyk7CiAgICAtLW1qci1zdGF0dXMtbmV1dHJhbDogdmFyKC0tY29tZnktc3RhdHVzLW5ldXRyYWwsICM5ZTllOWUpOwogICAgLS1tanItc3Rhci1hY3RpdmU6ICNmZmQ0NWE7CgogICAgLyogQmFkZ2UgY29sb3JzIChvdmVycmlkZGVuIGJ5IHNldHRpbmdzKSAqLwogICAgLS1tanItYmFkZ2UtaW1hZ2U6ICMyMTk2ZjM7CiAgICAtLW1qci1iYWRnZS12aWRlbzogIzljMjdiMDsKICAgIC0tbWpyLWJhZGdlLWF1ZGlvOiAjZmY5ODAwOwogICAgLS1tanItYmFkZ2UtbW9kZWwzZDogIzRjYWY1MDsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjM2QzZDNkKTsKICAgIC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgIzRhOTBlMik7CiAgICAtLW1qci1yYXRpbmctY29sb3I6ICNmZjk1MDA7CiAgICAtLW1qci10YWctY29sb3I6ICM0YTkwZTI7Cn0KCi8qIE1ha2UgdGhlIHRoZW1lIHZpc2libHkgYXBwbHkgZXZlbiB3aXRoIGlubGluZSBzdHlsZXMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIubWpyLWFtLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXIgewogICAgcGFkZGluZzogMTRweCAxNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIHJvdy1nYXA6IDEwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItbGVmdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWhlYWRlci10b29scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogOHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYnMgewogICAgLyogUXVldWUtbGlrZSB0YWJzIChhY3RpdmUgcGlsbCwgb3RoZXJzIGFzIHRleHQpICovCiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDA7CiAgICBnYXA6IDEwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWJzOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYiB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjUlLCB0cmFuc3BhcmVudCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiLmlzLWFjdGl2ZSB7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItY29udGV4dC1hY3RpdmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItcG9wb3Zlci1vcGVuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDg1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEZsb2F0aW5nIFZpZXdlciBidXR0b24gLSB0ZWFsIGdsb3cgd2hlbiB2aWV3ZXIgaXMgb3BlbiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1mdi1idG4tYWN0aXZlIHsKICAgIGNvbG9yOiAjNGRkOWMwOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC4xKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDc3LCAyMTcsIDE5MiwgMC4yNSk7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZnYtYnRuLWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWJ0biB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWhhcy11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzIlLCB2YXIoLS1tanItYWNjZW50KSAxMSUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVzc2FnZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC01cHg7CiAgICByaWdodDogLTZweDsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTUlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMykpOwogICAgYmFja2dyb3VuZDogI2VmNTM1MDsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46ZGlzYWJsZWQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1haS1jb250cm9sOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgOTIlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkIC5tanItYWktY29udHJvbDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIHsKICAgIG9wYWNpdHk6IDAuNTg7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIC5tanItYWktY29udHJvbCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIGJ1dHRvbiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogUG9wb3ZlcnMgY2FuIGJlIG1vdmVkIHRvIGBkb2N1bWVudC5ib2R5YCAocG9ydGFsKSB0byBhdm9pZCBiZWluZyBjbGlwcGVkLiAqLwoubWpyLXBvcG92ZXIgewogICAgZm9udC1mYW1pbHk6IHZhcigKICAgICAgICAtLWNvbWZ5LWZvbnQsCiAgICAgICAgdmFyKAogICAgICAgICAgICAtLWZvbnQtaW50ZXIsCiAgICAgICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgICAgIHN5c3RlbS11aSwKICAgICAgICAgICAgLWFwcGxlLXN5c3RlbSwKICAgICAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICAgICAgUm9ib3RvLAogICAgICAgICAgICBBcmlhbCwKICAgICAgICAgICAgc2Fucy1zZXJpZgogICAgICAgICkKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpKTsKCiAgICAvKiBQcm92aWRlIGZhbGxiYWNrcyB3aGVuIG91dHNpZGUgYC5tanItYXNzZXRzLW1hbmFnZXJgIHNjb3BlICovCiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgLS1tanItcG9wb3Zlci16LWluZGV4OiAyMTQ3NDgzNjQ3OwoKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGxlZnQ6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aWR0aDogbWluKDI4MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLXBvcG92ZXItLWhpZGRlbiB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMzQwcHg7CiAgICB3aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgcGFkZGluZzogMTJweDsKfQoKLm1qci1zb3J0LXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIHdpZHRoOiBtaW4oMjYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzIwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzQwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVycy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlcnMtZW1wdHkgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3BlbiB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE5MCwgMjU1LCAwLjE4KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMSkpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3Blbjpob3ZlciwKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1vcGVuOmZvY3VzLXZpc2libGUgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE0NSwgMjA1LCAyNTUsIDAuNCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDgwLCAxNDAsIDI1NSwgMC4xOCksIHJnYmEoMzIsIDEwMCwgMjAwLCAwLjE0KSk7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItbGFiZWwgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXBhdGggewogICAgZmxleDogMCAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuNjg7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItdW5waW4gewogICAgd2lkdGg6IDQycHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgOTUsIDk1LCAwLjM1KTsKICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI1NSwgNzAsIDcwLCAwLjE2KSwgcmdiYSgxNjAsIDIwLCAyMCwgMC4xMikpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXVucGluIC5waSB7CiAgICBvcGFjaXR5OiAwLjg4OwogICAgY29sb3I6IHJnYmEoMjU1LCAxMzAsIDEzMCwgMC45Nik7Cn0KCi5tanItbWVzc2FnZXMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgd2lkdGg6IG1pbig0NjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItaW5saW5lLWRpYWxvZy1tYXNrIHsKICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgIGluc2V0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKfQoKLm1qci1pbmxpbmUtZGlhbG9nLXJvb3QgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgIHdpZHRoOiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItaW5saW5lLWRpYWxvZy1jb250ZW50IHsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItbWVzc2FnZXMtaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLW1lc3NhZ2VzLXRhYnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZXNzYWdlcy10YWIgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA3NiUsIHRyYW5zcGFyZW50KTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZTsKfQoKLm1qci1tZXNzYWdlcy10YWI6aG92ZXIsCi5tanItbWVzc2FnZXMtdGFiOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmMWYxZjEpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVzc2FnZXMtcGFuZWxzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1heC1oZWlnaHQ6IG1pbig1MnZoLCA0MjBweCk7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCwKLm1qci1tZXNzYWdlcy1zaG9ydGN1dHMtcGFuZWwgewogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdGFiLWNvdW50LWJhZGdlIHsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyOCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2VzLXRpdGxlIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA4MiUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLW1lc3NhZ2VzLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLW1lc3NhZ2VzLW1hcmstcmVhZC1idG4gewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjNjODRiIDQyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmM2M4NGIgMTIlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rOmhvdmVyLAoubWpyLW1lc3NhZ2VzLXN0YXItbGluazpmb2N1cy12aXNpYmxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWljb24gewogICAgY29sb3I6ICNmM2M4NGI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWVzc2FnZXMtZW1wdHkgewogICAgcGFkZGluZzogOHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItbWVzc2FnZS1pdGVtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODYlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi5tanItbWVzc2FnZS1pdGVtLS11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDYyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1lc3NhZ2UtaXRlbS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItbWVzc2FnZS1pdGVtLWVtb2ppIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItbWVzc2FnZS1pdGVtLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7Cn0KCi5tanItbWVzc2FnZS1pdGVtLWNhdGVnb3J5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA4NiUsIHRyYW5zcGFyZW50KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZS1pdGVtLW1ldGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYm9keSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS1hY3Rpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBUb2FzdCBIaXN0b3J5IHRhYiAtIHVucmVhZCBpbmRpY2F0b3IgZG90ICovCi5tanItdGFiLXVucmVhZC1kb3QgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDZweDsKICAgIGhlaWdodDogNnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBtYXJnaW4tbGVmdDogNXB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBIaXN0b3J5IHBhbmVsICovCi5tanItbWVzc2FnZXMtaGlzdG9yeS1wYW5lbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWhpc3RvcnktaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDRweCAwIDZweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWhpc3RvcnktaGVhZC1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgb3BhY2l0eTogMC42MjsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBvcGFjaXR5OiAwLjcyOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTIlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaGlzdG9yeS1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwp9CgoubWpyLWhpc3RvcnktaXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXdhcm5pbmcgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YwYjg1YSA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0taWNvbiB7CiAgICBmbGV4LXNocmluazogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWNvbnRlbnQgewogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1tc2cgewogICAgb3BhY2l0eTogMC45MjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGl0bGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBvcGFjaXR5OiAwLjk2OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWRldGFpbCB7CiAgICBvcGFjaXR5OiAwLjg0OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGltZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBvcGFjaXR5OiAwLjUyOwp9CgoubWpyLWhpc3RvcnktaXRlbS1jaGlwIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgyJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3OCUsIHRyYW5zcGFyZW50KTsKICAgIG9wYWNpdHk6IDAuNzY7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbjpob3ZlciB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1zdW1tYXJ5IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG9wYWNpdHk6IDAuNzQ7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1iYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MtZmlsbCB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCAjNThjMDdkIDcyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikpCiAgICApOwp9CgoubWpyLXNob3J0Y3V0LWd1aWRlIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKfQoKLm1qci1zaG9ydGN1dC1ndWlkZS1pbnRybyB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIG9wYWNpdHk6IDAuODQ7Cn0KCi5tanItc2hvcnRjdXQtc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg0JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zaG9ydGN1dC1zZWN0aW9uLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSkgODglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItc2hvcnRjdXQtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItc2hvcnRjdXQtcm93IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgxMzJweCwgMTYwcHgpIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7Cn0KCi5tanItc2hvcnRjdXQta2V5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzOCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTAlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwp9CgoubWpyLXNob3J0Y3V0LWRlc2MgewogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA1NjBweCkgewogICAgLm1qci1zaG9ydGN1dC1yb3cgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5tanItc2hvcnRjdXQta2V5IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW46IDAgMCAxMHB4OwogICAgcGFkZGluZzogNHB4IDJweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWxlZnQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWtpY2tlciB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDllbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDY1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXN1YnRpdGxlIHsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjIlLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zdGFjayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWFjdGl2ZS1jb3VudCB7CiAgICBtaW4td2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBwYWRkaW5nOiAwIDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2xlYXItYWxsIHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3ctLTNjb2wgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItcm93LS0zY29sIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBncmlkLWNvbHVtbjogMSAvIC0xOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA3MCUsIHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2NiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cCB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiB2YXIoLS1tanItYWNjZW50LCAjN2FhMmZmKTsKICAgIHBhZGRpbmc6IDEwcHggMCA4cHg7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHBhZGRpbmctYm90dG9tOiAycHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtLWNvcmUgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzU2YThmZjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tbWVkaWEgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzM1ZDA4YjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tdGltZSB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiAjZjBiODRmOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRvZ2dsZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgMTBweDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogMnB4IDRweDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDYyJSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRpdGxlOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICB3aWR0aDogNnB4OwogICAgaGVpZ2h0OiA2cHg7CiAgICBmbGV4OiAwIDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudCk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtY2hldnJvbiB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDc4JSwgdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtYm9keSB7CiAgICBwYWRkaW5nLXRvcDogNHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWNhcmQgewogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHRyYW5zcGFyZW50KSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgODglLCB0cmFuc3BhcmVudCkKICAgICk7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZDpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZC0tYWdlbmRhIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsICNmMGI4NGYgOSUsIHZhcigtLW1qci1zdXJmYWNlLTIpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCB0cmFuc3BhcmVudCkKICAgICk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bm90KC5pcy1vcGVuKSB7CiAgICBwYWRkaW5nLWJvdHRvbTogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwOm5vdCguaXMtb3BlbikgLm1qci1maWx0ZXItZ3JvdXAtdG9nZ2xlIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA0NDBweCkgewogICAgLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgfQoKICAgIC5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZC1hY3Rpb25zIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItaWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXRpdGxlIHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMTZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYiB7CiAgICAtLW1qci1icmVhZGNydW1iLWFjY2VudDogIzU2YThmZjsKICAgIC0tbWpyLWJyZWFkY3J1bWItY3VycmVudDogIzM1ZDA4YjsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAzcHggNnB4OwogICAgbWFyZ2luOiAxcHggMCAzcHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgMjIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA5JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWIuaXMtdmlzaWJsZSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uIHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA0MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDc4JSwgI2ZmZmZmZik7CiAgICBmb250OiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uOmRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNTg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYi1hY3Rpb246bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA2MiUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudCB7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogMXB4IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA3NiUsICNmZmZmZmYpOwogICAgZm9udDogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlZ21lbnQ6bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudC5pcy1jdXJyZW50LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudDpkaXNhYmxlZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAxNCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItY3VycmVudCkgNzQlLCAjZmZmZmZmKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlcGFyYXRvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgNTglLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42MikpKTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0cyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biB7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZHVwLWFsZXJ0IHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICM1NTUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2VlZSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgcGFkZGluZy10b3A6IDRweDsKfQoKLyogU2Nyb2xsYmFycyAobWF0Y2ggQ29tZnlVSSBmZWVsKSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpIHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6aG92ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MCUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci1jb3JuZXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1jdXN0b20tY29udHJvbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgbWFyZ2luLWJvdHRvbTogNnB4Owp9CgovKiBDYXJkIE1ldGFkYXRhIENvbG9ycyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBjb2xvcjogI2ZmYTcyNjsgLyogT3JhbmdlIGZvciBkdXJhdGlvbiAqLwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtcmVzIHsKICAgIGNvbG9yOiAjNGZjM2Y3OyAvKiBMaWdodCBCbHVlIGZvciByZXNvbHV0aW9uICovCiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kYXRlIHsKICAgIGNvbG9yOiAjYjlmNmNhOyAvKiBQYWxlIEdyZWVuIGZvciBkYXRlICovCiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtdGltZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMC45ZW07Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgNnB4IDA7CiAgICBwYWRkaW5nOiAwIDAgNHB4IDA7CiAgICBtaW4taGVpZ2h0OiAxNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgZmxleDogMCAwIGF1dG87Cn0KCi8qIFRvYXN0cyAoZ2xvYmFsOiBjYW4gYmUgbW91bnRlZCB1bmRlciBkb2N1bWVudC5ib2R5KSAqLwoubWpyLXRvYXN0LWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDE2cHg7CiAgICBsZWZ0OiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICB6LWluZGV4OiAxMDAwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItdG9hc3QgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCAjM2EzYTNhKTsKICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdmFyKC0tbWpyLXRvYXN0LXN0cmlwKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgI2VmZWZlZik7CiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgIHN5c3RlbS11aSwKICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgUm9ib3RvLAogICAgICAgIEFyaWFsLAogICAgICAgIHNhbnMtc2VyaWYKICAgICk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE1cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMnMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMnMgZWFzZS1vdXQ7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd2lkdGg6IG1heC1jb250ZW50OwogICAgbWluLXdpZHRoOiBtaW4oMjUwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBtYXgtd2lkdGg6IG1pbig0MDBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpOwogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdG9hc3QuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9CgoubWpyLXRvYXN0LXRleHQgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7Cn0KCi8qIFRvYXN0IGljb24gc3R5bGluZyAqLwoubWpyLXRvYXN0LXRleHQ6OmJlZm9yZSB7CiAgICBjb250ZW50OiBhdHRyKGRhdGEtaWNvbik7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGNvbG9yOiB2YXIoLS1tanItdG9hc3QtaWNvbi1jb2xvcik7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG1pbi13aWR0aDogMTZweDsKfQoKLm1qci10b2FzdC1zdWNjZXNzIHsKICAgIC0tbWpyLXRvYXN0LXN0cmlwOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7Cn0KCi5tanItdG9hc3QtZXJyb3IgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtZXJyb3IsIHZhcigtLWNvbWZ5LXN0YXR1cy1lcnJvciwgI2Y0NDMzNikpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7Cn0KCi5tanItdG9hc3Qtd2FybmluZyB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwp9CgoubWpyLXRvYXN0LWluZm8gewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWNvbnRleHQtcGlsbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICByb3ctZ2FwOiA0cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDEwLjVweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWluLWhlaWdodDogMjJweDsKICAgIG1heC13aWR0aDogMjIwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGw6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTAlLCB2YXIoLS1tanItYWNjZW50KSAxNCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsLXRleHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwteCB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbC14OmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1waWxsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgaGVpZ2h0OiAxLjc1cmVtOwogICAgcGFkZGluZzogMCAxMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXRvb2xzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1wb3BvdmVyLWFuY2hvciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItYWdlbmRhLWlucHV0IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjJzIGVhc2UsCiAgICAgICAgY29sb3IgMC4ycyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjJzIGVhc2U7Cn0KLm1qci1hZ2VuZGEtaW5wdXQubWpyLWFnZW5kYS1maWxsZWQgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNDAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDYwJQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgODAlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9Ci5tanItYWdlbmRhLWlucHV0Lm1qci1hZ2VuZGEtZW1wdHkgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg1JSwgdHJhbnNwYXJlbnQgMTUlKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKfQoKLm1qci1hZ2VuZGEtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLWFnZW5kYS1jYWxlbmRhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYWdlbmRhLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWFnZW5kYS1tb250aCB7CiAgICBmbGV4OiAxOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWFnZW5kYS1uYXYgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKfQoKLm1qci1hZ2VuZGEtZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNywgbWlubWF4KDAsIDFmcikpOwogICAgZ2FwOiA2cHg7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1hZ2VuZGEtd2Vla2RheSB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWFnZW5kYS1kYXkgewogICAgaGVpZ2h0OiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBwYWRkaW5nOiAwOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFnZW5kYS1kYXktYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtNXB4OwogICAgcmlnaHQ6IC01cHg7CiAgICBtaW4td2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogI2U1MzkzNTsKICAgIGNvbG9yOiAjZmZmOwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsICNlNTM5MzUgNjUlLCAjZmZmZmZmIDM1JSk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYWdlbmRhLWRheTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpIDU1JSwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSA0NSUKICAgICk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA0NSUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTAlCiAgICApOwp9CgoubWpyLWFnZW5kYS1kYXk6YWN0aXZlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxcHgpOwp9CgoubWpyLWFnZW5kYS1kYXktLWJsYW5rIHsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWFnZW5kYS1kYXktLWhhcy1hc3NldHMgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLWJvcmRlcikKICAgICk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSAxOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgODIlCiAgICApOwp9CgoubWpyLWFnZW5kYS1kYXktLXNlbGVjdGVkIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHgKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItYWdlbmRhLWZvb3RlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA4cHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5tanItYWdlbmRhLWNsZWFyLAoubWpyLWFnZW5kYS1yZWZyZXNoIHsKICAgIGZsZXg6IDE7Cn0KCi5tanItbWVudSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDRweDsKfQoKLm1qci1wcmltZS1tZW51LWxpc3QsCi5tanItc29ydC1tZW51IFtkYXRhLXBjLXNlY3Rpb249Imxpc3QiXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1wcmltZS1tZW51IFtkYXRhLXBjLXNlY3Rpb249Iml0ZW0iXSwKLm1qci1wcmltZS1tZW51LWxpc3QgW2RhdGEtcGMtc2VjdGlvbj0iaXRlbSJdIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cn0KCi5tanItcHJpbWUtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJpdGVtY29udGVudCJdIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1lbnUtaXRlbSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbSB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLW1lbnUtaXRlbTpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZW51LWl0ZW06YWN0aXZlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0tbGFiZWwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLW1lbnUtaXRlbS1jaGVjaywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICB3aWR0aDogMTZweDsKICAgIGZsZXg6IDAgMCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3BhY2l0eTogMDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzIlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLW1lbnUtaXRlbSAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1jb2xsZWN0aW9ucy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwtLWljb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwtLWljb24gLnBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgZmxleDogMCAwIDE2cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItbWVudS1pdGVtLXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLW1lbnUtaXRlbS1oaW50IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNjIlLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIG9wYWNpdHk6IDAuNzI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLW1lbnUtaXRlbS1jaGVjay0tdmlzaWJsZSwKLm1qci1tZW51LWl0ZW0uaXMtYWN0aXZlIC5tanItbWVudS1pdGVtLWNoZWNrIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWVudS1kaXZpZGVyIHsKICAgIGhlaWdodDogMXB4OwogICAgbWFyZ2luOiA0cHggMDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tdXRlZCB7CiAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICBvcGFjaXR5OiAwLjc1Owp9CgoubWpyLXN0YXRlLWJsb2NrIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7CiAgICBib3JkZXI6IDFweCBkYXNoZWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBtYXJnaW46IDRweCAwOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXN0YXRlLWJsb2NrLmlzLWVycm9yLAoubWpyLWNvbnRleHQtbWVudS1ub3RlLmlzLWVycm9yIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgODIlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yKSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jb2xsZWN0aW9uLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDQ4cHg7Cn0KCi5tanItY29sbGVjdGlvbnMtdmlydHVhbC1saXN0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItZGVsZXRlLWJ0biB7CiAgICB3aWR0aDogNDJweDsKICAgIGZsZXg6IDAgMCA0MnB4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luLWxlZnQ6IDZweDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNDUlKTsKfQoKLm1qci1kZWxldGUtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDQwJSwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNjUlKTsKfQoKLm1qci1kZWxldGUtYnRuIC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDc4JSwgdmFyKC0tY29udGVudC1mZykpOwp9CgoubWpyLXNlY3Rpb24tdGl0bGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4IDJweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC42cHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgb3BhY2l0eTogMC44ODsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNzIlLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlLS1jeWFuIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzZmZDRmZiA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlLS12aW9sZXQgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjYzQ4ZGZmIDc4JSwgdmFyKC0tY29udGVudC1mZykpOwp9CgoubWpyLXNlY3Rpb24taGludCB7CiAgICBwYWRkaW5nOiAwIDEwcHggNHB4OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNTUlLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0LAoubWpyLW1lbnUtaXRlbS0tY2x1c3RlciB7CiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItbWVudS1pdGVtLS1jbHVzdGVyIHsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwp9CgoubWpyLW1lbnUtaXRlbS0tc21hcnQgLnBpIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzZmZDRmZiA3NCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXIgLnBpIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2M0OGRmZiA3NCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0OmhvdmVyOm5vdCg6ZGlzYWJsZWQpLAoubWpyLW1lbnUtaXRlbS0tY2x1c3Rlcjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1jbHVzdGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWNsdXN0ZXItdGh1bWJzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDNweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWNsdXN0ZXItdGh1bWIgewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNjAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItY2x1c3Rlci1pbmZvIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItY2x1c3Rlci1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwp9CgoubWpyLWNsdXN0ZXItY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnKSA1OCUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0biB7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBvcGFjaXR5IDEyMG1zIGVhc2U7Cn0KCi5tanItY2x1c3Rlci1jcmVhdGUtYnRuOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNjI7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItY2x1c3Rlci1jcmVhdGUtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDYyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLWljb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1pY29uIC5waSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1waWxsIC5tanItaW5wdXQgewogICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMS4yICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbDpmb2N1cy13aXRoaW4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tYnJvd3NlIHsKICAgIG1hcmdpbi10b3A6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbCB7CiAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7Cn0KCi8qIEdyaWQgbGF5b3V0ICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAvKiBBdm9pZCBvdmVyZmxvdyB3aGVuIHRoZSBwYW5lbCBiZWNvbWVzIG5hcnJvd2VyIHRoYW4gdGhlIG1pbiBjYXJkIHNpemUgKi8KICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KAogICAgICAgIGF1dG8tZmlsbCwKICAgICAgICBtaW5tYXgobWluKDEwMCUsIHZhcigtLW1qci1ncmlkLW1pbi1zaXplLCAxODBweCkpLCAxZnIpCiAgICApOwogICAgZ2FwOiB2YXIoLS1tanItZ3JpZC1nYXAsIDEwcHgpOwogICAgbWFyZ2luLXRvcDogNnB4OwogICAgbWluLWhlaWdodDogMDsKfQoKLyogQ2FyZCBzZWxlY3Rpb24gKyBmb2N1cyAoa2VlcHMgYSB2aXNpYmxlIGluZGljYXRvciB3aGVuIHNpZGViYXIgaXMgb3BlbikgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgewogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQuaXMtc2VsZWN0ZWQgewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDAgMCAzcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDQwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMTBweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZyk7CiAgICAvKiBzY2FsZSgwLjk3KSBpbnN0ZWFkIG9mIDAuOTI6IHN1YnRsZSBpbnNldCBmZWVsIHdpdGhvdXQgdGhlIGFnZ3Jlc3NpdmUKICAgICAgIHNocmluayB0aGF0IGNhdXNlZCBhIHZpc2libGUgYmxpbmsgb24gcmFwaWQgc2VsZWN0aW9uIGNoYW5nZXMuICovCiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTcpICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMDsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZDpmb2N1cy12aXNpYmxlIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLWNvbnRlbnQtZmcpKSwKICAgICAgICAwIDAgMCA2cHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk3KSAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTA7Cn0KCkBrZXlmcmFtZXMgbWpyLWxpdmUtcGxhY2Vob2xkZXItc2hlZW4gewogICAgMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTglKTsKICAgICAgICBvcGFjaXR5OiAwLjE4OwogICAgfQogICAgNTAlIHsKICAgICAgICBvcGFjaXR5OiAwLjM0OwogICAgfQogICAgMTAwJSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDU4JSk7CiAgICAgICAgb3BhY2l0eTogMC4xODsKICAgIH0KfQoKQGtleWZyYW1lcyBtanItbGl2ZS1wbGFjZWhvbGRlci1wdWxzZSB7CiAgICAwJSwKICAgIDEwMCUgewogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICAgIDAgMCAwIDFweCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMzQpLAogICAgICAgICAgICAwIDEwcHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgfQogICAgNTAlIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAxcHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjUyKSwKICAgICAgICAgICAgMCAwIDAgNHB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4xMiksCiAgICAgICAgICAgIDAgMTJweCAzMHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWxpdmUtcGxhY2Vob2xkZXI9InRydWUiXSB7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXB1bHNlIDEuOXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWxpdmUtcGxhY2Vob2xkZXI9InRydWUiXSAubWpyLXRodW1iIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1saXZlLXBsYWNlaG9sZGVyLXdhc2ggewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IC04JTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxMTVkZWcsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDApIDAlLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwLjA4KSAzMCUsCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSA1MCUsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDAuMTIpIDcwJSwKICAgICAgICByZ2JhKDk4LCAxOTksIDI1NSwgMCkgMTAwJQogICAgKTsKICAgIGFuaW1hdGlvbjogbWpyLWxpdmUtcGxhY2Vob2xkZXItc2hlZW4gMi4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1saXZlLXBpbGwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA2cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDI0cHg7CiAgICBwYWRkaW5nOiAwIDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4zNCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1waWxsLWRvdCB7CiAgICB3aWR0aDogN3B4OwogICAgaGVpZ2h0OiA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6ICM3NmQ2ZmY7CiAgICBib3gtc2hhZG93OiAwIDAgMCA0cHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjE2KTsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gLm1qci1hc3NldC1zdGF0dXMtZG90IHsKICAgIGFuaW1hdGlvbjogbWpyLWxpdmUtcGxhY2Vob2xkZXItcHVsc2UgMS45cyBlYXNlLWluLW91dCBpbmZpbml0ZTsKfQoKLyogR3JpZCBsb2FkaW5nIG92ZXJsYXkgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtbG9hZGluZy1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjMDAwIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuM3B4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMnB4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tbGF5b3V0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxMzJweCwgMWZyKSk7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWNhcmQgewogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE5MiwgMTk4LCAyMDYsIDAuMik7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgLyogbWluLWhlaWdodCByZW1vdmVkOiBWdWUgc2tlbGV0b25DYXJkU3R5bGUgc2V0cyBhbiBleHBsaWNpdCBoZWlnaHQgZGVyaXZlZAogICAgICAgZnJvbSBlc3RpbWF0ZVJvd0hlaWdodC4gQSBjb25mbGljdGluZyBtaW4taGVpZ2h0IGNhdXNlZCBza2VsZXRvbiBjYXJkcyB0bwogICAgICAgYmUgdGFsbGVyIHRoYW4gdGhlIGFjdHVhbCBjYXJkcyB0aGV5IHJlcGxhY2UsIGNhdXNpbmcgYSBsYXlvdXQganVtcCB3aGVuCiAgICAgICBhc3NldHMgZmlyc3QgbG9hZC4gKi8KICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKICAgIHdpZHRoOiAxMDAlOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHJnYmEoMTU2LCAxNjIsIDE3MSwgMC41MikgMCUsCiAgICAgICAgcmdiYSgyMjAsIDIyNSwgMjMyLCAwLjcyKSA0NSUsCiAgICAgICAgcmdiYSgxNTYsIDE2MiwgMTcxLCAwLjUyKSAxMDAlCiAgICApOwogICAgYmFja2dyb3VuZC1zaXplOiAyNDAlIDEwMCU7CiAgICBhbmltYXRpb246IG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgMS4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUgewogICAgaGVpZ2h0OiAxMHB4OwogICAgbWFyZ2luOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICByZ2JhKDE2NCwgMTcwLCAxNzksIDAuNDgpIDAlLAogICAgICAgIHJnYmEoMjE0LCAyMTksIDIyNiwgMC43KSA0NSUsCiAgICAgICAgcmdiYSgxNjQsIDE3MCwgMTc5LCAwLjQ4KSAxMDAlCiAgICApOwogICAgYmFja2dyb3VuZC1zaXplOiAyNDAlIDEwMCU7CiAgICBhbmltYXRpb246IG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgMS4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUtLXRpdGxlIHsKICAgIHdpZHRoOiA3MiU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUtLW1ldGEgewogICAgd2lkdGg6IDQ4JTsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KCkBrZXlmcmFtZXMgbWpyLXNrZWxldG9uLXNoaW1tZXIgewogICAgMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDEyMCUgMDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjAlIDA7CiAgICB9Cn0KCkBrZXlmcmFtZXMgbWpyLWdyaWQtc2tlbGV0b24tc2hpbW1lciB7CiAgICAwJSB7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSAwOwogICAgfQogICAgMTAwJSB7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwMCUgMDsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tc2hpbW1lciB7CiAgICB3aWxsLWNoYW5nZTogYmFja2dyb3VuZC1wb3NpdGlvbjsKfQoKLyogR2VuZXJpYyBoZWFkaW5ncyBpbnNpZGUgcGFuZWwgKi8KLm1qci1hc3NldHMtbWFuYWdlciBoMywKLm1qci1hc3NldHMtbWFuYWdlciBoNCB7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxZW07Cn0KCi8qIFBhbmVscyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItcGFuZWwgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIGJveC1zaGFkb3c6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ib3gtc2hhZG93LCAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC4yNSkpOwp9CgovKiBUb29sYmFyICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogdmFyKC0tbWpyLXBhZC1tZCk7Cn0KCi8qIEJ1dHRvbnMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0biB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDdweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjU1OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxNCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0biB7CiAgICAvKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIGlmIHByZXNlbnQgKi8KICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwp9CgovKiBJbnB1dHMgLyBzZWxlY3RzICh1c2VkIGluc2lkZSBwb3J0YWxlZCBwb3BvdmVycyB0b28pICovCi5tanItaW5wdXQsCi5tanItc2VsZWN0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zZWxlY3QgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcsIHJnYmEoMCwgMCwgMCwgMC4yNSkpOwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dDo6cGxhY2Vob2xkZXIgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDgwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWlucHV0OmZvY3VzLAoubWpyLXNlbGVjdDpmb2N1cywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0OmZvY3VzLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc2VsZWN0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1pbnB1dCwKLm1qci1zZWxlY3QsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXNlbGVjdCB7CiAgICAvKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIGlmIHByZXNlbnQgKi8KICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcsIHJnYmEoMCwgMCwgMCwgMC4yNSkpOwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwogICAgcGFkZGluZzogOHB4IDEwcHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgbWluLWhlaWdodDogMzRweDsKICAgIHBhZGRpbmc6IDAgOXB4OwogICAgbGluZS1oZWlnaHQ6IDEuMjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3RbZGF0YS1wLWRpc2FibGVkPSJ0cnVlIl0gewogICAgb3BhY2l0eTogMC41NTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3QgW2RhdGEtcGMtc2VjdGlvbj0ibGFiZWwiXSB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0IFtkYXRhLXBjLXNlY3Rpb249ImRyb3Bkb3duIl0gewogICAgZmxleDogMCAwIGF1dG87CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHdpZHRoOiAxOHB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCB7CiAgICBtaW4td2lkdGg6IHZhcigtLXAtc2VsZWN0LW92ZXJsYXktd2lkdGgsIDEycmVtKTsKICAgIG1heC13aWR0aDogbWluKDMyMHB4LCBjYWxjKDEwMHZ3IC0gMzJweCkpOwogICAgbWF4LWhlaWdodDogbWluKDMyMHB4LCBjYWxjKDEwMHZoIC0gMzJweCkpOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBwYWRkaW5nOiA0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzgpOwogICAgei1pbmRleDogY2FsYyh2YXIoLS1tanItcG9wb3Zlci16LWluZGV4LCAyMTQ3NDgzNjQ3KSArIDEpOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcGMtc2VjdGlvbj0ibGlzdCJdIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwOwogICAgbGlzdC1zdHlsZTogbm9uZTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXBjLXNlY3Rpb249Im9wdGlvbiJdIHsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiBjYWxjKHZhcigtLW1qci1yLW1kKSAtIDJweCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS4yNTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXTpob3ZlciwKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXAtaGlnaGxpZ2h0PSJ0cnVlIl0gewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9CgovKiBUYWJzOiBvdmVycmlkZGVuIGFib3ZlIHdpdGggcXVldWUtbGlrZSBzdHlsZSAqLwoKLyogUmVtb3ZlZCByZWR1bmRhbnQgdGFiIGRlY2xhcmF0aW9ucyB0aGF0IHdlcmUgdXNpbmcgIWltcG9ydGFudCAqLwoKLyogTXV0ZWQgdGV4dCBoZWxwZXIgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW11dGVkIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwp9CgovKiBHcmlkICsgY2FyZHMgKG92ZXJyaWRlIGlubGluZSBzdHlsZXMgZnJvbSBDYXJkLmpzKSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyICNtanItYXNzZXRzLWdyaWQgewogICAgZ2FwOiAxMHB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcikgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKSAhaW1wb3J0YW50OwogICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2UgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQ6aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDU1JSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKQogICAgKSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWpyLWNhcmQtaG92ZXItY29sb3IpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDhweCAyMnB4IHJnYmEoMCwgMCwgMCwgMC4yNSkgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgaW1nLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCB2aWRlbywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iLW1lZGlhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgb2JqZWN0LWZpdDogY292ZXIgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgd2lkdGg6IDEwMCU7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDE0cHggMTJweCAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NCk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAxOCUgMjAlLCByZ2JhKDc4LCAxODQsIDI1NSwgMC4zMiksIHRyYW5zcGFyZW50IDM4JSksCiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA4OCUgNzIlLCByZ2JhKDgyLCAyMjAsIDE1NiwgMC4yNCksIHRyYW5zcGFyZW50IDQyJSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxOCwgMjYsIDM2LCAwLjk4KSwgcmdiYSg4LCAxMiwgMTgsIDAuOTgpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLmhhcy1wb3N0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi5oYXMtcG9zdGVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSg0LCA2LCAxMCwgMC4yOCksIHJnYmEoNCwgNiwgMTAsIDAuODYpKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDUwJSA0MiUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjIpLCB0cmFuc3BhcmVudCA1NCUpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBzYXR1cmF0ZSgxLjEpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IHNhdHVyYXRlKDEuMSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1oZWFkLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWItaWNvbiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLWljb24gewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yMik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1raW5kLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWIta2luZCB7CiAgICBtYXgtd2lkdGg6IDYycHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMyk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi13YXZlZm9ybSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLXdhdmVmb3JtIHsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiA0MnB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogY2xhbXAoMnB4LCAyLjIlLCA1cHgpOwogICAgcGFkZGluZzogNHB4IDA7CiAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDAgNHB4IDE0cHggcmdiYSgwLCAwLCAwLCAwLjM0KSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi13YXZlZm9ybSBzcGFuLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItd2F2ZWZvcm0gc3BhbiB7CiAgICB3aWR0aDogM3B4OwogICAgbWluLXdpZHRoOiAycHg7CiAgICBtYXgtd2lkdGg6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk4KSwgcmdiYSgxNjAsIDIyNCwgMjU1LCAwLjcyKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1tZXRhLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItbWV0YSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjYyKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLXRpdGxlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItdGl0bGUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWItc3VidGl0bGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1zdWJ0aXRsZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA2NTA7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDdweDsKICAgIHBhZGRpbmc6IDE0cHggMTJweDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSg0NywgNTgsIDc2LCAwLjk0KSwgcmdiYSgxOCwgMjMsIDMyLCAwLjk4KSksCiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAzMCUgMjUlLCByZ2JhKDc4LCAxODQsIDI1NSwgMC4yMiksIHRyYW5zcGFyZW50IDQyJSk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdGV4dC1zaGFkb3c6IDAgMXB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNzIpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXRodW1iLm1qci10aHVtYi13b3JrZmxvdywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci10aHVtYi5tanItdGh1bWItd29ya2Zsb3cgewogICAgYXNwZWN0LXJhdGlvOiAxLjA4IC8gMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy1jYXJkLWFjdGlvbnMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctY2FyZC1hY3Rpb25zIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogN3B4OwogICAgcmlnaHQ6IDdweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgZ2FwOiA0cHg7CiAgICB6LWluZGV4OiAxMjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy1hY3Rpb24tYnRuLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4gewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAyNHB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgbWluLXdpZHRoOiAyNHB4OwogICAgbWluLWhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDogcmdiYSg4LCAxMiwgMTgsIDAuNTgpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDNweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigzcHgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG46aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI5LCA0MCwgNTgsIDAuNzgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4uaXMtYWN0aXZlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4uaXMtYWN0aXZlIHsKICAgIGNvbG9yOiAjZmZkNDVhOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjEyLCA5MCwgMC43KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYiAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIgLnBpIHsKICAgIGZvbnQtc2l6ZTogMS43NXJlbTsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLXRodW1ibmFpbCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtdGh1bWJuYWlsIHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHRyYW5zcGFyZW50IDI0JSwgcmdiYSgwLCAwLCAwLCAwLjI4KSA1OCUsIHJnYmEoMCwgMCwgMCwgMC43OCkpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCg5MGRlZywgcmdiYSgwLCAwLCAwLCAwLjM0KSwgdHJhbnNwYXJlbnQgMzQlLCB0cmFuc3BhcmVudCA2NiUsIHJnYmEoMCwgMCwgMCwgMC4zNCkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXRodW1iLW1lZGlhLm1qci13b3JrZmxvdy1ncmFwaC1tYXAtcHJldmlldywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci10aHVtYi1tZWRpYS5tanItd29ya2Zsb3ctZ3JhcGgtbWFwLXByZXZpZXcgewogICAgb2JqZWN0LWZpdDogY292ZXIgIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNDY7CiAgICBmaWx0ZXI6IHNhdHVyYXRlKDAuNzUpIGNvbnRyYXN0KDAuODIpIGJyaWdodG5lc3MoMC43KTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIHsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDgsIDEwLCAxNCwgMC4zKSwgcmdiYSg4LCAxMCwgMTQsIDAuODIpKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDUwJSA0MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCksIHJnYmEoMCwgMCwgMCwgMC42OCkgNzIlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCAubWpyLXdvcmtmbG93LXRodW1iLXRpdGxlIHsKICAgIHBhZGRpbmc6IDJweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzYpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy10aHVtYm5haWwgLnBpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy10aHVtYm5haWwgLnBpIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLWdyYXBoLW1hcCAucGkgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICBmb250LXNpemU6IDEuMTVyZW07CiAgICBvcGFjaXR5OiAwLjU1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLXRpdGxlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLXRpdGxlIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDAuODRyZW07CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGluZS1oZWlnaHQ6IDEuMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBmb250LXNpemU6IDAuNjhyZW07Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItbWV0YSBzcGFuLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgc3BhbiwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1tZXRhLXdvcmtmbG93LXRhc2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItbWV0YS13b3JrZmxvdy10YXNrLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctc3ViZ3JhcGhzLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctc3ViZ3JhcGhzIHsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhIHNwYW46bnRoLWNoaWxkKG4gKyA0KSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhIHNwYW46bnRoLWNoaWxkKG4gKyA0KSB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIHsKICAgIHBhZGRpbmc6IDdweCA5cHggIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtZmlsZW5hbWUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIG1hcmdpbi1ib3R0b206IDNweCAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAwLjc4cmVtICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMS4xNSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1tZXRhLXJvdywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtbWV0YS1yb3cgewogICAgZm9udC1zaXplOiAwLjcycmVtICFpbXBvcnRhbnQ7CiAgICBvcGFjaXR5OiAwLjc0ICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLW1ldGEtcm93IC5tanItbWV0YS13b3JrZmxvdy10YXNrLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1tZXRhLXJvdyAubWpyLW1ldGEtd29ya2Zsb3ctdGFzayB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LW1pc3NpbmctY2hpcCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy1taXNzaW5nLWNoaXAsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1taXNzaW5nLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctbWlzc2luZyB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTkwLCA2NiwgMC4yOCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIzNiwgMTgwLCAwLjk4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyMDYsIDEwMSwgMC40NSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3IgewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgbWFyZ2luOiAwIDAgOHB4OwogICAgcGFkZGluZzogNXB4IDlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuNDIpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICAgIDEzNWRlZywKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4yMiksCiAgICAgICAgICAgIHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuMDgpCiAgICAgICAgKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNmZmYpIDkyJSwgdHJhbnNwYXJlbnQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udDogaW5oZXJpdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvcjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuNjYpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICAgIDEzNWRlZywKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4zKSwKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4xMikKICAgICAgICApLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvcjpmb2N1cy12aXNpYmxlIHsKICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjU1KTsKICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC0wIHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDk1LCAxNzksIDI1NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTEgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogNTUsIDIxMSwgMTU2Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtMiB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiAyNDYsIDE3NywgNzU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC0zIHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDIzOCwgMTA0LCAxMzY7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC00IHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDE1NywgMTMyLCAyMzg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC01IHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDcxLCAxOTcsIDIyMjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTYgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogMTQ5LCAyMDcsIDgxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtNyB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiAyNDIsIDEzMCwgNzg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItY2hldnJvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGNvbG9yOiByZ2IodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSkpOwogICAgYmFja2dyb3VuZDogcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4xNCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItY2hldnJvbiA+IC5waSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci10aXRsZSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItYmFja2Ryb3AgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgaW5zZXQ6IDA7CiAgICB6LWluZGV4OiA5OTk5OTk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMjRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41OCk7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1kaWFsb2cgewogICAgd2lkdGg6IG1pbig5MjBweCwgOTZ2dyk7CiAgICBtYXgtaGVpZ2h0OiBtaW4oNzYwcHgsIDkydmgpOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzExMTQxOCkgOTYlLCAjMDAwKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZjVmNWY1KTsKICAgIGJveC1zaGFkb3c6IDAgMThweCA2MHB4IHJnYmEoMCwgMCwgMCwgMC40OCk7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1kaWFsb2cgewogICAgd2lkdGg6IG1pbig1NjBweCwgOTZ2dyk7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoMCwgMWZyKSk7CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxNHB4IDE4cHggNHB4Owp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSBsYWJlbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSBsYWJlbC5pcy13aWRlIHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIHNwYW4gewogICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC42NCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzUwOwogICAgbGV0dGVyLXNwYWNpbmc6IC4wNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gaW5wdXQsCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIHNlbGVjdCwKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gdGV4dGFyZWEgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjI2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuOTIpOwogICAgZm9udDogaW5oZXJpdDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gdGV4dGFyZWEgewogICAgcmVzaXplOiB2ZXJ0aWNhbDsKICAgIG1pbi1oZWlnaHQ6IDk2cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWhlYWRlciwKLm1qci13b3JrZmxvdy1waWNrZXItZm9vdGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogMTJweCAxNHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZm9vdGVyIHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYm9yZGVyLWJvdHRvbTogMDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdGl0bGUgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA5cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmb250LXNpemU6IDE1cHg7CiAgICBmb250LXdlaWdodDogODAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1pY29uLWJ0biwKLm1qci13b3JrZmxvdy1waWNrZXItYnRuIHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyNTI4MmQpIDg4JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY1ZjUpOwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1pY29uLWJ0biB7CiAgICB3aWR0aDogMzJweDsKICAgIGhlaWdodDogMzJweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItYnRuIHsKICAgIG1pbi1oZWlnaHQ6IDMycHg7CiAgICBwYWRkaW5nOiAwIDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1idG4uaXMtcHJpbWFyeSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDE3MSwgMjQ3LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSg3NywgMTcxLCAyNDcsIDAuMjIpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1idG46ZGlzYWJsZWQgewogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNvdXJjZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA4cHggMTRweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsICNhZWIzYmQpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNvdXJjZSBzdHJvbmcgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZjVmNWY1KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMTgwcHgsIDFmcikgcmVwZWF0KDMsIG1pbm1heCgxMTBweCwgMTUwcHgpKTsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweCAxNHB4Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1kaWFsb2cuaXMtYXNzZXQtbW9kZSAubWpyLXdvcmtmbG93LXBpY2tlci10b29sYmFyIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDE4MHB4LCAxZnIpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1zZWFyY2gsCi5tanItd29ya2Zsb3ctcGlja2VyLXRvb2xiYXIgc2VsZWN0IHsKICAgIG1pbi1oZWlnaHQ6IDM0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMxNzFhMWYpIDkyJSwgIzAwMCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2Y1ZjVmNSk7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMCAxMHB4Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1zZWFyY2ggaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4td2lkdGg6IDA7CiAgICBib3JkZXI6IDA7CiAgICBvdXRsaW5lOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogaW5oZXJpdDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciBzZWxlY3QgewogICAgcGFkZGluZzogMCA4cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWJvZHkgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4taGVpZ2h0OiAyNjBweDsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDE4MHB4LCAxZnIpKTsKICAgIGFsaWduLWNvbnRlbnQ6IHN0YXJ0OwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMCAxNHB4IDE0cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDY4cHggbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4taGVpZ2h0OiA4NHB4OwogICAgcGFkZGluZzogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMTcxYTFmKSA5MiUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZGlhbG9nLmlzLWFzc2V0LW1vZGUgLm1qci13b3JrZmxvdy1waWNrZXItY2FyZCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDc2cHggbWlubWF4KDAsIDFmcik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQ6aG92ZXIsCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQuaXMtc2VsZWN0ZWQgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc3LCAxNzEsIDI0NywgMC43Mik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAxNzEsIDI0NywgMC4xMik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXRodW1iIHsKICAgIHdpZHRoOiA2OHB4OwogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdGh1bWIgaW1nIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY292ZXI7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzdHJvbmcsCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzcGFuLAoubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkLWluZm8gc21hbGwgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHN0cm9uZyB7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzcGFuLAoubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkLWluZm8gc21hbGwgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgI2FlYjNiZCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWVtcHR5IHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7CiAgICBwYWRkaW5nOiAzMnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgI2FlYjNiZCk7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWVtcHR5LmlzLWVycm9yIHsKICAgIGNvbG9yOiAjZmZiNGI0Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzIwcHgpIHsKICAgIC5tanItd29ya2Zsb3ctcGlja2VyLWJhY2tkcm9wIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgfQoKICAgIC5tanItd29ya2Zsb3ctcGlja2VyLXRvb2xiYXIgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgIH0KCiAgICAubWpyLXdvcmtmbG93LXBpY2tlci1zZWFyY2ggewogICAgICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7CiAgICB9Cn0KCi8qIEtlZXAgZ2VuZXJhdGlvbi10aW1lIGJhZGdlIHBpbm5lZCB0byB0aGUgdGh1bWJuYWlsIGNvcm5lciBhY3Jvc3MgZ3JpZC9mZWVkIHZhcmlhbnRzLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLWdlbnRpbWUtYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItZ2VudGltZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIHJpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB0b3A6IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAycHggNnB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41NSkgIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDAgIWltcG9ydGFudDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxNWVtOwogICAgbGluZS1oZWlnaHQ6IDEuMTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIHRleHQtc2hhZG93OgogICAgICAgIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuOSksCiAgICAgICAgMCAwIDEwcHggY29sb3ItbWl4KGluIHNyZ2IsIGN1cnJlbnRDb2xvciAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoMnB4KTsKfQoKLyogS2VlcCByYXRpbmcvdGFncyBiYWRnZXMgYW5jaG9yZWQuIERvIG5vdCBmb3JjZSBkaXNwbGF5IGhlcmUgc28gZ3JpZCB2aXNpYmlsaXR5IHRvZ2dsZXMgc3RpbGwgY29udHJvbCBzaG93L2hpZGUuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiA+IC5tanItcmF0aW5nLWJhZGdlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWIgPiAubWpyLXJhdGluZy1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIHRvcDogNnB4ICFpbXBvcnRhbnQ7CiAgICByaWdodDogNnB4ICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBib3R0b206IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsZXR0ZXItc3BhY2luZzogMXB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgIHRleHQtc2hhZG93OiAwIDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjJzIGVhc2Utb3V0Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLXRhZ3MtYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItdGFncy1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIGxlZnQ6IDZweCAhaW1wb3J0YW50OwogICAgYm90dG9tOiA2cHggIWltcG9ydGFudDsKICAgIHJpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB0b3A6IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAzcHggNnB4OwogICAgZm9udC1zaXplOiA5cHg7CiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDU2cHgpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOwogICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIGFuaW1hdGlvbjogbWpyLWZhZGUtaW4gMC4ycyBlYXNlLW91dDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iLXBsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgcGxhY2UtaXRlbXM6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogMjhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICB0ZXh0LXNoYWRvdzogMCAwIDEwcHggcmdiYSgwLCAwLCAwLCAwLjcpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7Cn0KCi8qIC0tLSBIb3ZlciBpbmZvIG92ZXJsYXkgKHBvc2l0aXZlIHByb21wdCArIGdlbiB0aW1lKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTbGlkZXMgdXAgZnJvbSB0aGUgYm90dG9tIG9mIC5tanItdGh1bWIgb24gY2FyZCBob3Zlci4KICAgcG9pbnRlci1ldmVudHM6IG5vbmUgIC0+IG5ldmVyIGJsb2NrcyB2aWRlbyBtb3VzZWVudGVyIC8gcGxheS1vbi1ob3Zlci4KICAgei1pbmRleDogMiAgICAgICAgICAgLT4gc2l0cyBhYm92ZSB0aGUgdGh1bWJuYWlsIGltYWdlLCBiZWxvdyB0aGUgcGxheSBpY29uLgogICBDb250cm9sbGVkIGJ5IHRoZSAubWpyLXNob3ctaG92ZXItaW5mbyBjbGFzcyBvbiB0aGUgZ3JpZCBjb250YWluZXIsIHdoaWNoCiAgIGlzIHRvZ2dsZWQgdmlhIHRoZSAiU2hvdyBwcm9tcHQgb24gaG92ZXIiIHNldHRpbmcuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMDsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHBhZGRpbmc6IDIycHggOHB4IDdweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHRyYW5zcGFyZW50IDAlLCByZ2JhKDAsIDAsIDAsIDAuNzgpIDEwMCUpOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDVweCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMTUwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMTUwbXMgZWFzZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAzcHg7CiAgICB6LWluZGV4OiAyOwp9Ci8qIE9ubHkgcmV2ZWFsIG9uIGhvdmVyIHdoZW4gdGhlIHNldHRpbmcgaXMgZW5hYmxlZCAoY2xhc3Mgb24gZ3JpZCBjb250YWluZXIpICovCi5tanItZ3JpZC5tanItc2hvdy1ob3Zlci1pbmZvIC5tanItY2FyZDpob3ZlciAubWpyLWNhcmQtaG92ZXItaW5mbyB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9Ci5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gLm1qci1ob3Zlci1wcm9tcHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGRpc3BsYXk6IC13ZWJraXQtYm94OwogICAgLXdlYmtpdC1saW5lLWNsYW1wOiAyOwogICAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBvcGFjaXR5OiAwLjk7CiAgICBmb250LXNpemU6IDkuNXB4Owp9Ci5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gLm1qci1ob3Zlci1nZW50aW1lIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjEwLCAxMjAsIDAuOTUpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKfQpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwbXM7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgfQp9CgovKiAtLS0gQ2FyZCBkZXRhaWxzIHBhbmVsIHNob3cvaGlkZSB2aWEgZ3JpZCBjb250YWluZXIgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLQogICAubWpyLXNob3ctZGV0YWlscyBpcyB0b2dnbGVkIGJ5IGFwcGx5R3JpZFNldHRpbmdzQ2xhc3NlcygpIHdoZW4gdGhlCiAgICJTaG93IG1ldGFkYXRhIHBhbmVsIiBzZXR0aW5nIGNoYW5nZXMuICBEZWZhdWx0ID0gT0ZGIOKGkiBwYW5lbCBoaWRkZW4uCiAgIEhpZGluZyBoZXJlIGtlZXBzIGFjdHVhbCByb3cgaGVpZ2h0ID0gZXN0aW1hdGVSb3dIZWlnaHQobWV0YUhlaWdodD0wKSwKICAgcHJldmVudGluZyB0aGUgdmlydHVhbGl6ZXIgZnJvbSByZXBvc2l0aW9uaW5nIGFsbCByb3dzIG9uIG1lYXN1cmUKICAgKHdoaWNoIHdhcyB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgInJlbG9hZCBpbXByZXNzaW9uIiBibGluaykuCiAgIE1hdGNoIHRoZSBib3R0b20tZmVlZCBwYXR0ZXJuIGF0IC5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWluZm8uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLm1qci1zaG93LWRldGFpbHMgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogYmxvY2s7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLW1ldGEgewogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1hcmdpbi1ib3R0b206IDJweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZGV0YWlscyB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBvcGFjaXR5OiAwLjg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWZpbGVuYW1lLXRleHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLyogUmF0aW5nICYgVGFncyBFZGl0b3JzICovCkBrZXlmcmFtZXMgZmFkZUluIHsKICAgIGZyb20gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00cHgpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgfQp9Ci8qKgogKiBBcmNoaXZlZCBDU1MgU3R5bGVzIC0gUmF0aW5nIGFuZCBUYWdzCiAqIFRoZXNlIHN0eWxlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGVtZS1jb21meS5jc3MKICovCgovKiBBbmltYXRpb25zICovCkBrZXlmcmFtZXMgc2xpZGVJblJpZ2h0IHsKICAgIGZyb20gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgfQogICAgdG8gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgfQp9CgovKiBQb3BvdmVycyAqLwoubWpyLXJhdGluZy1wb3BvdmVyLAoubWpyLXRhZ3MtcG9wb3ZlciB7CiAgICBhbmltYXRpb246IGZhZGVJbiAwLjJzIGVhc2U7Cn0KCi5tanItcmF0aW5nLXBvcG92ZXIsCi5tanItdGFncy1wb3BvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi8qIFJhdGluZyBFZGl0b3IgKi8KLm1qci1yYXRpbmctZWRpdG9yIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgcGFkZGluZzogMnB4Owp9CgoubWpyLXJhdGluZy1zdGFyIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBmb250LXNpemU6IDIwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1yYXRpbmctc3Rhcjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbWZ5LW1lbnUtc2Vjb25kYXJ5LWJnLCAjMzMzKSA2NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1yYXRpbmctZWRpdG9yIC5tanItcmF0aW5nLXN0YXI6aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjIpICFpbXBvcnRhbnQ7Cn0KCi5tanItcmF0aW5nLWVkaXRvciAubWpyLXJhdGluZy1zdGFyOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWZvY3VzLW91dGxpbmUtY29sb3IsICM0ZGFiZjcpOwogICAgb3V0bGluZS1vZmZzZXQ6IDJweDsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoKLm1qci1yYXRpbmctZWRpdG9yIC5tanItcmF0aW5nLXN0YXI6YWN0aXZlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSkgIWltcG9ydGFudDsKfQoKLyogVGFncyBFZGl0b3IgKi8KLm1qci10YWdzLWVkaXRvciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIG1pbi13aWR0aDogMjUwcHg7CiAgICBtYXgtd2lkdGg6IG1pbigzNTBweCwgY2FsYygxMDB2dyAtIDIwcHgpKTsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0Owp9CgoubWpyLXRhZ3MtZWRpdG9yLmlzLWRpc2FibGVkIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXRhZ3MtZGlzcGxheSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAzMnB4Owp9CgoubWpyLXRhZ3MtZW1wdHkgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi5tanItdGFnLWNoaXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDI0JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDQwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKTsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItdGFnLWNoaXAtcmVtb3ZlIHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiAwOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBjb2xvcjogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG9wYWNpdHk6IDAuNzsKfQoKLm1qci10YWctY2hpcC1yZW1vdmU6ZGlzYWJsZWQgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLXRhZ3MtaW5wdXQtd3JhcCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5tanItdGFnLWlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci10YWctaW5wdXQ6Zm9jdXMgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1hY2NlbnQpICFpbXBvcnRhbnQ7Cn0KCi5tanItdGFnLWNoaXA6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDM0JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKSAhaW1wb3J0YW50Owp9CgoubWpyLXRhZ3MtZHJvcGRvd24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAxMDAlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgbWFyZ2luLXRvcDogNHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBtYXgtaGVpZ2h0OiAxNTBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICB6LWluZGV4OiAxMDAwOwp9CgoubWpyLXRhZ3MtZHJvcGRvd24gW2RhdGEtcGMtc2VjdGlvbj0ibGlzdCJdIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLXRhZ3MtZHJvcGRvd24gW2RhdGEtcGMtc2VjdGlvbj0ib3B0aW9uIl0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKfQoKLm1qci10YWctc3VnZ2VzdGlvbiB7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLXRhZy1jb2xvcik7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5tanItdGFnLXN1Z2dlc3Rpb24uaXMtYWN0aXZlLAoubWpyLXRhZy1zdWdnZXN0aW9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSAyOCUsIHRyYW5zcGFyZW50KSAhaW1wb3J0YW50Owp9CgovKiBCYWRnZXMgSW50ZXJhY3RpdmUgKi8KLm1qci1yYXRpbmctYmFkZ2UsCi5tanItdGFncy1iYWRnZSB7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgoubWpyLXJhdGluZy1iYWRnZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXJhdGluZy1jb2xvcikgIWltcG9ydGFudDsKfQoKLm1qci10YWdzLWJhZGdlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKSAhaW1wb3J0YW50Owp9CgoubWpyLXJhdGluZy1iYWRnZTpob3ZlciwKLm1qci10YWdzLWJhZGdlOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNSk7CiAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjUpOwp9CgovKiBTY3JvbGxiYXIgZm9yIHRhZ3MgZHJvcGRvd24gKi8KLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogNnB4Owp9CgoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNDglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KCi5tanItdGFncy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgovKiBTaWRlYmFyIChjYW4gYmUgbGVmdCBvciByaWdodCkgKi8KLm1qci1zaWRlYmFyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDM7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS13cmFwIHsKICAgIG1hcmdpbjogMCAwIDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODIlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCwgOHB4KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci13b3JrZmxvdy10cmVlIHsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZWFlYWVhKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci13b3JrZmxvdy10cmVlLXNjcm9sbCB7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHBhZGRpbmc6IDJweCA0cHggNnB4Owp9CgoubWpyLXdvcmtmbG93LXRyZWUtbGlzdCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUtY29udGVudCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSwgNnB4KTsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUtY29udGVudDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS10b2dnbGUgewogICAgd2lkdGg6IDE0cHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjQpKTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXRvZ2dsZVtkYXRhLXAtbGVhZj0idHJ1ZSJdIHsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKfQoKLm1qci13b3JrZmxvdy10cmVlLWljb24gewogICAgd2lkdGg6IDhweDsKICAgIGZsZXg6IDAgMCA4cHg7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDcwJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgZm9udC1zaXplOiA3cHg7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1sYWJlbCB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4OiAxIDEgYXV0bzsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci13b3JrZmxvdy10cmVlLW5vZGUtbmFtZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS10eXBlIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW11dGVkKSA3NSUsIHZhcigtLWNvbnRlbnQtZmcpKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItc2lkZWJhci5pcy1vcGVuIHsKICAgIC8qIEJvcmRlciBpcyBzZXQgZHluYW1pY2FsbHkgYmFzZWQgb24gcG9zaXRpb24gKi8KfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1oZWFkZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMyk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogOHB4Owp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwp9CgovKiBDdXN0b20gUm9vdHMgUG9wb3ZlciBTdHlsaW5nICovCi5tanItY3VzdG9tLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAzMDBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHotaW5kZXg6IHZhcigtLW1qci1wb3BvdmVyLXotaW5kZXgpOwogICAgcGFkZGluZzogMTJweDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXBvcG92ZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXBvcG92ZXItcm93Omxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXBvcG92ZXItbGFiZWwgewogICAgd2lkdGg6IDYwcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1zZWxlY3QgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0biB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1idG46bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tcmlnaHQ6IDA7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1idG4ubWpyLXByaW1hcnkgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItY3VzdG9tLXBvcG92ZXIgLm1qci1idG4ubWpyLXByaW1hcnk6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI1JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgODAlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItc2VjdGlvbiB7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLXNlY3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpICFpbXBvcnRhbnQ7Cn0KCi8qIElubGluZSBTaWRlYmFyICh3aWR0aC1iYXNlZCB0cmFuc2l0aW9ucyBsaWtlIGFyY2hpdmVkIHZlcnNpb24pICovCi5tanItaW5saW5lLXNpZGViYXIgewogICAgd2lkdGg6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDQ4MHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHdpZHRoIDAuM3MgZWFzZSwKICAgICAgICBtaW4td2lkdGggMC4zcyBlYXNlOwp9CgoubWpyLWlubGluZS1zaWRlYmFyLmlzLW9wZW4gewogICAgd2lkdGg6IDQwMHB4OwogICAgbWluLXdpZHRoOiAyNjBweDsKfQoKLyogU3BhY2UgYmV0d2VlbiBzaWRlYmFyIGFuZCBncmlkICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1icm93c2UgewogICAgZ2FwOiAwOwp9CgovKiBCb3JkZXIgYmFzZWQgb24gcG9zaXRpb24gKi8KLm1qci1pbmxpbmUtc2lkZWJhcltkYXRhLXBvc2l0aW9uPSJsZWZ0Il0gewogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItaW5saW5lLXNpZGViYXJbZGF0YS1wb3NpdGlvbj0icmlnaHQiXSB7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgovKiBTaWRlYmFyIHBsYWNlaG9sZGVyICovCi5tanItc2lkZWJhci1wbGFjZWhvbGRlciB7CiAgICBwYWRkaW5nOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgovKiA9PT09PT09PT09IFZpZXdlciBDb21wb25lbnQgPT09PT09PT09PSAqLwoubWpyLXZpZXdlci1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIGJvdHRvbTogMDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC45NSk7CiAgICAvKiBTaXQgYWJvdmUgTUZWICgxMDAwMCkgc28gdGhlIGZ1bGwgdmlld2VyIGFsd2F5cyBjb3ZlcnMgdGhlIGZsb2F0aW5nIHBhbmVsICovCiAgICB6LWluZGV4OiAxMDAwMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KLyogRmFkZS1pbjogYW5pbWF0aW9uIHJlLXRyaWdnZXJzIGVhY2ggdGltZSBKUyBzd2l0Y2hlcyBkaXNwbGF5IGJhY2sgdG8gZmxleCAqLwoubWpyLXZpZXdlci1vdmVybGF5W3N0eWxlKj0iZmxleCJdIHsKICAgIGFuaW1hdGlvbjogbWpyLWZhZGUtaW4gMC4xOHMgZWFzZS1vdXQ7Cn0KCkBrZXlmcmFtZXMgbWpyLWZhZGUtaW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTk1KTsKICAgIH0KICAgIHRvIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7CiAgICB9Cn0KCi5tanItdmlld2VyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEycHggMjBweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxNzBkZWcsIHJnYmEoMjQsIDI3LCAzMywgMC45NiksIHJnYmEoMTcsIDE5LCAyNSwgMC45NykpOwogICAgYm9yZGVyLWJvdHRvbTogMC44cHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjIpOwogICAgY29sb3I6IHdoaXRlOwp9CgoubWpyLXZpZXdlci1maWxlbmFtZSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgbWF4LXdpZHRoOiA0MDBweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItdmlld2VyLW1vZGUtYnV0dG9ucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA2cHg7Cn0KCi5tanItdmlld2VyLW1vZGUtYnV0dG9ucyBidXR0b24gewogICAgcGFkZGluZzogNHB4IDEycHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIwNiwgMjExLCAyMTgsIDAuMSksIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wMykpOwogICAgYm9yZGVyOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMyk7CiAgICBjb2xvcjogcmdiYSgyMzAsIDIzMywgMjM4LCAwLjk1KTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE2czsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIGJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMTQpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDYpKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjQyKTsKfQoKLyogVmlld2VyIGNsb3NlIGJ1dHRvbiBwaW5uZWQgdG8gb3ZlcmxheSBjb3JuZXIgKi8KLm1qci12aWV3ZXItY2xvc2UsCi5tanItdmlld2VyLWZzIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjI2KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLXdpZHRoOiAwLjhweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIwNiwgMjExLCAyMTgsIDAuMDgpLCByZ2JhKDIwNiwgMjExLCAyMTgsIDAuMDIpKSwKICAgICAgICByZ2JhKDIwLCAyMywgMjksIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2UgewogICAgY29sb3I6ICNmZmY0ZjQgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMDUsIDgyLCA4MiwgMC41KSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIwNSwgODIsIDgyLCAwLjMpLCByZ2JhKDIwNSwgODIsIDgyLCAwLjEyKSksCiAgICAgICAgcmdiYSg1OCwgMTgsIDE4LCAwLjk0KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyMTksIDIxOSwgMC4xNiksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjA1LCA4MiwgODIsIDAuMDgpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWNsb3NlOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMzUsIDExMCwgMTEwLCAwLjM4KSwgcmdiYSgyMzUsIDExMCwgMTEwLCAwLjE2KSksCiAgICAgICAgcmdiYSg3MCwgMTgsIDE4LCAwLjk3KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIzNSwgMTM4LCAxMzgsIDAuNjQpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWZzOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjE0KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA2KSksCiAgICAgICAgcmdiYSgyMywgMjYsIDMyLCAwLjk1KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuMzgpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWNsb3NlIC5waSB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWV3ZXItY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXNpbmdsZSwKLm1qci12aWV3ZXItYWIsCi5tanItdmlld2VyLXNpZGVieXNpZGUgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KCi5tanItdmlld2VyLXNpbmdsZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZXdlci1zaW5nbGUgaW1nLAoubWpyLXZpZXdlci1zaW5nbGUgdmlkZW8gewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yczsKfQoKLm1qci12aWV3ZXItYXVkaW8tc2hlbGwgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTRweDsKICAgIHBhZGRpbmc6IDE4cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDE4JSAyMiUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjIpLCB0cmFuc3BhcmVudCAzMiUpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgODIlIDc0JSwgcmdiYSg4MiwgMjIwLCAxNTYsIDAuMTUpLCB0cmFuc3BhcmVudCAzNiUpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMTIsIDE4LCAyNiwgMC45OCksIHJnYmEoNCwgNywgMTEsIDAuOTkpKTsKfQoKLm1qci12aWV3ZXItYXVkaW8taGVhZGVyIHsKICAgIHdpZHRoOiBtaW4oMTA4MHB4LCA4OCUpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMTFweDsKICAgIG1pbi13aWR0aDogMDsKICAgIHBhZGRpbmc6IDAgOHB4Owp9CgoubWpyLXZpZXdlci1hdWRpby1pY29uIHsKICAgIHdpZHRoOiAzNHB4OwogICAgaGVpZ2h0OiAzNHB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDIycHggcmdiYSgwLCAwLCAwLCAwLjI2KTsKfQoKLm1qci12aWV3ZXItYXVkaW8tdGl0bGUtd3JhcCB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4Owp9CgoubWpyLXZpZXdlci1hdWRpby10aXRsZSB7CiAgICBtYXgtd2lkdGg6IG1pbig3NjBweCwgNzJ2dyk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI1Owp9CgoubWpyLXZpZXdlci1hdWRpby1tZXRhIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNTgpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwOwp9CgoubWpyLXZpZXdlci1hdWRpby12aXogewogICAgd2lkdGg6IG1pbigxOTIwcHgsIDk2JSk7CiAgICBhc3BlY3QtcmF0aW86IDE2IC8gOTsKICAgIGhlaWdodDogYXV0bzsKICAgIG1heC1oZWlnaHQ6IG1pbigxMDgwcHgsIDY4dmgpOwogICAgbWluLWhlaWdodDogMjYwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDkpOwogICAgYm9yZGVyLXJhZGl1czogMTZweDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAxKSksCiAgICAgICAgcmdiYSgyLCA1LCA5LCAwLjIyKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLAogICAgICAgIDAgMThweCA3MHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKLm1qci12aWV3ZXItYXVkaW8tc3JjIHsKICAgIHdpZHRoOiBtaW4oNjgwcHgsIDkwJSk7Cn0KCi5tanItdmlld2VyLWFiIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItdmlld2VyLXNpZGVieXNpZGUgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBnYXA6IDJweDsKfQoKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSA+IGRpdiB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7Cn0KCi5tanItdmlld2VyLXNpZGVieXNpZGUgaW1nLAoubWpyLXZpZXdlci1zaWRlYnlzaWRlIHZpZGVvIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwp9CgoubWpyLXZpZXdlci1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEycHggMjBweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBjb2xvcjogd2hpdGU7CiAgICBnYXA6IDIwcHg7Cn0KCi5tanItdmlld2VyLWZvb3RlciBidXR0b24gewogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwp9CgoubWpyLXZpZXdlci1mb290ZXIgYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci12aWV3ZXItbmF2IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxNHB4Owp9CgoubWpyLXZpZXdlci1uYXYtYnRuIHsKICAgIHdpZHRoOiA0MHB4ICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IDQwcHggIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHggIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC40MikgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxOTQsIDIwMCwgMjA4LCAwLjE4KSwgcmdiYSgxOTQsIDIwMCwgMjA4LCAwLjA3KSksCiAgICAgICAgcmdiYSgzNCwgMzgsIDQ0LCAwLjkyKSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjM0LCAyMzYsIDI0MCwgMC45NikgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMjBweCAhaW1wb3J0YW50OwogICAgZm9udC13ZWlnaHQ6IDcwMCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDsKICAgIHRleHQtc2hhZG93OiBub25lOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDAuMTRzIGVhc2UgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItbmF2LWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC41NikgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMDcsIDIxMiwgMjE5LCAwLjIpLCByZ2JhKDIwNywgMjEyLCAyMTksIDAuMSkpLAogICAgICAgIHJnYmEoMzksIDQzLCA0OSwgMC45NCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwp9CgoubWpyLXZpZXdlci1uYXYtYnRuOmFjdGl2ZTpub3QoOmRpc2FibGVkKSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCkgc2NhbGUoMC45OCk7CiAgICBmaWx0ZXI6IG5vbmU7Cn0KCi5tanItdmlld2VyLW5hdi1idG46ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC4zNCAhaW1wb3J0YW50OwogICAgZmlsdGVyOiBncmF5c2NhbGUoMC4yNSk7CiAgICBib3gtc2hhZG93OiBub25lOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWluZGV4IHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG1pbi13aWR0aDogNzRweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgY29sb3I6IHJnYmEoMjI2LCAyMjgsIDIzMywgMC45NCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE5NywgMjAzLCAyMTEsIDAuMTUpLCByZ2JhKDE5NywgMjAzLCAyMTEsIDAuMDYpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk3LCAyMDMsIDIxMSwgMC4zNCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIHBhZGRpbmc6IDVweCAxMXB4OwogICAgdGV4dC1zaGFkb3c6IG5vbmU7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7Cn0KCi5tanItdmlld2VyLXBsYXllcmJhciB7CiAgICBib3JkZXItcmFkaXVzOiAxOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTQsIDIwMCwgMjA4LCAwLjE2KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCB0b3AgbGVmdCwgcmdiYSg5MCwgMTUwLCAyNTUsIDAuMDgpLCB0cmFuc3BhcmVudCAzNiUpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxNjBkZWcsIHJnYmEoMjAsIDI0LCAzMCwgMC45NCksIHJnYmEoMTIsIDE1LCAyMSwgMC45OCkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksCiAgICAgICAgMCAxNnB4IDM2cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKICAgIC8qIG92ZXJmbG93IG11c3Qgc3RheSB2aXNpYmxlIHNvIHRoZSBzZWVrIHJ1bGVyIHRpY2tzL2xhYmVscyAodG9wOi0xNnB4IC8gdG9wOi0zNHB4KQogICAgICAgdGhhdCBhcmUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGFib3ZlIHRoZSBzZWVrIGJhciBhcmUgbm90IGNsaXBwZWQuICovCiAgICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLm1qci12aWV3ZXItdG9vbHMgewogICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAganVzdGlmeS1jb250ZW50OiBzdHJldGNoOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItdmlld2VyLWhlYWRlciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5tanItdmlld2VyLWhlYWRlcjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxOHB4OwogICAgcmlnaHQ6IDE4cHg7CiAgICB0b3A6IDQ0cHg7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksIHRyYW5zcGFyZW50KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YSB7CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlld2VyLWhlYWRlci10b3AgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHBhZGRpbmctcmlnaHQ6IDg0cHg7CiAgICBwYWRkaW5nLWxlZnQ6IDEycHg7Cn0KCi5tanItdmlld2VyLWhlYWRlci1hcmVhLS1sZWZ0IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4OiAxIDEgMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIgewogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItdmlld2VyLWhlYWRlci1hcmVhLS1yaWdodCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgZmxleDogMSAxIDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLXZpZXdlci10aXRsZS13cmFwIHsKICAgIHdpZHRoOiBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgbWF4LXdpZHRoOiBtaW4oMTAwJSwgY2FsYygxMDB2dyAtIDIyMHB4KSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLXZpZXdlci10aXRsZS1saW5lIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci12aWV3ZXItZmlsZW5hbWUgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxZW07CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbjogMCBhdXRvOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLXZpZXdlci1iYWRnZXMgewogICAgZ2FwOiA0cHg7Cn0KCi5tanItdmlld2VyLXRpdGxlLWxpbmUgLm1qci12aWV3ZXItYmFkZ2VzIHsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhLS1sZWZ0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKICAgIG1heC13aWR0aDogMTAwJTsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLWxlZnQ6ZW1wdHkgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLXJpZ2h0IHsKICAgIGp1c3RpZnktc2VsZjogZW5kOwogICAgd2lkdGg6IGZpdC1jb250ZW50OwogICAgbWF4LXdpZHRoOiAxMDAlOwp9CgoubWpyLXZpZXdlci1tb2RlLWJ1dHRvbnMgewogICAgZmxleDogMCAwIGF1dG87CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwp9CgoubWpyLXZpZXdlci10b29scy1kZWNrIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIGdhcDogOHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSksCiAgICAgICAgcmdiYSgxMCwgMTIsIDE2LCAwLjI0KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpLAogICAgICAgIDAgNnB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjEyKTsKICAgIHBhZGRpbmc6IDVweCA2cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWw6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwIDAgYXV0byAwOwogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHRyYW5zcGFyZW50LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpLCB0cmFuc3BhcmVudCk7CiAgICBvcGFjaXR5OiAwLjc7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtaGVhZCB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1oZWFkaW5nIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWV5ZWJyb3cgewogICAgZm9udC1zaXplOiA5cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMTRlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ2KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtdGl0bGUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxZW07CiAgICBjb2xvcjogcmdiYSgyNDgsIDI1MCwgMjUyLCAwLjk2KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9ImdyYWRlIl0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJvdmVybGF5Il0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJpbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSwKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iYWN0aW9ucyJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHksCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9ImluZm8iXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwIHsKICAgIHdpZHRoOiBhdXRvOwogICAgbWluLWhlaWdodDogMzBweDsKICAgIHBhZGRpbmc6IDVweCA3cHg7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSksCiAgICAgICAgcmdiYSgxMCwgMTIsIDE2LCAwLjE4KTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKTsKICAgIG1pbi13aWR0aDogZml0LWNvbnRlbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMTVweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbc3R5bGUqPSItLW1qci1ncm91cC1hY2NlbnQiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCB7CiAgICBjb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC45KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbc3R5bGUqPSItLW1qci1ncm91cC1hY2NlbnQiXSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuMzUpOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjaGFubmVsIl0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwsCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwsCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwsCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsIHsKICAgIG1pbi13aWR0aDogNDJweDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0ib3ZlcmxheSJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0gewogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktaW5zcGVjdCJdIHsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNoYW5uZWwiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iZXhwb3N1cmUiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iZ2FtbWEiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY29tcGFyZSJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhdWRpby12aXoiXSB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5tanItdmlld2VyLXRvb2xzLWFjdGlvbnMsCi5tanItdmlld2VyLXRvb2xzLW1ldGEgewogICAgd2lkdGg6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIHBhZGRpbmc6IDVweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWFjdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtbWV0YSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb24tLXByaW1hcnkgewogICAgbWFyZ2luLWxlZnQ6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLWFjdGlvbiArIC5tanItdmlld2VyLXRvb2xzLWFjdGlvbiB7CiAgICBtYXJnaW4tbGVmdDogNHB4Owp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3QgewogICAgbWluLWhlaWdodDogMjRweDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcmFuZ2UtaW5wdXQgewogICAgd2lkdGg6IDkycHggIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcmFuZ2Ugc3BhbiB7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiAxNDgwcHgpIHsKICAgIC5tanItdmlld2VyLXRvb2xzLWRlY2sgewogICAgICAgIGdhcDogNnB4OwogICAgfQp9CgpAbWVkaWEgKG1heC13aWR0aDogMTIyMHB4KSB7CiAgICAubWpyLXZpZXdlci1oZWFkZXItdG9wIHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgcGFkZGluZy1yaWdodDogODRweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWNlbnRlciwKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWNlbnRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleDogMSAxIDEwMCU7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgICAgICBwb3NpdGlvbjogc3RhdGljOwogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleDogMSAxIDEwMCU7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LXNlbGY6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1kZWNrIHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgb3ZlcmZsb3cteDogdmlzaWJsZTsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1wYW5lbCwKICAgIC5tanItdmlld2VyLXRvb2xzLWFjdGlvbnMsCiAgICAubWpyLXZpZXdlci10b29scy1tZXRhLAogICAgLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLW1ldGEgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIH0KfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY29tcGFyZSJdW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4xKTsKICAgIGJvcmRlci1sZWZ0LWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjYpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuMjIpOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjb21wYXJlIl1bZGF0YS1hY3RpdmU9IjEiXSAubWpyLXZpZXdlci10b29scy1zZWxlY3QgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjYpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuMTgpOwp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3Q6Zm9jdXMgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDY0LCAxNjAsIDI1NSwgMC4yMik7Cn0KCi8qIE5hdGl2ZSBkcm9wZG93bnM6IGhpbnQgZGFyayBVSSBhbmQgc3R5bGUgb3B0aW9ucyB3aGVuIHRoZSBicm93c2VyIGFsbG93cyBpdC4gKi8KLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIGNvbG9yLXNjaGVtZTogZGFyazsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IHsKICAgIG1pbi1oZWlnaHQ6IDI0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNDYpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA4cHggIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IG9wdGlvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7Cn0KCi5tanItdmlld2VyLXRvb2xzLXJhbmdlLWlucHV0OmZvY3VzIHsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItdmlld2VyLXRvb2wtYnRuLS1yZXNldCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbC1idG4gewogICAgbWluLWhlaWdodDogMjRweCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogOHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDc1KSwKICAgICAgICByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDI1KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTYpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7CiAgICBmb250LXNpemU6IDExcHggIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDAgOHB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2wtYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjI0KSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMSksCiAgICAgICAgcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjAzNSkKICAgICkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyNTUsIDE2NiwgOTIsIDAuMjIpLAogICAgICAgIHJnYmEoMjU1LCAxMTYsIDY0LCAwLjA4KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTYwLCA5MiwgMC4zNCkgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjM2LCAyMjQsIDAuOTYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjU1LCAxODAsIDEwOCwgMC4yOCksCiAgICAgICAgcmdiYSgyNTUsIDEyOCwgNzIsIDAuMTQpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxODQsIDExNiwgMC40NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSg5MiwgMjE5LCAxODYsIDAuMjIpLAogICAgICAgIHJnYmEoNDQsIDE3MCwgMTQ0LCAwLjA4KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDkyLCAyMTksIDE4NiwgMC4zNCkgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDIyNCwgMjU1LCAyNDgsIDAuOTYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMTAyLCAyMzAsIDE5NiwgMC4yOCksCiAgICAgICAgcmdiYSg1MiwgMTgyLCAxNTYsIDAuMTQpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTEwLCAyMzYsIDIwMiwgMC40NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMTI0LCAxNjYsIDI1NSwgMC4yMiksCiAgICAgICAgcmdiYSgxMDksIDg4LCAyMjIsIDAuMDgpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTMyLCAxNzAsIDI1NSwgMC4zNikgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDIzNiwgMjQyLCAyNTUsIDAuOTcpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl06aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDEzOCwgMTgwLCAyNTUsIDAuMyksCiAgICAgICAgcmdiYSgxMjQsIDEwMCwgMjMyLCAwLjE0KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE0OCwgMTg4LCAyNTUsIDAuNDgpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgZmlsdGVyOiBzYXR1cmF0ZSgxLjEyKSBicmlnaHRuZXNzKDEuMDQpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xNikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItaGVscCB7CiAgICBib3JkZXItcmFkaXVzOiAxNHB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDEzLCAxNywgMjIsIDAuOTYpLCByZ2JhKDgsIDExLCAxNiwgMC45OCkpICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDE4cHggMzRweCByZ2JhKDAsIDAsIDAsIDAuMzQpICFpbXBvcnRhbnQ7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiAxMjIwcHgpIHsKICAgIC5tanItdmlld2VyLXRvb2xzIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1hY3Rpb25zIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLXRvcCB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICAgICAganVzdGlmeS1pdGVtczogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1sZWZ0LAogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWNlbnRlciwKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1yaWdodCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLWxlZnQsCiAgICAubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tcmlnaHQgewogICAgICAgIGp1c3RpZnktc2VsZjogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLWJvZHkgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjIwcHgsIDFmcikpOwogICAgfQp9CgovKiA9PT09PT09PT09IEN1c3RvbSBWaWRlbyBDb250cm9scyAobm8gbmF0aXZlIGJhcikgPT09PT09PT09PSAqLwoubWpyLXZpZGVvLWhvc3QgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEycHg7CiAgICByaWdodDogMTJweDsKICAgIGJvdHRvbTogMTJweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgb3BhY2l0eTogMDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBlYXNlOwogICAgei1pbmRleDogNTsKfQoKLm1qci12aWRlby1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlkZW8tcm93LS10b3AgewogICAgZ2FwOiAxMnB4OwogICAgZGlzcGxheTogZ3JpZDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0byAxZnIgYXV0byBhdXRvOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0byAxZnIgYXV0byBhdXRvOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS1wcmV2aWV3IC5tanItdmlkZW8tcm93LS10b3AgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWRlby1yb3ctLWJvdHRvbSB7CiAgICBnYXA6IDhweDsKfQoKLm1qci12aWRlby1ncm91cCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdmlkZW8tbnVtIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXZpZGVvLW51bTpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zOCk7Cn0KCi5tanItdmlkZW8tbnVtLS1mcHMuaXMtb3ZlcnJpZGRlbiB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjQ1LCAxNTgsIDExLCAwLjgyKTsKICAgIGNvbG9yOiAjZmJiZjI0OwogICAgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE1OCwgMTEsIDAuMTQpOwp9CgoubWpyLXZpZGVvLW51bS0tZnBzLmlzLW92ZXJyaWRkZW46Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1MSwgMTkxLCAzNiwgMC45Nik7Cn0KCi5tanItdmlkZW8tbnVtLS1zcGVlZCB7CiAgICBjb2xvci1zY2hlbWU6IGRhcms7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi5tanItdmlkZW8tbnVtLS1zcGVlZCBvcHRpb24gewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7Cn0KCi5tanItdmlkZW8tZnJhbWUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIG1pbi13aWR0aDogNTJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdmlkZW8tZnJhbWUuaXMtc3RlcCB7CiAgICBjb2xvcjogI2ZmZDI0ZDsKfQoKLm1qci12aWRlby1ib3R0b20gewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDE7Cn0KCi5tanItdmlkZW8tYm90dG9tLS1sZWZ0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKfQoKLm1qci12aWRlby1ib3R0b20tLXJpZ2h0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLyogU2hvdyBjb250cm9scyBvbiBob3Zlci9mb2N1cyAodmlld2VyKS4gKi8KLm1qci12aWRlby1ob3N0OmhvdmVyIC5tanItdmlkZW8tY29udHJvbHMsCi5tanItdmlkZW8tY29udHJvbHM6Zm9jdXMtd2l0aGluIHsKICAgIG9wYWNpdHk6IDE7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKfQoKLyogUHJldmlldzoga2VlcCBjb250cm9scyB2aXNpYmxlIGJlY2F1c2UgdGhlIGFyZWEgaXMgc21hbGwuICovCi5tanItdmlkZW8tY29udHJvbHMtLXByZXZpZXcgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiAxMHB4OwogICAgdG9wOiBhdXRvOwogICAgYm90dG9tOiAxMHB4OwogICAgb3BhY2l0eTogMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogYXV0bzsKICAgIGhlaWdodDogYXV0bzsKICAgIGJhY2tkcm9wLWZpbHRlcjogbm9uZTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBub25lOwp9CgoubWpyLXZpZGVvLXByZXZpZXctYnRuIHsKICAgIHdpZHRoOiAzOHB4OwogICAgaGVpZ2h0OiAzOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlkZW8tcHJldmlldy1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjgpOwp9CgoubWpyLXZpZGVvLXByZXZpZXctYnRuIC5waSB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWRlby1idG4gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItdmlkZW8tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7Cn0KCi5tanItdmlkZW8tYnRuLmlzLW9uIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNjQsIDE2MCwgMjU1LCAwLjI1KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg2NCwgMTYwLCAyNTUsIDAuNTUpOwp9CgoubWpyLXZpZGVvLWJ0bi0taW4gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC4xMik7Cn0KCi5tanItdmlkZW8tYnRuLS1pbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC4xOCk7Cn0KCi5tanItdmlkZW8tYnRuLS1vdXQgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjU1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMSk7Cn0KCi5tanItdmlkZW8tYnRuLS1vdXQ6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4xNik7Cn0KCi5tanItdmlkZW8tdGltZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgbWluLXdpZHRoOiA5MnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdmlkZW8tdGltZWdyb3VwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHJnYmEoNjQsIDE5MCwgMjU1LCAwLjkyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNjQsIDE5MCwgMjU1LCAwLjEpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg2NCwgMTkwLCAyNTUsIDAuMjUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBwYWRkaW5nOiAxcHggOHB4OwogICAgbGluZS1oZWlnaHQ6IDE2cHg7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdmlkZW8tcmFuZ2UgewogICAgYWNjZW50LWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXNlZWsgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogODBweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDE7CiAgICAvKiBXZSBkcmF3IG91ciBvd24gcGxheWhlYWQvbWFya2VyczsgaGlkZSB0aGUgbmF0aXZlIHRodW1iICJkb3QiLiAqLwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgYXBwZWFyYW5jZTogbm9uZTsKfQoKLm1qci12aWRlby1yYW5nZS0tc2Vlazo6LXdlYmtpdC1zbGlkZXItdGh1bWIgewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3gtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLXJhbmdlLS1zZWVrOjotbW96LXJhbmdlLXRodW1iIHsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3gtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBtaW4td2lkdGg6IDgwcHg7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItdmlkZW8tc2Vlay16b25lcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IDUwJTsKICAgIGhlaWdodDogMTBweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMjsKfQoKLm1qci12aWRlby1zZWVrLXpvbmUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwp9CgovKiAwLi5JbjogdHJpbW1lZC1vdXQgcmFuZ2UuICovCi5tanItdmlkZW8tc2Vlay16b25lLS1sZWZ0VHJpbSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjE4KTsKfQoKLyogSW4uLk91dDogc2VsZWN0ZWQgcGxheWJhY2sgcmFuZ2UgaGlnaGxpZ2h0LiAqLwoubWpyLXZpZGVvLXNlZWstem9uZS0tc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogcmdiYSg2NCwgMTkwLCAyNTUsIDAuNTUpOwp9CgoubWpyLXZpZGVvLXNlZWstem9uZXMuaXMtZnVsbHJhbmdlIC5tanItdmlkZW8tc2Vlay16b25lLS1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwp9CgovKiBPdXQuLkVuZDogc2hvdyBvdXQtb2YtcmFuZ2UgZnJhbWVzIGFzIGEgZGlmZmVyZW50IGNvbG9yLiAqLwoubWpyLXZpZGVvLXNlZWstem9uZS0tcmlnaHRUcmltIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMik7Cn0KCi5tanItdmlkZW8tc2Vlay1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHRvcDogNTAlOwogICAgaGVpZ2h0OiAwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAzOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNTAlOwogICAgd2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIGN1cnNvcjogZXctcmVzaXplOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB0b3VjaC1hY3Rpb246IG5vbmU7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHotaW5kZXg6IDQ7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLWluOjphZnRlciwKLm1qci12aWRlby1zZWVrLWhhbmRsZS0tb3V0OjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHRvcDogNTAlOwogICAgd2lkdGg6IDJweDsKICAgIGhlaWdodDogMThweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC45NSk7CiAgICBib3JkZXItcmFkaXVzOiAycHg7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLWluOjphZnRlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLWluOjpiZWZvcmUsCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLW91dDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLWluOjpiZWZvcmUgewogICAgdG9wOiA0cHg7CiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItYm90dG9tOiA2cHggc29saWQgcmdiYSg3MCwgMjU1LCAxMjAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1vdXQ6OmJlZm9yZSB7CiAgICBib3R0b206IDRweDsKICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci10b3A6IDZweCBzb2xpZCByZ2JhKDI1NSwgNzAsIDcwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLXRpY2tzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHRvcDogLTE2cHg7CiAgICBoZWlnaHQ6IDEycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLXZpZGVvLXNlZWstbGFiZWxzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHRvcDogLTM0cHg7CiAgICBoZWlnaHQ6IDE0cHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Mik7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjU1KTsKfQoKLm1qci12aWRlby1zZWVrLWxhYmVsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItdmlkZW8tc2Vlay1wbGF5aGVhZC1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEycHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBwYWRkaW5nOiAxcHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTEwcHg7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMjBweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKICAgIHotaW5kZXg6IDQ7CiAgICAtLW1qci1tYXJrLWNvbG9yOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmstLWluIHsKICAgIC0tbWpyLW1hcmstY29sb3I6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLW1hcms6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiAycHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItbWFyay1jb2xvcik7CiAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKLm1qci12aWRlby1zZWVrLW1hcms6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtNXB4OwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItYm90dG9tOiA2cHggc29saWQgdmFyKC0tbWpyLW1hcmstY29sb3IpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyay0taW46OmFmdGVyIHsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLW1qci1tYXJrLWNvbG9yKTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmstLW91dDo6YWZ0ZXIgewogICAgdG9wOiBhdXRvOwogICAgYm90dG9tOiAtNXB4OwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIGJvcmRlci10b3A6IDZweCBzb2xpZCB2YXIoLS1tanItbWFyay1jb2xvcik7Cn0KCi5tanItdmlkZW8tc2Vlay1wbGF5aGVhZCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC0xMnB4OwogICAgd2lkdGg6IDJweDsKICAgIGhlaWdodDogMjRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyMDAsIDcwLCAwLjk1KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xcHgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgewogICAgcG9zaXRpb246IHN0YXRpYzsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogYXV0bzsKICAgIGJvdHRvbTogYXV0bzsKICAgIG9wYWNpdHk6IDE7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHdpZHRoOiAxMDAlOwogICAgbWF4LXdpZHRoOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMTRweDsKICAgIGJvcmRlci1yYWRpdXM6IDE4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTIpOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IHRvcCBsZWZ0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpLCB0cmFuc3BhcmVudCAzNCUpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTk4LCAyMDMsIDIxMCwgMC4wMjUpLCByZ2JhKDE5OCwgMjAzLCAyMTAsIDAuMDA4KSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE2NWRlZywgcmdiYSgxOCwgMjIsIDI4LCAwLjgyKSwgcmdiYSgxMiwgMTUsIDIxLCAwLjkpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpLAogICAgICAgIDAgMTBweCAzMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IG5vbmU7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogbm9uZTsKICAgIGdhcDogMTJweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuIHsKICAgIG1pbi1oZWlnaHQ6IDM4cHg7CiAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDcpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDIpKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxOTQsIDIwMSwgMjA4LCAwLjE4KTsKICAgIGJvcmRlci13aWR0aDogMXB4OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMC4xMnMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTJzIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDAuMTJzIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAwLjEycyBlYXNlOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG46aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMjYpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksCiAgICAgICAgMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTQpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4uaXMtb24gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxMDAsIDE3MCwgMjU1LCAwLjIpLCByZ2JhKDEwMCwgMTcwLCAyNTUsIDAuMDgpKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMjAsIDE4NiwgMjU1LCAwLjQyKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDEyMCwgMTg2LCAyNTUsIDAuMTIpIGluc2V0Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWFjdGlvbnMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcikgYXV0byBtaW5tYXgoMCwgMWZyKTsKICAgIGdhcDogMTJweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1zdGF0dXMsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1zaWRlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItY2VudGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1oZWFkIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1zaWRlLS1yaWdodCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBtaW5tYXgoMCwgMWZyKSBhdXRvOwogICAgZ2FwOiAxMnB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyLm1qci12aWRlby1jb250cm9scy0tYXVkaW8gLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBhdXRvIGF1dG87Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhci5tanItdmlkZW8tY29udHJvbHMtLWF1ZGlvIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7CiAgICBncmlkLXJvdzogMTsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIubWpyLXZpZGVvLWNvbnRyb2xzLS1hdWRpbyAubWpyLXZpZGVvLWdyb3VwLS1pbiwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyLm1qci12aWRlby1jb250cm9scy0tYXVkaW8gLm1qci12aWRlby1ncm91cC0tb3V0IHsKICAgIGdyaWQtcm93OiAyOwogICAgd2lkdGg6IG1heC1jb250ZW50OwogICAgbWF4LXdpZHRoOiAxMDAlOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1tZWRpYS1iYWRnZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzgsIDIyNCwgMTk2LCAwLjEyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNzgsIDIyNCwgMTk2LCAwLjIyKTsKICAgIGNvbG9yOiByZ2JhKDIyMCwgMjQ3LCAyNDEsIDAuOTYpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lZ3JvdXAgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1mcmFtZSB7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgY29sb3I6IHJnYmEoMjI4LCAyMzAsIDIzNCwgMC45Mik7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZnJhbWUgewogICAgbWluLXdpZHRoOiA5NHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogNXB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNDUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdGltZSB7CiAgICBtaW4td2lkdGg6IGF1dG87CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1yYW5nZS0tc2VlayB7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBhY2NlbnQtY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC45Mik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgIGNvbG9yOiByZ2JhKDIyMiwgMjI1LCAyMzAsIDAuOTUpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NCwgMjAxLCAyMDksIDAuMjYpOwogICAgYm9yZGVyLXdpZHRoOiAwLjhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTk0LCAyMDEsIDIwOSwgMC4wOCk7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAgewogICAgbWluLWhlaWdodDogMzZweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzNSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1ncm91cC0tYWRqdXN0LWxlZnQsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1hZGp1c3QtcmlnaHQsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1zcGVlZCB7CiAgICBnYXA6IDhweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tbnVtIHsKICAgIG1pbi1oZWlnaHQ6IDM0cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSg5LCAxMiwgMTYsIDAuNTUpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNDUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuLS1wbGF5IHsKICAgIG1pbi13aWR0aDogODhweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBtaW4taGVpZ2h0OiA0NHB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1zZWVrLXpvbmVzIHsKICAgIGhlaWdodDogMTJweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tc2Vlay1oYW5kbGUgewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDM0cHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXZvbHVtZS13cmFwIHsKICAgIHBhZGRpbmc6IDAgNHB4Owp9CgoubWpyLXZpZGVvLXJhbmdlLS12b2x1bWUgewogICAgd2lkdGg6IDkwcHg7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA5ODBweCkgewogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWhlYWQsCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItYWN0aW9ucywKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CgogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWNlbnRlciwKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1zaWRlLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBnYXA6IDEwcHg7CiAgICB9CgogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweDsKICAgIH0KfQoKLyogPT09PT09PT09PSBDb250ZXh0IE1lbnUgQ29tcG9uZW50ID09PT09PT09PT0gKi8KLm1qci1jb250ZXh0LW1lbnUgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMyk7CiAgICBtaW4td2lkdGg6IDIwMHB4OwogICAgLyogQWJvdmUgdmlld2VyIG92ZXJsYXkgKDEwMDAxKSBhbmQgTUZWIGRpYWxvZyAoMTAwMDApICovCiAgICB6LWluZGV4OiAxMDAwMjsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwYWRkaW5nOiA0cHggMDsKICAgIGFuaW1hdGlvbjogbWpyLWNvbnRleHQtbWVudS1pbiAwLjE1cyBlYXNlLW91dDsKfQoKLm1qci1jb250ZXh0LW1lbnUsCi5tanItY29udGV4dC1tZW51ICogewogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKQGtleWZyYW1lcyBtanItY29udGV4dC1tZW51LWluIHsKICAgIGZyb20gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01cHgpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgfQp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtIHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBwYWRkaW5nOiA4cHggMTRweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXI6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3gtc2hhZG93OiBub25lOwogICAgbWFyZ2luOiAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbTo6LW1vei1mb2N1cy1pbm5lciB7CiAgICBib3JkZXI6IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWdyYXBoLW1hcCB7CiAgICBjb2xvcjogI2Y1YzU0MjsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLXJlbmFtZSB7CiAgICBjb2xvcjogIzVkYTlmZjsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWRlbGV0ZSB7CiAgICBjb2xvcjogI2ZmNWY1ZjsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWZsb2F0aW5nLXZpZXdlciB7CiAgICBjb2xvcjogIzVmZDM4ZDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWdyYXBoLW1hcDpob3ZlciwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWdyYXBoLW1hcDpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjQ1LCAxOTcsIDY2LCAwLjE0KTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLXJlbmFtZTpob3ZlciwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLXJlbmFtZTpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTMsIDE2OSwgMjU1LCAwLjE0KTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWRlbGV0ZTpob3ZlciwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy10b25lLWRlbGV0ZTpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA5NSwgOTUsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZmxvYXRpbmctdmlld2VyOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZmxvYXRpbmctdmlld2VyOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSg5NSwgMjExLCAxNDEsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLWRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1jb250ZXh0LW1lbnUtc2VwYXJhdG9yIHsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyLWNvbG9yKTsKICAgIG1hcmdpbjogNHB4IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1hcmdpbi1sZWZ0OiAxNnB4Owp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLWxlZnQgaSB7CiAgICB3aWR0aDogMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDAuODI7Cn0KCi5tanItY29udGV4dC1tZW51LWhpbnQgewogICAgb3BhY2l0eTogMC41ODsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItY29udGV4dC1tZW51LXN1Ym1lbnUtYXJyb3cgewogICAgb3BhY2l0eTogMC43MjsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFkZC10by1jb2xsZWN0aW9uLW1lbnUgewogICAgbWluLXdpZHRoOiAyNjBweDsKICAgIG1heC13aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMTZweCkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEycHgpOwp9CgoubWpyLWNvbnRleHQtbWVudS10aXRsZSB7CiAgICBwYWRkaW5nOiA4cHggMTRweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvcik7CiAgICBvcGFjaXR5OiAwLjkyOwp9CgoubWpyLWNvbnRleHQtbWVudS1ub3RlIHsKICAgIHBhZGRpbmc6IDEwcHggMTRweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNzIlLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1Owp9CgoubWpyLWdyaWQtcG9wb3ZlciwKLm1qci12aWV3ZXItcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDI1MHB4OwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItdmlld2VyLW92ZXJsYXkgKiwKICAgIC5tanItdmlkZW8tY29udHJvbHMsCiAgICAubWpyLWNvbnRleHQtbWVudSB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgIHNjcm9sbC1iZWhhdmlvcjogYXV0byAhaW1wb3J0YW50OwogICAgfQp9CgovKiBIaWRlIGhlYWRlciAodG9vbGJhcikgd2hlbiB2aWV3ZXIgb3ZlcmxheSBpcyBpbiBmdWxsc2NyZWVuICovCi5tanItdmlld2VyLW92ZXJsYXk6ZnVsbHNjcmVlbiAubWpyLXZpZXdlci1oZWFkZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgTWFqb29yIEZsb2F0aW5nIFZpZXdlciAoTUZWKSAtIHBvcnRhbGVkIHRvIGRvY3VtZW50LmJvZHkKICAgUmVkZWNsYXJlcyBDU1MgdmFyaWFibGVzIHNvIHRoZSBwYW5lbCB3b3JrcyBvdXRzaWRlIC5tanItYXNzZXRzLW1hbmFnZXIKICAgKHNhbWUgcGF0dGVybiBhcyAubWpyLXBvcG92ZXIpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoubWpyLW1mdiB7CiAgICAtLW1qci1zdXJmYWNlLTA6IHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpOwogICAgLS1tanItc3VyZmFjZS0xOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIC0tbWpyLXN1cmZhY2UtMjogdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpOwogICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICAtLW1qci1hY2NlbnQ6IHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZik7CiAgICAtLW1qci1zdGF0dXMtc3VjY2VzczogdmFyKC0tY29tZnktc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApOwoKICAgIGZvbnQtZmFtaWx5OiB2YXIoCiAgICAgICAgLS1jb21meS1mb250LAogICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgc3lzdGVtLXVpLAogICAgICAgIC1hcHBsZS1zeXN0ZW0sCiAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICBSb2JvdG8sCiAgICAgICAgQXJpYWwsCiAgICAgICAgc2Fucy1zZXJpZgogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CgogICAgLyogVmlzdWFsIGNocm9tZSAqLwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCA4cHggMzJweCByZ2JhKDAsIDAsIDAsIDAuNTUpLAogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMyk7Cn0KCi5tanItbWZ2ICogewogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKaHRtbC5tanItbWZ2LXBvcG91dC1kb2N1bWVudCB7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudCgKICAgICAgICAgICAgMTIwMHB4IDQyMHB4IGF0IDUwJSAwJSwKICAgICAgICAgICAgY29sb3ItbWl4KAogICAgICAgICAgICAgICAgaW4gc3JnYiwKICAgICAgICAgICAgICAgIHZhcigtLXByaW1hcnktYmFja2dyb3VuZCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTAlLAogICAgICAgICAgICAgICAgdHJhbnNwYXJlbnQKICAgICAgICAgICAgKSwKICAgICAgICAgICAgdHJhbnNwYXJlbnQgNjIlCiAgICAgICAgKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICAgIDE4MGRlZywKICAgICAgICAgICAgY29sb3ItbWl4KAogICAgICAgICAgICAgICAgaW4gc3JnYiwKICAgICAgICAgICAgICAgIHZhcigtLWludGVyZmFjZS1wYW5lbC1zdXJmYWNlLCB2YXIoLS1jb250ZW50LWJnLCAjMTYxOTFmKSkgODIlLAogICAgICAgICAgICAgICAgIzAwMCAxOCUKICAgICAgICAgICAgKSwKICAgICAgICAgICAgY29sb3ItbWl4KAogICAgICAgICAgICAgICAgaW4gc3JnYiwKICAgICAgICAgICAgICAgIHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMxZjIyMjcpKSA4NCUsCiAgICAgICAgICAgICAgICAjMDAwIDE2JQogICAgICAgICAgICApCiAgICAgICAgKTsKfQoKYm9keS5tanItbWZ2LXBvcG91dC1ib2R5IHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgojbWpyLW1mdi1wb3BvdXQtcm9vdCwKLm1qci1tZnYtcG9wb3V0LXJvb3QgewogICAgaXNvbGF0aW9uOiBpc29sYXRlOwp9CgovKiAtLSBIZWFkZXIgKGRyYWcgaGFuZGxlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgY3Vyc29yOiBtb3ZlOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogNnB4OwogICAgbWluLWhlaWdodDogMzRweDsKfQoKLm1qci1tZnYtaGVhZGVyLXRpdGxlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZmxleDogMTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjI4cHg7Cn0KCi8qIC0tIFRvb2xiYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtdG9vbGJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA1MCUsIHZhcigtLW1qci1zdXJmYWNlLTEpIDUwJSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBmbGV4LXNocmluazogMDsKICAgIG1pbi1oZWlnaHQ6IDM2cHg7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7Cn0KLm1qci1tZnYtdG9vbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci1tZnYtdG9vbGJhci1zZXAgewogICAgd2lkdGg6IDFweDsKICAgIGhlaWdodDogMThweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1ib3JkZXIpOwogICAgbWFyZ2luOiAwIDNweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLW1mdi1wcm9ncmVzcyB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgaGVpZ2h0OiAyMnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDcyJSwgIzAwMCAyOCUpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItbWZ2LXByb2dyZXNzLmlzLWNsaWNrYWJsZSB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItbWZ2LXByb2dyZXNzLmlzLWNsaWNrYWJsZTpob3ZlciB7CiAgICBmaWx0ZXI6IGJyaWdodG5lc3MoMS4wMyk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLWJhciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IDAlOwogICAgdHJhbnNpdGlvbjogd2lkdGggNzBtcyBlYXNlLWluLW91dDsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1ub2RlcyB7CiAgICB0b3A6IDA7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDY4JSwgIzBiMzUxMyAzMiUpOwp9CgoubWpyLW1mdi1wcm9ncmVzcy1iYXItLXN0ZXBzIHsKICAgIHRvcDogNTAlOwogICAgaGVpZ2h0OiA1MCU7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjQlLCAjMGIyMzQwIDM2JSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLmlzLWVycm9yIC5tanItbWZ2LXByb2dyZXNzLWJhci0tbm9kZXMsCi5tanItbWZ2LXByb2dyZXNzLmlzLWVycm9yIC5tanItbWZ2LXByb2dyZXNzLWJhci0tc3RlcHMgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNkOTUzNGYgNzglLCAjNGExNDE0IDIyJSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpLCByZ2JhKDAsIDAsIDAsIDAuMTgpKTsKICAgIG1peC1ibGVuZC1tb2RlOiBzY3JlZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtdGV4dCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAyOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBwYWRkaW5nOiAwIDhweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0ZXh0LXNoYWRvdzogMCAwIDJweCByZ2JhKDAsIDAsIDAsIDAuOSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgoubWpyLW1mdi1waW4tZ3JvdXAgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogMnB4OwogICAgZmxleC1zaHJpbms6IDA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9Ci5tanItbWZ2LXBpbi1idG4gewogICAgd2lkdGg6IDI2cHg7CiAgICBoZWlnaHQ6IDI2cHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBsaW5lLWhlaWdodDogMjRweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlOwp9Ci5tanItbWZ2LXBpbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7Cn0KLm1qci1tZnYtcGluLWJ0bi5pcy1waW5uZWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCAjZmZmZmZmIDEyJSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNDIlLCB2YXIoLS1tanItYWNjZW50KSA1OCUpOwogICAgY29sb3I6ICNlZWY3ZmY7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgovKiAtLSBQaW4gZ3JvdXA6IG5vdyBhIGRyb3Bkb3duIG1lbnUgKGRpc3BsYXk6bm9uZSBieSBkZWZhdWx0LCBmbGV4IHdoZW4gLmlzLW9wZW4pIC0tICovCi5tanItbWZ2LXBpbi1ncm91cCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiBjYWxjKDEwMCUgKyA0cHgpOwogICAgbGVmdDogMDsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgbWluLXdpZHRoOiA3MHB4OwogICAgcGFkZGluZzogNHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjU1KTsKfQoubWpyLW1mdi1waW4tZ3JvdXAuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4Owp9Ci5tanItbWZ2LXBpbi1idG4gewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2U7Cn0KLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KLm1qci1tZnYtcGluLWJ0bi5pcy1waW5uZWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCAjZmZmZmZmIDEyJSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMykgNDIlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSA1OCUpOwogICAgY29sb3I6ICNlZWY3ZmY7Cn0KCi8qIC0tIEljb24gRHJvcGRvd24gY29tcG9uZW50ICgubWpyLW1mdi1pZHJvcCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWlkcm9wIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLW1mdi1pZHJvcC1tZW51IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB6LWluZGV4OiAxMDAxMDsKICAgIG1pbi13aWR0aDogMTEwcHg7CiAgICBwYWRkaW5nOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoubWpyLW1mdi1pZHJvcC1tZW51LmlzLW9wZW4gewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci1tZnYtaWRyb3AtaXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzIGVhc2U7Cn0KLm1qci1tZnYtaWRyb3AtaXRlbTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9Ci5tanItbWZ2LWlkcm9wLWl0ZW0uaXMtc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTYpOwogICAgY29sb3I6ICNhOGQ4ZmY7Cn0KLm1qci1tZnYtaWRyb3AtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSAhaW1wb3J0YW50Owp9Ci8qIENoYW5uZWwgdHJpZ2dlcjogc2xpZ2h0bHkgd2lkZXIgdG8gZml0ICJSR0IiICovCi5tanItbWZ2LWNoLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLyogVG9vbGJhciBpY29uLWJ1dHRvbiBwb3BvdmVycyAoY2hhbm5lbCwgZ3VpZGVzLCBwaW4sIGZvcm1hdCAtIHNvcnQtc3R5bGUgY29udGV4dCBtZW51cykgKi8KLm1qci1tZnYtY2gtcG9wb3ZlciwKLm1qci1tZnYtZ3VpZGVzLXBvcG92ZXIsCi5tanItbWZ2LXBpbi1wb3BvdmVyLAoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBtaW4td2lkdGg6IDEyMHB4OwogICAgcGFkZGluZzogNnB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICB6LWluZGV4OiAxMDAxMDsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci1tZnYtY2gtcG9wb3Zlci5pcy1vcGVuLAoubWpyLW1mdi1ndWlkZXMtcG9wb3Zlci5pcy1vcGVuLAoubWpyLW1mdi1waW4tcG9wb3Zlci5pcy1vcGVuLAoubWpyLW1mdi1mb3JtYXQtcG9wb3Zlci5pcy1vcGVuIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9Ci8qIFRvb2xiYXIgaWNvbiBpbWFnZXMgLSBjaCBpY29uIGlzIGJsYWNrIChpbnZlcnRlZCksIGd1aWRlcyBpY29uIGlzIG5hdGl2ZSB3aGl0ZSAqLwoubWpyLW1mdi1jaC1pY29uIHsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgZmlsdGVyOiBpbnZlcnQoMSk7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtZ3VpZGVzLWljb24gewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtY2gtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0sCi5tanItbWZ2LWd1aWRlcy10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSwKLm1qci1tZnYtcGluLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdLAoubWpyLW1mdi1mb3JtYXQtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSAhaW1wb3J0YW50Owp9Ci8qIFBpbiBzbG90IGFjdGl2ZSBzdGF0ZSAqLwoubWpyLW1mdi1waW4tcG9wb3ZlciAubWpyLW1lbnUtaXRlbS5pcy1waW5uZWQgewogICAgYmFja2dyb3VuZDogcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTYpOwogICAgY29sb3I6ICNhOGQ4ZmY7Cn0KLm1qci1tZnYtcGluLXBvcG92ZXIgLm1qci1tZW51LWl0ZW0uaXMtcGlubmVkIC5tanItbWVudS1pdGVtLWNoZWNrIHsKICAgIG9wYWNpdHk6IDEgIWltcG9ydGFudDsKfQovKiBGb3JtYXQgcG9wb3Zlcjogc2VwYXJhdG9yICsgb3BhY2l0eSBzbGlkZXIgcm93ICovCi5tanItbWZ2LWZvcm1hdC1zZXAgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgbWFyZ2luOiA0cHggMnB4Owp9Ci5tanItbWZ2LWZvcm1hdC1zbGlkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4IDJweDsKfQoubWpyLW1mdi1mb3JtYXQtc2xpZGVyLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIG9wYWNpdHk6IDAuNjU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZmxleC1zaHJpbms6IDA7Cn0KLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiA3MHB4OwogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciAubWpyLW1mdi10b29sYmFyLXJhbmdlLW91dCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBvcGFjaXR5OiAwLjY1OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMzBweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBmbGV4LXNocmluazogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgOCUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyNCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi8qIFVuaXZlcnNhbCBhY3RpdmUgaGlnaGxpZ2h0IC0gYW55IGFyaWEtcHJlc3NlZD0idHJ1ZSIgYnV0dG9uIGdldHMgYWNjZW50IGdsb3cuCiAgIFBsYWNlZCBiZWZvcmUgdGhlIGNvbG9yZWQgYWN0aXZlIGNsYXNzZXMgc28gdGhleSBjYW4gb3ZlcnJpZGUgd2l0aCB0aGVpciBvd24gY29sb3IuICovCi5tanItbWZ2IC5tanItaWNvbi1idG5bYXJpYS1wcmVzc2VkPSJ0cnVlIl0gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk1LCAxNzksIDI1NSwgMC41NSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMykgODAlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxNSUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoubWpyLW1mdiAubWpyLWljb24tYnRuW2FyaWEtcHJlc3NlZD0idHJ1ZSJdIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtc3VjY2Vzcyk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDEyJSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLWxpdmUtYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1hY2NlbnQpIDEyJSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbm9kZXN0cmVhbS1hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLAogICAgICAgIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMTIlCiAgICApOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDI1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLyogUG9wLWluIG1vZGUgKHZpZXdlciBwb3BwZWQgb3V0KTogcmFpc2UgYnV0dG9uIGNvbnRyYXN0L2JyaWdodG5lc3MgKi8KLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksCiAgICAgICAgMCAyNHB4IDU2cHggcmdiYSgwLCAwLCAwLCAwLjQyKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MCUsIHJnYmEoMCwgMCwgMCwgMC4yNCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1oZWFkZXItdGl0bGUgewogICAgb3BhY2l0eTogMC45ODsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgOTQlLCAjZmZmZmZmIDYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXRvb2xiYXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgODglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTAlLCByZ2JhKDAsIDAsIDAsIDAuMjQpKQogICAgKTsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtdG9vbGJhci1zZXAgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1wcm9ncmVzcyB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA4MiUsICMwYTExMTggMTglKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTIlLCAjMDAwIDglKQogICAgKTsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtcHJvZ3Jlc3MtdGV4dCB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDk0JSwgI2ZmZmZmZiA2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1jb250ZW50IHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KAogICAgICAgICAgICBjaXJjbGUgYXQgdG9wLAogICAgICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTAlLCB0cmFuc3BhcmVudCkgMCUsCiAgICAgICAgICAgIHRyYW5zcGFyZW50IDQyJQogICAgICAgICksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgyJSwgIzAwMCAxOCUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0biB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgOTIlLCAjZmZmZmZmIDglKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksCiAgICAgICAgMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTgpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU4JSwgdmFyKC0tbWpyLWFjY2VudCkgNDIlKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjIlLCB2YXIoLS1tanItYWNjZW50KSAzOCUpCiAgICApOwogICAgY29sb3I6ICNmNGY4ZmYgIWltcG9ydGFudDsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4gLnBpIHsKICAgIG9wYWNpdHk6IDE7CiAgICBjb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0bi5tanItbGl2ZS1hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2MCUsICNmZmZmZmYgNDAlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAzNiUsIHZhcigtLW1qci1zdXJmYWNlLTEpIDY0JSkKICAgICk7CiAgICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiksCiAgICAgICAgMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDI0JSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAxOHB4IHJnYmEoNzYsIDE3NSwgODAsIDAuMTgpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0bi5tanItcHJldmlldy1hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzNiUsIHZhcigtLW1qci1zdXJmYWNlLTEpIDY0JSkKICAgICk7CiAgICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiksCiAgICAgICAgMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyNCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMThweCByZ2JhKDk1LCAxNzksIDI1NSwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMjQlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAwIDE4cHggcmdiYSgyNTUsIDE1MiwgMCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA5MiUsICNmZmZmZmYgOCUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU2JSwgdmFyKC0tbWpyLWFjY2VudCkgNDQlKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlLCB2YXIoLS1tanItYWNjZW50KSAzNiUpCiAgICApOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtcGluLWJ0bi5pcy1waW5uZWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzNiUsIHZhcigtLW1qci1zdXJmYWNlLTEpIDY0JSkKICAgICk7CiAgICBjb2xvcjogI2ZmZmZmZjsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5NCUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgYm9yZGVyLWxlZnQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMXB4IDAgMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLXdzLXNpZGViYXIgewogICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhci1oZWFkZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyLXRpdGxlIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgODIlLCB2YXIoLS1tanItbXV0ZWQpIDE4JSk7CiAgICBvcGFjaXR5OiAwLjg4Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1ub2RlIHsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMCkpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTgwZGVnLAogICAgICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgODYlLCB2YXIoLS1tanItYWNjZW50KSAxNCUpLAogICAgICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODYlLCByZ2JhKDAsIDAsIDAsIDAuMTQpKQogICAgICAgICk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtdGl0bGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA5NCUsICNmZmZmZmYgNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy13aWRnZXQtbGFiZWwsCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXItZW1wdHksCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtZW1wdHkgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDg0JSwgI2ZmZmZmZiAxNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1pbnB1dCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzQlLCAjMDUwNzBhIDI2JSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCkpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1pbnB1dDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTAlKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpLAogICAgICAgIDAgMCAwIDJweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXBvcGluLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA0NSUsIHZhcigtLW1qci1hY2NlbnQpIDU1JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKfQoKLyogLS0gQ29udGVudCB3cmFwcGVyIChob3Jpem9udGFsIGZsZXg6IGNvbnRlbnQgKyBzaWRlYmFyKSAtLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1jb250ZW50LXdyYXBwZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGNvbnRhaW5lci10eXBlOiBpbmxpbmUtc2l6ZTsKfQoKLyogLS0gU2lkZWJhciBwb3NpdGlvbiB2YXJpYW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJsZWZ0Il0gewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLXdzLXNpZGViYXIgewogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgaGVpZ2h0IDAuMnMgZWFzZSwKICAgICAgICB3aWR0aCAwczsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci13cy1zaWRlYmFyLm9wZW4gewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDIyMHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDEyMHB4OwogICAgbWF4LWhlaWdodDogNjUlOwp9CgovKiAtLSBDb250ZW50IGFyZWEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWNvbnRlbnQgewogICAgZmxleDogMTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBiYWNrZ3JvdW5kOiAjMGQwZDBkOwogICAgbWluLWhlaWdodDogMDsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXIgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXg6IDAgMCAzMjBweDsKICAgIHdpZHRoOiAzMjBweDsKICAgIG1pbi13aWR0aDogMjEwcHg7CiAgICBtYXgtd2lkdGg6IG1pbig0MiUsIDQyMHB4KTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDE4LCAyMCwgMC45Nik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXIub3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTBweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJpZ2h0OiBub25lOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXIgewogICAgZmxleDogMCAwIGNsYW1wKDE5MHB4LCAzMiUsIDI4MHB4KTsKICAgIHdpZHRoOiAxMDAlOwogICAgbWF4LXdpZHRoOiBub25lOwogICAgbWluLXdpZHRoOiAwOwogICAgbWF4LWhlaWdodDogNDYlOwogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTQpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1zZWN0aW9uIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nLXRvcDogOHB4OwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItc2VjdGlvbjpmaXJzdC1vZi10eXBlIHsKICAgIHBhZGRpbmctdG9wOiAwOwogICAgYm9yZGVyLXRvcDogbm9uZTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItaGVhZGluZyB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Mik7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDEwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci5vcGVuIHsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItdGl0bGUgewogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1zZWN0aW9uIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWluLWhlaWdodDogYXV0bzsKICAgIHBhZGRpbmctdG9wOiA0cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1oZWFkaW5nIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgY29sdW1uczogMyAxNzBweDsKICAgIGNvbHVtbi1nYXA6IDEwcHg7CiAgICBjb2x1bW4tZmlsbDogYmFsYW5jZTsKICAgIG1pbi1oZWlnaHQ6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyZmxvdy15OiB2aXNpYmxlOwogICAgcGFkZGluZy1yaWdodDogMnB4OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSA+ICogewogICAgZGlzcGxheTogZmxleDsKICAgIGJyZWFrLWluc2lkZTogYXZvaWQ7CiAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgbWFyZ2luLWJsb2NrOiAwIDEwcHg7Cn0KCi5tanItbWZ2LWdlbi10aW1lLWJhZGdlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDIyNCwgMjU1LCAxMjIsIDAuNDIpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDIyNCwgMjU1LCAxMjIsIDAuMTYpLCByZ2JhKDc2LCAxNzUsIDgwLCAwLjEpKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDIyNCwgMjU1LCAxMjIsIDAuMTIpIGluc2V0OwogICAgY3Vyc29yOiBjb3B5OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDAuMTZzIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDAuMTZzIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAwLjE2cyBlYXNlOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXRpbWUtYmFkZ2UgewogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYm9yZGVyLXJhZGl1czogNnB4Owp9CgoubWpyLW1mdi1nZW4tdGltZS1sYWJlbCB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Owp9CgoubWpyLW1mdi1nZW4tdGltZS12YWx1ZSB7CiAgICBjb2xvcjogI2UwZmY3YTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBmb250LWZhbWlseTogQ29uc29sYXMsIE1vbmFjbywgbW9ub3NwYWNlOwp9CgoubWpyLW1mdi1nZW4tY2FyZCB7CiAgICAtLW1qci1tZnYtZ2VuLWFjY2VudDogIzIxOTZmMzsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgNDUlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTM1ZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpIDAlLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDglLCB0cmFuc3BhcmVudCkgMTAwJQogICAgKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSAxNCUsIHRyYW5zcGFyZW50KSBpbnNldDsKICAgIGN1cnNvcjogY29weTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE2cyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjE2cyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMC4xNnMgZWFzZTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkIHsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLXBvc2l0aXZlLXByb21wdCwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1uZWdhdGl2ZS1wcm9tcHQsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tcHJvbXB0IHsKICAgIG1pbi1oZWlnaHQ6IDExMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLXdvcmtmbG93IHsKICAgIG1pbi1oZWlnaHQ6IDU4cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tbW9kZWwtYW5kLWxvcmEsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tbW9kZWxzLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLXNhbXBsaW5nLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWdlbmVyYXRpb24tcGlwZWxpbmUsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tdGV4dC10by1pbWFnZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1pbWFnZS10by1pbWFnZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1pbnBhaW50LAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLXVwc2NhbGUsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tcmVmaW5lIHsKICAgIG1pbi1oZWlnaHQ6IDg2cHg7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1zZWVkIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYm9yZGVyLXdpZHRoOiAycHg7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgewogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCAubWpyLW1mdi1nZW4tY2FyZC10aXRsZSwKLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQ6aG92ZXIsCi5tanItbWZ2LWdlbi10aW1lLWJhZGdlOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgNzAlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgMjQlLCB0cmFuc3BhcmVudCkKICAgICAgICBpbnNldDsKfQoKLm1qci1tZnYtZ2VuLWNvcHktZmxhc2ggewogICAgYmFja2dyb3VuZDogcmdiYSg3NiwgMTc1LCA4MCwgMC4yOCkgIWltcG9ydGFudDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdGl0bGUgewogICAgY29sb3I6IHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG1pbi13aWR0aDogMDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IDU7CiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOwp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1jb21wYWN0IHsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWNvbXBhY3QgewogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtbXVsdGlsaW5lIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtLXNlZWQgLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGZvbnQtZmFtaWx5OiBDb25zb2xhcywgTW9uYWNvLCBtb25vc3BhY2U7CiAgICBsZXR0ZXItc3BhY2luZzogMXB4OwogICAgY29sb3I6ICNmZmY7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWZpZWxkcyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICBnYXA6IDhweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWZpZWxkcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogN3B4OwogICAgLXdlYmtpdC1saW5lLWNsYW1wOiB1bnNldDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtYnJhbmNoLWdyb3VwcyB7CiAgICBnYXA6IDEwcHg7Cn0KCi5tanItbWZ2LWdlbi1icmFuY2gtZ3JvdXAgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDdweDsKICAgIG1pbi13aWR0aDogMDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNDUpOwp9CgoubWpyLW1mdi1nZW4tYnJhbmNoLXRpdGxlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjZweDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5tanItbWZ2LWdlbi1maWVsZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoNzhweCwgYXV0bykgMWZyOwogICAgZ2FwOiAxMHB4OwogICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWZpZWxkIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDU0cHgsIGF1dG8pIG1pbm1heCgwLCAxZnIpOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWZpZWxkLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWZ2LWdlbi1maWVsZC1sYWJlbCB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDE4MCwgMTgwLCAxODAsIDAuNzIpKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5tanItbWZ2LWdlbi1maWVsZC12YWx1ZSB7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkpOwogICAgbWluLXdpZHRoOiAwOwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdlYzhmZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmZkNDdhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2RkYThhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcgewogICAgY29sb3I6ICNkNDhjZmY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjdhOWY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcgewogICAgY29sb3I6ICM3YWZmZDQ7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2UwZmY3YTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBkaXYgewogICAgbWFyZ2luLWJvdHRvbTogNXB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBkaXYgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgPiBkaXYsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5ID4gc2VjdGlvbiB7CiAgICBtYXJnaW4tYmxvY2s6IDAgMTBweDsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBkaXY6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgpAY29udGFpbmVyIChtYXgtd2lkdGg6IDc2MHB4KSB7CiAgICAubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSB7CiAgICAgICAgY29sdW1uczogYXV0bzsKICAgICAgICBjb2x1bW4tY291bnQ6IDE7CiAgICAgICAgY29sdW1uLXdpZHRoOiBhdXRvOwogICAgfQoKICAgIC5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5ID4gKiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICB9Cn0KCi5tanItbWZ2LW92ZXJsYXktY2FudmFzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDEyOwp9CgoubWpyLW1mdi10b29sYmFyLXNlbGVjdCB7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBwYWRkaW5nOiAwIDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMC44cHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjI0KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNiksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wMikpOwogICAgY29sb3I6IHJnYmEoMjMwLCAyMzMsIDIzOCwgMC45Mik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLW1mdi10b29sYmFyLXJhbmdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi10b29sYmFyLXJhbmdlIGlucHV0W3R5cGU9InJhbmdlIl0gewogICAgd2lkdGg6IDcycHg7CiAgICBhY2NlbnQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44NSk7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2Utb3V0IHsKICAgIG1pbi13aWR0aDogMzBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLyogRVYgc2xpZGVyIGFjdGl2ZSBzdGF0ZSAodmFsdWUgIT0gMCkgKi8KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBhY2NlbnQtY29sb3I6ICNmNWM4NDI7Cn0KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgY29sb3I6ICNmNWM4NDI7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwcHg7CiAgICBsZWZ0OiAxMHB4OwogICAgei1pbmRleDogNjsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMjBweCk7CiAgICBwYWRkaW5nOiA1cHggOXB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSkgODglLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg1LCA4LCAxNCwgMC44NikgODYlLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExKSAxNCUpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY3ZmEpOwogICAgYm94LXNoYWRvdzogMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMTZzIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzLmlzLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgI2ZmNWM3YSkgNzIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg2MCwgMTAsIDE4LCAwLjkpIDgyJSwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzExMSkgMTglKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MtdGV4dCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjsKfQoKLyogLS0gV29ya2Zsb3cgU2lkZWJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLXNpZGViYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICB3aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKTsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjJzIGVhc2U7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci13cy1zaWRlYmFyLm9wZW4gewogICAgd2lkdGg6IDI2MHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1pbi13aWR0aDogMTgwcHg7CiAgICBtYXgtd2lkdGg6IDY1JTsKICAgIHRyYW5zaXRpb246IG5vbmU7Cn0KCi5tanItd3Mtc2lkZWJhci1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgbWluLWhlaWdodDogMzRweDsKfQoubWpyLXdzLXNpZGViYXItdGl0bGUgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICBvcGFjaXR5OiAwLjY1Owp9Ci5tanItd3Mtc2lkZWJhci1ib2R5IHsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDA7Cn0KLm1qci13cy1zaWRlYmFyLWVtcHR5IHsKICAgIHBhZGRpbmc6IDI0cHggMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDEuNTsKfQoKLyogLS0gVGFiIGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy10YWItYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItd3MtdGFiIHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNXMsCiAgICAgICAgY29sb3IgMC4xNXM7Cn0KCi5tanItd3MtdGFiOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNyk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTsKfQoKLm1qci13cy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKICAgIGNvbG9yOiAjNjM5YmZmOwp9CgovKiAtLSBOb2RlcyB0YWIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLW5vZGVzLXRhYiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogR3JhcGggTWFwIHRhYiAqLwoubWpyLXdnbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDEwMCU7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbWFwLXdyYXAgewogICAgaGVpZ2h0OiAxOTBweDsKICAgIG1pbi1oZWlnaHQ6IDE1MHB4OwogICAgbWFyZ2luOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yMik7Cn0KCi5tanItd2dtLXByZXZpZXcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMyKTsKfQoKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1tZWRpYSwKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1wbGF5ZXItaG9zdCwKLm1qci13Z20tcHJldmlldyAubWpyLW1vZGVsM2QtaG9zdCwKLm1qci13Z20tcHJldmlldy1tZWRpYSB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwp9CgoubWpyLXdnbS1wcmV2aWV3LWVtcHR5IHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1jYW52YXMgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGN1cnNvcjogZ3JhYjsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKfQoKLm1qci13Z20tY2FudmFzOmFjdGl2ZSB7CiAgICBjdXJzb3I6IGdyYWJiaW5nOwp9CgoubWpyLXdnbS0tbGFyZ2UgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLW1hcC13cmFwIHsKICAgIGZsZXg6IDE7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgbWFyZ2luOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogMDsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLXN0YXR1cyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMHB4OwogICAgdG9wOiAxMHB4OwogICAgei1pbmRleDogMjsKICAgIG1heC13aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwp9CgoubWpyLXdnbS10b29sYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEwcHg7CiAgICB0b3A6IDQ2cHg7CiAgICB6LWluZGV4OiAyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDZweDsKICAgIG1heC13aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7Cn0KCi5tanItd2dtLW1vZGUgewogICAgbWluLWhlaWdodDogMjZweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci13Z20tbW9kZTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTQ5LCAxODMsIDI1NSwgMC40NSk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1tb2RlLmlzLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTI0LCAxODYsIDI1NSwgMC42Mik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc5LCAxMjMsIDIxNCwgMC4yNik7CiAgICBjb2xvcjogcmdiYSgyMzUsIDI0NSwgMjU1LCAwLjk2KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLWRldGFpbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDEwcHg7CiAgICB0b3A6IDEwcHg7CiAgICBib3R0b206IDEwcHg7CiAgICB6LWluZGV4OiAyOwogICAgd2lkdGg6IG1pbigzMjBweCwgMzglKTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDIwLCAyNiwgMC44NCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7Cn0KCi5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1hY3Rpb24gewogICAgbWluLWhlaWdodDogMzBweDsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLXBhcmFtIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci13Z20tc3RhdHVzIHsKICAgIHBhZGRpbmc6IDAgMTBweCA4cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1Owp9CgoubWpyLXdnbS1kZXRhaWxzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiAwIDhweCAxMHB4Owp9CgoubWpyLXdnbS1ub2RlLXRpdGxlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1tZXRhIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBtYXJnaW4tdG9wOiAtNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40Mik7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KCi5tanItd2dtLWJyZWFkY3J1bWIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1hcmdpbjogLTJweCAwIDJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNTgpOwogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1icmVhZGNydW1iLWl0ZW0gewogICAgbWluLXdpZHRoOiAwOwogICAgbWF4LXdpZHRoOiAxNDBweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd2dtLWJyZWFkY3J1bWItc2VwIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzIpOwp9CgoubWpyLXdnbS1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGdhcDogNHB4Owp9CgoubWpyLXdnbS1hY3Rpb24gewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDdweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc2KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci13Z20tYWN0aW9uOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5OSwgMTU1LCAyNTUsIDAuNDUpOwogICAgYmFja2dyb3VuZDogcmdiYSg5OSwgMTU1LCAyNTUsIDAuMTIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7Cn0KCi5tanItd2dtLWFjdGlvbi5pcy1vayB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzYsIDE3NSwgODAsIDAuNTUpOwogICAgY29sb3I6IHJnYmEoMTkwLCAyNTUsIDE5NiwgMC45Nik7Cn0KCi5tanItd2dtLXBhcmFtcyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7Cn0KCi5tanItd2dtLXBhcmFtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg2NHB4LCAwLjQyZnIpIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA1cHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci13Z20tcGFyYW06aG92ZXIsCi5tanItd2dtLXBhcmFtOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItd2dtLXBhcmFtLmlzLW9rIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3OSwgMjEwLCAxMjUsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC4xNik7Cn0KCi5tanItd2dtLXBhcmFtLmlzLWVycm9yIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDkwLCA5MCwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA5MCwgOTAsIDAuMTYpOwp9CgoubWpyLXdnbS1wYXJhbS1rZXkgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDgpOwp9CgoubWpyLXdnbS1wYXJhbS12YWx1ZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44Mik7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxMTUsIDE1NSwgMjU1LCAwLjg4KTsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0OiByZ2JhKDExNSwgMTU1LCAyNTUsIDAuMjIpOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogOHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgcGFkZGluZzogOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQpIDM0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLAogICAgICAgIDAgMTBweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQpIDEwMCUsIHRyYW5zcGFyZW50KSwgcmdiYSg0NCwgNTYsIDg4LCAwLjIpKSwKICAgICAgICByZ2JhKDEzLCAxNiwgMjQsIDAuODUpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBoZWlnaHQ6IDJweDsKICAgIG1hcmdpbjogLThweCAtOHB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB2YXIoLS1tanItd2dtLW5vZGUtYWNjZW50KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLW1vZGVsIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxMjQsIDE4NiwgMjU1LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoNzAsIDEyMywgMTgxLCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtc2FtcGxlciB7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQ6IHJnYmEoMTQzLCAyMjgsIDE2NywgMC45KTsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0OiByZ2JhKDY0LCAxMzMsIDg4LCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtdGV4dCB7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQ6IHJnYmEoMjU1LCAxOTIsIDExNCwgMC45KTsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0OiByZ2JhKDE1NCwgMTAyLCA0OSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLW1lZGlhIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxNTQsIDE3MCwgMjU1LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoODMsIDkzLCAxNjUsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1jb250cm9sIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgyNTUsIDEzOSwgMTY5LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTQ1LCA3MCwgOTUsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1sb2dpYyB7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQ6IHJnYmEoMTg4LCAxNjgsIDI1NSwgMC45KTsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudC1zb2Z0OiByZ2JhKDEwNSwgODYsIDE1MywgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZy1ib3R0b206IDZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXdnbS1ub2RlLWFjY2VudCkgMjUlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwtdHlwZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHJnYmEoMjM2LCAyNDQsIDI1NSwgMC45NCk7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC1pZCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgxOTQsIDIxMywgMjU1LCAwLjc4KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0cyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItd2dtLW5vZGUtcG9ydHMtY29sIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci13Z20tbm9kZS1wb3J0cy10aXRsZSB7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzLWxpc3QgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogM3B4Owp9CgoubWpyLXdnbS1ub2RlLXBvcnQsCi5tanItd2dtLW5vZGUtcG9ydC1lbXB0eSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLWhlaWdodDogMThweDsKICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI0KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LWVtcHR5IHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjYpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZG90IHsKICAgIHdpZHRoOiA4cHg7CiAgICBoZWlnaHQ6IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSBpbnNldDsKfQoKLm1qci13Z20tbm9kZS1wb3J0LWRvdC5pcy1pbiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEzNSwgMTk2LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC1kb3QuaXMtb3V0IHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTQ0LCAyMzgsIDE3NCwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LW5hbWUgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc4KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LXR5cGUgewogICAgZmxleDogMCAwIGF1dG87CiAgICBtYXgtd2lkdGg6IDQ1JTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDlweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgcGFkZGluZzogMXB4IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBjb2xvcjogcmdiYSgyMjQsIDIzNiwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldHMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLXdnbS1ub2RlLXdpZGdldHMtdGl0bGUgewogICAgbWFyZ2luLWJvdHRvbTogMnB4OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ1KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQsCi5tanItd2dtLW5vZGUtd2lkZ2V0LWVtcHR5IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg3MHB4LCAwLjQyZnIpIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yKTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQgewogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0OmhvdmVyLAoubWpyLXdnbS1ub2RlLXdpZGdldDpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW9rIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3OSwgMjEwLCAxMjUsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC4xNik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLWVycm9yIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDkwLCA5MCwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA5MCwgOTAsIDAuMTYpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC1lbXB0eSB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC1rZXkgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNTIpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC12YWx1ZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44OCk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW11bHRpbGluZSB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgIGdhcDogNHB4Owp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1tdWx0aWxpbmUgLm1qci13Z20tbm9kZS13aWRnZXQta2V5IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW11bHRpbGluZSAubWpyLXdnbS1ub2RlLXdpZGdldC12YWx1ZSB7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIG1heC1oZWlnaHQ6IDkuMmVtOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmctcmlnaHQ6IDJweDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lLmlzLXRleHQtZmllbGQgLm1qci13Z20tbm9kZS13aWRnZXQtdmFsdWUgewogICAgbWF4LWhlaWdodDogMTZlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LW1vcmUgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40Nik7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDgyMHB4KSB7CiAgICAubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tZGV0YWlscyB7CiAgICAgICAgd2lkdGg6IG1pbigzODBweCwgY2FsYygxMDAlIC0gMjBweCkpOwogICAgfQoKICAgIC5tanItd2dtLW5vZGUtcG9ydHMgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQp9CgoubWpyLXdzLXNlYXJjaC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLXdzLXNlYXJjaC1pY29uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDE2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItd3Mtc2VhcmNoIHsKICAgIGZsZXg6IDE7CiAgICBwYWRkaW5nOiA0cHggMjhweCA0cHggMjZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44NSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdzLXNlYXJjaDo6cGxhY2Vob2xkZXIgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yOCk7Cn0KCi5tanItd3Mtc2VhcmNoOmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5OSwgMTU1LCAyNTUsIDAuNSk7Cn0KCi5tanItd3Mtc2VhcmNoLWNsZWFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci13cy1zZWFyY2gtY2xlYXI6aG92ZXIgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItd3Mtbm9kZXMtbGlzdCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDRweCAwOwp9CgoubWpyLXdzLW5vZGUtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTJweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgbWluLWhlaWdodDogMzJweDsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKfQoKLm1qci13cy1ub2RlLXJvdzpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXdzLW5vZGUtcm93LXR5cGUgewogICAgZmxleDogMTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci13cy1ub2RlLXJvdy10aXRsZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1heC13aWR0aDogODBweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLW5vZGUtbG9jYXRlIHsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgd2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xcywKICAgICAgICBjb2xvciAwLjFzLAogICAgICAgIGJhY2tncm91bmQgMC4xczsKfQoKLm1qci13cy1ub2RlLXJvdzpob3ZlciAubWpyLXdzLW5vZGUtbG9jYXRlIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItd3Mtbm9kZS1sb2NhdGU6aG92ZXIgewogICAgY29sb3I6ICM2MzliZmY7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC4xNSk7Cn0KCi8qIC0tIE5vZGUgc2VjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3MtdHJlZS1pdGVtIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoubWpyLXdzLXRyZWUtaXRlbSA+IC5tanItd3Mtbm9kZSB7CiAgICBib3JkZXItYm90dG9tOiBub25lOwp9Ci5tanItd3MtdHJlZS1pdGVtLS1zdWJncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNCUsIHRyYW5zcGFyZW50IDk2JSk7Cn0KLm1qci13cy1ub2RlIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQovKiBTdWJ0bGUgaGlnaGxpZ2h0IHdoZW4gdGhpcyBub2RlIG1hdGNoZXMgdGhlIGN1cnJlbnQgZ3JhcGggc2VsZWN0aW9uLiAqLwoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjEwLCA5MCwgMC4wOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAycHggMCAwIDAgcmdiYSgyNTUsIDIxMCwgOTAsIDAuNzUpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmZmQ0NWEgMTglLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA4MiUpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10eXBlIHsKICAgIGNvbG9yOiAjZmZkNDVhOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIyNCwgMTMwLCAwLjg4KTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtdG9nZ2xlLAoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLWxvY2F0ZSwKLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLWtpbmQgewogICAgY29sb3I6ICNmZmQ0NWE7Cn0KLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDE0cHg7CiAgICB6LWluZGV4OiAyOwogICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKfQoKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNTAlOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDRweDsKICAgIGhlaWdodDogNTZweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMTVzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZCAwLjE1cyBlYXNlOwp9CgoubWpyLXdzLXNpZGViYXIub3Blbjpob3ZlciAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXIuaXMtcmVzaXppbmcgLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIuaXMtZHJhZ2dpbmc6OmJlZm9yZSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLXdzLXNpZGViYXIuaXMtcmVzaXppbmcgLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6aG92ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIuaXMtZHJhZ2dpbmc6OmJlZm9yZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0icmlnaHQiXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICByaWdodDogMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBsZWZ0OiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDQwJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA2MCUKICAgICk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnMgZWFzZTsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNpYmxlIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgMjglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDcyJQogICAgKTsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUuaXMtY29sbGFwc2VkIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTIlCiAgICApOwp9Ci5tanItd3Mtbm9kZS10b2dnbGUgewogICAgZmxleDogMCAwIGF1dG87Cn0KLm1qci13cy1ub2RlLXRpdGxlLXdyYXAgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxcHg7Cn0KLm1qci13cy1ub2RlLXR5cGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLm1qci13cy1ub2RlLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLW5vZGUta2luZCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWF4LXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMzglLCB0cmFuc3BhcmVudCA2MiUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMTIlLCB0cmFuc3BhcmVudCA4OCUpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA3OCUsICNmZmZmZmYgMjIlKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoubWpyLXdzLW5vZGUta2luZCAucGkgewogICAgZm9udC1zaXplOiAxMHB4Owp9Ci5tanItd3Mtbm9kZS1raW5kLWNvdW50IHsKICAgIG1pbi13aWR0aDogMTRweDsKICAgIHBhZGRpbmc6IDAgM3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44Mik7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNlZCAubWpyLXdzLW5vZGUtYm9keSB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItd3Mtbm9kZS1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKfQoubWpyLXdzLW5vZGUtZW1wdHkgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIHBhZGRpbmc6IDRweCAwOwp9CgovKiAtLSBOZXN0ZWQgbm9kZXMgKGluc2lkZSBzdWJncmFwaHMpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3Mtbm9kZS0tbmVzdGVkIHsKICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgcmdiYSg5MSwgMTM4LCAyNDAsIDAuMzUpOwp9Ci5tanItd3Mtbm9kZS0tbmVzdGVkIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgcGFkZGluZy1sZWZ0OiAxNnB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNSUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTUlCiAgICApOwp9Ci5tanItd3Mtbm9kZS0tbmVzdGVkLmlzLWNvbGxhcHNpYmxlIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMTAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDkwJQogICAgKTsKfQoKLyogLS0gU3ViZ3JhcGggY2hpbGRyZW4gZ3JvdXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy1jaGlsZHJlbi10b2dnbGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDIwcHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA2JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSA5NCUKICAgICk7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgb3BhY2l0eTogMC44OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDAuMXMgZWFzZTsKfQoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZS0tbmVzdGVkIHsKICAgIHBhZGRpbmctbGVmdDogMjhweDsKfQoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZTpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMTIlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDg4JQogICAgKTsKfQoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZVthcmlhLWV4cGFuZGVkPSJ0cnVlIl0gewogICAgb3BhY2l0eTogMTsKfQoubWpyLXdzLWNoaWxkcmVuIHsKICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgcmdiYSg5MSwgMTM4LCAyNDAsIDAuMjUpOwogICAgbWFyZ2luLWxlZnQ6IDZweDsKICAgIHBhZGRpbmctbGVmdDogNnB4Owp9CgoubWpyLXdzLXdpZGdldC1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA4cHg7Cn0KLm1qci13cy13aWRnZXQtcm93LS1ibG9jayB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7Cn0KLm1qci13cy13aWRnZXQtcm93LS1ibG9jayAubWpyLXdzLXdpZGdldC1sYWJlbCB7CiAgICBmbGV4OiBub25lOwogICAgcGFkZGluZy10b3A6IDA7Cn0KLm1qci13cy13aWRnZXQtcm93LS1ibG9jayAubWpyLXdzLXdpZGdldC1pbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKfQoubWpyLXdzLXdpZGdldC1sYWJlbCB7CiAgICBmbGV4OiAwIDAgODBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41NSkpOwogICAgcGFkZGluZy10b3A6IDVweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLm1qci13cy13aWRnZXQtaW5wdXQgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLXdzLWlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcsICMyMjIpOwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBvdXRsaW5lOiBub25lOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7Cn0KLm1qci13cy1pbnB1dDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9Ci5tanItd3MtdGV4dGFyZWEgewogICAgcmVzaXplOiBub25lOwogICAgbWluLWhlaWdodDogMjhweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBvdmVyZmxvdy15OiBoaWRkZW47Cn0KLm1qci13cy10ZXh0LXdyYXBwZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KLm1qci13cy10ZXh0LXdyYXBwZXIgLm1qci13cy10ZXh0YXJlYSB7CiAgICB3aWR0aDogMTAwJTsKfQoubWpyLXdzLWV4cGFuZC1idG4gewogICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiBub25lOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMCA0cHg7CiAgICBvcGFjaXR5OiAwLjg7Cn0KLm1qci13cy1leHBhbmQtYnRuOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoubWpyLXdzLXJlYWRvbmx5IHsKICAgIG9wYWNpdHk6IDAuNTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoubWpyLXdzLWNoZWNrYm94IHsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIG1hcmdpbi10b3A6IDRweDsKfQoubWpyLXdzLXRvZ2dsZS1sYWJlbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLyogLS0gTG9jYXRlIGJ1dHRvbiBpbnNpZGUgbm9kZSBoZWFkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy1sb2NhdGUgewogICAgd2lkdGg6IDI0cHggIWltcG9ydGFudDsKICAgIGhlaWdodDogMjRweCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC41Owp9Ci5tanItd3MtbG9jYXRlOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi8qIC0tIFJ1biBidXR0b24gc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LXJ1bi1jb250cm9scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKfQoubWpyLW1mdi1ydW4tYnRuIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKTsKfQoubWpyLW1mdi1ydW4tYnRuLnJ1bm5pbmcgLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwp9Ci5tanItbWZ2LXJ1bi1idG4uc3RvcHBpbmcgLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZmE3MjYpOwp9Ci5tanItbWZ2LXJ1bi1idG4uZXJyb3IgLnBpIHsKICAgIGNvbG9yOiAjZjQ0MzM2Owp9CgoubWpyLW1mdi1zdG9wLWJ0biAucGkgewogICAgY29sb3I6ICNlZjUzNTA7Cn0KLm1qci1tZnYtc3RvcC1idG4uYWN0aXZlIC5waSB7CiAgICBjb2xvcjogI2ZmOGE2NTsKfQoubWpyLW1mdi1zdG9wLWJ0bi5zdG9wcGluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmYTcyNik7Cn0KCi8qIC0tIEZsb2F0aW5nIFZpZXdlciBzaW1wbGUgdmlkZW8gcGxheWVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtc2ltcGxlLXBsYXllciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLmlzLWF1ZGlvIHsKICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgMjAlIDIwJSwgcmdiYSg5NSwgMTc5LCAyNTUsIDAuMiksIHJnYmEoMTgsIDIwLCAyOCwgMC45NSkpOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWF1ZGlvLWJhY2tkcm9wIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4OwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogMThweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1jb250cm9scyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMnB4OwogICAgcmlnaHQ6IDEycHg7CiAgICBib3R0b206IDEycHg7CiAgICB6LWluZGV4OiAzMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA5cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDE0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgcmdiYSgxMCwgMTAsIDE0LCAwLjc2KSwgcmdiYSgxNiwgMTYsIDI0LCAwLjU1KSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXJvdyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrIHsKICAgIC0tbWpyLXNlZWstcGN0OiAwJTsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIHRvIHJpZ2h0LAogICAgICAgICNmZjJmNTIgMCUsCiAgICAgICAgI2ZmMmY1MiB2YXIoLS1tanItc2Vlay1wY3QpLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgdmFyKC0tbWpyLXNlZWstcGN0KSwKICAgICAgICByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjQpIDEwMCUKICAgICk7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2Vlazo6LXdlYmtpdC1zbGlkZXItdGh1bWIgewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDEycHg7CiAgICBoZWlnaHQ6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7CiAgICBiYWNrZ3JvdW5kOiAjZmYyZjUyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWs6Oi1tb3otcmFuZ2UtdGh1bWIgewogICAgd2lkdGg6IDEycHg7CiAgICBoZWlnaHQ6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7CiAgICBiYWNrZ3JvdW5kOiAjZmYyZjUyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWJ0biB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMzBweDsKICAgIG1pbi13aWR0aDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYnRuIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1idG4uaXMtZGlzYWJsZWQsCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2Vlay5pcy1kaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjQ1OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXRpbWUgewogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItZnJhbWUgewogICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICBwYWRkaW5nOiAzcHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdC0tYXVkaW8gewogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAyMCUgMjAlLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yKSwgcmdiYSgxOCwgMjAsIDI4LCAwLjk1KSk7Cn0KCi5tanItbWZ2LXBsYXllci1hdWRpby1iYWNrZHJvcCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjJweDsKICAgIHRleHQtc2hhZG93OiAwIDJweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC40NSk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHBhZGRpbmc6IDE4cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scyB7CiAgICB6LWluZGV4OiAzMDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSB7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJvdy0tdG9wLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby10aW1lZ3JvdXAsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby10aW1lZ3JvdXAgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1yb3ctLWJvdHRvbSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tYm90dG9tLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYm90dG9tIHsKICAgIGZsZXgtc2hyaW5rOiAxOwogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby10cmFuc3BvcnQsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby10cmFuc3BvcnQgewogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1ncm91cCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWdyb3VwIHsKICAgIGZsZXgtd3JhcDogbm93cmFwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tc2Vlay13cmFwLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLyogVGhlIE1GViB1c2VzIHRoZSAiLS12aWV3ZXIiIGNvbnRyb2wgdmFyaWFudCwgd2hpY2ggKHVubGlrZSAiLS12aWV3ZXJiYXIiKQogICBkb2VzIG5vdCBzaXplIHRoZSBuYXRpdmUgc2VlayBpbnB1dCBhbmQgcGFja3MgZnJhbWUvaW4vc2Vlay9vdXQvdGltZSBpbnRvIGEKICAgc2luZ2xlIHJvdy4gSW4gdGhlIG5hcnJvdyBNRlYgdGhlIHNlZWsgd3JhcCB0aGVuIGNvbGxhcHNlcyB0byB+MHB4IHdpZGUgYW5kCiAgIHRoZSBuYXRpdmUgaW5wdXQgdG8gMHB4IHRhbGwsIGxlYXZpbmcgYWxtb3N0IG5vIGNsaWNrIC8gZHJhZyB0YXJnZXQgZm9yCiAgIHNjcnViYmluZy4gR2l2ZSB0aGUgc2VlayBpdHMgb3duIGZ1bGwtd2lkdGggcm93IHdpdGggYSB1c2FibGUgaGl0IGFyZWEuICovCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcm93LWdhcDogNDJweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyIC5tanItdmlkZW8tcm93LS10b3AgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgb3JkZXI6IDEwOwogICAgZmxleDogMSAxIDEwMCU7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDQycHg7CiAgICBwYWRkaW5nLXRvcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXIgLm1qci12aWRlby1yYW5nZS0tc2VlayB7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBhY2NlbnQtY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC45Mik7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXIgLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMjhweDsKICAgIHRvcDogMjBweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWJhci10aW1lbGluZSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLXNlZWstd3JhcCwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBvcmRlcjogLTE7CiAgICBmbGV4OiAxIDEgMTAwJTsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLW91dCwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1pbiwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1vdXQgewogICAgZmxleDogMCAxIGF1dG87Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1yYW5nZS1jb3VudCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWZyYW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWZyYW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHBhZGRpbmc6IDNweCA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYnRuLS1vdXQsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLW1hcmsgewogICAgbWluLXdpZHRoOiAzMnB4Owp9CgpAY29udGFpbmVyIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgICAgICBsZWZ0OiA4cHg7CiAgICAgICAgcmlnaHQ6IDhweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICAgICAgZ2FwOiA4cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby10aW1lZ3JvdXAgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBnYXA6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGdhcDogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tYm90dG9tIHsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1ncm91cCB7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgICAgIG1pbi13aWR0aDogMDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QKICAgICAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIKICAgICAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgICAgIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgICAgICBvcmRlcjogLTE7CiAgICAgICAgZmxleDogMSAxIDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICB9Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogNjgwcHgpIHsKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMgewogICAgICAgIHBhZGRpbmc6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWJ0biB7CiAgICAgICAgcGFkZGluZzogNXB4IDhweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1udW0gewogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tdGltZSwKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tZnJhbWUsCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICB9Cn0KCi8qIC0tIFNldHRpbmdzIGJ1dHRvbiBhY3RpdmUgc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LXNldHRpbmdzLWJ0bi5hY3RpdmUgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkKICAgICk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA3MCUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMTglCiAgICApOwp9Ci5tanItbWZ2LXNldHRpbmdzLWJ0bi5hY3RpdmUgLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoKLyogLS0gQ2xvc2UgYnV0dG9uIChyZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdiAubWpyLW1mdi1jbG9zZS1idG4gewogICAgY29sb3I6ICNlODUwNTA7Cn0KLm1qci1tZnYgLm1qci1tZnYtY2xvc2UtYnRuOmhvdmVyIHsKICAgIGNvbG9yOiAjZmY2YjZiOwogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMzIsIDgwLCA4MCwgMC4xNSk7Cn0KCi8qIC0tIEVtcHR5IHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtZW1wdHkgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEycHg7Cn0KCi8qIC0tIENvbXBhcmUgbGFiZWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNTgpOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgcGFkZGluZzogMnB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMjA7CiAgICBsZXR0ZXItc3BhY2luZzogMC40cHg7Cn0KCi5tanItbWZ2LWxhYmVsLmxhYmVsLWxlZnQgewogICAgbGVmdDogOHB4Owp9Ci5tanItbWZ2LWxhYmVsLmxhYmVsLXJpZ2h0IHsKICAgIHJpZ2h0OiA4cHg7Cn0KCi8qIC0tIEFCIGRpdmlkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtYWItZGl2aWRlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICB3aWR0aDogMC41cHg7CiAgICBjdXJzb3I6IGNvbC1yZXNpemU7CiAgICB6LWluZGV4OiAxMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44OCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMCAwIDAuNXB4IHJnYmEoMCwgMCwgMCwgMC40KSwKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMDBtcyBlYXNlOwp9CgoubWpyLW1mdi1hYi1kaXZpZGVyOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogMTJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKfQoKLm1qci1tZnYtYWItZGl2aWRlcjpob3ZlciwKLm1qci1tZnYtYWItZGl2aWRlcjphY3RpdmUgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIE1GViBHZW9tZXRyeSAmIExheW91dCBDbGFzc2VzIChyZXBsYWNlcyBpbmxpbmUgc3R5bGVzIGluIEZsb2F0aW5nVmlld2VyLmpzKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogTWFpbiBNRlYgY29udGFpbmVyIGdlb21ldHJ5ICovCi5tanItbWZ2IHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogdmFyKC0tbWpyLW1mdi10b3Atb2Zmc2V0LCA2MHB4KTsKICAgIHJpZ2h0OiAyMHB4OwogICAgd2lkdGg6IDY0MHB4OwogICAgaGVpZ2h0OiAzNjBweDsKICAgIG1pbi13aWR0aDogMjIwcHg7CiAgICBtaW4taGVpZ2h0OiAxNjBweDsKICAgIC8qIEFsd2F5cyBmbGV4OyB2aXNpYmlsaXR5ICsgb3BhY2l0eSBjb250cm9sIHNob3cvaGlkZSBzbyBDU1MgdHJhbnNpdGlvbnMgd29yay4KICAgICAgIHBvaW50ZXItZXZlbnRzOm5vbmUgd2hpbGUgaGlkZGVuIHByZXZlbnRzIGFjY2lkZW50YWwgaW50ZXJhY3Rpb24uICovCiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHJlc2l6ZTogYm90aDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB6LWluZGV4OiAxMDAwMDsKICAgIC8qIEhpZGRlbiBzdGF0ZSAqLwogICAgb3BhY2l0eTogMDsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC02cHgpIHNjYWxlKDAuOTgpOwogICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIHJpZ2h0OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMThzIGVhc2Utb3V0LAogICAgICAgIHRyYW5zZm9ybSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB2aXNpYmlsaXR5IDBzIGxpbmVhciAwLjE4czsKfQoKLm1qci1tZnYubWpyLW1mdi0tcmVzaXppbmcgewogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItbWZ2LmlzLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgxKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB0cmFuc2Zvcm0gMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdmlzaWJpbGl0eSAwcyBsaW5lYXIgMHM7Cn0KCi8qIE1lZGlhIGVsZW1lbnRzIChpbWcvdmlkZW8pIHNpemluZyB2YXJpYW50cyAqLwoubWpyLW1mdi1tZWRpYSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBvYmplY3QtcG9zaXRpb246IGNlbnRlcjsKfQoKLm1qci1tZnYtbWVkaWEtLWZpdC1oZWlnaHQgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyOwp9CgoubWpyLW1mdi1tZWRpYS0tZmlsbCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXI7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLyogQXVkaW8gY2FyZCBpbnNpZGUgTUZWICovCi5tanItbWZ2LWF1ZGlvLWNhcmQgewogICAgd2lkdGg6IG1pbig5MiUsIDU2MHB4KTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE2MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSk7CiAgICBib3gtc2hhZG93OiAwIDZweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItbWZ2LWF1ZGlvLWhlYWQgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZnYtYXVkaW8taWNvbiB7CiAgICBjb2xvcjogdmFyKC0tbWpyLWJhZGdlLWF1ZGlvLCAjZmY5ODAwKTsKICAgIG9wYWNpdHk6IDAuOTU7Cn0KCi5tanItbWZ2LWF1ZGlvLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLW1mdi1hdWRpby1wbGF5ZXIgewogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItbWZ2LXNpZGUtcGFuZWwgLm1qci1tZnYtYXVkaW8tY2FyZCwKLm1qci1tZnYtYWItbGF5ZXIgLm1qci1tZnYtYXVkaW8tY2FyZCwKLm1qci1tZnYtZ3JpZC1jZWxsIC5tanItbWZ2LWF1ZGlvLWNhcmQgewogICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwp9CgovKiBWaWRlbyBlbGVtZW50IHNwZWNpZmljIHN0eWxlcyAqLwoubWpyLW1mdi1tZWRpYS12aWRlbyB7CiAgICAvKiBJbmhlcml0cyBmcm9tIC5tanItbWZ2LW1lZGlhIG9yIC5tanItbWZ2LW1lZGlhLS1maWxsICovCn0KCi8qIE5vZGUgU3RyZWFtIC0gY3VycmVudGx5LXN0cmVhbWVkIG5vZGUgYmFkZ2UgKHRvcC1sZWZ0IG9mIGNvbnRlbnQgYXJlYSwKICAgZm9sbG93aW5nIHRoZSBzYW1lIG92ZXJsYXkgcGF0dGVybiBhcyAubWpyLW1mdi1nZW5pbmZvKS4gKi8KLm1qci1tZnYtbm9kZS1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogOHB4OwogICAgbGVmdDogOHB4OwogICAgei1pbmRleDogMTI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuMzsKICAgIGNvbG9yOiAjZTZmM2ZmOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjY1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTIwLCAxNzAsIDI0MCwgMC40NSk7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSAxNnB4KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLyogR2VuIGluZm8gb3ZlcmxheSAtIGFsbCBtb2RlcyBzaGFyZSBiYXNlIGxheW91dCAqLwoubWpyLW1mdi1nZW5pbmZvLAoubWpyLW1mdi1nZW5pbmZvLWEsCi5tanItbWZ2LWdlbmluZm8tYiB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogOHB4OwogICAgcmlnaHQ6IDhweDsKICAgIGJvdHRvbTogOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjY1KTsKICAgIGNvbG9yOiAjZmZmOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBtYXgtaGVpZ2h0OiA0MCU7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKfQoKLyogS2VlcCBHZW4gSW5mbyBhYm92ZSBjdXN0b20gc2ltcGxlLXBsYXllciBjb250cm9scyB3aGVuIHByZXNlbnQuICovCi5tanItbWZ2LWdlbmluZm8ubWpyLW1mdi1nZW5pbmZvLS1hYm92ZS1wbGF5ZXIsCi5tanItbWZ2LWdlbmluZm8tYS5tanItbWZ2LWdlbmluZm8tLWFib3ZlLXBsYXllciwKLm1qci1tZnYtZ2VuaW5mby1iLm1qci1tZnYtZ2VuaW5mby0tYWJvdmUtcGxheWVyIHsKICAgIHRvcDogOHB4OwogICAgYm90dG9tOiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDQ1JSwgY2FsYygxMDAlIC0gMTI0cHgpKTsKfQoKLyogRmFsbGJhY2s6IHdoZW4gc2ltcGxlLXBsYXllciBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGdlbmluZm8gb3ZlcmxheSwKICAgbW92ZSBpdCB1cCBldmVuIGlmIHRoZSBtb2RpZmllciBjbGFzcyB3YXMgbm90IGF0dGFjaGVkLiAqLwoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mbywKLm1qci1tZnYtc2ltcGxlLXBsYXllciArIC5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtc2ltcGxlLXBsYXllciArIC5tanItbWZ2LWdlbmluZm8tYiB7CiAgICB0b3A6IDhweDsKICAgIGJvdHRvbTogYXV0bzsKICAgIG1heC1oZWlnaHQ6IG1pbig0NSUsIGNhbGMoMTAwJSAtIDEyNHB4KSk7Cn0KCi8qIEFCIG1vZGUgb3ZlcmxheXMgYXJlIGF0dGFjaGVkIGF0IGNvbnRhaW5lciBsZXZlbDsgc2hpZnQgdGhlbSB3aGVuIEFCIGxheWVycyB1c2Ugc2ltcGxlLXBsYXllci4gKi8KLm1qci1tZnYtYWItY29udGFpbmVyOmhhcygubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1zaW1wbGUtcGxheWVyKSAubWpyLW1mdi1nZW5pbmZvLWEsCi5tanItbWZ2LWFiLWNvbnRhaW5lcjpoYXMoLm1qci1tZnYtYWItbGF5ZXIgLm1qci1tZnYtc2ltcGxlLXBsYXllcikgLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIHRvcDogOHB4OwogICAgYm90dG9tOiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDQ1JSwgY2FsYygxMDAlIC0gMTI0cHgpKTsKfQoKLyogU2hhcmVkIHN0eWxlIGZvciBhbGwgZ2VuIGluZm8gb3ZlcmxheSB2YXJpYW50cyAqLwoubWpyLW1mdi1nZW5pbmZvIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsgLyogZGVmYXVsdCAtIG92ZXJyaWRkZW4gcGVyIGZpZWxkIGJlbG93ICovCn0KCi8qIFBlci1maWVsZCBsYWJlbCBjb2xvcnMgKi8KLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZWM4ZmY7Cn0gLyogYmx1ZSAgIC0gUHJvbXB0ICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmZDQ3YTsKfSAvKiBhbWJlciAgLSBTZWVkICAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2RkYThhOwp9IC8qIGdyZWVuICAtIE1vZGVsICAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcgewogICAgY29sb3I6ICNkNDhjZmY7Cn0gLyogdmlvbGV0IC0gTG9SQSAgICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfSAvKiBvcmFuZ2UgLSBTYW1wbGVyICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfSAvKiBwaW5rICAgLSBTY2hlZHVsZXIgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9IC8qIGluZGlnbyAtIENGRyAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcgewogICAgY29sb3I6ICM3YWZmZDQ7Cn0gLyogdGVhbCAgIC0gU3RlcCAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcgewogICAgY29sb3I6ICNlMGZmN2E7Cn0gLyogbGltZSAgIC0gR2VuIFRpbWUgKi8KCi5tanItbWZ2LWdlbmluZm8gZGl2LAoubWpyLW1mdi1nZW5pbmZvLWEgZGl2LAoubWpyLW1mdi1nZW5pbmZvLWIgZGl2IHsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgbWFyZ2luLWJvdHRvbTogM3B4Owp9CgoubWpyLW1mdi1nZW5pbmZvIGRpdjpsYXN0LWNoaWxkLAoubWpyLW1mdi1nZW5pbmZvLWEgZGl2Omxhc3QtY2hpbGQsCi5tanItbWZ2LWdlbmluZm8tYiBkaXY6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgovKiBTaW1wbGUgbW9kZSBjb250YWluZXIgKi8KLm1qci1tZnYtc2ltcGxlLWNvbnRhaW5lciB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgovKiBBQiBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1hYi1jb250YWluZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogIzAwMDsKfQoKLyogQUIgbW9kZSBsYXllcnMgKi8KLm1qci1tZnYtYWItbGF5ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLW1mdi1hYi1sYXllci0tYiB7CiAgICAvKiBjbGlwLXBhdGggYXBwbGllZCBpbmxpbmUgZm9yIGR5bmFtaWMgZGl2aWRlciBwb3NpdGlvbiAqLwp9CgovKiBTaWRlLWJ5LXNpZGUgbW9kZSBjb250YWluZXIgKi8KLm1qci1tZnYtc2lkZS1jb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZ2FwOiAycHg7CiAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogU2lkZS1ieS1zaWRlIGhhbGYgcGFuZWxzICovCi5tanItbWZ2LXNpZGUtcGFuZWwgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgYmFja2dyb3VuZDogIzBkMGQwZDsKfQoKLyogR3JpZCBjb21wYXJlICgyLTIpIGNvbnRhaW5lciAqLwoubWpyLW1mdi1ncmlkLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAxZnIgMWZyOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBnYXA6IDJweDsKICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBHcmlkIGNlbGxzICovCi5tanItbWZ2LWdyaWQtY2VsbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtaW4taGVpZ2h0OiAwOwp9CgovKiBHZW4gaW5mbyBvdmVybGF5cyBmb3IgZ3JpZCBjZWxscyBDIGFuZCBEICovCi5tanItbWZ2LWdlbmluZm8tYywKLm1qci1tZnYtZ2VuaW5mby1kIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgY29sb3I6ICNmZmY7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwp9CgoubWpyLW1mdi1nZW5pbmZvLWMgc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgovKiBQZXItZmllbGQgbGFiZWwgY29sb3JzIGZvciBDL0QgZ2VuIGluZm8gb3ZlcmxheXMgKi8KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmZkNDdhOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcgewogICAgY29sb3I6ICNkNDhjZmY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjlmN2E7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY3YTlmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhOWZmZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfQoKLyogR2VuIGluZm8gYWN0aXZlIHN0YXRlIC0gYnV0dG9uIGdsb3dzIHdoZW4gYXQgbGVhc3Qgb25lIGZpZWxkIGlzIHNlbGVjdGVkICovCi5tanItbWZ2IC5tanItaWNvbi1idG4uaXMtb24gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQsIDk1LCAxNzksIDI1NSksIDAuNTUpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMTUlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4uaXMtb3BlbiB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSA2MiUsICNmZmZmZmYgMTIlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSg5NSwgMTc5LCAyNTUsIDAuMjgpLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNCkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0bi5pcy1vcGVuIHsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7Cn0KCi8qIEdlbiBpbmZvIGRyb3Bkb3duIHBhbmVsICovCi5tanItbWZ2LWdlbi1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB6LWluZGV4OiAxMDAwMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5NiUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHBhZGRpbmc6IDZweCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTgpOwogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSksCiAgICAgICAgMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd246OmJlZm9yZSB7CiAgICBjb250ZW50OiAiR0VOIElORk8iOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC44cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMSk7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi5pcy12aXNpYmxlIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24tcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTAwbXMgZWFzZTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24tcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNyk7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3cgaW5wdXRbdHlwZT0iY2hlY2tib3giXSB7CiAgICB3aWR0aDogMTNweDsKICAgIGhlaWdodDogMTNweDsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKfQoKLyogVHJhbnNmb3JtIGZvciBwYW4vem9vbSAtIGFwcGxpZWQgaW5saW5lIGZvciBkeW5hbWljIHZhbHVlcyAqLwoubWpyLW1mdi1tZWRpYS0tdHJhbnNmb3JtIHsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsKfQoKLyogQ3Vyc29yIGZlZWRiYWNrIGZvciBwYW4vem9vbSBpbnRlcmFjdGlvbnMgKi8KLm1qci1tZnYtY29udGVudC0tZ3JhYiB7CiAgICBjdXJzb3I6IGdyYWI7Cn0KCi5tanItbWZ2LWNvbnRlbnQtLWdyYWJiaW5nIHsKICAgIGN1cnNvcjogZ3JhYmJpbmc7Cn0KCi8qIFNpZGViYXIgdGFiIGJ1dHRvbjogYWxsb3cgMi1saW5lIGxhYmVsIHZpYSBcbiBpbiBsYWJlbCBzdHJpbmcgKi8KLm1ham9vci1hc3NldHMtdGFiLWJ1dHRvbiAuc2lkZS1iYXItYnV0dG9uLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZTsKfQoKLyogQm90dG9tLXBhbmVsIGdlbmVyYXRlZCBmZWVkOiBjb21wYWN0IGNhcmRzIHdpdGggb25seSB0aGUgZ2VuZXJhdGlvbi10aW1lIHBpbGwgKi8KLm1qci1ib3R0b20tZmVlZCB7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLWhlaWdodDogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzJmMzU0MCkgNzAlLCAjN2Y4ZWEzIDMwJSkKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODglLCAjMDAwIDEyJSk7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIsCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLAoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzJmMzU0MCkgNzAlLCAjN2Y4ZWEzIDMwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci10cmFjaywKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDg4JSwgIzAwMCAxMiUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkIHsKICAgIGdhcDogNnB4ICFpbXBvcnRhbnQ7CiAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heChtaW4oMTAwJSwgMTMycHgpLCAxZnIpKSAhaW1wb3J0YW50OwogICAgbWluLWhlaWdodDogMDsKICAgIGhlaWdodDogYXV0bzsKICAgIGFsaWduLWNvbnRlbnQ6IHN0YXJ0Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZCwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQgewogICAgYm9yZGVyLXJhZGl1czogMTJweCAhaW1wb3J0YW50OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsICMwMDAgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yMikgIWltcG9ydGFudDsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZDpob3ZlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQ6aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDEwcHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjgpICFpbXBvcnRhbnQ7CgogICAgLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQuaXMtc2VsZWN0ZWQgewogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICAgIDAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA4MCUsIHZhcigtLWNvbnRlbnQtZmcpKSwKICAgICAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAgICAgMCAxMHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjI4KSAhaW1wb3J0YW50OwogICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpICFpbXBvcnRhbnQ7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gewogICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iIHsKICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgICBpc29sYXRpb246IGlzb2xhdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAtMTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDE0MG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxNDBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDVweCwgNXB4KSBzY2FsZSgwLjk4NSk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyMDI0MmIpIDg0JSwgIzAwMCAxNiUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE2KTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTBweCwgMTBweCkgc2NhbGUoMC45Nyk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNiksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4MiUsICMwMDAgMTglKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMTQpOwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg2cHgsIDZweCkgc2NhbGUoMC45ODUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YWZ0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMnB4LCAxMnB4KSBzY2FsZSgwLjk3KTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMC45NSAvIDEgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3MiUsICMwMDAgMjglKSAhaW1wb3J0YW50Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWItcGxheSB7CiAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgY2lyY2xlIGF0IGNlbnRlciwKICAgICAgICByZ2JhKDAsIDAsIDAsIDAuMTgpLAogICAgICAgIHJnYmEoMCwgMCwgMCwgMC4wNCkgMzglLAogICAgICAgIHRyYW5zcGFyZW50IDcwJQogICAgKTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLWV4dCwKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXJhdGluZywKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXRhZ3MgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkyKTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCBsZWZ0Owp9CgovKiAtLSBGZWVkIGNhcmQgaW5mbzogZGVmYXVsdCBoaWRkZW4sIHRvZ2dsZWQgdmlhIG1qci1mZWVkLXNob3ctKiBjbGFzc2VzIG9uIC5tanItZ3JpZCAtLSAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDRweCA2cHggIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWluZm8gLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKfQoKLyogRmVlZCBmaWxlbmFtZSAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1maWxlbmFtZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1maWxlbmFtZSAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKfQoKLyogRmVlZCBkaW1lbnNpb25zIC8gZHVyYXRpb24gKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtcmVzLAoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kaW1lbnNpb25zIC5tanItbWV0YS1yZXMsCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGltZW5zaW9ucyAubWpyLW1ldGEtZHVyYXRpb24gewogICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgZGF0ZS90aW1lICovCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWRhdGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLXRpbWUtdmFsIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRhdGUgLm1qci1tZXRhLWRhdGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGF0ZSAubWpyLW1ldGEtdGltZS12YWwgewogICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgZ2VuZXJhdGlvbiB0aW1lIGJhZGdlICovCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWdlbnRpbWUgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZ2VudGltZSAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleCAhaW1wb3J0YW50Owp9CgovKiBGZWVkIHdvcmtmbG93IGRvdCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1kb3Qtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kb3QgLm1qci1jYXJkLWRvdC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgYmFkZ2VzICovCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1leHQgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLWV4dCAubWpyLWJhZGdlLWV4dCB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1yYXRpbmcgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLXJhdGluZyAubWpyLWJhZGdlLXJhdGluZyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS10YWdzIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWJhZGdlcy10YWdzIC5tanItYmFkZ2UtdGFncyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgbWV0YSByb3cgc3R5bGluZyAtIGZsZXggbGF5b3V0IHNvIHZpc2libGUgaXRlbXMgc3RheSBzZXBhcmF0ZWQgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtbWV0YS1yb3cgewogICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50OwogICAgZmxleC13cmFwOiBub3dyYXAgIWltcG9ydGFudDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDsKICAgIGdhcDogNXB4ICFpbXBvcnRhbnQ7CiAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICBtaW4td2lkdGg6IDAgIWltcG9ydGFudDsKICAgIHBhZGRpbmctcmlnaHQ6IDAgIWltcG9ydGFudDsKICAgIGxpbmUtaGVpZ2h0OiAxLjMgIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNzggIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMC44ZW0gIWltcG9ydGFudDsKICAgIC8qIHRleHQtb3ZlcmZsb3cgZWxsaXBzaXMgZG9lc24ndCBhcHBseSBvbiBhIGZsZXggY29udGFpbmVyIGl0c2VsZiAqLwp9Ci8qIEVhY2ggbWV0YSBzcGFuIHRydW5jYXRlcyBpbmRpdmlkdWFsbHkgaWYgdG9vIGxvbmcgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtbWV0YS1yb3cgPiBzcGFuIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LXNocmluazogMTsKfQovKiBHZW50aW1lIGJhZGdlIGFuZCB0aW1lIHZhbHVlIHNob3VsZCBzdGF5IHZpc2libGUgKGRvbid0IHNocmluayBhd2F5KSAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyA+IC5tanItbWV0YS1nZW50aW1lLAoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyA+IC5tanItbWV0YS10aW1lLXZhbCB7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1nZW50aW1lIC5tanItbWV0YS1nZW50aW1lIHsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDNweDsKICAgIHBhZGRpbmc6IDNweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43NCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yMik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwICFpbXBvcnRhbnQ7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMTVlbTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTgpOwogICAgdGV4dC1zaGFkb3c6CiAgICAgICAgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC45KSwKICAgICAgICAwIDAgMTBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwp9CgovKiAtLSBBdWRpbyAvIDNEIHBsYWNlaG9sZGVyIHRodW1ibmFpbHMgaW4gdGhlIGZlZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogQXVkaW8gY2FyZHMgc2hvdyB0aGUgd2F2ZWZvcm0gc3ByaXRlOyBnaXZlIGl0IGEgZGlzdGluY3QgYmFja2dyb3VuZCBzbyBpdAogICBkb2Vzbid0IGxvb2sgbGlrZSBhIGJyb2tlbiBpbWFnZSBwbGFjZWhvbGRlciBpbiB0aGUgZmVlZC4gKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanIta2luZD0iYXVkaW8iXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im1wMyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0id2F2Il0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJvZ2ciXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImZsYWMiXSAubWpyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA2MCUsICMxYTFmMmIgNDAlKSAhaW1wb3J0YW50Owp9CgovKiAzRCBtb2RlbCBjYXJkcyB1c2UgYW4gaWNvbiBwbGFjZWhvbGRlciAtIGFkZCBhIHN1YnRsZSBncmFkaWVudCBzbyB0aGV5IHJlYWQKICAgYXMgaW50ZW50aW9uYWwgcmF0aGVyIHRoYW4gbWlzc2luZy4gKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanIta2luZD0ibW9kZWwzZCJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZ2xiIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJnbHRmIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJvYmoiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImZieCJdIC5tanItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgIzBkMTExNyA1MCUpICFpbXBvcnRhbnQ7Cn0KCi8qIC0tIEZlZWQgZ3JvdXAgYnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLm1qci1ib3R0b20tZmVlZCAubWpyLWZlZWQtZ3JvdXAtYnV0dG9uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMzRweDsKICAgIHJpZ2h0OiA2cHg7CiAgICB6LWluZGV4OiAxMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBtaW4td2lkdGg6IDI4cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43NCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItZmVlZC1ncm91cC1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMjQsIDM0LCAwLjkpOwp9CgoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWljb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLyogLS0gRmVlZCBncm91cCBwb3BvdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoubWpyLWZlZWQtZ3JvdXAtcG9wb3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvciwgIzNhM2EzYSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZywgOHB4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLXRpdGxlIHsKICAgIHBhZGRpbmc6IDhweCAxMHB4IDRweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkIHsKICAgIHBhZGRpbmc6IDRweCA4cHggMTBweDsKICAgIG1heC1oZWlnaHQ6IDM2MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKQogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4OCUsICMwMDAgMTIlKTsKfQoKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1pY29uLAoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWNvdW50IHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWZlZWQtZ3JvdXAtbWVtYmVyLWNhcmQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWZlZWQtZ3JvdXAtbWVtYmVyLWNhcmQgLm1qci10aHVtYiB7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxICFpbXBvcnRhbnQ7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAzNHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTYpOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyNCwgMzQsIDAuOSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24gPiAqIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWZpbG1zdHJpcDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDRweDsKICAgIGhlaWdodDogNHB4Owp9CgoubWpyLWZpbG1zdHJpcDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7Cn0KCi5tanItZmlsbXN0cmlwOmhvdmVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwp9CgoubWpyLWZpbG1zdHJpcC1hdWRpby10aHVtYiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICBwYWRkaW5nOiA3cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDI0JSAyNCUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjI4KSwgdHJhbnNwYXJlbnQgNDIlKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDg0JSA3MCUsIHJnYmEoODIsIDIyMCwgMTU2LCAwLjE4KSwgdHJhbnNwYXJlbnQgNDAlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDE4LCAyNSwgMzUsIDAuOTYpLCByZ2JhKDcsIDEwLCAxNSwgMC45OCkpOwp9CgoubWpyLWZpbG1zdHJpcC1hdWRpby13YXZlZm9ybSB7CiAgICB3aWR0aDogNzYlOwogICAgaGVpZ2h0OiAyNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMnB4Owp9CgoubWpyLWZpbG1zdHJpcC1hdWRpby13YXZlZm9ybSBzcGFuIHsKICAgIHdpZHRoOiAycHg7CiAgICBtaW4taGVpZ2h0OiA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NCksIHJnYmEoMTQ4LCAyMTgsIDI1NSwgMC42OCkpOwp9CgoubWpyLWZpbG1zdHJpcC1hdWRpby1sYWJlbCB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgcGFkZGluZzogMnB4IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGZvbnQtc2l6ZTogN3B4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLyogLS0gRHVwbGljYXRlIHN0YWNrIGJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogU2hvd3Mgb24gdGhlIHByaW1hcnkgY2FyZCB3aGVuIHNhbWUtZmlsZW5hbWUgZHVwbGljYXRlcyBleGlzdC4gICAgICAgICAgICAgKi8KLyogUG9zaXRpb25lZCBhdCBib3R0b20tcmlnaHQgdG8gbm90IG92ZXJsYXAgdGhlIHN0YWNrLWdyb3VwIGJ1dHRvbiAodG9wLXJpZ2h0KS4gKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiAzMHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDE4MCwgMCwgMC4zOCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMzAsIDE4LCAwLCAwLjgyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjAwLCA2MCwgMC45Nik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjMyKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNXMsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg1MCwgMzAsIDAsIDAuOTQpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTgwLCAwLCAwLjYpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbiA+ICogewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1kdXAtc3RhY2tlZD0idHJ1ZSJdIC5tanItZHVwLXN0YWNrLWJ1dHRvbiB7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzIpLAogICAgICAgIDAgMCAwIDFweCByZ2JhKDI1NSwgMTgwLCAwLCAwLjIpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci1zdGFjay1ncm91cC1idXR0b24sCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLWZlZWQtZ3JvdXAtYnV0dG9uIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZHVwLXN0YWNrZWQ9InRydWUiXTpob3ZlciB7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLyogLS0gVmlzdWFsIHN0YWNraW5nIGVmZmVjdCAtIGxheWVyZWQgY2FyZHMgYmVoaW5kIHRoZSBtYWluIGNhcmQgLS0tLS0tLS0tLS0tICovCi8qIENyZWF0ZXMgcHNldWRvLWVsZW1lbnQgImNhcmRzIiBvZmZzZXQgYmVoaW5kIHRoZSBwcmltYXJ5IGNhcmQgdG8gdmlzdWFsbHkgICAgKi8KLyogY29tbXVuaWNhdGUgdGhhdCB0aGlzIGNhcmQgcmVwcmVzZW50cyBhIGdyb3VwIG9mIG11bHRpcGxlIGltYWdlcy4gICAgICAgICAgICAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjpiZWZvcmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMWExYTJlKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IC0xOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTgwbXMgZWFzZSwKICAgICAgICBvcGFjaXR5IDE4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDNweCwgM3B4KSByb3RhdGUoMWRlZyk7CiAgICBvcGFjaXR5OiAwLjQ1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDZweCwgNnB4KSByb3RhdGUoMi4yZGVnKTsKICAgIG9wYWNpdHk6IDAuMjU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3Zlcjo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDRweCwgNHB4KSByb3RhdGUoMS41ZGVnKTsKICAgIG9wYWNpdHk6IDAuNTU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3Zlcjo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoOHB4LCA4cHgpIHJvdGF0ZSgzZGVnKTsKICAgIG9wYWNpdHk6IDAuMzU7Cn0KCi5tanItc3RhY2stZ3JvdXAtcG9wb3ZlciB7CiAgICB3aWR0aDogbWluKDQ0MHB4LCA5MnZ3KTsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCB7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItc3RhY2stZ3JvdXAtbWVtYmVyLWNhcmQgLm1qci10aHVtYiB7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxICFpbXBvcnRhbnQ7Cn0KCi5tanItc3RhY2stZ3JvdXAtbWVtYmVyLWNhcmQgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogTGlnaHQgbW9kZSBvdmVycmlkZXMgKENvbWZ5VUkgdjEuNDIrIGltcHJvdmVkIGxpZ2h0IHRoZW1lKQogKiBVc2VzIENvbWZ5VUkgZGF0YS10aGVtZSBhdHRyaWJ1dGUgd2hlbiBzZXQsIHdpdGgKICogcHJlZmVycy1jb2xvci1zY2hlbWUgYXMgYSBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyogQ29tZnlVSSBzZXRzIGRhdGEtdGhlbWU9ImxpZ2h0IiBvbiA8aHRtbD4gb3IgPGJvZHk+ICovCjppcyhbZGF0YS10aGVtZT0ibGlnaHQiXSwgW2RhdGEtY29sb3Itc2NoZW1lPSJsaWdodCJdKSAubWpyLWFzc2V0cy1tYW5hZ2VyLAo6aXMoW2RhdGEtdGhlbWU9ImxpZ2h0Il0sIFtkYXRhLWNvbG9yLXNjaGVtZT0ibGlnaHQiXSkgLm1qci1wb3BvdmVyIHsKICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsICNmMGYwZjApOwogICAgLS1tanItc3VyZmFjZS0xOiB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCAjZmFmYWZhKTsKICAgIC0tbWpyLXN1cmZhY2UtMjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLWhvdmVyLXN1cmZhY2UsICNlOGU4ZTgpOwogICAgLS1tanItc3VyZmFjZS0zOiB2YXIoLS1tb2RhbC1jYXJkLWJhY2tncm91bmQsICNmZmZmZmYpOwogICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgcmdiYSgwLCAwLCAwLCAwLjE0KSk7CiAgICAtLW1qci1tdXRlZDogdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCwgcmdiYSgwLCAwLCAwLCAwLjU1KSk7CiAgICAtLW1qci1jYXJkLWhvdmVyLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2UwZTBlMCk7Cn0KCkBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSB7CiAgICAvKiBGYWxsYmFjazogb25seSBhcHBseSBpZiBDb21meVVJIGhhc24ndCBzZXQgYW4gZXhwbGljaXQgZGF0YS10aGVtZSAqLwogICAgLm1qci1hc3NldHMtbWFuYWdlcjpub3QoW2RhdGEtdGhlbWUtYXBwbGllZF0pLAogICAgLm1qci1wb3BvdmVyOm5vdChbZGF0YS10aGVtZS1hcHBsaWVkXSkgewogICAgICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsICNmMGYwZjApOwogICAgICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgI2ZhZmFmYSk7CiAgICAgICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2U4ZThlOCk7CiAgICAgICAgLS1tanItc3VyZmFjZS0zOiB2YXIoLS1tb2RhbC1jYXJkLWJhY2tncm91bmQsICNmZmZmZmYpOwogICAgICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHJnYmEoMCwgMCwgMCwgMC4xNCkpOwogICAgICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCByZ2JhKDAsIDAsIDAsIDAuNTUpKTsKICAgICAgICAtLW1qci1jYXJkLWhvdmVyLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2UwZTBlMCk7CiAgICB9Cn0KCi8qIC0tLSBTa2VsZXRvbiBsb2FkZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoubWpyLWNhcmQtc2tlbGV0b24gewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCAjM2EzYTNhKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnLCA4cHgpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIC8qIE1hdGNoIC5tanItdGh1bWIgYXNwZWN0IHJhdGlvIHNvIHNrZWxldG9ucyBoYXZlIHRoZSBzYW1lIGZvb3RwcmludCBhcyByZWFsIGNhcmRzLiAqLwogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKfQoKLyogU2hpbW1lciBzd2VlcCAqLwoubWpyLWNhcmQtc2tlbGV0b246OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgOTBkZWcsCiAgICAgICAgdHJhbnNwYXJlbnQgMCUsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzYTNhM2EpIDgwJSwgdHJhbnNwYXJlbnQpIDUwJSwKICAgICAgICB0cmFuc3BhcmVudCAxMDAlCiAgICApOwogICAgYW5pbWF0aW9uOiBtanItc2hpbW1lciAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKfQoKQGtleWZyYW1lcyBtanItc2hpbW1lciB7CiAgICBmcm9tIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgfQogICAgdG8gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsKICAgIH0KfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItY2FyZC1za2VsZXRvbjo6YWZ0ZXIgewogICAgICAgIGFuaW1hdGlvbjogbm9uZTsKICAgIH0KfQoKLyogLS0tIFJlc3BvbnNpdmUgc3VtbWFyeSBiYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIEVuYWJsZSBjb250YWluZXIgcXVlcmllcyBvbiB0aGUgc3VtbWFyeSBiYXIgc28gY2hpbGRyZW4gY2FuIHJlc3BvbmQgdG8gaXRzCiAqIGFjdHVhbCByZW5kZXJlZCB3aWR0aCAoZS5nLiB3aGVuIHRoZSBwYW5lbCBpcyBkb2NrZWQgaW4gYSBuYXJyb3cgc2lkZWJhcikuCiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeSB7CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7CiAgICBjb250YWluZXItbmFtZTogbWpyLXN1bW1hcnktYmFyOwp9CgovKiBCZWxvdyB+MzgwIHB4OiBoaWRlIHRoZSBwaWxscy9yaWdodCBzZWN0aW9uIHRvIHByZXZlbnQgb3ZlcmZsb3cuICovCkBjb250YWluZXIgbWpyLXN1bW1hcnktYmFyIChtYXgtd2lkdGg6IDM4MHB4KSB7CiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS1yaWdodCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXRleHQgewogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgIH0KfQo=", "" + import.meta.url).toString(), n = document.createElement("link"); n.id = t, n.rel = "stylesheet", n.type = "text/css", n.href = e, n.onerror = () => { try { n.remove(); } catch (e) { console.debug?.(e); } }, document.head.appendChild(n), n.onload = () => { try { document.documentElement.dataset.mjrThemeComfy = "1", Di(); } catch (e) { console.debug?.(e); } }; } catch (e) { console.warn("Majoor: failed to load Comfy theme CSS", e); } } Di(); //#endregion //#region ui/features/grid/gridApi.ts function ki() { let e = "mjr-grid-settings-styles"; if (document.getElementById(e)) return; let t = document.createElement("style"); t.id = e, t.textContent = "\n .mjr-grid .mjr-asset-card,\n .mjr-grid .mjr-card {\n display: flex;\n flex-direction: column;\n }\n .mjr-grid .mjr-thumb {\n flex: 0 0 auto;\n width: 100%;\n aspect-ratio: 1 / 1;\n min-height: 0;\n position: relative;\n overflow: hidden;\n }\n .mjr-grid .mjr-thumb-media {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n .mjr-grid .mjr-asset-card:hover {\n background-color: var(--mjr-card-hover-color) !important;\n }\n\n .mjr-grid .mjr-asset-card.is-selected {\n outline: 2px solid var(--mjr-card-selection-color) !important;\n box-shadow: 0 0 0 2px var(--mjr-card-selection-color) !important;\n }\n\n .mjr-grid .mjr-card-filename { display: none; }\n .mjr-grid.mjr-show-filename .mjr-card-filename { display: block; }\n\n .mjr-grid .mjr-card-dot-wrapper { display: none; }\n .mjr-grid.mjr-show-dot .mjr-card-dot-wrapper { display: inline-flex; }\n .mjr-grid .mjr-asset-status-dot {\n transition: color 0.3s ease, opacity 0.3s ease;\n }\n .mjr-grid .mjr-asset-status-dot.mjr-pulse-animation {\n animation: mjr-pulse 1.5s infinite;\n }\n @keyframes mjr-pulse {\n 0% { opacity: 1; }\n 50% { opacity: 0.4; }\n 100% { opacity: 1; }\n }\n\n .mjr-grid .mjr-meta-res { display: none; }\n .mjr-grid.mjr-show-dimensions .mjr-meta-res { display: inline; }\n\n .mjr-grid .mjr-meta-duration { display: none; }\n .mjr-grid.mjr-show-dimensions .mjr-meta-duration { display: inline; }\n\n .mjr-grid .mjr-meta-date { display: none; }\n .mjr-grid.mjr-show-date .mjr-meta-date { display: inline; }\n\n .mjr-grid .mjr-meta-gentime { display: none; }\n .mjr-grid.mjr-show-gentime .mjr-meta-gentime { display: inline; }\n\n .mjr-grid .mjr-badge-ext { display: none !important; }\n .mjr-grid.mjr-show-badges-ext .mjr-badge-ext { display: flex !important; }\n\n .mjr-grid .mjr-badge-rating { display: none !important; }\n .mjr-grid.mjr-show-badges-rating .mjr-badge-rating { display: flex !important; }\n\n .mjr-grid .mjr-badge-tags { display: none !important; }\n .mjr-grid.mjr-show-badges-tags .mjr-badge-tags { display: flex !important; }\n\n .mjr-grid .mjr-card-info { display: none !important; }\n .mjr-grid.mjr-show-details .mjr-card-info { display: block !important; }\n\n .mjr-card-meta-row > span + span::before {\n content: \" \"¢ \";\n opacity: 0.5;\n margin: 0 4px;\n }\n .mjr-card-meta-row > span[style*=\"display: none\"] + span::before {\n display: none;\n }\n ", document.head.appendChild(t); } function Ai(e) { if (!e) return; ki(); let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; t("mjr-show-filename", z.GRID_SHOW_DETAILS_FILENAME), t("mjr-show-dimensions", z.GRID_SHOW_DETAILS_DIMENSIONS), t("mjr-show-date", z.GRID_SHOW_DETAILS_DATE), t("mjr-show-gentime", z.GRID_SHOW_DETAILS_GENTIME), t("mjr-show-hover-info", z.GRID_SHOW_HOVER_INFO), t("mjr-show-dot", z.GRID_SHOW_WORKFLOW_DOT), t("mjr-show-badges-ext", z.GRID_SHOW_BADGES_EXTENSION), t("mjr-show-badges-rating", z.GRID_SHOW_BADGES_RATING), t("mjr-show-badges-tags", z.GRID_SHOW_BADGES_TAGS), t("mjr-show-details", z.GRID_SHOW_DETAILS), e.style.setProperty("--mjr-grid-min-size", `${z.GRID_MIN_SIZE}px`), e.style.setProperty("--mjr-grid-gap", `${z.GRID_GAP}px`), e.style.setProperty("--mjr-star-active", z.BADGE_STAR_COLOR), e.style.setProperty("--mjr-badge-image", z.BADGE_IMAGE_COLOR), e.style.setProperty("--mjr-badge-video", z.BADGE_VIDEO_COLOR), e.style.setProperty("--mjr-badge-audio", z.BADGE_AUDIO_COLOR), e.style.setProperty("--mjr-badge-model3d", z.BADGE_MODEL3D_COLOR), e.style.setProperty("--mjr-badge-duplicate-alert", z.BADGE_DUPLICATE_ALERT_COLOR), e.style.setProperty("--mjr-card-hover-color", z.UI_CARD_HOVER_COLOR), e.style.setProperty("--mjr-card-selection-color", z.UI_CARD_SELECTION_COLOR), e.style.setProperty("--mjr-rating-color", z.UI_RATING_COLOR), e.style.setProperty("--mjr-tag-color", z.UI_TAG_COLOR); } function ji(e, { applySettingsClasses: t = !0 } = {}) { if (!e) return null; if (e.id = "mjr-assets-grid", e.classList.add("mjr-grid"), e.tabIndex = 0, e.setAttribute("role", "grid"), t) { Ai(e); let t = () => { requestAnimationFrame(() => { Ai(e); }); }; try { e._mjrSettingsChangedCleanup?.(); } catch (e) { console.debug?.(e); } window.addEventListener("mjr-settings-changed", t), e._mjrSettingsChangedCleanup = () => { try { window.removeEventListener("mjr-settings-changed", t); } catch (e) { console.debug?.(e); } }; } return e; } function Mi(e, t, ...n) { let r = { _mjrCaptureAnchor: "captureAnchor", _mjrDispose: "dispose", _mjrHydrateFromSnapshot: "hydrateFromSnapshot", _mjrLoadAssets: "reload", _mjrLoadAssetsFromList: "loadAssetsFromList", _mjrPrepareForScopeSwitch: "prepareForScopeSwitch", _mjrRefreshGrid: "refreshGrid", _mjrRemoveAssets: "removeAssets", _mjrRestoreAnchor: "restoreAnchor", _mjrUpsertAsset: "upsertRealtime", _mjrUpsertAssetNow: "upsertRealtimeNow" }; try { let i = r[t], a = i ? e?._mjrGridApi?.[i] : null; if (typeof a == "function") return a(...n); let o = e?.[t]; if (typeof o == "function") return o(...n); } catch (e) { console.debug?.(e); } } function Ni(e, t = {}, n = {}) { return Mi(e, "_mjrHydrateFromSnapshot", t, n) ?? !1; } function Pi(e, t = "*", n = {}) { return Mi(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } function Fi(e, t, n = {}) { return Mi(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } function Ii(e) { return Mi(e, "_mjrPrepareForScopeSwitch"); } function Li(e) { try { e?._mjrSettingsChangedCleanup?.(); } catch (e) { console.debug?.(e); } return Mi(e, "_mjrDispose"); } function Ri(e) { return Mi(e, "_mjrRefreshGrid"); } function zi(e) { return Mi(e, "_mjrCaptureAnchor") ?? null; } function Bi(e, t) { return Mi(e, "_mjrRestoreAnchor", t); } function Vi(e, t, n = {}) { return Mi(e, "_mjrRemoveAssets", t, n) ?? { ok: !1, removed: 0, selectedIds: [] }; } function Hi(e, t) { return !!Mi(e, "_mjrUpsertAsset", t); } function Ui(e, t) { return !!Mi(e, "_mjrUpsertAssetNow", t); } //#endregion //#region ui/features/panel/views/popoverManager.ts function Wi(e, t) { if (!e || !t?.size) return !1; for (let n of t.values()) { let t = n?.popover || null; if (t) { if (e === t) return !0; try { if (typeof t.contains == "function" && t.contains(e)) return !0; } catch (e) { console.debug?.(e); } } } return !1; } function Gi(e) { if (!e || e === document?.body) return !1; try { if (typeof e.matches == "function" && e.matches([ "[data-pc-name]", "[role='listbox']", "[role='dialog']", "[role='menu']", "[role='tree']", "[role='grid']" ].join(","))) return !0; } catch (e) { console.debug?.(e); } let t = [ String(e.id || ""), String(e.className || ""), String(e.getAttribute?.("data-pc-section") || "") ].join(" ").toLowerCase(); return /\b(p-|p_)?(select|listbox|multiselect|datepicker|calendar|overlay|panel|menu|dialog|tooltip|popover)\b/.test(t); } function Ki(e) { let t = /* @__PURE__ */ new Map(), n = null, r = 0, i = [], a = !1, o = !1, s = !1, c = new AbortController(), l = new AbortController(), u = !1, d = null, f = (e, t = "y") => { if (!e) return !1; let n = globalThis.getComputedStyle?.(e), r = String(t === "x" ? n?.overflowX || n?.overflow || "" : n?.overflowY || n?.overflow || ""); return /(auto|scroll|overlay)/i.test(r) ? t === "x" ? Number(e.scrollWidth || 0) > Number(e.clientWidth || 0) + 1 : Number(e.scrollHeight || 0) > Number(e.clientHeight || 0) + 1 : !1; }, p = (e, t) => { let n = e instanceof HTMLElement ? e : t; for (; n && n !== t;) { if (f(n, "y") || f(n, "x")) return n; n = n.parentElement; } return f(t, "y") || f(t, "x") ? t : null; }, m = (e) => { if (!e || e._mjrInteractionGuardsBound) return; let t = (e) => { try { e.stopPropagation(); } catch (e) { console.debug?.(e); } }, n = (n) => { let r = p(n?.target, e), i = Number(n?.deltaX || 0), a = Number(n?.deltaY || 0); if (r) try { a && (r.scrollTop = Number(r.scrollTop || 0) + a), i && (r.scrollLeft = Number(r.scrollLeft || 0) + i); } catch (e) { console.debug?.(e); } try { n.preventDefault(); } catch (e) { console.debug?.(e); } t(n); }; try { e.addEventListener("wheel", n, { passive: !1, capture: !0 }), e.addEventListener("mousedown", t), e.addEventListener("touchmove", t, { passive: !0 }), e._mjrInteractionGuardsBound = !0; } catch (e) { console.debug?.(e); } }, h = (e) => { if (!(!e || !(e instanceof HTMLElement))) { m(e), e._mjrPortal ||= { parent: e.parentNode, nextSibling: e.nextSibling }, e.classList.add("mjr-popover-portal"); try { e.parentNode !== document.body && document.body.appendChild(e); } catch (e) { console.debug?.(e); } } }, g = (e) => { let t = e?._mjrPortal; if (t) { e.classList.remove("mjr-popover-portal"); try { let n = t.parent; n && n instanceof HTMLElement && (t.nextSibling && t.nextSibling.parentNode === n ? n.insertBefore(e, t.nextSibling) : n.appendChild(e)); } catch (e) { console.debug?.(e); } } }, _ = (t, n) => { if (!(!t || !n)) try { let r = n.getBoundingClientRect(), i = e.getBoundingClientRect(); h(t), t.style.position = "fixed", t.style.margin = "0"; let a = Math.max(200, Math.min(360, i.width - 16, window.innerWidth - 16)); t.style.maxWidth = `${a}px`; let o = t.offsetWidth || Math.min(280, a), s = t.offsetHeight || 1, c = r.left; c = Math.max(i.left + 8, Math.min(c, i.right - o - 8)); let l = r.bottom + 8, u = Math.min(i.bottom, window.innerHeight) - 8, d = Math.max(i.top, 0) + 8; l + s > u && r.top - 8 - s >= d && (l = r.top - 8 - s), l = Math.max(d, Math.min(l, u - 80)); let f = u - l; t.style.maxHeight = `${Math.max(140, f)}px`, t.style.overflowX = "hidden", t.style.overflowY = "auto", t.style.overscrollBehavior = "contain", t.style.zIndex = "10020", t.style.left = `${Math.round(c)}px`, t.style.top = `${Math.round(l)}px`; } catch (e) { console.debug?.(e); } }, v = () => { t.size && (r && cancelAnimationFrame(r), r = requestAnimationFrame(() => { r = 0; for (let e of t.values()) _(e.popover, e.anchor); })); }, y = (e) => { Wi(e?.target, t) || v(); }, b = () => { if (t.size) { try { s ||= (window.addEventListener("resize", v, { passive: !0, signal: c.signal }), !0); } catch (e) { console.debug?.(e); } try { o ||= (window.addEventListener("scroll", y, { passive: !0, capture: !0, signal: c.signal }), !0); } catch (e) { console.debug?.(e); } try { n || (n = new ResizeObserver(v), n.observe(e)); } catch (e) { console.debug?.(e); } try { a ||= (e.addEventListener("scroll", y, { passive: !0 }), !0); } catch (e) { console.debug?.(e); } } }, x = () => { if (!t.size) { try { s && window.removeEventListener("resize", v); } catch (e) { console.debug?.(e); } s = !1; try { o && window.removeEventListener("scroll", y, { capture: !0 }); } catch (e) { console.debug?.(e); } try { o && window.removeEventListener("scroll", y, !0); } catch (e) { console.debug?.(e); } o = !1; try { a && e.removeEventListener("scroll", y); } catch (e) { console.debug?.(e); } a = !1; try { n && n.disconnect(); } catch (e) { console.debug?.(e); } n = null; try { c.abort(); } catch (e) { console.debug?.(e); } u || (c = new AbortController()); } }, S = (e) => { if (e) { try { e.style.display = "none"; } catch (e) { console.debug?.(e); } try { g(e); } catch (e) { console.debug?.(e); } t.delete(e), x(); try { d?.({ type: "close", popover: e, openPopovers: t }); } catch (e) { console.debug?.(e); } } }, C = (e, n) => { if (!(!e || !n)) { t.set(e, { popover: e, anchor: n }), b(), _(e, n), v(); try { d?.({ type: "open", popover: e, anchor: n, openPopovers: t }); } catch (e) { console.debug?.(e); } } }, w = (e, n) => { if (!e || !n) return; let r = t.has(e) || e.style.display === "block" ? "none" : "block"; e.style.display = r, r === "none" ? S(e) : C(e, n); }, T = () => { for (let e of t.values()) try { g(e.popover); } catch (e) { console.debug?.(e); } for (let e of Array.from(t.keys())) S(e); t.clear(), x(); }, E = (e) => { i = Array.isArray(e) ? e.filter(Boolean) : []; }, D = (e) => { d = typeof e == "function" ? e : null; }, O = (e) => { let n = e.target; if (n) { for (let e of t.values()) { try { if (e?.popover && e.popover.contains(n)) return; } catch (e) { console.debug?.(e); } try { if (e?.anchor && e.anchor.contains(n)) return; } catch (e) { console.debug?.(e); } } for (let e of i) try { if (e && typeof e.contains == "function" && e.contains(n)) return; } catch (e) { console.debug?.(e); } try { if (t.size) { let e = n.closest?.("[data-pc-name]"); if (e && e.parentElement === document.body) for (let n of t.values()) try { if (!n?.popover) continue; let t = e.id?.replace(/_list$|_overlay$|_panel$/, ""); if (t && n.popover.querySelector(`#${CSS.escape(t)}`) || n.popover.querySelector("[data-pc-name][aria-expanded='true']")) return; } catch (e) { console.debug?.(e); } try { let e = n; for (; e && e !== document.body && e.parentNode && e.parentNode !== document.body;) e = e.parentNode; if (e && e !== document.body && e.parentNode === document.body && Gi(e)) for (let e of t.values()) try { if (!e?.popover) continue; if (e.popover.querySelector("[data-pc-name][aria-expanded='true']") || e.popover.querySelector("[aria-expanded='true'][role='combobox']")) return; } catch (e) { console.debug?.(e); } } catch (e) { console.debug?.(e); } } } catch (e) { console.debug?.(e); } T(); } }; return (() => { try { l?.abort?.(); } catch (e) { console.debug?.(e); } l = new AbortController(), document.addEventListener("mousedown", O, { capture: !0, signal: l.signal }); })(), { open: C, close: S, toggle: w, closeAll: T, scheduleReposition: v, setDismissWhitelist: E, setOnVisibilityChanged: D, dispose: () => { u = !0; try { l?.abort?.(); } catch (e) { console.debug?.(e); } l = null; try { x(); } catch (e) { console.debug?.(e); } try { c.abort(); } catch (e) { console.debug?.(e); } c = null; try { T(); } catch (e) { console.debug?.(e); } } }; } //#endregion //#region ui/features/grid/GridKeyboard.ts var qi = { OPEN_VIEWER: { key: "Enter", description: "Open selected in viewer" }, OPEN_VIEWER_ALT: { key: " ", description: "Open selected in viewer" }, OPEN_FLOATING_VIEWER: { key: "v", description: "Open selected in Floating Viewer" }, METADATA_PANEL: { key: "d", description: "Show metadata panel (Details)" }, COMPARE_AB: { key: "c", description: "Compare A/B (2 selected)" }, SIDE_BY_SIDE: { key: "g", description: "Side-by-side Grid view (2-4 selected)" }, RATING_1: { key: "1", description: "Set rating 1 star" }, RATING_2: { key: "2", description: "Set rating 2 stars" }, RATING_3: { key: "3", description: "Set rating 3 stars" }, RATING_4: { key: "4", description: "Set rating 4 stars" }, RATING_5: { key: "5", description: "Set rating 5 stars" }, RATING_RESET: { key: "0", description: "Reset rating" }, EDIT_TAGS: { key: "t", description: "Edit Tags" }, ADD_TO_COLLECTION: { key: "b", description: "Add to collection (Bookmark)" }, REMOVE_FROM_COLLECTION: { key: "b", shift: !0, description: "Remove from collection" }, COPY_PATH: { key: "c", ctrl: !0, shift: !0, description: "Copy file path" }, DOWNLOAD: { key: "s", description: "Download file" }, RENAME: { key: "F2", description: "Rename file" }, DELETE: { key: "Delete", description: "Delete file" }, DELETE_ALT: { key: "Backspace", description: "Delete file" }, OPEN_IN_FOLDER: { key: "e", ctrl: !0, shift: !0, description: "Open in folder (Explorer)" }, SELECT_ALL: { key: "a", ctrl: !0, description: "Select all" }, DESELECT_ALL: { key: "d", ctrl: !0, description: "Deselect all" }, NAV_UP: { key: "ArrowUp", description: "Navigate up" }, NAV_DOWN: { key: "ArrowDown", description: "Navigate down" }, NAV_LEFT: { key: "ArrowLeft", description: "Navigate left" }, NAV_RIGHT: { key: "ArrowRight", description: "Navigate right" } }, Ji = null; function Yi() { return Ji ||= import("./chunks/viewerOpenRequest-DQQY02Vk.js").then((e) => e.n), Ji; } function Xi(e) { if (!e) return ""; let t = []; e.ctrl && t.push("Ctrl"), e.shift && t.push("Shift"), e.alt && t.push("Alt"); let n = e.key; return n === " " && (n = "Space"), n === "Delete" && (n = "Del"), n === "ArrowUp" && (n = "<-‘"), n === "ArrowDown" && (n = "<-“"), n === "ArrowLeft" && (n = "<-"), n === "ArrowRight" && (n = "->"), t.push(n.length === 1 ? n.toUpperCase() : n), t.join("+"); } function Zi(e, t) { if (!t || !e) return !1; let n = e.key.toLowerCase() === t.key.toLowerCase() || e.key === t.key, r = !!t.ctrl === (e.ctrlKey || e.metaKey), i = !!t.shift === e.shiftKey, a = !!t.alt === e.altKey; return n && r && i && a; } var Qi = /* @__PURE__ */ new Map(); function $i(e, t, n) { let r = e?.id; if (!r) return; let i = String(r); try { let e = Qi.get(i); e && clearTimeout(e); } catch (e) { console.debug?.(e); } try { e.rating = t, n?.(); } catch (e) { console.debug?.(e); } let a = setTimeout(async () => { try { Qi.delete(i); let e = await b(r, t); if (!e?.ok) { k(e?.error || R("toast.ratingUpdateFailed"), "error"); return; } k(R("toast.ratingSetN", { n: t }), "success", 1500), Rt(ct, { assetId: String(r), rating: t }, { warnPrefix: "[GridKeyboard]" }); } catch (e) { console.error("[GridKeyboard] Rating update failed:", e), k(R("toast.ratingUpdateError"), "error"); } }, 350); Qi.set(i, a); } function ea({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = () => [], getActiveAsset: r = () => null, onOpenDetails: i = () => {}, onOpenTagsEditor: a = () => {}, onSelectionChanged: o = () => {}, onAssetChanged: s = () => {} } = {}) { if (!e) return { bind: () => {}, unbind: () => {}, dispose: () => {} }; let c = null, u = null, d = null, f = null, p = !1, m = !1, h = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => { Yi().then((r) => r.requestViewerOpen({ assets: e, index: t, mode: n })).catch((e) => console.debug?.(e)); }, g = () => { try { er(e); } catch (e) { console.debug?.(e); } try { window.__MJR_LAST_SELECTION_GRID__ = e; } catch (e) { console.debug?.(e); } }, _ = () => { try { return n() || []; } catch { return []; } }, v = () => { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); if (Array.isArray(t)) return t; } } catch (e) { console.debug?.(e); } try { return Array.from(e.querySelectorAll(".mjr-asset-card")); } catch { return []; } }, y = () => { try { return r() || _()[0] || null; } catch { return null; } }, b = (e) => { if (!e?.filepath) return !1; let t = Je(e.filepath), n = document.createElement("a"); return n.href = t, n.download = e.filename || "download", document.body.appendChild(n), n.click(), document.body.removeChild(n), k(R("toast.downloadingFile", "Downloading {filename}...", { filename: e.filename }), "info", 3e3), !0; }, x = () => { try { if (Array.isArray(t?.()?.assets) && t().assets.length) return t().assets; } catch (e) { console.debug?.(e); } try { if (typeof e?._mjrGetAssets == "function") { let t = e._mjrGetAssets(); if (Array.isArray(t) && t.length) return t; } } catch (e) { console.debug?.(e); } try { return v().map((e) => e?._mjrAsset).filter(Boolean); } catch { return []; } }, S = () => { try { let t = v(); if (t.length >= 2) { let e = Math.round(t[0].getBoundingClientRect().top), n = t.filter((t) => { try { return Math.abs(Math.round(t.getBoundingClientRect().top) - e) <= 4; } catch { return !1; } }); if (n.length >= 1) return Math.max(1, n.length); } if (t.length >= 1) { let n = t[0].getBoundingClientRect(), r = e.getBoundingClientRect(), i = Math.max(1, Math.round(n.width)), a = Math.max(1, Math.round(r.width)); return Math.max(1, Math.floor(a / i)); } } catch (e) { console.debug?.(e); } return 1; }, C = (t, n) => { let r = Array.isArray(t) ? t.map(String).filter(Boolean) : [], i = String(n || r[0] || ""); try { typeof e?._mjrSetSelection == "function" ? e._mjrSetSelection(r, i) : (e.dataset.mjrSelectedAssetIds = JSON.stringify(r), e.dataset.mjrSelectedAssetId = i); } catch (e) { console.debug?.(e); } }, w = (t) => { let n = String(t || "").trim(); if (n) { try { if (typeof e?._mjrScrollToAssetId == "function") { e._mjrScrollToAssetId(n); return; } } catch (e) { console.debug?.(e); } try { let t = typeof CSS < "u" && CSS?.escape ? CSS.escape(n) : n.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${t}"]`)?.scrollIntoView?.({ block: "nearest", inline: "nearest" }); } catch (e) { console.debug?.(e); } } }, T = (t) => { let n = String(t.key || ""); if (n !== "ArrowLeft" && n !== "ArrowRight" && n !== "ArrowUp" && n !== "ArrowDown" && n !== "Home" && n !== "End" || t.ctrlKey || t.altKey || t.metaKey) return !1; let r = x(); if (!Array.isArray(r) || r.length === 0) return !1; let i = y(), a = String(i?.id || e?.dataset?.mjrSelectedAssetId || ""), s = r.findIndex((e) => String(e?.id || "") === a), c = s >= 0; s < 0 && (s = 0); let l = Math.max(1, S()), u = s; if (n === "ArrowLeft" ? --u : n === "ArrowRight" ? u += 1 : n === "ArrowUp" ? u -= l : n === "ArrowDown" ? u += l : n === "Home" ? u = 0 : n === "End" && (u = r.length - 1), u = Math.max(0, Math.min(r.length - 1, u)), c && u === s && n !== "Home" && n !== "End") return !1; let d = String(r[u]?.id || ""); if (!d) return !1; if (g(), t.shiftKey) { let t = String(e?._mjrSelectionAnchorId || ""); t ||= a || d; let n = r.findIndex((e) => String(e?.id || "") === t), i = n >= 0 ? n : s, o = Math.min(i, u), c = Math.max(i, u), l = r.slice(o, c + 1).map((e) => String(e?.id || "")).filter(Boolean); C(l, d); } else e._mjrSelectionAnchorId = d, C([d], d); w(d); try { o?.(); } catch (e) { console.debug?.(e); } return !0; }, E = async (n) => { let r = n.target; if (r && (r.tagName === "INPUT" || r.tagName === "TEXTAREA" || r.isContentEditable) || Se() || ge().scope === "viewer") return; if (document.activeElement !== document.body) { let t = document.activeElement, n = e.contains(t), r = t && t.contains && t.contains(e), i = t?.closest?.(".mjr-asset-card"); if (!n && !r && !i) return; } else { let t = Zn(); if (t && t !== e) return; } let c = () => { n.preventDefault(), n.stopPropagation(); }; try { if (T(n)) { c(); return; } } catch (e) { console.debug?.(e); } let u = _(), d = y(), f = t(); if (Zi(n, qi.DOWNLOAD) && d?.filepath) { c(), m = !0; return; } let p = !!ge().ratingHotkeysActive; if (!n.ctrlKey && !n.altKey && !n.metaKey && !n.shiftKey) { if (!p && Zi(n, qi.RATING_1) && d?.id) { c(), $i(d, 1, s); return; } if (!p && Zi(n, qi.RATING_2) && d?.id) { c(), $i(d, 2, s); return; } if (!p && Zi(n, qi.RATING_3) && d?.id) { c(), $i(d, 3, s); return; } if (!p && Zi(n, qi.RATING_4) && d?.id) { c(), $i(d, 4, s); return; } if (!p && Zi(n, qi.RATING_5) && d?.id) { c(), $i(d, 5, s); return; } if (!p && Zi(n, qi.RATING_RESET) && d?.id) { c(), $i(d, 0, s); return; } } if ((Zi(n, qi.OPEN_VIEWER) || Zi(n, qi.OPEN_VIEWER_ALT)) && u.length > 0) { c(); try { if (u.length >= 2 && u.length <= 4) h({ assets: u, index: 0 }); else { let t = []; if (Array.isArray(f?.assets) && f.assets.length) t = f.assets; else if (typeof e?._mjrGetAssets == "function") { let n = e._mjrGetAssets(); Array.isArray(n) && n.length && (t = n); } else t = v().map((e) => e._mjrAsset).filter(Boolean); let n = t.findIndex((e) => String(e?.id) === String(d?.id)); h({ assets: t, index: Math.max(0, n) }); } } catch (e) { console.error("[GridKeyboard] Open viewer failed:", e); } return; } if (Zi(n, qi.METADATA_PANEL) && d) { c(), i(d); return; } if (Zi(n, qi.COMPARE_AB) && u.length === 2) { c(); try { h({ assets: u, index: 0, mode: "ab" }); } catch (e) { console.debug?.(e); } return; } if (Zi(n, qi.SIDE_BY_SIDE) && u.length >= 2 && u.length <= 4) { c(); try { h({ assets: u, index: 0, mode: "sidebyside" }); } catch (e) { console.debug?.(e); } return; } if (Zi(n, qi.EDIT_TAGS) && d?.id) { c(), a(d); return; } if (Zi(n, qi.ADD_TO_COLLECTION) && (u.length > 0 || d)) { c(); let t = u.length > 0 ? u : [d], n = e.getBoundingClientRect(); await Bt({ x: n.left + n.width / 2, y: n.top + n.height / 2, assets: t }); return; } if (Zi(n, qi.REMOVE_FROM_COLLECTION)) { let e = f?.collectionId; if (e && (u.length > 0 || d)) { c(); try { let t = (u.length > 0 ? u : [d]).map((e) => String(e?.filepath || e?.path || e?.file_info?.filepath || "").trim()).filter(Boolean); if (!t.length) { k(R("toast.removeFromCollectionFailed", "No valid files to remove from collection"), "warning"); return; } let n = await ie(e, t); if (!n?.ok) { k(n?.error || R("toast.removeFromCollectionFailed", "Failed to remove from collection"), "error"); return; } try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "remove-from-collection" } })); } catch (e) { console.debug?.(e); } k(R("toast.removedFromCollection", "Removed from collection"), "success", 1400); } catch (e) { k(R("toast.removeFromCollectionError", "Error removing from collection: {error}", { error: e?.message || String(e || "") }), "error"); } return; } } if (Zi(n, qi.COPY_PATH) && d?.filepath) { c(); try { await navigator.clipboard.writeText(d.filepath), k(R("toast.pathCopied"), "success", 2e3); } catch { k(R("toast.pathCopyFailed"), "error"); } return; } if (Zi(n, qi.OPEN_IN_FOLDER) && d?.id) { c(); let e = await oe(d.id); e?.ok ? k(R("toast.openedInFolder"), "info", 2e3) : k(e?.error || R("toast.openFolderFailed"), "error"); return; } if (Zi(n, qi.RENAME) && d?.id) { c(); let e = d.filename || "", t = await Et(R("dialog.rename.title", "Rename file"), e), n = bt(t, e); if (n && n !== e) { let e = At(n); if (!e.valid) { k(e.reason, "error"); return; } try { let e = await j(d, n); if (e?.ok) { let t = e?.data?.asset; t && typeof t == "object" ? Object.assign(d, t) : (d.filename = n, d.filepath = d.filepath?.replace(/[^\\/]+$/, n), d.path &&= String(d.path).replace(/[^\\/]+$/, n), d.file_info && typeof d.file_info == "object" && (d.file_info.filename = n, d.file_info.filepath && (d.file_info.filepath = String(d.file_info.filepath).replace(/[^\\/]+$/, n)), d.file_info.path && (d.file_info.path = String(d.file_info.path).replace(/[^\\/]+$/, n)))), k(R("toast.fileRenamedSuccess"), "success"); try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "rename-keyboard" } })); } catch (e) { console.debug?.(e); } s(); } else k(e?.error || R("toast.fileRenameFailed"), "error"); } catch (e) { k(R("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); } } return; } if ((Zi(n, qi.DELETE) || Zi(n, qi.DELETE_ALT)) && (d?.id || u.length > 0)) { c(); let t = u.length > 0 ? u : [d], n = 0, r = 0, i = []; for (let e of t) if (e?.id) try { (await l(e.id))?.ok ? (n++, i.push(String(e.id))) : r++; } catch { r++; } if (i.length) try { let t = e?._mjrRemoveAssets; if (typeof t == "function") t(i); else for (let t of i) e.querySelector(`[data-mjr-asset-id="${t}"]`)?.remove?.(); } catch (e) { console.debug?.(e); } r === 0 ? k(R("toast.filesDeletedShort", "{n} files deleted", { n }), "success") : k(R("toast.filesDeletedShortPartial", "{success} deleted, {failed} failed", { success: n, failed: r }), "warning"); try { if (typeof e?._mjrSetSelection == "function") { let t = u.filter((e) => !i.includes(String(e?.id || ""))).map((e) => String(e?.id || "")).filter(Boolean); e._mjrSetSelection(t, t[0] || ""); } } catch (e) { console.debug?.(e); } o(); return; } if (Zi(n, qi.SELECT_ALL)) { c(); let t = []; try { if (Array.isArray(f?.assets) && f.assets.length) t = f.assets.map((e) => String(e?.id || "")).filter(Boolean); else if (typeof e?._mjrGetAssets == "function") { let n = e._mjrGetAssets(); Array.isArray(n) && (t = n.map((e) => String(e?.id || "")).filter(Boolean)); } } catch (e) { console.debug?.(e); } if (!t.length) try { t = v().map((e) => String(e?._mjrAsset?.id || "")).filter(Boolean); } catch (e) { console.debug?.(e); } try { typeof e?._mjrSetSelection == "function" ? e._mjrSetSelection(t, t[0] || "") : (v().forEach((e) => { e.classList.add("is-selected"), e.setAttribute("aria-selected", "true"); }), e.dataset.mjrSelectedAssetIds = JSON.stringify(t), e.dataset.mjrSelectedAssetId = String(t[0] || "")); } catch (e) { console.debug?.(e); } o(); return; } if (Zi(n, qi.DESELECT_ALL)) { c(); try { typeof e?._mjrSetSelection == "function" ? e._mjrSetSelection([], "") : (v().filter((e) => e?.classList?.contains?.("is-selected")).forEach((e) => { e.classList.remove("is-selected"), e.setAttribute("aria-selected", "false"); }), delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); } catch (e) { console.debug?.(e); } o(); return; } }, D = (e) => { if (String(e?.key || "").toLowerCase() !== "s" || !m || (m = !1, Se()) || ge().scope === "viewer") return; let t = y(); t?.filepath && (e.preventDefault?.(), e.stopPropagation?.(), e.stopImmediatePropagation?.(), b(t)); }, O = () => { m = !1; }, A = () => { p ||= (c = E, u = D, d = O, f = () => g(), document.addEventListener("keydown", c, !0), document.addEventListener("keyup", u, !0), document.addEventListener("dragstart", d, !0), e.addEventListener("pointerdown", f, !0), e.addEventListener("focusin", f, !0), !0); }, M = () => { if (!(!p || !c)) { document.removeEventListener("keydown", c, !0), u && document.removeEventListener("keyup", u, !0), d && document.removeEventListener("dragstart", d, !0), f && (e.removeEventListener("pointerdown", f, !0), e.removeEventListener("focusin", f, !0)), c = null, u = null, d = null, f = null, m = !1; try { Xn(e); } catch (e) { console.debug?.(e); } try { window.__MJR_LAST_SELECTION_GRID__ === e && delete window.__MJR_LAST_SELECTION_GRID__; } catch (e) { console.debug?.(e); } p = !1; for (let e of Qi.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } Qi.clear(); } }; return { bind: A, unbind: M, dispose: () => { M(); for (let e of Qi.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } Qi.clear(); } }; } function ta(e) { let t = qi[e]; return t ? Xi(t) : ""; } //#endregion //#region ui/features/workflows/workflowInfoState.ts var na = Sr({ open: !1, workflow: null }); function ra(e) { na.workflow = e || null, na.open = !0; } function ia() { na.open = !1, na.workflow = null; } //#endregion //#region ui/features/contextmenu/GridContextMenu.ts var aa = 1, oa = null, sa = null; function ca() { return oa ||= import("./chunks/viewerOpenRequest-DQQY02Vk.js").then((e) => e.n), oa; } function la() { return sa ||= import("./chunks/floatingViewerManager-BVG4XDLW.js").then((e) => e.n), sa; } function ua(e) { let t = String(e || "").trim().toLowerCase(); return t ? t.includes("open graph map") ? "graph-map" : t.includes("open in floating viewer") || t.includes("open floating viewer") ? "floating-viewer" : t.includes("rename") ? "rename" : t.includes("delete") ? "delete" : "" : ""; } function $(e, t, n, r, { disabled: i = !1, closeOnSelect: a = !0, submenu: o = null } = {}) { return { id: `mjr-grid-menu-item-${aa++}`, type: "item", label: String(e || ""), iconClass: t ? String(t) : "", rightHint: n ? String(n) : "", tone: ua(e), disabled: !!i, closeOnSelect: a, submenu: Array.isArray(o) && o.length ? o : null, action: typeof r == "function" ? r : null }; } function da() { return { id: `mjr-grid-menu-separator-${aa++}`, type: "separator" }; } var fa = (e) => { let t = /* @__PURE__ */ new Set(); if (!e) return t; try { let n = e.dataset?.mjrSelectedAssetIds; if (n) { let e = JSON.parse(n); if (Array.isArray(e)) return e.forEach((e) => t.add(String(e))), t; } } catch (e) { console.debug?.(e); } try { let n = e.querySelectorAll(".mjr-asset-card.is-selected"); for (let e of n) { let n = e.dataset?.mjrAssetId; n && t.add(String(n)); } } catch (e) { console.debug?.(e); } return t; }, pa = (e) => { let t = []; if (!e) return t; try { let t = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (Array.isArray(t) && t.length) return t.filter((e) => e && typeof e == "object"); } catch (e) { console.debug?.(e); } try { let n = e.dataset?.mjrSelectedAssetIds; if (n) { let r = JSON.parse(n); if (Array.isArray(r) && r.length) { let n = typeof e?._mjrGetAssets == "function" ? e._mjrGetAssets() : [], i = new Set(r.map(String)); for (let e of n || []) { let n = String(e?.id || ""); n && i.has(n) && t.push(e); } if (t.length) return t; } } } catch (e) { console.debug?.(e); } try { let n = e.querySelectorAll(".mjr-asset-card.is-selected"); for (let e of n) { let n = e?._mjrAsset; n && t.push(n); } } catch (e) { console.debug?.(e); } return t; }; async function ma(e) { let t = String(e?.filepath || e?.path || e?.full_path || "").trim(); if (!t) return e; try { let n = await C(t, { timeoutMs: 25e3 }), r = n?.data?.workflow || n?.workflow || null, i = n?.data?.prompt || n?.prompt || null; return !r && !i ? e : { ...e, workflow: r || e?.workflow, prompt: i || e?.prompt, metadata_raw: { ...e?.metadata_raw && typeof e.metadata_raw == "object" ? e.metadata_raw : {}, ...r ? { workflow: r } : {}, ...i ? { prompt: i } : {} } }; } catch (t) { return console.debug?.(t), e; } } var ha = (e) => { try { let t = e?.filepath || e?.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; } catch { return ""; } }, ga = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); return t ? { filename: t, subfolder: e.subfolder || "", type: String(e.type || e.source || "output").toLowerCase(), root_id: Ne(e) || void 0, kind: String(e.kind || "").toLowerCase() } : null; }, _a = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || e.name || "").trim(); return t ? { filename: t, subfolder: e.subfolder || "", type: String(e.type || e.source || "output").toLowerCase(), root_id: Ne(e) || void 0 } : null; }; function va(e, t = "") { if (!e) return; let n = document.createElement("a"); n.href = e, t && (n.download = t), document.body.appendChild(n), n.click(), document.body.removeChild(n); } async function ya(e) { let t = (Array.isArray(e) ? e.filter((e) => !Na(e)) : []).map(_a).filter(Boolean); if (t.length < 2) { k("Select at least two files to download a ZIP.", "warning", 2600); return; } let n = ""; try { n = qe("mjr_", 24); } catch (e) { F(e, "[GridContextMenu] Batch ZIP token", { showToast: z.DEBUG_VERBOSE_ERRORS }), k("Could not create a secure ZIP token.", "error"); return; } k(`Preparing ZIP for ${t.length} files...`, "info", 1800); let r = await le(lt.BATCH_ZIP_CREATE, { token: n, items: t, strip_metadata: !1 }); if (!r?.ok) { k(r?.error || "Failed to create ZIP.", "error"); return; } let i = r?.data?.filename || `Majoor_Batch_${t.length}.zip`; va(et(n), i), k(`Downloading ${i}...`, "info", 3e3); } async function ba(e) { let t = Array.isArray(e) ? e.filter(Boolean) : [], n = await Promise.all(t.map(async (e) => { let t = ga(e); if (!t) return null; let n = (await $t({ post: le, endpoint: lt.STAGE_TO_INPUT, payload: t, index: !1 }))?.relativePath; return n ? { payload: t, relativePath: n, droppedExt: String(t.filename || "").split(".").pop() || "" } : null; })); return Hn({ app: tt(), items: n.filter(Boolean), event: null }); } var xa = (e) => { if (e) { try { if (typeof e?._mjrSetSelection == "function") e._mjrSetSelection([], ""); else { let t = e.querySelectorAll(".mjr-asset-card.is-selected"); for (let e of t) e.classList.remove("is-selected"), e.setAttribute("aria-selected", "false"); delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId; } } catch (e) { console.debug?.(e); } Rt("mjr:selection-changed", { selectedIds: [] }, { target: e, warnPrefix: "[GridContextMenu]" }); } }, Sa = (e, t, n, r) => { if (!e) return; try { xa(e); } catch (e) { console.debug?.(e); } try { t?.classList?.add?.("is-selected"), t?.setAttribute?.("aria-selected", "true"); } catch (e) { console.debug?.(e); } let i = n?.id == null ? "" : String(n.id); if (i) try { typeof e?._mjrSetSelection == "function" ? e._mjrSetSelection([i], i) : (e.dataset.mjrSelectedAssetIds = JSON.stringify([i]), e.dataset.mjrSelectedAssetId = i); } catch (e) { console.debug?.(e); } if (r && typeof r == "object") try { r.selectedAssetIds = i ? [i] : [], r.activeAssetId = i; } catch (e) { console.debug?.(e); } }, Ca = (e) => { let t = []; if (!e) return t; try { let t = e._mjrGetAssets; if (typeof t == "function") { let e = t(); if (Array.isArray(e) && e.length) return e; } } catch (e) { console.debug?.(e); } try { let n = e.querySelectorAll(".mjr-asset-card"); for (let e of n) { let n = e?._mjrAsset; n && t.push(n); } } catch (e) { console.debug?.(e); } return t; }, wa = (e, t) => { try { let n = String(t ?? ""); return (e || []).findIndex((e) => String(e?.id ?? "") === n); } catch { return -1; } }; function Ta(e) { if (e == null) return null; try { return document.querySelector(`[data-mjr-asset-id="${xt(e)}"]`); } catch (e) { return console.debug?.(e), null; } } function Ea(e, t = null) { let n = Ta(e?.id); if (!n || !n._mjrAsset || typeof n._mjrAsset != "object") return n; try { t && typeof t == "object" ? Object.assign(n._mjrAsset, t) : e && typeof e == "object" && Object.assign(n._mjrAsset, e); } catch (e) { console.debug?.(e); } return n; } var Da = (e) => { try { let t = e ? "grid-contextmenu" : "grid-contextmenu-global"; window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: t } })); } catch (e) { console.debug?.(e); } }; async function Oa(e, t) { if (!e) return { ok: !1, error: "Missing asset" }; let n = { filename: String(e.filename || "").trim(), subfolder: String(e.subfolder || "").trim(), type: String(e.type || e.source || "output").trim().toLowerCase() || "output", root_id: String(e.root_id || e.rootId || e?.file_info?.root_id || "").trim() || void 0 }; if (!n.filename) return { ok: !1, error: "Missing filename" }; let r = await le(lt.INDEX_FILES, { files: [n], incremental: !1 }); if (!r?.ok) return r || { ok: !1, error: "Index refresh failed" }; if (e?.id != null) try { let t = await re(e.id); if (t?.ok && t?.data && typeof t.data == "object") { Object.assign(e, t.data); let n = Ea(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot"); if (r) { let e = Ot(n._mjrAsset); e && r.replaceWith(e); } } } catch (e) { console.debug?.(e); } return Da(t), { ok: !0, data: { refreshed: !0 } }; } function ka(e, t, n) { let r = e?.id; try { e.rating = t; } catch (e) { console.debug?.(e); } try { n?.(); } catch (e) { console.debug?.(e); } if (r) { Jt(String(r), t, { successMessage: t > 0 ? `Rating set to ${t} stars` : "Rating cleared", errorMessage: "Failed to update rating", warnPrefix: "[GridContextMenu]", onSuccess: () => { Rt(ct, { assetId: String(r), rating: t }, { warnPrefix: "[GridContextMenu]" }); }, onFailure: (e) => { F(e, "[GridContextMenu] Rating update", { showToast: z.DEBUG_VERBOSE_ERRORS }); } }); return; } b(e, t).catch((e) => { F(e, "[GridContextMenu] Rating update", { showToast: z.DEBUG_VERBOSE_ERRORS }); }); } function Aa(e) { let t = String(e?.scope || "").toLowerCase(); return t === "custom" || t === "input" || t === "output"; } function ja() { try { return !!(mn()?.browser?.showFolders ?? !1); } catch { return !1; } } function Ma(e) { return String(e?.scope || "").toLowerCase() === "workflow"; } function Na(e) { return String(e?.kind || "").toLowerCase() === "folder"; } function Pa(e) { return String(e?.kind || "").toLowerCase() === "workflow"; } function Fa(e) { if (!e || Na(e) || Pa(e)) return !1; let t = ha(e); if (!t) return !1; let n = String(e?.kind || "").toLowerCase(); if (n === "image" || n === "video") return !0; let r = String(t.split(".").pop() || "").toLowerCase(); return [ "png", "jpg", "jpeg", "webp", "gif", "mp4", "webm", "mov", "mkv", "avi", "m4v" ].includes(r); } async function Ia(e) { if (!e || Na(e)) return null; let t = qn(e); if (t) return t; let n = e?.id; if (n == null || n === "") return null; try { let t = await re(n, { timeoutMs: 3e4 }), r = t?.data; if (t?.ok && r && typeof r == "object") return Object.assign(e, r), qn(e); } catch (e) { console.debug?.(e); } return null; } async function La(e) { let t = await Ia(e); if (!t || typeof t != "object") { k(R("toast.assetWorkflowMissing", "No embedded ComfyUI workflow was found for this asset."), "warn", 2600); return; } let n = tt(), r = Pe(t, n); if (!r.ok) { k(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); return; } let i = r.mode === "new-tab" ? R("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab.") : R("toast.workflowLoaded", "Workflow loaded"); k(i, "success", 1800); } async function Ra(e) { let t = String(e?.filepath || e?.path || e?.full_path || "").trim(); if (!t) { k(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } let n = tt(); if (Re(n) === !0 && !await Gt(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; let r = await C(t, { timeoutMs: 3e4 }), a = r?.data?.workflow || r?.workflow || null; if (!r?.ok || !a || typeof a != "object") { k(r?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); return; } let o = Pe(a, n); if (!o.ok) { let e = Je(t, { inline: !0 }); try { e && typeof window < "u" && window.open(e, "_blank", "noopener,noreferrer"); } catch (e) { console.debug?.(e); } k(R("toast.workflowImportFallback", "ComfyUI workflow import is unavailable in this frontend. Opened workflow JSON for manual import."), "warn"), o.mode === "new-tab" && k(R("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab."), "success"); return; } try { await i({ filepath: t }, { timeoutMs: 1e4 }); } catch (e) { console.debug?.(e); } k(R("toast.workflowLoaded", "Workflow loaded"), "success", 1800); } function za(e) { try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: e } })); } catch (e) { console.debug?.(e); } } async function Ba(e) { let t = String(e?.filepath || "").trim(), n = await pe({ filepath: t }, { timeoutMs: 3e4 }); if (!n?.ok) { k(n?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); return; } k(R("toast.workflowSaved", "Workflow saved"), "success", 1800), za("workflow-duplicate"); } async function Va(e) { let t = String(e?.filepath || "").trim(), n = String(e?.display_name || e?.filename || "").replace(/\.json$/i, ""), r = await Et(R("ctx.renameWorkflow", "Rename workflow"), n, R("tab.workflow", "Workflow")), i = String(r || "").trim(); if (!i) return; let a = await y({ filepath: t, name: i }, { timeoutMs: 3e4 }); if (!a?.ok) { k(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); return; } k(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), za("workflow-rename"); } async function Ha(e) { let t = String(e?.filepath || "").trim(), n = String(e?.subfolder || "").trim(), r = await Et(R("dialog.workflowCategory", "Workflow category"), n, R("tab.workflow", "Workflow")); if (r == null) return; let i = await y({ filepath: t, category: String(r || "") }, { timeoutMs: 3e4 }); if (!i?.ok) { k(i?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); return; } k(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), za("workflow-categorize"); } async function Ua(e) { let t = String(e?.filepath || "").trim(); if (!t) { k(R("toast.noFilePath"), "error"); return; } let n = await Ee({ filepath: t, limit: 12 }, { timeoutMs: 15e3 }); if (!n?.ok) { k(n?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); return; } let r = Array.isArray(n.data) ? n.data : []; if (!r.length) { k(R("toast.workflowThumbnailNoCandidates", "No linked outputs are available for this workflow yet."), "warning", 2600); return; } let i = await Pn({ title: R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), workflow: e, items: r }); if (!i?.filepath) return; let a = await v({ filepath: t, source_filepath: i.filepath }, { timeoutMs: 3e4 }); if (!a?.ok) { k(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); return; } k(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), za("workflow-thumbnail"); } async function Wa(e) { let t = String(e?.filepath || "").trim(); if (!t) { k(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } let n = await C(t, { timeoutMs: 3e4 }); if (!n?.ok) { k(n?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); return; } let r = n?.data?.workflow || n?.workflow || null; if (!r || typeof r != "object") { k(R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); return; } let i = String(e?.filename || e?.display_name || "workflow.json").replace(/[\\/:*?"<>|]+/g, "_").replace(/\.json$/i, "") || "workflow", a = new Blob([`${JSON.stringify(r, null, 2)}\n`], { type: "application/json" }), o = URL.createObjectURL(a); try { let e = document.createElement("a"); e.href = o, e.download = `${i}.json`, e.rel = "noopener", document.body.appendChild(e), e.click(), e.remove(), k(R("toast.workflowExported", "Workflow exported"), "success", 1800); } finally { setTimeout(() => URL.revokeObjectURL(o), 5e3); } } async function Ga(e) { let t = String(e?.filepath || "").trim(); if (!t) { k(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } let n = await oe({ filepath: t }); if (!n?.ok) { k(n?.error || R("toast.openFolderFailed", "Failed to open folder."), "error"); return; } k(R("toast.openedInFolder", "Opened in folder"), "success", 1600); } async function Ka(e) { let t = ha(e); if (!t) { k(R("toast.noFilePath"), "error"); return; } let n = await kn({ title: R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), sourceAsset: e }), r = String(n?.filepath || "").trim(); if (!r) return; let i = String(e?.kind || "").toLowerCase() === "video" || /\.(mp4|webm|mov|mkv|avi|m4v)$/i.test(t); k(i ? R("toast.workflowThumbnailConverting", "Preparing a 5 second animated workflow thumbnail...") : R("toast.workflowThumbnailApplying", "Applying workflow thumbnail..."), "info", 2200); let a = await v({ filepath: r, source_filepath: t }, { timeoutMs: i ? 75e3 : 3e4 }); if (!a?.ok) { k(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); return; } k(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), za("workflow-thumbnail-assign"); } async function qa(e) { let t = String(e?.filepath || "").trim(); if (!await Gt(R("dialog.deleteWorkflowConfirm", "Delete this workflow JSON and its adjacent thumbnail files?"), R("ctx.deleteWorkflow", "Delete workflow"))) return; let n = await I({ filepath: t }, { timeoutMs: 3e4 }); if (!n?.ok) { k(n?.error || R("toast.fileDeleteFailed", "Failed to delete file."), "error"); return; } k(R("toast.workflowDeleted", "Workflow deleted"), "success", 1800), za("workflow-delete"); } function Ja(e) { let t = fa(e), n = pa(e), r = n.length || t.size; return { selectedIds: t, selectedAssetsNow: n, effectiveSelectionCount: r, isMultiSelected: r > 1, hasSelection: r > 0 }; } function Ya(e, t) { let n = (e) => "*".repeat(e) + "o".repeat(Math.max(0, 5 - e)), r = (t) => { Ea(e, { rating: t }); }; return [ $(n(5), "pi pi-star", null, async () => { ka(e, 5, () => r(5)); }, { disabled: !t }), $(n(4), "pi pi-star", null, async () => { ka(e, 4, () => r(4)); }, { disabled: !t }), $(n(3), "pi pi-star", null, async () => { ka(e, 3, () => r(3)); }, { disabled: !t }), $(n(2), "pi pi-star", null, async () => { ka(e, 2, () => r(2)); }, { disabled: !t }), $(n(1), "pi pi-star", null, async () => { ka(e, 1, () => r(1)); }, { disabled: !t }), da(), $(R("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { ka(e, 0, () => r(0)); }, { disabled: !t }) ]; } function Xa(e, t) { let n = String(t?.dataset?.mjrScope || "").toLowerCase(); if (n !== "input" && n !== "output") return e; let r = String(e || "").trim().replaceAll("\\", "/"); return r ? `mjr://${n}/${r}` : `mjr://${n}`; } function Za({ currentPath: e, gridContainer: t } = {}) { return [$(R("ctx.createFolderHere", "Create folder here..."), "pi pi-plus", null, async () => { try { let n = await Et(R("dialog.newFolderName", "New folder name"), ""), r = String(n || "").trim(); if (!r) return; let i = await ke({ op: "create", path: Xa(e, t), name: r }); if (!i?.ok) { k(i?.error || "Failed to create folder", "error"); return; } Da(t), k(R("toast.folderCreated", "Folder created: {name}", { name: r }), "success"); } catch (e) { k(R("toast.createFolderFailedDetail", "Create folder failed: {error}", { error: e?.message || String(e || "") }), "error"); } })]; } function Qa({ asset: e, gridContainer: t, panelState: n } = {}) { let r = String(e?.filepath || "").trim(), i = [$(R("ctx.openFolder", "Open folder"), "pi pi-folder-open", null, () => { try { t.dispatchEvent(new CustomEvent("mjr:open-folder-asset", { bubbles: !0, detail: { asset: e } })); } catch (e) { console.debug?.(e); } }), $(R("ctx.pinAsBrowserRoot"), "pi pi-bookmark", null, async () => { if (!r) { k(R("toast.unableResolveFolderPath"), "error"); return; } let t = await Et(R("dialog.browserRootLabelOptional"), String(e?.filename || "")), n = await le(lt.CUSTOM_ROOTS, { path: r, label: String(t || "").trim() || void 0 }); if (!n?.ok) { k(n?.error || R("toast.pinFolderFailed"), "error"); return; } k(R("toast.folderPinnedAsBrowserRoot"), "success"); try { window.dispatchEvent(new CustomEvent("mjr:custom-roots-changed", { detail: { preferredId: String(n?.data?.id || "") } })); } catch (e) { console.debug?.(e); } })]; return Aa(n) && r && i.push(da(), $(R("ctx.createFolderHere"), "pi pi-plus", null, async () => { try { let e = await Et(R("dialog.newFolderName"), ""), n = String(e || "").trim(); if (!n) return; let i = await ke({ op: "create", path: r, name: n }); if (!i?.ok) { k(i?.error || R("toast.createFolderFailed"), "error"); return; } Da(t), k(R("toast.folderCreated", { name: n }), "success"); } catch (e) { k(R("toast.createFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } }), $(R("ctx.renameFolder"), "pi pi-pencil", null, async () => { try { let n = String(e?.filename || "").trim(), i = await Et(R("dialog.renameFolder"), n), a = String(i || "").trim(); if (!a || a === n) return; let o = await ke({ op: "rename", path: r, name: a }); if (!o?.ok) { k(o?.error || R("toast.renameFolderFailed"), "error"); return; } Da(t), k(R("toast.folderRenamed"), "success"); } catch (e) { k(R("toast.renameFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } }), $(R("ctx.moveFolder"), "pi pi-arrow-right", null, async () => { try { let e = await Et(R("dialog.destinationDirectoryPath"), ""), n = String(e || "").trim(); if (!n) return; let i = await ke({ op: "move", path: r, destination: n }); if (!i?.ok) { k(i?.error || R("toast.moveFolderFailed"), "error"); return; } Da(t), k(R("toast.folderMoved"), "success"); } catch (e) { k(R("toast.moveFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } }), $(R("ctx.deleteFolder"), "pi pi-trash", null, async () => { try { let n = String(e?.filename || R("label.thisFolder", "this folder")); if (!await Gt(R("dialog.deleteFolderRecursive", { name: n }))) return; let i = await ke({ op: "delete", path: r, recursive: !0 }); if (!i?.ok) { k(i?.error || R("toast.deleteFolderFailed"), "error"); return; } Da(t), k(R("toast.folderDeleted"), "success"); } catch (e) { k(R("toast.deleteFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } })), i; } function $a({ asset: e, card: t, gridContainer: r, panelState: i, pointerX: a, pointerY: o, selection: s } = {}) { let { selectedAssetsNow: c, effectiveSelectionCount: u, isMultiSelected: d, hasSelection: f } = s, p = [], m = Ma(i), h = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => ca().then((r) => r.requestViewerOpen({ assets: e, index: t, mode: n })).catch((e) => console.debug?.(e)); if (Pa(e)) { if (p.push($(R("ctx.loadWorkflow", "Load workflow"), "pi pi-sitemap", null, () => Ra(e)), $(R("ctx.duplicateWorkflow", "Duplicate workflow"), "pi pi-copy", null, () => Ba(e)), $(R("ctx.renameWorkflow", "Rename workflow"), "pi pi-pencil", null, () => Va(e)), $(R("ctx.categorizeWorkflow", "Set workflow category"), "pi pi-folder", null, () => Ha(e)), $(R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), "pi pi-image", null, () => Ua(e)), $(R("ctx.editWorkflowInfo", "Edit infos"), "pi pi-info-circle", null, () => ra(e)), $(R("ctx.exportWorkflow", "Export workflow"), "pi pi-download", null, () => Wa(e)), $(R("ctx.showInExplorer", "Show in Explorer"), "pi pi-folder-open", null, () => Ga(e)), $(R("ctx.deleteWorkflow", "Delete workflow"), "pi pi-trash", null, () => qa(e)), da()), m) return p.push($("Open Graph Map", "pi pi-sitemap", null, async () => { try { let t = await ma(e), { floatingViewerManager: n } = await la(); await n.openAssets({ assets: [t], index: 0, mode: "graph" }); } catch (e) { console.debug?.(e); } })), p; } else if (m) return p; p.push($("Open As New Tab", "pi pi-external-link", null, () => La(e)), $("Open Viewer", "pi pi-image", ta("OPEN_VIEWER"), () => { try { let t = (f ? pa(r) : []).filter((e) => !Na(e)), n = t.length; if (n >= 2 && n <= 4) { h({ assets: t, index: 0 }); return; } let i = Ca(r).filter((e) => !Na(e)), a = wa(i, e?.id); if (!i.length || a < 0) return; h({ assets: i, index: Math.max(0, a) }); } catch (e) { console.debug?.(e); } }), $("Open in Floating Viewer", "pi pi-window-maximize", ta("OPEN_FLOATING_VIEWER"), async () => { try { let { floatingViewerManager: t } = await la(), n = (f ? pa(r) : []).filter((e) => !Na(e)); if (n.length) { await t.openAssets({ assets: n, index: Math.max(0, n.findIndex((t) => String(t?.id || "") === String(e?.id || ""))) }); return; } await t.openAssets({ assets: [e], index: 0 }); } catch (e) { console.debug?.(e); } }), $("Load Asset", "pi pi-upload", "L / L+Drop", async () => { let t = (f ? pa(r) : []).filter((e) => !Na(e)); await ba(t.length ? t : [e]) || k("Failed to create a loader node for this asset.", "error"); }), $("Open Graph Map", "pi pi-sitemap", null, async () => { try { let t = await ma(e), { floatingViewerManager: n } = await la(); await n.openAssets({ assets: [t], index: 0, mode: "graph" }); } catch (e) { console.debug?.(e); } }), $(R("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", ta("METADATA_PANEL"), () => { try { Sa(r, t, e, i); let n = r?._mjrOpenDetails; typeof n == "function" && n(); } catch (e) { console.debug?.(e); } })), Fa(e) && p.push($(R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), "pi pi-image", null, () => Ka(e))); let g = (f ? c : []).filter((e) => !Na(e)), _ = g.length; _ === 2 && p.push($("Compare A/B (2 selected)", "pi pi-clone", ta("COMPARE_AB"), () => { try { h({ assets: g, index: 0, mode: "ab" }); } catch (e) { console.debug?.(e); } })), _ >= 2 && _ <= 4 && p.push($(`Side-by-side (2x2) (${_} selected)`, "pi pi-table", ta("SIDE_BY_SIDE"), () => { try { h({ assets: g, index: 0, mode: "sidebyside" }); } catch (e) { console.debug?.(e); } })), p.push($(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", ta("OPEN_IN_FOLDER"), async () => { let t = await oe(e); t?.ok ? k(R("toast.openedInFolder"), "info", 2e3) : k(t?.error || R("toast.openFolderFailed"), "error"); }, { disabled: !(e?.id || ha(e)) }), $(R("ctx.collectFiles", "Collect files"), "pi pi-box", null, async () => { k(R("toast.collectingFiles", "Collecting files..."), "info", 2500); let t = await n(e); if (!t?.ok) { k(t?.error || R("toast.collectFilesFailed", "Collect files failed"), "error"); return; } let r = t?.data || {}, i = Array.isArray(r.missing) ? r.missing.length : 0, a = r.fallback_used ? R("toast.collectFallbackDir", "output folder (source folder not writable)") : R("toast.collectSameDir", "asset folder"), o = R("toast.collectedFiles", "Collected {name} in {where}", { name: String(r.zip_name || "zip"), where: a }); i > 0 && (o += ` — ${i} ${R("toast.collectMissingInputs", "input(s) missing")}`), k(o, i > 0 ? "warning" : "success", 6e3); }, { disabled: !ha(e) }), $(R("ctx.copyPath", "Copy path"), "pi pi-copy", ta("COPY_PATH"), async () => { let t = e?.filepath ? String(e.filepath) : ""; if (!t) { k(R("toast.noFilePath"), "error"); return; } try { await navigator.clipboard.writeText(t), k(R("toast.pathCopied"), "success", 2e3); } catch (e) { console.warn(R("log.clipboardCopyFailed", "Clipboard copy failed"), e), k(R("toast.pathCopyFailed"), "error"); } }), $(R("ctx.download", "Download"), "pi pi-download", ta("DOWNLOAD"), () => { if (!e?.filepath) return; let t = Je(e.filepath), n = e.filename || "download"; va(t, n), k(R("toast.downloadingFile", "Downloading {filename}...", { filename: n }), "info", 3e3); }, { disabled: !e?.filepath }), $(`Download selected as ZIP (${_})`, "pi pi-file-zip", null, async () => { await ya(g); }, { disabled: _ < 2 }), $("Add to collection...", "pi pi-bookmark", ta("ADD_TO_COLLECTION"), async () => { let t = pa(r), n = t.length ? t : [e]; await Bt({ x: a, y: o, assets: n }); })); let v = String(i?.collectionId || "").trim(); if (v) { let t = pa(r), n = (t.length ? t : [e]).map(ha).filter(Boolean), i = n.length > 1 ? `Remove from collection (${n.length})` : "Remove from collection"; p.push($(i, "pi pi-bookmark", null, async () => { if (!n.length) { k(R("toast.noFilePath"), "error"); return; } let e = await ie(v, n); if (!e?.ok) { k(e?.error || R("toast.removeFromCollectionFailed"), "error"); return; } Da(r); })); } let y = !!(e?.id || ha(e)); return p.push(da(), $(R("ctx.editTags", "Edit tags"), "pi pi-tags", ta("EDIT_TAGS"), () => { eo(a + 6, o + 6, e, () => { Ea(e, { tags: Array.isArray(e?.tags) ? [...e.tags] : [] }); }); }, { closeOnSelect: !1 }), da(), $(R("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, { disabled: !y, closeOnSelect: !1, submenu: Ya(e, y) }), da(), $(R("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => { if (e?.filename || e?.id) { k(R("toast.rescanningFile", "Rescanning file..."), "info", 1600); try { let t = await Oa(e, r); t?.ok ? k(R("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: "" }), "success", 1800) : k(t?.error || R("toast.resetFailed", "Failed to reset index"), "error"); } catch (e) { k(`${R("toast.resetFailed", "Failed to reset index")}: ${e?.message || String(e || "")}`, "error"); } } }, { disabled: !(e?.filename || e?.id) }), $("Rename...", "pi pi-pencil", ta("RENAME"), async () => { if (!(e?.id || ha(e))) return; let t = e.filename || "", n = await Et(R("dialog.rename.title", "Rename file"), t), i = bt(n, t); if (!i || i === t) return; let a = At(i); if (!a.valid) { k(a.reason, "error"); return; } try { let t = await j(e, i); if (!t?.ok) { k(t?.error || R("toast.fileRenameFailed"), "error"); return; } let n = t?.data?.asset; n && typeof n == "object" ? (Object.assign(e, n), Ea(e, n)) : (e.filename = i, e.filepath &&= String(e.filepath).replace(/[^\\/]+$/, i), e.path &&= String(e.path).replace(/[^\\/]+$/, i), e.file_info && typeof e.file_info == "object" && (e.file_info.filename = i, e.file_info.filepath && (e.file_info.filepath = String(e.file_info.filepath).replace(/[^\\/]+$/, i)), e.file_info.path && (e.file_info.path = String(e.file_info.path).replace(/[^\\/]+$/, i))), Ea(e, { filename: e.filename, filepath: e.filepath, path: e.path, file_info: e.file_info })); let a = Ta(e.id)?.querySelector?.(".mjr-filename"); a && (a.textContent = e.filename || i), k(R("toast.fileRenamedSuccess"), "success"), Da(r); } catch (e) { k(R("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); } }, { disabled: !(e?.id || ha(e)) })), d ? p.push($(`Delete ${u} files...`, "pi pi-trash", ta("DELETE"), async () => { if (await yt(Number(u) || 0)) try { let t = 0, n = 0, a = [], o = 0, s = c.length ? c : [e]; for (let e of s) (await l(e))?.ok ? (t += 1, e?.id == null ? o += 1 : a.push(String(e.id))) : n += 1; if (a.length) { let e = Vi(r, a); i && Array.isArray(e?.selectedIds) && (i.selectedAssetIds = e.selectedIds, i.activeAssetId = e.selectedIds[0] || ""); } o > 0 && Da(r), n === 0 ? k(R("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n: t }), "success") : k(R("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { success: t, failed: n }), "warning"); } catch (e) { k(R("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); } })) : p.push($(R("ctx.delete", "Delete"), "pi pi-trash", ta("DELETE"), async () => { if (await yt(1, e?.filename)) try { let t = await l(e); if (!t?.ok) { k(t?.error || R("toast.fileDeleteFailed"), "error"); return; } if (e?.id) { let t = Vi(r, [String(e.id)]); i && Array.isArray(t?.selectedIds) && (i.selectedAssetIds = t.selectedIds, i.activeAssetId = t.selectedIds[0] || ""); } else Da(r); k(R("toast.fileDeletedSuccess"), "success"); } catch (e) { k(R("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); } }, { disabled: !(e?.id || ha(e)) })), p; } function eo(e, t, n, r) { n && cn({ x: e, y: t, asset: n, onChanged: r }); } function to({ gridContainer: e, getState: t = () => ({}) } = {}) { if (!e) return; if (e._mjrGridContextMenuBound && typeof e._mjrGridContextMenuUnbind == "function") return e._mjrGridContextMenuUnbind; let n = async (n) => { let r = (() => { try { return t?.() || {}; } catch { return {}; } })(), i = Pt(n.target, ".mjr-asset-card"); if (!i) { if (!Aa(r)) return; let t = String(e?.dataset?.mjrScope || "").toLowerCase(), i = String(e?.dataset?.mjrSubfolder || "").trim(), a = (t === "input" || t === "output") && ja(); if (!i && !a) return; n.preventDefault(), n.stopPropagation(), bn({ x: n.clientX, y: n.clientY, items: Za({ currentPath: i, gridContainer: e }) }); return; } n.preventDefault(), n.stopPropagation(); let a = i._mjrAsset; if (!a) return; let o = Ja(e), s = Na(a) ? Qa({ asset: a, gridContainer: e, panelState: r }) : $a({ asset: a, card: i, gridContainer: e, panelState: r, pointerX: n.clientX, pointerY: n.clientY, selection: o }); bn({ x: n.clientX, y: n.clientY, items: s }); }; try { e.addEventListener("contextmenu", n); } catch (e) { console.error("[GridContextMenu] Failed to bind:", e); } e._mjrGridContextMenuBound = !0; let r = () => { try { e.removeEventListener("contextmenu", n); } catch (e) { console.debug?.(e); } try { e._mjrGridContextMenuBound = !1; } catch (e) { console.debug?.(e); } try { e._mjrGridContextMenuUnbind = null; } catch (e) { console.debug?.(e); } try { Kt(); } catch (e) { console.debug?.(e); } try { Qt(); } catch (e) { console.debug?.(e); } }; return e._mjrGridContextMenuUnbind = r, r; } //#endregion //#region ui/features/panel/controllers/ratingHotkeysController.ts var no = ct; function ro(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); } catch (e) { console.debug?.(e); } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } function io(e, t = null) { if (!e) return []; try { let t = Array.from(Yn(e)); if (t.length) return t; } catch (e) { console.debug?.(e); } try { let n = t?.closest?.(".mjr-asset-card"), r = n?._mjrAsset?.id ?? n?.dataset?.mjrAssetId; if (n && e.contains(n) && r != null) return [String(r)]; } catch (e) { console.debug?.(e); } return []; } function ao(e, t) { try { return e?.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${ro(t)}"]`); } catch (e) { return console.debug?.(e), null; } } function oo(e, t, n) { if (!e) return; let r = e._mjrAsset; r && (r.rating = n); try { let r = e.querySelector(".mjr-thumb"); if (!r) return; let i = e.querySelector(".mjr-rating-badge"), a = t ? t(n || 0) : null; i && a ? i.replaceWith(a) : i && !a ? i.remove() : !i && a && r.appendChild(a); } catch (e) { console.debug?.(e); } } async function so(e, t, n = 5) { let r = Math.max(1, Number(n) || 1), i = 0, a = [], o = async () => { for (; i < e.length;) { let n = i; i += 1; try { await t(e[n], n); } catch (e) { console.debug?.(e); } } }; for (let t = 0; t < Math.min(r, e.length); t += 1) a.push(o()); await Promise.all(a); } function co({ gridContainer: e, createRatingBadge: t } = {}) { let n = !1, r = null, i = null, a = async (e, t) => { if (e != null) { try { let n = await b(e, t); if (!n?.ok) { k(n?.error || R("toast.ratingUpdateFailed"), "error"); return; } k(R("toast.ratingSetN", { n: t }), "success", 1500); } catch { k(R("toast.ratingUpdateError"), "error"); return; } try { window.dispatchEvent(new CustomEvent(no, { detail: { assetId: String(e), rating: t } })); } catch (e) { console.debug?.(e); } } }; return { bind: () => { if (!(n || !e)) { n = !0, de(!0), r = async (t) => { if (Se() || ge().scope === "viewer" || t.defaultPrevented) return; let n = String(t.key || ""); if (n !== "0" && n !== "1" && n !== "2" && n !== "3" && n !== "4" && n !== "5") return; let r = document.querySelector(".mjr-viewer-overlay"); if (r && r.style.display !== "none") return; let i = e.contains(t.target) || e === t.target, o = !!t.target?.closest?.(".mjr-mfv"), s = !!document.querySelector(".mjr-mfv.is-visible"); if (!i && !o && !s) return; let c = n === "0" ? 0 : Number(n); if (!Number.isFinite(c)) return; let l = io(e, t.target); l.length && (t.preventDefault(), t.stopPropagation(), t.stopImmediatePropagation?.(), await so(l, (e) => a(e, c), 5)); }, i = (n) => { let r = n?.detail || {}, i = r.assetId ?? r.id ?? null, a = Number(r.rating); if (!i || !Number.isFinite(a)) return; let o = ao(e, i); o && oo(o, t, a); }; try { window.addEventListener("keydown", r, { capture: !0 }); } catch (e) { console.debug?.(e); } try { window.addEventListener(no, i); } catch (e) { console.debug?.(e); } } }, dispose: () => { if (n) { n = !1, de(!1); try { window.removeEventListener("keydown", r, { capture: !0 }); } catch (e) { console.debug?.(e); } try { window.removeEventListener(no, i); } catch (e) { console.debug?.(e); } r = null, i = null; } } }; } //#endregion //#region ui/features/grid/StackGroupCards.ts function lo(e) { if (!e || e.dataset?.mjrOverlayButtonBound === "1") return e; try { e.dataset.mjrOverlayButtonBound = "1"; } catch (e) { console.debug?.(e); } try { e.draggable = !1; } catch (e) { console.debug?.(e); } let t = (e) => { e.stopPropagation(); }, n = (e) => { e.stopPropagation(), e.preventDefault(); }; return e.addEventListener("pointerdown", t), e.addEventListener("mousedown", n), e.addEventListener("touchstart", t, { passive: !0 }), e.addEventListener("dblclick", t), e.addEventListener("keydown", t), e.addEventListener("dragstart", n), e; } function uo(e, t, n = null, r = "mjr-stack-group-button-count") { e.textContent = ""; let i = document.createElement("span"); if (i.className = t, e.appendChild(i), n != null) { let t = document.createElement("span"); t.className = r, t.textContent = String(n), e.appendChild(t); } } function fo(e) { return String(e?.dataset?.mjrGroupStacks || "") === "1"; } function po(e) { let t = String(e?.stack_id || "").trim(); return t ? `stack:${t}` : ""; } function mo(e, t, n) { return fo(e) && po(t) || n; } function ho(e) { try { e._mjrStackMembersCache?.clear?.(); } catch (e) { console.debug?.(e); } } function go(e, t, n) { if (!t || !n || t._mjrIsVue) return; let r = !!n._mjrDupStack, i = Number(n._mjrDupCount || 0) || 0; if (!r || i < 2) { let e = t.querySelector(".mjr-dup-stack-button"); e && e.remove(), delete t.dataset.mjrDupStacked, delete t.dataset.mjrDupCount; return; } t.dataset.mjrDupStacked = "true", t.dataset.mjrDupCount = String(i); let a = t.querySelector(".mjr-dup-stack-button"); a || (a = document.createElement("button"), a.type = "button", a.className = "mjr-dup-stack-button", a.setAttribute("aria-label", "Show all duplicates"), lo(a), a.addEventListener("click", (e) => { if (e.preventDefault(), e.stopPropagation(), a.dataset?.mjrStackOpening !== "1") try { a.dataset.mjrStackOpening = "1", a.disabled = !0; let e = a?._mjrGridContainer, t = a?._mjrAsset; if (!e || !t) return; let n = Array.isArray(t._mjrDupMembers) ? t._mjrDupMembers : [t], r = n.length; e.dispatchEvent(new CustomEvent(B.OPEN_STACK_GROUP, { bubbles: !0, detail: { asset: t, members: n, title: `Duplicates - ${r} copies`, isDupGroup: !0 } })); } catch (e) { console.debug?.(e); } finally { try { delete a.dataset.mjrStackOpening, a.disabled = !1; } catch (e) { console.debug?.(e); } } }), t.appendChild(a)), a._mjrGridContainer = e, a._mjrAsset = n; let o = `${i} duplicate${i > 1 ? "s" : ""}`; a.title = `${o} - click to compare all copies`, uo(a, "pi pi-copy", i, "mjr-dup-stack-count"); } //#endregion //#region ui/features/dnd/utils/log.ts var _o = () => { try { return !!window?.MJR_DND_DEBUG; } catch { return !1; } }, vo = (...e) => { _o() && console.debug("[Majoor.DnD]", ...e); }, yo = (e, { buildCustomViewURL: t, buildViewURL: n }) => { let r = String(e?.type || "output").toLowerCase(); return r === "custom" ? t(e?.filename || "", e?.subfolder || "", Ne(e)) : r === "input" ? n(e?.filename || "", e?.subfolder || "", "input") : r === "temp" ? n(e?.filename || "", e?.subfolder || "", "temp") : n(e?.filename || "", e?.subfolder || "", "output"); }, bo = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); if (!t || t.includes("/") || t.includes("\\") || t.includes("\0")) return null; let n = String(e.subfolder || "").replace(/\x00/g, "").split(/[\\/]/).filter((e) => e !== ".." && e !== ".").join("/").replace(/^\/+/, ""), r = String(e.type || "output").toLowerCase(), i = r === "input" || r === "temp" || r === "custom" ? r : "output", a = e.root_id == null ? void 0 : String(e.root_id).trim(), o = e.kind == null ? void 0 : String(e.kind).toLowerCase(), s = e.filepath == null ? void 0 : String(e.filepath).replace(/\x00/g, "").trim(); return { filename: t, subfolder: n, type: i, root_id: a || void 0, kind: o || void 0, filepath: o === "workflow" && s ? s : void 0 }; }, xo = bo, So = (e, t) => { let n = e?.dataTransfer?.getData?.(t); if (!n) return null; try { return bo(JSON.parse(n)); } catch { return null; } }, Co = /* @__PURE__ */ new WeakMap(), wo = !1; function To(e) { return e && Co.get(e) || null; } function Eo(e, t) { return e ? typeof t == "function" ? (Co.set(e, t), t) : (Co.delete(e), null) : null; } function Do(e) { e && Co.delete(e); } function Oo() { wo = !0; } function ko() { return wo ? (wo = !1, !0) : !1; } function Ao() { wo = !1; } //#endregion //#region ui/features/dnd/out/DragOut.ts var jo = (e) => { try { return new URL(String(e || ""), window.location.href).href; } catch { return String(e || ""); } }, Mo = () => qe("mjr_", 24), No = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return null; let n = t.filename || t.name; return n ? { filename: n, subfolder: t.subfolder || "", type: String(t.type || "output").toLowerCase(), root_id: Ne(t) || void 0 } : null; }, Po = (e, t) => { let n = []; if (!e || !t) return n; let r = t?.dataset?.mjrAssetId ? String(t.dataset.mjrAssetId) : ""; try { let t = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (Array.isArray(t) && t.length) { let e = t.filter((e) => e && typeof e == "object"); if (e.length && r && e.some((e) => String(e?.id || "") === r)) return e; } } catch (e) { console.debug?.(e); } let i = []; try { let t = e.dataset?.mjrSelectedAssetIds; if (t) { let e = JSON.parse(t); Array.isArray(e) && (i = e.map(String).filter(Boolean)); } } catch (e) { console.debug?.(e); } if (i.length) try { if (!r || !i.includes(r)) return n; let t = typeof e?._mjrGetAssets == "function" ? e._mjrGetAssets() : []; for (let e of t || []) { let t = String(e?.id || ""); t && i.includes(t) && n.push(e); } if (n.length) return n; } catch (e) { console.debug?.(e); } let a; try { a = Array.from(e.querySelectorAll(".mjr-asset-card.is-selected")) || []; } catch { a = []; } try { if (!a.includes(t)) return n; } catch { return n; } for (let e of a) { let t = e?._mjrAsset; !t || typeof t != "object" || n.push(t); } return n; }, Fo = (e) => { if (!e || typeof e != "object") return ""; let t = e.filepath || e.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; }, Io = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => { if (!e || !t) return; let o = Po(n, r); if (Array.isArray(o) && o.length > 1) { let t = o.map(No).filter(Boolean); if (t.length > 1) { let n = ""; try { n = Mo(); } catch (e) { console.warn("[DragOut] failed to create secure batch token", e); } if (n) { try { le(lt.BATCH_ZIP_CREATE, { token: n, items: t, strip_metadata: !!a }).catch(() => {}); } catch (e) { console.debug?.(e); } let r = jo(et(n)), i = a ? `Majoor_Clean_Batch_${t.length}.zip` : `Majoor_Batch_${t.length}.zip`; try { e.setData("text/uri-list", r), e.setData("DownloadURL", `application/zip:${i}:${r}`), e.effectAllowed = "copyMove"; } catch (e) { console.debug?.(e); } return; } } } let s = t.filename || t.name; if (!s) return; let c = a ? Fo(t) : "", l = jo((c ? Ke(c) : "") || i), u = pn(s); try { e.setData("text/uri-list", l), e.setData("DownloadURL", `${u}:${s}:${l}`), e.effectAllowed = "copyMove"; } catch (e) { console.debug?.(e); } }, Lo = (e, { asset: t, containerEl: n, card: r }) => { if (!(!e || !t)) try { let t = e?.dataTransfer?.dropEffect; !t || t === "none" || ko(); return; } catch (e) { console.debug?.(e); } }, Ro = () => { let e = tt(); return e && typeof e == "object" ? e : null; }, zo = (e) => yo(e, { buildCustomViewURL: rt, buildViewURL: it }), Bo = !1, Vo = !1, Ho = (e) => { try { return !!e?.closest?.("input, textarea, select, [contenteditable='true']"); } catch { return !1; } }, Uo = () => Bo === !0, Wo = () => Vo === !0, Go = (e) => [ String(e?.type || "output"), String(e?.filename || ""), String(e?.subfolder || ""), String(Ne(e) || "") ].join("\n"), Ko = (e, t) => { if (String(e?.type || e?.file_info?.type || "").toLowerCase() === "custom") return null; let n = ft(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "")).trim(); if (!n || !t) return null; let r = n.toLowerCase(), i = t.toLowerCase(); for (let e of [ { marker: "/output/", type: "output" }, { marker: "/input/", type: "input" }, { marker: "/temp/", type: "temp" } ]) { let t = r.lastIndexOf(e.marker); if (t < 0) continue; let a = n.slice(t + e.marker.length), o = a.toLowerCase(); if (o !== i && !o.endsWith(`/${i}`)) continue; let s = a.lastIndexOf("/"); return { type: e.type, subfolder: s > 0 ? a.slice(0, s) : "" }; } return null; }, qo = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); if (!t) return null; let n = Ko(e, t); return { filename: t, subfolder: n?.subfolder ?? e.subfolder ?? "", type: n?.type ?? String(e.type || "output").toLowerCase(), root_id: Ne(e) || void 0, kind: String(e.kind || "").toLowerCase(), filepath: String(e.filepath || e.path || e?.file_info?.filepath || "").trim() || void 0 }; }, Jo = (e, t, n) => { if (!e || !t || n == null) return !1; let r = String(n); try { if (typeof e.setData == "function") return e.setData(t, r), !0; } catch (e) { console.debug?.(e); } try { if (typeof e.items?.add == "function") return e.items.add(r, t), !0; } catch (e) { console.debug?.(e); } return !1; }, Yo = ({ dt: e, asset: t, payload: n, viewUrl: r }) => { if (!e || !t || !n) return; let i = String(n.kind || "").toLowerCase() === "model3d" ? "3D" : n.kind, a = { id: t.id == null ? Go(n) : String(t.id), name: t.filename || n.filename, display_name: t.filename || n.filename, filename: n.filename, subfolder: n.subfolder || "", type: n.type || "output", kind: i || void 0, preview_url: r || void 0, thumbnail_url: t.thumbnail_url || t.thumbnailUrl || t.preview_url || void 0, user_metadata: { filename: n.filename, subfolder: n.subfolder || "", type: n.type || "output" }, tags: Array.isArray(t.tags) ? t.tags : [] }; Jo(e, on, JSON.stringify(a)), r && Jo(e, "text/uri-list", r); }, Xo = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return []; try { let e = window?.__MJR_LAST_SELECTION_GRID__, n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (Array.isArray(n) && n.length > 1) { let e = n.map(qo).filter(nn), r = Go(t); if (e.some((e) => Go(e) === r)) return e; } } catch (e) { console.debug?.(e); } return [t]; }, Zo = (e, t) => { try { let n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (!Array.isArray(n) || n.length <= 1) return []; let r = n.map(qo).filter(nn), i = Go(t); return r.some((e) => Go(e) === i) ? r : []; } catch (e) { return console.debug?.(e), []; } }, Qo = (e, t) => { try { let t = e?.dataTransfer?.getData?.("application/x-mjr-assets") || ""; if (t) { let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(xo).filter(nn); if (n.length) return n; } } catch (e) { console.debug?.(e); } return Xo(t); }, $o = async (e) => { let t = Array.isArray(e) ? e.filter(Boolean) : []; return t.length ? (await Promise.all(t.map(async (e) => { let t = (await $t({ post: le, endpoint: lt.STAGE_TO_INPUT, payload: e, index: !1 }))?.relativePath; return t ? { payload: e, relativePath: t, droppedExt: String(e?.filename || "").split(".").pop() || "" } : null; }))).filter(Boolean) : []; }, es = /* @__PURE__ */ new Map(), ts = 6e4, ns = 20, rs = 5242880, is = 5e3, as = 2e4, os = 256, ss = 5e5, cs = /[\u0000-\u001f\u007f]/, ls = /\u0000/, us = (e) => cs.test(String(e || "")), ds = (e) => ls.test(String(e || "")), fs = (e) => { if (!e || typeof e != "object" || Array.isArray(e)) return !1; let t = Number(e.id); if (!Number.isFinite(t)) return !1; let n = e.type == null ? "" : String(e.type); if (n && (n.length > os || us(n))) return !1; let r = e.widgets_values; if (Array.isArray(r)) { for (let e of r) if (typeof e == "string" && (e.length > ss || ds(e))) return !1; } return !0; }, ps = (e) => { if (Array.isArray(e)) return e.length >= 4; if (e && typeof e == "object") { let t = Number(e.id); return !!Number.isFinite(t); } return !1; }, ms = (e) => { if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > is || e.links.length > as || !e.nodes.every(fs) || !e.links.every(ps)) return !1; try { let t = JSON.stringify(e).length; if (!Number.isFinite(t) || t <= 0 || t > rs) return !1; } catch { return !1; } return !0; }, hs = () => { let e = Date.now(); for (let [t, n] of es.entries()) e - (n?.at || 0) > ts && es.delete(t); es.size > ns && Array.from(es.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, es.size - ns).forEach(([e]) => es.delete(e)); }, gs = async (e, t = null) => { let n = e && typeof e == "object" ? e : null, r = Ne(n), i = Ro(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null; if (a) { let e = es.get(a); if (e && Date.now() - (e.at || 0) < ts) { if (e.workflow && ms(e.workflow)) try { if (typeof i?.loadGraphData == "function") return i.loadGraphData(e.workflow), !0; if (typeof i?.canvas?.graph?.configure == "function") { i.canvas.graph.configure(e.workflow); try { i.canvas.setDirty?.(!0, !0); } catch (e) { console.debug?.(e); } return !0; } if (typeof i?.graph?.configure == "function") return i.graph.configure(e.workflow), !0; } catch (e) { console.debug?.(e); } return !1; } } try { let e = null, o = null; if (String(n?.kind || "").toLowerCase() === "workflow" && n?.filepath) { let e = await C(String(n.filepath), { timeoutMs: 3e4 }); o = e?.ok && (e?.data?.workflow || e?.workflow) || null; } else if (n?.filename) { let t = `${lt.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : ""), i = await ae(t); i?.ok && i.workflow && (o = i.workflow), o || (e = `${lt.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`); } else t && (e = `${lt.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`); if (!o && e) { let t = await ae(e); if (!t?.ok || !t.data) return !1; o = t.data?.workflow; } if (!ms(o)) return !1; if (a && (es.set(a, { workflow: o, at: Date.now() }), hs()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0; if (typeof i?.canvas?.graph?.configure == "function") { i.canvas.graph.configure(o); try { i.canvas.setDirty?.(!0, !0); } catch (e) { console.debug?.(e); } return !0; } if (typeof i?.graph?.configure == "function") return i.graph.configure(o), !0; } catch (e) { console.debug?.(e); } return !1; }; function _s(e) { return (t) => { let n = t?.dataTransfer; if (!n) return; let r = (t?.target)?.closest?.(".mjr-asset-card"); if (!r) return; let i = r._mjrAsset; if (!i || typeof i != "object") return; let a = String(i?.kind || "").toLowerCase(), o = Ko(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = { filename: i.filename, subfolder: o?.subfolder ?? i.subfolder ?? "", type: s, root_id: Ne(i) || void 0, kind: a, filepath: String(i.filepath || i.path || i?.file_info?.filepath || "").trim() || void 0 }; try { let t = Uo(); Jo(n, ln, JSON.stringify(c)); let o = Zo(e, c); o.length > 1 && Jo(n, hn, JSON.stringify({ items: o })), Jo(n, "text/plain", String(i.filename || "")); let s = a === "workflow" ? "" : zo(c); Yo({ dt: n, asset: i, payload: c, viewUrl: s }), Io({ dt: n, asset: i, containerEl: e, card: r, viewUrl: s, stripMetadata: t }); } catch (e) { console.debug?.(e); } try { r.addEventListener("dragend", (t) => { Lo(t, { asset: i, containerEl: e, card: r }); }, { once: !0 }); } catch (e) { console.debug?.(e); } let l = r.querySelector("img") || r.querySelector("video") || r.querySelector("canvas"); if (l && l instanceof HTMLElement) try { n.setDragImage(l, 10, 10); } catch (e) { console.debug?.(e); } }; } var vs = (e) => { if (!e) return () => {}; let t = To(e); if (typeof t == "function") return t; let n = _s(e); return e.addEventListener("dragstart", n, !0), Eo(e, () => { try { e.removeEventListener("dragstart", n, !0); } catch (e) { console.debug?.(e); } Do(e); }); }, ys = null, bs = 0; function xs() { let e = (e) => { if (Ho(e?.target)) return; let t = String(e?.key || "").toLowerCase(); t === "s" ? Bo = !0 : t === "l" && (Vo = !0); }, t = (e) => { let t = String(e?.key || "").toLowerCase(); t === "s" ? Bo = !1 : t === "l" && (Vo = !1); }, n = () => { Bo = !1, Vo = !1; }, r = /* @__PURE__ */ new Set([ "mp3", "wav", "ogg", "flac", "m4a", "aac", "opus" ]), i = /* @__PURE__ */ new Set([ "mp4", "webm", "mkv", "avi", "mov", "m4v", "flv", "wmv" ]), a = (e, t) => String(e?.kind || "").toLowerCase() === "video" || i.has(String(t || "").toLowerCase()), o = (e, t, n, r) => { let i = () => { let i = Number(n?.duration) || 0; if (!Number.isFinite(i) || i <= 0) return; let a = Math.max(1, Math.ceil(i * r)); t.videoDurationFrames = a, t.length = a; try { e.retakeMode || e.growTimelineIfNeeded?.(t.start + t.length), e.commitChanges?.(!0), e.render?.(); } catch (e) { console.debug?.(e); } }, a = () => { try { let r = Math.max(1, Number(n?.videoWidth) || 512), i = Math.max(1, Number(n?.videoHeight) || 512), a = document.createElement("canvas"); a.width = Math.min(r, 512), a.height = Math.max(1, Math.round(i / r * a.width)); let o = a.getContext("2d"); if (!o) return; o.drawImage(n, 0, 0, a.width, a.height); let s = a.toDataURL("image/jpeg"); if (!s) return; t.imageB64 = s; let c = new Image(); c.onload = () => { t.imgObj = c; try { e.render?.(); } catch (e) { console.debug?.(e); } }, c.src = s; } catch (e) { console.debug?.(e); } }; n.addEventListener?.("loadedmetadata", i, { once: !0 }), n.addEventListener?.("loadeddata", () => { i(); try { let e = Number(n?.duration) || 0; e > 0 && Number(n.currentTime || 0) < .001 && (n.currentTime = Math.min(e - .001, .01)); } catch (e) { console.debug?.(e); } a(); try { e._ensureThumbnails?.(t); } catch (e) { console.debug?.(e); } }, { once: !0 }), n.addEventListener?.("seeked", a, { once: !0 }); }, s = async (e, t, n) => { let i = null; if (e._ghostSegmentId && e._previewSegments) { let t = e._previewSegments.find((t) => t.id === e._ghostSegmentId); t && (i = t.resolvedStart === void 0 ? t.start : t.resolvedStart); } e._ghostSegmentId = null, e._ghostTrack = null, e._ghostInitialTimeline = null, e._previewSegments = null, e.render?.(); let s = String(n || "").toLowerCase(), c = r.has(s), l = await $t({ post: le, endpoint: lt.STAGE_TO_INPUT, payload: t, index: !1 }); if (!l?.name) { k(`Failed to stage: "${t?.filename}"`, "error"); return; } let { name: u, subfolder: d = "" } = l, f = d ? `${d}/${u}` : u, p = `/view?filename=${encodeURIComponent(u)}&type=input&subfolder=${encodeURIComponent(d)}`; if (c) { try { let t = await fetch(p); if (!t.ok) throw Error(`HTTP ${t.status}`); let n = await t.arrayBuffer(), r = await new (window.AudioContext || window.webkitAudioContext)().decodeAudioData(n), a = typeof e.getFrameRate == "function" ? e.getFrameRate() : 25, o = Math.max(1, Math.ceil(r.duration * a)), s = r.getChannelData(0), c = Math.max(1, Math.floor(s.length / 200)), l = []; for (let e = 0; e < 200; e++) { let t = 0; for (let n = 0; n < c; n++) { let r = Math.abs(s[e * c + n] || 0); r > t && (t = r); } l.push(t); } let d = i ?? 0; if (i === null) { let t = Array.isArray(e.timeline?.audioSegments) ? [...e.timeline.audioSegments] : []; t.sort((e, t) => e.start - t.start); for (let e of t) { if (d + o <= e.start) break; d = Math.max(d, e.start + e.length); } } let m = Date.now().toString(36) + Math.random().toString(36).slice(2, 7), h = { id: m, type: "audio", start: d, length: o, trimStart: 0, audioDurationFrames: o, audioFile: f, fileName: u, waveformPeaks: l }; if (!e.timeline?.audioSegments) { vo("ltxdirector inject: no audioSegments", {}); return; } e.timeline.audioSegments.push(h), e.timeline.audioSegments.sort((e, t) => e.start - t.start), e.selectionType = "audio", e.selectedIndex = e.timeline.audioSegments.findIndex((e) => e.id === m), e.updateUIFromSelection?.(), e.commitChanges?.(!0), e.render?.(), k(`Added audio to LTX Director: ${u}`, "success", 3e3), vo("drop ltxdirector inject audio", { file: u, start: d }); } catch (e) { console.error("[Majoor] LTX Director audio inject failed", e), k(`Audio decode failed for: ${u}`, "error"); } return; } let m = typeof e.getFrameRate == "function" ? e.getFrameRate() : 25, h = a(t, s), g = m, _ = i ?? 0; if (i === null) { let t = Array.isArray(e.timeline?.segments) ? [...e.timeline.segments] : []; t.sort((e, t) => e.start - t.start); for (let e of t) { if (_ + g <= e.start) break; _ = Math.max(_, e.start + e.length); } } let v = Date.now().toString(36) + Math.random().toString(36).slice(2, 7), y; if (h) { let t = document.createElement("video"); t.crossOrigin = "Anonymous", t.preload = "auto", t.muted = !0, t.playsInline = !0, t.src = p, y = { id: `${v}_v`, start: _, length: g, trimStart: 0, prompt: "", type: "video", videoDurationFrames: g, imageFile: f, fileName: u, videoEl: t }, o(e, y, t, m); } else y = { id: v, start: _, length: g, prompt: "", type: "image", imageFile: f, imageB64: p }; if (!e.timeline?.segments) { vo("ltxdirector inject: no timeline", {}); return; } if (e.timeline.segments.push(y), e.timeline.segments.sort((e, t) => e.start - t.start), h) try { e.retakeMode || e.growTimelineIfNeeded?.(y.start + y.length), e._ensureThumbnails?.(y); } catch (e) { console.debug?.(e); } else { let t = new Image(); t.onload = () => { y.imgObj = t, e.render?.(); }, t.src = p; } let b = e.timeline.segments.findIndex((e) => e.id === v), x = h ? e.timeline.segments.findIndex((e) => e.id === y.id) : b; x >= 0 && (e.selectionType = "image", e.selectedIndex = x, e.updateUIFromSelection?.()), e.commitChanges?.(!0), e.render?.(), k(`Added ${h ? "video" : "image"} to LTX Director: ${u}`, "success", 3e3), vo("drop ltxdirector inject", { file: u, start: _, ext: s, isVideo: h }); }; return { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: (e) => { let t = Ro(); if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; let n = So(e, ln); if (!nn(n)) return; let r = un(t, e.clientX, e.clientY), i = r ? jn(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? dn(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor; if (r && (i || o || s)) { e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), Mn(t, r, fn), e.dataTransfer.dropEffect = "copy", i ? vo("dragover slot", { node: r?.title, slot: i.input?.name }) : s ? vo("dragover ltxdirector", { node: r?.title }) : vo("dragover widget", { node: r?.title, widget: o?.name }); return; } Zt(t, fn), en(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy"); }, onDrop: async (e) => { let t = Ro(); if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; try { if ((e?.target)?.closest?.(".mjr-folder-card")) return; } catch {} let n = So(e, ln); if (!nn(n) || !en(t, e)) return; Oo(); let r = Wo(), i = r ? Qo(e, n) : [n], a = un(t, e.clientX, e.clientY), o = a ? jn(t, a, e.clientX, e.clientY) : null, c = String(n?.filename || "").split(".").pop() || "", l = a && !o ? dn(a, n, c) : null; if (a && o) { e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), Zt(t, fn); let r = await gn({ post: le, endpoint: lt.STAGE_TO_INPUT, payload: n, index: !1 }); if (!r) return; if (_n({ app: t, payload: n, relativePath: r, targetNode: a, inputSlotIndex: o.index, event: e })) { vo("drop slot created and connected loader", { node: a?.title, slot: o.input?.name, value: r }); return; } k(`Staged to input: ${r}`, "success", 4e3); return; } if (a && !o && !l && a._timelineEditor && !r) { e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), Zt(t, fn), await s(a._timelineEditor, n, c); return; } if (!a || !l) { if (Zt(t, fn), e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), r) { let r = await $o(i), a = Hn({ app: t, items: r, event: e }); if (a > 0) { vo("drop canvas created loaders", { count: a }); return; } k(`Failed to load file: "${n?.filename}". Staging failed.`, "error"); return; } if (String(n?.kind || "").toLowerCase() === "workflow") { if (await gs(n)) { vo("drop canvas loaded workflow", { file: n?.filename }); return; } k(`Failed to load workflow: "${n?.filename}".`, "error"); return; } let o = !a && !r, s = $t({ post: le, endpoint: lt.STAGE_TO_INPUT, payload: n, index: !1 }), l = o ? gs(n) : Promise.resolve(!1), [u, d] = await Promise.all([l, s]); if (u) { vo("drop canvas loaded workflow", { file: n?.filename }); return; } let f = d?.relativePath; if (!f) { vo("drop canvas stage failed"), k(`Failed to load file: "${n?.filename}". Staging failed.`, "error"); return; } if (vo("drop canvas staged", { value: f }), Hn({ app: t, items: [{ payload: n, relativePath: f, droppedExt: c }], event: e })) { vo("drop canvas created loader", { value: f }); return; } k(`Staged to input: ${f}`, "success", 4e3); return; } e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), Zt(t, fn); let u = await gn({ post: le, endpoint: lt.STAGE_TO_INPUT, payload: n, index: !1 }); u && (tn(l, u), fn(t), vo("drop inject", { node: a?.title, widget: l?.name, value: u })); }, onDragLeave: () => { let e = Ro(); Zt(e, fn), vo("dragleave"); } }; } function Ss() { if (typeof window > "u" || !window?.addEventListener) return { dispose() {} }; let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = xs(); return window.addEventListener("keydown", e, !0), window.addEventListener("keyup", t, !0), window.addEventListener("blur", n, !0), window.addEventListener("dragover", r, !0), window.addEventListener("drop", i, !0), window.addEventListener("dragleave", a, !0), { dispose: () => { try { window.removeEventListener("keydown", e, !0), window.removeEventListener("keyup", t, !0), window.removeEventListener("blur", n, !0), window.removeEventListener("dragover", r, !0), window.removeEventListener("drop", i, !0), window.removeEventListener("dragleave", a, !0); } catch (e) { console.debug?.(e); } Bo = !1, Vo = !1; try { Zt(Ro(), fn); } catch (e) { console.debug?.(e); } } }; } function Cs() { ys || (ys = Ss(), bs = 0), bs += 1; let e = !1; return ({ force: t = !1 } = {}) => { e || (e = !0, ws({ force: t })); }; } function ws({ force: e = !1 } = {}) { if (!ys) { bs = 0, Ao(); return; } if (!e && bs > 1) { --bs; return; } bs = 0; try { ys.dispose?.(); } catch (e) { console.debug?.(e); } ys = null, Ao(); } //#endregion //#region ui/features/grid/MediaBlobCache.ts var Ts = "__MJR_MEDIA_BLOB_CACHE__", Es = 384, Ds = 3e5, Os = 3e4, ks = 15e3, As = 6, js = 192, Ms = 3; function Ns() { let e = /* @__PURE__ */ new Map(), t = null, n = 0, r = []; function i() { try { let e = typeof navigator < "u" ? navigator : null, t = Number(e?.deviceMemory || 0) || 0; if (t > 0 && t <= 4 || e?.connection?.saveData === !0) return !0; } catch (e) { console.debug?.(e); } return !1; } function a() { return i() ? js : Es; } function o() { return i() ? Ms : As; } async function s(e) { n >= o() && await new Promise((e) => r.push(e)), n += 1; try { return await e(); } finally { n = Math.max(0, n - 1); let e = r.shift(); e && e(); } } function c() { t ||= setInterval(l, ks); } function l() { try { let t = Date.now(); for (let [n, r] of e) r.refcount <= 0 && t >= r.expiresAt && (u(r), e.delete(n)); } catch (e) { console.debug?.(e); } } function u(e) { try { e?.blobUrl?.startsWith("blob:") && URL.revokeObjectURL(e.blobUrl); } catch (e) { console.debug?.(e); } } function d() { let t = null, n = Infinity; for (let [r, i] of e) i.refcount > 0 || i.expiresAt < n && (n = i.expiresAt, t = r); t && (u(e.get(t)), e.delete(t)); } function f(e, t = Ds) { e.expiresAt = Date.now() + t; } function p() { for (; e.size > a();) { let t = e.size; if (d(), e.size === t) break; } } function m(e) { try { return String(e || "").trim(); } catch { return ""; } } function h(t) { try { let n = m(t); if (!n) return; let r = e.get(n); r ? (r.hasError = !0, f(r)) : (e.size >= a() && d(), e.set(n, { blobUrl: null, refcount: 0, expiresAt: Date.now() + Os, hasError: !0 }), p(), c()); } catch (e) { console.debug?.(e); } } function g(t) { try { let n = m(t); return n ? !!e.get(n)?.hasError : !1; } catch (e) { return console.debug?.(e), !1; } } async function _(t, n = {}) { try { let r = m(t); if (!r) return null; let i = n?.signal || null; if (i?.aborted) return null; let o = e.get(r); if (o?.hasError) return null; if (o?.blobUrl) return o.refcount += 1, f(o), o.blobUrl; let l = await s(() => i?.aborted ? Promise.resolve(null) : fetch(t, { credentials: "same-origin", ...i ? { signal: i } : {} })); if (!l) return null; if (!l.ok) return h(t), null; let u = await l.blob(), g = URL.createObjectURL(u); return e.size >= a() && d(), e.set(r, { blobUrl: g, refcount: 1, expiresAt: Date.now() + Ds, hasError: !1 }), p(), c(), g; } catch (e) { return String(e?.name || "") === "AbortError" ? null : (console.debug?.(e), h(t), null); } } function v(t) { try { let n = m(t); if (!n) return; let r = e.get(n); r && (r.refcount = Math.max(0, r.refcount - 1), r.refcount <= 0 && f(r, Os)), l(), p(); } catch (e) { console.debug?.(e); } } function y() { try { t &&= (clearInterval(t), null); for (let t of e.values()) u(t); e.clear(); } catch (e) { console.debug?.(e); } } try { window.addEventListener("beforeunload", y, { once: !0 }); } catch (e) { console.debug?.(e); } return { markError: h, hasError: g, acquireUrl: _, releaseUrl: v, dispose: y }; } function Ps() { try { if (window[Ts]) return window[Ts]; } catch (e) { console.debug?.(e); } try { window[Ts]?.dispose?.(); } catch (e) { console.debug?.(e); } let e = Ns(); try { window[Ts] = e; } catch (e) { console.debug?.(e); } return e; } var Fs = Ps(), Is = ["title"], Ls = { __name: "RatingBadge", props: { rating: { type: [Number, String], default: 0, validator: (e) => { let t = Number(e); return Number.isInteger(t) && t >= 0 && t <= 5; } } }, setup(e) { let t = e, n = G(() => Math.max(0, Math.min(5, Number(t.rating) || 0))), r = G(() => n.value > 0), i = G(() => R("rating.title", "Rating: {n} star{n, plural, one {} other {s}}", { n: n.value })); return (e, t) => r.value ? (V(), Y("div", { key: 0, class: "mjr-rating-badge", title: i.value }, [(V(!0), Y(H, null, ar(n.value, (e) => (V(), Y("span", { key: e, style: Cr({ color: "var(--mjr-rating-color, var(--mjr-star-active, #FFD45A))", marginRight: e < n.value ? "2px" : "0" }) }, " ★ ", 4))), 128))], 8, Is)) : W("", !0); } }, Rs = ["title"], zs = { __name: "TagsBadge", props: { tags: { type: [Array, String], default: () => [] } }, setup(e) { let t = e, n = G(() => { if (Array.isArray(t.tags)) return t.tags.map((e) => String(e ?? "").trim()).filter(Boolean).slice(0, 10); if (typeof t.tags == "string") { let e = t.tags.trim(); if (!e) return []; try { let t = JSON.parse(e); if (Array.isArray(t)) return t.map((e) => String(e ?? "").trim()).filter(Boolean).slice(0, 10); } catch { return e.split(",").map((e) => e.trim()).filter(Boolean).slice(0, 10); } } return []; }), r = G(() => n.value.length > 0), i = G(() => R("tags.title", "Tags: {tags}", { tags: n.value.join(", ") })), a = G(() => { let e = n.value; return e.length <= 5 ? e.join(", ") : e.slice(0, 5).join(", ") + ` +${e.length - 5}`; }); return (e, t) => r.value ? (V(), Y("div", { key: 0, class: "mjr-tags-badge", title: i.value, style: { color: "var(--mjr-tag-color, #90CAF9)" } }, q(a.value), 9, Rs)) : W("", !0); } }, Bs = ["title"], Vs = { __name: "GenTimeBadge", props: { genTimeMs: { type: [Number, String], default: 0 } }, setup(e) { let t = e, n = G(() => St(t.genTimeMs)), r = G(() => n.value > 0), i = G(() => kt(n.value)), a = G(() => jt(n.value)); return (e, t) => r.value ? (V(), Y("div", { key: 0, class: "mjr-gentime-badge", title: i.value.title, style: Cr({ color: a.value }) }, q(i.value.text), 13, Bs)) : W("", !0); } }, Hs = { key: 0, class: "mjr-live-placeholder-wash", "aria-hidden": "true" }, Us = ["title", "aria-label"], Ws = ["alt", "src"], Gs = { class: "mjr-workflow-thumb-title" }, Ks = { class: "mjr-workflow-thumb-meta" }, qs = { key: 0 }, Js = { key: 1 }, Ys = { key: 2 }, Xs = { key: 3, class: "mjr-workflow-missing-chip" }, Zs = ["alt", "src"], Qs = { key: 1, class: "mjr-media-error-placeholder" }, $s = ["data-src", "poster"], ec = ["src"], tc = { class: "mjr-audio-thumb-head" }, nc = { class: "mjr-audio-thumb-kind" }, rc = { class: "mjr-audio-thumb-waveform", "aria-hidden": "true" }, ic = { class: "mjr-audio-thumb-meta" }, ac = { class: "mjr-audio-thumb-title" }, oc = { class: "mjr-audio-thumb-subtitle" }, sc = ["src", "alt"], cc = { key: 1, class: "mjr-model3d-thumb-icon", style: { position: "absolute", inset: "0", display: "flex", "align-items": "center", "justify-content": "center", color: "rgba(255,255,255,0.7)" } }, lc = [ "data-mjr-ext", "data-mjr-badge-bg", "title" ], uc = ["title"], dc = { key: 7, class: "mjr-card-hover-info" }, fc = { key: 0, class: "mjr-hover-prompt" }, pc = { key: 1, class: "mjr-hover-prompt mjr-hover-workflow-notes" }, mc = { key: 2, class: "mjr-hover-gentime" }, hc = ["data-mjr-kind"], gc = ["title"], _c = { class: "mjr-card-meta-row", style: { "font-size": "0.85em", opacity: "0.7", "line-height": "1.4", "white-space": "nowrap", overflow: "hidden", "text-overflow": "ellipsis", "padding-right": "16px" } }, vc = ["title"], yc = ["title"], bc = ["title"], xc = { key: 0, class: "mjr-meta-separator", "aria-hidden": "true", style: { opacity: "0.55", margin: "0 3px" } }, Sc = ["title"], Cc = { class: "mjr-stack-group-button-count" }, wc = { class: "mjr-dup-stack-count" }, Tc = { __name: "AssetCardInner", props: { asset: { type: Object, required: !0 } }, emits: ["workflow-action"], setup(e, { emit: t }) { function n(e) { let t = 2166136261, n = String(e || ""); for (let e = 0; e < n.length; e += 1) t ^= n.charCodeAt(e), t = Math.imul(t, 16777619); return t >>> 0; } function r(e, t = 34) { let r = n(e) || 1, i = []; for (let e = 0; e < t; e += 1) { r = Math.imul(r ^ r >>> 15, 2246822519) >>> 0; let n = Math.sin(e / Math.max(1, t - 1) * Math.PI), a = r % 1e3 / 1e3, o = Math.round(18 + n * 54 + a * 26); i.push({ height: Math.max(14, Math.min(92, o)), opacity: (.48 + a * .42).toFixed(2) }); } return i; } async function i(e, t = {}) { if (!e) return null; try { return Fs.hasError(e) ? null : await Fs.acquireUrl(e, t) || null; } catch { return null; } } function a() { return new Promise((e) => setTimeout(e, 120)); } async function o(e) { if (e) try { let t = String(e.dataset?.src || "").trim(); if (!t || e.getAttribute("src")) return; let n = (Number(e._mjrVideoLoadRequestId || 0) || 0) + 1; if (e._mjrVideoLoadRequestId = n, Fs.hasError(t)) { e.src = t, e._mjrSourceKey = t; return; } let r = await Fs.acquireUrl(t); if (e._mjrVideoLoadRequestId !== n || !e.isConnected) { r && Fs.releaseUrl(t); return; } r ? (e.src = r, e._mjrCachedSrc = t, e._mjrSourceKey = t) : (e.src = t, e._mjrSourceKey = t), e.load?.(); } catch (t) { console.debug?.(t); try { let t = String(e.dataset?.src || "").trim(); t && !e.getAttribute("src") && (e.src = t, e._mjrSourceKey = t, e.load?.()); } catch {} } } function s(e) { if (e) { try { e._mjrVideoLoadRequestId = (Number(e._mjrVideoLoadRequestId || 0) || 0) + 1, e.pause?.(); } catch (e) { console.debug?.(e); } try { let t = String(e._mjrCachedSrc || "").trim(); t && Fs.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = ""; } catch (e) { console.debug?.(e); } try { e.getAttribute("src") && (e.removeAttribute("src"), e.load?.()); } catch (e) { console.debug?.(e); } } } function c(e, t) { if (!e || !t) return; let n = async () => { try { if (await o(t), !t.isConnected) return; t.play?.().catch?.(() => {}); } catch (e) { console.debug?.(e); } }, r = () => { try { t.pause?.(), t.currentTime = 0; } catch (e) { console.debug?.(e); } }; e.addEventListener("mouseenter", n), e.addEventListener("mouseleave", r), t._mjrHoverCleanup = () => { try { e.removeEventListener("mouseenter", n), e.removeEventListener("mouseleave", r); } catch (e) { console.debug?.(e); } }; } function l(e) { if (!e) return; let t = new IntersectionObserver((t) => { for (let n of t) try { n.isIntersecting && Number(n.intersectionRatio || 0) >= .25 ? o(e).then(() => { try { e.isConnected && e.play?.().catch?.(() => {}); } catch (e) { console.debug?.(e); } }) : (e.pause?.(), e.currentTime = 0); } catch (e) { console.debug?.(e); } }, { threshold: .25 }); t.observe(e), e._mjrAutoplayCleanup = () => { try { t.unobserve(e), t.disconnect(); } catch (e) { console.debug?.(e); } }; } function u(e) { if (e) try { e._mjrHoverCleanup?.(), e._mjrHoverCleanup = null, e._mjrAutoplayCleanup?.(), e._mjrAutoplayCleanup = null, e.pause?.(), e.currentTime = 0; } catch (e) { console.debug?.(e); } } function d(e, t, n) { t && (u(t), n === "hover" ? (o(t), c(e, t)) : n === "always" ? l(t) : o(t)); } function f(e) { e && (u(e), s(e)); } let p = e, m = t, h = G(() => String(p.asset.kind || "image").toLowerCase()), g = G(() => h.value === "workflow"), _ = G(() => h.value === "image"), v = G(() => h.value === "video"), y = G(() => h.value === "audio"), b = G(() => h.value === "model3d"), x = G(() => ot(p.asset) || ""), S = G(() => String(p.asset.thumbnail_url || p.asset.graph_map_thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), C = G(() => !!String(p.asset.thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), w = G(() => g.value && !C.value && !!String(p.asset.graph_map_thumbnail_url || "").trim()), T = G(() => String(p.asset.preview_url || p.asset.previewUrl || p.asset.url || "").trim()), E = G(() => x.value), D = G(() => T.value || x.value), O = G(() => !v.value && !g.value ? "" : Ze(p.asset, 384)), k = G(() => S.value || O.value), A = G(() => String(p.asset.filename || "")), j = G(() => String(p.asset.display_name || p.asset.displayName || p.asset.name || A.value || "").trim()), M = G(() => { let e = A.value; return e.includes(".") ? e.split(".").pop().toUpperCase() : ""; }), N = G(() => { let e = j.value || A.value; return e.includes(".") ? e.slice(0, e.lastIndexOf(".")) : e; }), P = G(() => String(p.asset.notes || "").trim()), F = G(() => r(`${p.asset.id || ""}:${A.value}:${p.asset.duration || ""}`)), ee = G(() => N.value || A.value || "Audio"), te = G(() => [pe.value, M.value].filter(Boolean).join(" / ") || "Audio"), I = G(() => { let e = [A.value || j.value], t = String(p.asset.subfolder || p.asset.file_info?.subfolder || "").trim(), n = String(p.asset.type || p.asset.source || p.asset.file_info?.type || "").trim(); return t && e.push(`Subfolder: ${t}`), n && e.push(`Type: ${n}`), P.value && e.push(`Notes: ${P.value}`), e.filter(Boolean).join("\n"); }), ne = G(() => Number(p.asset.rating) || 0), re = G(() => p.asset.tags || []), ie = G(() => { let e = p.asset.generation_time_ms ?? p.asset.metadata?.generation_time_ms ?? 0; return St(e); }), ae = G(() => ie.value > 0), oe = G(() => kt(ie.value)), se = G(() => jt(ie.value)), ce = G(() => String(p.asset.positive_prompt || "").trim()), le = G(() => p.asset?._mjrLivePlaceholder === !0 || p.asset?.is_live_placeholder === !0 || String(p.asset?.id || "").trim().toLowerCase().startsWith("live:")), ue = G(() => String(p.asset?._mjrLiveLabel || "In progress").trim() || "In progress"), de = G(() => `${ue.value}: waiting for indexed asset data`), fe = G(() => { let { width: e, height: t } = p.asset; return e && t ? `${e}x${t}` : ""; }), pe = G(() => p.asset.duration ? Tn(p.asset.duration) : ""), me = G(() => String(p.asset.task || p.asset.workflow_task || "").trim()), he = G(() => String(p.asset.model_family || p.asset.modelFamily || "").trim()), ge = G(() => String(p.asset.runs_on || p.asset.runsOn || "").trim()), _e = G(() => Number(p.asset.node_count || p.asset.nodeCount || 0) || 0), ve = G(() => !!p.asset.favorite), ye = G(() => Number(p.asset.subgraph_count || p.asset.subgraphCount || 0) || 0), be = G(() => Number(p.asset.missing_nodes_count || p.asset.missingNodesCount || 0) || 0), xe = G(() => Number(p.asset.missing_models_count || p.asset.missingModelsCount || 0) || 0), Se = G(() => be.value > 0 || xe.value > 0), Ce = G(() => { if (!Se.value) return ""; let e = []; return be.value > 0 && e.push(`${be.value} node`), xe.value > 0 && e.push(`${xe.value} model`), `Missing: ${e.join(" / ")}`; }), we = G(() => p.asset.generation_time || p.asset.file_creation_time || p.asset.mtime || p.asset.created_at), Te = G(() => we.value ? zn(we.value) : ""), Ee = G(() => we.value ? Nn(we.value) : ""), De = G(() => [ fe.value ? { key: "resolution", className: "mjr-meta-res", title: `Resolution: ${fe.value}`, text: fe.value } : null, pe.value ? { key: "duration", className: "mjr-meta-duration", title: `Duration: ${pe.value}`, text: pe.value } : null, Te.value ? { key: "date", className: "mjr-meta-date", title: `Date: ${Te.value}`, text: Te.value } : null, Ee.value ? { key: "time", className: "mjr-meta-date mjr-meta-time-val", title: `Time: ${Ee.value}`, text: Ee.value } : null, ae.value ? { key: "gentime", className: "mjr-meta-gentime", title: oe.value.title, text: oe.value.text, style: { color: se.value, fontWeight: "500" } } : null ].filter(Boolean)), Oe = G(() => !!p.asset._mjrNameCollision && !p.asset._mjrDupStack), ke = G(() => Oe.value ? "var(--mjr-badge-duplicate-alert, #ff1744)" : { image: "var(--mjr-badge-image, #2196F3)", video: "var(--mjr-badge-video, #F44336)", audio: "var(--mjr-badge-audio, #4CAF50)", model3d: "var(--mjr-badge-model3d, #9C27B0)" }[h.value] || "var(--mjr-badge-image, #888)"), Ae = rr("mjrStackService", null), je = G(() => !Ae || !String(p.asset.stack_id || "").trim() ? !1 : Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) > 1), Me = G(() => Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) || 0), Ne = G(() => !!p.asset._mjrDupStack && Number(p.asset._mjrDupCount || 0) >= 2), Pe = G(() => Number(p.asset._mjrDupCount || 0) || 0), Fe = G(() => Ne.value && !je.value), Ie = Z(!1), Le = Z(!1); async function Re(e) { if (e.preventDefault(), e.stopPropagation(), !Ie.value) { Ie.value = !0; try { await Ae?.openStackGroup?.(p.asset); } catch (e) { console.debug?.(e); } finally { Ie.value = !1; } } } function ze(e) { if (e.preventDefault(), e.stopPropagation(), !Le.value) { Le.value = !0; try { Ae?.openDupGroup?.(p.asset); } catch (e) { console.debug?.(e); } finally { Le.value = !1; } } } let Be = Z(null), Ve = Z(null), He = Z(null), Ue = Z(null), We = Z(!1), Ge = Z(!1), Ke = Z(""), qe = 0, Je = "", Ye = "", Xe = ""; function Qe() { try { Je && Fs.releaseUrl(Je); } catch (e) { console.debug?.(e); } Je = ""; } ir(() => g.value ? S.value : _.value ? E.value : "", (e) => { let t = String(e || "").trim(); !t || t === Ye || (We.value = !1, Ye = ""); }, { immediate: !0 }), ir(() => b.value ? k.value : "", (e) => { let t = String(e || "").trim(); !t || t === Xe || (Ge.value = !1, Xe = ""); }, { immediate: !0 }), ir(() => [_.value ? He.value : null, _.value ? E.value : ""], async ([e, t], n, r) => { if (!e || !t || We.value) return; let o = qe += 1, s = new AbortController(), c = !1; r(() => { c = !0, s.abort(); }); try { let n = Je || String(e.dataset?.mjrSourceKey || ""); if (Ke.value && n === t || (e.dataset.mjrSourceKey = t, await a(), c || o !== qe || !e.isConnected)) return; let r = await i(t, { signal: s.signal }); if (c || o !== qe || !e.isConnected) { r && r !== t && Fs.releaseUrl(t); return; } if (r && r !== Ke.value) { let e = Je; Ke.value = r, Je = r === t ? "" : t, e && e !== Je && Fs.releaseUrl(e); } else !r && Je && Je !== t && (Qe(), Ke.value = ""); } catch {} }, { immediate: !0 }); let $e = Z(z.GRID_VIDEO_AUTOPLAY_MODE || "hover"); function et() { $e.value = z.GRID_VIDEO_AUTOPLAY_MODE || "hover"; } fr(() => { window.addEventListener("mjr-settings-changed", et); }), ir(Ve, (e, t) => { if (t) try { f(t); } catch {} if (e && Be.value) try { d(Be.value, e, $e.value); } catch {} }), ir($e, (e) => { let t = Ve.value, n = Be.value; t && n && d(n, t, e); }), ir(D, (e, t) => { if (e === t) return; let n = Ve.value, r = Be.value; !n || !r || (f(n), d(r, n, $e.value)); }, { flush: "post" }), lr(() => { window.removeEventListener("mjr-settings-changed", et), qe += 1, Qe(); let e = Ve.value; if (e) try { f(e); } catch {} }), Or(() => { window.removeEventListener("mjr-settings-changed", et); }), cr(() => { let e = Ue.value; if (!e) return; let t = p.asset; t?.has_workflow ?? t?.hasWorkflow, t?.has_generation_data ?? t?.hasGenerationData, t?.has_ai_info ?? t?.hasAiInfo ?? t?.ai_indexed, t?.has_ai_auto_tags ?? t?.hasAiAutoTags ?? t?.auto_tags ?? t?.autoTags, t?.has_ai_enhanced_caption ?? t?.hasAiEnhancedCaption ?? t?.enhanced_caption ?? t?.enhancedCaption, t?.has_ai_vector ?? t?.hasAiVector ?? t?.vector_indexed ?? t?.vectorIndexed; try { e.textContent = ""; let n = Ot(t); n && e.appendChild(n); } catch {} }); function tt(e) { We.value = !0; try { let e = g.value ? S.value : E.value; Ye = String(e || "").trim(), Fs.markError(e); } catch {} } function L() { Ge.value = !0, Xe = String(k.value || "").trim(); } function R(e) { if (!Oe.value) return; e.preventDefault(), e.stopPropagation(); let t = e.target?.closest?.(".mjr-asset-card"); t && t.dispatchEvent(new CustomEvent("mjr:badge-duplicates-focus", { bubbles: !0, detail: { filename: A.value, filenameKey: A.value.toLowerCase(), count: Number(p.asset._mjrNameCollisionCount || 0), paths: Array.isArray(p.asset._mjrNameCollisionPaths) ? p.asset._mjrNameCollisionPaths : [] } })); } function nt(e, t) { try { t?.preventDefault?.(), t?.stopPropagation?.(); } catch (e) { console.debug?.(e); } m("workflow-action", { type: String(e || "").trim().toLowerCase(), event: t, asset: p.asset }); } return (t, n) => { let r = gr("MButton"); return V(), Y(H, null, [ U("div", { class: X(["mjr-thumb", { "mjr-thumb-workflow": g.value }]), ref_key: "thumbRef", ref: Be }, [ le.value ? (V(), Y("div", Hs)) : W("", !0), g.value ? (V(), Y(H, { key: 1 }, [ U("div", { class: "mjr-workflow-card-actions", onClick: n[1] ||= pr(() => {}, ["stop"]), onDblclick: n[2] ||= pr(() => {}, ["stop"]) }, [U("button", { type: "button", class: X(["mjr-workflow-action-btn", { "is-active": ve.value }]), title: ve.value ? "Remove favorite" : "Add favorite", "aria-label": ve.value ? "Remove favorite" : "Add favorite", onClick: n[0] ||= (e) => nt("favorite", e) }, [U("i", { class: X(ve.value ? "pi pi-star-fill" : "pi pi-star") }, null, 2)], 10, Us)], 32), k.value && !We.value ? (V(), Y("img", { key: 0, class: X(["mjr-thumb-media", { "mjr-workflow-graph-map-preview": w.value }]), alt: A.value, decoding: "async", loading: "lazy", src: k.value, onError: tt }, null, 42, Ws)) : W("", !0), U("div", { class: X(["mjr-workflow-thumb", { "has-thumbnail": k.value && !We.value, "has-graph-map": w.value && !We.value }]) }, [ n[15] ||= U("i", { class: "pi pi-sitemap" }, null, -1), U("div", Gs, q(me.value || "Workflow"), 1), U("div", Ks, [ he.value ? (V(), Y("span", qs, q(he.value), 1)) : W("", !0), ge.value ? (V(), Y("span", Js, q(ge.value), 1)) : W("", !0), _e.value ? (V(), Y("span", Ys, q(_e.value) + " nodes", 1)) : W("", !0), Se.value ? (V(), Y("span", Xs, q(Ce.value), 1)) : W("", !0) ]) ], 2) ], 64)) : _.value ? (V(), Y(H, { key: 2 }, [We.value ? W("", !0) : (V(), Y("img", { key: 0, ref_key: "imgRef", ref: He, class: "mjr-thumb-media", alt: A.value, decoding: "async", loading: "lazy", src: Ke.value || E.value || void 0, onError: tt }, null, 40, Zs)), We.value ? (V(), Y("div", Qs, [...n[16] ||= [U("i", { class: "pi pi-image" }, null, -1)]])) : W("", !0)], 64)) : v.value ? (V(), Y(H, { key: 3 }, [U("video", { ref_key: "videoRef", ref: Ve, class: "mjr-thumb-media", "data-src": D.value, poster: k.value || void 0, muted: "", loop: "", autoplay: !1, playsinline: "", preload: "none", draggable: !1, tabindex: -1, style: { "pointer-events": "none" } }, null, 8, $s), n[17] ||= U("div", { class: "mjr-thumb-play" }, [U("i", { class: "pi pi-play" })], -1)], 64)) : y.value ? (V(), Y(H, { key: 4 }, [k.value ? (V(), Y("img", { key: 0, class: "mjr-thumb-media", src: k.value, draggable: !1, alt: "" }, null, 8, ec)) : W("", !0), U("div", { class: X(["mjr-audio-thumb", { "has-poster": k.value }]) }, [ U("div", tc, [n[18] ||= U("span", { class: "mjr-audio-thumb-icon" }, [U("i", { class: "pi pi-volume-up" })], -1), U("span", nc, q(M.value || "AUDIO"), 1)]), U("div", rc, [(V(!0), Y(H, null, ar(F.value, (e, t) => (V(), Y("span", { key: t, style: Cr({ height: `${e.height}%`, opacity: e.opacity }) }, null, 4))), 128))]), U("div", ic, [U("span", ac, q(ee.value), 1), U("span", oc, q(te.value), 1)]) ], 2)], 64)) : b.value ? (V(), Y(H, { key: 5 }, [k.value && !Ge.value ? (V(), Y("img", { key: 0, class: "mjr-thumb-media", src: k.value, draggable: !1, alt: A.value, onError: L }, null, 40, sc)) : (V(), Y("div", cc, [...n[19] ||= [U("i", { class: "pi pi-box", style: { "font-size": "2.5rem" } }, null, -1)]]))], 64)) : W("", !0), U("div", { class: "mjr-file-badge mjr-badge-ext", "data-mjr-ext": M.value, "data-mjr-badge-bg": ke.value, style: Cr({ position: "absolute", top: "6px", left: "6px", zIndex: 10, background: ke.value, color: "#fff", padding: "2px 5px", borderRadius: "4px", fontSize: "10px", fontWeight: "700", pointerEvents: Oe.value ? "auto" : "none", cursor: Oe.value ? "pointer" : "default" }), title: Oe.value ? `${M.value} - duplicate filename (${e.asset._mjrNameCollisionCount || 2} files)` : `${M.value} file`, onClick: R }, q(M.value) + q(Oe.value ? "+" : ""), 13, lc), J(Ls, { rating: ne.value, class: "mjr-badge-rating" }, null, 8, ["rating"]), J(zs, { tags: re.value, class: "mjr-badge-tags" }, null, 8, ["tags"]), J(Vs, { "gen-time-ms": ie.value }, null, 8, ["gen-time-ms"]), le.value ? (V(), Y("div", { key: 6, class: "mjr-live-pill", title: de.value }, [n[20] ||= U("span", { class: "mjr-live-pill-dot", "aria-hidden": "true" }, null, -1), U("span", null, q(ue.value), 1)], 8, uc)) : W("", !0), ce.value || g.value && P.value || ae.value ? (V(), Y("div", dc, [ ce.value ? (V(), Y("div", fc, q(ce.value), 1)) : W("", !0), g.value && P.value ? (V(), Y("div", pc, q(P.value), 1)) : W("", !0), ae.value ? (V(), Y("div", mc, "Time " + q(oe.value.text), 1)) : W("", !0) ])) : W("", !0) ], 2), U("div", { class: "mjr-card-info mjr-card-meta", "data-mjr-kind": g.value ? "workflow" : void 0, style: { position: "relative", padding: "6px 8px", "min-width": "0" } }, [ U("div", { class: "mjr-card-filename", title: I.value, style: { overflow: "hidden", "text-overflow": "ellipsis", "white-space": "nowrap", "margin-bottom": "4px", "padding-right": "12px" } }, q(N.value), 9, gc), U("div", _c, [g.value ? (V(), Y(H, { key: 0 }, [ me.value ? (V(), Y("span", { key: 0, class: "mjr-meta-workflow-task", title: `Task: ${me.value}` }, q(me.value), 9, vc)) : W("", !0), ye.value ? (V(), Y("span", { key: 1, class: "mjr-meta-workflow-subgraphs", title: `${ye.value} subgraph${ye.value > 1 ? "s" : ""}` }, q(ye.value) + " sub", 9, yc)) : W("", !0), Se.value ? (V(), Y("span", { key: 2, class: "mjr-meta-workflow-missing", title: Ce.value }, q(Ce.value), 9, bc)) : W("", !0) ], 64)) : W("", !0), (V(!0), Y(H, null, ar(De.value, (e, t) => (V(), Y(H, { key: e.key }, [t > 0 ? (V(), Y("span", xc, "/")) : W("", !0), U("span", { class: X(e.className), style: Cr(e.style || null), title: e.title }, q(e.text), 15, Sc)], 64))), 128))]), U("div", { ref_key: "dotWrapperRef", ref: Ue, class: "mjr-card-dot-wrapper", style: { position: "absolute", right: "8px", bottom: "6px", "z-index": "2" } }, null, 512) ], 8, hc), je.value ? (V(), nr(r, { key: 0, type: "button", class: "mjr-stack-group-button", severity: "secondary", text: "", rounded: "", disabled: Ie.value, "aria-busy": Ie.value ? "true" : "false", "aria-label": `Open generation group in grid (${Me.value} assets)`, title: `Open generation group in grid (${Me.value} assets)`, onClick: Re, onPointerdown: n[3] ||= pr(() => {}, ["stop"]), onMousedown: n[4] ||= pr(() => {}, ["stop", "prevent"]), onTouchstartPassive: n[5] ||= pr(() => {}, ["stop"]), onDblclick: n[6] ||= pr(() => {}, ["stop"]), onKeydown: n[7] ||= pr(() => {}, ["stop"]), onDragstart: n[8] ||= pr(() => {}, ["stop", "prevent"]) }, { default: Q(() => [n[21] ||= U("span", { class: "pi pi-clone" }, null, -1), U("span", Cc, q(Me.value), 1)]), _: 1 }, 8, [ "disabled", "aria-busy", "aria-label", "title" ])) : W("", !0), Fe.value ? (V(), nr(r, { key: 1, type: "button", class: "mjr-dup-stack-button", severity: "secondary", text: "", rounded: "", disabled: Le.value, "aria-busy": Le.value ? "true" : "false", "aria-label": `${Pe.value} duplicate${Pe.value > 1 ? "s" : ""} - click to compare all copies`, title: `${Pe.value} duplicate${Pe.value > 1 ? "s" : ""} - click to compare all copies`, onClick: ze, onPointerdown: n[9] ||= pr(() => {}, ["stop"]), onMousedown: n[10] ||= pr(() => {}, ["stop", "prevent"]), onTouchstartPassive: n[11] ||= pr(() => {}, ["stop"]), onDblclick: n[12] ||= pr(() => {}, ["stop"]), onKeydown: n[13] ||= pr(() => {}, ["stop"]), onDragstart: n[14] ||= pr(() => {}, ["stop", "prevent"]) }, { default: Q(() => [n[22] ||= U("span", { class: "pi pi-copy" }, null, -1), U("span", wc, q(Pe.value), 1)]), _: 1 }, 8, [ "disabled", "aria-busy", "aria-label", "title" ])) : W("", !0) ], 64); }; } }, Ec = (e, t) => { let n = e.__vccOpts || e; for (let [e, r] of t) n[e] = r; return n; }, Dc = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-stem", "aria-label", "aria-selected" ], Oc = { class: "mjr-card-info mjr-card-meta", style: { padding: "6px 8px", "min-width": "0" } }, kc = ["title"], Ac = /*#__PURE__*/ Ec({ __name: "FolderCard", props: { asset: { type: Object, required: !0 }, selected: { type: Boolean, default: !1 } }, emits: ["drop-asset"], setup(e, { emit: t }) { let n = e, r = t, i = Z(!1); function a(e) { e.dataTransfer && (e.dataTransfer.dropEffect = "move"), i.value = !0; } function o() { i.value = !1; } function s(e) { if (i.value = !1, !e.dataTransfer || !Array.from(e.dataTransfer.types).includes("application/x-mjr-asset")) return; let t = null; try { let n = e.dataTransfer.getData("application/x-mjr-asset"); n && (t = JSON.parse(n)); } catch {} if (!t) return; let a = String(n.asset.filepath || "").trim(); a && r("drop-asset", { asset: t, folderPath: a }); } return (t, n) => (V(), Y("div", { class: X(["mjr-asset-card mjr-card mjr-folder-card", { "is-selected": e.selected, "drop-active": i.value }]), role: "button", tabindex: 0, draggable: "true", onDragover: pr(a, ["prevent"]), onDragleave: o, onDrop: pr(s, ["stop", "prevent"]), "data-mjr-asset-id": String(e.asset.id ?? ""), "data-mjr-filename-key": String(e.asset.filename || "").toLowerCase(), "data-mjr-ext": "FOLDER", "data-mjr-stem": String(e.asset.filename || "").toLowerCase(), "data-mjr-kind": "folder", "aria-label": `Folder ${e.asset.filename}`, "aria-selected": e.selected ? "true" : "false" }, [n[1] ||= U("div", { class: "mjr-thumb", style: { display: "flex", "align-items": "center", "justify-content": "center" } }, [U("svg", { width: "64", height: "64", viewBox: "0 0 24 24", "aria-hidden": "true" }, [U("path", { fill: "#F4C74A", d: "M10 4H4c-1.1 0-2 .9-2 2v1h20V8c0-1.1-.9-2-2-2h-8l-2-2z" }), U("path", { fill: "#D9A730", d: "M20 6H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2z" })])], -1), U("div", Oc, [U("div", { class: "mjr-card-filename", title: e.asset.filename, style: { overflow: "hidden", "text-overflow": "ellipsis", "white-space": "nowrap", "margin-bottom": "4px" } }, q(e.asset.filename), 9, kc), n[0] ||= U("div", { class: "mjr-card-meta-row" }, null, -1)])], 42, Dc)); } }, [["__scopeId", "data-v-18e248b5"]]); //#endregion //#region ui/vue/composables/useGridState.ts function jc(e) { return Array.from(e || []).map((e) => String(e || "").trim()).filter(Boolean); } function Mc() { let e = br({ query: "*", offset: 0, cursor: null, total: null, loading: !1, done: !1, seenKeys: /* @__PURE__ */ new Set(), assets: [], assetIdSet: /* @__PURE__ */ new Set(), filenameCounts: /* @__PURE__ */ new Map(), nonImageSiblingKeys: /* @__PURE__ */ new Set(), stemMap: /* @__PURE__ */ new Map(), renderedFilenameMap: /* @__PURE__ */ new Map(), hiddenPngSiblings: 0, requestId: 0, abortController: null, loadingMessage: "", statusMessage: "", statusError: !1, selectedIds: [], activeId: "", selectionAnchorId: "", cardElements: /* @__PURE__ */ new Map(), virtualGrid: null }); e.virtualGrid = { setItems(t) { e.assets = Array.isArray(t) ? t.slice() : []; } }; let t = G(() => new Set(jc(e.selectedIds))); function n(t = "", { error: n = !1 } = {}) { e.statusMessage = String(t || ""), e.statusError = !!n; } function r() { e.statusMessage = "", e.statusError = !1; } function i() { e.loadingMessage = ""; } function a(t = "") { e.loadingMessage = String(t || ""); } function o() { e.seenKeys = /* @__PURE__ */ new Set(), e.assetIdSet = /* @__PURE__ */ new Set(), e.filenameCounts = /* @__PURE__ */ new Map(), e.nonImageSiblingKeys = /* @__PURE__ */ new Set(), e.stemMap = /* @__PURE__ */ new Map(), e.renderedFilenameMap = /* @__PURE__ */ new Map(), e.hiddenPngSiblings = 0; } function s({ query: t = "*", total: n = null, done: r = !1 } = {}) { e.query = String(t || "*") || "*", e.offset = 0, e.cursor = null, e.total = n == null ? null : Number(n) || 0, e.done = !!r, e.assets = [], o(); } function c(t, n = "", { preserveAnchor: r = !1 } = {}) { let i = Array.from(new Set(jc(t))), a = String(n || i[0] || "").trim(); return e.selectedIds = i, e.activeId = a, r || (a ? e.selectionAnchorId = a : i.length || (e.selectionAnchorId = "")), { selectedIds: i, activeId: a }; } function l(t, { activeId: n = "" } = {}) { let r = new Set(jc(t)), i = jc(e.selectedIds).filter((e) => r.has(e)), a = String(n || e.activeId || i[0] || "").trim(); return c(i, r.has(a) ? a : i[0] || "", { preserveAnchor: !0 }); } function u() { let n = t.value; return (Array.isArray(e.assets) ? e.assets : []).filter((e) => n.has(String(e?.id || ""))); } function d() { let t = String(e.activeId || "").trim(); if (t) { let n = (Array.isArray(e.assets) ? e.assets : []).find((e) => String(e?.id || "") === t); if (n) return n; } return u()[0] || null; } return { state: e, selectedIdSet: t, setLoadingMessage: a, clearLoadingMessage: i, setStatusMessage: n, clearStatusMessage: r, resetCollections: o, resetAssets: s, setSelection: c, reconcileSelection: l, getSelectedAssets: u, getActiveAsset: d }; } //#endregion //#region ui/vue/composables/gridVisibility.ts function Nc(e) { try { return typeof e?.getClientRects != "function" || e.getClientRects().length > 0; } catch (e) { return console.debug?.(e), !1; } } function Pc(e, { requireClientRect: t = !0 } = {}) { if (!e || typeof e != "object") return !1; try { if (typeof document < "u" && document.hidden) return !1; } catch (e) { console.debug?.(e); } try { if (!e.isConnected) return !1; } catch (e) { return console.debug?.(e), !1; } try { if (typeof e.closest == "function" && e.closest("[hidden], [aria-hidden='true']")) return !1; } catch (e) { console.debug?.(e); } try { if (typeof getComputedStyle == "function") { let t = getComputedStyle(e); if (!t || t.display === "none" || t.visibility === "hidden") return !1; } } catch (e) { console.debug?.(e); } return !t || Nc(e); } function Fc(e) { return Pc(e, { requireClientRect: !0 }); } function Ic(e, t = null) { let n = t || e; if (!Fc(n) || e && e !== n && !Pc(e, { requireClientRect: !1 })) return !1; try { let e = Number(n?.clientWidth || 0) || 0, t = Number(n?.clientHeight || 0) || 0; return e > 0 && t > 0; } catch (e) { return console.debug?.(e), !1; } } //#endregion //#region ui/vue/grid/useGridQuery.ts function Lc(e, t = "") { return String(e ?? t).trim() || String(t); } function Rc(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } function zc(e) { return e === !0 || e === 1 || String(e || "") === "1"; } function Bc(e = {}) { let t = Lc(e.q ?? e.query, "*") || "*", n = Object.prototype.hasOwnProperty.call(e, "resolutionCompare") ? String(e.resolutionCompare ?? "").trim().toLowerCase() : "gte", r = n === "lte" ? "lte" : n ? "gte" : ""; return Object.freeze({ scope: Lc(e.scope, "output").toLowerCase(), q: t, query: t, customRootId: Lc(e.customRootId), subfolder: Lc(e.subfolder), collectionId: Lc(e.collectionId), viewScope: Lc(e.viewScope), kind: Lc(e.kind).toLowerCase(), workflowOnly: zc(e.workflowOnly), minRating: Rc(e.minRating, 0), minSizeMB: Rc(e.minSizeMB, 0), maxSizeMB: Rc(e.maxSizeMB, 0), resolutionCompare: r, minWidth: Rc(e.minWidth, 0), minHeight: Rc(e.minHeight, 0), maxWidth: Rc(e.maxWidth, 0), maxHeight: Rc(e.maxHeight, 0), workflowType: Lc(e.workflowType).toUpperCase(), workflowId: Lc(e.workflowId), workflowModel: Lc(e.workflowModel), workflowRunsOn: Lc(e.workflowRunsOn).toLowerCase(), dateRange: Lc(e.dateRange).toLowerCase(), dateExact: Lc(e.dateExact), metadataSearchMode: Lc(e.metadataSearchMode), sort: Lc(e.sort, "mtime_desc").toLowerCase(), semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : zc(e.semanticMode), groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : zc(e.groupStacks) }); } function Vc(e = {}, t = {}) { return Bc({ scope: e.mjrScope, q: e.mjrQuery, customRootId: e.mjrCustomRootId, subfolder: e.mjrSubfolder, collectionId: e.mjrCollectionId, viewScope: e.mjrViewScope, kind: e.mjrFilterKind, workflowOnly: e.mjrFilterWorkflowOnly, minRating: e.mjrFilterMinRating, minSizeMB: e.mjrFilterMinSizeMB, maxSizeMB: e.mjrFilterMaxSizeMB, resolutionCompare: e.mjrFilterResolutionCompare ?? "gte", minWidth: e.mjrFilterMinWidth, minHeight: e.mjrFilterMinHeight, maxWidth: e.mjrFilterMaxWidth, maxHeight: e.mjrFilterMaxHeight, workflowType: e.mjrFilterWorkflowType, workflowId: e.mjrFilterWorkflowId, workflowModel: e.mjrFilterWorkflowModel, workflowRunsOn: e.mjrFilterWorkflowRunsOn, dateRange: e.mjrFilterDateRange, dateExact: e.mjrFilterDateExact, metadataSearchMode: e.mjrMetadataMode, sort: e.mjrSort, semanticMode: e.mjrSemanticMode, groupStacks: e.mjrGroupStacks, ...t }); } function Hc(e = null, t = "*") { let n = e?.dataset || {}; return Vc(n, { q: n.mjrQuery ?? t }).q; } function Uc(e = null, t = "mtime_desc") { let n = e?.dataset || {}; return Vc(n, { sort: n.mjrSort ?? t }).sort; } function Wc(e = {}) { let t = Bc(e); return [ t.scope, t.q, t.sort, t.customRootId, t.subfolder, t.collectionId, t.kind, t.workflowOnly ? "1" : "", t.minRating || "", t.minSizeMB || "", t.maxSizeMB || "", t.resolutionCompare, t.minWidth || "", t.minHeight || "", t.maxWidth || "", t.maxHeight || "", t.workflowType, t.workflowId, t.workflowModel, t.workflowRunsOn, t.dateRange, t.dateExact ].join("|"); } function Gc(e = {}) { let t = Bc(e), n = t.viewScope && t.viewScope !== t.scope ? t.viewScope : ""; return !!(t.subfolder || t.customRootId || t.collectionId || n || t.kind || t.workflowOnly || t.minRating > 0 || t.minSizeMB > 0 || t.maxSizeMB > 0 || t.minWidth > 0 || t.minHeight > 0 || t.maxWidth > 0 || t.maxHeight > 0 || t.workflowType || t.workflowId || t.workflowModel || t.workflowRunsOn || t.dateRange || t.dateExact); } function Kc(e = {}) { let t = Bc(e); return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Gc(t); } //#endregion //#region ui/features/grid/PersistentAssetCache.ts var qc = "mjr-asset-cache", Jc = 1, Yc = "snapshots", Xc = 24, Zc = 500, Qc = 27e5, $c = null; function el() { return $c || ($c = new Promise((e) => { try { let t = indexedDB.open(qc, Jc); t.onupgradeneeded = () => { let e = t.result; e.objectStoreNames.contains(Yc) || e.createObjectStore(Yc, { keyPath: "key" }); }, t.onsuccess = () => e(t.result), t.onerror = () => e(null); } catch { e(null); } }), $c); } function tl(e) { return !e || typeof e != "object" ? null : { id: e.id, filename: e.filename, filepath: e.filepath || e.path, subfolder: e.subfolder || "", source: e.source || e.type, type: e.type || e.source, root_id: e.root_id || e.custom_root_id, kind: e.kind, ext: e.ext, size: e.size, mtime: e.mtime, width: e.width, height: e.height, duration: e.duration, rating: e.rating, tags: Array.isArray(e.tags) ? e.tags.slice(0, 60) : void 0, thumbnail_url: e.thumbnail_url || e.thumb_url, preview_url: e.preview_url, has_workflow: e.has_workflow || e.hasWorkflow, workflow_type: e.workflow_type || e.workflowType, positive_prompt: e.positive_prompt }; } function nl(e) { if (!e || typeof e != "object") return null; let t = Number(e.at || 0); if (!t || Date.now() - t > Qc) return null; let n = Array.isArray(e.assets) ? e.assets.map(tl).filter(Boolean) : []; return n.length ? { ...e, assets: n } : null; } async function rl(e) { let t = await el(); if (!t) return null; try { return t.transaction(Yc, e).objectStore(Yc); } catch { return null; } } var il = { async get(e) { let t = await rl("readonly"); return !t || !e ? null : await new Promise((n) => { let r = t.get(e); r.onsuccess = () => n(nl(r.result)), r.onerror = () => n(null); }); }, async put(e, t) { let n = await rl("readwrite"), r = nl({ ...t, key: e, at: t?.at || Date.now(), assets: Array.isArray(t?.assets) ? t.assets.slice(0, Zc) : [] }); return !n || !e || !r ? !1 : (await new Promise((e) => { let t = n.put(r); t.onsuccess = t.onerror = () => e(null); }), this.prune(), !0); }, async prune() { let e = await rl("readwrite"); if (!e) return; let t = await new Promise((t) => { let n = [], r = e.openCursor(); r.onsuccess = () => { let e = r.result; if (!e) return t(n); n.push(e.value), e.continue(); }, r.onerror = () => t(n); }), n = t.filter((e) => !nl(e)).map((e) => e.key), r = t.filter((e) => !n.includes(e.key)).sort((e, t) => Number(e.at || 0) - Number(t.at || 0)).slice(0, Math.max(0, t.length - Xc)).map((e) => e.key); for (let t of [...n, ...r]) e.delete(t); } }, al = /* @__PURE__ */ new Map(), ol = !0, sl = 8, cl = 200, ll = "mjr_grid_snapshot_cache_v2", ul = 18e5, dl = 1500, fl = !1, pl = null, ml = !1; function hl() { return ol; } function gl() { try { al.clear(), Sl()?.removeItem?.(ll), globalThis?.sessionStorage?.removeItem?.(ll); } catch (e) { console.debug?.(e); } } var _l = /* @__PURE__ */ "id.filename.name.display_name.filepath.path.fullpath.full_path.file_info.subfolder.source.type.root_id.custom_root_id.kind.ext.size.mtime.generation_time.file_creation_time.created_at.updated_at.indexed_at.width.height.duration.thumbnail_url.thumb_url.preview_url.poster.url.rating.tags.has_workflow.hasWorkflow.has_generation_data.hasGenerationData.workflow_type.workflowType.workflow_id.workflowId.generation_time_ms.positive_prompt.enhanced_caption.auto_tags.has_ai_info.has_ai_vector.has_ai_auto_tags.has_ai_enhanced_caption.job_id.stack_id.source_node_id.source_node_type.date.date_exact".split("."); function vl(e, t = "") { try { return String(e ?? t).trim(); } catch { return String(t); } } function yl(e = {}) { return JSON.stringify({ scope: vl(e.scope || "output", "output"), query: vl(e.query || e.q || "*", "*"), customRootId: vl(e.customRootId || ""), subfolder: vl(e.subfolder || ""), collectionId: vl(e.collectionId || ""), viewScope: vl(e.viewScope || ""), kind: vl(e.kind || ""), workflowOnly: vl(e.workflowOnly ? "1" : ""), minRating: vl(e.minRating || ""), minSizeMB: vl(e.minSizeMB || ""), maxSizeMB: vl(e.maxSizeMB || ""), resolutionCompare: vl(e.resolutionCompare || ""), minWidth: vl(e.minWidth || ""), minHeight: vl(e.minHeight || ""), maxWidth: vl(e.maxWidth || ""), maxHeight: vl(e.maxHeight || ""), workflowType: vl(e.workflowType || "").toUpperCase(), workflowId: vl(e.workflowId || ""), workflowModel: vl(e.workflowModel || ""), workflowRunsOn: vl(e.workflowRunsOn || "").toLowerCase(), dateRange: vl(e.dateRange || ""), dateExact: vl(e.dateExact || ""), sort: vl(e.sort || "mtime_desc", "mtime_desc"), semanticMode: vl(e.semanticMode ? "1" : "") }); } function bl(e) { if (!e || typeof e != "object") return null; let t = {}; for (let n of _l) e[n] !== void 0 && (t[n] = e[n]); return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= e.kind || "image", Array.isArray(t.tags) && (t.tags = t.tags.slice(0, 80)), Array.isArray(t.auto_tags) && (t.auto_tags = t.auto_tags.slice(0, 80)), t; } function xl(e) { if (!e || typeof e != "object") return null; let t = Number(e.at || 0) || 0; if (!t || Date.now() - t > ul) return null; let n = Array.isArray(e.assets) ? e.assets.map(bl).filter(Boolean) : []; if (!n.length) return null; let r = Number(e.total ?? n.length), i = Number(e.offset ?? n.length); return { assets: n, title: vl(e.title || "Cached", "Cached"), at: t, total: Number.isFinite(r) ? Math.max(0, r) : n.length, offset: Number.isFinite(i) ? Math.max(n.length, i) : n.length, done: !!e.done, query: vl(e.query || "*", "*") }; } function Sl() { try { return globalThis?.localStorage || null; } catch { return null; } } hl() || gl(); function Cl(e) { try { let t = globalThis?.sessionStorage; if (!t || !e) return; let n = t.getItem?.(ll); if (!n) return; e.getItem?.(ll) || e.setItem(ll, n), t.removeItem(ll); } catch (e) { console.debug?.(e); } } function wl() { let e = Date.now(); for (let [t, n] of al.entries()) { let r = Number(n?.at || 0) || 0; (!r || e - r > ul) && al.delete(t); } for (; al.size > sl;) { let e = al.keys().next().value; if (!e) break; al.delete(e); } } function Tl() { if (!hl()) { fl = !0, gl(); return; } if (!fl) { fl = !0; try { let e = Sl(); Cl(e); let t = e?.getItem?.(ll); if (!t) return; let n = JSON.parse(t), r = Array.isArray(n?.entries) ? n.entries : []; for (let e of r) { if (!Array.isArray(e) || e.length < 2) continue; let t = String(e[0] || ""), n = xl(e[1]); t && n && al.set(t, n); } wl(); } catch (e) { console.debug?.(e); } } } function El() { if (!hl()) { gl(); return; } try { wl(); let e = Sl(); if (!e) return; let t = Array.from(al.entries()).map(([e, t]) => [e, { ...t, assets: Array.isArray(t?.assets) ? t.assets.slice(0, cl) : [] }]); e.setItem(ll, JSON.stringify({ entries: t })); } catch (e) { console.debug?.(e); } } function Dl() { if (!hl()) { gl(), ml = !1; return; } ml = !0, !pl && (pl = setTimeout(() => { pl = null, ml && (ml = !1, El()); }, dl)); } function Ol() { pl &&= (clearTimeout(pl), null), ml && (ml = !1, El()); } function kl(e) { if (!hl()) return null; Tl(); let t = xl(al.get(e)); return t ? (al.delete(e), al.set(e, t), Dl(), t) : (al.delete(e), Dl(), null); } function Al(e) { return hl() ? (Tl(), !!xl(al.get(e))) : !1; } function jl(e, t) { if (!hl() || !e || !t || typeof t != "object") return !1; let n = xl({ ...t, at: t.at || Date.now() }); return n ? (al.delete(e), al.set(e, n), Dl(), il.put(String(e || ""), n).catch((e) => { console.debug?.(e); }), !0) : !1; } //#endregion //#region ui/vue/grid/useAssetCollection.ts function Ml(e) { return !e || typeof e != "object" ? "" : [ e.source || e.type || "output", e.root_id || e.custom_root_id || "", e.subfolder || "", e.filename || e.filepath || e.path || e.fullpath || e.full_path || "" ].join("|").trim().toLowerCase(); } function Nl(e = [], { assetKey: t = Ml } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(); for (let i of Array.isArray(e) ? e : []) { if (!i || typeof i != "object") continue; let e = i.id == null ? "" : String(i.id), a = t(i); e && n.set(e, i), a && r.set(a, i); } return { byId: n, byKey: r }; } function Pl(e, { assetKey: t = Ml } = {}) { if (!e || typeof e != "object") return e; let n = Nl(Array.isArray(e.assets) ? e.assets : [], { assetKey: t }); return e.assetIdSet = new Set(n.byId.keys()), e.seenKeys = new Set(n.byKey.keys()), e; } function Fl(e, t = [], { assetKey: n = Ml } = {}) { if (!e || typeof e != "object") return 0; let r = new Set((Array.isArray(t) ? t : [t]).map((e) => e == null ? "" : typeof e == "object" && e?.id != null ? String(e.id) : String(e)).map((e) => e.trim()).filter(Boolean)); if (!r.size) return 0; let i = 0; return e.assets = (Array.isArray(e.assets) ? e.assets : []).filter((e) => { let t = e?.id == null ? "" : String(e.id); return !t || !r.has(t) || (i += 1, !1); }), i > 0 && Pl(e, { assetKey: n }), i; } //#endregion //#region ui/vue/grid/usePagedAssets.ts function Il({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, total: i = null } = {}) { let a = Array.isArray(e) ? e.length : 0, o = t == null ? a : Math.max(0, Number(t) || 0); if (o <= 0) return 0; let s = Math.max(0, Number(n) || 0), c = Math.max(0, Number(r) || 0), l = i == null ? null : Math.max(0, Number(i) || 0), u = l == null ? null : Math.max(0, l - c); if (s <= 0 || l == null) return o; if (o >= s) return s; let d = Math.min(s, u ?? 0); return d <= 0 ? o : Math.max(o, d); } async function Ll({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = null, beforeApplyPage: i = null, onEmptyPage: a = null, maxEmptyPages: o = 6 } = {}) { if (typeof e != "function" || typeof t != "function") return { ok: !1, error: /* @__PURE__ */ Error("fetchPage and applyPage are required") }; let s = Math.max(1, Number(o) || 1), c = null, l = null; for (let o = 0; o < s; o += 1) { if (typeof r == "function" && !r({ emptyPageIndex: o })) return { ok: !0, skipped: !0, hidden: !0 }; let s = Math.max(1, Number(typeof n == "function" ? n(o) : n) || 1), u = await e({ limit: s, emptyPageIndex: o }); if (u?.skipped) return u; if (!u?.ok) return u || { ok: !1, error: "Failed to load assets" }; if (typeof i == "function") { let e = await i(u, { limit: s, emptyPageIndex: o }); if (e) return e; } let d = t(u, { limit: s, emptyPageIndex: o }) || {}, f = { ok: !0, page: u, limit: s, emptyPageIndex: o, count: Number(d.count ?? u?.count ?? 0) || 0, total: d.total, added: Number(d.added || 0) || 0, advanced: Number(d.advanced || 0) || 0, done: !!d.done }; if (c ||= f, l = f, f.done || f.added > 0) return f; if (typeof a == "function" && a(f), f.advanced <= 0) break; } return { ok: !0, skippedEmpty: !0, count: c?.count ?? 0, total: l?.total ?? c?.total ?? null, added: l?.added ?? 0, advanced: l?.advanced ?? 0, firstResult: c, lastResult: l }; } function Rl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { let a = Sr({ offset: 0, cursor: null, total: null, loading: !1, error: null, done: !1, requestId: 0 }), o = G(() => t?.items?.value || []), s = G(() => !a.loading && !a.done); function c() { return e && typeof e == "object" && "value" in e ? e.value : e; } function l() { return typeof i == "function" ? Math.max(1, Number(i()) || 1) : r && typeof r == "object" && "value" in r ? Math.max(1, Number(r.value) || 1) : Math.max(1, Number(r) || 1); } function u(e = {}) { return !e || typeof e != "object" ? d() : (Object.prototype.hasOwnProperty.call(e, "offset") && (a.offset = Math.max(0, Number(e.offset || 0) || 0)), Object.prototype.hasOwnProperty.call(e, "cursor") && (a.cursor = e.cursor || null), Object.prototype.hasOwnProperty.call(e, "total") && (a.total = e.total == null ? null : Math.max(0, Number(e.total) || 0)), Object.prototype.hasOwnProperty.call(e, "loading") && (a.loading = !!e.loading), Object.prototype.hasOwnProperty.call(e, "error") && (a.error = e.error || null), Object.prototype.hasOwnProperty.call(e, "done") && (a.done = !!e.done), Object.prototype.hasOwnProperty.call(e, "requestId") && (a.requestId = Math.max(0, Number(e.requestId || 0) || 0)), d()); } function d() { return { offset: a.offset, cursor: a.cursor, total: a.total, loading: a.loading, error: a.error, done: a.done, requestId: a.requestId }; } function f(e, { limit: n = l() } = {}) { let r = Array.isArray(e?.assets) ? e.assets : [], i = e?.total == null ? null : Number(e.total) || 0, o = Il({ assets: r, count: e?.count, limit: Number(e?.limit || n) || n, offset: a.offset, total: i }), s = Number(t?.append?.(r) || 0) || 0; return a.offset += o, (e?.next_cursor != null || e?.nextCursor != null) && (a.cursor = e.next_cursor || e.nextCursor || null), e?.total != null && (a.total = i), (o <= 0 || e?.has_more === !1 || e?.hasMore === !1 || a.total != null && a.total > 0 && a.offset >= a.total) && (a.done = !0), { added: s, advanced: o }; } async function p() { if (a.loading || a.done) return { ok: !0, skipped: !0 }; if (typeof n != "function") return a.error = /* @__PURE__ */ Error("fetchPage is required"), { ok: !1, error: a.error }; let e = a.requestId, t = l(); a.loading = !0, a.error = null; try { let r = await n({ query: c(), offset: a.offset, cursor: a.cursor, limit: t, requestId: e }); return e === a.requestId ? r?.ok ? { ok: !0, ...f(r, { limit: t }) } : (a.error = r?.error || /* @__PURE__ */ Error("Failed to load assets"), { ok: !1, error: a.error }) : { ok: !1, stale: !0 }; } catch (t) { return e === a.requestId ? (a.error = t, { ok: !1, error: t }) : { ok: !1, stale: !0 }; } finally { e === a.requestId && (a.loading = !1); } } async function m({ getLimit: e = l, canContinue: t = null, beforeApplyPage: r = null, onEmptyPage: i = null, maxEmptyPages: o = 6, fetchPage: s = n } = {}) { if (a.loading || a.done) return { ok: !0, skipped: !0 }; if (typeof s != "function") return a.error = /* @__PURE__ */ Error("fetchPage is required"), { ok: !1, error: a.error }; let u = a.requestId; a.loading = !0, a.error = null; try { let n = await Ll({ maxEmptyPages: o, canContinue: t, getLimit: e, beforeApplyPage: r, onEmptyPage: i, fetchPage: async ({ limit: e, emptyPageIndex: t }) => { let n = await s({ query: c(), offset: a.offset, cursor: a.cursor, limit: e, requestId: u, emptyPageIndex: t }); return u === a.requestId ? n : { ok: !1, stale: !0, error: "Stale page" }; }, applyPage: (e, { limit: t, emptyPageIndex: n }) => ({ ...f(e, { limit: t, emptyPageIndex: n }), count: Number(e?.count || 0) || 0, total: a.total, done: a.done }) }); return !n?.ok && !n?.stale && !n?.aborted && (a.error = n?.error || /* @__PURE__ */ Error("Failed to load assets")), n; } catch (e) { return u === a.requestId ? (a.error = e, { ok: !1, error: e }) : { ok: !1, stale: !0 }; } finally { u === a.requestId && (a.loading = !1); } } async function h(n = void 0) { return a.requestId += 1, a.offset = 0, a.cursor = null, a.total = null, a.loading = !1, a.error = null, a.done = !1, t?.reset?.(), n !== void 0 && e && typeof e == "object" && "value" in e && (e.value = n), p(); } return { state: a, items: o, canLoadMore: s, getPageState: d, setPageState: u, applyPage: f, loadMore: p, loadUntilVisible: m, reset: h }; } //#endregion //#region ui/vue/composables/useVirtualGrid.ts function zl(e, t) { if (!t || typeof t != "object") return !1; let n = Vc(e?.dataset || {}), r = n.scope, i = n.subfolder.toLowerCase(), a = n.kind, o = n.workflowOnly, s = n.minRating, c = n.workflowType.toLowerCase(), l = String(n.workflowId || "").trim(), u = n.dateExact, d = String(t?.subfolder || "").trim().toLowerCase(), f = String(t?.type || t?.source || "output").trim().toLowerCase(), p = String(t?.kind || "").trim().toLowerCase(), m = String(t?.workflow_type || t?.workflowType || "").trim().toLowerCase(), h = String(t?.workflow_id || t?.workflowId || t?.metadata?.workflow_id || t?.metadata?.workflow?.id || "").trim(), g = String(t?.date_exact || t?.date || "").trim(), _ = t?.has_workflow ?? t?.hasWorkflow ?? null; return !(r && r !== "all" && f && f !== r || i && d !== i || a && p && p !== a || o && _ !== null && !_ || s > 0 && (Number(t?.rating || 0) || 0) < s || c && m !== c || l && h && h !== l || u && g && g !== u); } async function Bl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s = null } = {}) { let c = (e) => { if (typeof e == "string") return e; if (e && typeof e == "object") { if (typeof e.value == "string") return e.value; if (typeof e.target?.value == "string") return e.target.value; } return String(e || ""); }, l = Vc(e?.dataset || {}), { scope: u, customRootId: d, subfolder: f, kind: p, workflowOnly: m, minRating: h, minSizeMB: g, maxSizeMB: _, resolutionCompare: v, minWidth: y, minHeight: b, maxWidth: x, maxHeight: S, workflowType: C, workflowId: w, workflowModel: T, workflowRunsOn: E, dateRange: D, dateExact: O, metadataSearchMode: k } = l, A = l.sort || "mtime_desc", j = c(t).trim() || "*", M = /^\[object\s+HTML.*Element\]$/i.test(j) ? "*" : j, N = i.sanitizeQuery(M) || M; try { let t = String(u || "").toLowerCase() === "output", c = Gc({ ...l, q: N }), j = t && Number(r ?? 0) === 0 && N === "*" && !c && String(A || "mtime_desc").toLowerCase() === "mtime_desc", M = !(t && (Number(r ?? 0) > 0 || j)), P = !!l.groupStacks, F = Number(r ?? 0) > 0 ? null : s || null, ee = i.buildListURL({ q: N, limit: n, offset: r, scope: u, subfolder: f, customRootId: d || null, kind: p || null, hasWorkflow: m ? !0 : null, minRating: h > 0 ? h : null, minSizeMB: g > 0 ? g : null, maxSizeMB: _ > 0 ? _ : null, resolutionCompare: v, minWidth: y > 0 ? y : null, minHeight: b > 0 ? b : null, maxWidth: x > 0 ? x : null, maxHeight: S > 0 ? S : null, workflowType: C || null, workflowId: w || null, workflowModel: T || null, runsOn: E || null, dateRange: D || null, dateExact: O || null, sort: A, cursor: F, includeTotal: M, groupStacks: P, metadataMode: k || null }), te = await i.get(ee, { timeoutMs: 12e4, ...o ? { signal: o } : {} }); try { let t = i.getGridState(e); if (t && Number(t.requestId) !== Number(a)) return { ok: !1, stale: !0, error: "Stale response" }; } catch (e) { console.debug?.(e); } if (te.ok) { let e = te.data?.assets || [], t = Array.isArray(e) ? e.length : 0, n = te.data?.total; return { ok: !0, assets: e, total: n == null ? null : Number(n ?? 0) || 0, count: t, limit: Math.max(0, Number(te.data?.limit) || 0), offset: Math.max(0, Number(te.data?.offset) || 0), nextCursor: te.data?.next_cursor || te.data?.nextCursor || null, hasMore: typeof te.data?.has_more == "boolean" ? te.data.has_more : null, sortKey: A, safeQuery: N }; } try { if (String(te?.code || "") === "ABORTED") return { ok: !1, aborted: !0, error: "Aborted" }; } catch (e) { console.debug?.(e); } return { ok: !1, error: te.error }; } catch (e) { try { if (String(e?.name || "") === "AbortError") return { ok: !1, aborted: !0, error: "Aborted" }; } catch (e) { console.debug?.(e); } return { ok: !1, error: e.message }; } } function Vl(e, t) { switch (t) { case "mtime_desc": return -(Number(e?.mtime) || 0); case "mtime_asc": return Number(e?.mtime) || 0; case "name_asc": case "name_desc": return String(e?.filename || "").toLowerCase(); default: return -(Number(e?.mtime) || 0); } } function Hl(e, t, n) { if (n === "name_desc") { let n = String(e?.filename || "").toLowerCase(), r = String(t?.filename || "").toLowerCase(); return n > r ? -1 : +(n < r); } let r = Vl(e, n), i = Vl(t, n); return r < i ? -1 : +(r > i); } function Ul(e, t, n) { return n === "name_asc" ? String(e) < String(t) : n === "name_desc" ? String(e) > String(t) : Number(e) < Number(t); } function Wl(e, t, n) { let r = Vl(t, n); for (let t = 0; t < e.length; t++) if (Ul(r, Vl(e[t], n), n)) return t; return e.length; } function Gl(e, t) { let n = t.get(e); return n || (n = { pending: /* @__PURE__ */ new Map(), timer: null, flushing: !1 }, t.set(e, n)), n; } function Kl(e) { return String(e ?? "").trim().toLowerCase(); } function ql(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } function Jl(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; } catch (e) { console.debug?.(e); } return e; } function Yl(e) { if (!e || typeof e != "object") return ""; let t = Kl(e?.type || e?.source || "output"), n = Kl(e?.root_id || e?.custom_root_id || ""), r = Kl(e?.subfolder || ""), i = Kl(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; let a = Kl(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } function Xl(e, t, n) { let r = Array.isArray(e?.assets) ? e.assets : []; if (t) { let e = r.findIndex((e) => String(e?.id || "") === t); if (e > -1) return e; } let i = Yl(n); return i ? r.findIndex((e) => Yl(e) === i) : -1; } function Zl(e, t) { return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : ql(t) ? !0 : ![ "filename", "filepath", "path", "fullpath", "full_path", "subfolder", "type", "source", "root_id", "custom_root_id", "kind", "rating", "workflow_type", "workflowType", "date_exact", "date" ].some((t) => Object.prototype.hasOwnProperty.call(e, t)); } function Ql(e, t) { let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Map(), a = []; for (let o of Array.isArray(e?.assets) ? e.assets : []) { let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o), c = Mt(o?.filename); if (!(e && n.has(e)) && !(s && r.has(s))) { if (c) { let e = i.get(c); if (e) { let t = Array.isArray(e._mjrDupMembers) ? e._mjrDupMembers : [e], n = new Set(t.map((e) => String(e?.id || ""))), r = [...t, ...[o].filter((e) => !n.has(String(e?.id || "")))]; e._mjrDupStack = !0, e._mjrDupMembers = r, e._mjrDupCount = r.length, e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, o._mjrNameCollision = !1, delete o._mjrNameCollisionCount, delete o._mjrNameCollisionPaths, o._mjrDupStack = !1, o._mjrDupMembers = null, o._mjrDupCount = 0; continue; } } e && n.add(e), s && r.add(s), c && i.set(c, o), o._mjrNameCollision = !1, delete o._mjrNameCollisionCount, delete o._mjrNameCollisionPaths, a.push(o); } } e.assets = a, Pl(e, { assetKey: t.assetKey }); } function $l(e, t) { let n = t.upsertState.get(e); if (!n || n.pending.size === 0 || n.flushing) return; n.flushing = !0, n.timer &&= (clearTimeout(n.timer), null); let r = new Map(n.pending); for (let e of r.keys()) n.pending.delete(e); let i = t.getOrCreateState(e), a = t.ensureVirtualGrid(e, i); try { let n = !1; for (let [a, o] of r.entries()) { let r = ql(o); i.assetKeyFn = t.assetKey; let s = wt(o, i, t.loadMajoorSettings); if (Array.isArray(s?.removed) && s.removed.length) { let e = new Set(s.removed); i.assets = i.assets.filter((t) => { let n = !e.has(t); return n || Ft(i, t, i), n; }); try { i.hiddenPngSiblings = (Number(i.hiddenPngSiblings || 0) || 0) + s.removed.length; } catch (e) { console.debug?.(e); } n = !0; } if (s?.hidden) { try { i.hiddenPngSiblings = (Number(i.hiddenPngSiblings || 0) || 0) + 1; } catch (e) { console.debug?.(e); } continue; } let c = i.assets.findIndex((e) => String(e.id) === a), l = c > -1 ? i.assets[c] : null, u = l ? { ...l, ...o } : o, d = c > -1 ? c : Xl(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? { ...f, ...o } : u, m = t.assetKey(u); if (!zl(e, p)) { if (d > -1) { if (Zl(o, f)) { Object.assign(f, o), r || Jl(f), i.assets[d] = { ...f }, n = !0; continue; } let [e] = i.assets.splice(d, 1); Ft(i, e, i), n = !0; } continue; } if (d > -1) { let e = t.assetKey(f); Object.assign(f, o), r || Jl(f); let a = { ...f }, s = t.assetKey(a); i.assets[d] = a, e && e !== s && (i.seenKeys?.delete?.(e), s && i.seenKeys?.add?.(s)), n = !0; } else if (!(i.seenKeys.has(m) || o.id != null && i.assetIdSet?.has?.(a))) { let t = Vc(e?.dataset || {}).sort || "mtime_desc", s = r ? u : Jl({ ...u }), c = Wl(i.assets, s, t); i.seenKeys.add(m), o.id != null && i.assetIdSet?.add?.(a), i.assets.splice(c, 0, s), n = !0; } } if (n && a) { Ql(i, t); try { e.dataset.mjrHiddenPngSiblings = String(Number(i.hiddenPngSiblings || 0) || 0); } catch (e) { console.debug?.(e); } a.setItems(i.assets); } } finally { if (n.flushing = !1, n.pending.size > 0 && !n.timer) { let r = Math.min(16, t.debounceMs); n.timer = setTimeout(() => { n.timer = null, $l(e, t); }, r); } } } function eu(e, t, n) { if (!t || !t.id) return !1; let r = n.getOrCreateState(e), i = String(t.id); if (!n.ensureVirtualGrid(e, r)) return !1; let a = Gl(e, n.upsertState); return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? $l(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => { a.timer = null, $l(e, n); }, n.debounceMs)), !0; } //#endregion //#region ui/vue/components/grid/gridDomBridge.ts function tu(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); } catch (e) { console.debug?.(e); } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } function nu(e) { if (!e) return []; try { return Array.from(e.querySelectorAll?.(".mjr-asset-card") || []); } catch (e) { return console.debug?.(e), []; } } function ru(e) { if (!e) return null; try { return e.querySelector?.(".mjr-asset-card.is-selected") || null; } catch (e) { return console.debug?.(e), null; } } function iu(e, t) { if (!e) return null; let n = String(t || "").trim(); if (!n) return null; try { return e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${tu(n)}"]`) || null; } catch (e) { return console.debug?.(e), null; } } function au(e, t = 0) { let n = e?.dataset?.mjrShown, r = Number(n); return Number.isFinite(r) ? Math.max(0, r) : Math.max(0, Number(t) || 0); } //#endregion //#region ui/vue/composables/useGridLoader.ts var ou = 200, su = 50, cu = /* @__PURE__ */ new WeakMap(), lu = /* @__PURE__ */ new Set([ "collection", "filter", "initial", "scope", "search", "sort" ]), uu = 0; function du(e) { return new Promise((t) => setTimeout(t, Math.max(0, Number(e) || 0))); } function fu(e) { if (!e || typeof e != "object") return ""; if (e.id != null && String(e.id).trim()) return `id:${String(e.id).trim()}`; let t = String(e?.type || e?.source || "output").trim().toLowerCase(), n = String(Ne(e) || "").trim().toLowerCase(), r = String(e?.subfolder || "").trim().toLowerCase(), i = String(e?.filename || "").trim().toLowerCase(); if (i) return `${t}|${n}|${r}|${i}`; let a = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(); return a ? `${t}|${n}|path|${a}` : ""; } function pu(e) { if (e == null) return e; let t = String(e); return t.trim() === "" ? t : t.trim() === "*" ? "*" : t.replace(/[\u0000-\u001f\u007f]+/g, " ").replace(/[<>]/g, " ").replace(/\s+/g, " ").trim() || t; } function mu(e) { if (typeof e == "string") return e; if (e && typeof e == "object") { if (typeof e.value == "string") return e.value; if (typeof e.target?.value == "string") return e.target.value; try { if (typeof e.querySelector == "function") { let t = e.querySelector("#mjr-search-input") || e.querySelector("input.mjr-input") || e.querySelector("input[type='text']") || e.querySelector("textarea"); if (t && typeof t.value == "string") return t.value; } } catch (e) { console.debug?.(e); } } return String(e || ""); } function hu(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } async function gu() { await or(); } function _u(e, t) { let n = String(e || "Failed to load"); try { let e = String(t?.message || t || "").trim(), r = e.toLowerCase(); return e ? r.includes("database is locked") || r.includes("database table is locked") || r.includes("database schema is locked") ? `${n}: the database is temporarily locked. Please retry in a few seconds.` : `${n}: ${e}` : n; } catch { return n; } } function vu(e, t) { let n = Math.max(1, Math.min(z.MAX_PAGE_SIZE, Number(e) || 1)), r = Math.max(0, Number(t) || 0); if (r <= 0) return n; let i = 2 ** Math.min(r, 5); return Math.max(1, Math.min(z.MAX_PAGE_SIZE, n * i)); } function yu() { try { let e = typeof navigator < "u" ? navigator : null, t = Number(e?.deviceMemory || 0) || 0; if (t > 0 && t <= 4 || e?.connection?.saveData === !0) return !0; } catch (e) { console.debug?.(e); } return !1; } function bu() { return z.PREFETCH_NEXT_PAGE ? !yu() : !1; } function xu(e, t = {}) { let n = Array.isArray(e.assets) ? e.assets : []; if (t.rebuildFromVisible && n.length) { vt(e, n, { assetKey: t.assetKey || e.assetKeyFn, preserveHiddenCount: !!t.preserveHiddenCount }); return; } vt(e, [], { assetKey: t.assetKey || e.assetKeyFn, preserveHiddenCount: !1 }); } function Su({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingMessage: r, setStatusMessage: i, clearStatusMessage: a, resetAssets: o, setSelection: s, reconcileSelection: c, readScrollElement: l = () => null, readRenderedCards: u = () => [], scrollToAssetId: d = () => {}, canLoadMore: f = null } = {}) { let p = !1, m = null, h = null, g = { pagesRequested: 0, assetsReceived: 0, visibleAssetsAdded: 0, hiddenOrDedupedAssets: 0, apiTimeMs: 0, renderTimeMs: 0, resetCount: 0, blockedImmediateResetCount: 0, scrollRestoreCount: 0, lastReloadReason: "", lastResetReason: "", lastAppendReason: "", lastOperation: "" }; function _() { try { return typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(); } catch { return Date.now(); } } function v(e, t = {}) { g.lastOperation = String(e || ""), t.reloadReason && (g.lastReloadReason = String(t.reloadReason || "")), t.appendReason && (g.lastAppendReason = String(t.appendReason || "")); } function y() { return hu(e); } function b() { return C(); } function x() { let e = l(); return { assets: Array.isArray(t.assets) ? t.assets : [], pagination: { query: String(t.query || "*"), offset: Number(t.offset || 0) || 0, total: t.total == null ? null : Number(t.total) || 0, loading: !!t.loading, done: !!t.done, requestId: Number(t.requestId || 0) || 0 }, selection: { selectedIds: Array.isArray(t.selectedIds) ? t.selectedIds.map(String).filter(Boolean) : [], activeId: String(t.activeId || ""), anchorId: String(t.selectionAnchorId || "") }, viewport: { scrollTop: Number(e?.scrollTop || 0) || 0, clientHeight: Number(e?.clientHeight || 0) || 0, scrollHeight: Number(e?.scrollHeight || 0) || 0 }, context: b() }; } function S() { let e = x(); return { ...e, counts: { loaded: e.assets.length, visible: au(y(), e.assets.length), total: e.pagination.total }, metrics: { ...g } }; } function C() { let e = y(); return Vc(e?.dataset || {}, { q: Hc(e, t.query || "*"), resolutionCompare: e?.dataset?.mjrFilterResolutionCompare || "" }); } function w(e = t.query || "*") { return { ...C(), query: String(e || "*") }; } function T(e) { let n = t._mjrLastGridContext || null; return n ? String(n.collectionId || "") === String(e.collectionId || "") ? String(n.scope || "") !== String(e.scope || "") || String(n.customRootId || "") !== String(e.customRootId || "") || String(n.subfolder || "") !== String(e.subfolder || "") || String(n.viewScope || "") !== String(e.viewScope || "") ? "scope" : String(n.sort || "") === String(e.sort || "") ? [ "kind", "workflowOnly", "minRating", "minSizeMB", "maxSizeMB", "resolutionCompare", "minWidth", "minHeight", "maxWidth", "maxHeight", "workflowType", "workflowId", "dateRange", "dateExact", "semanticMode" ].some((t) => String(n[t] || "") !== String(e[t] || "")) ? "filter" : String(n.query || "*") === String(e.query || "*") ? "refresh" : "search" : "sort" : "collection" : Array.isArray(t.assets) && t.assets.length ? "unknown" : "initial"; } function E(e, t = {}) { let n = String(t?.resetReason || t?.reason || "").trim().toLowerCase(), r = w(e); return { reason: n || T(r), nextContext: r }; } function D(e) { return lu.has(String(e || "").toLowerCase()); } function O(e = null) { try { t._mjrLastGridContext = e || w(t.query || "*"); } catch (e) { console.debug?.(e); } } function k({ reset: e = !0, preserveVisibleUntilReady: n = !0 } = {}) { return !e || n === !1 ? !1 : Array.isArray(t.assets) && t.assets.length > 0; } function A() { try { if (typeof f == "function") return !!f(); } catch (e) { console.debug?.(e); } return Ic(y(), l()); } function j() { if (!z.DEFER_GRID_FETCH_DURING_EXECUTION) return !1; try { if (!Array.isArray(t.assets) || t.assets.length === 0) return !1; } catch (e) { console.debug?.(e); } try { return !!String(window.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim(); } catch (e) { return console.debug?.(e), !1; } } function M() { try { m?.timer && clearTimeout(m.timer); } catch (e) { console.debug?.(e); } try { m?.listener && window.removeEventListener(B.RUNTIME_STATUS, m.listener); } catch (e) { console.debug?.(e); } m = null; } function N() { try { h && clearTimeout(h); } catch (e) { console.debug?.(e); } h = null; } function P(e, n = z.PREFETCH_NEXT_PAGE_DELAY_MS) { if (!bu()) return; N(); let r = Math.max(0, Number(n) || 0); h = setTimeout(() => { h = null, !(t.requestId !== e || t.done || t.loading) && he().catch((e) => { console.debug?.("[AssetsManager][GridLoader] Delayed prefetch failed", e); }); }, r); } function F(e, t = {}) { M(); let n = (() => { try { return yl(C()); } catch (e) { return console.debug?.(e), null; } })(), r = () => { if (j()) { try { m = { ...m, timer: setTimeout(r, 1250) }; } catch (e) { console.debug?.(e); } return; } M(); let i = y(); if (n) { let e = null; try { e = yl(C()); } catch (e) { console.debug?.(e); } if (e && e !== n) { we("[Grid] Deferred execution reload skipped - scope/filter changed during execution"); return; } } let a = Hc(i, e); Promise.resolve().then(() => ve(a, { ...t || {}, reset: !0, preserveVisibleUntilReady: !0 })).catch((e) => console.debug?.(e)); }, i = (e) => { String(e?.detail?.active_prompt_id || "").trim() || r(); }; m = { listener: i, timer: setTimeout(r, 1250) }; try { window.addEventListener(B.RUNTIME_STATUS, i); } catch (e) { console.debug?.(e); } } function ee(e, t = null) { if (!e || typeof e != "object") return ""; let n = e.id == null ? `${e.type || ""}|${Ne(e)}|${e.filepath || ""}|${e.subfolder || ""}|${e.filename || ""}` : `id:${e.id}`; try { return mo(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n); } catch (e) { return console.debug?.(e), n; } } function te() { try { let e = mn?.() || {}, t = e.grid || {}; return t.snapshotCacheEnabled === !0 || t.enableSnapshotCache === !0 || e.snapshotCacheEnabled === !0 || e.enableSnapshotCache === !0; } catch (e) { return console.debug?.(e), !1; } } function I(e = "") { try { if (!te()) return; let n = y(), r = Array.isArray(t.assets) ? t.assets : []; if (!n || !r.length) return; let i = r.map(bl).filter(Boolean); if (!i.length) return; let a = i.length < r.length, o = Number(t.offset || i.length) || i.length, s = Number(t.total ?? i.length), c = Vc(n.dataset || {}, { q: Hc(n, t.query || "*"), resolutionCompare: n.dataset?.mjrFilterResolutionCompare || "" }), l = yl(c); if (!l) return; jl(l, { assets: i, title: String(e || "").trim(), query: String(t.query || c.query || "*").trim() || "*", total: Number.isFinite(s) ? s : i.length, offset: a ? i.length : Math.max(i.length, o), done: !a && !!t.done }); } catch (e) { console.debug?.(e); } } function ne() { let e = y(); if (e) try { let t = cu.get(e); if (!t) return; t.timer &&= (clearTimeout(t.timer), null), t.pending.clear(), t.flushing = !1; } catch (e) { console.debug?.(e); } } function re(e, n) { let r = _(), i = Array.isArray(n) ? n.length : 0, o = Dt(e, n, t, { loadMajoorSettings: mn, clearGridMessage: () => { a(); }, ensureVirtualGrid: () => t.virtualGrid, setFileBadgeCollision: Tt, assetKey: (t) => ee(t, e), ensureDupStackCard: (e, t, n) => go(e, t, n) }); return g.renderTimeMs += Math.max(0, _() - r), g.assetsReceived += i, g.visibleAssetsAdded += Number(o || 0) || 0, g.hiddenOrDedupedAssets += Math.max(0, i - (Number(o || 0) || 0)), o; } function ie(e, t) { let n = String(t || "*").trim() || "*"; return Wc(Vc(e?.dataset || {}, { q: n })); } function oe(e) { let t = C(), n = pu(mu(e).trim() || "*") || "*"; return Kc({ ...t, q: n }); } function se(e, { query: t = "*", limit: n = 0, offset: r = 0 } = {}) { if (!e?.ok || e.total == null || !oe(t)) return e; let i = Number(e.total), a = Number(e.count ?? e.assets?.length ?? 0) || 0, o = Math.max(1, Number(n) || 1), s = Math.max(0, Number(r) || 0) + a; return Number.isFinite(i) && i > 0 && i <= s && a > 0 && a < o ? { ...e, total: null } : e; } async function ce(e, n, r, { requestId: i = 0, signal: a = null } = {}) { let o = y(); if (!o) return { ok: !1, error: "Grid unavailable" }; if (r === 0) { let s = ie(o, e), c = Pr(); if (c && c === s) { let o = Nr(s); if (o) try { let s = await o; if (Number(t.requestId) !== Number(i)) return { ok: !1, stale: !0, error: "Stale early fetch" }; if (a?.aborted) return { ok: !1, aborted: !0, error: "Aborted" }; let c = s?.data?.assets; if (s?.ok && Array.isArray(c)) { we("[Grid] Using early-fetched data:", c.length, "assets"); let t = s.data?.total ?? s.meta?.total ?? null; return se({ ok: !0, assets: c, total: t == null ? null : Number(t) || 0, count: c.length, limit: n, offset: 0, nextCursor: s.data?.next_cursor || s.data?.nextCursor || null }, { query: e, limit: n, offset: r }); } } catch (e) { we("[Grid] Early fetch failed, falling back to normal fetch", e); } } } return se(await Bl(o, e, n, r, { sanitizeQuery: pu, buildListURL: L, get: ae, getGridState: () => t }, { requestId: i, signal: a ?? void 0, cursor: t.cursor || null }), { query: e, limit: n, offset: r }); } let le = Rl({ query: { get value() { return t.query || "*"; }, set value(e) { t.query = String(e || "*") || "*"; } }, collection: { append(e = []) { let t = y(); return t && e.length && Number(re(t, e) || 0) || 0; }, reset() {} }, fetchPage: async ({ query: e, limit: n, offset: r, requestId: i }) => { let a = _(); g.pagesRequested += 1; let o = await ce(e, n, r, { requestId: i, signal: t.abortController?.signal || null }); return g.apiTimeMs += Math.max(0, _() - a), o; }, pageSize: z.DEFAULT_PAGE_SIZE }); function ue() { le.setPageState({ offset: t.offset, cursor: t.cursor, total: t.total, done: t.done, requestId: t.requestId, loading: !1, error: null }); } function de(e = {}, { syncPaged: n = !0 } = {}) { !e || typeof e != "object" || (Object.prototype.hasOwnProperty.call(e, "offset") && (t.offset = Math.max(0, Number(e.offset || 0) || 0)), Object.prototype.hasOwnProperty.call(e, "cursor") && (t.cursor = e.cursor || null), Object.prototype.hasOwnProperty.call(e, "total") && (t.total = e.total == null ? null : Math.max(0, Number(e.total) || 0)), Object.prototype.hasOwnProperty.call(e, "done") && (t.done = !!e.done), n && ue()); } function fe() { de(le.getPageState(), { syncPaged: !1 }); } function pe() { let e = Array.isArray(t.assets) ? t.assets.length : 0; e <= 0 || t.done || Number(t.offset || 0) >= e || de({ offset: e }, { syncPaged: !0 }); } function me({ title: e = "", showEmptyMessage: n = !0 } = {}) { r(), Array.isArray(t.assets) && t.assets.length ? (a(), I(e || t.query)) : n && (!t.statusMessage || !t.statusError) && i("No assets found"); let o = (Array.isArray(t.assets) ? t.assets : []).map((e) => String(e?.id || "")).filter(Boolean); (t.done || Number.isFinite(Number(t.total)) && Number(t.total || 0) <= o.length) && c(o, { activeId: t.activeId }); } async function he() { let e = y(); if (!e || t.loading || t.done) return { ok: !0, skipped: !0 }; let n = l(), c = Number(n?.scrollTop || 0) || 0, u = !1, d = () => { u = !0; }; try { n?.addEventListener?.("scroll", d, { passive: !0, once: !0 }); } catch (e) { console.debug?.(e); } let f = Array.isArray(t.selectedIds) ? t.selectedIds.join("|") : "", m = String(t.activeId || ""); if (v("appendNextPage", { appendReason: "pagination" }), !A()) return !t.assets.length && !t.loading && bu() && P(t.requestId, 400), { ok: !0, skipped: !0, hidden: !0 }; if (j()) return { ok: !0, skipped: !0, busy: !0 }; let h = Math.max(1, Math.min(z.MAX_PAGE_SIZE, z.DEFAULT_PAGE_SIZE)), _ = Date.now(); t.loading = !0, a(); try { if (!t.done) { if (!A()) return { ok: !0, skipped: !0, hidden: !0 }; p || pe(), ue(); let n = t.requestId, r = await le.loadUntilVisible({ maxEmptyPages: 6, canContinue: () => A(), getLimit: (e) => vu(h, e), beforeApplyPage: (e) => { if (t.requestId !== n) return { ok: !1, stale: !0 }; let r = (Array.isArray(e.assets) ? e.assets : []).length > 0; if (!p) return null; let i = e.total != null && Number(e.total) === 0; return r || i ? (o({ query: t.query || "*", total: null, done: !1 }), de({ offset: 0, cursor: null, total: null, done: !1 }), xu(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (we("[Grid LoadPage] empty response with cached visible assets - preserving cached view", { offset: t.offset, query: t.query }), { ok: !0, count: 0, total: t.total, preservedCached: !0 }) : null; }, onEmptyPage: (e) => { e.emptyPageIndex <= 0 || we(`[Grid LoadPage] fetched adaptive page with no visible additions: offset=${t.offset}, fetched=${e.count}, consumed=${e.advanced}, added=${e.added}, limit=${e.limit}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`); } }); if (fe(), pe(), !r.ok) return r.aborted || r.stale ? r : (de({ done: !0 }), i(_u("Failed to load assets", r?.error || "Unknown error"), { error: !0 }), r); if (r.preservedCached) return r; if (t.done || r.added > 0) return I(t.query || Hc(e, "*")), { ok: !0, count: r.count, total: t.total }; let a = r.lastResult || r.firstResult || r; return we(`[Grid LoadPage] fetched one page with no visible additions: offset=${t.offset}, fetched=${r.count}, consumed=${a.advanced}, added=${a.added}, limit=${a.limit || h}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`), !t.done && bu() && P(Number(t.requestId ?? 0) || 0, Math.min(z.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), { ok: !0, count: r.count, total: t.total, skippedEmpty: !0 }; } return { ok: !0, count: 0, total: t.total }; } catch (e) { try { if (String(e?.name || "") === "AbortError") return { ok: !1, aborted: !0, error: "Aborted" }; } catch (e) { console.debug?.(e); } return i(_u("Failed to load assets", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; } finally { try { n?.removeEventListener?.("scroll", d); } catch (e) { console.debug?.(e); } try { n && !u && Number(n.scrollTop || 0) !== c && (n.scrollTop = c, g.scrollRestoreCount += 1); } catch (e) { console.debug?.(e); } try { ((Array.isArray(t.selectedIds) ? t.selectedIds.join("|") : "") !== f || String(t.activeId || "") !== m) && typeof s == "function" && s(f ? f.split("|").filter(Boolean) : [], m, { preserveAnchor: !0 }); } catch (e) { console.debug?.(e); } try { let e = Date.now() - _; e < uu && await du(uu - e); } catch (e) { console.debug?.(e); } t.loading = !1, r(); } } let ge = null; function _e(e = 250) { v("refreshHead", { appendReason: "snapshotHeadRefresh" }); try { ge && clearTimeout(ge); } catch (e) { console.debug?.(e); } let n = t.requestId, r = null; try { r = yl(C()); } catch (e) { console.debug?.(e); } ge = setTimeout(async () => { if (ge = null, Number(t.requestId) !== Number(n) || j() || !y()) return; if (r) { let e = null; try { e = yl(C()); } catch (e) { console.debug?.(e); } if (e && e !== r) { we("[Grid] Snapshot head refresh skipped - context changed"); return; } } let e = Math.max(1, Math.min(z.MAX_PAGE_SIZE, z.DEFAULT_PAGE_SIZE)); try { let i = await ce(t.query || "*", e, 0, { requestId: n, signal: t.abortController?.signal || null }); if (Number(t.requestId) !== Number(n)) return; if (r) { let e = null; try { e = yl(C()); } catch (e) { console.debug?.(e); } if (e && e !== r) { we("[Grid] Snapshot head refresh discarded - context changed mid-fetch"); return; } } if (!i?.ok) return; let a = Array.isArray(i.assets) ? i.assets : []; if (i.total != null && de({ total: i.total }), !a.length) return; let o = 0; for (let e of a) e && e.id != null && Oe(e) && (o += 1); o > 0 && (I(t.query || "*"), we("[Grid] Snapshot head refresh: inserted", o, "new asset(s)")); } catch (e) { console.debug?.("[Grid] Snapshot head refresh failed", e); } }, Math.max(0, Number(e) || 0)); } async function ve(e = "*", i = {}) { let s = t.requestId, { reset: c = !0, preserveVisibleUntilReady: l = !0 } = i || {}, u = y(); if (!u) return { ok: !1, error: "Grid unavailable" }; if (t.requestId !== s) return console.debug?.("[Grid] loadAssets aborted early due to rapid scope switch"), { ok: !1, aborted: !0 }; try { globalThis.__MJR_LAST_ASSETKEY_GRID__ = u; } catch (e) { console.debug?.(e); } let d = mu(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = pu(f) || f; t.query = m; let h = c ? E(m, i) : { reason: "append", nextContext: w(m) }; if (v("reload", { reloadReason: h.reason || "loadAssets" }), c && j()) { let e = !1; try { let n = C(); n.query = m; let r = yl(n); if (te() && Al(r) && (e = await Ee(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), { ok: !1, aborted: !0 }; } catch (e) { console.debug?.(e); } return e ? (r(), t.loading = !1) : n("Grid refresh deferred while ComfyUI is generating..."), F(m, i || {}), { ok: !0, deferred: !0, cached: e, count: Number(t.offset || 0) || 0, total: Number(t.total || 0) || 0 }; } if (c) { let e = h.reason || "unknown"; g.lastResetReason = e; let r = D(e); !r && Array.isArray(t.assets) && t.assets.length && (g.blockedImmediateResetCount += 1), p = !r || k({ reset: c, preserveVisibleUntilReady: l }); try { t.abortController?.abort?.(); } catch (e) { console.debug?.(e); } t.loading = !1; try { t.abortController = typeof AbortController < "u" ? new AbortController() : null; } catch { t.abortController = null; } t.requestId = (Number(t.requestId) || 0) + 1, N(), ne(), a(), p ? (t.query = m, de({ offset: 0, cursor: null, total: null, done: !1 }), xu(t, { rebuildFromVisible: !0, preserveHiddenCount: !0, assetKey: (e) => ee(e, u) })) : (o({ query: m, total: null, done: !1 }), de({ offset: 0, cursor: null, total: null, done: !1 }), xu(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`); } let _ = await he(); return pe(), bu() && _?.ok && !_?.skipped && !t.done && !_?.aborted && P(t.requestId), c && (me({ title: m, showEmptyMessage: !(_?.skipped || _?.hidden || _?.aborted || _?.stale || _?.preservedCached || _?.busy) }), O(h.nextContext)), { ok: !!_?.ok, count: Number(t.offset || 0) || 0, total: Number(t.total || 0) || 0, error: _?.error, aborted: !!_?.aborted }; } async function ye(e, s = {}) { let { title: c = "Collection", reset: l = !0, showLoading: u = !0, preserveVisibleUntilReady: d = !0 } = s || {}; v("reload", { reloadReason: s?.resetReason || s?.reason || "collection" }); let f = y(); if (!f) return { ok: !1, error: "Grid unavailable" }; let p = Array.isArray(e) ? e.slice() : [], m = Date.now(), h = k({ reset: l, preserveVisibleUntilReady: d }); if (l) { g.lastResetReason = String(s?.resetReason || s?.reason || "collection"); try { t.abortController?.abort?.(); } catch (e) { console.debug?.(e); } try { t.abortController = typeof AbortController < "u" ? new AbortController() : null; } catch { t.abortController = null; } t.requestId = (Number(t.requestId) || 0) + 1, ne(), a(), h ? (t.query = String(c || "Collection"), de({ offset: 0, cursor: null, total: p.length, done: !0 })) : (o({ query: String(c || "Collection"), total: p.length, done: !0 }), de({ offset: 0, cursor: null, total: p.length, done: !0 }), xu(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1); } try { let e = Uc(f, "mtime_desc"), n = p.sort((t, n) => Hl(t, n, e)); return l && h && (o({ query: String(c || "Collection"), total: p.length, done: !0 }), xu(t), g.resetCount += 1), re(f, n), de({ offset: n.length, cursor: null, total: n.length, done: !0 }), me({ title: c }), O(w(String(c || "Collection"))), { ok: !0, count: n.length, total: n.length }; } catch (e) { return i(_u("Failed to load collection", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; } finally { if (u) try { let e = Date.now() - m; e < uu && await du(uu - e); } catch (e) { console.debug?.(e); } t.loading = !1, u && r(); } } function be() { v("reload", { reloadReason: "scopeSwitch" }); try { ho(y()); } catch (e) { console.debug?.(e); } try { t.abortController?.abort?.(); } catch (e) { console.debug?.(e); } t.abortController = null, t.requestId = (Number(t.requestId) || 0) + 1, t.loading = !0, de({ offset: 0, cursor: null, total: null, done: !1 }), N(), ne(), r(), a(), p = !0, s([], ""); } function xe() { t.virtualGrid?.setItems?.(t.assets || []); } function Se(e, { updateSelection: n = !0 } = {}) { let r = Fl(t, e, { assetKey: (e) => ee(e, y()) }); return r ? (Number.isFinite(Number(t.total)) && de({ total: Math.max(0, Number(t.total || 0) - r) }), n && c(t.assets.map((e) => String(e?.id || "")).filter(Boolean), { activeId: t.activeId }), !t.assets.length && !t.loading && i("No assets found"), { ok: !0, removed: r, selectedIds: t.selectedIds.slice() }) : { ok: !1, removed: 0, selectedIds: t.selectedIds.slice() }; } function Ce() { let e = y(), t = l(); if (!e || !t) return null; let n = (e) => { if (!e) return !1; try { let n = e.getBoundingClientRect(), r = t.getBoundingClientRect(); return n.bottom >= r.top && n.top <= r.bottom; } catch { return !1; } }, r = ru(e), i = u(), a = i.find((e) => n(e)) || i[0] || null, o = n(r) ? r : a; if (!o) return null; try { let e = o.getBoundingClientRect(), n = t.getBoundingClientRect(); return { id: String(o.dataset?.mjrAssetId || ""), top: e.top - n.top, scrollTop: Number(t.scrollTop || 0) || 0 }; } catch (e) { return console.debug?.(e), null; } } async function Te(e) { let t = y(), n = l(); if (!t || !n || !e) return; await gu(); let r = String(e.id || "").trim(); if (!r) { n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; return; } d(r, { align: "start" }), await gu(); let i = iu(t, r); if (!i) { n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; return; } try { let t = i.getBoundingClientRect(), r = n.getBoundingClientRect(), a = t.top - r.top - Number(e.top || 0); n.scrollTop = (Number(n.scrollTop || 0) || 0) + a, g.scrollRestoreCount += 1; } catch (t) { console.debug?.(t), n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; } } async function Ee(e = {}, n = {}) { let i = y(); if (!i || !te()) return !1; let s = yl(e), c = kl(s); if (!c || !Array.isArray(c.assets) || !c.assets.length || !n.allowReplaceExisting && Array.isArray(t.assets) && t.assets.length) return !1; g.lastResetReason = "snapshot"; try { t.abortController?.abort?.(); } catch (e) { console.debug?.(e); } try { t.abortController = typeof AbortController < "u" ? new AbortController() : null; } catch { t.abortController = null; } return t.requestId = (Number(t.requestId) || 0) + 1, N(), ne(), o({ query: c.query || n.title || "Cached", total: Number(c.total ?? c.assets.length) || c.assets.length, done: !!c.done }), xu(t), g.resetCount += 1, a(), r(), t.loading = !1, re(i, c.assets), de({ offset: Math.max(Number(c.assets.length || 0) || 0, Number(c.offset || c.assets.length) || c.assets.length), cursor: c.cursor || null, total: Number(c.total ?? c.assets.length) || c.assets.length, done: !!c.done }), t._mjrLastHydrateKey = s, t._mjrLastHydrateAt = Date.now(), O({ ...e, query: c.query || e.query || "*" }), p = !1, me({ title: c.title || n.title || "Cached" }), !0; } function De(e) { return { getOrCreateState: () => t, ensureVirtualGrid: () => t.virtualGrid, upsertState: cu, maxBatchSize: su, debounceMs: ou, assetKey: (t) => fu(t) || ee(t, e), loadMajoorSettings: mn }; } function Oe(e) { v("upsertRealtime", { appendReason: "realtime" }); let t = y(); return !t || !e || !e.id ? !1 : eu(t, e, De(t)); } let ke = !1; function Ae(e) { v("upsertRealtime", { appendReason: "realtimeImmediate" }); let t = y(); if (!t || !e || !e.id) return !1; let n = eu(t, e, De(t)); return n && !ke && (ke = !0, queueMicrotask(() => { ke = !1; let e = y(); e && $l(e, De(e)); })), n; } function je() { I(t.query || "Cached"); try { Ol(); } catch (e) { console.debug?.(e); } M(), N(); try { t.abortController?.abort?.(); } catch (e) { console.debug?.(e); } let e = y(); if (e) try { let t = Gl(e, cu); t?.timer && (clearTimeout(t.timer), t.timer = null), t?.pending?.clear?.(); } catch (e) { console.debug?.(e); } } try { window.addEventListener("pagehide", je, { once: !0 }); } catch (e) { console.debug?.(e); } return { reload: ve, appendNextPage: he, refreshHead: _e, upsertRealtime: Ae, loadAssets: ve, loadAssetsFromList: ye, loadNextPage: he, prepareGridForScopeSwitch: be, refreshGrid: xe, removeAssets: Se, captureAnchor: Ce, restoreAnchor: Te, hydrateFromSnapshot: Ee, upsertAsset: Oe, upsertAssetNow: Ae, getCanonicalState: x, getDebugSnapshot: S, dispose: je }; } //#endregion //#region node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js function Cu(e, t, n) { let r = Array(e); return new Proxy(r, { get(r, i, a) { if (typeof i == "string") { let a = i.charCodeAt(0); if (a >= 48 && a <= 57) { let a = +i; if (Number.isInteger(a) && a >= 0 && a < e) { let e = r[a]; if (!e) { let i = t[a * 2]; e = r[a] = { index: a, key: n(a), start: i, size: t[a * 2 + 1], end: i + t[a * 2 + 1], lane: 0 }; } return e; } } if (i === "length") return e; } return Reflect.get(r, i, a); } }); } //#endregion //#region node_modules/@tanstack/virtual-core/dist/esm/utils.js function wu(e, t, n) { let r = n.initialDeps ?? [], i, a = !0; function o() { let o = e(); return o.length !== r.length || o.some((e, t) => r[t] !== e) ? (r = o, i = t(...o), n?.onChange && !(a && n.skipInitialOnChange) && n.onChange(i), a = !1, i) : i; } return o.updateDeps = (e) => { r = e; }, o; } function Tu(e, t) { if (e === void 0) throw Error(`Unexpected undefined${t ? `: ${t}` : ""}`); return e; } var Eu = (e, t) => Math.abs(e - t) < 1.01, Du = (e, t, n) => { let r; return Object.assign(function(...i) { e.clearTimeout(r), r = e.setTimeout(() => t.apply(this, i), n); }, { cancel: () => { e.clearTimeout(r); } }); }, Ou, ku = () => { if (Ou !== void 0) return Ou; if (typeof navigator > "u") return Ou = !1; if (/iP(hone|od|ad)/.test(navigator.userAgent)) return Ou = !0; let e = navigator.maxTouchPoints; return Ou = navigator.platform === "MacIntel" && e !== void 0 && e > 0; }, Au = (e) => { let { offsetWidth: t, offsetHeight: n } = e; return { width: t, height: n }; }, ju = (e) => e, Mu = (e) => { let t = Math.max(e.startIndex - e.overscan, 0), n = Math.min(e.endIndex + e.overscan, e.count - 1) - t + 1, r = Array(n); for (let e = 0; e < n; e++) r[e] = t + e; return r; }, Nu = (e, t) => { let n = e.scrollElement; if (!n) return; let r = e.targetWindow; if (!r) return; let i = (e) => { let { width: n, height: r } = e; t({ width: Math.round(n), height: Math.round(r) }); }; if (i(Au(n)), !r.ResizeObserver) return () => {}; let a = new r.ResizeObserver((t) => { let r = () => { let e = t[0]; if (e?.borderBoxSize) { let t = e.borderBoxSize[0]; if (t) { i({ width: t.inlineSize, height: t.blockSize }); return; } } i(Au(n)); }; e.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(r) : r(); }); return a.observe(n, { box: "border-box" }), () => { a.unobserve(n); }; }, Pu = { passive: !0 }, Fu = typeof window > "u" || "onscrollend" in window, Iu = (e, t, n) => { let r = e.scrollElement; if (!r) return; let i = e.targetWindow; if (!i) return; let a = e.options.useScrollendEvent && Fu, o = 0, s = a ? null : Du(i, () => t(o, !1), e.options.isScrollingResetDelay), c = (e) => () => { o = n(r), s?.(), t(o, e); }, l = c(!0), u = c(!1); return r.addEventListener("scroll", l, Pu), a && r.addEventListener("scrollend", u, Pu), () => { r.removeEventListener("scroll", l), a && r.removeEventListener("scrollend", u), s?.cancel(); }; }, Lu = (e, t) => Iu(e, t, (t) => { let { horizontal: n, isRtl: r } = e.options; return n ? t.scrollLeft * (r && -1 || 1) : t.scrollTop; }), Ru = (e, t, n) => { if (n.options.useCachedMeasurements) { let t = n.indexFromElement(e), r = n.options.getItemKey(t); return n.itemSizeCache.get(r) ?? n.options.estimateSize(t); } if (t?.borderBoxSize) { let e = t.borderBoxSize[0]; if (e) return Math.round(e[n.options.horizontal ? "inlineSize" : "blockSize"]); } if (!t) { let t = n.indexFromElement(e), r = n.options.getItemKey(t), i = n.itemSizeCache.get(r); if (i !== void 0) return i; } return e[n.options.horizontal ? "offsetWidth" : "offsetHeight"]; }, zu = (e, { adjustments: t = 0, behavior: n }, r) => { var i, a; (a = (i = r.scrollElement)?.scrollTo) == null || a.call(i, { [r.options.horizontal ? "left" : "top"]: e + t, behavior: n }); }, Bu = class { constructor(e) { this.unsubs = [], this.scrollElement = null, this.targetWindow = null, this.isScrolling = !1, this.scrollState = null, this.measurementsCache = [], this._flatMeasurements = null, this.itemSizeCache = /* @__PURE__ */ new Map(), this.itemSizeCacheVersion = 0, this.laneAssignments = /* @__PURE__ */ new Map(), this.pendingMin = null, this.prevLanes = void 0, this.lanesChangedFlag = !1, this.lanesSettling = !1, this.pendingScrollAnchor = null, this.scrollRect = null, this.scrollOffset = null, this.scrollDirection = null, this.scrollAdjustments = 0, this._iosDeferredAdjustment = 0, this._iosTouching = !1, this._iosJustTouchEnded = !1, this._iosTouchEndTimerId = null, this._intendedScrollOffset = null, this.elementsCache = /* @__PURE__ */ new Map(), this.now = () => { var e; return ((e = this.targetWindow?.performance)?.now)?.call(e) ?? Date.now(); }, this.observer = /* @__PURE__ */ (() => { let e = null, t = () => e || (!this.targetWindow || !this.targetWindow.ResizeObserver ? null : e = new this.targetWindow.ResizeObserver((e) => { e.forEach((e) => { let t = () => { let t = e.target, n = this.indexFromElement(t); if (!t.isConnected) { this.observer.unobserve(t); for (let [e, n] of this.elementsCache) if (n === t) { this.elementsCache.delete(e); break; } return; } this.isIndexInRange(n) && this.shouldMeasureDuringScroll(n) && this.resizeItem(n, this.options.measureElement(t, e, this)); }; this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(t) : t(); }); })); return { disconnect: () => { var n; (n = t()) == null || n.disconnect(), e = null; }, observe: (e) => t()?.observe(e, { box: "border-box" }), unobserve: (e) => t()?.unobserve(e) }; })(), this.range = null, this.setOptions = (e) => { let t = { debug: !1, initialOffset: 0, overscan: 1, paddingStart: 0, paddingEnd: 0, scrollPaddingStart: 0, scrollPaddingEnd: 0, horizontal: !1, getItemKey: ju, rangeExtractor: Mu, onChange: () => {}, measureElement: Ru, initialRect: { width: 0, height: 0 }, scrollMargin: 0, gap: 0, indexAttribute: "data-index", initialMeasurementsCache: [], lanes: 1, anchorTo: "start", followOnAppend: !1, scrollEndThreshold: 1, isScrollingResetDelay: 150, enabled: !0, isRtl: !1, useScrollendEvent: !1, useAnimationFrameWithResizeObserver: !1, laneAssignmentMode: "estimate", useCachedMeasurements: !1 }; for (let n in e) { let r = e[n]; r !== void 0 && (t[n] = r); } let n = this.options, r = null, i = null, a = !1; if (n !== void 0 && n.enabled && t.enabled && t.anchorTo === "end" && this.scrollElement !== null) { let e = n.count, o = t.count, s = this.getMeasurements(), c = e > 0 ? s[0]?.key ?? n.getItemKey(0) : null, l = e > 0 ? s[e - 1]?.key ?? n.getItemKey(e - 1) : null; if (o !== e || e > 0 && o > 0 && (t.getItemKey(0) !== c || t.getItemKey(o - 1) !== l)) { a = !0; let c = e > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? s[0] : null; c && (r = [c.key, this.getScrollOffset() - c.start]); let u = t.followOnAppend === !0 ? "auto" : t.followOnAppend || null; u && o > e && this.isAtEnd(n.scrollEndThreshold) && (e === 0 || t.getItemKey(o - 1) !== l) && (i = u); } } this.options = t, a && (this.pendingMin = 0, this.itemSizeCacheVersion++); let o = !1, s = 0; if (r && this.scrollOffset !== null) { let [e, t] = r, n = this.getMeasurements(), { count: i, getItemKey: a } = this.options, c = 0; for (; c < i && a(c) !== e;) c++; if (c < i) { let e = n[c]; if (e) { let n = Math.max(0, e.start + t); n !== this.scrollOffset && (s = n - this.scrollOffset, this.scrollOffset = n, o = !0); } } } (o || i) && (this.pendingScrollAnchor = [ o ? r[0] : null, o ? r[1] : 0, i, s ]); }, this.notify = (e) => { var t, n; (n = (t = this.options).onChange) == null || n.call(t, this, e); }, this.maybeNotify = wu(() => (this.calculateRange(), [ this.isScrolling, this.range ? this.range.startIndex : null, this.range ? this.range.endIndex : null ]), (e) => { this.notify(e); }, { key: !1, debug: () => this.options.debug, initialDeps: [ this.isScrolling, this.range ? this.range.startIndex : null, this.range ? this.range.endIndex : null ] }), this.cleanup = () => { this.unsubs.filter(Boolean).forEach((e) => e()), this.unsubs = [], this.observer.disconnect(), this.rafId != null && this.targetWindow && (this.targetWindow.cancelAnimationFrame(this.rafId), this.rafId = null), this.scrollState = null, this.isScrolling = !1, this.scrollDirection = null, this._iosDeferredAdjustment = 0, this._iosTouching = !1, this._iosJustTouchEnded = !1, this.scrollElement = null, this.targetWindow = null; }, this._didMount = () => () => { this.cleanup(); }, this._willUpdate = () => { let e = this.options.enabled ? this.options.getScrollElement() : null; if (this.scrollElement !== e) { if (this.cleanup(), !e) { this.maybeNotify(); return; } if (this.scrollElement = e, this.targetWindow = this.scrollElement && "ownerDocument" in this.scrollElement ? this.scrollElement.ownerDocument.defaultView : this.scrollElement?.window ?? null, this.elementsCache.forEach((e) => { this.observer.observe(e); }), this.unsubs.push(this.options.observeElementRect(this, (e) => { this.scrollRect = e, this.maybeNotify(); })), this.unsubs.push(this.options.observeElementOffset(this, (e, t) => { if (t && this._intendedScrollOffset === null && e === this.scrollOffset) return; this._intendedScrollOffset !== null && Math.abs(e - this._intendedScrollOffset) < 1.5 && (e = this._intendedScrollOffset), this._intendedScrollOffset = null, this.scrollAdjustments = 0; let n = this.getScrollOffset(); this.scrollDirection = t ? n === e ? this.scrollDirection : n < e ? "forward" : "backward" : null, this.scrollOffset = e, this.isScrolling = t, this._flushIosDeferredIfReady(), this.scrollState && this.scheduleScrollReconcile(), this.maybeNotify(); })), "addEventListener" in this.scrollElement) { let e = this.scrollElement, t = () => { this._iosTouching = !0, this._iosJustTouchEnded = !1, this._iosTouchEndTimerId !== null && this.targetWindow != null && (this.targetWindow.clearTimeout(this._iosTouchEndTimerId), this._iosTouchEndTimerId = null); }, n = () => { this._iosTouching = !1, !(!ku() || this.targetWindow == null) && (this._iosJustTouchEnded = !0, this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => { this._iosJustTouchEnded = !1, this._iosTouchEndTimerId = null, this._flushIosDeferredIfReady(); }, 150)); }; e.addEventListener("touchstart", t, Pu), e.addEventListener("touchend", n, Pu), this.unsubs.push(() => { e.removeEventListener("touchstart", t), e.removeEventListener("touchend", n), this._iosTouchEndTimerId !== null && this.targetWindow != null && (this.targetWindow.clearTimeout(this._iosTouchEndTimerId), this._iosTouchEndTimerId = null); }); } this._scrollToOffset(this.getScrollOffset(), { adjustments: void 0, behavior: void 0 }); } let t = this.pendingScrollAnchor; if (this.pendingScrollAnchor = null, t && this.scrollElement && this.options.enabled) { let [e, n, r, i] = t; e !== null && !r && (ku() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded) ? i !== 0 && (this._iosDeferredAdjustment += i) : this._scrollToOffset(this.getScrollOffset(), { adjustments: void 0, behavior: void 0 })), r && this.scrollToEnd({ behavior: r }); } }, this._flushIosDeferredIfReady = () => { if (this._iosDeferredAdjustment === 0 || this.isScrolling || this._iosTouching || this._iosJustTouchEnded) return; let e = this.getScrollOffset(), t = this.getMaxScrollOffset(); if (e < 0 || e > t) return; if (this._iosDeferredAdjustment < 0 && e >= t - 1) { this._iosDeferredAdjustment = 0; return; } let n = this._iosDeferredAdjustment; this._iosDeferredAdjustment = 0, this._scrollToOffset(e, { adjustments: this.scrollAdjustments += n, behavior: void 0 }); }, this.rafId = null, this.getSize = () => this.options.enabled ? (this.scrollRect = this.scrollRect ?? this.options.initialRect, this.scrollRect[this.options.horizontal ? "width" : "height"]) : (this.scrollRect = null, 0), this.getScrollOffset = () => this.options.enabled ? (this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset == "function" ? this.options.initialOffset() : this.options.initialOffset), this.scrollOffset) : (this.scrollOffset = null, 0), this.getMeasurementOptions = wu(() => [ this.options.count, this.options.paddingStart, this.options.scrollMargin, this.options.getItemKey, this.options.enabled, this.options.lanes, this.options.laneAssignmentMode, this.options.gap ], (e, t, n, r, i, a, o, s) => (this.prevLanes !== void 0 && this.prevLanes !== a && (this.lanesChangedFlag = !0), this.prevLanes = a, this.pendingMin = null, { count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o, gap: s }), { key: !1 }), this.isIndexInRange = (e) => e >= 0 && e < this.options.count, this.getMeasurements = wu(() => [this.getMeasurementOptions(), this.itemSizeCacheVersion], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o, gap: s }, c) => { let l = this.itemSizeCache; if (!i) return this.measurementsCache = [], this.itemSizeCache.clear(), this.laneAssignments.clear(), []; if (this.laneAssignments.size > e) for (let t of this.laneAssignments.keys()) t >= e && this.laneAssignments.delete(t); this.lanesChangedFlag && (this.lanesChangedFlag = !1, this.lanesSettling = !0, this.measurementsCache = [], this.itemSizeCache.clear(), this.laneAssignments.clear(), this.pendingMin = null), this.measurementsCache.length === 0 && !this.lanesSettling && (this.measurementsCache = this.options.initialMeasurementsCache, this.measurementsCache.forEach((e) => { this.itemSizeCache.set(e.key, e.size); })); let u = this.lanesSettling ? 0 : this.pendingMin ?? 0; if (this.pendingMin = null, this.lanesSettling && this.measurementsCache.length === e && (this.lanesSettling = !1), a === 1) { let i = e * 2, a = this._flatMeasurements; if (!a || a.length < i) { let e = new Float64Array(i); a && u > 0 && e.set(a.subarray(0, u * 2)), a = e, this._flatMeasurements = a; } let o; if (u === 0) o = t + n; else { let e = u - 1; o = a[e * 2] + a[e * 2 + 1] + s; } for (let t = u; t < e; t++) { let e = r(t), n = l.get(e), i = typeof n == "number" ? n : this.options.estimateSize(t); a[t * 2] = o, a[t * 2 + 1] = i, o += i + s; } let c = Cu(e, a, r); return this.measurementsCache = c, c; } let d = this.measurementsCache.slice(0, u), f = Array(a).fill(void 0), p = new Float64Array(a), m = 0; for (let e = 0; e < u; e++) { let t = d[e]; t && (f[t.lane] === void 0 && m++, f[t.lane] = e, p[t.lane] = t.end); } for (let i = u; i < e; i++) { let e = r(i), c = this.laneAssignments.get(i), u, h, g = o === "estimate" || l.has(e); if (c !== void 0 && this.options.lanes > 1) { u = c; let e = f[u], r = e === void 0 ? void 0 : d[e]; h = r ? r.end + s : t + n; } else if (m === a) { let e = 0, t = p[0], n = f[0]; for (let r = 1; r < a; r++) { let i = p[r]; (i < t || i === t && f[r] < n) && (e = r, t = i, n = f[r]); } u = e, h = t + s, g && this.laneAssignments.set(i, u); } else u = i % this.options.lanes, h = t + n, g && this.laneAssignments.set(i, u); let _ = l.get(e), v = typeof _ == "number" ? _ : this.options.estimateSize(i), y = h + v; d[i] = { index: i, start: h, size: v, end: y, key: e, lane: u }, f[u] === void 0 && m++, f[u] = i, p[u] = y; } return this.measurementsCache = d, d; }, { key: !1, debug: () => this.options.debug }), this.calculateRange = wu(() => [ this.getMeasurements(), this.getSize(), this.getScrollOffset(), this.options.lanes ], (e, t, n, r) => e.length === 0 || t === 0 ? (this.range = null, null) : (this.range = Uu(e, t, n, r, r === 1 && this._flatMeasurements != null ? this._flatMeasurements : null), this.range), { key: !1, debug: () => this.options.debug }), this.getVirtualIndexes = wu(() => { let e = null, t = null, n = this.calculateRange(); return n && (e = n.startIndex, t = n.endIndex), this.maybeNotify.updateDeps([ this.isScrolling, e, t ]), [ this.options.rangeExtractor, this.options.overscan, this.options.count, e, t ]; }, (e, t, n, r, i) => r === null || i === null ? [] : e({ startIndex: r, endIndex: i, overscan: t, count: n }), { key: !1, debug: () => this.options.debug }), this.indexFromElement = (e) => { let t = this.options.indexAttribute, n = e.getAttribute(t); return n ? parseInt(n, 10) : (console.warn(`Missing attribute name '${t}={index}' on measured element.`), -1); }, this.shouldMeasureDuringScroll = (e) => { if (!this.scrollState || this.scrollState.behavior !== "smooth") return !0; let t = this.scrollState.index ?? this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)?.index; if (t !== void 0 && this.range) { let n = Math.max(this.options.overscan, Math.ceil((this.range.endIndex - this.range.startIndex) / 2)), r = Math.max(0, t - n), i = Math.min(this.options.count - 1, t + n); return e >= r && e <= i; } return !0; }, this.measureElement = (e) => { if (!e) { this.elementsCache.forEach((e, t) => { e.isConnected || (this.observer.unobserve(e), this.elementsCache.delete(t)); }); return; } let t = this.indexFromElement(e); if (!this.isIndexInRange(t)) return; let n = this.options.getItemKey(t), r = this.elementsCache.get(n); r !== e && (r && this.observer.unobserve(r), this.observer.observe(e), this.elementsCache.set(n, e)), (!this.isScrolling || this.scrollState) && this.shouldMeasureDuringScroll(t) && this.resizeItem(t, this.options.measureElement(e, void 0, this)); }, this.resizeItem = (e, t) => { if (!this.isIndexInRange(e)) return; let n, r, i, a = this._flatMeasurements; if (this.options.lanes === 1 && a !== null) i = this.options.getItemKey(e), r = a[e * 2], n = a[e * 2 + 1]; else { let t = this.measurementsCache[e]; if (!t) return; i = t.key, r = t.start, n = t.size; } let o = this.itemSizeCache.get(i) ?? n, s = t - o; if (s !== 0) { let a = this.options.anchorTo === "end" && this.scrollState?.behavior !== "smooth" && this.getVirtualDistanceFromEnd() <= this.options.scrollEndThreshold, c = a ? this.getTotalSize() : 0, l = this.getScrollOffset() + this.scrollAdjustments, u = this.itemSizeCache.has(i) ? r + o <= l && this.scrollDirection !== "backward" : r < l, d = this.scrollState?.behavior !== "smooth" && (this.shouldAdjustScrollPositionOnItemSizeChange === void 0 ? u : this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[e] ?? { index: e, key: i, start: r, size: n, end: r + n, lane: 0 }, s, this)); (this.pendingMin === null || e < this.pendingMin) && (this.pendingMin = e), this.itemSizeCache.set(i, t), this.itemSizeCacheVersion++; let f = !1; a ? f = this.applyScrollAdjustment(this.getTotalSize() - c) : d && (f = this.applyScrollAdjustment(s)), this.notify(f); } }, this.getVirtualItems = wu(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => { let n = []; for (let r = 0, i = e.length; r < i; r++) { let i = t[e[r]]; n.push(i); } return n; }, { key: !1, debug: () => this.options.debug }), this.getVirtualItemForOffset = (e) => { let t = this.getMeasurements(); if (t.length === 0) return; let n = this._flatMeasurements, r = this.options.lanes === 1 && n != null; return Tu(t[Vu(0, t.length - 1, r ? (e) => n[e * 2] : (e) => Tu(t[e]).start, e)]); }, this.getMaxScrollOffset = () => { if (!this.scrollElement) return 0; if ("scrollHeight" in this.scrollElement) return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight; { let e = this.scrollElement.document.documentElement; return this.options.horizontal ? e.scrollWidth - this.scrollElement.innerWidth : e.scrollHeight - this.scrollElement.innerHeight; } }, this.getVirtualDistanceFromEnd = () => Math.max(this.getTotalSize() - this.getSize() - this.getScrollOffset(), 0), this.getDistanceFromEnd = () => Math.max(this.getMaxScrollOffset() - this.getScrollOffset(), 0), this.isAtEnd = (e = this.options.scrollEndThreshold) => this.getDistanceFromEnd() <= e, this.getOffsetForAlignment = (e, t, n = 0) => { if (!this.scrollElement) return 0; let r = this.getSize(), i = this.getScrollOffset(); t === "auto" && (t = e >= i + r ? "end" : "start"), t === "center" ? e += (n - r) / 2 : t === "end" && (e -= r); let a = this.getMaxScrollOffset(); return Math.max(Math.min(a, e), 0); }, this.getOffsetForIndex = (e, t = "auto") => { e = Math.max(0, Math.min(e, this.options.count - 1)); let n = this.getSize(), r = this.getScrollOffset(), i = this.measurementsCache[e]; if (!i) return; if (t === "auto") { if (i.end >= r + n - this.options.scrollPaddingEnd) t = "end"; else if (i.start <= r + this.options.scrollPaddingStart) t = "start"; else return [r, t]; } if (t === "end" && e === this.options.count - 1) return [this.getMaxScrollOffset(), t]; let a = t === "end" ? i.end + this.options.scrollPaddingEnd : i.start - this.options.scrollPaddingStart; return [this.getOffsetForAlignment(a, t, i.size), t]; }, this.scrollToOffset = (e, { align: t = "start", behavior: n = "auto" } = {}) => { this._iosDeferredAdjustment = 0; let r = this.getOffsetForAlignment(e, t), i = this.now(); this.scrollState = { index: null, align: t, behavior: n, startedAt: i, lastTargetOffset: r, stableFrames: 0 }, this._scrollToOffset(r, { adjustments: void 0, behavior: n }), this.scheduleScrollReconcile(); }, this.scrollToIndex = (e, { align: t = "auto", behavior: n = "auto" } = {}) => { this._iosDeferredAdjustment = 0, e = Math.max(0, Math.min(e, this.options.count - 1)); let r = this.getOffsetForIndex(e, t); if (!r) return; let [i, a] = r, o = this.now(); this.scrollState = { index: e, align: a, behavior: n, startedAt: o, lastTargetOffset: i, stableFrames: 0 }, this._scrollToOffset(i, { adjustments: void 0, behavior: n }), this.scheduleScrollReconcile(); }, this.scrollBy = (e, { behavior: t = "auto" } = {}) => { let n = this.getScrollOffset() + e, r = this.now(); this.scrollState = { index: null, align: "start", behavior: t, startedAt: r, lastTargetOffset: n, stableFrames: 0 }, this._scrollToOffset(n, { adjustments: void 0, behavior: t }), this.scheduleScrollReconcile(); }, this.scrollToEnd = ({ behavior: e = "auto" } = {}) => { if (this.options.count > 0) { this.scrollToIndex(this.options.count - 1, { align: "end", behavior: e }); return; } this.scrollToOffset(Math.max(this.getTotalSize() - this.getSize(), 0), { behavior: e }); }, this.getTotalSize = () => { let e = this.getMeasurements(), t; if (e.length === 0) t = this.options.paddingStart; else if (this.options.lanes === 1) { let n = e.length - 1, r = this._flatMeasurements; t = r == null ? e[n]?.end ?? 0 : r[n * 2] + r[n * 2 + 1]; } else { let n = Array(this.options.lanes).fill(null), r = e.length - 1; for (; r >= 0 && n.some((e) => e === null);) { let t = e[r]; n[t.lane] === null && (n[t.lane] = t.end), r--; } t = Math.max(...n.filter((e) => e !== null)); } return Math.max(t - this.options.scrollMargin + this.options.paddingEnd, 0); }, this.takeSnapshot = () => { let e = []; if (this.itemSizeCache.size === 0) return e; let t = this.getMeasurements(); for (let n of t) n && this.itemSizeCache.has(n.key) && e.push({ index: n.index, key: n.key, start: n.start, size: n.size, end: n.end, lane: n.lane }); return e; }, this._scrollToOffset = (e, { adjustments: t, behavior: n }) => { this._intendedScrollOffset = e + (t ?? 0), this.options.scrollToFn(e, { behavior: n, adjustments: t }, this); }, this.measure = () => { this.pendingMin = null, this.itemSizeCache.clear(), this.laneAssignments.clear(), this.itemSizeCacheVersion++, this.notify(!1); }, this.setOptions(e); } applyScrollAdjustment(e, t) { return e === 0 ? !1 : ku() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded) ? (this._iosDeferredAdjustment += e, !1) : (this._scrollToOffset(this.getScrollOffset(), { adjustments: this.scrollAdjustments += e, behavior: t }), this.scrollOffset !== null && (this.scrollOffset += this.scrollAdjustments, this.scrollOffset < 0 && (this.scrollOffset = 0), this.scrollAdjustments = 0), !0); } scheduleScrollReconcile() { if (!this.targetWindow) { this.scrollState = null; return; } this.rafId ??= this.targetWindow.requestAnimationFrame(() => { this.rafId = null, this.reconcileScroll(); }); } reconcileScroll() { if (!this.scrollState || !this.scrollElement) return; if (this.now() - this.scrollState.startedAt > 5e3) { this.scrollState = null; return; } let e = this.scrollState.index == null ? void 0 : this.getOffsetForIndex(this.scrollState.index, this.scrollState.align), t = e ? e[0] : this.scrollState.lastTargetOffset, n = t !== this.scrollState.lastTargetOffset; if (!n && Eu(t, this.getScrollOffset())) { if (this.scrollState.stableFrames++, this.scrollState.stableFrames >= 1) { this.getScrollOffset() !== t && this._scrollToOffset(t, { adjustments: void 0, behavior: "auto" }), this.scrollState = null; return; } } else if (this.scrollState.stableFrames = 0, n) { let e = this.getSize() || 600, n = Math.abs(t - this.getScrollOffset()), r = this.scrollState.behavior === "smooth" && n > e; this.scrollState.lastTargetOffset = t, r || (this.scrollState.behavior = "auto"), this._scrollToOffset(t, { adjustments: void 0, behavior: r ? "smooth" : "auto" }); } this.scheduleScrollReconcile(); } }, Vu = (e, t, n, r) => { for (; e <= t;) { let i = (e + t) / 2 | 0, a = n(i); if (a < r) e = i + 1; else if (a > r) t = i - 1; else return i; } return e > 0 ? e - 1 : 0; }; function Hu(e, t, n) { let r = 0; for (; r <= t;) { let i = (r + t) / 2 | 0, a = e[i * 2]; if (a < n) r = i + 1; else if (a > n) t = i - 1; else return i; } return r > 0 ? r - 1 : 0; } function Uu(e, t, n, r, i) { let a = e.length - 1; if (e.length <= r) return { startIndex: 0, endIndex: a }; if (r === 1 && i !== null) { let e = Hu(i, a, n), r = e, o = n + t; for (; r < a && i[r * 2] + i[r * 2 + 1] < o;) r++; return { startIndex: e, endIndex: r }; } let o = Vu(0, a, (t) => e[t].start, n), s = o; if (r === 1) for (; s < a && e[s].end < n + t;) s++; else if (r > 1) { let i = Array(r).fill(0); for (; s < a && i.some((e) => e < n + t);) { let t = e[s]; i[t.lane] = t.end, s++; } let c = Array(r).fill(n + t); for (; o >= 0 && c.some((e) => e >= n);) { let t = e[o]; c[t.lane] = t.start, o--; } o = Math.max(0, o - o % r), s = Math.min(a, s + (r - 1 - s % r)); } return { startIndex: o, endIndex: s }; } //#endregion //#region node_modules/@tanstack/vue-virtual/dist/esm/index.js function Wu(e) { let t = new Bu(K(e)), n = yr(t), r = t._didMount(); return ir(() => K(e).getScrollElement(), (e) => { e && t._willUpdate(); }, { immediate: !0 }), ir(() => K(e), (e) => { t.setOptions({ ...e, onChange: (t, r) => { var i; xr(n), (i = e.onChange) == null || i.call(e, t, r); } }), t._willUpdate(), xr(n); }, { immediate: !0 }), vr(r), n; } function Gu(e) { return Wu(G(() => ({ observeElementRect: Nu, observeElementOffset: Lu, scrollToFn: zu, ...K(e) }))); } //#endregion //#region ui/vue/grid/useGridVirtualRows.ts function Ku(e, t = 0) { let n = Number(K(e)); return Number.isFinite(n) ? n : t; } function qu(e = [], t = 1) { let n = Array.isArray(e) ? e : [], r = Math.max(1, Number(t) || 1), i = []; for (let e = 0; e < n.length; e += r) i.push({ index: Math.floor(e / r), items: n.slice(e, e + r) }); return i; } function Ju(e = [], t = 0, n = 1) { let r = Array.isArray(e) ? e : [], i = Math.max(1, Number(n) || 1), a = Math.max(0, Number(t) || 0) * i; return r.slice(a, a + i); } function Yu({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight: i, overscan: a = 8, enabled: o = !0, measure: s = Ru } = {}) { let c = G(() => { if (!K(o)) return 0; let e = K(n); if (Array.isArray(e)) return e.length; let i = K(t) || [], a = Math.max(1, Ku(r, 1)); return Math.ceil((Array.isArray(i) ? i.length : 0) / a); }), l = Gu(G(() => ({ count: c.value, getScrollElement: () => K(e) || null, estimateSize: () => Math.max(1, Ku(i, 120)), overscan: Math.max(0, Ku(a, 8)), measureElement: s }))); return { rowCount: c, virtualizer: l, virtualRows: G(() => { let e = K(n); if (Array.isArray(e)) return l.value.getVirtualItems().map((t) => { let n = e[t.index] || {}; return { key: t.key, index: t.index, virtual: t, items: Array.isArray(n?.items) ? n.items : [], kind: String(n?.kind || "assets"), title: String(n?.title || ""), groupKey: String(n?.groupKey || "") }; }); let i = K(t) || [], a = Math.max(1, Ku(r, 1)); return l.value.getVirtualItems().map((e) => ({ key: e.key, index: e.index, virtual: e, items: Ju(i, e.index, a), kind: "assets", title: "", groupKey: "" })); }), totalSize: G(() => l.value.getTotalSize()), getRowItems: (e) => Ju(K(t) || [], e, Ku(r, 1)) }; } //#endregion //#region ui/vue/grid/useInfiniteTrigger.ts function Xu(e, t = !0) { let n = K(e); return n == null ? t : !!n; } function Zu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) { let o = Z(null), s = null, c = !1; function l() { try { s?.disconnect?.(); } catch (e) { console.debug?.(e); } s = null; } async function u() { if (!c && !(!Xu(t, !0) || !Xu(n, !0)) && typeof r == "function") { c = !0; try { await r(); } finally { c = !1; } } } function d() { l(); let t = o.value; !t || typeof IntersectionObserver != "function" || (s = new IntersectionObserver((e = []) => { e.some((e) => e?.isIntersecting) && u(); }, { root: K(e) || null, rootMargin: i, threshold: a }), s.observe(t)); } return dr() && (fr(d), lr(l), ir(() => [K(e), o.value], () => d(), { flush: "post" })), { sentinelRef: o, connect: d, disconnect: l, maybeLoad: u }; } //#endregion //#region ui/vue/grid/useGridDisplayAssets.ts function Qu(e) { let t = Mt(e?.filename); return t ? `${String(e?.source || e?.type || "").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase()}|${String(e?.subfolder || "").trim().toLowerCase()}|${t}` : ""; } function $u(e) { return !!e; } function ed(e) { let t = Array.isArray(e) ? e : [], n = /* @__PURE__ */ new Map(), r = []; for (let e of t) { if (!e) continue; let t = Qu(e); if (!t) { e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0, r.push(e); continue; } let i = n.get(t); i || (i = [], n.set(t, i), r.push(e)), i.push(e); } for (let e of n.values()) { for (let t of e) t._mjrNameCollision = !1, delete t._mjrNameCollisionCount, delete t._mjrNameCollisionPaths, t._mjrDupStack = !1, t._mjrDupMembers = null, t._mjrDupCount = 0; if (e.length >= 2) { let t = e[0]; t._mjrDupStack = !0, t._mjrDupMembers = e.slice(), t._mjrDupCount = e.length; } } return r; } //#endregion //#region ui/vue/components/grid/VirtualAssetGridHost.vue var td = { key: 0, class: "mjr-grid-loading-overlay", style: { position: "absolute", inset: "0", "z-index": "4", display: "flex", "align-items": "flex-start", "justify-content": "center", padding: "14px", "pointer-events": "none", background: "rgba(20,22,28,0.55)", "backdrop-filter": "blur(2px)" } }, nd = { style: { width: "100%" } }, rd = { style: { "margin-top": "10px", "font-size": "12px", opacity: "0.68", "text-align": "center" } }, id = ["data-index"], ad = [ "aria-expanded", "title", "onClick" ], od = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" }, sd = { class: "mjr-grid-group-separator-title" }, cd = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", "data-mjr-stem", "data-mjr-kind", "data-mjr-live-placeholder", "data-mjr-stacked", "data-mjr-stack-count", "data-mjr-dup-stacked", "data-mjr-dup-count", "aria-label", "aria-selected", "onMousedown", "onClick", "onDblclick" ], ld = { key: 3, style: { display: "flex", "flex-direction": "column", width: "100%" } }, ud = [ "aria-expanded", "title", "onClick" ], dd = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" }, fd = { class: "mjr-grid-group-separator-title" }, pd = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", "data-mjr-stem", "data-mjr-kind", "data-mjr-live-placeholder", "data-mjr-stacked", "data-mjr-stack-count", "data-mjr-dup-stacked", "data-mjr-dup-count", "aria-label", "aria-selected", "onMousedown", "onClick", "onDblclick" ], md = 501, hd = { __name: "VirtualAssetGridHost", props: { scrollElement: { type: [Object, null], default: null }, virtualize: { type: Boolean, default: !0 }, applyDefaultSettingsClasses: { type: Boolean, default: !0 }, onCardRendered: { type: Function, default: null }, onCardDblclick: { type: Function, default: null }, emitWindowSelectionEvents: { type: Boolean, default: !0 } }, setup(e, { expose: t }) { let n = e, r = Z(null), a = Z(1024); Z(!0); let o = Z(0), s = Z(0), c = /* @__PURE__ */ new WeakMap(), l = 0, u = 0, d = 0, f = 0, p = 0, m = /* @__PURE__ */ new Map(), h = null, g = null; function _() { return h ||= import("./chunks/viewerOpenRequest-DQQY02Vk.js").then((e) => e.n), h; } function v() { return g ||= import("./chunks/floatingViewerManager-BVG4XDLW.js").then((e) => e.n), g; } function y(e) { return (Array.isArray(e) ? e : []).slice().sort((e, t) => { let n = Number(e?.mtime || e?.created_at || 0) || 0; return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }); } hr("mjrStackService", { openStackGroup: async (e) => { let t = r.value; if (!t || !e) return; let n = String(e.stack_id || "").trim(); if (!n) return; let i = `stack:${n}`; t._mjrStackMembersCache ||= /* @__PURE__ */ new Map(); let a = t._mjrStackMembersCache.get(i); if (!Array.isArray(a)) { let e = m.get(i); e || (e = ae(Ye(n, { limit: md }), { timeoutMs: 3e4 }).finally(() => { m.delete(i); }), m.set(i, e)); let r = await e; if (r?.ok && Array.isArray(r?.data)) a = r.data, t._mjrStackMembersCache.set(i, a); else return; } let o = y(a); t.dispatchEvent(new CustomEvent(B.OPEN_STACK_GROUP, { bubbles: !0, detail: { asset: e, members: o, title: `Generation group (${o.length} assets)`, stackId: n } })); }, openDupGroup: (e) => { let t = r.value; if (!t || !e) return; let n = Array.isArray(e._mjrDupMembers) ? e._mjrDupMembers : [e]; t.dispatchEvent(new CustomEvent(B.OPEN_STACK_GROUP, { bubbles: !0, detail: { asset: e, members: n, title: `Duplicates - ${n.length} copies`, isDupGroup: !0 } })); } }); let { state: b, selectedIdSet: x, setLoadingMessage: S, clearLoadingMessage: w, setStatusMessage: T, clearStatusMessage: E, resetAssets: D, setSelection: O, reconcileSelection: A, getSelectedAssets: j, getActiveAsset: M } = Mc(); function N(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } let P = G(() => N(n.scrollElement)); function F() { return nu(r.value); } function ee(e, { align: t = "auto" } = {}) { let r = String(e || "").trim(); if (!r) return; let i = (Array.isArray(xe.value) ? xe.value : []).findIndex((e) => String(e?.id || "") === r); if (!(i < 0)) { if (n.virtualize) { let e = Math.floor(i / Math.max(1, Be.value)); try { Ze.value.scrollToIndex(e, { align: t }); } catch (e) { console.debug?.(e); } return; } try { b.cardElements.get(r)?.scrollIntoView?.({ block: "nearest", inline: "nearest" }); } catch (e) { console.debug?.(e); } } } function te() { return Ic(r.value, P.value); } let I = Su({ gridContainerRef: r, state: b, setLoadingMessage: S, clearLoadingMessage: w, setStatusMessage: T, clearStatusMessage: E, resetAssets: D, setSelection: O, reconcileSelection: A, readScrollElement: () => P.value, readRenderedCards: F, scrollToAssetId: ee, canLoadMore: te }), { sentinelRef: ne } = Zu({ rootRef: P, enabled: !0, canLoad: G(() => !b.loading && !b.done && te()), loadMore: () => I.loadNextPage(), rootMargin: "900px" }); function re(e) { let t = String(e?.filename || ""), n = t.lastIndexOf("."); return n >= 0 ? t.slice(n + 1).toUpperCase() : ""; } function ie(e) { let t = String(e?.filename || ""), n = t.lastIndexOf("."); return n >= 0 ? t.slice(0, n).toLowerCase() : t.toLowerCase(); } function oe(e) { return x.value.has(String(e?.id || "")); } function se(e) { return String(e?.kind || "").toLowerCase() === "folder"; } function le(e) { return String(e?.kind || "").toLowerCase() === "workflow"; } function ue() { return String(Ce.value || "").trim().toLowerCase() === "workflow"; } function de(e) { let t = String(e || "none").trim().toLowerCase(); return [ "task", "model", "category" ].includes(t) ? t : "none"; } function fe(e) { let t = String(e || ""), n = 0; for (let e = 0; e < t.length; e += 1) n = (n << 5) - n + t.charCodeAt(e), n |= 0; return `hsl(${Math.abs(n) % 360}deg 68% 60%)`; } function pe(e, t) { return !e || typeof e != "object" ? "Ungrouped" : t === "task" ? String(e?.task || e?.workflow_task || "").trim() || "Task: Unknown" : t === "model" ? String(e?.model_family || e?.workflow_model_family || e?.workflow_model || e?.model || "").trim() || "Model: Unknown" : t === "category" ? String(e?.category || e?.subfolder || e?.workflow_category || "").trim() || "Category: Uncategorized" : "Ungrouped"; } function me(e, t) { return (Array.isArray(e) ? e : []).slice().sort((e, n) => { let r = pe(e, t).toLowerCase(), i = pe(n, t).toLowerCase(); if (r < i) return -1; if (r > i) return 1; let a = Number(e?.mtime || e?.created_at || 0) || 0; return (Number(n?.mtime || n?.created_at || 0) || 0) - a; }); } function he(e, t, n) { let r = me(e, n), i = []; if (!r.length) return i; let a = /* @__PURE__ */ new Map(); for (let e of r) { let t = le(e) ? pe(e, n) : "Other"; a.has(t) || a.set(t, []), a.get(t).push(e); } let o = Array.from(a.keys()); for (let e of o) { let n = a.get(e) || []; i.push({ kind: "header", title: e, groupKey: e, groupCount: n.length, accent: fe(e), items: [] }); for (let r = 0; r < n.length; r += t) i.push({ kind: "assets", title: "", groupKey: e, groupCount: n.length, accent: fe(e), items: n.slice(r, r + t) }); } return i; } function ge(e) { let t = r.value; return !t || String(t.dataset?.mjrGroupStacks || "") !== "1" ? !1 : !!String(e?.stack_id || "").trim() && Number(e?.stack_asset_count || 0) > 1; } function _e(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } function ve() { let e = r.value; if (!e) return; let t = new Set((Array.isArray(b.selectedIds) ? b.selectedIds : []).map((e) => String(e || "").trim()).filter(Boolean)); Qn(e, t, b.activeId || ""); try { t.size ? e.dataset.mjrSelectedAssetId = String(b.activeId || Array.from(t)[0] || "") : delete e.dataset.mjrSelectedAssetId; } catch (e) { console.debug?.(e); } } function ye() { let e = r.value; if (!e) return; let t = Array.isArray(b.selectedIds) ? b.selectedIds.slice() : [], i = String(b.activeId || ""), a = `${t.join("|")}::${i}`; if (a === ye._lastSelectionKey) return; ye._lastSelectionKey = a; let o = { selectedIds: t, activeId: i, selectedAssets: j() }; try { e.dispatchEvent(new CustomEvent("mjr:selection-changed", { detail: o })); } catch (e) { console.debug?.(e); } if (n.emitWindowSelectionEvents) try { window.dispatchEvent(new CustomEvent("mjr:selection-changed", { detail: o })); } catch (e) { console.debug?.(e); } } ye._lastSelectionKey = ""; let be = G(() => ed(b.assets)), xe = G(() => (Array.isArray(be.value) ? be.value : []).filter((e) => $u(e))), Se = Z(/* @__PURE__ */ new Set()), Ce = Z(""), we = G(() => { o.value; let e = de(z.WORKFLOW_GRID_GROUP_BY); return e === "none" || Ce.value !== "workflow" ? "none" : e; }), Te = G(() => { let e = Array.isArray(xe.value) ? xe.value : []; if (!e.length) return []; let t = we.value; return t === "none" ? [] : he(e, Be.value, t); }); ir(() => `${we.value}::${Te.value.map((e) => `${e.kind}:${e.groupKey}`).join("|")}`, () => { if (we.value === "none") { Se.value = /* @__PURE__ */ new Set(); return; } let e = /* @__PURE__ */ new Set(), t = Se.value; for (let n of Te.value) { if (n?.kind !== "header") continue; let r = String(n.groupKey || ""); r && t.has(r) && e.add(r); } Se.value = e; }, { immediate: !0 }); function Ee(e) { let t = String(e || ""); return t ? Se.value.has(t) : !1; } function De(e) { let t = String(e || ""); if (!t) return; let n = new Set(Se.value); n.has(t) ? n.delete(t) : n.add(t), Se.value = n; } function Oe(e) { let t = String(e?.groupKey || e?.title || ""), n = 0; for (let e = 0; e < t.length; e += 1) n = (n << 5) - n + t.charCodeAt(e) | 0; return `mjr-grid-group-separator--accent-${Math.abs(n) % 8}`; } let Ae = G(() => { let e = Array.isArray(xe.value) ? xe.value : []; if (!e.length) return []; if (we.value === "none") return qu(e, Be.value); let t = Array.isArray(Te.value) ? Te.value : [], n = []; for (let e of t) { if (e?.kind === "header") { n.push(e); continue; } Ee(String(e?.groupKey || "")) || n.push(e); } return n; }); function je() { let e = r.value; if (!e) return; let t = { count: Array.isArray(xe.value) ? xe.value.length : 0, total: Number(b.total || 0) || 0 }; try { e.dataset.mjrShown = String(t.count), e.dataset.mjrTotal = String(t.total), e.dataset.mjrHiddenPngSiblings = String(Number(b.hiddenPngSiblings || 0) || 0); } catch (e) { console.debug?.(e); } try { e.dispatchEvent(new CustomEvent("mjr:grid-stats", { detail: t })); } catch (e) { console.debug?.(e); } } function Me(e) { if (!e?.id) return; let t = (Array.isArray(b.assets) ? b.assets : []).find((t) => String(t?.id || "") === String(e.id)); if (t) try { t.rating = e.rating, t.tags = e.tags; } catch (e) { console.debug?.(e); } } function Ne() { try { window.dispatchEvent(new CustomEvent("mjr:open-sidebar", { detail: { tab: "details" } })); } catch (e) { console.debug?.(e); } } function Fe(e, t = 6) { let n = b.cardElements.get(e); if (n) { try { n.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } return; } t <= 0 || requestAnimationFrame(() => Fe(e, t - 1)); } function Ie(e) { let t = e?.detail || {}, n = String(t.assetId ?? t.id ?? "").trim(); n && (Array.isArray(xe.value) ? xe.value : []).some((e) => String(e?.id || "") === n) && (O([n], n), ve(), ye(), ee(n, { align: "center" }), setTimeout(() => Fe(n), 0)); } function Le(e) { if (!e) return; e._mjrSelectionManagedByVue = !0; try { e._mjrPrimaryPointerSelectionUnbind?.(); } catch (e) { console.debug?.(e); } try { mt?.(); } catch (e) { console.debug?.(e); } ji(e, { applySettingsClasses: n.applyDefaultSettingsClasses }); try { mt = vs(e); } catch (e) { console.debug?.(e), mt = null; } e._mjrPrimaryPointerSelectionUnbind = () => {}, e._mjrGetAssets = () => Array.isArray(xe.value) ? xe.value : [], e._mjrSetSelection = (e, t = "") => { let n = O(e, t); return ve(), ye(), n.selectedIds; }; let t = (e, t = {}) => { let n = I.removeAssets(e, t); return je(), n; }; e._mjrRemoveAssets = t, e._mjrGetRenderedCards = () => F(), e._mjrScrollToAssetId = (e, t = {}) => { ee(e, t); }, e._mjrHasAssetId = (e) => (Array.isArray(b.assets) ? b.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => b, e._mjrGetSelectedAssets = () => j(), e._mjrGetActiveAsset = () => M(), e._mjrOnKeyboardAssetChanged = (e) => Me(e), e._mjrOpenKeyboardDetails = () => Ne(); let r = () => (n.applyDefaultSettingsClasses && (Ai(e), o.value += 1), I.refreshGrid()), i = () => { I.prepareGridForScopeSwitch(), I.dispose(), b.cardElements.clear(), e._mjrGridApi = null; }; e._mjrGridApi = { reload: (...e) => I.reload(...e), loadAssetsFromList: (...e) => I.loadAssetsFromList(...e), appendNextPage: (...e) => I.appendNextPage(...e), refreshHead: (...e) => I.refreshHead(...e), upsertRealtime: (...e) => I.upsertRealtime(...e), upsertRealtimeNow: (...e) => I.upsertAssetNow(...e), prepareForScopeSwitch: () => I.prepareGridForScopeSwitch(), refreshGrid: r, captureAnchor: () => I.captureAnchor(), restoreAnchor: (e) => I.restoreAnchor(e), hydrateFromSnapshot: (...e) => I.hydrateFromSnapshot(...e), removeAssets: t, dispose: i, getCanonicalState: () => I.getCanonicalState(), getDebugSnapshot: () => I.getDebugSnapshot() }, e._mjrLoadAssets = (...e) => I.loadAssets(...e), e._mjrLoadAssetsFromList = (...e) => I.loadAssetsFromList(...e), e._mjrPrepareForScopeSwitch = () => I.prepareGridForScopeSwitch(), e._mjrRefreshGrid = r, e._mjrCaptureAnchor = () => I.captureAnchor(), e._mjrRestoreAnchor = (e) => I.restoreAnchor(e), e._mjrHydrateFromSnapshot = (...e) => I.hydrateFromSnapshot(...e), e._mjrUpsertAsset = (e) => I.upsertAsset(e), e._mjrUpsertAssetNow = (e) => I.upsertAssetNow(e), e._mjrGetCanonicalState = () => I.getCanonicalState(), e._mjrGetDebugSnapshot = () => I.getDebugSnapshot(), e._mjrDispose = i; } ir(r, (e) => { e && (Le(e), ve(), je()); }, { immediate: !0 }), ir(() => `${(b.selectedIds || []).join("|")}::${String(b.activeId || "")}`, () => { r.value && (ve(), ye()); }, { flush: "post" }), ir(() => `${Array.isArray(xe.value) ? xe.value.length : 0}::${Number(b.total || 0)}::${Number(b.hiddenPngSiblings || 0)}`, () => { r.value && je(); }, { flush: "post", immediate: !0 }); function ze() { let e = r.value, t = String(e?.dataset?.mjrBottomFeed || "").toLowerCase() === "true", n = Number(z.GRID_MIN_SIZE || 120) || 120; return t ? Math.max(80, Number(z.FEED_GRID_MIN_SIZE || n) || n) : ue() ? Math.max(180, n) : Math.max(80, n); } let Be = G(() => { o.value; let e = Math.max(0, Number(z.GRID_GAP || 10) || 10), t = ze(), n = Number(a.value || 0) || Number(P.value?.clientWidth || 0) || 0; return n <= 0 ? 1 : Math.max(1, Math.floor((n + e) / (t + e))); }), Ve = G(() => (Number(a.value || 0) || Number(P.value?.clientWidth || 0) || 0) > 0), He = G(() => (o.value, Math.max(0, Number(z.GRID_GAP || 10) || 10))), Ue = G(() => { let e = Math.max(1, Be.value), t = Number(a.value || 0) || Number(P.value?.clientWidth || 0) || 0; return t <= 0 ? ze() : Math.max(80, Math.floor((t - He.value * Math.max(0, e - 1)) / e)); }), We = G(() => { o.value; let e = !!z.GRID_SHOW_DETAILS, t = Ue.value, n = e ? 82 : 0; return we.value === "none" ? t + n + He.value : Math.max(48, t + n + He.value); }), Ge = G(() => n.virtualize ? [] : Array.isArray(Ae.value) ? Ae.value : []); function Ke(e) { if (!u) try { u = requestAnimationFrame(() => { u = 0; try { let t = typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(), n = Number(e?.scrollTop || 0) || 0, r = Math.max(16, t - Number(p || t)), i = Math.abs(n - Number(f || n)) / Math.max(1, We.value) * (16 / r); s.value = Math.max(0, Math.min(20, i)), f = n, p = t, d && clearTimeout(d), d = setTimeout(() => { d = 0, s.value = 0; }, 140); } catch (e) { console.debug?.(e); } }); } catch (e) { console.debug?.(e), u = 0; } } function qe() { if (u) { try { cancelAnimationFrame(u); } catch (e) { console.debug?.(e); } u = 0; } if (d) { try { clearTimeout(d); } catch (e) { console.debug?.(e); } d = 0; } s.value = 0; } let Je = Yu({ scrollRef: P, items: xe, rows: Ae, columnCount: Be, estimateRowHeight: We, overscan: G(() => { let e = Math.max(1, We.value), t = P.value?.clientHeight || 0; if (t <= 0) return 6; let n = Math.ceil(t / e), r = Math.ceil(s.value * 3); return Math.max(3, Math.min(30, n + r)); }), enabled: G(() => n.virtualize) }), Xe = Je.rowCount, Ze = Je.virtualizer, Qe = Je.virtualRows, $e = Je.totalSize, et = G(() => { let e = /* @__PURE__ */ new Map(); for (let t of Qe.value) e.set(t.index, t.virtual || t); return e; }), L = G(() => (o.value, !!z.GRID_SHOW_DETAILS)), nt = G(() => { let e = Math.max(1, Number(Be.value || 1)); return Math.max(12, Math.min(36, e * 4)); }), rt = G(() => Array.from({ length: Number(nt.value || 12) }, (e, t) => t)), it = G(() => { let e = Math.max(80, Number(We.value || 0) - Number(He.value || 0)), t = Math.max(80, Number(Ue.value || 0)); return Math.max(0, e - t); }), at = G(() => ({ display: "grid", gridTemplateColumns: `repeat(${Math.max(1, Number(Be.value || 1))}, minmax(0, ${Math.max(80, Number(Ue.value || 0))}px))`, gap: `${He.value}px`, justifyContent: "start", boxSizing: "border-box" })), ot = G(() => ({ width: "100%", minWidth: "0", height: `${Math.max(80, Number(We.value || 0) - Number(He.value || 0))}px`, borderRadius: "12px", border: "1px solid rgba(255,255,255,0.22)", background: "rgba(192,198,206,0.20)", overflow: "hidden", boxShadow: "0 6px 18px rgba(0,0,0,0.24)", boxSizing: "border-box" })), st = G(() => ({ width: "100%", height: `${Math.max(80, Number(Ue.value || 0))}px`, background: "linear-gradient(90deg, rgba(168,174,182,0.40) 0%, rgba(220,225,232,0.54) 50%, rgba(168,174,182,0.40) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" })), ct = G(() => ({ height: "10px", margin: "10px 10px 6px", borderRadius: "8px", width: "72%", background: "linear-gradient(90deg, rgba(162,168,176,0.38) 0%, rgba(214,219,226,0.52) 50%, rgba(162,168,176,0.38) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" })), lt = G(() => ({ height: "10px", margin: "0 10px 10px", borderRadius: "8px", width: "48%", background: "linear-gradient(90deg, rgba(160,166,173,0.34) 0%, rgba(208,214,221,0.48) 50%, rgba(160,166,173,0.34) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" })), ut = G(() => ({ display: L.value ? "block" : "none", minHeight: `${Math.max(0, Number(it.value || 0))}px` })); function dt() { let e = Number(P.value?.clientWidth || 0) || Number(r.value?.clientWidth || 0) || 0; e > 0 && (a.value = e); } let ft = null, pt = null, mt = null, ht = !1; function gt() { let e = String(r.value?.dataset?.mjrScope || "").trim().toLowerCase(); Ce.value !== e && (Ce.value = e); } function _t() { Bt(); let e = () => { Bt(), Kt(); }; try { requestAnimationFrame(() => { requestAnimationFrame(e); }); } catch { setTimeout(e, 0); } for (let t of [ 80, 180, 400 ]) setTimeout(e, t); } fr(() => { _t(), window.addEventListener(B.VIEWER_ACTIVE_ASSET_CHANGED, Ie); }), ir(r, (e) => { try { pt?.disconnect?.(); } catch (e) { console.debug?.(e); } if (pt = null, e) { gt(); try { pt = new MutationObserver(() => { gt(); }), pt.observe(e, { attributes: !0, attributeFilter: ["data-mjr-scope"] }); } catch (e) { console.debug?.(e), pt = null; } } }, { immediate: !0 }), ir(P, (e, t) => { try { ft?.disconnect?.(); } catch (e) { console.debug?.(e); } if (e) { dt(); try { ft = new ResizeObserver(() => { dt(); }), ft.observe(e); } catch (e) { console.debug?.(e), ft = null; } } }, { immediate: !0 }), ir(() => Xe.value, async () => { Ve.value && (await or(), xt(), Vt()); }), ir(() => b.assets, async (e) => { if (!Array.isArray(e) || e.length === 0) { let e = r.value; e?._mjrStackMembersCache && e._mjrStackMembersCache.clear(); } await or(), xt(); }); function vt(e, t) { let n = String(t?.filename || "").trim().toLowerCase(), r = c.get(e); if (r && r !== n) { let t = b.renderedFilenameMap.get(r); t && (t.delete(e), t.size || b.renderedFilenameMap.delete(r)); } if (!n) { c.delete(e); return; } let i = b.renderedFilenameMap.get(n); i || (i = /* @__PURE__ */ new Set(), b.renderedFilenameMap.set(n, i)), i.add(e), c.set(e, n); } function yt(e) { if (!e) return; let t = c.get(e); if (!t) return; let n = b.renderedFilenameMap.get(t); n && (n.delete(e), n.size || b.renderedFilenameMap.delete(t)), c.delete(e); } function bt(e) { let t = String(e || "").trim().toLowerCase(); if (!t) return; let n = b.renderedFilenameMap.get(t), r = Array.from(n || []); if (!r.length) return; let i = (Array.isArray(b.assets) ? b.assets : []).filter((e) => String(e?.filename || "").trim().toLowerCase() === t), a = Math.max(Number(b.filenameCounts?.get?.(t) || 0) || 0, i.length), o = It(i), s = r.find((e) => { let t = String(e._mjrAsset?.id || ""), n = String(o?.id || ""); return t && n && t === n; }) || r[0] || r[0] || null, c = s?._mjrAsset || o || i[0] || null; Yt(c, i); for (let e of r) { delete e.dataset.mjrDupHidden; let t = e._mjrAsset; t && (t._mjrNameCollision = !1, delete t._mjrNameCollisionCount, delete t._mjrNameCollisionPaths, t._mjrDupStack = !1, t._mjrDupMembers = null, t._mjrDupCount = 0, t._mjrDupHidden = !1); } if (!s || !c || a < 2) { for (let e of r); return; } c._mjrDupStack = !0, c._mjrDupMembers = i.length ? i : [c], c._mjrDupCount = c._mjrDupMembers.length, c._mjrNameCollision = !1; } function xt() { for (let e of b.renderedFilenameMap.keys()) bt(e); } function St(e, t) { let i = String(e?.id || "").trim(); if (!i) return; if (!t) { let e = b.cardElements.get(i), t = e ? c.get(e) : ""; yt(e), b.cardElements.delete(i), bt(t); return; } let a = t?.$el ?? t; if (a instanceof HTMLElement) { b.cardElements.set(i, a), a._mjrIsVue = !0, a._mjrAsset = e, a._mjrReactiveAsset = e, a.dataset.mjrKind = String(e?.kind || ""), vt(a, e), bt(String(e?.filename || "").trim().toLowerCase()); try { n.onCardRendered?.(a, e, r.value); } catch (e) { console.debug?.(e); } } } function Ct(e) { return (t) => St(e, t); } function wt(e, t) { try { let n = e?.closest?.("a, button, input, textarea, select, label"); return !!(n && t?.contains?.(n)); } catch { return !1; } } let Tt = { assetId: "", at: 0 }; function Et(e, t) { let n = String(t?.id || "").trim(); if (!n) return; if (e?.type === "click" && Number(e?.detail || 0) > 0) { let e = Date.now() - Number(Tt.at || 0); if (Tt.assetId === n && e >= 0 && e < 500) { Tt.assetId = "", Tt.at = 0; return; } } if (wt(e?.target, e?.currentTarget)) return; let r = Array.isArray(b.assets) ? b.assets : [], i = r.findIndex((e) => String(e?.id || "") === n), a = Array.isArray(b.selectedIds) ? b.selectedIds.slice() : []; if (e?.shiftKey && i >= 0) { let e = String(b.selectionAnchorId || b.activeId || n).trim(), t = r.findIndex((t) => String(t?.id || "") === e), a = t >= 0 ? t : i, o = Math.min(a, i), s = Math.max(a, i), c = r.slice(o, s + 1).map((e) => String(e?.id || "")).filter(Boolean); O(c, n); return; } if (e?.ctrlKey || e?.metaKey) { let e = new Set(a.map(String)); e.has(n) ? e.delete(n) : e.add(n); let t = Array.from(e); O(t, e.has(n) ? n : t[0] || ""); return; } O([n], n); try { b.cardElements.get(n)?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } ue() && le(t) && v().then((e) => e?.floatingViewerManager?.isGraphModeVisible?.() ? At(t) : null).catch((e) => console.debug?.(e)); } function Dt(e, t) { if (Number(e?.button ?? 0) !== 0) return; let n = String(t?.id || "").trim(); if (!n) return; let r = Array.isArray(b.selectedIds) ? b.selectedIds.map(String).filter(Boolean) : []; if (r.includes(n) && r.length > 1 && !e?.ctrlKey && !e?.metaKey && !e?.shiftKey) { Tt.assetId = n, Tt.at = Date.now(); return; } Tt.assetId = n, Tt.at = Date.now(), Et(e, t); } async function Ot(e) { let t = (Array.isArray(b.assets) ? b.assets : []).filter((e) => !se(e)), n = t.findIndex((t) => String(t?.id || "") === String(e?.id || "")); if (!t.length || n < 0) return; let { requestViewerOpen: r } = await _(); r({ assets: t, index: n }); } function kt(e, t = null) { let n = String(e?.id || "").trim(); if (!n) return; let r = b.cardElements.get(n); if (r instanceof HTMLElement) try { let e = r.getBoundingClientRect(), n = Number(t?.clientX || t?.pageX || e.right - 8) || 0, i = Number(t?.clientY || t?.pageY || e.top + 10) || 0, a = new MouseEvent("contextmenu", { bubbles: !0, cancelable: !0, button: 2, clientX: n, clientY: i }); r.dispatchEvent(a); } catch (e) { console.debug?.(e); } } async function At(e, { select: t = !1 } = {}) { try { let n = String(e?.id || "").trim(); t && n && O([n], n); let r = String(e?.filepath || e?.path || e?.full_path || "").trim(), i = e; if (r) try { let t = await C(r, { timeoutMs: 25e3 }), n = t?.data?.workflow || t?.workflow || null, a = t?.data?.prompt || t?.prompt || null; (n || a) && (i = { ...e, workflow: n || e?.workflow, prompt: a || e?.prompt, metadata_raw: { ...e?.metadata_raw && typeof e.metadata_raw == "object" ? e.metadata_raw : {}, ...n ? { workflow: n } : {}, ...a ? { prompt: a } : {} } }); } catch (e) { console.debug?.(e); } let { floatingViewerManager: a } = await v(); await a.openAssets({ assets: [i], index: 0, mode: "graph" }); } catch (e) { console.debug?.(e), Ne(); } } async function jt(e, t) { let n = String(e?.type || "").trim().toLowerCase(); if (!(!n || String(t?.kind || "").toLowerCase() !== "workflow")) { if (n === "load") { await Mt(t); return; } if (n === "inspect") { await At(t, { select: !0 }); return; } if (n === "favorite") { let e = !!t.favorite, n = !e; try { t.favorite = n; let e = String(t?.filepath || t?.path || t?.full_path || "").trim(); if (!e) throw Error("Missing workflow filepath"); let i = await ce({ filepath: e, favorite: n }, { timeoutMs: 12e3 }); if (!i?.ok) throw Error(String(i?.error || "Failed to save workflow favorite")); r.value?.dispatchEvent?.(new CustomEvent("mjr:workflow-favorite-changed", { bubbles: !0, detail: { asset: t, favorite: n } })); } catch (n) { console.debug?.(n), t.favorite = e, k(R("toast.workflowFavoriteFailed", "Failed to update workflow favorite."), "error"); } return; } n === "menu" && kt(t, e?.event || null); } } async function Mt(e) { let t = String(e?.filepath || e?.path || e?.full_path || "").trim(); if (!t) { k(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } let n = tt(); if (Re(n) === !0 && !await Gt(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; let r = await C(t, { timeoutMs: 3e4 }), a = r?.data?.workflow || r?.workflow || null; if (!r?.ok || !a || typeof a != "object") { k(r?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); return; } if (!Pe(a, n).ok) { k(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); return; } try { await i({ filepath: t }, { timeoutMs: 1e4 }); } catch (e) { console.debug?.(e); } k(R("toast.workflowLoaded", "Workflow loaded"), "success", 1800); } function Nt(e) { try { if (typeof n.onCardDblclick == "function") { n.onCardDblclick({ asset: e, assets: Array.isArray(b.assets) ? b.assets : [], gridContainer: r.value }); return; } } catch (e) { console.debug?.(e); } if (se(e)) { try { r.value?.dispatchEvent?.(new CustomEvent("mjr:open-folder-asset", { bubbles: !0, detail: { asset: e } })); } catch (e) { console.debug?.(e); } return; } if (String(e?.kind || "").toLowerCase() === "workflow") { Mt(e); return; } Ot(e); } async function Pt({ asset: e, folderPath: t }) { let n = String(e?.filepath || "").trim(); if (!(!n || !t)) try { let e = await ke({ op: "move_file", path: n, destination: t }); e?.ok ? (k("Moved to folder", "success"), I.reload()) : k(e?.error || "Failed to move file", "error"); } catch (e) { k(e?.message || "Failed to move file", "error"); } } let Ft = null, Lt = null, Rt = 0, zt = ""; function Bt() { dt(); try { Ze.value?.measure?.(); } catch (e) { console.debug?.(e); } } function Vt() { if (!l) try { l = requestAnimationFrame(() => { l = 0; try { Ze.value?.measure?.(); } catch (e) { console.debug?.(e); } }); } catch (e) { console.debug?.(e), l = 0; try { Ze.value?.measure?.(); } catch (e) { console.debug?.(e); } } } function Ht() { Bt(), requestAnimationFrame(() => { requestAnimationFrame(() => { Bt(), Kt(); }); }), setTimeout(() => { Bt(), Kt(); }, 150); } function Ut(e) { if (!e || !n.virtualize) return () => {}; let t = () => { Ke(e); }; e.addEventListener("scroll", t, { passive: !0 }); try { requestAnimationFrame(() => { t(), Kt(); }); } catch { setTimeout(() => { t(), Kt(); }, 0); } return () => { try { e.removeEventListener("scroll", t); } catch (e) { console.debug?.(e); } qe(); }; } ir(P, (e) => { try { Ft?.(); } catch (e) { console.debug?.(e); } Ft = Ut(e); }, { immediate: !0 }); function Wt(e) { let t = Number(e?.clientHeight || 0) || 0; if (t > 0) return t; let n = Number(r.value?.clientHeight || 0) || 0; if (n > 0) return n; try { return Math.max(0, Math.floor(Number(window?.innerHeight || 0) * .7)); } catch { return 0; } } async function Kt() { if (!n.virtualize || !Ve.value || b.loading || b.done) return; let e = P.value; if (!e) return; let t = Array.isArray(b.assets) ? b.assets.length : 0, r = `${t}::${Be.value}`; if (!Lt && !(r === zt && Date.now() - Rt < 500) && (await or(), (Number(e.scrollHeight || 0) || 0) <= Wt(e) + 40)) { let e = t; Lt = Promise.resolve(I.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => { let t = Array.isArray(b.assets) ? b.assets.length : 0; Rt = Date.now(), zt = t === e ? r : "", Lt = null, setTimeout(() => { Kt(); }, 0); }); } } ir(() => `${Array.isArray(b.assets) ? b.assets.length : 0}::${Be.value}::${b.loading}::${b.done}`, () => { Kt(); }, { flush: "post" }); function qt(e) { if (!(!e || !n.virtualize)) try { Ze.value.measureElement(e); } catch (e) { console.debug?.(e); } } function Jt() { return { width: `${Ue.value}px`, flex: `0 0 ${Ue.value}px`, minWidth: `${Ue.value}px` }; } function Xt(e) { return et.value.get(e) || null; } function Zt(e) { let t = Xt(e); return { position: "absolute", left: "0", top: "0", transform: `translateY(${Number(t?.start || 0)}px)`, width: "100%", display: "flex", gap: `${He.value}px`, paddingBottom: `${He.value}px`, boxSizing: "border-box" }; } function Qt() { return { display: "flex", gap: `${He.value}px`, paddingBottom: `${He.value}px`, boxSizing: "border-box" }; } function $t() { o.value += 1, n.applyDefaultSettingsClasses && r.value && Ai(r.value); } return ir(() => n.applyDefaultSettingsClasses, () => { r.value && n.applyDefaultSettingsClasses && Ai(r.value); }, { immediate: !0 }), lr(() => { try { window.removeEventListener(B.VIEWER_ACTIVE_ASSET_CHANGED, Ie); } catch (e) { console.debug?.(e); } try { r.value?._mjrPrimaryPointerSelectionUnbind?.(); } catch (e) { console.debug?.(e); } try { r.value && (r.value._mjrPrimaryPointerSelectionUnbind = null, r.value._mjrSelectionManagedByVue = !1); } catch (e) { console.debug?.(e); } try { ft?.disconnect?.(); } catch (e) { console.debug?.(e); } try { pt?.disconnect?.(); } catch (e) { console.debug?.(e); } try { Ft?.(); } catch (e) { console.debug?.(e); } try { l && cancelAnimationFrame(l); } catch (e) { console.debug?.(e); } l = 0, qe(); try { I.dispose(); } catch (e) { console.debug?.(e); } try { mt?.(); } catch (e) { console.debug?.(e); } mt = null; try { window.removeEventListener("mjr-settings-changed", $t), ht = !1; } catch (e) { console.debug?.(e); } try { window.removeEventListener("mjr:keepalive-attached", Ht); } catch (e) { console.debug?.(e); } }), ir(r, (e) => { e && (ht ||= (window.addEventListener("mjr-settings-changed", $t), window.addEventListener("mjr:keepalive-attached", Ht), !0)); }, { immediate: !0 }), t({ get gridContainer() { return r.value; }, get assets() { return Array.isArray(b.assets) ? b.assets : []; }, loadAssets(...e) { return I.loadAssets(...e); }, loadAssetsFromList(...e) { return I.loadAssetsFromList(...e); }, loadNextPage(...e) { return I.loadNextPage(...e); }, appendNextPage(...e) { return I.appendNextPage(...e); }, refreshHead(...e) { return I.refreshHead(...e); }, upsertRealtime(...e) { return I.upsertRealtime(...e); }, prepareGridForScopeSwitch(...e) { return I.prepareGridForScopeSwitch(...e); }, refreshGrid(...e) { return I.refreshGrid(...e); }, removeAssets(...e) { return I.removeAssets(...e); }, upsertAsset(...e) { return I.upsertAsset(...e); }, getCanonicalState(...e) { return I.getCanonicalState(...e); }, getDebugSnapshot(...e) { return I.getDebugSnapshot(...e); }, captureAnchor(...e) { return I.captureAnchor(...e); }, restoreAnchor(...e) { return I.restoreAnchor(...e); }, hydrateFromSnapshot(...e) { return I.hydrateFromSnapshot(...e); }, dispose() { return I.dispose(); } }), (t, n) => (V(), Y("div", { ref_key: "gridContainerRef", ref: r, class: "mjr-grid", tabindex: "0", role: "grid", style: { position: "relative", "min-height": "100%" } }, [ K(b).loading && !K(b).assets.length ? (V(), Y("div", td, [U("div", nd, [U("div", { class: "mjr-grid-skeleton-layout", style: Cr(at.value) }, [(V(!0), Y(H, null, ar(rt.value, (e) => (V(), Y("div", { key: `sk-${e}`, class: "mjr-grid-skeleton-card", style: Cr(ot.value) }, [U("div", { class: "mjr-grid-skeleton-thumb mjr-grid-skeleton-shimmer", style: Cr(st.value) }, null, 4), U("div", { style: Cr(ut.value) }, [U("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--title mjr-grid-skeleton-shimmer", style: Cr(ct.value) }, null, 4), U("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--meta mjr-grid-skeleton-shimmer", style: Cr(lt.value) }, null, 4)], 4)], 4))), 128))], 4), U("div", rd, q(K(b).loadingMessage || "Loading assets..."), 1)])])) : W("", !0), K(b).statusMessage && !K(b).assets.length && !K(b).loading ? (V(), Y("div", { key: 1, class: "mjr-grid-message", style: Cr({ position: "absolute", inset: "0", zIndex: 3, display: "flex", alignItems: "center", justifyContent: "center", padding: "16px", textAlign: "center", pointerEvents: "none", fontSize: "14px", lineHeight: "1.4", color: K(b).statusError ? "var(--error-text, #f44336)" : "var(--muted-text, #bdbdbd)", background: "rgba(0, 0, 0, 0.35)" }) }, q(K(b).statusMessage), 5)) : W("", !0), e.virtualize ? (V(), Y("div", { key: 2, style: Cr({ height: `${K($e)}px`, position: "relative", width: "100%", gridColumn: "1 / -1" }) }, [(V(!0), Y(H, null, ar(K(Qe), (e) => (V(), Y("div", { key: e.key, ref_for: !0, ref: qt, "data-index": e.index, style: Cr(Zt(e.index)) }, [e.kind === "header" ? (V(), Y("button", { key: 0, type: "button", class: X(["mjr-grid-group-separator", Oe(e)]), "aria-expanded": Ee(e.groupKey) ? "false" : "true", title: `${Ee(e.groupKey) ? "Open" : "Close"} group`, onClick: (t) => De(e.groupKey) }, [U("span", od, [U("i", { class: X(["pi", Ee(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", sd, q(e.title), 1)], 10, ad)) : e.items.length ? (V(!0), Y(H, { key: 1 }, ar(e.items, (e) => (V(), Y(H, { key: String(e.id) }, [se(e) ? (V(), nr(Ac, { key: 0, ref_for: !0, ref: Ct(e), asset: e, selected: oe(e), style: Cr(Jt()), onMousedown: pr((t) => Dt(t, e), ["left"]), onClick: (t) => Et(t, e), onDblclick: pr((t) => Nt(e), ["stop"]), onDropAsset: Pt }, null, 8, [ "asset", "selected", "style", "onMousedown", "onClick", "onDblclick" ])) : (V(), Y("div", { key: 1, ref_for: !0, ref: Ct(e), class: X(["mjr-asset-card mjr-card", { "is-selected": oe(e), "mjr-live-placeholder": _e(e) }]), role: "button", tabindex: "0", draggable: "true", style: Cr(Jt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": re(e), "data-mjr-stem": ie(e), "data-mjr-kind": String(e.kind || ""), "data-mjr-live-placeholder": _e(e) ? "true" : void 0, "data-mjr-stacked": ge(e) ? "true" : void 0, "data-mjr-stack-count": ge(e) ? String(e.stack_asset_count || 0) : void 0, "data-mjr-dup-stacked": e._mjrDupStack ? "true" : void 0, "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": oe(e) ? "true" : "false", onMousedown: pr((t) => Dt(t, e), ["left"]), onClick: (t) => Et(t, e), onDblclick: pr((t) => Nt(e), ["stop"]) }, [J(Tc, { asset: e, onWorkflowAction: (t) => jt(t, e) }, null, 8, ["asset", "onWorkflowAction"])], 46, cd))], 64))), 128)) : W("", !0)], 12, id))), 128))], 4)) : (V(), Y("div", ld, [(V(!0), Y(H, null, ar(Ge.value, (e) => (V(), Y("div", { key: `${e.kind || "assets"}-${e.groupKey || ""}-${e.index ?? ""}`, style: Cr(Qt()) }, [e.kind === "header" ? (V(), Y("button", { key: 0, type: "button", class: X(["mjr-grid-group-separator", Oe(e)]), "aria-expanded": Ee(e.groupKey) ? "false" : "true", title: `${Ee(e.groupKey) ? "Open" : "Close"} group`, onClick: (t) => De(e.groupKey) }, [U("span", dd, [U("i", { class: X(["pi", Ee(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", fd, q(e.title), 1)], 10, ud)) : (V(!0), Y(H, { key: 1 }, ar(e.items, (e) => (V(), Y(H, { key: String(e.id) }, [se(e) ? (V(), nr(Ac, { key: 0, ref_for: !0, ref: Ct(e), asset: e, selected: oe(e), style: Cr(Jt()), onMousedown: pr((t) => Dt(t, e), ["left"]), onClick: (t) => Et(t, e), onDblclick: pr((t) => Nt(e), ["stop"]), onDropAsset: Pt }, null, 8, [ "asset", "selected", "style", "onMousedown", "onClick", "onDblclick" ])) : (V(), Y("div", { key: 1, ref_for: !0, ref: Ct(e), class: X(["mjr-asset-card mjr-card", { "is-selected": oe(e), "mjr-live-placeholder": _e(e) }]), role: "button", tabindex: "0", draggable: "true", style: Cr(Jt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": re(e), "data-mjr-stem": ie(e), "data-mjr-kind": String(e.kind || ""), "data-mjr-live-placeholder": _e(e) ? "true" : void 0, "data-mjr-stacked": ge(e) ? "true" : void 0, "data-mjr-stack-count": ge(e) ? String(e.stack_asset_count || 0) : void 0, "data-mjr-dup-stacked": e._mjrDupStack ? "true" : void 0, "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": oe(e) ? "true" : "false", onMousedown: pr((t) => Dt(t, e), ["left"]), onClick: (t) => Et(t, e), onDblclick: pr((t) => Nt(e), ["stop"]) }, [J(Tc, { asset: e, onWorkflowAction: (t) => jt(t, e) }, null, 8, ["asset", "onWorkflowAction"])], 46, pd))], 64))), 128))], 4))), 128))])), U("div", { ref_key: "infiniteSentinelRef", ref: ne, "aria-hidden": "true", style: { height: "1px", width: "100%", "pointer-events": "none", "grid-column": "1 / -1" } }, null, 512) ], 512)); } }, gd = 240, _d = 120, vd = 80, yd = null, bd = null; function xd() { return yd ||= import("./chunks/viewerOpenRequest-DQQY02Vk.js").then((e) => e.n), yd; } function Sd() { return bd ||= import("./chunks/floatingViewerManager-BVG4XDLW.js").then((e) => e.n), bd; } function Cd(e) { let t = document.createElement("button"); t.type = "button", t.className = "mjr-asset-card mjr-card mjr-feed-group-member-card", t.style.cssText = "display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;min-height:110px;padding:8px;border:1px solid var(--mjr-border,#444);border-radius:8px;background:var(--mjr-surface,#202020);color:inherit;text-align:left;overflow:hidden;"; try { t.dataset.mjrAssetId = String(e?.id || ""); } catch (e) { console.debug?.(e); } let n = document.createElement("div"); return n.className = "mjr-feed-group-member-name", n.style.cssText = "font-size:11px;font-weight:600;line-height:1.3;word-break:break-word;", n.textContent = String(e?.filename || "Asset"), t.appendChild(n), t; } function wd(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); if (Array.isArray(t)) return t; } } catch (e) { console.debug?.(e); } try { return Array.from(e?.querySelectorAll?.(".mjr-asset-card") || []); } catch (e) { return console.debug?.(e), []; } } function Td(e, t, n = "") { let r = Array.isArray(t) ? t.map(String).filter(Boolean) : []; return $n(e, r, { activeId: n || r[0] || "" }, wd); } function Ed(e) { let t = e?.grid; if (!t) return; let n = (e) => { if (e.defaultPrevented) return; let n = e.target?.closest?.(".mjr-asset-card"); if (!n || !t.contains(n)) return; let r = e.target?.closest?.("a, button, input, textarea, select, label"); if (r && r !== n && n.contains(r)) return; let i = String(n.dataset?.mjrAssetId || "").trim(); if (!i) return; try { window.__MJR_LAST_SELECTION_GRID__ = t; } catch (e) { console.debug?.(e); } let a = wd(t), o = a.indexOf(n), s = Yn(t); if (e.shiftKey && o >= 0) { let n = Number.isFinite(Number(t._mjrLastSelectedIndex)) ? Number(t._mjrLastSelectedIndex) : o, r = Math.min(n, o), s = Math.max(n, o), c = a.slice(r, s + 1).map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean); Td(t, c, i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); return; } if (e.ctrlKey || e.metaKey) { s.has(i) ? s.delete(i) : s.add(i); let n = Array.from(s); Td(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); return; } Td(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); try { n.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } e.preventDefault(), e.stopPropagation(); }; t.addEventListener("click", n, !0), e._disposeSelection = () => { try { t.removeEventListener("click", n, !0); } catch (e) { console.debug?.(e); } }; } var Dd = { hosts: /* @__PURE__ */ new Set(), pendingAssets: /* @__PURE__ */ new Map() }; function Od(e) { if (!z.EXECUTION_GROUPING_ENABLED) return Ud(e); let t = String(e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.job_id || "").trim(); return n ? `job:${n}` : Ud(e); } function kd(e) { let t = /* @__PURE__ */ new Map(); for (let n of Array.isArray(e) ? e : []) { let e = Gd(n); if (!e) continue; let r = Od(e), i = t.get(r); i || (i = { key: r, members: [] }, t.set(r, i)), i.members.push(e); } let n = []; for (let e of t.values()) { e.members.sort((e, t) => { let n = Number(e?.mtime || e?.created_at || 0) || 0; return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }); let t = e.members[0]; n.push({ ...t, _mjrFeedGroupKey: e.key, _mjrFeedGroupCount: e.members.length, _mjrFeedGroupAssets: e.members.slice() }); } return n.sort((e, t) => { let n = Number(e?.mtime || e?.created_at || 0) || 0; return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }), n; } function Ad(e) { return Array.from(e?.assetsByKey?.values?.() || []); } function jd(e) { return String(e ?? "").trim().toLowerCase(); } function Md(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } function Nd(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; } catch (e) { console.debug?.(e); } return e; } function Pd(e) { if (!e || typeof e != "object") return ""; let t = jd(e?.type || e?.source || "output"), n = jd(e?.root_id || e?.custom_root_id || ""), r = jd(e?.subfolder || ""), i = jd(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; let a = jd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } function Fd(e, t) { let n = Gd(t); if (!e || typeof e.set != "function" || !n) return null; let r = Ud(n), i = Pd(n), a = ""; if (i) { for (let [t, n] of e.entries()) if (Pd(n) === i) { a = t; break; } } let o = a ? e.get(a) : null, s = o ? { ...o, ...n } : n; return Md(n) || Nd(s), a && a !== r && e.delete(a), e.set(r, s), s; } function Id(e, t) { return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), Fd(e.assetsByKey, t)) : null; } function Ld(e) { !e?.grid || !e.loaded || (e._renderTimer ||= setTimeout(() => { e._renderTimer = null, Hd(e); }, vd)); } function Rd(e, t, n = 0) { let r = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets.filter(Boolean) : [t].filter(Boolean); if (!r.length) return; let i = Math.max(0, Math.min(n, r.length - 1)), a = r[i] || null, o = String(a?.id || "").trim(); if (e?.grid && o) { try { window.__MJR_LAST_SELECTION_GRID__ = e.grid; } catch (e) { console.debug?.(e); } Td(e.grid, [o], o); } xd().then((e) => e.requestViewerOpen({ assets: r, index: i })).catch((e) => console.debug?.(e)); } function zd(e, t) { let n = document.createElement("div"); n.className = "mjr-popover mjr-feed-group-popover", n.style.cssText = "display:none; width:min(440px, 92vw); padding:10px;"; let r = document.createElement("div"); r.className = "mjr-feed-group-popover-title", r.textContent = R("bottomFeed.groupTitle", "Generation group"), r.style.cssText = "font-size:12px; font-weight:700; opacity:0.92; margin-bottom:8px;", n.appendChild(r); let i = document.createElement("div"); i.className = "mjr-feed-group-popover-grid", i.style.cssText = "display:grid; grid-template-columns:repeat(auto-fill, minmax(110px, 1fr)); gap:8px; max-height:360px; overflow-y:auto; overscroll-behavior:contain;"; let a = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets : []; for (let r = 0; r < a.length; r += 1) { let o = a[r], s = Cd(o); s.classList.add("mjr-feed-group-member-card"), r === 0 && s.classList.add("mjr-feed-group-member-card--cover"), s.addEventListener("click", (i) => { i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), Rd(e, t, r); }), i.appendChild(s); } return n.appendChild(i), e.root.appendChild(n), n; } function Bd(e, t, n) { if (!t || !n) return; let r = Number(n?._mjrFeedGroupCount || 0) || 0; if (r <= 1 || (t.dataset.mjrFeedGrouped = "true", t.dataset.mjrFeedGroupCount = String(r), t.dataset.mjrStacked = "true", t.dataset.mjrStackCount = String(r), t.querySelector(".mjr-feed-group-button"))) return; let i = document.createElement("button"); i.type = "button", i.className = "mjr-feed-group-button", i.title = R("bottomFeed.groupOpen", "Show other assets from this generation"), i.setAttribute("aria-label", `${r} assets`); let a = document.createElement("span"); a.className = "mjr-feed-group-button-icon pi pi-clone", i.appendChild(a); let o = document.createElement("span"); o.className = "mjr-feed-group-button-count", o.textContent = String(r), i.appendChild(o), i.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", lo(i); let s = zd(e, n); i.addEventListener("click", (t) => { t.preventDefault(), t.stopPropagation(), e.popoverManager?.toggle?.(s, i); }), t.appendChild(i); } function Vd(e, t) { let n = new Map((Array.isArray(t) ? t : []).map((e) => [String(e?.id || "").trim(), e]).filter(([e]) => !!e)); for (let t of wd(e?.grid)) { let r = String(t?.dataset?.mjrAssetId || "").trim(), i = n.get(r); i && Bd(e, t, i); } } async function Hd(e) { if (!e?.grid) return; try { e.popoverManager?.closeAll?.(); } catch (e) { console.debug?.(e); } try { let t = e.root?.querySelectorAll?.(".mjr-feed-group-popover") || []; for (let e of t) e.remove?.(); } catch (e) { console.debug?.(e); } let t = kd(Ad(e)), n = await Fi(e.grid, t, { title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); Vd(e, t), Number(n?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } function Ud(e) { let t = String(e?.id || "").trim(); if (t) return `id:${t}`; let n = String(e?.filename || "").trim(), r = String(e?.subfolder || "").trim(); return `file:${String(e?.source || e?.type || "").trim()}:${r}:${n}`; } function Wd(e) { let t = String(e || "").split(".").pop()?.toUpperCase() ?? "", n = /* @__PURE__ */ new Set([ "MP4", "WEBM", "MOV", "AVI", "MKV" ]), r = /* @__PURE__ */ new Set([ "MP3", "WAV", "OGG", "FLAC", "AAC", "M4A" ]), i = /* @__PURE__ */ new Set([ "OBJ", "FBX", "GLB", "GLTF", "STL", "PLY", "SPLAT", "KSPLAT", "SPZ" ]); return n.has(t) ? "video" : r.has(t) ? "audio" : i.has(t) ? "model3d" : "image"; } function Gd(e) { if (!e || typeof e != "object") return null; let t = { ...e }; return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= Wd(t.ext || t.filename || ""), t; } function Kd(e) { let t = Gd(e); if (!t) return null; let n = Ud(t); if (!n) return null; let r = Pd(t), i = null; if (r) for (let [e, t] of Dd.pendingAssets.entries()) e !== n && Pd(t) === r && (i = t, Dd.pendingAssets.delete(e)); let a = Dd.pendingAssets.get(n) || i || null, o = a ? { ...a, ...t } : t; if (Md(t) || Nd(o), Dd.pendingAssets.set(n, o), Dd.pendingAssets.size > 64) { let e = Dd.pendingAssets.keys().next().value; e && Dd.pendingAssets.delete(e); } return o; } function qd() { return Array.from(Dd.pendingAssets.values()); } async function Jd(e) { if (e?.grid) { e.empty.style.display = "none", e.empty.textContent = R("bottomFeed.loading", "Loading recent assets..."); try { e.assetsByKey = /* @__PURE__ */ new Map(); let t = [], n = 0; for (; n < gd;) { let r = L({ q: "*", limit: Math.min(_d, gd - n), offset: n, scope: "output", sort: "mtime_desc", includeTotal: n === 0 }), i = await ae(r, { timeoutMs: 3e4 }); if (!i?.ok) throw Error(String(i?.error || "Failed to load feed assets")); let a = Array.isArray(i?.data?.assets) ? i.data.assets : []; if (!a.length) break; for (let n of a) { let r = Id(e, n); r && t.push(r); } if (a.length < _d) break; n += a.length; } for (let t of qd()) Id(e, t); Dd.pendingAssets.clear(); let r = kd(Ad(e)), i = await Fi(e.grid, r, { title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); Vd(e, r), Number(i?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } catch (t) { console.debug?.(t), e.empty.textContent = R("bottomFeed.loadFailed", "Failed to load generated assets."), e.empty.style.display = ""; } finally { e.loaded = !0; } } } async function Yd() { for (let e of Array.from(Dd.hosts)) try { await Jd(e); } catch (e) { console.debug?.(e); } } function Xd() { Yd(); } function Zd(e) { let t = document.createElement("div"); t.textContent = R("bottomFeed.loading", "Loading recent assets..."), t.style.cssText = "font-size:11px; opacity:0.65; padding:4px 2px 8px 2px;", e.root.appendChild(t), e.empty = t; } function Qd(e) { if (!e) return; let t = [ e, e.parentElement, e.parentElement?.parentElement ]; for (let e of t) if (!(!e || !(e instanceof HTMLElement))) try { e.style.minHeight = "0"; } catch (e) { console.debug?.(e); } try { e.style.height = "100%", e.style.minHeight = "0", e.style.overflow = "hidden", e.style.display = "flex", e.style.flexDirection = "column"; } catch (e) { console.debug?.(e); } } function $d(e) { if (!e) return; let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; t("mjr-feed-show-info", z.FEED_SHOW_INFO), t("mjr-feed-show-filename", z.FEED_SHOW_FILENAME), t("mjr-feed-show-dimensions", z.FEED_SHOW_DIMENSIONS), t("mjr-feed-show-date", z.FEED_SHOW_DATE), t("mjr-feed-show-gentime", z.FEED_SHOW_GENTIME), t("mjr-show-hover-info", z.GRID_SHOW_HOVER_INFO), t("mjr-feed-show-dot", z.FEED_SHOW_WORKFLOW_DOT), t("mjr-feed-show-badges-ext", z.FEED_SHOW_BADGES_EXTENSION), t("mjr-feed-show-badges-rating", z.FEED_SHOW_BADGES_RATING), t("mjr-feed-show-badges-tags", z.FEED_SHOW_BADGES_TAGS); } function ef(e, t = null) { let n = t || document.createElement("div"); n.classList.add("mjr-am-grid-scroll"), n.style.position = "relative", n.style.flex = "1 1 auto", n.style.minHeight = "0", n.style.height = "100%", n.style.overflow = "auto", n.style.scrollbarGutter = "stable", n.style.overscrollBehavior = "contain", n.style.webkitOverflowScrolling = "touch"; let r = () => { try { window.__MJR_LAST_SELECTION_GRID__ = e.grid; } catch (e) { console.debug?.(e); } }, i = () => { r(); try { window.dispatchEvent(new Event(B.MFV_OPEN)); } catch (e) { console.debug?.(e); } }, a = document.createElement("div"); n.appendChild(a), e.root.appendChild(n); let { app: o } = Vn(hd, { scrollElement: n, virtualize: !1, applyDefaultSettingsClasses: !1, emitWindowSelectionEvents: !0, onCardRendered: (t, n) => { try { Bd(e, t, n); } catch (e) { console.debug?.(e); } }, onCardDblclick: () => { i(); } }), s = o.mount(a), c = s?.gridContainer || a.querySelector?.(".mjr-grid") || null; if (e.gridApp = o, e.gridVm = s, e.grid = c, !c) return; c.style.minHeight = "100%", c.style.height = "auto", c.dataset.mjrScope = "output", c.dataset.mjrQuery = "*", c.dataset.mjrSort = "mtime_desc", c.dataset.mjrBottomFeed = "true"; let l = Number(z.FEED_GRID_MIN_SIZE || z.GRID_MIN_SIZE || 120); c.dataset.mjrFeedMinItemWidth = String(l), c.style.setProperty("--mjr-grid-min-size", `${l}px`), c.addEventListener("keydown", (e) => { let t = e?.key?.toLowerCase?.() || ""; if (!(e?.ctrlKey || e?.metaKey || e?.altKey)) { if (t === "v") { e.preventDefault?.(), e.stopPropagation?.(), i(); return; } if (t === "c") { e.preventDefault?.(), e.stopPropagation?.(), r(); try { Sd().then(async ({ floatingViewerManager: e }) => { await e.open(), e.toggleCompareAB(); }).catch((e) => console.debug?.(e)); } catch (e) { console.debug?.(e); } } } }), c.addEventListener("pointerdown", r, !0), c.addEventListener("focusin", r, !0), e._disposeFeedFocus = () => { try { c.removeEventListener("pointerdown", r, !0); } catch (e) { console.debug?.(e); } try { c.removeEventListener("focusin", r, !0); } catch (e) { console.debug?.(e); } }; } function tf(e) { let t = e?.grid; if (!t) return []; let n = Yn(t); return n.size ? Ad(e).filter((e) => n.has(String(e?.id || ""))) : []; } function nf(e) { let t = e?.grid; if (!t) return null; let n = String(t.dataset?.mjrSelectedAssetId || "").trim(); return n ? Ad(e).find((e) => String(e?.id || "") === n) || null : tf(e)[0] || null; } function rf(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); } catch (e) { console.debug?.(e); } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } function af(e) { let t = e?.grid; if (!t) return; let n = () => { try { Ld(e); } catch (e) { console.debug?.(e); } }; e.keyboard = ea({ gridContainer: t, getState: () => ({ assets: kd(Ad(e)) }), getSelectedAssets: () => tf(e), getActiveAsset: () => nf(e), onOpenTagsEditor: (e) => { let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${rf(e?.id || "")}"]`) || null, i = null; try { i = r?.getBoundingClientRect?.() || t.getBoundingClientRect(); } catch (e) { console.debug?.(e); } eo(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), e, n); }, onAssetChanged: n }), e.keyboard.bind(), e.ratingHotkeys = co({ gridContainer: t, createRatingBadge: _t }), e.ratingHotkeys.bind(); } var of = 60, sf = 600, cf = 10; function lf(e, t) { let n = Math.max(of, Math.min(sf, Math.round(Number(t) / cf) * cf)); if (e?.grid) try { e.grid.style.setProperty("--mjr-grid-min-size", `${n}px`); } catch (e) { console.debug?.(e); } z.FEED_GRID_MIN_SIZE = n; try { let e = mn(); e.feed.minSize = n, Xt(e), Cn(e); } catch (e) { console.debug?.(e); } try { window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { key: "feed.minSize" } })); } catch (e) { console.debug?.(e); } if (e?._sizeToolbar) try { let t = e._sizeToolbar.querySelector(".mjr-feed-size-slider"), r = e._sizeToolbar.querySelector(".mjr-feed-size-display"); t && (t.value = String(n)), r && (r.textContent = `${n}px`); } catch (e) { console.debug?.(e); } return n; } function uf(e) { let t = Math.max(of, Number(z.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); n.className = "mjr-feed-toolbar", n.style.cssText = "display:flex; align-items:center; gap:5px; padding:0 2px 5px 2px; flex-shrink:0; user-select:none;"; let r = document.createElement("span"); r.textContent = R("bottomFeed.cardSize", "Cards:"), r.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; flex-shrink:0;", n.appendChild(r); let i = document.createElement("button"); i.type = "button", i.className = "mjr-feed-size-btn", i.textContent = "-", i.title = R("bottomFeed.cardSizeDecrease", "Decrease card size"), i.style.cssText = "width:20px; height:20px; padding:0; border:1px solid var(--mjr-border,#555); border-radius:4px; background:var(--mjr-surface,#2a2a2a); color:inherit; cursor:pointer; font-size:14px; line-height:1; flex-shrink:0; display:flex; align-items:center; justify-content:center;", n.appendChild(i); let a = document.createElement("input"); a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(of), a.max = String(sf), a.step = String(cf), a.value = String(t), a.title = R("bottomFeed.cardSizeSlider", "Card size"), a.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(a); let o = document.createElement("button"); o.type = "button", o.className = "mjr-feed-size-btn", o.textContent = "+", o.title = R("bottomFeed.cardSizeIncrease", "Increase card size"), o.style.cssText = i.style.cssText, n.appendChild(o); let s = document.createElement("span"); s.className = "mjr-feed-size-display", s.textContent = `${t}px`, s.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; min-width:36px; text-align:right; flex-shrink:0; font-variant-numeric:tabular-nums;", n.appendChild(s), i.addEventListener("click", () => { lf(e, Number(a.value) - cf); }), o.addEventListener("click", () => { lf(e, Number(a.value) + cf); }), a.addEventListener("input", () => { lf(e, Number(a.value)); }), e.root.appendChild(n), e._sizeToolbar = n; } function df(e, t = {}) { let n = document.createElement("div"); n.className = "mjr-assets-manager mjr-bottom-feed", n.style.cssText = "padding:6px; height:100%; min-height:0; box-sizing:border-box; display:flex; flex-direction:column; overflow:hidden;", e.replaceChildren(n); let r = { container: e, root: n, grid: null, empty: null, loaded: !1, assetsByKey: /* @__PURE__ */ new Map(), popoverManager: null }; uf(r), Zd(r), ef(r, t.gridWrapper ?? null), Ed(r), r.popoverManager = Ki(n), r._disposeContextMenu = to({ gridContainer: r.grid, getState: () => ({ scope: "output" }) }), af(r), $d(r.grid); let i = () => { try { $d(r.grid); } catch (e) { console.debug?.(e); } }; return window.addEventListener("mjr-settings-changed", i), r._disposeFeedSettings = () => { try { window.removeEventListener("mjr-settings-changed", i); } catch (e) { console.debug?.(e); } }, r; } function ff(e) { let t = Kd(e); if (t) for (let e of Array.from(Dd.hosts)) try { if (!e?.grid || (Id(e, t), !e.loaded)) continue; e.empty.style.display = "none", Ld(e); } catch (e) { console.debug?.(e); } } function pf(e, t = {}) { Qd(e); let n = df(e, t); try { e._mjrGeneratedFeedHost = n; } catch (e) { console.debug?.(e); } return Dd.hosts.add(n), Jd(n), n; } function mf(e) { let t = e?._mjrGeneratedFeedHost || e || null; if (!t) return; let n = t.container || null; if (n) try { delete n._mjrGeneratedFeedHost; } catch (e) { try { n._mjrGeneratedFeedHost = null; } catch (e) { console.debug?.(e); } console.debug?.(e); } Dd.hosts.delete(t); try { t._disposeSelection?.(); } catch (e) { console.debug?.(e); } try { t._disposeFeedFocus?.(); } catch (e) { console.debug?.(e); } try { t._disposeFeedSettings?.(); } catch (e) { console.debug?.(e); } try { t._disposeContextMenu?.(); } catch (e) { console.debug?.(e); } try { t.keyboard?.dispose?.(); } catch (e) { console.debug?.(e); } try { t.ratingHotkeys?.dispose?.(); } catch (e) { console.debug?.(e); } try { t.popoverManager?.dispose?.(); } catch (e) { console.debug?.(e); } try { t.gridApp?.unmount?.(); } catch (e) { console.debug?.(e); } try { t._renderTimer &&= (clearTimeout(t._renderTimer), null); } catch (e) { console.debug?.(e); } try { Li(t.grid); } catch (e) { console.debug?.(e); } try { t.container?.replaceChildren?.(); } catch (e) { console.debug?.(e); } } //#endregion //#region ui/features/stacks/executionAssetBuffer.ts function hf(e) { return String(e || "").trim(); } function gf(e) { let t = String(e?.filename || "").trim(), n = String(e?.subfolder || "").trim(); return `${String(e?.type || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${n}|${t}`; } function _f() { let e = /* @__PURE__ */ new Map(); function t(t, n) { let r = hf(t); if (!r) return []; let i = Array.isArray(n) ? n : []; if (!i.length) return []; let a = e.get(r); a || (a = /* @__PURE__ */ new Map(), e.set(r, a)); for (let e of i) { let t = gf(e); t && a.set(t, { ...a.get(t) || {}, ...e || {} }); } return Array.from(a.values()); } function n(t) { let n = hf(t); if (!n) return []; let r = e.get(n); return e.delete(n), Array.from(r?.values?.() || []); } function r(t) { let n = hf(t); n && e.delete(n); } return { add: t, take: n, clear: r, _jobs: e }; } //#endregion //#region ui/features/stacks/finalizeQueue.ts function vf({ defaultDelayMs: e = 900, postJob: t } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), i = !1; async function a() { if (!i) { i = !0; try { for (; r.size > 0;) { let e = r.values().next().value; r.delete(e), e && await Promise.resolve().then(() => t?.(e)); } } finally { i = !1, r.size > 0 && a(); } } } function o(t, i = e) { let o = String(t || "").trim(); if (!o) return; let s = n.get(o); s && clearTimeout(s); let c = setTimeout(() => { n.delete(o), r.add(o), a(); }, Math.max(0, Number(i) || 0)); n.set(o, c); } function s() { for (let e of n.values()) clearTimeout(e); n.clear(), r.clear(), i = !1; } return { schedule: o, dispose: s, _pendingJobIds: r, _timers: n }; } //#endregion //#region ui/features/stacks/liveAssetGate.ts function yf(e) { return String(e || "").trim(); } function bf(e) { let t = String(e?.filename || "").trim(), n = String(e?.filepath || "").trim(), r = String(e?.subfolder || "").trim(); return `${String(e?.type || e?.source || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${r}|${t || n}`; } function xf(e, t) { return !t || String(e?.job_id || "").trim() === t ? e : { ...e || {}, job_id: t }; } function Sf() { let e = /* @__PURE__ */ new Map(); function t(t, { files: n = [], expectedCount: r = null } = {}) { let i = yf(t); if (!i) return; let a = /* @__PURE__ */ new Set(); for (let e of Array.isArray(n) ? n : []) { let t = bf(e); t && a.add(t); } e.set(i, { expectedCount: Math.max(0, Number(r ?? a.size) || 0), fileKeys: a, markedAt: Date.now() }); } function n(t) { let n = yf(t); n && e.delete(n); } function r(t) { let n = yf(t?.job_id); if (n) return n; let r = bf(t); if (!r) return ""; let i = "", a = Infinity; for (let [t, n] of e.entries()) n?.fileKeys?.has?.(r) && (n.markedAt ?? Infinity) < a && (a = n.markedAt ?? Infinity, i = t); return i; } function i(t) { let n = r(t); if (!n) return { detail: t, jobId: "", defer: !1 }; let i = xf(t, n), a = e.get(n); if (!a) return { detail: i, jobId: n, defer: !1 }; let o = String(i?.stack_id || "").trim(); return { detail: i, jobId: n, defer: Math.max(0, Number(a?.expectedCount || 0) || 0) > 1 && !o }; } return { markPendingJob: t, clearPendingJob: n, resolveJobId: r, prepare: i, _pendingJobs: e }; } //#endregion //#region ui/features/stacks/executionRuntimeController.ts var Cf = 2e3, wf = 2e3, Tf = /* @__PURE__ */ new Set([ "DB_MAINTENANCE", "TIMEOUT", "NETWORK_ERROR", "SERVICE_UNAVAILABLE" ]), Ef = 8, Df = 1200, Of = 15e3, kf = 6e5, Af = 500, jf = 6, Mf = 3e4, Nf = 500; function Pf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { let c = se({ ttlMs: Cf, maxSize: wf }), l = se({ ttlMs: kf, maxSize: Af }), u = Math.max(0, Number(z.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = _f(), p = Sf(), m = "", h = 0, g = null; function _() { try { return typeof window > "u" ? !1 : window.__MJR_DEBUG_JOB_TRACKING__ === !0 || String(window.localStorage?.getItem("mjr.debug.jobTracking") || "").trim() === "1"; } catch (e) { return console.debug?.(e), !1; } } function v(e, t = {}) { if (_()) try { console.debug("[Majoor][job-tracking]", e, t); } catch (e) { console.debug?.(e); } } function y() { return !!z.EXECUTION_GROUPING_ENABLED; } function b() { let e = y(); return { groupingEnabled: e, useExecutionBuffer: e, usePostExecutionScan: !1, allowLiveStackFinalize: e }; } function x(e = {}) { v("stacks-updated", { targeted_job_id: String(e?.targeted_job_id || ""), stacks: Array.isArray(e?.stacks) ? e.stacks.map((e) => ({ job_id: String(e?.job_id || ""), stack_id: String(e?.stack_id || ""), asset_count: Number(e?.asset_count || 0) || 0 })) : [] }); try { let t = String(e?.targeted_job_id || "").trim(); t && p.clearPendingJob(t); let n = Array.isArray(e?.stacks) ? e.stacks : []; for (let e of n) { let t = String(e?.job_id || "").trim(); t && p.clearPendingJob(t); } } catch (e) { console.debug?.(e); } try { let t = Array.isArray(e?.stacks) ? e.stacks : [], n = JSON.stringify({ targeted_job_id: String(e?.targeted_job_id || ""), stacks: t.map((e) => ({ job_id: String(e?.job_id || ""), stack_id: String(e?.stack_id || ""), asset_count: Number(e?.asset_count || 0) || 0 })) }), r = Date.now(); if (n && n === m && r - h < 1500) return; m = n, h = r; } catch (e) { console.debug?.(e); } try { window.dispatchEvent(new CustomEvent("mjr:stacks-updated", { detail: { ...e || {} } })); } catch (e) { console.debug?.(e); } try { o(); } catch (e) { console.debug?.(e); } } let S = vf({ defaultDelayMs: 900, async postJob(r) { v("auto-stack:start", { job_id: r }); try { let i = await e(t.STACKS_AUTO_STACK, { mode: "job_id", job_id: r }); if (!i?.ok) { p.clearPendingJob(r), n(Error(String(i?.error || "Auto stack failed")), "executionRuntime.execution_end.auto_stack"); return; } v("auto-stack:done", { job_id: r, stacks: Array.isArray(i?.data?.stacks) ? i.data.stacks.length : 0 }), x(i?.data || { targeted_job_id: r }); } catch (e) { n(e, "executionRuntime.execution_end.auto_stack"); } } }); function C(e, t) { if (!e) return; let n = Number(t) || Date.now(); l.set(String(e), n, { at: n }), l.prune(); } function w(e) { c.prune(); let t = []; for (let n of e) { let e = `${n.type || ""}|${n.subfolder || ""}|${n.filename || ""}`.toLowerCase(); c.has(e) || (c.set(e, !0), t.push(n)); } return t; } function T(e) { let t = Math.max(1, Number(e) || 1), n = Math.min(6, t - 1); return Math.min(Of, Df * 2 ** n); } function E() { g &&= (clearTimeout(g), null); } function D(e, t = u) { let r = Math.max(0, Number(t) || 0); E(), g = setTimeout(() => { g = null; try { e?.(); } catch (e) { n(e, "executionRuntime.post_execution"); } }, r); } function O(e) { let t = String(e?.code || "").trim().toUpperCase(); return Tf.has(t); } function k(r, i = 1, a = {}) { let o = Array.isArray(r) ? r : []; if (!o.length) return; let s = { files: o, origin: "generation" }; (a?.prompt_id || a?.promptId) && (s.prompt_id = String(a.prompt_id || a.promptId)), v("index:direct", { prompt_id: String(s.prompt_id || ""), attempt: i, files: o.map((e) => String(e?.filename || e?.filepath || "")) }), e(t.INDEX_FILES, s).then((e) => { if (!e?.ok) { if (O(e) && i < Ef) { let e = T(i); setTimeout(() => k(o, i + 1, a), e); return; } try { let t = String(e?.code || "INDEX_FAILED"), r = String(e?.error || "Indexing generated files failed"); n(/* @__PURE__ */ Error(`${t}: ${r}`), "executionRuntime.executed.index"); } catch (e) { console.debug?.(e); } } }).catch((e) => n(e, "executionRuntime.executed.index")); } function A(e = {}) { let t = String(e?.prompt_id || e?.promptId || "").trim(); if (t) return t; try { return String(i()?.active_prompt_id || "").trim(); } catch (e) { return console.debug?.(e), ""; } } function j(e) { return !Array.isArray(e) || !e.length ? "" : e.map((e) => String(e?.filepath || e?.filename || "")).filter(Boolean).sort().join("|"); } function M(e, t = {}, n = 1) { let r = Array.isArray(e) ? e : []; if (!r.length) return; let i = j(r); if (!i) { k(r, 1, t); return; } let a = d.get(i); a?.timer && clearTimeout(a.timer); let o = a?.firstAttemptAt ?? Date.now(); if (Date.now() - o >= Mf) { k(r, 1, t); return; } let s = Math.max(1, Number(n) || 1), c = Math.min(2e3, 250 * s), l = setTimeout(() => { d.delete(i), F(r, t, s + 1); }, c); d.set(i, { files: r, meta: t, attempt: s, timer: l, firstAttemptAt: o }); } function N(e) { let t = String(e || "").trim(); if (!(!t || d.size <= 0)) for (let [e, n] of Array.from(d.entries())) { try { n?.timer && clearTimeout(n.timer); } catch (e) { console.debug?.(e); } d.delete(e), f.add(t, n?.files || []); } } function P() { for (let [e, t] of Array.from(d.entries())) { try { t?.timer && clearTimeout(t.timer); } catch (e) { console.debug?.(e); } d.delete(e); } } function F(e, t = {}, n = 1) { let r = A(t); if (v("buffer:add", { prompt_id: r, explicit_prompt_id: String(t?.prompt_id || t?.promptId || ""), attempt: n, file_count: Array.isArray(e) ? e.length : 0, files: Array.isArray(e) ? e.map((e) => String(e?.filename || e?.filepath || "")) : [] }), !r) { if (n < jf) { M(e, t, n); return; } k(e, 1, t); return; } f.add(r, e); } function ee(e, t = 900) { y() && (v("finalize:schedule", { job_id: String(e || ""), delay_ms: t }), S.schedule(e, t)); } function te(r) { let i = b(), a = String(r || "").trim(); if (!a) return; let o = f.take(a); if (v("buffer:flush", { prompt_id: a, file_count: o.length, files: o.map((e) => String(e?.filename || e?.filepath || "")) }), i.allowLiveStackFinalize && p.markPendingJob(a, { files: o, expectedCount: o.length }), !o.length) { i.allowLiveStackFinalize && ee(a); return; } e(t.INDEX_FILES, { files: o, origin: "generation", prompt_id: a }).then((e) => { if (!e?.ok) { i.allowLiveStackFinalize && p.clearPendingJob(a), n(Error(String(e?.error || "Indexing generated files failed")), "executionRuntime.executed.index"); return; } v("index:flush:done", { prompt_id: a, file_count: o.length }), i.allowLiveStackFinalize && ee(a, 1800); }).catch((e) => { i.allowLiveStackFinalize && p.clearPendingJob(a), n(e, "executionRuntime.executed.index"); }); } function I(e) { let t = String(e || "").trim(); if (!t) return !1; try { let e = f?._jobs?.get?.(t); return !!e && typeof e.size == "number" && e.size > 0; } catch (e) { return console.debug?.(e), !1; } } function ne(e) { if (!y()) return { detail: e, jobId: "", defer: !1 }; try { return p.prepare(e); } catch (t) { return console.debug?.(t), { detail: e, jobId: "", defer: !1 }; } } function re(e) { let t = String(e?.kind || "").trim(), n = String(e?.filename || "").trim(), r = String(e?.filepath || "").trim(); return !!t && (!!n || !!r); } function ie(e, { appRef: t }) { if (!b().useExecutionBuffer) return; let n = w(r(e?.detail?.output)); if (!n.length) return; let i = e?.detail?.prompt_id || e?.detail?.promptId, a = String(e?.detail?.node || e?.detail?.display_node || "").trim(), o = i ? l.get(String(i)) : null, s = o ? Math.max(0, Date.now() - o) : 0, c = ""; try { if (a && t !== void 0) { let e = ht(pt(t), a); e && (c = String(e.type || e.comfyClass || "").trim()); } } catch (e) { console.debug?.(e); } let u = n.map((e) => ({ ...e, ...s > 0 ? { generation_time_ms: s } : {}, ...a ? { source_node_id: a } : {}, ...c ? { source_node_type: c } : {} })); v("executed:event", { prompt_id: String(i || ""), source_node_id: a, source_node_type: c, file_count: u.length, files: u.map((e) => String(e?.filename || e?.filepath || "")) }); try { window.dispatchEvent(new CustomEvent(B.NEW_GENERATION_OUTPUT, { detail: { files: u, prompt_id: String(i || ""), promptId: String(i || "") } })); } catch (e) { console.debug?.(e); } let d = u.length > 0 ? [u[0]] : [], f = u.length > 1 ? u.slice(1) : []; d.length > 0 && k(d, 1, { prompt_id: i }), f.length > 0 && F(f, { prompt_id: i }); } function ae(e, { setCurrentJobId: t }) { let n = e?.detail?.prompt_id || e?.detail?.promptId, r = e?.detail?.timestamp; v("execution:start", { prompt_id: String(n || ""), timestamp: Number(r) || null }), C(n, r), E(), t?.(n || null), a({ active_prompt_id: n || null, cached_nodes: [], progress_node: null, progress_value: null, progress_max: null }), n && N(n); } function oe(e, { setCurrentJobId: t }) { let n = b(), r = e?.detail?.prompt_id || e?.detail?.promptId; v("execution:end", { type: String(e?.type || ""), prompt_id: String(r || "") }), r && l.delete(String(r)), l.prune(), t?.(null), a({ active_prompt_id: null, cached_nodes: [], progress_node: null, progress_value: null, progress_max: null }), r && String(e?.type || "") !== "execution_success" && (v("buffer:clear", { prompt_id: String(r || ""), reason: String(e?.type || "") }), E(), f.clear(r), n.allowLiveStackFinalize && p.clearPendingJob(r), P()), String(e?.type || "") === "execution_success" && D(() => { r && N(r), te(r); }, I(r) ? Math.min(u, Nf) : u); } function ce(e) { if (!y()) return; let t = []; for (let [, n] of e instanceof Map ? e.entries() : []) { let e = r(n); if (e?.length) for (let n of e) t.push(n); } !t.length || !y() || (v("node-outputs:updated", { prompt_id: A(), file_count: t.length }), F(t, { prompt_id: A() })); } return { notifyStacksUpdated: x, prepareLiveAssetEvent: ne, isRenderableLiveAsset: re, handleExecutedEvent: ie, handleExecutionStart: ae, handleExecutionEnd: oe, handleNodeOutputsUpdated: ce }; } //#endregion //#region ui/utils/extractOutputFiles.ts function Ff(e) { let t = [], n = /* @__PURE__ */ new Set(), r = 2e3, i = /\.(png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg|glb|gltf|obj|fbx|ply|stl)$/i, a = typeof WeakSet < "u" ? /* @__PURE__ */ new WeakSet() : null, o = ({ type: e, subfolder: t, filename: n, path: r }) => r ? `path|${String(r).trim().toLowerCase()}` : `${e || ""}|${t || ""}|${n || ""}`.toLowerCase(), s = (e) => { if (!e) return; let r = e.path || e.filepath || e.fullpath || e.fullPath || e.full_path, i = e.filename; if (!i && r) { let e = String(r).split(/[/\\\\]/); i = e[e.length - 1]; } if (!i || (i = String(i), !i)) return; let a = String(e.subfolder ?? e.sub_folder ?? e.subFolder ?? ""), s = String(e.type ?? e.output_type ?? "output"), c = o({ type: s, subfolder: a, filename: i, path: r }); if (n.has(c)) return; n.add(c); let l = { filename: i, subfolder: a, type: s }; r && (l.path = String(r)), t.push(l); }, c = (e) => { if (typeof e != "string") return; let r = e.trim().replace(/^['"]|['"]$/g, ""); if (!r || !i.test(r)) return; let a = r.split(/[/\\\\]/), s = a[a.length - 1]; if (!s) return; let c = o({ type: "output", subfolder: "", filename: s, path: r }); n.has(c) || (n.add(c), t.push({ filename: s, subfolder: "", type: "output", path: r })); }, l = (e) => { if (typeof e == "string") { c(e); return; } if (!Array.isArray(e)) return; let n = 0; for (let i of e) { if (t.length >= 500 || n >= r) break; n += 1, i && typeof i == "object" && "filename" in i ? s(i) : typeof i == "string" ? c(i) : u(i, 1); } }, u = (e, n) => { if (!e || n > 4 || t.length >= 500 || typeof e != "object" || !e) return; if (a) { if (a.has(e)) return; a.add(e); } if (Array.isArray(e)) { let i = 0; for (let a of e) { if (t.length >= 500 || i >= r) break; i += 1, a && typeof a == "object" && "filename" in a ? s(a) : typeof a == "string" ? c(a) : u(a, n + 1); } return; } let i = e; if ((i.images || i.gifs || i.videos || i.meshes || i.mesh || i.audio) && (l(i.images), l(i.gifs), l(i.videos), l(i.meshes), l(i.mesh), l(i.audio)), i.output && u(i.output, n + 1), i.outputs && u(i.outputs, n + 1), i.result && u(i.result, n + 1), i.data && u(i.data, n + 1), n < 4) for (let e of Object.values(i)) { if (t.length >= 500) break; if (typeof e == "string") { c(e); continue; } if (!e || typeof e != "object") continue; let r = e; if (r.images || r.gifs || r.videos || r.meshes || r.mesh || r.audio) { l(r.images), l(r.gifs), l(r.videos), l(r.meshes), l(r.mesh), l(r.audio); continue; } u(e, n + 1); } }; return u(e, 0), t; } //#endregion //#region ui/features/runtime/sidebarAssetBadge.ts var If = "mjr-sidebar-asset-badge", Lf = "mjr-sidebar-tab-has-badge", Rf = "mjr-sidebar-asset-badge-style", zf = 99, Bf = 0, Vf = "majoor-assets", Hf = !1, Uf = /* @__PURE__ */ new Set(); function Wf() { if (typeof document > "u" || document.getElementById(Rf)) return; let e = document.createElement("style"); e.id = Rf, e.textContent = ` .${Lf} { position: relative !important; } .${If} { position: absolute; top: 3px; right: 3px; min-width: 14px; height: 14px; padding: 0 4px; border-radius: 999px; box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; background: #ef4444; color: #fff; border: 1px solid rgba(0, 0, 0, 0.55); box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.18); font-size: 9px; line-height: 1; font-weight: 800; pointer-events: none; z-index: 3; } `, document.head?.appendChild(e); } function Gf(e) { let t = String(e || "").trim(); if (!t) return []; let n = (() => { try { return CSS.escape(t); } catch { return t.replace(/(["\\])/g, "\\$1"); } })(); return [ `#${n}`, `[data-tab-id="${n}"]`, `[data-sidebar-tab-id="${n}"]`, `[data-id="${n}"]`, `[aria-controls="${n}"]`, `[href="#${n}"]` ]; } function Kf(e) { let t = `${e?.textContent || ""} ${e?.title || ""} ${e?.getAttribute?.("aria-label") || ""}`; return /assets\s*manager|majoor/i.test(t); } function qf(e) { return !e || typeof e != "object" ? !1 : typeof HTMLElement < "u" ? e instanceof HTMLElement : typeof e.querySelector == "function" && typeof e.appendChild == "function"; } function Jf() { if (typeof document > "u") return null; for (let e of Gf(Vf)) { let t = document.querySelector(e); if (qf(t)) return t; } let e = Array.from(document.querySelectorAll(".pi-folder, .pi-folder-open")); for (let t of e) { let e = t.closest?.("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab"); if (qf(e) && Kf(e)) return e; } return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => qf(e) && Kf(e)) || null; } function Yf() { Wf(); let e = Jf(); if (!e) return !1; let t = e.querySelector(`:scope > .${If}`); return !Zf() || Bf <= 0 ? (t?.remove(), e.classList.remove(Lf), !0) : (t || (t = document.createElement("span"), t.className = If, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(Lf), t.textContent = Bf > zf ? `${zf}+` : String(Bf), !0); } function Xf() { Yf(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => Yf()), setTimeout(() => Yf(), 250), setTimeout(() => Yf(), 1e3); } function Zf() { return z.SIDEBAR_ASSET_BADGE_ENABLED !== !1; } function Qf(e = null) { let t = String(e?.id || e?.asset_id || "").trim(); if (t) return `id:${t}`; let n = String(e?.type || e?.source || "output").trim().toLowerCase(), r = String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim().toLowerCase(), a = String(e?.filename || "").trim().toLowerCase(), o = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(), s = a || o; return s ? `file:${n}|${r}|${i}|${s}` : ""; } function $f(e) { if (!e) return !0; if (Uf.has(e)) return !1; if (Uf.add(e), Uf.size > 1e3) { let e = Array.from(Uf).slice(-500); Uf.clear(); for (let t of e) Uf.add(t); } return !0; } function ep({ sidebarTabId: e } = {}) { let t = String(e || "").trim(); t && (Vf = t), !Hf && typeof window < "u" && (Hf = !0, window.addEventListener?.("mjr-settings-changed", (e) => { e?.detail?.key === "sidebar.assetBadgeEnabled" && (Zf() || (Bf = 0, Uf.clear()), Xf()); })), Xf(); } function tp(e = null) { Zf() && $f(Qf(e)) && (Bf += 1, Xf()); } function np() { Bf = 0, Uf.clear(), Xf(); } //#endregion //#region ui/features/runtime/pendingGeneratedAssets.ts var rp = 0; function ip(e = 1) { let t = Math.max(1, Number(e) || 1); rp += t; try { window.__mjrPendingGeneratedAssetCount = rp; } catch {} return rp; } function ap() { let e = rp; rp = 0; try { window.__mjrPendingGeneratedAssetCount = 0; } catch {} return e; } //#endregion //#region ui/features/runtime/registerRealtimeListeners.ts var op = 3e4, sp = /* @__PURE__ */ new Map(), cp = "live"; function lp(e) { return e === !0 || e === 1 || e === "1" ? !0 : e === !1 || e === 0 || e === "0" ? !1 : null; } function up(e) { let t = [ e?.has_ai_vector, e?.hasAiVector, e?.has_vector_embedding, e?.hasVectorEmbedding, e?.vector_indexed, e?.vectorIndexed ]; for (let e of t) { let t = lp(e); if (t !== null) return t; } return !1; } function dp(e) { let t = Date.now(), n = Number(sp.get(e) || 0); if (n > 0 && t - n < op) return !0; if (sp.set(e, t), sp.size > 500) { let e = t - 5 * op; for (let [t, n] of sp.entries()) Number(n) < e && sp.delete(t); } return !1; } function fp(e) { let t = String(e?.id || "").trim(); t && (up(e) || dp(t) || c(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); } function pp(e) { let t = String(e?.kind || "").trim().toLowerCase(); if (t) return t; let n = String(e?.filename || e?.filepath || e?.path || e?.fullpath || "").trim(), r = n.includes(".") && n.split(".").pop()?.toLowerCase?.() || ""; return r ? [ "png", "jpg", "jpeg", "webp", "gif", "bmp", "tif", "tiff", "avif", "heic", "heif" ].includes(r) ? "image" : [ "mp4", "webm", "mov", "mkv", "avi", "m4v" ].includes(r) ? "video" : [ "mp3", "wav", "flac", "ogg" ].includes(r) ? "audio" : [ "glb", "gltf", "obj", "fbx", "ply", "stl", "splat", "ksplat", "spz" ].includes(r) ? "model3d" : "unknown" : ""; } function mp(e, { jobId: t = "" } = {}) { let n = String(e?.filename || "").trim(), r = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim(), a = String(e?.type || e?.source || "output").trim().toLowerCase(), o = String(e?.root_id || e?.custom_root_id || "").trim(), s = pp(e); if (!s || !n && !r) return null; let c = n || r.split(/[/\\]/).filter(Boolean).pop() || ""; if (!c) return null; let l = r || (i ? `${i}/${c}` : c), u = [ a || "output", o, i, c ].map((e) => String(e || "").trim().toLowerCase()).join("|"), d = Date.now() / 1e3, f = String(e?.job_id || t || "").trim(); return { id: `${cp}:${u || l.toLowerCase()}`, filename: c, filepath: l, path: l, subfolder: i, type: a || "output", source: a || "output", kind: s, mtime: Number(e?.mtime) || d, has_workflow: e?.has_workflow ?? e?.hasWorkflow ?? null, has_generation_data: e?.has_generation_data ?? e?.hasGenerationData ?? null, generation_time_ms: Number.isFinite(Number(e?.generation_time_ms)) && Number(e?.generation_time_ms) > 0 ? Number(e.generation_time_ms) : void 0, source_node_id: String(e?.source_node_id || "").trim() || void 0, source_node_type: String(e?.source_node_type || "").trim() || void 0, job_id: f || void 0, root_id: o || void 0, custom_root_id: o || void 0, is_live_placeholder: !0, _mjrLivePlaceholder: !0, _mjrLiveStatus: "pending", _mjrLiveLabel: "In progress" }; } function hp(e) { let t = String(e || ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); } catch (e) { console.debug?.(e); } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } function gp(e, t) { let n = String(e || "").trim().toLowerCase(); return n === "delete_db" ? t("btn.deleteDb", "Delete DB") : n === "reset_index" ? t("btn.resetIndex", "Reset index") : n === "restore_db" ? t("btn.dbRestore", "Restore DB") : t("btn.maintenance", "Maintenance"); } function _p(e, t) { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(), i = { delete_db: [ "started", "stopping_workers", "resetting_db", "delete_db", "recreate_db", "restarting_scan", "done" ], reset_index: [ "started", "stopping_workers", "resetting_db", "restarting_scan", "done" ], db_restore: [ "started", "stopping_workers", "resetting_db", "replacing_files", "restarting_scan", "done" ] }, a = i[n] || i.db_restore, o = a.indexOf(r), s = Math.min(a.length, o >= 0 ? o + 1 : 0), c = a.length; return { current: s, total: c, percent: Math.round(s / c * 100), label: r.replace(/[_-]+/g, " ") }; } async function vp({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStreamModule: i, ensureExecutionRuntime: a, emitRuntimeStatus: o, getActiveGridContainer: s, pushGeneratedAsset: c, upsertAsset: l, upsertAssetNow: u, removeAssetsFromGrid: d, getEnrichmentState: f, setEnrichmentState: p, comfyToast: m, t: h, reportError: g, registerCleanableListener: _, syncExecutionBackendState: v }) { e._mjrExecutedHandler = (e) => { try { n.handleExecutedEvent(e, { appRef: r }); } catch (e) { g(e, "entry.executed"); } }, _(t, e, "executed", e._mjrExecutedHandler), e._mjrExecutionStartHandler = (e) => { try { n.handleExecutionStart(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), v?.({ active: !0, promptId: e?.detail?.prompt_id || e?.detail?.promptId || "" }); } catch (e) { g(e, "entry.execution_start"); } }, e._mjrExecutionEndHandler = (e) => { try { n.handleExecutionEnd(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), v?.({ active: !1, promptId: e?.detail?.prompt_id || e?.detail?.promptId || "" }); } catch (e) { g(e, "entry.execution_end"); } }, e._mjrStacksUpdatedHandler = (e) => { try { n.notifyStacksUpdated(e?.detail || {}); } catch (e) { g(e, "entry.stacks_updated"); } }, e._mjrRuntimeStatusHandler = (e) => { try { let t = e?.detail || {}; o({ progress_node: t?.node ?? null, progress_value: Number.isFinite(Number(t?.value)) ? Number(t.value) : null, progress_max: Number.isFinite(Number(t?.max)) ? Number(t.max) : null, queue_remaining: Number.isFinite(Number(t?.exec_info?.queue_remaining)) ? Number(t.exec_info.queue_remaining) : Number.isFinite(Number(t?.queue_remaining)) ? Number(t.queue_remaining) : a().queue_remaining }); } catch (e) { g(e, "entry.runtime_status"); } }, e._mjrExecutionCachedHandler = (e) => { try { let t = e?.detail || {}; o({ active_prompt_id: t?.prompt_id || t?.promptId || a().active_prompt_id || null, cached_nodes: Array.isArray(t?.nodes) ? t.nodes.slice() : [] }); } catch (e) { g(e, "entry.execution_cached"); } }, _(t, e, "execution_start", e._mjrExecutionStartHandler), _(t, e, "execution_success", e._mjrExecutionEndHandler), _(t, e, "execution_error", e._mjrExecutionEndHandler), _(t, e, "execution_interrupted", e._mjrExecutionEndHandler), _(t, e, "mjr.stacks.updated", e._mjrStacksUpdatedHandler), _(t, e, "progress", e._mjrRuntimeStatusHandler), _(t, e, "status", e._mjrRuntimeStatusHandler), _(t, e, B.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), _(t, e, "execution_cached", e._mjrExecutionCachedHandler); function y() { try { window.__mjrLastAssetUpsert = Date.now(), window.__mjrLastAssetUpsertCount = (Number(window.__mjrLastAssetUpsertCount || 0) || 0) + 1; } catch (e) { console.debug?.(e); } } function b(e, t, { immediate: n = !1, force: r = !1 } = {}) { let i = String(t?.id || "").trim(), a = String(t?.kind || "").trim(), o = String(t?.filename || "").trim(), s = String(t?.filepath || "").trim(), c = !!a && (!!o || !!s), d = !1; if (i) try { d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${hp(i)}"]`); } catch (e) { console.debug?.(e); } let f = c || d; if (!d && f && !r && (String(e?.dataset?.mjrQuery || "*").trim() || "*") !== "*") return; let p = !d && f && !t.mtime ? { ...t, mtime: Date.now() / 1e3 } : t; if (!d && f) { let e = t.has_workflow ?? t.hasWorkflow, n = t.has_generation_data ?? t.hasGenerationData; e == null && n == null || (e == null || n == null) && (p = { ...p, has_workflow: e ?? null, has_generation_data: n ?? null }); } let m = f ? !!(n && typeof u == "function" ? u : l)(e, p) : !1; return m && y(), m; } e._mjrNewGenerationOutputHandler = (e) => { try { let t = s(); if (!t) return; let n = String(t?.dataset?.mjrScope || "output").trim().toLowerCase(); if (n !== "output" && n !== "all") return; let r = Array.isArray(e?.detail?.files) ? e.detail.files : [], i = String(e?.detail?.prompt_id || e?.detail?.promptId || "").trim(); for (let e of r) { let n = mp(e, { jobId: i }); n && b(t, n, { immediate: !0, force: !0 }); } } catch (e) { g(e, "entry.new_generation_output"); } }, _(t, window, B.NEW_GENERATION_OUTPUT, e._mjrNewGenerationOutputHandler), e._mjrAssetAddedHandler = (e) => { try { if (!e?.detail) return; let t = n.prepareLiveAssetEvent(e.detail), r = t?.detail || e.detail; if (t?.defer) return; let i = n.isRenderableLiveAsset(r); i && c(r), fp(r); let a = s(); if (!a) { i && ip(); return; } let o = a.dataset?.mjrScope || "output"; if (o !== "output" && o !== "all") { i && ip(); return; } let l = a.dataset?.mjrQuery || "*"; String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || ip() : i && ip(); } catch (e) { g(e, "entry.asset_added"); } }, _(t, e, "mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler = (e) => { try { if (!e?.detail) return; let t = n.prepareLiveAssetEvent(e.detail), r = t?.detail || e.detail; if (t?.defer) return; n.isRenderableLiveAsset(r) && c(r); let i = s(); if (!i) return; b(i, r, { immediate: !0 }); } catch (e) { g(e, "entry.asset_updated"); } }, _(t, e, "mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler = (e) => { try { let t = e?.detail || {}; window.dispatchEvent(new CustomEvent(B.STRUCTURED_EVENT, { detail: t })); } catch (e) { console.debug?.(e); } }, _(t, e, B.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler = (e) => { try { let t = e?.detail || {}; window.dispatchEvent(new CustomEvent(B.SCAN_COMPLETE, { detail: t })); } catch (e) { console.debug?.(e); } }, _(t, e, B.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrCoreExecutionAssetsReadyHandler = (e) => { try { let t = e?.detail || {}; window.dispatchEvent(new CustomEvent(B.CORE_EXECUTION_ASSETS_READY, { detail: t })); let n = Number(t?.indexed || 0); Number.isFinite(n) && n > 0 && window.dispatchEvent(new CustomEvent(B.RELOAD_GRID, { detail: { reason: "core-execution-assets-ready", prompt_id: t?.prompt_id || t?.promptId || "", indexed: n } })); } catch (e) { console.debug?.(e); } }, _(t, e, B.CORE_EXECUTION_ASSETS_READY, e._mjrCoreExecutionAssetsReadyHandler), e._mjrScanProgressHandler = (e) => { try { let t = e?.detail || {}; window.dispatchEvent(new CustomEvent(B.SCAN_PROGRESS, { detail: t })); } catch (e) { console.debug?.(e); } }, _(t, e, B.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler = (e) => { try { let t = e?.detail || {}; window.dispatchEvent(new CustomEvent(B.ASSET_INDEXING, { detail: t })); } catch (e) { console.debug?.(e); } }, _(t, e, B.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler = (e) => { try { let t = e?.detail || {}; if (window.dispatchEvent(new CustomEvent(B.ASSET_INDEXED, { detail: t })), !t) return; let r = n.prepareLiveAssetEvent(t), i = r?.detail || t; if (r?.defer) return; n.isRenderableLiveAsset(i) && (c(i), tp(i)), fp(i); let a = s(); if (!a) return; b(a, i, { immediate: !0, force: !0 }); } catch (e) { console.debug?.(e); } }, _(t, e, B.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrEnrichmentStatusHandler = (e) => { try { let t = e?.detail || {}, n = Number(t?.queued), r = Number(t?.queue_left), i = Number.isFinite(n) ? Math.max(0, Math.floor(n)) : Number.isFinite(r) ? Math.max(0, Math.floor(r)) : 0, a = !!t?.active || i > 0, o = f().active; p(a, i), window.dispatchEvent(new CustomEvent(B.ENRICHMENT_STATUS, { detail: t })), o && !a && m(h("toast.enrichmentComplete", "Metadata enrichment complete"), "success", 2600); } catch (e) { console.debug?.(e); } }, _(t, e, B.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler = (e) => { try { let t = e?.detail || {}, n = String(t?.step || ""), r = String(t?.level || "info"), i = String(t?.operation || ""); window.dispatchEvent(new CustomEvent(B.DB_RESTORE_STATUS, { detail: t })); let a = i === "delete_db", o = i === "reset_index", s = { started: a ? h("toast.dbDeleteTriggered", "Deleting database and rebuilding...") : o ? h("toast.resetTriggered", "Reset triggered: Reindexing all files...") : h("toast.dbRestoreStarted", "DB restore started"), stopping_workers: h("toast.dbRestoreStopping", "Stopping running workers"), resetting_db: h("toast.dbRestoreResetting", "Unlocking and resetting database"), delete_db: h("toast.dbDeleteTriggered", "Deleting database and rebuilding..."), recreate_db: h("toast.dbRestoreReplacing", "Recreating database"), replacing_files: h("toast.dbRestoreReplacing", "Replacing database files"), restarting_scan: h("toast.dbRestoreRescan", "Restarting scan"), done: a ? h("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed.") : o ? h("toast.resetStarted", "Index reset started. Files will be reindexed in the background.") : h("toast.dbRestoreSuccess", "Database backup restored"), failed: String(t?.message || (a ? h("toast.dbDeleteFailed", "Failed to delete database") : o ? h("toast.resetFailed", "Failed to reset index") : h("toast.dbRestoreFailed", "Failed to restore DB backup"))) }[n] || String(t?.message || ""); if (!s) return; let c = r === "error" || n === "failed" ? "error" : n === "done" ? "success" : "info", l = { history: { trackId: `maintenance:${String(i || "db_restore").trim().toLowerCase() || "db_restore"}`, title: gp(i, h), detail: s, status: n, operation: String(i || "db_restore").trim().toLowerCase(), progress: _p(i, n), source: String(t?.name || "").trim() || "maintenance", forceStore: !0 } }; if (a && ![ "started", "done", "failed" ].includes(n)) { x(s, c, 0, l); return; } m(s, c, n === "done" || n === "failed" ? 2800 : 1800, l); } catch (e) { console.debug?.(e); } }, _(t, e, B.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler); let S = (e) => { try { let t = Array.isArray(e?.detail?.ids) ? e.detail.ids.map((e) => String(e || "")).filter(Boolean) : []; if (!t.length) return; let n = s(); n && d(n, t); } catch (e) { console.debug?.(e); } }; _(t, window, B.ASSETS_DELETED, S), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = S), console.debug("[Majoor] Real-time listener registered"); } //#endregion //#region ui/features/runtime/entryDebugApi.ts function yp({ resolveNodeStreamModule: e }) { typeof window > "u" || (window.MajoorDebug = { exportMetrics: () => window.MajoorMetrics?.exportMetrics?.(), getMetrics: () => window.MajoorMetrics?.getMetricsReport?.(), resetMetrics: () => window.MajoorMetrics?.resetMetrics?.() }, console.debug?.("[Majoor] Debug commands available: window.MajoorDebug.exportMetrics(), window.MajoorDebug.getMetrics(), window.MajoorDebug.resetMetrics()"), window.MajoorNodeStream = { mode: "selection-only", listAdapters: ((t) => async (...n) => (await e())?.[t]?.(...n))("listAdapters"), async getKnownNodeSets() { let { getKnownNodeSets: e } = await import("./chunks/KnownNodesAdapter-D3kDh32d.js"); return e(); } }, console.debug?.("[Majoor] NodeStream API: window.MajoorNodeStream.mode, .listAdapters(), .getKnownNodeSets()")); } //#endregion //#region ui/features/runtime/benignConsoleNoise.ts var bp = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; function xp(e) { try { let t = String(e?.message || e || ""); return bp.some((e) => t.includes(e)); } catch { return !1; } } function Sp() { if (typeof window > "u") return null; try { window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__?.abort?.(); } catch (e) { console.debug?.(e); } let e = null; try { e = new AbortController(); } catch { e = null; } let t = (e) => { try { if (!xp(e?.message || e?.error)) return; e.preventDefault?.(), e.stopImmediatePropagation?.(); } catch (e) { console.debug?.(e); } }, n = !e || { capture: !0, signal: e.signal }; window.addEventListener("error", t, n); let r = { abort() { try { e?.abort?.(); } catch (e) { console.debug?.(e); } if (!e) try { window.removeEventListener("error", t, !0); } catch (e) { console.debug?.(e); } } }; return window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__ = r, r; } //#endregion //#region ui/features/geninfo/genInfoOverridePicker.ts var Cp = "Majoor.GenInfoOverridePicker", wp = "MajoorGenInfoOverride", Tp = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), Ep = R("genInfoOverride.pick", "Pick"), Dp = { positive_prompt: [ "positive_prompt", "prompt", "text" ], negative_prompt: [ "negative_prompt", "negative", "negative_text" ], seed: ["seed", "noise_seed"], steps: ["steps"], cfg: ["cfg", "cfg_scale"], sampler: ["sampler", "sampler_name"], scheduler: ["scheduler"], model: [ "model", "ckpt_name", "checkpoint" ], vae: ["vae", "vae_name"], clip: ["clip", "clip_name"] }, Op = [ { field: "positive_prompt", label: "prompt" }, { field: "negative_prompt", label: "negative" }, { field: "model", label: "model" }, { field: "vae", label: "vae" }, { field: "clip", label: "clip" }, { field: "seed", label: "seed" }, { field: "steps", label: "steps" }, { field: "cfg", label: "cfg" }, { field: "sampler", label: "sampler" }, { field: "scheduler", label: "scheduler" }, { field: "denoise", label: "denoise" } ], kp = 0x10000000000000000, Ap = !1, jp = !1; function Mp(e, t) { let n = (e.widgets ?? []).find((e) => e?.name === t); if (n && n.value !== void 0 && n.value !== null && String(n.value).trim() !== "") return n.value; let r = Array.isArray(e.widgets_values) ? e.widgets_values : [], i = (Array.isArray(e.widgets) ? e.widgets : []).findIndex((e) => e?.name === t); return i >= 0 ? r[i] : void 0; } function Np(e, t, n, r, i) { if (r == null || String(r).trim() === "") return; let a = `${n}:${String(r).trim()}`; t.has(a) || (t.add(a), e.push({ field: n, label: n.replace(/_/g, " "), value: r, source: i })); } function Pp(e, t, n) { let r = t.toLowerCase(); return !!((Dp[e] ?? [e]).some((e) => r === e || r.includes(e)) || e === "positive_prompt" && r === "text" && n.toLowerCase().includes("positive") || e === "negative_prompt" && (r.includes("negative") || n.toLowerCase().includes("negative"))); } function Fp(e, t = null) { let n = [], r = /* @__PURE__ */ new Set(); for (let { graph: i, label: a } of gt(e)) for (let e of mt(i)) { if (String(e?.comfyClass || e?.type || "") === wp) continue; let i = String(e?.title || e?.comfyClass || e?.type || `Node ${e?.id ?? ""}`).trim(), o = a === "Workflow" ? i : `${a} / ${i}`; for (let [t, i] of Object.entries(Dp)) for (let a of i) Np(n, r, t, Mp(e, a), o); let s = Array.isArray(e.widgets) ? e.widgets : [], c = Array.isArray(e.widgets_values) ? e.widgets_values : []; s.forEach((e, a) => { let s = String(e?.name || "").toLowerCase(), l = e?.value ?? c[a]; s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? Np(n, r, "positive_prompt", l, o) : s.includes("negative") && Np(n, r, "negative_prompt", l, o), t && Pp(t, s, i) && Np(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); }); } return t ? n.filter((e) => e.field === t).slice(0, 120) : n.slice(0, 80); } function Ip(e, t) { return (e.widgets ?? []).find((e) => e?.name === t); } function Lp(e) { let t = Ip(e, "seed"); t && (t.options = { ...t.options ?? {}, min: -1, max: kp, control_after_generate: !1 }); } function Rp(e, t) { return t === "positive_prompt" ? e?.prompt ?? e?.positive_prompt : t === "negative_prompt" ? e?.negative_prompt ?? e?.negative : t === "loras_json" && Array.isArray(e?.loras) ? JSON.stringify(e.loras) : t === "custom_info_json" && Array.isArray(e?.custom_info) ? JSON.stringify(e.custom_info) : e?.[t]; } function zp(e, t) { if (!e || !t || typeof t != "object") return 0; Lp(e); let n = 0; for (let r of [ "positive_prompt", "negative_prompt", "seed", "steps", "cfg", "sampler", "scheduler", "model", "vae", "clip", "denoise", "loras_json", "workflow_notes", "custom_info_json" ]) { let i = Rp(t, r); if (i == null) continue; let a = Ip(e, r); a && (Bp(a, i, e, r), Vp(a, i), n += 1); } return n; } function Bp(e, t, n, r) { if (r !== "seed") { Gn(e, t, n); return; } let i = Number(t); if (Number.isFinite(i)) { e.options = { ...e.options ?? {}, min: -1, max: kp, control_after_generate: !1 }, e.value = Math.trunc(i); try { e.callback?.(e.value, tt()?.canvas ?? null, n, null, e); } catch {} } } function Vp(e, t) { let n = String(t ?? ""), r = [ e?.inputEl, e?.element, e?.el, e?.cachedDeepestByFrame?.widget?.inputEl, e?.cachedDeepestByFrame?.widget?.element, e?.cachedDeepestByFrame?.widget?.el ]; for (let e of r) if (!(!e || typeof e != "object") && "value" in e) try { e.value = n; } catch {} } function Hp(e, t, n) { let r = qp({ detail: { output: t } }); if (r && zp(e, r)) try { e.setSize?.(e.computeSize?.()), e.graph?.setDirtyCanvas?.(!0, !0), e.graph?.change?.(), n?.graph?.setDirtyCanvas?.(!0, !0), n?.graph?.change?.(), n?.canvas?.setDirty?.(!0, !0), n?.canvas?.draw?.(!0, !0); } catch {} } function Up(e, t, n = null) { let r = n || t.field, i = Ip(e, r); i && (Bp(i, t.value, e, r), Vp(i, t.value)); } function Wp(e) { return !e || e.value === void 0 || e.value === null || String(e.value).trim() === ""; } function Gp(e, t) { let n = Fp(t), r = 0; for (let t of Object.keys(Dp)) { let i = Ip(e, t); if (!i || !Wp(i)) continue; let a = n.find((e) => e.field === t); a && (Bp(i, a.value, e, t), Vp(i, a.value), r += 1); } return t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.(), t?.extensionManager?.toast?.add?.({ severity: r ? "success" : "warn", summary: "Majoor Gen Info", detail: r ? `Filled ${r} empty override fields.` : "No empty matching fields found.", life: 3e3 }), r; } function Kp(e, t) { if (!(!e || String(e?.comfyClass || e?.type || "") !== wp) && (Lp(e), !(e.widgets ?? []).some((e) => e?.name === Tp) && typeof e.addWidget == "function")) { e.addWidget("button", Tp, null, () => Gp(e, t)); for (let n of Op) { let r = `${Ep} ${n.label}`; (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => Yp(e, t, n.field)); } try { e.setSize?.(e.computeSize?.()), t?.graph?.setDirtyCanvas?.(!0, !0); } catch {} } } function qp(e) { let t = e?.detail?.output, n = t?.majoor_geninfo_override ?? t?.ui?.majoor_geninfo_override, r = Array.isArray(n) ? n[0] : n; return r && typeof r == "object" ? r : null; } function Jp(e) { if (jp) return; let t = e?.api; !t || typeof t.addEventListener != "function" || (jp = !0, t.addEventListener("executed", (t) => { let n = t?.detail?.node ?? t?.detail?.display_node; if (!n) return; let r = ht(e, n); !r || String(r?.comfyClass || r?.type || "") !== wp || Hp(r, t?.detail?.output, e); })); } function Yp(e, t, n = null) { let r = Fp(t, n); if (!r.length) { t?.extensionManager?.toast?.add?.({ severity: "warn", summary: "Majoor Gen Info", detail: n ? `No widget value found for ${n}.` : "No workflow parameters found.", life: 3e3 }); return; } let i = document.createElement("div"); i.style.cssText = "position:fixed;inset:0;z-index:1000000;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center"; let a = document.createElement("div"); a.style.cssText = "width:min(720px,92vw);max-height:80vh;overflow:auto;background:#202020;color:#eee;border:1px solid #555;border-radius:8px;padding:12px;box-shadow:0 16px 48px rgba(0,0,0,.55);font:12px sans-serif"; let o = n ? R("genInfoOverride.pickField", "Pick {field}", { field: n.replace(/_/g, " ") }) : R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"); a.innerHTML = "
"; let s = a.querySelector("strong"); s && (s.textContent = o); let c = a.querySelector("[data-close]"); c && (c.textContent = R("dialog.close", "Close")); for (let t of r) { let r = document.createElement("button"); r.type = "button", r.style.cssText = "width:100%;display:grid;grid-template-columns:130px 1fr 150px;gap:8px;text-align:left;background:#2b2b2b;color:#eee;border:1px solid #3d3d3d;border-radius:5px;padding:7px;margin:5px 0;cursor:pointer", r.innerHTML = `${t.label}`, r.children[1].textContent = String(t.value), r.children[2].textContent = t.source, r.onclick = () => { Up(e, t, n), i.remove(); }, a.appendChild(r); } i.appendChild(a), a.querySelector("[data-close]")?.addEventListener("click", () => i.remove()), i.addEventListener("click", (e) => { e.target === i && i.remove(); }), document.body.appendChild(i); } function Xp(e, t) { if (String(e?.comfyClass || e?.type || "") !== wp) return []; let n = [{ content: R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"), callback: () => Yp(e, t) }]; for (let r of Op) n.push({ content: `Pick ${r.label}`, callback: () => Yp(e, t, r.field) }); return n.push({ content: Tp, callback: () => Gp(e, t) }), n; } function Zp(e = null) { if (Ap) return; let t = e || tt(); if (!t || typeof t.registerExtension != "function") { setTimeout(() => Zp(e), 100); return; } Ap = !0, Jp(t), t.registerExtension({ name: Cp, async nodeCreated(e) { Kp(e, t); }, getNodeMenuItems(e) { return Xp(e, t); } }), setTimeout(() => { for (let { graph: e } of gt(t)) for (let n of mt(e)) Kp(n, t); }, 0); } //#endregion //#region ui/vue/composables/useDragDrop.ts function Qp() { let e = null; fr(() => { try { e = Cs() ?? null; } catch (e) { console.warn("[Majoor] useDragDrop: init failed", e); } }), Or(() => { try { e?.({ force: !0 }); } catch (e) { console.debug?.(e); } try { ws({ force: !0 }); } catch (e) { console.debug?.(e); } e = null; }); } //#endregion //#region ui/vue/GlobalRuntime.vue var $p = { __name: "GlobalRuntime", setup(e) { let t = ur(() => import("./chunks/ViewerPortal-DvYVQ32S.js")), n = Z(!1), r = [ B.OPEN_VIEWER, B.MFV_OPEN, B.MFV_TOGGLE, B.MFV_LIVE_TOGGLE, B.MFV_PREVIEW_TOGGLE, B.MFV_NODESTREAM_TOGGLE, B.MFV_POPOUT ]; function i(e) { if (n.value) return; n.value = !0; let t = String(e?.type || ""), r = e?.detail || null; !t || t === B.OPEN_VIEWER || or(() => { try { window.dispatchEvent(new CustomEvent(t, { detail: r })); } catch (e) { console.debug?.(e); } }); } return Qp(), fr(() => { for (let e of r) try { window.addEventListener(e, i, { once: !1 }); } catch (e) { console.debug?.(e); } }), Or(() => { for (let e of r) try { window.removeEventListener(e, i); } catch (e) { console.debug?.(e); } }), (e, r) => n.value ? (V(), nr(K(t), { key: 0 })) : W("", !0); } }, em = { gridRenderCount: 0, gridRenderTotalMs: 0, searchQueryCount: 0, searchQueryTotalMs: 0, apiCallCount: 0, apiCallTotalMs: 0, apiErrorCount: 0, thumbnailLoadCount: 0, thumbnailLoadFailures: 0, errorCounts: {} }, tm = /* @__PURE__ */ new Map(); function nm(e) { let t = performance.now(); tm.set(e, t); try { performance.mark(`${e}-start`); } catch {} } function rm(e, t) { let n = tm.get(e); if (!n) return console.warn(`[Majoor Metrics] Timer not found: ${e}`), 0; let r = performance.now() - n; if (tm.delete(e), t) { let e = `${t}Count`, n = `${t}TotalMs`, i = em; typeof i[e] == "number" && (i[e]++, i[n] += r); } r > 100 && console.log(`[Majoor Metrics] ${e}: ${r.toFixed(2)}ms`); try { performance.mark(`${e}-end`), performance.measure(e, `${e}-start`, `${e}-end`); } catch {} return r; } function im(e) { return tm.has(e); } function am(e) { try { performance.mark(`${e}-start`); } catch {} } function om(e) { try { performance.mark(`${e}-end`), performance.measure(e, `${e}-start`, `${e}-end`); let t = performance.getEntriesByName(e)[0]?.duration || 0; return t > 100 && console.log(`[Majoor Metrics] Measure ${e}: ${t.toFixed(2)}ms`), t; } catch { return null; } } function sm(e, t = !1) { em.apiCallCount++, em.apiCallTotalMs += e, t && em.apiErrorCount++; } function cm(e) { em.gridRenderCount++, em.gridRenderTotalMs += e; } function lm(e) { em.searchQueryCount++, em.searchQueryTotalMs += e; } function um(e) { em.thumbnailLoadCount++, e || em.thumbnailLoadFailures++; } function dm(e, t) { em.errorCounts[e] = (em.errorCounts[e] || 0) + 1; } function fm() { return { ...em, averages: { gridRenderMs: em.gridRenderCount > 0 ? em.gridRenderTotalMs / em.gridRenderCount : 0, searchQueryMs: em.searchQueryCount > 0 ? em.searchQueryTotalMs / em.searchQueryCount : 0, apiCallMs: em.apiCallCount > 0 ? em.apiCallTotalMs / em.apiCallCount : 0 }, rates: { apiErrorRate: em.apiCallCount > 0 ? (em.apiErrorCount / em.apiCallCount * 100).toFixed(2) + "%" : "0%", thumbnailFailureRate: em.thumbnailLoadCount > 0 ? (em.thumbnailLoadFailures / em.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" } }; } function pm(e) { let t = `${e}Count`, n = `${e}TotalMs`, r = em, i = r[t], a = r[n]; return i > 0 ? a / i : 0; } function mm() { let e = em; Object.keys(e).forEach((t) => { typeof e[t] == "number" ? e[t] = 0 : typeof e[t] == "object" && (e[t] = {}); }), tm.clear(), console.log("[Majoor Metrics] Metrics reset"); } function hm() { let e = fm(); console.group("[Majoor Assets Manager] Performance Metrics"), console.table({ "Grid Renders": e.gridRenderCount, "Avg Grid Render": `${e.averages.gridRenderMs.toFixed(2)}ms`, "Search Queries": e.searchQueryCount, "Avg Search": `${e.averages.searchQueryMs.toFixed(2)}ms`, "API Calls": e.apiCallCount, "Avg API Call": `${e.averages.apiCallMs.toFixed(2)}ms`, "API Errors": e.apiErrorCount, "API Error Rate": e.rates.apiErrorRate, "Thumbnail Loads": e.thumbnailLoadCount, "Thumbnail Failures": e.thumbnailLoadFailures, "Failure Rate": e.rates.thumbnailFailureRate }), Object.keys(em.errorCounts).length > 0 && console.log("Error Counts:", em.errorCounts), console.groupEnd(); } typeof window < "u" && (window.MajoorMetrics = { startTimer: nm, endTimer: rm, hasTimer: im, mark: am, measure: om, trackApiCall: sm, trackGridRender: cm, trackSearchQuery: lm, trackThumbnailLoad: um, trackError: dm, getMetricsReport: fm, getAverageDuration: pm, resetMetrics: mm, exportMetrics: hm }); //#endregion //#region ui/features/status/StatusDot.ts var gm = [{ key: "exiftool", labelKey: "tool.exiftool", hintKey: "tool.exiftool.hint" }, { key: "ffprobe", labelKey: "tool.ffprobe", hintKey: "tool.ffprobe.hint" }], _m = !1, vm = null, ym = null, bm = "__MJR_STATUS_DOT_CACHE__", xm = { ACTIVE: "active", COOLDOWN: "cooldown", IDLE: "idle" }, Sm = { [xm.ACTIVE]: 2e3, [xm.COOLDOWN]: 1e4, [xm.IDLE]: 6e4 }; function Cm(e) { _m = !!e; try { globalThis._mjrMaintenanceActive = _m; } catch (e) { console.debug?.(e); } } function wm(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return "0 B"; let n = [ "B", "KB", "MB", "GB", "TB" ], r = t, i = 0; for (; r >= 1024 && i < n.length - 1;) r /= 1024, i += 1; let a = r >= 100 ? 0 : r >= 10 ? 1 : 2; return `${r.toFixed(a)} ${n[i]}`; } function Tm(e, t, n = null) { if (e && (e.replaceChildren(), (Array.isArray(t) ? t.filter((e) => e != null && String(e).trim() !== "") : []).forEach((t, n) => { n > 0 && e.appendChild(document.createElement("br")), e.appendChild(document.createTextNode(String(t))); }), n != null && String(n).trim() !== "")) { e.appendChild(document.createElement("br")); let t = document.createElement("span"); t.style.fontSize = "11px", t.style.opacity = "0.6", t.textContent = String(n), e.appendChild(t); } } function Em(e, t = []) { if (!e) return; let n = Array.isArray(t) ? t.filter((e) => e && String(e.label || "").trim()) : []; if (!n.length) return; let r = document.createElement("div"); r.className = "mjr-status-progress-list", r.style.cssText = "margin-top:8px;display:flex;flex-direction:column;gap:5px;min-width:220px;"; for (let e of n) { let t = Math.max(0, Math.min(100, Number(e.percent) || 0)), n = document.createElement("div"); n.className = "mjr-status-progress-row", n.style.cssText = "display:grid;grid-template-columns:minmax(72px,0.9fr) 1.8fr auto;gap:7px;align-items:center;"; let i = document.createElement("span"); i.className = "mjr-status-progress-label", i.textContent = String(e.label || ""), i.style.cssText = "font-size:10px;opacity:0.72;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;"; let a = document.createElement("div"); a.className = "mjr-status-progress-bar", a.style.cssText = "height:6px;border-radius:999px;background:rgba(255,255,255,0.12);overflow:hidden;"; let o = document.createElement("div"); o.className = "mjr-status-progress-fill", o.style.cssText = `height:100%;width:${t}%;border-radius:999px;background:${e.color || "var(--mjr-status-info, #64B5F6)"};`, a.appendChild(o); let s = document.createElement("span"); s.className = "mjr-status-progress-value", s.textContent = String(e.value || `${Math.round(t)}%`), s.style.cssText = "font-size:10px;opacity:0.72;white-space:nowrap;text-align:right;", n.appendChild(i), n.appendChild(a), n.appendChild(s), r.appendChild(n); } e.appendChild(r); } function Dm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { let i = Math.max(0, Number(t || e?.total_assets || 0) || 0); if (i <= 0) return []; let a = (e, t = i) => { let n = Math.max(0, Number(e || 0) || 0), r = Math.max(1, Number(t || 0) || 1); return Math.round(n / r * 100); }, o = Number(e?.images || 0) || 0, s = Number(e?.videos || 0) || 0, c = Number(e?.audio || 0) || 0, l = Number(e?.model3d || e?.by_kind?.model3d || 0) || 0, u = Math.max(0, Number(e?.enrichment_queue_length || 0) || 0), d = Math.max(i, i + u); return [ { label: "Images", percent: a(o), value: `${o.toLocaleString()} / ${a(o)}%`, color: "var(--mjr-badge-image, #2196F3)" }, { label: "Videos", percent: a(s), value: `${s.toLocaleString()} / ${a(s)}%`, color: "var(--mjr-badge-video, #F44336)" }, c || l ? { label: "Other", percent: a(c + l), value: `${(c + l).toLocaleString()} / ${a(c + l)}%`, color: "var(--mjr-status-browser, #26A69A)" } : null, { label: "Workflows", percent: a(n), value: `${Number(n || 0).toLocaleString()} / ${a(n)}%`, color: "var(--mjr-status-success, #4CAF50)" }, { label: "Gen data", percent: a(r), value: `${Number(r || 0).toLocaleString()} / ${a(r)}%`, color: "var(--mjr-status-warning, #FFA726)" }, u ? { label: "Enrich queue", percent: a(u, d), value: `${u.toLocaleString()} pending`, color: "var(--mjr-status-info, #64B5F6)" } : null ].filter(Boolean); } function Om(e, t, n) { if (!e) return; e.replaceChildren(), e.appendChild(document.createTextNode(String(t || ""))), e.appendChild(document.createElement("br")); let r = document.createElement("span"); r.style.fontSize = "11px", r.style.opacity = "0.7", r.textContent = String(n || ""), e.appendChild(r); } function km(e, t = "neutral", n = {}) { if (!e) return; let r = n?.toast !== !1, i = { neutral: { bg: "var(--bg-color, #1a1a1a)", border: "var(--border-color, #333)", glow: "transparent" }, info: { bg: "linear-gradient(135deg, rgba(33,150,243,0.14) 0%, rgba(100,181,246,0.08) 100%)", border: "rgba(33,150,243,0.55)", glow: "rgba(33,150,243,0.15)" }, success: { bg: "linear-gradient(135deg, rgba(76,175,80,0.16) 0%, rgba(139,195,74,0.08) 100%)", border: "rgba(76,175,80,0.55)", glow: "rgba(76,175,80,0.16)" }, warning: { bg: "linear-gradient(135deg, rgba(255,167,38,0.18) 0%, rgba(255,193,7,0.08) 100%)", border: "rgba(255,167,38,0.58)", glow: "rgba(255,167,38,0.18)" }, error: { bg: "linear-gradient(135deg, rgba(244,67,54,0.18) 0%, rgba(239,83,80,0.08) 100%)", border: "rgba(244,67,54,0.62)", glow: "rgba(244,67,54,0.2)" }, browser: { bg: "linear-gradient(135deg, rgba(0,150,136,0.18) 0%, rgba(38,166,154,0.08) 100%)", border: "rgba(0,150,136,0.58)", glow: "rgba(0,150,136,0.18)" }, workflow: { bg: "linear-gradient(135deg, rgba(186,104,200,0.20) 0%, rgba(244,143,177,0.14) 100%)", border: "rgba(216,127,186,0.62)", glow: "rgba(198,120,194,0.22)" } }, a = i[t] || i.neutral, o = String(e.dataset?.mjrStatusTone || "neutral"); if (e.style.background = a.bg, e.style.borderColor = a.border, e.style.boxShadow = `0 0 0 1px ${a.glow} inset`, e.dataset.mjrStatusTone = t, r && t !== o) { let n = Date.now(); if (n - (Number(e._mjrStatusToastAt || 0) || 0) >= 4e3) { e._mjrStatusToastAt = n; let r = { info: R("status.toast.info", "Index status: checking"), success: R("status.toast.success", "Index status: ready"), warning: R("status.toast.warning", "Index status: attention needed"), error: R("status.toast.error", "Index status: error"), browser: R("status.toast.browser", "Index status: browser scope"), workflow: R("status.toast.workflow", "Index status: workflow scope") }, i = t === "error" ? "error" : t === "warning" ? "warning" : t === "success" ? "success" : "info"; try { k(r[t] || r.info, i, 1800, { noHistory: !0 }); } catch (e) { console.debug?.(e); } } } } function Am(e) { let t = String(e || "").toLowerCase(); return t === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : t === "input" || t === "inputs" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Browser") : t === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); } function jm(e, t = "") { if (!e || typeof e != "object") return t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: Am(t) }) : R("status.watcher.disabled", "Watcher: disabled"); let n = !!e.enabled, r = e.scope ? String(e.scope) : ""; return n ? r ? R("status.watcher.enabledScoped", `Watcher: enabled (${r})`, { scope: Am(r) }) : R("status.watcher.enabled", "Watcher: enabled") : r || t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: Am(t && r && r !== t ? t : r || t) }) : R("status.watcher.disabled", "Watcher: disabled"); } function Mm(e = "status-action") { try { window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: String(e || "status-action") } })); } catch (e) { console.debug?.(e); } } function Nm(e = "status-action", t = {}) { try { window?.dispatchEvent?.(new CustomEvent("mjr-grid-dirty", { detail: { reason: String(e || "status-action"), ...t } })); } catch (e) { console.debug?.(e); } } function Pm(e = "") { try { window?.dispatchEvent?.(new CustomEvent(B.OPEN_MESSAGE_HISTORY, { detail: { reason: String(e || "status-action") } })); } catch (e) { console.debug?.(e); } } async function Fm(e = "") { return await Gt(R("dialog.vectorsReset.keepQuestion", "Keep existing AI vectors?\n\nConfirm = keep vectors\nCancel = continue without vectors"), e || R("dialog.vectorsReset.title", "AI vectors")); } function Im(e = {}) { let t = typeof e?.getScanContext == "function" ? e.getScanContext : null; Cm(!1); let n = document.createElement("div"); n.style.cssText = "margin-bottom: 20px; padding: 12px; background: var(--bg-color, #1a1a1a); border-radius: 6px; border: 1px solid var(--border-color, #333); cursor: pointer; transition: all 0.2s;", km(n, "info", { toast: !1 }); let r = document.createElement("div"); r.style.cssText = "display: flex; align-items: center; gap: 10px; margin-bottom: 8px;"; let i = document.createElement("span"); i.id = "mjr-status-dot", i.style.cssText = "width: 12px; height: 12px; border-radius: 50%; background: var(--mjr-status-info, #64B5F6); display: inline-block; cursor: pointer;"; let a = document.createElement("span"); a.id = "mjr-status-title", a.style.cssText = "font-weight: 500; font-size: 13px; cursor: pointer;"; let o = document.createElement("span"); o.id = "mjr-status-title-indicator", o.style.marginRight = "6px", o.textContent = "v", a.appendChild(o), a.appendChild(document.createTextNode(R("status.indexStatus", "Index Status"))), r.appendChild(i), r.appendChild(a); let c = document.createElement("div"); c.id = "mjr-status-body", c.style.marginLeft = "22px"; let l = document.createElement("div"); l.id = "mjr-status-text", l.style.cssText = "font-size: 12px; opacity: 0.8;", l.textContent = R("status.checking"); let u = document.createElement("div"); u.id = "mjr-status-capabilities", u.style.cssText = "font-size: 11px; opacity: 0.75; margin-top: 10px; display: flex; gap: 6px; flex-wrap: wrap;", u.textContent = R("status.discoveringTools"), c.appendChild(l), c.appendChild(u); let d = document.createElement("div"); d.id = "mjr-tools-status", d.style.cssText = "font-size: 11px; opacity: 0.7; margin-top: 10px;", d.textContent = R("status.toolStatusChecking", "Tool status: checking..."), c.appendChild(d); let f = document.createElement("div"); f.style.cssText = "margin-top: 10px; display: flex; gap: 8px; align-items: center; flex-wrap: wrap;"; let p = document.createElement("select"); p.style.cssText = "\n min-width: 240px;\n padding: 4px 8px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.2);\n background: rgba(255,255,255,0.04);\n color: inherit;\n ", p.title = R("status.dbBackupSelectHint", "Select a DB backup to restore"); let m = !1, h = null, g = (e) => { p.replaceChildren(); let t = document.createElement("option"); t.value = "", t.textContent = String(e || ""), t.disabled = !0, t.selected = !0, p.appendChild(t), m = !1, p.disabled = !0, h && (h.disabled = !0); }; g(R("status.dbBackupLoading", "Loading DB backups...")); let _ = async (e = "") => { try { let t = await ve(); if (!t?.ok) { g(R("status.dbBackupNone", "No DB backup found")); return; } let n = Array.isArray(t?.data?.items) ? t.data.items : []; if (!n.length) { g(R("status.dbBackupNone", "No DB backup found")); return; } p.replaceChildren(); let r = !1; for (let t of n) { let n = String(t?.name || ""); if (!n) continue; let i = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = i > 0 ? (/* @__PURE__ */ new Date(i * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${wm(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); c.value = n, c.textContent = s, e && e === n && (c.selected = !0, r = !0), p.appendChild(c); } m = p.childNodes.length > 0, p.disabled = !m, m && !r && p.childNodes[0] && (p.value = String(p.childNodes[0]?.value || "")), h && (h.disabled = !m); } catch { g(R("status.dbBackupNone", "No DB backup found")); } }; _(), f.appendChild(p); let v = document.createElement("button"); v.type = "button", v.textContent = R("btn.dbSave", "Save DB"), v.title = R("status.dbSaveHint", "Save a DB snapshot into archive folder"), v.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(120,200,255,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", v.onclick = async (e) => { e.stopPropagation(), Cm(!0); let r = v.textContent, a = !!h?.disabled; v.disabled = !0, h && (h.disabled = !0), v.textContent = R("btn.saving", "Saving..."), i.style.background = "var(--mjr-status-info, #64B5F6)", km(n, "info"); try { let e = await N(); if (e?.ok) { let t = String(e?.data?.name || "").trim(), n = Number(e?.data?.size_bytes || 0); k(R("toast.dbSaveSuccess", "Database backup saved"), "success", 2200, { history: { title: R("btn.dbSave", "Save DB"), detail: t ? `${t}${n > 0 ? ` | ${wm(n)}` : ""}` : R("toast.dbSaveSuccess", "Database backup saved"), operation: "save_db", source: t || "archive", forceStore: !0 } }), await _(t); } else k(e?.error || R("toast.dbSaveFailed", "Failed to save DB backup"), "error"); } catch (e) { k(e?.message || R("toast.dbSaveFailed", "Failed to save DB backup"), "error"); } finally { Cm(!1), v.disabled = !1, h && (h.disabled = a || !m), v.textContent = r; try { let e = t ? t() : null; await Gm(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } }, f.appendChild(v), h = document.createElement("button"), h.type = "button", h.textContent = R("btn.dbRestore", "Restore"), h.title = R("status.dbRestoreHint", "Restore selected DB backup"), h.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,180,80,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", h.onclick = async (e) => { e.stopPropagation(); let r = String(p.value || ""); if (!r) { k(R("toast.dbRestoreSelect", "Select a DB backup first"), "warning", 2e3); return; } if (!await Gt(`${R("dialog.dbRestore.confirm", "Restore selected DB backup? Current DB will be replaced.")}\n\n${r}`, R("btn.dbRestore", "Restore DB"))) return; k(R("toast.dbRestoreStarted", "DB restore started"), "info", 1800, { history: { trackId: "maintenance:restore_db", title: R("btn.dbRestore", "Restore DB"), detail: r, operation: "restore_db", source: r, status: "started", forceStore: !0 } }), Cm(!0); let a = h.textContent, o = !!v.disabled; h.disabled = !0, v.disabled = !0, p.disabled = !0, h.textContent = R("btn.restoring", "Restoring..."), i.style.background = "var(--mjr-status-warning, #FFA726)", km(n, "warning"); try { let e = await Oe({ name: r, useLatest: !1 }); e?.ok ? await _(String(e?.data?.name || r || "")) : k(e?.error || R("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); } catch (e) { k(e?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); } finally { Cm(!1), h.disabled = !m, v.disabled = o, p.disabled = !m, h.textContent = a, Mm("db-restore"); try { let e = t ? t() : null; await Gm(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } }, f.appendChild(h), c.appendChild(f); let y = document.createElement("div"); y.style.cssText = "margin-top: 10px; display: flex; justify-content: flex-end; gap: 8px; flex-wrap: wrap;"; let b = document.createElement("div"); b.style.cssText = "margin-top: 8px; font-size: 11px; opacity: 0.9; line-height: 1.35; white-space: pre-wrap;", b.textContent = ""; let S = (e, t = "neutral") => { let n = String(e || "").trim(); if (b.textContent = n, !n) { b.style.color = "inherit", b.style.opacity = "0.9"; return; } if (t === "error") { b.style.color = "var(--error-text-color, #ff8a80)", b.style.opacity = "1"; return; } if (t === "success") { b.style.color = "var(--success-text-color, #a5d6a7)", b.style.opacity = "1"; return; } if (t === "info") { b.style.color = "var(--input-text, #cfd8dc)", b.style.opacity = "0.95"; return; } b.style.color = "inherit", b.style.opacity = "0.9"; }, C, w = document.createElement("button"); w.type = "button", w.textContent = R("btn.resetIndex"), w.title = R("status.resetIndexHint", "Reset index cache (requires allowResetIndex in settings)."), w.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.25);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", w.onmouseenter = () => { w.style.borderColor = "rgba(255,255,255,0.6)", w.style.background = "rgba(255,255,255,0.08)"; }, w.onmouseleave = () => { w.style.borderColor = "rgba(255,255,255,0.25)", w.style.background = "transparent"; }, w.onclick = async (e) => { e.stopPropagation(); let r = await Fm(R("btn.resetIndex", "Reset index")); if (!await Gt(r ? R("dialog.resetIndex.confirmKeepVectors", "This will reset index data and rescan files while keeping existing AI vectors.\n\nContinue?") : R("dialog.resetIndex.msg", "This will delete the database and rescan all files. Continue?"), R("dialog.resetIndex.title", "Reset index?"))) return; Pm("reset-index"), Cm(!0); let a = w.textContent; w.disabled = !0, C.disabled = !0, w.textContent = R("btn.resetting"), i.style.background = "var(--mjr-status-info, #64B5F6)", km(n, "info"); try { let e = t ? t() : {}, a = String(e?.scope || "output").toLowerCase(), o = e?.customRootId || e?.custom_root_id || e?.root_id || null, s = a === "custom" && !o; (await Te({ scope: s ? "all" : a, customRootId: s ? null : o, reindex: !0, maintenance_force: !0, hard_reset_db: a === "all" && !r, clear_scan_journal: !0, clear_metadata_cache: !0, clear_asset_metadata: !0, clear_assets: !r, preserve_vectors: r, rebuild_fts: !0 }))?.ok ? (i.style.background = "var(--mjr-status-success, #4CAF50)", km(n, "success")) : (i.style.background = "var(--mjr-status-error, #f44336)", km(n, "error")); } catch { i.style.background = "var(--mjr-status-error, #f44336)", km(n, "error"); } finally { Cm(!1), w.disabled = !1, C.disabled = !1, w.textContent = a, Mm("index-reset"); try { let e = t ? t() : null; await Gm(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } }; let T = document.createElement("button"); T.type = "button", T.textContent = "Backfill vectors", T.title = "Compute missing AI vector embeddings for existing assets.", T.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(0, 188, 212, 0.45);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", T.onmouseenter = () => { T.style.borderColor = "rgba(0, 188, 212, 0.8)", T.style.background = "rgba(0, 188, 212, 0.12)"; }, T.onmouseleave = () => { T.style.borderColor = "rgba(0, 188, 212, 0.45)", T.style.background = "transparent"; }, T.onclick = async (e) => { e.stopPropagation(); let r = t ? t() : {}, a = String(r?.scope || "output").toLowerCase(), o = String(r?.customRootId || r?.custom_root_id || r?.root_id || "").trim(); if (a === "custom" && !o) { k(R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans"), "warning", 2600), S("Backfill skipped - Browser scope has no selected custom root.", "warning"); return; } let s = a || "output", c = Am(s); Pm("vector-backfill"); let d = { history: { trackId: `vector-backfill:status:${s}:${o || "default"}`, title: "Vector Backfill", source: c, operation: "vector_backfill", forceStore: !0 } }; Cm(!0); let f = T.textContent, p = w.textContent; T.disabled = !0, w.disabled = !0, C.disabled = !0, T.textContent = "Backfilling...", S(`Backfill started (${c})...`, "info"), x({ summary: "Vector Backfill", detail: `Started (${c})` }, "info", 0, { history: { ...d.history, status: "started", detail: `Started (${c})` } }), i.style.background = "var(--mjr-status-info, #64B5F6)", km(n, "info"); try { let e = { scope: s, onProgress: (e) => { let t = String(e?.status || "").toLowerCase(), n = e?.progress || e?.result || {}, r = Number(n?.candidates || n?.processed || 0), i = Number(n?.candidate_total || r || 0), a = Number(n?.eligible_total || n?.total_assets || 0), o = Number(n?.indexed || 0), s = Number(n?.skipped || 0), l = Number(n?.errors || 0); if (t === "queued") { S("Backfill queued...", "info"), x({ summary: "Vector Backfill", detail: `Queued (${c})` }, "info", 0, { history: { ...d.history, status: "queued", detail: `Queued (${c})`, progress: { current: 0, total: 1, percent: 0, label: "queued" } } }); return; } if (t === "running" || r > 0 || i > 0 || a > 0 || o > 0 || s > 0 || l > 0) { let e = a > 0 ? `Indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${l}` : `Candidates ${r}, indexed ${o}, skipped ${s}, errors ${l}`; S(a > 0 ? `Backfill running - indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${l}` : `Backfill running - candidates ${r}, indexed ${o}, skipped ${s}, errors ${l}`, "info"), x({ summary: "Vector Backfill", detail: e }, "info", 0, { history: { ...d.history, status: "running", detail: e, progress: { current: a > 0 ? o : o + s + l, total: a > 0 ? a : Math.max(r, o + s + l), percent: a > 0 ? Math.round(o / a * 100) : Math.max(r, o + s + l) > 0 ? Math.round((o + s + l) / Math.max(r, o + s + l) * 100) : null, eligible_total: a > 0 ? a : void 0, candidate_total: i > 0 ? i : void 0, indexed: o, skipped: s, errors: l, label: "running" } } }); } } }; s === "custom" && o && (e.customRootId = o); let t = await D(64, e); if (t?.ok) { let e = String(t?.data?.status || "").toLowerCase(), r = !!t?.data?.pending || [ "queued", "running", "pending" ].includes(e), a = t?.data?.progress || {}, o = Number(t?.data?.processed ?? a?.candidates ?? 0), s = Number(t?.data?.indexed ?? a?.indexed ?? 0), c = Number(t?.data?.skipped ?? a?.skipped ?? 0), l = Number(t?.data?.errors ?? a?.errors ?? 0); if (r) { let e = String(t?.data?.backfill_id || "").trim(), r = R("toast.vectorBackfillRunning", "Vector backfill still running in background{job}.", { job: e ? ` (${e.slice(0, 8)})` : "" }); k(r, "info", 4200, { history: { ...d.history, status: "running", detail: `Running in background${e ? ` (${e.slice(0, 8)})` : ""}.`, progress: { current: s + c + l, total: Math.max(o, s + c + l), percent: Math.max(o, s + c + l) > 0 ? Math.round((s + c + l) / Math.max(o, s + c + l) * 100) : null, indexed: s, skipped: c, errors: l, label: "running" } } }), S(`Backfill running in background - candidates ${o}, indexed ${s}, skipped ${c}, errors ${l}`, "info"), i.style.background = "var(--mjr-status-info, #64B5F6)", km(n, "info"); } else k(R("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { processed: o, indexed: s, skipped: c }), "success", 3e3, { history: { ...d.history, status: "succeeded", detail: `Processed ${o}, indexed ${s}, skipped ${c}`, progress: { current: o, total: o, percent: o > 0 ? 100 : null, indexed: s, skipped: c, errors: l, label: "done" } } }), S(`Backfill OK - processed ${o}, indexed ${s}, skipped ${c}`, "success"), i.style.background = "var(--mjr-status-success, #4CAF50)", km(n, "success"); } else { let e = String(t?.error || R("toast.vectorBackfillFailedGeneric", "Backfill failed")), r = String(t?.code || "").trim(), a = Number(t?.status || 0) || 0, o = [ r ? `code=${r}` : "", a ? `status=${a}` : "", e ].filter(Boolean).join(" | "); k(o, "error", 4500, { history: { ...d.history, status: "failed", detail: o, progress: { label: "failed", errors: 1 } } }), S(`Backfill ? - ${o}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", t), i.style.background = "var(--mjr-status-error, #f44336)", km(n, "error"); } } catch (e) { let t = String(e?.message || e || "Backfill failed"); k(t, "error", 4500, { history: { ...d.history, status: "failed", detail: t, progress: { label: "failed", errors: 1 } } }), S(`Backfill EXCEPTION - ${t}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", e), i.style.background = "var(--mjr-status-error, #f44336)", km(n, "error"); } finally { Cm(!1), T.disabled = !1, w.disabled = !1, C.disabled = !1, T.textContent = f, w.textContent = p, Mm("vector-backfill"); try { let e = t ? t() : null; await Gm(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } }, C = document.createElement("button"), C.type = "button", C.textContent = R("btn.memoryPurge", "Memory purge"), C.title = R("tooltip.memoryPurge", "Unload Majoor AI models, ask ComfyUI to unload loaded models, and clear torch cache when idle."), C.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(156, 204, 101, 0.45);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", C.onmouseenter = () => { C.style.borderColor = "rgba(156, 204, 101, 0.85)", C.style.background = "rgba(156, 204, 101, 0.12)"; }, C.onmouseleave = () => { C.style.borderColor = "rgba(156, 204, 101, 0.45)", C.style.background = "transparent"; }, C.onclick = async (e) => { e.stopPropagation(); let r = C.textContent; C.disabled = !0, T.disabled = !0, w.disabled = !0, C.textContent = R("btn.memoryPurging", "Purging..."), S(R("status.memoryPurgeStarted", "Memory purge started..."), "info"), i.style.background = "var(--mjr-status-info, #64B5F6)", km(n, "info"); try { let e = await Ae(); if (e?.ok) { let t = e?.data?.comfy_models ? R("toast.memoryPurgeComplete", "Memory purge complete. Majoor AI and ComfyUI model caches were released.") : R("toast.memoryPurgeCompleteMajoorOnly", "Memory purge complete. Majoor AI caches were released."); k(t, "success", 3200), S(t, "success"), i.style.background = "var(--mjr-status-success, #4CAF50)", km(n, "success"); } else { let t = String(e?.error || "Memory purge failed"); k(t, "error", 4500), S(t, "error"), i.style.background = "var(--mjr-status-error, #f44336)", km(n, "error"); } } catch (e) { let t = String(e?.message || e || "Memory purge failed"); k(t, "error", 4500), S(t, "error"), i.style.background = "var(--mjr-status-error, #f44336)", km(n, "error"); } finally { C.disabled = !1, T.disabled = !1, w.disabled = !1, C.textContent = r; try { let e = t ? t() : null; await Gm(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } }, y.appendChild(T), y.appendChild(C), y.appendChild(w), c.appendChild(b); let E = document.createElement("button"); E.type = "button", E.textContent = R("btn.deleteDb"), E.title = R("tooltip.deleteDb", "Force-delete database and rebuild from scratch"), E.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,80,80,0.4);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", E.onmouseenter = () => { E.style.borderColor = "rgba(255,80,80,0.8)", E.style.background = "rgba(255,80,80,0.12)"; }, E.onmouseleave = () => { E.style.borderColor = "rgba(255,80,80,0.4)", E.style.background = "transparent"; }, E.onclick = async (e) => { e.stopPropagation(); let r = await Fm(R("btn.deleteDb", "Delete DB")); if (!await Gt(r ? R("dialog.dbDelete.keepVectorsConfirm", "This will reset index data and keep existing AI vectors. Database files will not be force-deleted.\n\nContinue?") : R("dialog.dbDelete.confirm", "This will permanently delete the index database and rebuild it from scratch. All ratings, tags, and cached metadata will be lost.\n\nContinue?"), R("btn.deleteDb", "Delete DB"))) return; Cm(!0); let a = E.textContent; E.disabled = !0, E.textContent = r ? R("btn.resetting", "Resetting...") : R("btn.deletingDb"), w.disabled = !0, C.disabled = !0, i.style.background = "var(--mjr-status-info, #64B5F6)", km(n, "info"); try { (r ? await Te({ scope: "all", reindex: !0, maintenance_force: !0, hard_reset_db: !1, clear_scan_journal: !0, clear_metadata_cache: !0, clear_asset_metadata: !0, clear_assets: !1, preserve_vectors: !0, rebuild_fts: !0 }) : await s())?.ok ? (globalThis._mjrCorruptToastShown = !1, i.style.background = "var(--mjr-status-success, #4CAF50)", km(n, "success")) : (i.style.background = "var(--mjr-status-error, #f44336)", km(n, "error")); } catch { i.style.background = "var(--mjr-status-error, #f44336)", km(n, "error"); } finally { Cm(!1), E.disabled = !1, E.textContent = a, w.disabled = !1, C.disabled = !1, Mm(r ? "index-reset-preserve-vectors" : "db-force-delete"); try { let e = t ? t() : null; await Gm(i, l, u, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } } }, y.appendChild(E), c.appendChild(y), n.appendChild(r), n.appendChild(c); let O = n.querySelector("#mjr-status-title"); O && O.addEventListener("click", (e) => { e.stopPropagation(); let t = n.querySelector("#mjr-status-body"); if (!t) return; let r = t.style.display === "none"; Hm(n, !r); }), Hm(n, !0), n.onmouseenter = () => { n.style.transform = "translateY(-1px)"; }, n.onmouseleave = () => { n.style.transform = "", km(n, n.dataset?.mjrStatusTone || "neutral", { toast: !1 }); }; let A = async (e) => { try { let r = e?.detail || {}, a = String(r?.step || ""); if (!a) return; let o = a === "started" || a === "stopping_workers" || a === "resetting_db" || a === "delete_db" || a === "recreate_db" || a === "replacing_files" || a === "restarting_scan"; if (o ? Cm(!0) : (a === "failed" || a === "done") && Cm(!1), !n?.isConnected || !i?.isConnected || !l?.isConnected) return; if (o) { i.style.background = "var(--mjr-status-info, #64B5F6)", km(n, "info", { toast: !1 }), Om(l, R("status.pending", "Pending..."), R("status.dbRestoreInProgress", "Database restore in progress")); return; } if (a === "failed") { i.style.background = "var(--mjr-status-error, #f44336)", km(n, "error", { toast: !1 }), Tm(l, [R("status.error", "Error"), String(r?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"))]); return; } if (a === "done") { i.style.background = "var(--mjr-status-success, #4CAF50)", km(n, "success", { toast: !1 }); let e = String(r?.operation || ""), a = e === "delete_db" ? R("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed.") : e === "reset_index" ? R("toast.resetStarted", "Index reset started. Files will be reindexed in the background.") : R("toast.dbRestoreSuccess", "Database backup restored"); Om(l, R("status.ready", "Ready"), a); try { let e = t ? t() : null; setTimeout(() => { Gm(i, l, u, e, null, { force: !0 }); }, 600); } catch (e) { console.debug?.(e); } } } catch (e) { console.debug?.(e); } }; try { let e = vm; typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), vm = A, n._mjrDbRestoreStatusHandler = A, window.addEventListener("mjr-db-restore-status", A); } catch (e) { console.debug?.(e); } let j = (e) => { try { let t = e?.detail || {}, n = Number(t?.queue_remaining), r = Number(t?.progress_value), i = Number(t?.progress_max), a = Array.isArray(t?.cached_nodes) ? t.cached_nodes.length : 0, o = String(t?.active_prompt_id || "").trim(), s = [ Number.isFinite(r) && Number.isFinite(i) && i > 0 ? R("status.runtimeProgress", "Runtime progress: {value}/{max}", { value: r, max: i }) : "", Number.isFinite(n) ? R("status.queueRemaining", "Queue remaining: {count}", { count: Math.max(0, n) }) : "", a > 0 ? R("status.executionCached", "Cached nodes reused: {count}", { count: a }) : "", o ? R("status.activePrompt", "Active prompt: {id}", { id: o }) : "" ].filter(Boolean); if (!s.length) return; let c = l?.querySelector?.("span"); c ? c.textContent = s.join(" | ") : Om(l, R("status.ready", "Ready"), s.join(" | ")); } catch (e) { console.debug?.(e); } }; try { let e = ym; typeof e == "function" && window.removeEventListener(B.RUNTIME_STATUS, e), ym = j, window.addEventListener(B.RUNTIME_STATUS, j); } catch (e) { console.debug?.(e); } return n; } async function Lm(e, t, n = null, r = null) { if (_m) { k(R("status.maintenanceBusy", "Database maintenance in progress. Please wait."), "warning", 2200); return; } let i = t?.closest?.("#mjr-status-body")?.parentElement || t?.closest?.("div"), a = String(r?.scope || "output").toLowerCase(), o = r?.customRootId || r?.custom_root_id || r?.root_id || null; if (a === "custom" && !o) { e.style.background = "var(--mjr-status-info, #64B5F6)", km(i, "info"), Om(t, R("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); return; } try { let e = Date.now(), n = globalThis?._mjrScanInFlight; if (n && typeof n == "object") { let r = e - Number(n.at || 0); if (r >= 0 && r < 6e5) { Om(t, R("status.scanInProgress", "Scan already running..."), R("status.scanInProgressHint", "Please wait for the current scan to finish")); return; } } globalThis._mjrScanInFlight = { at: e, scope: a, root_id: o || null }; } catch (e) { console.debug?.(e); } let s = () => { try { globalThis?._mjrScanInFlight && (globalThis._mjrScanInFlight = null); } catch (e) { console.debug?.(e); } }, c = null; try { let e = await ae(lt.ROOTS); e.ok && (c = e.data); } catch (e) { console.debug?.(e); } if (!c) { let n = await ae(lt.CONFIG); if (!n.ok) { e.style.background = "var(--mjr-status-error, #f44336)", km(i, "error"), t.textContent = R("status.errorGetConfig"), s(); return; } c = { output_directory: n.data.output_directory }; } let l = a === "all" ? R("scope.all", "Inputs + Outputs") : a === "input" ? R("scope.input", "Inputs") : a === "custom" ? R("scope.custom", "Custom") : a === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"), u = ""; if (a === "input") u = c?.input_directory ? ` (${c.input_directory})` : ""; else if (a === "custom") { let e = Array.isArray(c?.custom_roots) ? c.custom_roots : [], t = o ? e.find((e) => e?.id === o) : null; u = t?.path ? ` (${t.path})` : ""; } else a === "output" && (u = c?.output_directory ? ` (${c.output_directory})` : ""); e.style.background = "var(--mjr-status-info, #64B5F6)", km(i, "info"), Om(t, R("status.scanningScope", `Scanning ${l}${u}...`, { scope: l, detail: u }), R("status.scanningHint", "This may take a while")); let d = { scope: a, recursive: !0, incremental: !0, fast: !!(mn()?.scan?.fastMode ?? !0), background_metadata: !0 }; if (a === "custom") { if (!o) { e.style.background = "var(--mjr-status-error, #f44336)", km(i, "error"), t.textContent = R("status.selectCustomFolder"), s(); return; } d.custom_root_id = o; } let f; try { f = await le(lt.SCAN, d); } finally { s(); } if (f?.ok) { let r = f.data; e.style.background = "var(--mjr-status-success, #4CAF50)", km(i, "success"), Om(t, R("toast.scanComplete"), R("status.scanStats", `Added: ${r.added || 0} - Updated: ${r.updated || 0} - Skipped: ${r.skipped || 0}`, { added: r.added || 0, updated: r.updated || 0, skipped: r.skipped || 0 })), Nm("scan-complete", { stats: { added: r.added || 0, updated: r.updated || 0, skipped: r.skipped || 0 } }), setTimeout(() => { Gm(e, t, n); }, 2e3); } else e.style.background = "var(--mjr-status-error, #f44336)", km(i, "error"), Tm(t, [R("toast.scanFailed") + `: ${f?.error || "Unknown error"}`]), setTimeout(() => { Gm(e, t, n); }, 3e3); } function Rm(e, t, n) { let r = document.createElement("span"); return r.style.cssText = "\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.1);\n ", r.textContent = `${t ? "OK" : "ERR"} ${e}`, r.title = t ? R("status.toolAvailable", `${e} available`, { tool: e }) : n || R("status.toolUnavailable", `${e} unavailable`, { tool: e }), r.style.opacity = t ? "1" : "0.75", r; } function zm(e, t = {}, n = {}) { if (!e) return; if (e.replaceChildren(), !t || Object.keys(t).length === 0) { e.textContent = R("status.discoveringTools"); return; } let r = document.createElement("div"); r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", gm.forEach(({ key: e, labelKey: i, hintKey: a }) => { let o = !!t[e], s = n[e], c = R(i, e), l = R(a, ""); r.appendChild(Vm({ label: c, hint: l }, o, s)); }), e.appendChild(r); } function Bm(e, t = null, n = {}) { if (!e) return; let r = e.parentElement; if (!r) return; let i = r.querySelector("#mjr-tools-status"); if (!i) return; let a = n && Object.keys(n).length > 0; if (!t && !a) { i.textContent = R("status.toolStatusChecking", "Tool status: checking..."); return; } i.textContent = gm.map(({ key: e, labelKey: r }) => { let i = R(r, e), a = t && e in t ? t[e] : void 0, o = e in n ? n[e] : void 0, s = a === void 0 ? o : a, c = s == null ? R("status.unknown", "unknown") : s ? R("status.available", "available") : R("status.missing", "missing"), l = t?.versions?.[e]; return l ? `${i}: ${c} - ${l}` : `${i}: ${c}`; }).join(" | "); } function Vm({ label: e, hint: t }, n, r) { let i = document.createElement("div"); i.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 3px;\n padding: 6px 8px;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.03);\n border: 1px solid rgba(255, 255, 255, 0.08);\n min-width: 170px;\n "; let a = Rm(e, n, t); a.style.fontWeight = "500", i.appendChild(a); let o = document.createElement("span"); return o.style.fontSize = "10px", o.style.opacity = "0.7", o.style.wordBreak = "break-all", o.textContent = R("status.path", "Path") + `: ${r || R("status.pathAuto", "auto / not configured")}`, i.appendChild(o), i; } function Hm(e, t) { let n = e.querySelector("#mjr-status-body"), r = e.querySelector("#mjr-status-title-indicator"); !n || !r || (t ? (n.style.display = "none", r.textContent = ">") : (n.style.display = "", r.textContent = "v")); } function Um(e, t) { let n = !!e?.database?.available, r = t?.diagnostics || {}, i = !!r?.malformed, a = !!r?.locked; return !n || i ? R("status.dbHealthError", "DB health: error") : a ? R("status.dbHealthLocked", "DB health: locked") : R("status.dbHealthOk", "DB health: ok"); } function Wm(e, t) { let n = Number(e?.total_assets || 0), r = e?.last_index_end, i = e?.last_scan_end, a = t === "all" ? R("scope.all", "Inputs + Outputs") : t === "input" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Custom") : t === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); return !Number.isFinite(n) || n <= 0 ? `${R("status.indexHealthEmpty", "Index health: empty")} (${a})` : !r && !i ? `${R("status.indexHealthPartial", "Index health: partial")} (${a})` : `${R("status.indexHealthOk", "Index health: ok")} (${a})`; } async function Gm(e, t, n = null, r = null, i = null, a = {}) { let o = t?.closest?.("#mjr-status-body")?.parentElement || t?.closest?.("div"), s = a?.signal || null, c = !!a?.force; try { if (!e?.isConnected || !t?.isConnected) return null; } catch (e) { console.debug?.(e); } try { if (!c && _m) return null; } catch (e) { console.debug?.(e); } i && typeof i == "object" && (i.lastCode = null, i.lastStatus = null); let l = String(r?.scope || "output").toLowerCase(), u = l === "workflow" ? "all" : l, d = r?.customRootId || r?.custom_root_id || r?.root_id || null, f = l === "custom" && !d, p = f ? `${lt.HEALTH_COUNTERS}?scope=all` : u === "custom" ? `${lt.HEALTH_COUNTERS}?scope=custom&custom_root_id=${encodeURIComponent(String(d || ""))}` : `${lt.HEALTH_COUNTERS}?scope=${encodeURIComponent(u || "output")}`, m = !!a?.lightweight, h = !(!c && i && typeof i == "object" && Number(i._scanAuxBackoffUntil || 0) > Date.now()) && (c || !m || !(i && typeof i == "object" && i._auxCached)), g, _, v, y = null; if (h) { let [e, t, n] = await Promise.all([ ae(p, s ? { signal: s } : void 0), ae(lt.HEALTH, s ? { signal: s } : void 0), ae(lt.HEALTH_DB, s ? { signal: s } : void 0) ]); g = e, _ = t, v = n; try { let e = await _e(s ? { signal: s } : void 0); e?.ok && (y = e.data); } catch (e) { console.debug?.(e); } i && typeof i == "object" && (i._auxCached = !0, i._healthCache = _, i._dbDiagCache = v, i._toolsCache = y); } else g = await ae(p, s ? { signal: s } : void 0), _ = i?._healthCache || null, v = i?._dbDiagCache || null, y = i?._toolsCache || null; try { if (s?.aborted) return null; } catch (e) { console.debug?.(e); } try { if (!e?.isConnected || !t?.isConnected) return null; } catch (e) { console.debug?.(e); } if (i && typeof i == "object" && (i.lastCode = g?.code || null, i.lastStatus = typeof g?.status == "number" ? g.status : null), g.ok) { let r = g.data; i && typeof i == "object" && (i._scanAuxBackoffUntil = r?.scan_active ? Date.now() + 3e4 : 0); let a = r.total_assets || 0, c = r.with_workflows - 0, u = r.with_generation_data - 0, p = Math.max(0, Number(c || 0) || 0), m = r.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", b = r.tool_availability || {}, x = r.tool_paths || {}, S = R("status.dbSize", "Database size: {size}", { size: wm(r.db_size_bytes || 0) }), C = _?.ok && _?.data && _.data.vector || {}, w = C?.enabled !== !1, T = !!C?.loaded, E = !!C?.degraded, D = String(C?.last_error || "").trim(), O = w ? E ? `AI vector: degraded${D ? ` (${D})` : ""}` : T ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", k = Um(_?.data || null, v?.data || null), A = Wm(r, f ? "all" : l), j = !!(_?.ok && _?.data?.database?.available), M = v?.ok && v?.data?.diagnostics || {}, N = !!M?.malformed, P = !!M?.locked, F = !!M?.maintenance_active; Cm(F); let ee = Math.max(0, Number(r?.enrichment_queue_length || 0) || 0), te = Lt().active || ee > 0; Ct(te, ee); let I = Number(a) > 0, ne = !!(r?.last_index_end || r?.last_scan_end), re = I && ne, ie = "success"; F || te ? ie = "info" : !j || N ? ie = "error" : (P || !re || E) && (ie = "warning"); let ae = l === "workflow", oe = f && ie !== "error" ? "browser" : ae && ie !== "error" ? "workflow" : ie, se = r.watcher; try { if (!se || typeof se.enabled != "boolean") { let e = await fe(s ? { signal: s } : void 0); e?.ok && e.data && (se = { enabled: !!e.data.enabled, scope: r?.watcher?.scope || l, custom_root_id: d || null }); } } catch (e) { console.debug?.(e); } let ce = ae ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.workflow", "Workflow") }) : f ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.customBrowser", "Browser") }) : jm(se, l), le = te ? R("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: ee }) : R("status.enrichmentIdle", "Metadata enrichment: idle"); zm(n, b, x), Bm(n, y, b); let ue = l === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : l === "input" ? R("scope.input", "Inputs") : l === "custom" ? R("scope.customBrowser", "Browser") : l === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); return ie === "error" ? (e.style.background = "var(--mjr-status-error, #f44336)", km(o, "error"), Om(t, R("status.dbCorrupted", "Database appears corrupted or unavailable."), [ k, A, S, ce ].filter(Boolean).join(" | ")), r) : f ? (e.style.background = "var(--mjr-status-browser, #26A69A)", km(o, "browser"), Om(t, R("status.ready", "Ready"), [R("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), ce].filter(Boolean).join(" | ")), r) : ae ? (e.style.background = "#d481c3", km(o, oe), Tm(t, [ R("status.workflowsIndexed", `${p.toLocaleString()} workflows indexed (${ue})`, { count: p.toLocaleString(), scope: ue }), R("status.assetsCountReference", `Asset records in DB: ${a.toLocaleString()}`, { count: a.toLocaleString() }), le, O, k, A, S, ce ], R("status.lastScan", `Last scan: ${h}`, { date: h })), r) : (a === 0 ? (e.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", km(o, oe), Om(t, R("status.noAssets", `No assets indexed yet (${ue})`, { scope: ue }), [ R("status.clickToScan", "Click the dot to start a scan"), O, k, A, S, ce ].filter(Boolean).join(" | "))) : (e.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", km(o, oe), Tm(t, [ R("status.assetsIndexed", `${a.toLocaleString()} assets indexed (${ue})`, { count: a.toLocaleString(), scope: ue }), Zm(r), R("status.withWorkflows", `With workflows: ${c} - Generation data: ${u}`, { workflows: c, gendata: u }), le, O, k, A, S, ce ], R("status.lastScan", `Last scan: ${h}`, { date: h })), Em(t, Dm(r, { totalAssets: a, withWorkflows: c, withGenerationData: u }))), r); } if (zm(n, {}, {}), Bm(n, y), e.style.background = "var(--mjr-status-error, #f44336)", km(o, "error"), g?.code === "INVALID_RESPONSE" && g?.status === 404) Om(t, R("status.apiNotFound", "Majoor API endpoints not found (404)"), R("status.apiNotFoundHint", "Backend routes are not loaded. Restart ComfyUI and check the terminal for Majoor import errors.")); else { let e = String(g?.error || "").toLowerCase(); e.includes("malform") || e.includes("corrupt") || e.includes("disk image") ? (Om(t, R("status.dbCorrupted"), R("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, k(R("toast.resetFailedCorrupt"), "error", 8e3))) : Tm(t, [g.error || R("status.errorChecking", "Error checking status")]); } if (g.code === "SERVICE_UNAVAILABLE") { let i = Km(e, t, n, r); t.appendChild(document.createElement("br")), t.appendChild(i); } return null; } function Km(e, t, n = null, r = null) { let i = document.createElement("button"); return i.textContent = R("btn.retryServices"), i.style.cssText = "\n padding: 4px 10px;\n margin-top: 6px;\n font-size: 11px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.3);\n background: transparent;\n color: white;\n cursor: pointer;\n ", i.onclick = async () => { i.disabled = !0, i.textContent = R("btn.retrying"); let a = await le(lt.RETRY_SERVICES, {}); i.disabled = !1, i.textContent = R("btn.retryServices"), a.ok ? Gm(e, t, n, r) : (Tm(t, [a.error || R("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); }, i; } function qm() { try { let e = localStorage?.getItem?.(bm); if (!e) return null; let t = JSON.parse(e); return t && typeof t == "object" ? t : null; } catch (e) { return console.debug?.(e), null; } } function Jm(e) { try { if (!e || typeof e != "object") return; localStorage?.setItem?.(bm, JSON.stringify(e)); } catch (e) { console.debug?.(e); } } function Ym(e) { let t = [], n = (e, r = 0) => { if (!(!e || r > 2)) { if (typeof e == "number" && Number.isFinite(e)) { t.push(e); return; } if (Array.isArray(e)) { for (let t of e) n(t, r + 1); return; } if (typeof e == "object") for (let [t, i] of Object.entries(e)) { let e = String(t || "").toLowerCase(); (e.includes("queue") || e.includes("progress") || e.includes("pending") || e.includes("running") || e.includes("active") || e.includes("scan") || e.includes("index")) && n(i, r + 1); } } }; return n(e, 0), t; } function Xm(e) { if (!e || typeof e != "object") return !1; if (_m) return !0; try { if (Lt()?.active) return !0; } catch (e) { console.debug?.(e); } return Ym(e).some((e) => Number(e) > 0); } function Zm(e) { let t = []; e.images && t.push(`Images: ${e.images}`), e.videos && t.push(`Videos: ${e.videos}`), e.audio && t.push(`Audio: ${e.audio}`); let n = e.model3d || e.by_kind?.model3d || 0; return n && t.push(`3D: ${n}`), t.length ? t.join(" - ") : "Images: 0 - Videos: 0"; } function Qm(e) { if (!e || typeof e != "object") return ""; let t = (e) => e == null ? null : typeof e == "number" ? Number.isFinite(e) ? e : null : typeof e == "boolean" || typeof e == "string" ? e : null; return JSON.stringify({ total_assets: t(e.total_assets), last_scan_end: t(e.last_scan_end), last_index_end: t(e.last_index_end), enrichment_queue_length: t(e.enrichment_queue_length), images: t(e.images), videos: t(e.videos), audio: t(e.audio), model3d: t(e.model3d ?? e.by_kind?.model3d), watcher: { enabled: t(e?.watcher?.enabled), scope: t(e?.watcher?.scope) } }); } function $m(e, t, n) { let r = qm(); if (!r) return !1; try { zm(n, r.tool_availability || {}, r.tool_paths || {}); } catch (e) { console.debug?.(e); } try { return e.style.background = "var(--mjr-status-info, #64B5F6)", Om(t, R("status.cached", "Last known status"), R("status.checking", "Checking status...")), !0; } catch (e) { return console.debug?.(e), !1; } } function eh(e, t, n) { let r = Qm(t), i = r && r !== String(n?.lastSignature || ""), a = Xm(t), o = e || xm.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; return a || i ? (o = xm.ACTIVE, s = 0) : o === xm.ACTIVE ? (o = xm.COOLDOWN, s = 0) : o === xm.COOLDOWN ? (s += 1, s >= 3 && (o = xm.IDLE, s = 0)) : (o = i ? xm.ACTIVE : xm.IDLE, s = 0), { nextState: o, signature: r, hasChange: i, hasActiveWork: a, cooldownStablePolls: s }; } function th(e, t, n, r = null, i = null, a = null) { let o = "__MJR_STATUS_POLL_DISPOSE__", s = { lastCode: null, lastStatus: null, _pollTick: 0, _auxCached: !1 }, c = { mode: xm.ACTIVE, cooldownStablePolls: 0, lastSignature: "" }, l = typeof AbortController < "u" ? new AbortController() : null, u = async () => { try { if (l?.signal?.aborted) return null; } catch (e) { console.debug?.(e); } s._pollTick = Number(s._pollTick || 0) + 1; let n = s._pollTick > 1 && s._pollTick % 4 != 0, o = await Gm(e, t, r, typeof a == "function" ? a() : null, s, { signal: l?.signal || null, lightweight: n, force: !!_m || s._pollTick <= 1 }); if (o && typeof o == "object") { Jm(o); let e = eh(c.mode, o, c); c.mode = e.nextState, c.lastSignature = e.signature, c.cooldownStablePolls = e.cooldownStablePolls; } if (o && typeof i == "function") try { await i(o); } catch (e) { console.debug?.(e); } return o; }; $m(e, t, r), u(); try { n._mjrStatusPollDispose?.(); } catch (e) { console.debug?.(e); } try { let e = window?.[o]; typeof e == "function" && e(); } catch (e) { console.debug?.(e); } let d = null, f = 0, p = !1, m = () => { try { let e = typeof document < "u" && !!document.hidden, t = typeof document < "u" && typeof document.hasFocus == "function" && !document.hasFocus(); if (e || t) return 4; } catch (e) { console.debug?.(e); } return 1; }, h = () => { let e = Sm[c.mode] || Math.max(250, Number(z.STATUS_POLL_INTERVAL) || 2e3), t = p ? Math.max(3e4, e) : f > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + f))) : e, r = Math.min(12e4, Math.round(t * m())); d = setTimeout(async () => { try { if (l?.signal?.aborted) return; } catch (e) { console.debug?.(e); } let e = await u(); if (p = s.lastCode === "INVALID_RESPONSE" && s.lastStatus === 404, e ? f = 0 : p ? f = Math.min(999, f + 1) : (f = Math.min(999, f + 1), c.mode = xm.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) { try { n._mjrStatusPollDispose?.(); } catch (e) { console.debug?.(e); } return; } h(); }, r); }; n._mjrStatusPollDispose = () => { try { l?.abort?.(); } catch (e) { console.debug?.(e); } d && clearTimeout(d), d = null; }; try { window[o] = n._mjrStatusPollDispose; } catch (e) { console.debug?.(e); } h(); let g = n.querySelector("#mjr-status-dot"); g && (g.onclick = (n) => { n.stopPropagation(), Lm(e, t, r, typeof a == "function" ? a() : null); }, g.title = R("status.clickToScan", "Click to scan")); } //#endregion //#region ui/vue/composables/useActiveAsset.ts var nh = yr(null), rh = yr(null); function ih() { return { activeAsset: nh, onUpdateCallback: rh }; } function ah(e, t) { rh.value = typeof t == "function" ? t : null, nh.value = e ?? null; } function oh() { nh.value = null, rh.value = null; } function sh(e, t) { if (!(!nh.value || !e)) { nh.value = { ...nh.value, ...e }; try { let e = t ?? rh.value; typeof e == "function" && e(nh.value); } catch {} } } //#endregion //#region ui/components/sidebar/SidebarView.ts var ch = 360, lh = 240, uh = 640; function dh() { try { let e = mn(), t = Number(e?.sidebar?.widthPx); return Number.isFinite(t) ? Math.max(lh, Math.min(uh, Math.round(t))) : ch; } catch { return ch; } } function fh(e, t) { if (!e) return; let n = String(e?.dataset?.position || "right").toLowerCase() === "left", r = "var(--mjr-border, rgba(255,255,255,0.12))"; if (t) { let t = `${dh()}px`; e.style.flex = `0 0 ${t}`, e.style.width = t, e.style.maxWidth = t, e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = n ? "none" : `1px solid ${r}`, e.style.borderRight = n ? `1px solid ${r}` : "none"; } else e.style.flex = "0 0 0px", e.style.width = "0", e.style.maxWidth = "0", e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = "none", e.style.borderRight = "none"; } function ph(e) { if (e == null) return !1; let t = e; if (typeof e == "string") { let n = e.trim(); if (!n || n === "{}" || n === "null") return !1; try { t = JSON.parse(n); } catch { return !1; } } if (typeof t == "object") try { return t.geninfo || t.prompt || t.positive_prompt || t.parameters ? !0 : t.metadata_raw && typeof t.metadata_raw == "object" ? !!(t.metadata_raw.geninfo || t.metadata_raw.prompt || t.metadata_raw.positive_prompt || t.metadata_raw.parameters) : !1; } catch { return !1; } return !1; } function mh(e) { return e ? !!(e.geninfo || e.prompt || ph(e.metadata_raw)) : !1; } async function hh(e, t, n) { if (!e || !t) return; let r = String(t?.kind || "").toLowerCase() === "folder"; try { e._closeTimer &&= (clearTimeout(e._closeTimer), null); } catch (e) { console.debug?.(e); } let i = e._requestSeq = (e._requestSeq || 0) + 1; e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, e.classList.add("is-open"), fh(e, !0), e._currentAsset = t, e._currentFullAsset = t, e._ratingTagsSection = null, ah(t, n); let a = () => { e._currentFetchAbortController?.abort?.(); let t = typeof AbortController < "u" ? new AbortController() : null; return e._currentFetchAbortController = t, t?.signal ? { signal: t.signal } : {}; }, o = (r = {}) => { e._requestSeq === i && e._currentAsset === t && (e._currentFullAsset = { ...e._currentFullAsset ?? t, ...r }, sh(r, n)); }; (async () => { if (e._requestSeq !== i || e._currentAsset !== t) return; let n = a(), s = n.signal; if (r) { try { let e = String(t?.filepath || t?.subfolder || "").trim(), r = String(t?.root_id || t?.rootId || "").trim(), i = r ? String(t?.subfolder || "").trim() : "", a = await M({ filepath: e, root_id: r, subfolder: i }, n); !s?.aborted && a?.ok && a.data && o({ folder_info: a.data }); } catch (e) { s?.aborted || console.warn("Failed to load folder details:", e); } finally { s?.aborted || (e._currentFetchAbortController = null); } return; } let c = () => e._currentFullAsset ?? t; try { if (t.id && !mh(c())) { let e = await re(t.id, n); if (s?.aborted) return; e?.ok && e.data && o(e.data); } } catch (e) { s?.aborted || console.warn("Failed to load full asset metadata:", e); } if (!s?.aborted) { if (!mh(c())) { let e = String(c()?.filename || "").trim(), t = String(c()?.type || "output").trim().toLowerCase(), r = String(c()?.subfolder || "").trim(), i = String(c()?.root_id || c()?.rootId || "").trim(); if (e) try { let a = await De({ type: t, filename: e, subfolder: r, root_id: i }, n); if (s?.aborted) return; if (a?.ok && a.data) { let e = a.data; o({ prompt: c().prompt ?? e.prompt, workflow: c().workflow ?? e.workflow, geninfo: c().geninfo ?? e.geninfo, exif: c().exif ?? e.exif, ffprobe: c().ffprobe ?? e.ffprobe, metadata_raw: c().metadata_raw ?? e }); } } catch (e) { s?.aborted || console.warn("Failed to load scoped metadata:", e); } } s?.aborted || (e._currentFetchAbortController = null); } })(); } function gh(e) { if (e) { e._requestSeq = (e._requestSeq || 0) + 1, e.classList.remove("is-open"), fh(e, !1), e._currentAsset = null, e._currentFullAsset = null, e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, oh(); try { e.dispatchEvent?.(new CustomEvent("mjr:sidebar-closed", { bubbles: !0 })); } catch (e) { console.debug?.(e); } } } //#endregion //#region ui/stores/usePanelStore.ts var _h = "mjr_panel_state", vh = /* @__PURE__ */ new Set([ "output", "input", "all", "custom", "workflow" ]); function yh(e, t = !1) { if (typeof e == "boolean") return e; if (typeof e == "string") { let t = e.trim().toLowerCase(); if ([ "1", "true", "yes", "on" ].includes(t)) return !0; if ([ "0", "false", "no", "off" ].includes(t)) return !1; } return !!t; } function bh(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } function xh(e, t = "") { return e == null ? t : String(e); } function Sh(e, t = 0, n = Infinity) { return Math.max(t, Math.min(n, Math.floor(bh(e, t)))); } function Ch(e) { let t = xh(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t; return vh.has(n) ? n : "output"; } function wh(e) { if (!e || typeof e != "object") return {}; let t = e; return { scope: Ch(t.scope), customRootId: xh(t.customRootId), customRootLabel: xh(t.customRootLabel), currentFolderRelativePath: xh(t.currentFolderRelativePath || t.subfolder), collectionId: xh(t.collectionId), collectionName: xh(t.collectionName), kindFilter: xh(t.kindFilter), dateRangeFilter: xh(t.dateRangeFilter), dateExactFilter: xh(t.dateExactFilter), workflowOnly: yh(t.workflowOnly, !1), minRating: Sh(t.minRating, 0, 5), minSizeMB: Math.max(0, bh(t.minSizeMB, 0)), maxSizeMB: Math.max(0, bh(t.maxSizeMB, 0)), resolutionCompare: t.resolutionCompare === "lte" ? "lte" : "gte", minWidth: Sh(t.minWidth), minHeight: Sh(t.minHeight), maxWidth: Sh(t.maxWidth), maxHeight: Sh(t.maxHeight), workflowType: xh(t.workflowType), workflowId: xh(t.workflowId || t.workflow_id), workflowModelFilter: xh(t.workflowModelFilter || t.workflowModel || t.workflow_model), workflowRunsOnFilter: xh(t.workflowRunsOnFilter || t.workflowRunsOn || t.runs_on), sort: xh(t.sort || "mtime_desc"), searchQuery: xh(t.searchQuery), metadataSearchMode: String(t.metadataSearchMode || "AND").toUpperCase() === "OR" ? "OR" : "AND", scrollTop: Sh(t.scrollTop), activeAssetId: xh(t.activeAssetId), selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => xh(e).trim()).filter(Boolean).slice(0, 5e3) : [], sidebarOpen: yh(t.sidebarOpen, !1) }; } function Th() { try { let e = localStorage.getItem(_h); if (e) return wh(JSON.parse(e)); } catch {} return {}; } function Eh(e) { try { let t = { ...e }; delete t.lastGridCount, delete t.lastGridTotal, delete t.viewScope, delete t.similarResults, delete t.similarTitle, delete t.similarSourceAssetId, localStorage.setItem(_h, JSON.stringify(t)); } catch {} } var Dh = kr("mjr-panel", () => { let e = Th(), t = Z(e.scope || "output"), n = Z(e.customRootId || ""), r = Z(e.customRootLabel || ""), i = Z(e.currentFolderRelativePath || ""), a = Z(e.collectionId || ""), o = Z(e.collectionName || ""), s = Z(e.kindFilter || ""), c = Z(e.dateRangeFilter || ""), l = Z(e.dateExactFilter || ""), u = Z(e.workflowOnly || !1), d = Z(e.minRating || 0), f = Z(e.minSizeMB || 0), p = Z(e.maxSizeMB || 0), m = Z(e.resolutionCompare || "gte"), h = Z(e.minWidth || 0), g = Z(e.minHeight || 0), _ = Z(e.maxWidth || 0), v = Z(e.maxHeight || 0), y = Z(e.workflowType || ""), b = Z(e.workflowId || ""), x = Z(e.workflowModelFilter || ""), S = Z(e.workflowRunsOnFilter || ""), C = Z(e.sort || "mtime_desc"), w = Z(e.searchQuery || ""), T = Z(e.metadataSearchMode || "AND"), E = Z(e.scrollTop || 0), D = Z(e.activeAssetId || ""), O = Z(e.selectedAssetIds || []), k = Z(e.sidebarOpen || !1), A = Z(0), j = Z(0), M = Z(""), N = Z([]), P = Z(""), F = Z(""), ee = null; ir([ t, n, r, i, a, o, s, c, l, u, d, f, p, m, h, g, _, v, y, b, x, S, C, w, T, E, D, O, k ], () => { ee && clearTimeout(ee), ee = setTimeout(() => { ee = null, Eh({ scope: t.value, customRootId: n.value, customRootLabel: r.value, currentFolderRelativePath: i.value, collectionId: a.value, collectionName: o.value, kindFilter: s.value, dateRangeFilter: c.value, dateExactFilter: l.value, workflowOnly: u.value, minRating: d.value, minSizeMB: f.value, maxSizeMB: p.value, resolutionCompare: m.value, minWidth: h.value, minHeight: g.value, maxWidth: _.value, maxHeight: v.value, workflowType: y.value, workflowId: b.value, workflowModelFilter: x.value, workflowRunsOnFilter: S.value, sort: C.value, searchQuery: w.value, metadataSearchMode: T.value, scrollTop: E.value, activeAssetId: D.value, selectedAssetIds: O.value, sidebarOpen: k.value }); }, 750); }, { deep: !0 }); let te = (e) => { if (!(e.key !== _h || !e.newValue)) try { let n = wh(JSON.parse(e.newValue)); n.scope !== void 0 && (t.value = n.scope), n.customRootLabel !== void 0 && (r.value = n.customRootLabel), n.searchQuery !== void 0 && (w.value = n.searchQuery), n.metadataSearchMode !== void 0 && (T.value = n.metadataSearchMode), n.sort !== void 0 && (C.value = n.sort), n.sidebarOpen !== void 0 && (k.value = n.sidebarOpen); } catch {} }; try { window.addEventListener("storage", te); } catch {} vr(() => { try { window.removeEventListener("storage", te); } catch {} }); function I() { s.value = "", c.value = "", l.value = "", u.value = !1, d.value = 0, f.value = 0, p.value = 0, m.value = "gte", h.value = 0, g.value = 0, _.value = 0, v.value = 0, y.value = "", b.value = "", x.value = "", S.value = "", w.value = ""; } function ne() { O.value = [], D.value = ""; } function re(e, t = "") { O.value = Array.isArray(e) ? e.map(String).filter(Boolean) : [], D.value = t || O.value[0] || ""; } function ie(e, s = {}) { t.value = e, i.value = s.folder || "", a.value = s.collectionId || "", o.value = s.collectionName || "", n.value = s.customRootId || "", r.value = s.customRootLabel || "", M.value = "", N.value = [], P.value = "", F.value = "", ne(); } async function oe() { let e = String(n.value || "").trim(); if (e) try { let a = await ae("/mjr/am/custom-roots"), o = (Array.isArray(a?.data) ? a.data : []).find((t) => String(t?.id || "") === e); if (!o) { n.value = "", r.value = "", t.value === "custom" && (t.value = "output", i.value = ""); return; } let s = String(o.label || "").trim(); s && s !== r.value && (r.value = s); } catch {} } return { scope: t, customRootId: n, customRootLabel: r, currentFolderRelativePath: i, collectionId: a, collectionName: o, kindFilter: s, dateRangeFilter: c, dateExactFilter: l, workflowOnly: u, minRating: d, minSizeMB: f, maxSizeMB: p, resolutionCompare: m, minWidth: h, minHeight: g, maxWidth: _, maxHeight: v, workflowType: y, workflowId: b, workflowModelFilter: x, workflowRunsOnFilter: S, sort: C, searchQuery: w, metadataSearchMode: T, scrollTop: E, activeAssetId: D, selectedAssetIds: O, sidebarOpen: k, lastGridCount: A, lastGridTotal: j, viewScope: M, similarResults: N, similarTitle: P, similarSourceAssetId: F, resetFilters: I, clearSelection: ne, setSelection: re, navigateToScope: ie, validatePersistedCustomRoot: oe }; }); //#endregion //#region ui/stores/getOptionalPanelStore.ts function Oh() { try { return Ar() ? Dh() : null; } catch { return null; } } //#endregion //#region ui/stores/panelStateBridge.ts function kh(e, t = []) { let n = Oh(); return { panelStore: n, hydrateStoreFromLegacy: () => {}, read: (e, t = "") => { try { if (n && e in n) { let t = n[e]; if (t !== void 0) return t; } } catch (e) { console.debug?.(e); } return t; }, write: (e, t) => { try { n && e in n && (n[e] = t); } catch (e) { console.debug?.(e); } }, controllerState: () => n, isPiniaOnly: !0 }; } //#endregion //#region ui/features/panel/messages/messageCenter.ts var Ah = "mjr_panel_messages_v1", jh = "mjr_panel_messages_last_read_v1", Mh = "mjr_panel_messages_dismissed_builtin_ids_v1", Nh = 120, Ph = "/mjr/am/user-guide", Fh = /* @__PURE__ */ new Set([ "info", "success", "warning", "error" ]), Ih = "mjr:panel-messages-changed", Lh = !1, Rh = [], zh = Object.freeze([ { id: "whats-new-2026-07-09-version-2-5-0", title: "New Version 2.5.0", titleKey: "msg.whatsNew.title.version250", emoji: "Info", category: "Release", categoryKey: "msg.category.release", level: "success", createdAt: Date.parse("2026-07-09T09:00:00Z"), body: "Version 2.5.0 released. New Features: experimental JPEG XL support, native nested subgraphs in Graph Map, extended technical metadata, new viewer playback speeds, source-file actions, and an expanded Find Similar menu. Improved: runtime metadata ingestion, Rodin 3D grouping, output color management, prompt extraction, workflow matching, sidebar presentation, viewer rendering, and ComfyUI toolbar integration. Fixed: tags shortcuts, viewer playback and Floating Viewer controls, source-file loading, popover dismissal, generation information stability, Open in Folder, and subgraph workflow parsing.", bodyKey: "msg.whatsNew.body.version250", actionLabel: "Changelog", actionLabelKey: "label.changelog", actionUrl: "CHANGELOG.md" }, { id: "whats-new-2026-06-11-workflow-tab-guide", title: "Workflow Tab Guide", emoji: "Info", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-06-11T10:00:00Z"), body: "The Workflow tab now has a dedicated guide. It explains how saved ComfyUI workflow JSON files are discovered, saved, imported, loaded back into ComfyUI, inspected in Graph Map, categorized, tagged, and assigned thumbnails.", actionLabel: "Workflow Guide", actionUrl: "docs/WORKFLOWS.md" }, { id: "whats-new-2026-06-08-global-release-update", title: "What's New - Global Update", emoji: "Info", category: "Release", categoryKey: "msg.category.release", level: "success", createdAt: Date.parse("2026-06-08T10:00:00Z"), body: "Global update: Graph Map node UI and widget parsing were improved, GenInfo metadata parsing is more reliable, drag-and-drop behavior was refined, and quick media filter buttons now let you instantly toggle Images, Videos, Audio, and 3D. A new Majoor GenInfo Override node was added for custom/manual GenInfo injection through Majoor Save nodes. Frontend refactoring to TypeScript continues to align with ComfyUI, alongside broader integration improvements, easier AI settings access from panel/MFV, and multiple bug fixes.", actionLabel: "Changelog", actionLabelKey: "label.changelog", actionUrl: "CHANGELOG.md" }, { id: "whats-new-2026-05-17-dnd-graph-map-settings", title: "New Version 2.4.9 - DnD, Graph Map & Settings", titleKey: "msg.whatsNew.title.dndGraphMapSettings", emoji: "Info", category: "Release", categoryKey: "msg.category.release", level: "success", createdAt: Date.parse("2026-05-17T21:30:00Z"), body: "Version 2.4.9 released: Drag and Drop has been fixed and clarified, including canvas/node drops, staging behavior, visual feedback, and ComfyUI workflow-drop interactions. Graph Map in the Floating Viewer now lets you inspect embedded workflows without opening them on the canvas, copy nodes or attributes, and transfer node attributes to a similar selected node in the canvas. Settings access and explanations were also improved, with easier access from the panel gear icon and the Floating Viewer.", bodyKey: "msg.whatsNew.body.dndGraphMapSettings", actionLabel: "Changelog", actionLabelKey: "label.changelog", actionUrl: "CHANGELOG.md" }, { id: "whats-new-2026-03-29-version-2-4-3", title: "New Version 2.4.3", titleKey: "msg.whatsNew.title.version243", category: "Release", categoryKey: "msg.category.release", level: "success", createdAt: Date.parse("2026-03-29T09:00:00Z"), body: "Version 2.4.3 released: Improved assets metadata parsing, Grid Compare capability in floating viewer up to 4 Assets, ping pong loop in main Viewer player, job id and stack id in DB for better assets management, stack assets generated from same workflow job with same job ID, generated feed feature, lite version of grid in bottom tab. Code refactor for maintainability and various bug fixes. See CHANGELOG for details.", bodyKey: "msg.whatsNew.body.version243" }, { id: "whats-new-2026-03-09-version-2-4-1", title: "New Version 2.4.1", titleKey: "msg.whatsNew.title.version241", category: "Release", categoryKey: "msg.category.release", level: "success", createdAt: Date.parse("2026-03-09T09:00:00Z"), body: "Version 2.4.1 released: CLIP-based semantic search with AI toggle, rgthree/easy node support, shortcut guide tab, upscaler model extraction. Fixed MFV memory leaks, workflow filters, SQL placeholders. Enhanced geninfo extraction, tag handling, calendar. See CHANGELOG for details.", bodyKey: "msg.whatsNew.body.version241" }, { id: "whats-new-2026-03-06-floating-viewer-shortcuts", title: "What's New", titleKey: "msg.whatsNew.title.floatingViewerShortcuts", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-03-06T09:00:00Z"), body: "Floating Viewer keyboard shortcuts added: Open/close MFV with V, compare with C, Live Stream with L, and KSampler Preview with K. See the Shortcut Guide tab for the full list.", bodyKey: "msg.whatsNew.body.floatingViewerShortcuts" }, { id: "whats-new-2026-03-05-pin-reference", title: "What's New", titleKey: "msg.whatsNew.title.pinReference", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-03-05T10:00:00Z"), body: "Floating Viewer: new Pin Reference feature. You can now pin A or B, then compare quickly with selected assets in the grid while keeping the fixed reference.", bodyKey: "msg.whatsNew.body.pinReference" }, { id: "whats-new-2026-03-05-vector-reset-keep-vectors", title: "What's New", titleKey: "msg.whatsNew.title.vectorResetKeepVectors", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-03-05T12:00:00Z"), body: "Reset index and Delete DB now first ask whether to keep AI vectors. If you already have older indexed assets, keeping the vectors is recommended: a full reset without them can trigger a long Vector Backfill for old assets and temporarily increase RAM usage.", bodyKey: "msg.whatsNew.body.vectorResetKeepVectors" }, { id: "whats-new-2026-03-05-local-user-guide", title: "What's New", titleKey: "msg.whatsNew.title.localUserGuide", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-03-05T13:00:00Z"), body: "Open the local User Guide directly from your Assets Manager custom_nodes folder.", bodyKey: "msg.whatsNew.body.localUserGuide", actionLabel: "User Guide", actionLabelKey: "label.userGuide", actionUrl: Ph }, { id: "tip-2026-04-07-output-folder-override", title: "Tip", titleKey: "msg.tip.title.outputFolderOverride", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-04-07T10:00:00Z"), body: "You can override the Generation Output Directory used by Majoor for generated files via Settings -> Majoor Assets Manager > Advanced. Leave it empty to keep the current backend default, or set MJR_AM_OUTPUT_DIRECTORY / MAJOOR_OUTPUT_DIRECTORY before launching ComfyUI.", bodyKey: "msg.tip.body.outputFolderOverride", actionLabel: "Installation Guide", actionUrl: "docs/INSTALLATION.md" }, { id: "tip-2026-04-07-index-folder-override", title: "Tip", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-04-07T10:05:00Z"), body: "You can override the Index Database Directory used by Majoor for its SQLite database via Settings -> Majoor Assets Manager > Advanced. This is useful when your assets stay on a NAS or slow drive and you want the index on a local SSD. Restart ComfyUI after changing it, or set MJR_AM_INDEX_DIRECTORY / MAJOOR_INDEX_DIRECTORY before launch.", actionLabel: "DB Maintenance Guide", actionUrl: "docs/DB_MAINTENANCE.md" }, { id: "development-2026-04-03-vue-refactoring", title: "Vue 3 Refactoring", titleKey: "msg.development.title.vueRefactoring", category: "Development", categoryKey: "msg.category.development", level: "info", createdAt: Date.parse("2026-04-03T10:00:00Z"), body: "Frontend modernization ongoing: Core UI components are being migrated to Vue 3 for better maintainability and compatibility with new ComfyUI frontend. This ensures long-term support and cleaner architecture.", bodyKey: "msg.development.body.vueRefactoring", actionLabel: "View Progress", actionLabelKey: "label.viewProgress", actionUrl: "docs/MIGRATION_TS_TRACKER.md" }, { id: "whats-new-2026-04-10-mfv-multi-pin-sidebar", title: "What's New - Floating Viewer", titleKey: "msg.whatsNew.title.mfvMultiPinSidebar", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-04-10T09:00:00Z"), body: "Floating Viewer upgraded: Multi-Pin references (A/B/C/D toggle buttons) let you pin up to 4 images and compare them side-by-side. A new Node Parameters sidebar shows the widgets of the workflow node that produced the current image - edit prompts, seeds, and samplers directly inside the viewer. Expandable text areas, Run button, and toolbar layout improvements.", bodyKey: "msg.whatsNew.body.mfvMultiPinSidebar", actionLabel: "Viewer Tutorial", actionLabelKey: "label.viewerTutorial", actionUrl: "docs/VIEWER_FEATURE_TUTORIAL.md" }, { id: "whats-new-2026-04-10-mfv-sidebar-position-setting", title: "What's New - Sidebar Position Setting", titleKey: "msg.whatsNew.title.mfvSidebarPositionSetting", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-04-10T09:05:00Z"), body: "New setting: Node Parameters sidebar position. Go to Settings -> Majoor Assets Manager > Viewer and choose where to place the Node Parameters sidebar - right (default), left, or bottom. The change applies immediately without page reload.", bodyKey: "msg.whatsNew.body.mfvSidebarPositionSetting" }, { id: "tip-2026-04-12-generation-time-persistence", title: "Tip - Generation Time After Reset", titleKey: "msg.tip.title.generationTimePersistence", emoji: "Info", category: "Information", categoryKey: "msg.category.information", level: "warning", createdAt: Date.parse("2026-04-12T10:00:00Z"), body: "Generation time (generation_time_ms) is computed at runtime and stored in the index database. After a Reset Index or Delete DB, this value is lost unless it was persisted inside the file itself. To keep generation time across resets, use the Majoor Save Image or Majoor Save Video nodes instead of the built-in Save nodes - they embed generation_time_ms directly in PNG text chunks and MP4 container metadata, so it is re-extracted automatically on re-index.", bodyKey: "msg.tip.body.generationTimePersistence", actionLabel: "Custom Nodes Docs", actionLabelKey: "label.customNodesDocs", actionUrl: "docs/CUSTOM_NODES.md" }, { id: "whats-new-2026-04-12-topbar-mfv-button", title: "What's New - Floating Viewer Topbar Button", titleKey: "msg.whatsNew.title.topbarMfvButton", emoji: "Info", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-04-12T10:05:00Z"), body: "A new MFV button now appears in the ComfyUI top action bar. Click it to toggle the Majoor Floating Viewer on or off without opening the sidebar. The button uses the same stacked-images icon as the rest of the MFV entry points, highlights when the viewer is active, and updates in real time.", bodyKey: "msg.whatsNew.body.topbarMfvButton" }, { id: "whats-new-2026-04-20-version-2-4-6", title: "New Version 2.4.6", titleKey: "msg.whatsNew.title.version246", emoji: "Info", category: "Release", categoryKey: "msg.category.release", level: "success", createdAt: Date.parse("2026-04-20T09:00:00Z"), body: "Version 2.4.6 released: Various bug fixes and performance & fluidity improvements. Improved concatenate support for default and custom nodes (by Forsion07). Added support helpers for Api Node and Ernie Image. Live Stream in Floating Viewer is now disabled by default. See CHANGELOG for details.", bodyKey: "msg.whatsNew.body.version246", actionLabel: "Changelog", actionLabelKey: "label.changelog", actionUrl: "CHANGELOG.md" }, { id: "whats-new-2026-05-01-grid-mfv-toolbox", title: "What's New - Grid & MFV Upgrade", titleKey: "msg.whatsNew.title.gridMfvToolboxUpgrade", emoji: "Info", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-05-01T09:00:00Z"), body: "Grid performance and fluidity have been improved. The Majoor Floating Viewer is no longer a light viewer only: it now includes advanced features such as Node Stream, Node Parameters, and direct node editing from inside the viewer. New tools were also added to the toolbox, alongside broader code corrections and cleanup.", bodyKey: "msg.whatsNew.body.gridMfvToolboxUpgrade", actionLabel: "Changelog", actionLabelKey: "label.changelog", actionUrl: "CHANGELOG.md" }, { id: "tip-2026-05-01-majoor-imageops-node-pack", title: "Do you know this node pack ?", titleKey: "msg.tip.title.majoorImageOpsNodePack", emoji: "Info", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-05-01T10:00:00Z"), body: "Discover Majoor ImageOps, a ComfyUI node pack with practical image operation nodes for your workflows.", bodyKey: "msg.tip.body.majoorImageOpsNodePack", actionLabel: "Open Node Pack", actionLabelKey: "label.openNodePack", actionUrl: "https://github.com/MajoorWaldi/ComfyUI-Majoor-ImageOps" }, { id: "tip-2026-05-10-graph-map-guide", title: "Tip - Graph Map Guide", titleKey: "msg.tip.title.graphMapGuide", emoji: "Info", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-05-10T18:30:00Z"), body: "Graph Map now has its own documentation page with screenshots and a quick walkthrough. Open the guide to see how to read the workflow map, inspect selected nodes, and use the node detail actions.", bodyKey: "msg.tip.body.graphMapGuide", actionLabel: "Graph Map Guide", actionLabelKey: "label.graphMapGuide", actionUrl: "docs/GRAPH_MAP.md" }, { id: "tip-2026-05-10-mfv-guide", title: "Tip - MFV Guide", titleKey: "msg.tip.title.mfvGuide", emoji: "Info", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-05-10T18:45:00Z"), body: "MFV now has its own illustrated guide covering compare modes, A/B/C/D pins, streams, node parameters, run/stop, pop-out, and how Graph Map complements the viewer workflow.", bodyKey: "msg.tip.body.mfvGuide", actionLabel: "MFV Guide", actionLabelKey: "label.mfvGuide", actionUrl: "docs/MFV_GUIDE.md" }, { id: "tip-2026-04-20-mfv-live-stream-preview-defaults", title: "Tip - Floating Viewer Auto-Open", titleKey: "msg.tip.title.mfvLivePreviewDefaults", emoji: "Info", category: "Information", categoryKey: "msg.category.information", level: "info", createdAt: Date.parse("2026-04-20T10:00:00Z"), body: "Live Stream (green button in the viewer) and KSampler Preview can be activated by default via Settings -> Majoor Assets Manager > Viewer. Live Stream follows final generation outputs after execution. KSampler Preview streams denoising frames during execution. Selected-node previews are handled by Node Stream.", bodyKey: "msg.tip.body.mfvLivePreviewDefaults", actionLabel: "Settings Guide", actionLabelKey: "label.settingsGuide", actionUrl: "docs/SETTINGS_CONFIGURATION.md" } ]), Bh = new Set(zh.map((e) => String(e?.id || "").trim()).filter(Boolean)); function Vh(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } function Hh() { return Date.now(); } function Uh() { return dt(`msg-${Hh()}-`, 6); } function Wh(e) { let t = String(e || "").trim().toLowerCase(); return t === "warn" ? "warning" : t === "danger" ? "error" : Fh.has(t) ? t : "info"; } function Gh(e) { return Bh.has(String(e || "").trim()); } function Kh(e = {}) { return { id: String(e?.id || "").trim() || Uh(), title: String(e?.title || "").trim() || "Info", titleKey: String(e?.titleKey || "").trim(), emoji: String(e?.emoji || "").trim(), body: String(e?.body || "").trim(), bodyKey: String(e?.bodyKey || "").trim(), category: String(e?.category || "").trim() || "Info", categoryKey: String(e?.categoryKey || "").trim(), createdAt: Vh(e?.createdAt, Hh()), level: Wh(e?.level), actionLabel: String(e?.actionLabel || "").trim(), actionLabelKey: String(e?.actionLabelKey || "").trim(), actionUrl: String(e?.actionUrl || "").trim() }; } function qh(e, t) { try { let n = localStorage.getItem(e); return n ? JSON.parse(n) : t; } catch { return t; } } function Jh(e, t) { try { localStorage.setItem(e, JSON.stringify(t)); } catch {} } function Yh() { try { return Vh(localStorage.getItem(jh), 0); } catch { return 0; } } function Xh(e) { try { localStorage.setItem(jh, String(Vh(e, Hh()))); } catch {} } function Zh() { let e = qh(Mh, []); return new Set((Array.isArray(e) ? e : []).map((e) => String(e || "").trim()).filter((e) => Gh(e))); } function Qh() { Rh.sort((e, t) => Number(t.createdAt || 0) - Number(e.createdAt || 0)), Rh.length > Nh && (Rh = Rh.slice(0, Nh)); } function $h() { Jh(Ah, Rh); } function eg() { let e = Zh(), t = !1; for (let n of zh) { let r = Kh(n); if (e.has(r.id)) continue; let i = Rh.findIndex((e) => e.id === r.id); if (i < 0) { Rh.push(r), t = !0; continue; } let a = Rh[i], o = { ...a, ...r, createdAt: Vh(a?.createdAt, r.createdAt) }; JSON.stringify(a) !== JSON.stringify(o) && (Rh[i] = o, t = !0); } return t ? (Qh(), $h(), !0) : !1; } function tg() { try { window.dispatchEvent(new CustomEvent(Ih, { detail: { total: Rh.length, unread: ag() } })); } catch (e) { console.debug?.(e); } } function ng() { if (Lh) return; Lh = !0; let e = qh(Ah, []); Rh = (Array.isArray(e) ? e : []).map(Kh), Qh(); } function rg() { ng(), eg() && tg(); } function ig() { return ng(), Rh.map((e) => ({ ...e })); } function ag() { ng(); let e = Yh(); return Rh.reduce((t, n) => t + +(Number(n.createdAt || 0) > e), 0); } function og() { return ng(), Yh(); } function sg({ upTo: e = Hh() } = {}) { ng(), Xh(Vh(e, Hh())), tg(); } //#endregion //#region ui/features/panel/messages/shortcutGuide.ts var cg = Object.freeze([ { id: "panel", titleKey: "msg.shortcuts.section.panel", title: "Global / Panel", items: Object.freeze([ { keys: "Ctrl+S / Cmd+S", description: "Trigger index scan" }, { keys: "Ctrl+F / Ctrl+K", description: "Focus search input" }, { keys: "Ctrl+H", description: "Clear search input" }, { keys: "D", description: "Toggle details sidebar" }, { keys: "V", description: "Toggle Floating Viewer" } ]) }, { id: "grid", titleKey: "msg.shortcuts.section.grid", title: "Grid View", items: Object.freeze([ { keys: "Arrow Keys", description: "Navigate selection" }, { keys: "Enter / Space", description: "Open viewer" }, { keys: "V", description: "Open selected asset in Floating Viewer" }, { keys: "Ctrl+A / Cmd+A", description: "Select all" }, { keys: "Ctrl+D / Cmd+D", description: "Deselect all" }, { keys: "S", description: "Download selected asset" }, { keys: "C", description: "Compare A/B (2 selected)" }, { keys: "G", description: "Side-by-side compare (2-4 selected)" }, { keys: "T", description: "Edit tags" }, { keys: "B / Shift+B", description: "Add or remove from collection" }, { keys: "Ctrl+Shift+C / Cmd+Shift+C", description: "Copy selected asset path" }, { keys: "Ctrl+Shift+E / Cmd+Shift+E", description: "Open selected asset in Explorer/Finder" }, { keys: "Delete", description: "Delete selected file" }, { keys: "F2", description: "Rename file" } ]) }, { id: "viewer", titleKey: "msg.shortcuts.section.viewer", title: "Standard Viewer", items: Object.freeze([ { keys: "Esc", description: "Close viewer" }, { keys: "F", description: "Toggle fullscreen" }, { keys: "D", description: "Toggle info panel" }, { keys: "I", description: "Toggle pixel probe" }, { keys: "Z", description: "Toggle zebra exposure overlay" }, { keys: "G", description: "Cycle grid overlays" }, { keys: "Space", description: "Play or pause video" }, { keys: "Left / Right", description: "Previous or next asset" }, { keys: "S", description: "Download original asset from context menu" } ]) }, { id: "dnd", titleKey: "msg.shortcuts.section.dnd", title: "Drag & Drop", items: Object.freeze([{ keys: "S+Drag to OS", description: "Export without ComfyUI metadata" }, { keys: "L+Drop on canvas", description: "Load selected asset(s) as media loader node(s)" }]) }, { id: "mfv", titleKey: "msg.shortcuts.section.mfv", title: "Floating Viewer", items: Object.freeze([ { keys: "Esc", description: "Close Floating Viewer" }, { keys: "V", description: "Open or close Floating Viewer" }, { keys: "C", description: "Cycle compare modes: A/B, Side-by-side, Off (Simple mode)" }, { keys: "K", description: "Toggle KSampler denoising preview" }, { keys: "L", description: "Toggle final-output Live Stream" }, { keys: "N", description: "Toggle selected-node Node Stream" } ]) }, { id: "video", titleKey: "msg.shortcuts.section.video", title: "Video Playback", items: Object.freeze([ { keys: "Space", description: "Play or pause" }, { keys: "I / O", description: "Set In / Out points" }, { keys: "Home / End", description: "Jump to In / Out points" }, { keys: "[ / ]", description: "Decrease or increase playback speed" }, { keys: "\\", description: "Reset playback speed to 1x" }, { keys: "Mouse Wheel", description: "Zoom in or out when supported" } ]) } ]); function lg() { return cg.map((e) => ({ ...e, items: Array.isArray(e.items) ? e.items.map((e) => ({ ...e })) : [] })); } function ug() { let e = document.createElement("div"); e.className = "mjr-shortcut-guide"; let t = document.createElement("div"); t.className = "mjr-shortcut-guide-intro", t.textContent = R("msg.shortcuts.intro", "Current keyboard shortcuts grouped by section for quick reference."), e.appendChild(t); for (let t of lg()) { let n = document.createElement("section"); n.className = "mjr-shortcut-section"; let r = document.createElement("div"); r.className = "mjr-shortcut-section-title", r.textContent = R(t.titleKey, t.title), n.appendChild(r); let i = document.createElement("div"); i.className = "mjr-shortcut-list"; for (let e of t.items) { let t = document.createElement("div"); t.className = "mjr-shortcut-row"; let n = document.createElement("kbd"); n.className = "mjr-shortcut-key", n.textContent = String(e.keys || "").trim(); let r = document.createElement("div"); r.className = "mjr-shortcut-desc", r.textContent = String(e.description || "").trim(), t.appendChild(n), t.appendChild(r), i.appendChild(t); } n.appendChild(i), e.appendChild(n); } return e; } //#endregion //#region ui/features/panel/messages/messagePopoverController.ts var dg = /* @__PURE__ */ new Set([ "info", "success", "warning", "error" ]), fg = 2200, pg = /* @__PURE__ */ new Set([ "started", "queued", "running", "pending", "in_progress" ]), mg = /* @__PURE__ */ new Set([ "succeeded", "success", "complete", "completed", "done", "failed", "error", "cancelled", "canceled" ]); function hg(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return ""; try { return new Date(t).toLocaleString([], { year: "numeric", month: "short", day: "2-digit", hour: "2-digit", minute: "2-digit" }); } catch { return ""; } } function gg(e, t, n, r) { let i = String(e?.[t] || "").trim(), a = String(e?.[n] || r || "").trim() || String(r || ""); return i ? R(i, a) : a; } function _g(e) { let t = String(e || "").trim().toLowerCase(); return t === "warn" ? "warning" : t === "danger" ? "error" : dg.has(t) ? t : "info"; } function vg(e) { let t = String(e || "").trim(); if (!t) return ""; try { let e = String(globalThis?.window?.location?.href || "http://127.0.0.1/"), n = t.replace(/\\/g, "/").match(/(?:^|\/)(docs\/[^?#]+\.md)([?#].*)?$/i), r = n ? `/mjr/am/${n[1]}${n[2] || ""}` : t, i = new URL(r, e), a = String(i.protocol || "").toLowerCase(); return a === "http:" || a === "https:" ? i.href : ""; } catch { return ""; } } function yg(e) { let t = String(e?.emoji || "").trim(); if (t) return t; let n = _g(e?.level); return n === "success" ? "OK" : n === "warning" ? "WARN" : n === "error" ? "ERR" : "INFO"; } function bg(e) { switch (String(e || "").toLowerCase()) { case "success": return "OK"; case "warning": return "WARN"; case "error": return "ERR"; default: return "Tip"; } } function xg(e) { if (e?.persistent) return "persistent"; let t = Number(e?.durationMs); return !Number.isFinite(t) || t <= 0 ? "" : t < 1e4 ? `${(t / 1e3).toFixed(1)}s` : `${Math.round(t / 1e3)}s`; } function Sg(e) { let t = String(e || "").trim().toLowerCase(); return t ? t.replace(/[_-]+/g, " ") : ""; } function Cg(e) { let t = e?.progress; if (!t || typeof t != "object") return ""; let n = String(t.label || "").trim(), r = Number(t.current), i = Number(t.total), a = Number(t.indexed), o = Number(t.skipped), s = Number(t.errors), c = []; return n && c.push(n), Number.isFinite(r) && Number.isFinite(i) && i > 0 && c.push(`${r}/${i}`), Number.isFinite(a) && c.push(`indexed ${a}`), Number.isFinite(o) && c.push(`skipped ${o}`), Number.isFinite(s) && s > 0 && c.push(`errors ${s}`), c.join(" | "); } function wg(e) { let t = e?.progress; if (!t || typeof t != "object") return null; let n = Number(t.percent); if (Number.isFinite(n)) return Math.max(0, Math.min(100, Math.round(n))); let r = Number(t.current), i = Number(t.total); return Number.isFinite(r) && Number.isFinite(i) && i > 0 ? Math.max(0, Math.min(100, Math.round(r / i * 100))) : null; } function Tg(e) { return String(e?.trackId || "").trim() || [ String(e?.operation || "").trim(), String(e?.source || "").trim(), String(e?.title || "").trim() ].filter(Boolean).join(":"); } function Eg({ activeTab: e = "messages", title: t = null, messagePopover: n = null, messageTabBtn: r = null, historyTabBtn: i = null, shortcutsTabBtn: a = null, messageList: o = null, historyPanel: s = null, shortcutsPanel: c = null, markReadBtn: l = null } = {}) { let u = e === "messages", d = e === "history", f = e === "shortcuts", p = u ? R("label.messages", "Messages") : d ? R("label.toastHistory", "History") : R("msg.shortcuts.title", "Shortcut Guide"); try { r?.classList.toggle("is-active", u), r?.setAttribute("aria-selected", u ? "true" : "false"), r?.setAttribute("tabindex", u ? "0" : "-1"), i?.classList.toggle("is-active", d), i?.setAttribute("aria-selected", d ? "true" : "false"), i?.setAttribute("tabindex", d ? "0" : "-1"), a?.classList.toggle("is-active", f), a?.setAttribute("aria-selected", f ? "true" : "false"), a?.setAttribute("tabindex", f ? "0" : "-1"); } catch (e) { console.debug?.(e); } try { t && (t.textContent = p), n?.setAttribute?.("aria-label", p), o && (o.hidden = !u, o.style.display = u ? "" : "none", o.setAttribute("aria-hidden", u ? "false" : "true")), s && (s.hidden = !d, s.style.display = d ? "" : "none", s.setAttribute("aria-hidden", d ? "false" : "true")), c && (c.hidden = !f, c.style.display = f ? "" : "none", c.setAttribute("aria-hidden", f ? "false" : "true")), l && (l.hidden = !u); } catch (e) { console.debug?.(e); } } function Dg({ messageBtn: t = null, messagePopover: n = null, title: r = null, messageList: i = null, historyTabBtn: a = null, historyTabBadge: o = null, historyTabCount: s = null, historyPanel: c = null, shortcutsPanel: l = null, messageTabBtn: u = null, messageTabBadge: d = null, shortcutsTabBtn: f = null, markReadBtn: p = null, popovers: m = null, onBeforeToggle: h = null, signal: g = null } = {}) { rg(); let _ = "messages", v = !1, y = null, b = /* @__PURE__ */ new Set(), x = () => { if (y) { try { clearTimeout(y); } catch (e) { console.debug?.(e); } y = null; } }, S = () => { if (!v || _ !== "history" || n?.style?.display !== "block") return; let e = he(); for (let t of e) { let e = Tg(t); if (!e || !b.has(e)) continue; let r = String(t?.status || "").trim().toLowerCase(); if (mg.has(r)) { x(), y = setTimeout(() => { y = null, !(!v || _ !== "history") && n?.style?.display === "block" && (m?.close?.(n), v = !1, b.clear(), C(), A()); }, fg); return; } } }, C = () => { let e = n?.style?.display === "block"; try { t?.setAttribute("aria-expanded", e ? "true" : "false"); } catch (e) { console.debug?.(e); } try { n?.setAttribute("aria-hidden", e ? "false" : "true"); } catch (e) { console.debug?.(e); } }, w = () => { if (!i) return; let e = ig(), t = og(); if (i.replaceChildren(), !e.length) { let e = document.createElement("div"); e.className = "mjr-messages-empty", e.textContent = R("msg.noMessages", "No messages for now."), i.appendChild(e); return; } for (let n of e) { let e = document.createElement("article"); e.className = "mjr-message-item"; let r = _g(n?.level); e.classList.add(`mjr-message-item--${r}`); let a = Number(n?.createdAt || 0); a > Number(t || 0) && e.classList.add("mjr-message-item--unread"); let o = document.createElement("div"); o.className = "mjr-message-item-head"; let s = document.createElement("div"); s.className = "mjr-message-item-title-wrap"; let c = document.createElement("span"); c.className = "mjr-message-item-emoji", c.textContent = yg(n), c.setAttribute("aria-hidden", "true"); let l = document.createElement("div"); l.className = "mjr-message-item-title", l.textContent = gg(n, "titleKey", "title", R("label.info", "Info")); let u = document.createElement("span"); u.className = "mjr-message-item-category", u.textContent = gg(n, "categoryKey", "category", R("label.info", "Info")), s.appendChild(c), s.appendChild(l), o.appendChild(s), o.appendChild(u); let d = document.createElement("div"); d.className = "mjr-message-item-meta", d.textContent = hg(a); let f = document.createElement("div"); f.className = "mjr-message-item-body", f.textContent = gg(n, "bodyKey", "body", ""), e.appendChild(o), d.textContent && e.appendChild(d), f.textContent && e.appendChild(f); let p = vg(n?.actionUrl), m = gg(n, "actionLabelKey", "actionLabel", R("label.readMe", "Read Me")); if (p && m) { let t = document.createElement("a"); t.className = "mjr-message-item-action", t.href = p, t.target = "_blank", t.rel = "noopener noreferrer", t.textContent = m, e.appendChild(t); } i.appendChild(e); } }, T = () => { if (!c) return; let e = he(), t = c.querySelector(".mjr-history-list"); if (!t) { let e = document.createElement("div"); e.className = "mjr-history-head"; let n = document.createElement("span"); n.className = "mjr-history-head-label", n.textContent = R("label.recentActivity", "Recent activity"); let r = document.createElement("button"); r.type = "button", r.className = "mjr-btn mjr-history-clear-btn", r.textContent = R("btn.clearHistory", "Clear"), r.title = R("tooltip.clearToastHistory", "Clear toast history"), r.addEventListener("click", (e) => { e.stopPropagation(), te(), T(); }, g ? { signal: g } : void 0), e.appendChild(n), e.appendChild(r), t = document.createElement("div"), t.className = "mjr-history-list", c.replaceChildren(e, t); } if (t.replaceChildren(), !e.length) { let e = document.createElement("div"); e.className = "mjr-messages-empty", e.textContent = R("msg.noHistory", "No recent activity."), t.appendChild(e); return; } for (let n of e) { let e = document.createElement("div"); e.className = `mjr-history-item mjr-history-item--${String(n.type || "info")}`; let r = document.createElement("span"); r.className = "mjr-history-item-icon", r.textContent = bg(n.type), r.setAttribute("aria-hidden", "true"); let i = document.createElement("div"); i.className = "mjr-history-item-content"; let a = String(n.title || "").trim(), o = String(n.detail || "").trim(), s = String(n.message || "").trim(), c = a || s, l = a && o ? o : a ? "" : o, u = document.createElement("div"); u.className = a ? "mjr-history-item-title" : "mjr-history-item-msg", u.textContent = c; let d = document.createElement("div"); d.className = "mjr-history-item-detail", d.textContent = l; let f = document.createElement("div"); f.className = "mjr-history-item-meta"; let p = document.createElement("span"); p.className = "mjr-history-item-time", p.textContent = hg(n.createdAt); let m = document.createElement("span"); m.className = "mjr-history-item-chip", m.textContent = xg(n); let h = document.createElement("span"); h.className = "mjr-history-item-chip", h.textContent = String(n.source || "").trim(); let g = document.createElement("span"); g.className = "mjr-history-item-chip", g.textContent = Sg(n.status), i.appendChild(u), d.textContent && i.appendChild(d), p.textContent && f.appendChild(p), m.textContent && f.appendChild(m), g.textContent && f.appendChild(g), h.textContent && f.appendChild(h), f.childNodes.length && i.appendChild(f); let _ = Cg(n), v = wg(n); if (_ || v !== null) { let e = document.createElement("div"); if (e.className = "mjr-history-item-progress", _) { let t = document.createElement("div"); t.className = "mjr-history-item-progress-summary", t.textContent = _, e.appendChild(t); } if (v !== null) { let t = document.createElement("div"); t.className = "mjr-history-item-progress-bar"; let n = document.createElement("div"); n.className = "mjr-history-item-progress-fill", n.style.width = `${v}%`, t.appendChild(n), e.appendChild(t); } i.appendChild(e); } let y = vg(n?.actionUrl), b = String(n?.actionLabel || "").trim(); if (y && b) { let e = document.createElement("a"); e.className = "mjr-history-item-action", e.href = y, e.target = "_blank", e.rel = "noopener noreferrer", e.textContent = b, i.appendChild(e); } e.appendChild(r), e.appendChild(i), t.appendChild(e); } }, E = (e, t) => { if (!e) return; let n = Math.max(0, Number(t || 0) || 0); if (n <= 0) { e.style.display = "none", e.textContent = ""; return; } e.style.display = "inline-flex", e.textContent = n > 99 ? "99+" : String(n); }, D = () => { let e = Ce(); o && (o.style.display = e > 0 ? "inline-block" : "none"), E(s, e); }, O = () => { l && (l.childNodes.length > 0 || l.replaceChildren(ug())); }, k = () => { if (!p) return; let e = Math.max(0, Number(ag() || 0) || 0); if (p.disabled = e <= 0, e > 0) { p.title = R("tooltip.markMessagesRead", "Mark all messages as read"); return; } p.title = R("tooltip.noUnreadMessages", "No unread messages"); }, A = () => { let e = Math.max(0, Number(ag() || 0) || 0); if (t) { let n = t.querySelector(".mjr-message-badge"), r = e > 0 ? R("tooltip.openMessagesUnread", "Messages ({count} unread)", { count: e }) : R("tooltip.openMessages", "Messages and updates"); t.classList.toggle("mjr-message-has-unread", e > 0), t.title = r, t.setAttribute("aria-label", r), n && (e <= 0 ? (n.style.display = "none", n.textContent = "") : (n.style.display = "inline-flex", n.textContent = e > 9 ? "9+" : String(e))); } E(d, e), k(); }, j = () => { A(), D(), n?.style?.display === "block" && (_ === "messages" && w(), _ === "history" && T()); }, M = g ? { signal: g } : void 0; try { window.addEventListener(Ih, j, M); } catch (e) { console.debug?.(e); } try { window.addEventListener(e, () => { if (D(), n?.style?.display === "block" && _ === "history" && T(), v) { for (let e of he()) { let t = String(e?.status || "").trim().toLowerCase(), n = Tg(e); n && pg.has(t) && b.add(n); } S(); } }, M); } catch (e) { console.debug?.(e); } try { t && n && (n.id ||= "mjr-messages-popover", t.setAttribute("aria-haspopup", "dialog"), t.setAttribute("aria-controls", n.id)); } catch (e) { console.debug?.(e); } let N = null; try { typeof MutationObserver < "u" && n && (N = new MutationObserver(C), N.observe(n, { attributes: !0, attributeFilter: ["style"] })); } catch (e) { console.debug?.(e); } try { g?.addEventListener?.("abort", () => N?.disconnect?.(), { once: !0 }); } catch (e) { console.debug?.(e); } A(), D(), C(), Eg({ activeTab: _, title: r, messagePopover: n, messageTabBtn: u, historyTabBtn: a, shortcutsTabBtn: f, messageList: i, historyPanel: c, shortcutsPanel: l, markReadBtn: p }); let P = () => { _ = "messages", Eg({ activeTab: _, title: r, messagePopover: n, messageTabBtn: u, historyTabBtn: a, shortcutsTabBtn: f, messageList: i, historyPanel: c, shortcutsPanel: l, markReadBtn: p }), w(), sg(), A(); }, F = () => { _ = "history", Eg({ activeTab: _, title: r, messagePopover: n, messageTabBtn: u, historyTabBtn: a, shortcutsTabBtn: f, messageList: i, historyPanel: c, shortcutsPanel: l, markReadBtn: p }), T(), xe(), D(); }, ee = () => { _ = "shortcuts", Eg({ activeTab: _, title: r, messagePopover: n, messageTabBtn: u, historyTabBtn: a, shortcutsTabBtn: f, messageList: i, historyPanel: c, shortcutsPanel: l, markReadBtn: p }), O(); }, I = (e) => { if (e === "messages") { P(); return; } if (e === "history") { F(); return; } ee(); }, ne = () => { if (!(!n || !m || !t)) { if (n?.style?.display !== "block") { try { typeof h == "function" && h(); } catch (e) { console.debug?.(e); } m.toggle(n, t); } F(), v = !0, x(), b.clear(); for (let e of he()) { let t = String(e?.status || "").trim().toLowerCase(), n = Tg(e); n && pg.has(t) && b.add(n); } S(), C(), A(); } }; try { window.addEventListener(B.OPEN_MESSAGE_HISTORY, () => { ne(); }, M); } catch (e) { console.debug?.(e); } let re = [ "messages", "history", "shortcuts" ], ie = (e, t) => { let n = String(e?.key || "").toLowerCase(), r = re.indexOf(String(t || "").toLowerCase()); if (!(r < 0)) { if (n === "arrowright") { e.preventDefault(); let t = re[(r + 1) % re.length]; I(t), t === "messages" && u?.focus?.(), t === "history" && a?.focus?.(), t === "shortcuts" && f?.focus?.(); return; } if (n === "arrowleft") { e.preventDefault(); let t = re[(r + re.length - 1) % re.length]; I(t), t === "messages" && u?.focus?.(), t === "history" && a?.focus?.(), t === "shortcuts" && f?.focus?.(); return; } if (n === "home") { e.preventDefault(), P(), u?.focus?.(); return; } if (n === "end") { e.preventDefault(), ee(), f?.focus?.(); return; } (n === " " || n === "enter") && (e.preventDefault(), I(t)); } }; return t?.addEventListener("click", (e) => { if (!(!n || !m || !t)) { e.stopPropagation(), v = !1, b.clear(), x(), _ = "messages", w(), O(), Eg({ activeTab: _, title: r, messagePopover: n, messageTabBtn: u, historyTabBtn: a, shortcutsTabBtn: f, messageList: i, historyPanel: c, shortcutsPanel: l, markReadBtn: p }); try { typeof h == "function" && h(); } catch (e) { console.debug?.(e); } m.toggle(n, t), n?.style?.display === "block" && sg(), C(), A(); } }, M), u?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), P(); }, M), u?.addEventListener("keydown", (e) => ie(e, "messages"), M), a?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), v = !1, b.clear(), x(), F(); }, M), a?.addEventListener("keydown", (e) => ie(e, "history"), M), f?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), ee(); }, M), f?.addEventListener("keydown", (e) => ie(e, "shortcuts"), M), p?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), sg(), w(), A(); }, M), { refresh: j, render: w, updateButtonState: A, showMessagesTab: P, showHistoryTab: F, showShortcutsTab: ee, openHistoryPopover: ne, close: () => { !n || !m || (m.close(n), v = !1, b.clear(), x(), C()); } }; } //#endregion //#region ui/features/panel/controllers/query.ts function Og(e) { let t = e; for (let e = 0; e < 3 && !(!t || typeof t != "object" || !("value" in t)); e += 1) { let e = t.value; if (!e || typeof e != "object") break; t = e; } return t; } function kg(e) { let t = Og(e); if (!t) return null; let n = String(t?.tagName || "").toUpperCase(); if (n === "INPUT" || n === "TEXTAREA") return t; try { if (typeof t?.querySelector == "function") { let e = t.querySelector("#mjr-search-input") || t.querySelector("input.mjr-input") || t.querySelector("input[type='text']") || t.querySelector("textarea"); if (e) return e; } } catch (e) { console.debug?.(e); } return null; } function Ag(e) { let t = kg(e), n = t ? t.value : typeof e?.value == "string" ? e.value : ""; return String(n || "").trim() || "*"; } //#endregion //#region ui/features/panel/controllers/gridController.ts function jg({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollectionAssets: r, disposeGrid: i, getQuery: a, searchInputEl: o, state: s }) { let { read: c, write: l } = kh(s, /* @__PURE__ */ "scope.customRootId.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.resolutionCompare.minWidth.minHeight.maxWidth.maxHeight.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.activeAssetId.selectedAssetIds.collectionId.collectionName.viewScope.similarResults.similarTitle.similarSourceAssetId.lastGridCount.lastGridTotal".split(".")), u = !1, d = !1, f = {}, p = 0, h = 0, g = 3e4, _ = async (e, t = g) => { let n = null; try { let r = new Promise((e, r) => { n = setTimeout(() => { let e = /* @__PURE__ */ Error(`Grid reload watchdog timeout (${t}ms)`); e.name = "GridReloadTimeout", r(e); }, t); }); return await Promise.race([e(), r]); } finally { n && clearTimeout(n); } }, v = () => { try { return o?.dataset?.mjrSemanticMode === "1"; } catch { return !1; } }, y = () => { try { return !!(mn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } }, b = (e, t = "") => { try { if (e && typeof e == "object") return String(e.error || e.message || t || "").trim(); } catch {} try { return String(e || t || "").trim(); } catch { return String(t || "").trim(); } }, x = (e = []) => !Array.isArray(e) || e.length === 0 ? !1 : e.some((e) => { if (String(e?._matchType || e?.matchType || "").trim().toLowerCase().includes("semantic")) return !0; let t = Number(e?._vectorScore ?? e?.vectorScore ?? NaN); return Number.isFinite(t) && t > 0; }), S = () => { let e = String(c("currentFolderRelativePath", "") || "").trim(); return { subfolder: !(c("scope", "output") === "custom" && !c("customRootId", "")) && e ? e : null, kind: c("kindFilter", "") || null, hasWorkflow: c("workflowOnly", !1) ? !0 : null, minRating: Number(c("minRating", 0) || 0) > 0 ? Number(c("minRating", 0) || 0) : null, minSizeMB: Number(c("minSizeMB", 0) || 0) > 0 ? Number(c("minSizeMB", 0) || 0) : null, maxSizeMB: Number(c("maxSizeMB", 0) || 0) > 0 ? Number(c("maxSizeMB", 0) || 0) : null, minWidth: Number(c("minWidth", 0) || 0) > 0 ? Number(c("minWidth", 0) || 0) : null, minHeight: Number(c("minHeight", 0) || 0) > 0 ? Number(c("minHeight", 0) || 0) : null, maxWidth: Number(c("maxWidth", 0) || 0) > 0 ? Number(c("maxWidth", 0) || 0) : null, maxHeight: Number(c("maxHeight", 0) || 0) > 0 ? Number(c("maxHeight", 0) || 0) : null, workflowType: String(c("workflowType", "") || "").trim().toUpperCase() || null, workflowId: String(c("workflowId", "") || "").trim() || null, workflowModel: String(c("workflowModelFilter", "") || "").trim() || null, runsOn: String(c("workflowRunsOnFilter", "") || "").trim().toLowerCase() || null, dateRange: String(c("dateRangeFilter", "") || "").trim().toLowerCase() || null, dateExact: String(c("dateExactFilter", "") || "").trim() || null }; }, C = async (e = "") => { let t = Date.now(); if (t - Number(h || 0) < 15e3) return; h = t; try { let e = await be(); if (e?.ok && e?.data) { let t = Number(e.data?.total || 0) || 0, n = Number(e.data?.eligible_total || 0) || 0, r = Number(e.data?.coverage_ratio ?? NaN); if (t <= 10) { k(R("toast.aiSearchNeedsBackfill", "AI search index is almost empty ({count} vectors). Run Enrich, then Vector Backfill for existing assets.", { count: t }), "warn", 6500); return; } if (n > 0 && Number.isFinite(r) && r > 0 && r < .75) { k(R("toast.aiSearchPartiallyIndexed", "AI search index is only partially built ({indexed}/{eligible}, {percent}%). Run Vector Backfill for existing assets.", { indexed: t, eligible: n, percent: Math.round(r * 100) }), "warn", 7e3); return; } } } catch {} let n = b(e, R("toast.aiSearchUnavailable", "AI search is currently unavailable. Falling back to normal search.")); k(n, "warn", 5200); }, w = async (r, i = {}) => { let a = String(r || "").trim(), o = /^ai:\s*/i.test(a); o && (a = a.replace(/^ai:\s*/i, "").trim()); let s = y(), l = s && v(); if (!s) return await t(e, a || "*", i); let u = l || o, d = !1, f = ""; if (u && a && a !== "*") { d = !0; let t = S(); try { let r = await ee(a, { topK: 100, scope: c("scope", "output") || "output", customRootId: c("customRootId", "") || "", ...t }); if (r?.ok && Array.isArray(r.data) && r.data.length > 0 && x(r.data)) return await n(e, r.data, { title: `AI Search: "${a}" (${r.data.length} results)`, reset: !0, ...i }); r?.ok === !1 && (f = b(r?.error || r?.message, f)); } catch (e) { f = b(e, f), console.debug?.("[Majoor] Hybrid search failed, trying pure semantic", e); } try { let r = await m(a, { topK: 100, scope: c("scope", "output") || "output", customRootId: c("customRootId", "") || "", ...t }); if (r?.ok && Array.isArray(r.data) && r.data.length > 0) return await n(e, r.data, { title: `AI Search: "${a}" (${r.data.length} results)`, reset: !0, ...i }); r?.ok === !1 && (f = b(r?.error || r?.message, f)); } catch (e) { f = b(e, f), console.debug?.("[Majoor] Semantic search failed, falling back to FTS", e); } } let p = await t(e, a || "*", i); return d && f && (Number(p?.count || 0) || 0) === 0 && C(f), p; }, T = async (t = {}) => { let i = String(e.dataset.mjrViewScope || "").trim().toLowerCase(), o = String(c("viewScope", s?.viewScope || "") || "").trim().toLowerCase(); e.dataset.mjrScope = c("scope", "output"), e.dataset.mjrViewScope = o, e.dataset.mjrCustomRootId = c("customRootId", "") || ""; let u = c("currentFolderRelativePath", "") || ""; e.dataset.mjrSubfolder = u, e.dataset.mjrFilterKind = c("kindFilter", "") || "", e.dataset.mjrFilterWorkflowOnly = c("workflowOnly", !1) ? "1" : "0", e.dataset.mjrFilterMinRating = String(c("minRating", 0) || 0), e.dataset.mjrFilterMinSizeMB = String(c("minSizeMB", 0) || 0), e.dataset.mjrFilterMaxSizeMB = String(c("maxSizeMB", 0) || 0), e.dataset.mjrFilterResolutionCompare = String(c("resolutionCompare", "gte") || "gte"), e.dataset.mjrFilterMinWidth = String(c("minWidth", 0) || 0), e.dataset.mjrFilterMinHeight = String(c("minHeight", 0) || 0), e.dataset.mjrFilterMaxWidth = String(c("maxWidth", 0) || 0), e.dataset.mjrFilterMaxHeight = String(c("maxHeight", 0) || 0), e.dataset.mjrFilterWorkflowType = String(c("workflowType", "") || ""), e.dataset.mjrFilterWorkflowId = String(c("workflowId", "") || ""), e.dataset.mjrFilterWorkflowModel = String(c("workflowModelFilter", "") || ""), e.dataset.mjrFilterWorkflowRunsOn = String(c("workflowRunsOnFilter", "") || ""), e.dataset.mjrFilterDateRange = c("dateRangeFilter", "") || "", e.dataset.mjrFilterDateExact = c("dateExactFilter", "") || "", e.dataset.mjrSort = c("sort", "mtime_desc") || "mtime_desc", e.dataset.mjrCollectionId = c("collectionId", "") || "", e.dataset.mjrSemanticMode = v() ? "1" : "0"; try { e.dataset.mjrQuery = String(a?.() ?? "*") || "*"; } catch (e) { console.debug?.(e); } e.dataset.mjrGroupStacks = z.EXECUTION_GROUPING_ENABLED && (c("scope", "output") === "output" || c("scope", "output") === "all") ? "1" : "0"; try { let t = Array.isArray(c("selectedAssetIds", [])) ? c("selectedAssetIds", []).filter(Boolean).map(String) : []; t.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(t), e.dataset.mjrSelectedAssetId = String(c("activeAssetId", "") || t[0] || "")) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); } catch (e) { console.debug?.(e); } if (c("scope", "output") === "custom" && !c("customRootId", "") && !c("currentFolderRelativePath", "") && l("currentFolderRelativePath", ""), c("collectionId", "")) { let t = await r?.(c("collectionId", "")); if (t?.ok && t.data && Array.isArray(t.data.assets)) { let r = c("collectionName", "") ? `Collection: ${c("collectionName", "")}` : "Collection", i = await n(e, t.data.assets, { title: r, reset: !0 }); try { l("lastGridCount", Number(i?.count || 0) || 0), l("lastGridTotal", Number(i?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: i || {} })); } catch (e) { console.debug?.(e); } return; } l("collectionId", ""), l("collectionName", ""); } let d = o; if (d === "similar") { let r = Array.isArray(c("similarResults", [])) ? c("similarResults", []) : [], i = Array.isArray(s?.similarResults) ? s.similarResults : [], a = r.length > 0 ? r : i, o = String(c("similarSourceAssetId", s?.similarSourceAssetId || "") || "").trim(), u = await n(e, a, { title: String(c("similarTitle", s?.similarTitle || "") || R("search.similarResults", "Similar to asset #{id} ({n} results)", { id: o || "?", n: a.length })).trim() || "Similar", reset: !0, ...t }); try { l("lastGridCount", Number(u?.count || 0) || 0), l("lastGridTotal", Number(u?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: u || {} })); } catch (e) { console.debug?.(e); } return; } let f = i === "similar" && d !== "similar", p = await w(a(), { ...t, preserveVisibleUntilReady: t.preserveVisibleUntilReady ?? !f }); try { let e = window.MajoorMetrics?.hasTimer?.("searchQuery") ? window.MajoorMetrics?.endTimer?.("searchQuery", "searchQuery") : 0; typeof e == "number" && e > 0 && window.MajoorMetrics?.trackSearchQuery?.(e); } catch (e) { console.debug?.(e); } try { l("lastGridCount", Number(p?.count || 0) || 0), l("lastGridTotal", Number(p?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: p || {} })); } catch (e) { console.debug?.(e); } }, E = null, D = async () => { if (d = !0, !u) { u = !0; try { for (; d;) { let e = { ...f || {} }; f = {}, d = !1; try { let t = y() && (v() || String(a?.() || "").length >= 12); await _(() => T(e), t ? 15e4 : g); } catch (e) { try { let t = Date.now(); t - Number(p || 0) > 2e3 && (p = t, console.warn("[Majoor] Grid reload failed", e)); } catch (e) { console.debug?.(e); } } } } finally { u = !1; } } }; return { reloadGrid: (e = {}) => new Promise((t, n) => { f = { ...f || {}, ...e || {} }, E && clearTimeout(E), E = setTimeout(() => { E = null, D().then(t).catch(n); }, 30); }) }; } //#endregion //#region ui/features/panel/controllers/browserNavigationController.ts function Mg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbController: r = null, customSelect: i, reloadGrid: a, clearSelection: o = null, onContextChanged: s = null, lifecycleSignal: c = null } = {}) { let { read: l, write: u } = kh(e, [ "scope", "customRootId", "currentFolderRelativePath" ]), d = [], f = (e) => String(e || "").trim().replaceAll("\\", "/"), p = (e) => /^[a-zA-Z]:$/.test(String(e || "").trim()), m = () => f(l("currentFolderRelativePath", "") || ""), h = (e, t) => { let n = f(t); Array.isArray(e) && (!n && n !== "" || (e.length ? f(e[e.length - 1]) : null) !== n && e.push(n)); }, g = (e, t) => { let n = f(t); if (!Array.isArray(e)) return null; for (; e.length;) { let t = f(e.pop()); if (t !== n) return t; } return null; }, _ = (e) => { let n = f(e); u("currentFolderRelativePath", n); try { t?.dataset && (t.dataset.mjrSubfolder = n); } catch (e) { console.debug?.(e); } }, v = (e) => { if (f(e?.filename || "") === "..") return y(m()); let t = f(e?.subfolder || ""); if (t) return t; let n = f(e?.filepath || e?.path || ""); if (n) return String(e?.kind || "").toLowerCase() === "folder" ? n : y(n) || n; let r = f(e?.filename || ""); if (!r) return m(); let i = m(); return i ? `${i}/${r}`.replace(/\/{2,}/g, "/") : r; }, y = (e) => { let t = f(e); if (!t) return ""; let n = t.split("/").filter(Boolean); return n.length ? n.length === 1 ? p(n[0]) ? `${n[0]}/` : "" : (n.pop(), n.length === 1 && p(n[0]) ? `${n[0]}/` : n.join("/")) : ""; }, b = () => { try { s?.(); } catch (e) { console.debug?.(e); } try { T(); } catch (e) { console.debug?.(e); } }, x = () => { try { t && typeof t.scrollTop == "number" && (t.scrollTop = 0); } catch (e) { console.debug?.(e); } try { let e = t?.parentElement || null; e && typeof e.scrollTop == "number" && (e.scrollTop = 0); } catch (e) { console.debug?.(e); } }, S = async (e, { pushHistory: t = !0 } = {}) => { let n = m(), r = f(e); if (n !== r) { t && h(d, n), _(r), x(), b(); try { o?.(); } catch (e) { console.debug?.(e); } await a?.(); } }, C = async () => { u("customRootId", ""), _(""), x(), b(); try { o?.(); } catch (e) { console.debug?.(e); } await a?.(); }, w = (e) => { if (typeof r?.setFolderBreadcrumb != "function") return !1; try { return r.setFolderBreadcrumb(e), !0; } catch (e) { return console.debug?.(e), !1; } }, T = () => { let e = String(l("scope", "") || "") === "custom", t = String(l("currentFolderRelativePath", "") || "").trim().replaceAll("\\", "/"), r = e || !!t, a = String(l("customRootId", "") || "").trim(), o = (() => { if (!a) return ""; try { let e = i?.selectedOptions?.[0] || null; return String(e?.textContent || "").trim(); } catch { return ""; } })(); if (!r) { if (d.length = 0, w({ visible: !1 })) return; n.style.display = "none", n.replaceChildren(); return; } let s = !!String(l("customRootId", "") || "").trim(), u = s && !t, f = !!t, h = d.length === 0 && !u && !f, _ = !t || y(m()) === m(), v = async () => { let e = g(d, m()); if (e != null) { await S(e, { pushHistory: !1 }); return; } let t = m(); if (t) { let e = y(t); if (e === t) { s && await C(); return; } await S(e, { pushHistory: !1 }); return; } u && await C(); }, b = async () => { let e = y(m()); if (e === m()) { s && await C(); return; } await S(e); }, x = (e, t, n = !1) => ({ label: String(e || ""), target: String(t || ""), current: !!n, onClick: async () => { if (e === "Computer" && String(l("customRootId", "") || "").trim()) { await C(); return; } await S(t); } }), T = [x(R("label.computer", "Computer"), "", !t)]; if (a && T.push(x(o || a, "", !t)), t) { let e = t.split("/").filter(Boolean), n = ""; for (let t = 0; t < e.length; t++) n = n ? `${n}/${e[t]}`.replace(/\/{2,}/g, "/") : p(e[t]) ? `${e[t]}/` : e[t], T.push(x(e[t], n, t === e.length - 1)); } if (w({ visible: !0, back: { label: R("btn.back", "Back"), disabled: h, onClick: v }, up: { label: R("btn.up", "Up"), disabled: _, onClick: b }, items: T })) return; n.style.display = "flex", n.replaceChildren(); let E = document.createElement("button"); E.type = "button", E.textContent = R("btn.back", "Back"), E.className = "mjr-btn-link mjr-folder-breadcrumb-action", E.disabled = h, E.addEventListener("click", v, { signal: c || void 0 }), n.appendChild(E); let D = document.createElement("button"); D.type = "button", D.textContent = R("btn.up", "Up"), D.className = "mjr-btn-link mjr-folder-breadcrumb-action", D.disabled = _, D.addEventListener("click", b, { signal: c || void 0 }), n.appendChild(D); let O = document.createElement("span"); O.textContent = "|", O.className = "mjr-folder-breadcrumb-separator", n.appendChild(O); let k = (e, t, n = !1) => { let r = document.createElement("button"); return r.type = "button", r.textContent = e, r.className = n ? "mjr-btn-link mjr-folder-breadcrumb-segment is-current" : "mjr-btn-link mjr-folder-breadcrumb-segment", n ? r.disabled = !0 : r.addEventListener("click", async () => { if (e === "Computer" && String(l("customRootId", "") || "").trim()) { await C(); return; } await S(t); }, { signal: c || void 0 }), r; }; for (let e = 0; e < T.length; e++) { if (e > 0) { let e = document.createElement("span"); e.textContent = "/", e.className = "mjr-folder-breadcrumb-separator", n.appendChild(e); } let t = T[e]; n.appendChild(k(t.label, t.target, t.current)); } }; return { renderBreadcrumb: T, resetHistory: () => { d.length = 0; }, bindGridFolderNavigation: () => { let e = async (e) => { let t = e?.detail?.asset || null, n = v(t || {}), r = m(); if (n !== r) { h(d, r), _(n), x(), b(); try { o?.(); } catch (e) { console.debug?.(e); } try { await a?.(); } catch (e) { console.debug?.(e); } } }, n = async (e) => { let t = String(e?.detail?.subfolder || "").trim().replaceAll("\\", "/"), n = m(); if (t !== n) { h(d, n), _(t), x(), b(); try { o?.(); } catch (e) { console.debug?.(e); } try { await a?.(); } catch (e) { console.debug?.(e); } } }; t?.addEventListener?.("mjr:custom-subfolder-changed", n, { signal: c || void 0 }), t?.addEventListener?.("mjr:open-folder-asset", e, { signal: c || void 0 }); try { t._mjrHasCustomSubfolderHandler = !0; } catch (e) { console.debug?.(e); } return () => { try { t?.removeEventListener?.("mjr:custom-subfolder-changed", n); } catch (e) { console.debug?.(e); } try { t?.removeEventListener?.("mjr:open-folder-asset", e); } catch (e) { console.debug?.(e); } try { t._mjrHasCustomSubfolderHandler = !1; } catch (e) { console.debug?.(e); } }; }, notifyContext: b }; } //#endregion //#region ui/features/panel/controllers/scopeController.ts function Ng({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popovers: i, reloadGrid: a, reconcileSelection: o = null, onChanged: s = null, onScopeChanged: c = null, onBeforeReload: l = null }) { let u = 0, { panelStore: d, read: f, write: p, controllerState: m } = kh(e, [ "scope", "customRootId", "currentFolderRelativePath", "workflowType", "workflowId", "sort", "collectionId", "collectionName", "viewScope", "similarResults", "similarTitle", "similarSourceAssetId" ]), h = ({ viewScope: e = "", similarResults: t = [], similarTitle: n = "", similarSourceAssetId: r = "" } = {}) => { p("viewScope", e), p("similarResults", t), p("similarTitle", n), p("similarSourceAssetId", r); }, g = () => { try { return !!(String(f("viewScope", "") || "").trim().toLowerCase() === "similar" || Array.isArray(f("similarResults", [])) && f("similarResults", []).length > 0 || String(f("similarTitle", "") || "").trim()); } catch { return !1; } }, _ = () => { h(); }, v = () => { let e = Object.values(t || {}), a = String(f("viewScope", "") || f("scope", "output")).toLowerCase(); e.forEach((e) => { let t = e?.dataset?.scope === a; e?.classList?.toggle?.("is-active", t); }); try { let e = t?.tabSimilar; e && (e.style.display = g() ? "" : "none"); } catch (e) { console.debug?.(e); } n.style.display = "none", r.style.display = "none", i.close(r); }; return { setScope: async (e) => { let t = ++u, n = /* @__PURE__ */ new Set([ "output", "outputs", "input", "inputs", "all", "custom", "workflow", "similar" ]), r = String(e || "").toLowerCase(); if (!n.has(r)) return; if (r === "similar") { if (!g()) return; p("viewScope", "similar"), v(); try { s?.(); } catch (e) { console.debug?.(e); } try { await l?.(m()); } catch (e) { console.debug?.(e); } await a(); return; } p("collectionId", ""), p("collectionName", ""), p("searchQuery", ""), _(); let i = r === "outputs" ? "output" : r === "inputs" ? "input" : r; if (d?.navigateToScope) try { d.navigateToScope(i, { folder: "" }); } catch (e) { console.debug?.(e), p("scope", i), p("currentFolderRelativePath", ""); } else p("scope", i), p("currentFolderRelativePath", ""); String(f("scope", i)) !== "custom" && p("customRootId", ""), v(); try { s?.(); } catch (e) { console.debug?.(e); } try { await c?.(m()); } catch (e) { console.debug?.(e); } if (t === u) { try { await l?.(m()); } catch (e) { console.debug?.(e); } if (t === u) { try { o?.(); } catch (e) { console.debug?.(e); } await a(); } } }, setActiveTabStyles: v, clearSimilarScope: async ({ reload: e = !0 } = {}) => { let t = g(); _(), p("searchQuery", ""), v(); try { s?.(); } catch (e) { console.debug?.(e); } !t || !e || await a(); } }; } //#endregion //#region ui/features/panel/controllers/contextController.ts var Pg = (e, t) => { if (e) try { e.value = t; } catch (e) { console.debug?.(e); } }, Fg = (e, t) => { if (e) try { e.checked = !!t; } catch (e) { console.debug?.(e); } }; function Ig({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsBtn: i, searchInputEl: a, kindSelect: o, wfCheckbox: s, workflowTypeSelect: c, workflowIdInput: l, workflowModelInput: u, workflowRunsOnSelect: d, ratingSelect: f, minSizeInput: p, maxSizeInput: m, minWidthInput: h, minHeightInput: g, maxWidthInput: _, maxHeightInput: v, resolutionPresetSelect: y, dateRangeSelect: b, dateExactInput: x, scopeController: S, sortController: C, updateSummaryBar: w, reloadGrid: T, extraActions: E = null, getExtraContext: D = null } = {}) { let O = e && typeof e == "object" ? e : {}, { read: k, write: A, controllerState: j } = kh(e, /* @__PURE__ */ "searchQuery.scope.collectionId.collectionName.customRootId.customRootLabel.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.minWidth.minHeight.maxWidth.maxHeight.resolutionCompare.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.viewScope.similarResults.similarTitle.similarSourceAssetId".split(".")), M = (e, t) => { A(e, t); }, N = (e, t = "") => k(e, t), P = () => ({ ...O || {}, ...j?.() || {}, customRootLabel: N("customRootLabel", "") }), F = () => { try { E?.resetBrowserHistory?.(); } catch (e) { console.debug?.(e); } }, ee = () => { try { let e = t?.closest?.(".mjr-assets-manager") || document.querySelector?.(".mjr-assets-manager") || document.documentElement; if (!e?.style?.setProperty) return; e.style.setProperty("--mjr-star-active", String(z.BADGE_STAR_COLOR || "#FFD45A")), e.style.setProperty("--mjr-badge-image", String(z.BADGE_IMAGE_COLOR || "#2196F3")), e.style.setProperty("--mjr-badge-video", String(z.BADGE_VIDEO_COLOR || "#9C27B0")), e.style.setProperty("--mjr-badge-audio", String(z.BADGE_AUDIO_COLOR || "#FF9800")), e.style.setProperty("--mjr-badge-model3d", String(z.BADGE_MODEL3D_COLOR || "#4CAF50")), e.style.setProperty("--mjr-badge-duplicate-alert", String(z.BADGE_DUPLICATE_ALERT_COLOR || "#FF1744")); } catch (e) { console.debug?.(e); } }, te = { clearQuery: async () => { try { Pg(a, ""), M("searchQuery", ""); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearCollection: async () => { try { M("collectionId", ""), M("collectionName", ""); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearScope: async () => { try { if (String(e?.viewScope || "").trim().toLowerCase() === "similar" && typeof E?.clearSimilarScope == "function") { await E.clearSimilarScope(); return; } } catch (e) { console.debug?.(e); } let n = !1; try { M("customRootId", ""), M("customRootLabel", ""), M("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, F(), typeof S?.setScope == "function" ? (await S.setScope("output"), n = !0) : (M("scope", "output"), S?.setActiveTabStyles?.()); } catch (e) { console.debug?.(e); } try { n || await T?.(); } catch (e) { console.debug?.(e); } }, clearCustomRoot: async () => { try { M("customRootId", ""), M("customRootLabel", ""), M("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, F(); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearFolder: async () => { try { M("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, F(); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearKind: async () => { try { M("kindFilter", ""), Pg(o, ""); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearMinRating: async () => { try { M("minRating", 0), Pg(f, "0"); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearWorkflowOnly: async () => { try { M("workflowOnly", !1), Fg(s, !1); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearWorkflowType: async () => { try { M("workflowType", ""), Pg(c, ""); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearWorkflowId: async () => { try { M("workflowId", ""), Pg(l, ""); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearWorkflowModel: async () => { try { M("workflowModelFilter", ""), Pg(u, ""); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearWorkflowRunsOn: async () => { try { M("workflowRunsOnFilter", ""), Pg(d, ""); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearSize: async () => { try { M("minSizeMB", 0), M("maxSizeMB", 0), Pg(p, ""), Pg(m, ""); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearResolution: async () => { try { M("minWidth", 0), M("minHeight", 0), M("maxWidth", 0), M("maxHeight", 0), Pg(h, ""), Pg(g, ""), Pg(_, ""), Pg(v, ""), Pg(y, ""); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearDateRange: async () => { try { M("dateRangeFilter", ""), Pg(b, ""); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearDateExact: async () => { try { M("dateExactFilter", ""), Pg(x, ""); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearSort: async () => { try { M("sort", "mtime_desc"), C?.setSortIcon?.(N("sort", "mtime_desc")), C?.renderSortMenu?.(); } catch (e) { console.debug?.(e); } try { await T?.(); } catch (e) { console.debug?.(e); } }, clearAll: async () => { let e = !1; try { Pg(a, ""); } catch (e) { console.debug?.(e); } try { M("collectionId", ""), M("collectionName", ""), M("kindFilter", ""), M("workflowOnly", !1), M("minRating", 0), M("minSizeMB", 0), M("maxSizeMB", 0), M("minWidth", 0), M("minHeight", 0), M("maxWidth", 0), M("maxHeight", 0), M("resolutionCompare", "gte"), M("workflowType", ""), M("workflowId", ""), M("workflowModelFilter", ""), M("workflowRunsOnFilter", ""), M("dateRangeFilter", ""), M("dateExactFilter", ""), M("sort", "mtime_desc"), M("customRootId", ""), M("customRootLabel", ""), M("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, F(); try { await E?.clearTransientContext?.(); } catch (e) { console.debug?.(e); } typeof S?.setScope == "function" ? (await S.setScope("output"), e = !0) : (M("scope", "output"), S?.setActiveTabStyles?.()); } catch (e) { console.debug?.(e); } try { Pg(o, ""), Fg(s, !1), Pg(c, ""), Pg(l, ""), Pg(u, ""), Pg(d, ""), Pg(f, "0"), Pg(p, ""), Pg(m, ""), Pg(h, ""), Pg(g, ""), Pg(_, ""), Pg(v, ""), Pg(y, ""), Pg(b, ""), Pg(x, ""); } catch (e) { console.debug?.(e); } try { C?.setSortIcon?.(N("sort", "mtime_desc")), C?.renderSortMenu?.(); } catch (e) { console.debug?.(e); } try { e || await T?.(); } catch (e) { console.debug?.(e); } } }; if (E && typeof E == "object") { let e = /* @__PURE__ */ new Set([ "__proto__", "constructor", "prototype" ]); for (let [t, n] of Object.entries(E)) e.has(String(t)) || (te[t] = n); } return { update: () => { let e = String(a?.value || "").trim(), o = Ag(a), s = P(), c = !!(N("kindFilter", "") || N("workflowOnly", !1) || (Number(N("minRating", 0) || 0) || 0) > 0 || (Number(N("minSizeMB", 0) || 0) || 0) > 0 || (Number(N("maxSizeMB", 0) || 0) || 0) > 0 || (Number(N("minWidth", 0) || 0) || 0) > 0 || (Number(N("minHeight", 0) || 0) || 0) > 0 || (Number(N("maxWidth", 0) || 0) || 0) > 0 || (Number(N("maxHeight", 0) || 0) || 0) > 0 || String(N("workflowType", "") || "").trim().length > 0 || String(N("workflowId", "") || "").trim().length > 0 || String(N("workflowModelFilter", "") || "").trim().length > 0 || String(N("workflowRunsOnFilter", "") || "").trim().length > 0 || N("dateRangeFilter", "") || N("dateExactFilter", "")), l = String(N("sort", "mtime_desc") || "mtime_desc") !== "mtime_desc", u = !!N("collectionId", ""); try { n?.classList?.toggle?.("mjr-context-active", c), r?.classList?.toggle?.("mjr-context-active", l), i?.classList?.toggle?.("mjr-context-active", u); } catch (e) { console.debug?.(e); } try { let n = typeof D == "function" && D() || {}; w?.({ state: s, gridContainer: t, context: { rawQuery: e || o, ...n }, actions: te }); } catch (e) { console.debug?.(e); } ee(); }, actions: te }; } //#endregion //#region ui/features/panel/controllers/customRootsController.ts function Lg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, comfyPrompt: i, comfyToast: a, get: o, post: s, ENDPOINTS: c, reloadGrid: l, onRootChanged: u = null }) { let d = e && typeof e == "object" ? e : {}, { read: f, write: p } = kh(e, [ "customRootId", "customRootLabel", "currentFolderRelativePath" ]), m = (e) => { p("customRootLabel", String(e || "")); }, h = async (e = null) => { let r = t.querySelector("option[value=\"\"]")?.textContent || R("label.selectFolder", "Select folder..."); t.innerHTML = ""; let i = document.createElement("option"); i.value = "", i.textContent = R("msg.loading"), i.disabled = !0, t.appendChild(i), t.disabled = !0; try { let i = await o(c.CUSTOM_ROOTS), a = i && i.ok && Array.isArray(i.data) ? i.data : []; t.innerHTML = ""; let s = document.createElement("option"); s.value = "", s.textContent = r, t.appendChild(s), a.forEach((e) => { let n = document.createElement("option"); n.value = e.id, n.textContent = e.name || e.path || e.id, t.appendChild(n); }); let l = e || f("customRootId", ""); if (l && a.some((e) => e.id === l)) { t.value = l, p("customRootId", l); try { let e = t.options[t.selectedIndex]; m(String(e?.text || "").trim()); } catch { m(""); } } else t.value = "", p("customRootId", ""), m(""); n.disabled = !f("customRootId", ""); } catch (e) { console.warn("Majoor: failed to load custom roots", e), t.innerHTML = ""; let n = document.createElement("option"); n.value = "", n.textContent = R("msg.errorLoadingFolders"), n.disabled = !0, t.appendChild(n); } finally { t.disabled = !1; } }; return { refreshCustomRoots: h, bind: ({ customAddBtn: n, customRemoveBtn: o }) => { let g = [], _ = (e, t, n) => { if (!(!e?.addEventListener || typeof n != "function")) { try { e.addEventListener(t, n); } catch { return; } g.push(() => { try { e.removeEventListener(t, n); } catch (e) { console.debug?.(e); } }); } }; return _(t, "change", async () => { if (!t.disabled) { p("customRootId", t.value || ""); try { let e = t.options[t.selectedIndex]; m(String(e?.text || "").trim()); } catch { m(""); } p("currentFolderRelativePath", ""), o.disabled = !f("customRootId", ""); try { await u?.(d); } catch (e) { console.debug?.(e); } await l(); } }), n && (n.disabled = !1, n.title = R("btn.add", "Add")), _(n, "click", async () => { let t = ""; try { let e = await s(c.BROWSE_FOLDER, {}); e?.ok && (t = String(e?.data?.path || "").trim()); } catch (e) { console.debug?.(e); } if (!t) { let e = await i(R("dialog.enterFolderPath", "Enter folder path"), ""); t = String(e || "").trim(); } if (!t) return; let n = await i(R("dialog.folderLabelOptional", "Folder label (optional)"), ""), r = await s(c.CUSTOM_ROOTS, { path: t, label: String(n || "").trim() || void 0 }); if (!r?.ok) { a(r?.error || R("toast.failedAddFolder", "Failed to add browser folder"), "error"); return; } let o = String(r?.data?.id || "").trim() || null; await h(o); try { await u?.(e); } catch (e) { console.debug?.(e); } await l(), a(R("toast.folderAdded", "Folder added"), "success"); }), _(o, "click", async () => { if (!f("customRootId", "")) return; let e = t.options[t.selectedIndex], n = e ? e.text : R("label.thisFolder", "this folder"); if (await r(R("dialog.removeFolder", `Remove the browser folder "${n}"?`, { name: n }), R("dialog.customFoldersTitle", "Majoor: Browser Folders"))) { o.disabled = !0, o.textContent = R("btn.removing"); try { let e = await s(c.CUSTOM_ROOTS_REMOVE, { id: f("customRootId", "") }); if (!e?.ok) { a(e?.error || R("toast.failedRemoveFolder", "Failed to remove browser folder"), "error"); return; } a(R("toast.folderRemoved", "Folder removed"), "success"), p("customRootId", ""), m(""), p("currentFolderRelativePath", ""), await h(), await l(); } catch (e) { console.warn("Majoor: remove custom root failed", e), a(R("toast.errorRemovingFolder", "An error occurred while removing the browser folder"), "error"); } finally { o.disabled = !f("customRootId", ""), o.textContent = R("btn.remove"); } } }), () => { for (let e of g.splice(0)) try { e(); } catch (e) { console.debug?.(e); } }; } }; } //#endregion //#region ui/features/panel/controllers/sortController.ts function Rg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, reloadGrid: a, onChanged: o = null }) { let { read: s, write: c } = kh(e, ["sort"]), l = () => [ { key: "mtime_desc", label: R("sort.newest") }, { key: "mtime_asc", label: R("sort.oldest") }, { key: "name_asc", label: R("sort.nameAZ") }, { key: "name_desc", label: R("sort.nameZA") }, { key: "rating_desc", label: R("sort.ratingHigh") }, { key: "size_desc", label: R("sort.sizeDesc") }, { key: "size_asc", label: R("sort.sizeAsc") } ], u = (e) => { let n = t.querySelector("i"); n && (n.className = e === "name_asc" ? "pi pi-sort-alpha-down" : e === "name_desc" ? "pi pi-sort-alpha-up" : e === "mtime_asc" ? "pi pi-sort-amount-up-alt" : e === "rating_desc" ? "pi pi-star-fill" : e === "size_desc" ? "pi pi-sort-numeric-down-alt" : e === "size_asc" ? "pi pi-sort-numeric-up-alt" : "pi pi-sort-amount-down"); }, d = () => { n.replaceChildren(); let e = l(); for (let t of e) { let e = t.key === s("sort", "mtime_desc"), l = document.createElement("button"); l.type = "button", l.className = "mjr-menu-item", l.style.cssText = ` display:flex; align-items:center; justify-content:space-between; width:100%; gap:10px; padding:9px 10px; border-radius:9px; border:1px solid ${e ? "rgba(120,190,255,0.68)" : "rgba(120,190,255,0.18)"}; background:${e ? "linear-gradient(135deg, rgba(70,130,255,0.28), rgba(20,95,185,0.22))" : "linear-gradient(135deg, rgba(255,255,255,0.03), rgba(255,255,255,0.01))"}; box-shadow:${e ? "0 0 0 1px rgba(160,210,255,0.22) inset, 0 8px 18px rgba(35,95,185,0.26)" : "none"}; transition: border-color 120ms ease, background 120ms ease, box-shadow 120ms ease; `; let f = document.createElement("span"); f.className = "mjr-menu-item-label", f.textContent = t.label, f.style.cssText = `font-weight:${e ? "700" : "600"}; color:${e ? "rgba(208,234,255,0.98)" : "var(--fg-color, #e6edf7)"};`; let p = document.createElement("i"); p.className = "pi pi-check mjr-menu-item-check", p.style.cssText = `opacity:${e ? "1" : "0"}; color: rgba(133,203,255,0.98);`, l.appendChild(f), l.appendChild(p), l.addEventListener("mouseenter", () => { e || (l.style.borderColor = "rgba(145,205,255,0.4)", l.style.background = "linear-gradient(135deg, rgba(80,140,255,0.18), rgba(32,100,200,0.14))"); }), l.addEventListener("mouseleave", () => { e || (l.style.borderColor = "rgba(120,190,255,0.18)", l.style.background = "linear-gradient(135deg, rgba(255,255,255,0.03), rgba(255,255,255,0.01))"); }), l.addEventListener("click", async () => { c("sort", t.key), u(s("sort", "mtime_desc")), d(); try { o?.(); } catch (e) { console.debug?.(e); } r.style.display = "none", i.close(r), await a(); }), n.appendChild(l); } }; return { bind: ({ onBeforeToggle: e } = {}) => { u(s("sort", "mtime_desc")), d(), t.addEventListener("click", (n) => { n.stopPropagation(); try { e?.(); } catch (e) { console.debug?.(e); } d(), i.toggle(r, t); }); }, renderSortMenu: d, setSortIcon: u }; } //#endregion //#region ui/features/panel/controllers/sidebarController.ts var zg = "_mjrRescanning", Bg = 1500, Vg = (e) => /^\d+$/.test(String(e ?? "").trim()); async function Hg({ card: e, asset: t, sidebar: n, onAssetUpdated: r }) { if (!e || !t || globalThis._mjrMaintenanceActive) return; try { let t = Date.now(); if (t - (Number(e[zg] || 0) || 0) < Bg) return; e[zg] = t; } catch (e) { console.debug?.(e); } let i = e.querySelector(".mjr-workflow-dot"); try { i && (Wt(i, "pending", "Pending: metadata refresh in progress", { asset: t }), i.classList.add("mjr-pulse-animation"), i.style.cursor = "progress", i.title = R("tooltip.pendingRefresh", "Pending: metadata refresh in progress")); } catch (e) { console.debug?.(e); } try { k(R("toast.rescanUpdatingAiIndex", "Rescanning file + updating AI index..."), "info", 2200); } catch (e) { console.debug?.(e); } let a = { filename: t.filename, subfolder: t.subfolder || "", type: String(t.type || "output").toLowerCase(), root_id: Ne(t) || void 0 }, o = null, s = !1, l = !1, u = !1; try { if (s = !!(await le(lt.INDEX_FILES, { files: [a], incremental: !1 }))?.ok, !s && i && (Wt(i, "error", "Error: metadata refresh failed", { asset: t }), i.classList.remove("mjr-pulse-animation"), i.style.cursor = ""), Vg(t?.id)) { l = !0; try { u = !!(await c(t.id))?.ok; } catch (e) { console.debug?.(e); } } if (s && t.id != null) { let e = await re(t.id); e?.ok && e.data && (o = { ...t, ...e.data }); } } catch { try { i && (Wt(i, "error", "Error: metadata refresh failed", { asset: t }), i.classList.remove("mjr-pulse-animation"), i.style.cursor = ""); } catch (e) { console.debug?.(e); } } try { if (o) { e._mjrAsset = o, typeof r == "function" && r(o); try { if (n?.classList?.contains?.("is-open")) { let e = n?._currentAsset?.id ?? n?._currentFullAsset?.id ?? null; e != null && String(e) === String(o.id) && (n._mjrNeedsRefresh = !0); } } catch (e) { console.debug?.(e); } } } finally { try { if (i && i.isConnected) { let e = Ot(o || t); e && i.replaceWith(e); } } catch { try { i && (i.style.cursor = ""); } catch (e) { console.debug?.(e); } } } try { s && u ? k(R("toast.metadataVectorUpdated", "Metadata + AI vector index updated for this asset."), "success", 2200) : s && l && !u && k(R("toast.metadataUpdatedVectorFailed", "Metadata updated. AI vector index could not be updated."), "warning", 2600); } catch (e) { console.debug?.(e); } return o; } function Ug(e, t) { if (e) { try { let n = e.querySelector(".mjr-asset-card.is-selected"); n && n !== t && (n.classList.remove("is-selected"), n.setAttribute?.("aria-selected", "false")); } catch (e) { console.debug?.(e); } if (t) { t.classList.add("is-selected"), t.setAttribute?.("aria-selected", "true"); try { let n = t.dataset?.mjrAssetId; n && (e.dataset.mjrSelectedAssetId = String(n)); } catch (e) { console.debug?.(e); } try { t.focus?.({ preventScroll: !0 }); } catch { try { t.focus?.(); } catch (e) { console.debug?.(e); } } try { t.scrollIntoView?.({ block: "nearest", inline: "nearest" }); } catch (e) { console.debug?.(e); } } } } var Wg = (e) => { if (e == null) return ""; try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(String(e)); } catch (e) { console.debug?.(e); } return String(e).replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); }; function Gg(e, t) { if (!e || !t) return null; try { return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Wg(t)}"]`); } catch (e) { console.debug?.(e); } try { return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Wg(t)}"]`); } catch (e) { console.debug?.(e); } return null; } function Kg(e) { if (!e) return null; let t = e.dataset?.mjrSelectedAssetId; if (t) { let n = Gg(e, t); if (n) return n; } let n = e.dataset?.mjrSelectedAssetIds; if (n) try { let t = JSON.parse(n); if (Array.isArray(t) && t.length) { let n = Gg(e, t[0]); if (n) return n; } } catch (e) { console.debug?.(e); } return e.querySelector(".mjr-asset-card.is-selected"); } function qg(e, { preventScroll: t = !0 } = {}) { if (e) try { e.focus?.({ preventScroll: t }); } catch { try { e.focus?.(); } catch (e) { console.debug?.(e); } } } function Jg(e, { force: t = !1 } = {}) { if (!e || !t && !e._mjrFocusWithin) return; let n = Kg(e); n && (qg(n), e._mjrFocusWithin = !0); } function Yg(e) { if (e) try { let t = Kg(e); if (!t) return; let n = e.parentElement; if (n && typeof n.getBoundingClientRect == "function" && typeof t.getBoundingClientRect == "function") { let e = n.getBoundingClientRect(), r = t.getBoundingClientRect(); if (r.top >= e.top && r.bottom <= e.bottom) return; } t.scrollIntoView?.({ block: "nearest", inline: "nearest" }); } catch (e) { console.debug?.(e); } } function Xg(e) { if (e) try { e._mjrAutoRevealSelectionUntil = Date.now() + 900; } catch (e) { console.debug?.(e); } let t = () => { try { Yg(e); } catch (e) { console.debug?.(e); } try { Jg(e); } catch (e) { console.debug?.(e); } }; try { requestAnimationFrame(() => { t(), setTimeout(() => { t(); }, 50); }); } catch { t(); } } function Zg(e, t) { e && (t ? (e.classList.add("is-selected"), e.setAttribute?.("aria-selected", "true")) : (e.classList.remove("is-selected"), e.setAttribute?.("aria-selected", "false"))); } function Qg(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); if (Array.isArray(t) && t.length) return t; } } catch { return []; } try { return Array.from(e.querySelectorAll(".mjr-asset-card")); } catch { return []; } } function $g(e) { if (e) try { let t = Qg(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean); t.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(t), !e.dataset.mjrSelectedAssetId && t[0] && (e.dataset.mjrSelectedAssetId = String(t[0]))) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); } catch (e) { console.debug?.(e); } } function e_(e, t, n = "") { if (!e) return []; let r = Array.from(t || []).map(String).filter(Boolean); try { if (typeof e?._mjrSetSelection == "function") return e._mjrSetSelection(r, n || r[0] || ""), r; } catch (e) { console.debug?.(e); } try { e.dataset.mjrSelectedAssetIds = r.length ? JSON.stringify(r) : "", r.length ? e.dataset.mjrSelectedAssetId = String(n || r[0] || "") : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); } catch (e) { console.debug?.(e); } try { for (let t of Qg(e)) { let e = t?.dataset?.mjrAssetId; Zg(t, !!(e && r.includes(String(e)))); } } catch (e) { console.debug?.(e); } try { e.dispatchEvent?.(new CustomEvent("mjr:selection-changed", { detail: { selectedIds: r, activeId: n || r[0] || "" } })); } catch (e) { console.debug?.(e); } return r; } function t_({ gridContainer: e, state: t, activeId: n, readState: r = null, writeState: i = null } = {}) { if (!(!t && !i || !e)) try { let a = []; if (e.dataset?.mjrSelectedAssetIds) try { let t = JSON.parse(e.dataset.mjrSelectedAssetIds); Array.isArray(t) && (a = t.map(String).filter(Boolean)); } catch (e) { console.debug?.(e); } else a = e.dataset?.mjrSelectedAssetId ? [String(e.dataset.mjrSelectedAssetId)].filter(Boolean) : Qg(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean).map(String); typeof i == "function" ? i("selectedAssetIds", a) : t.selectedAssetIds = a; let o = String(typeof r == "function" ? r("activeAssetId", "") || "" : t?.activeAssetId || ""); n == null ? o && a.includes(o) || (typeof i == "function" ? i("activeAssetId", a[0] || "") : t.activeAssetId = a[0] || "") : typeof i == "function" ? i("activeAssetId", String(n)) : t.activeAssetId = String(n); } catch (e) { console.debug?.(e); } } function n_({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadge: r, showAssetInSidebar: i, closeSidebar: a, state: o }) { let { read: s, write: c } = kh(o, [ "activeAssetId", "selectedAssetIds", "sidebarOpen" ]); if (!e) return { dispose: () => {} }; if (e._mjrSidebarOpenBound) return { dispose: e._mjrSidebarOpenDispose || (() => {}) }; e._mjrSidebarOpenBound = !0; let l = (t) => { e._mjrFocusWithin = !0; let n = Pt(t.target, ".mjr-asset-card"); if (n) try { e._mjrLastFocusedCardId = n.dataset?.mjrAssetId || ""; } catch (e) { console.debug?.(e); } }, u = (t) => { let n = t?.relatedTarget; n && e.contains(n) || (e._mjrFocusWithin = !1); }; try { e.addEventListener("focusin", l), e.addEventListener("focusout", u); } catch (e) { console.debug?.(e); } try { if (!e._mjrSelectionResizeObserver) { let t = e.parentElement, n = null, r = null, i = () => { try { return Date.now() <= Number(e?._mjrAutoRevealSelectionUntil || 0); } catch { return !1; } }, a = () => { n && cancelAnimationFrame(n), r && clearTimeout(r), n = requestAnimationFrame(() => { n = null, i() && Yg(e); }), r = setTimeout(() => { r = null, i() && Yg(e); }, 160); }, o = new ResizeObserver(() => a()); t && o.observe(t), o.observe(e), e._mjrSelectionResizeObserver = o; } } catch (e) { console.debug?.(e); } let d = (e, t, i) => { try { let n = i?.has_workflow ?? i?.hasWorkflow ?? t.has_workflow, r = i?.has_generation_data ?? i?.hasGenerationData ?? t.has_generation_data; n !== void 0 && (t.has_workflow = n), r !== void 0 && (t.has_generation_data = r); let a = e.querySelector(".mjr-workflow-dot"), o = Ot(t); a && o && a.replaceWith(o); } catch (e) { console.debug?.(e); } if (i?.rating !== void 0 && i.rating !== t.rating) { t.rating = i.rating; let r = e.querySelector(".mjr-thumb"), a = e.querySelector(".mjr-rating-badge"), o = n(i.rating || 0); a && o ? a.replaceWith(o) : a && !o ? a.remove() : !a && o && r && r.appendChild(o); } if (i?.tags && JSON.stringify(i.tags) !== JSON.stringify(t.tags)) { t.tags = i.tags; let n = e.querySelector(".mjr-tags-badge"); if (n) { let e = r(i.tags || []); n.replaceWith(e); } } }, f = async (n) => { if (n.defaultPrevented) return; let r = Pt(n.target, ".mjr-asset-card"); if (!r) return; let a = Pt(n.target, ".mjr-workflow-dot"); if (a && r.contains(a)) { let a = r._mjrAsset; if (!a) return; n.preventDefault(), n.stopPropagation(); let l = r?.dataset?.mjrAssetId || ""; e_(e, l ? [l] : [], l), t_({ gridContainer: e, state: o, activeId: l, readState: s, writeState: c }); let u = await Hg({ card: r, asset: a, sidebar: t, onAssetUpdated: (e) => d(r, a, e) }); try { let e = t?._currentAsset?.id ?? t?._currentFullAsset?.id ?? null; u && t?.classList?.contains?.("is-open") && e != null && String(e) === String(u.id) && await i(t, u, (e) => d(r, a, e)); } catch (e) { console.debug?.(e); } return; } let l = Pt(n.target, "a, button, input, textarea, select, label"); if (l && r.contains(l)) return; let u = r._mjrAsset; if (u) { if (e?._mjrSelectionManagedByVue) { t_({ gridContainer: e, state: o, activeId: String(r?.dataset?.mjrAssetId || "").trim(), readState: s, writeState: c }); try { if (t?.classList?.contains?.("is-open")) { await i(t, u, (e) => d(r, u, e)); try { c("sidebarOpen", !0); } catch (e) { console.debug?.(e); } } } catch (e) { console.debug?.(e); } return; } if (n.preventDefault(), n.stopPropagation(), n.ctrlKey || n.metaKey || n.shiftKey) { let t = Qg(e), i = t.indexOf(r); if (n.shiftKey) { let t = []; try { typeof e?._mjrGetAssets == "function" && (t = e._mjrGetAssets() || []); } catch (e) { console.debug?.(e); } if (Array.isArray(t) && t.length) { let n = r?.dataset?.mjrAssetId || "", i = t.findIndex((e) => String(e?.id || "") === String(n)), a = Number(e._mjrLastSelectedIndex), l = Number.isFinite(a) ? a : i; if (i >= 0 && l >= 0) { let r = Math.min(l, i), a = Math.max(l, i), u = t.slice(r, a + 1).map((e) => String(e?.id || "")).filter(Boolean); e_(e, u, n || u[0] || ""), e._mjrLastSelectedIndex = i, t_({ gridContainer: e, state: o, activeId: n || "", readState: s, writeState: c }); return; } } } let a = String(r?.dataset?.mjrAssetId || "").trim(); i >= 0 && (e._mjrLastSelectedIndex = i); let l = /* @__PURE__ */ new Set(); try { let t = e.dataset?.mjrSelectedAssetIds; if (t) { let e = JSON.parse(t); if (Array.isArray(e)) for (let t of e) { let e = String(t || "").trim(); e && l.add(e); } } else { let t = String(e.dataset?.mjrSelectedAssetId || "").trim(); t && l.add(t); } } catch (e) { console.debug?.(e); } if (!l.size) for (let e of t) { let t = String(e?.dataset?.mjrAssetId || "").trim(); t && e.classList?.contains?.("is-selected") && l.add(t); } a && (l.has(a) ? l.delete(a) : l.add(a)); let u = Array.from(l), d = l.has(a) ? a : u[0] || ""; e_(e, u, d), t_({ gridContainer: e, state: o, activeId: d, readState: s, writeState: c }); return; } { if (r.classList.contains("is-selected")) { e_(e, [], ""), t_({ gridContainer: e, state: o, activeId: "", readState: s, writeState: c }); return; } let n = r?.dataset?.mjrAssetId; e_(e, n ? [n] : [], n || ""), t_({ gridContainer: e, state: o, activeId: n || "", readState: s, writeState: c }); try { t?.classList?.contains?.("is-open") && i(t, u, (e) => d(r, u, e)); } catch (e) { console.debug?.(e); } } try { Yg(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } } }; e.addEventListener("click", f); let p = async () => { let n = String(s("activeAssetId", "") || ""), r = null; if (n) try { r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Wg(n)}"]`); } catch { try { r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Wg(n)}"]`); } catch (e) { console.debug?.(e); } } r ||= e.querySelector(".mjr-asset-card.is-selected"); let l = r?._mjrAsset; if (l) { Ug(e, r), $g(e), t_({ gridContainer: e, state: o, activeId: r?.dataset?.mjrAssetId, readState: s, writeState: c }); try { let n = !!t?.classList?.contains?.("is-open"), r = t?._currentAsset?.id ?? t?._currentFullAsset?.id ?? null; if (n && r != null && String(r) === String(l.id) && typeof a == "function") { a(t); try { c("sidebarOpen", !1); } catch (e) { console.debug?.(e); } Jg(e, { force: !0 }), Xg(e); return; } } catch (e) { console.debug?.(e); } try { await i(t, l, (e) => d(r, l, e)); try { c("sidebarOpen", !0); } catch (e) { console.debug?.(e); } Xg(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } } }, m = async () => { try { if (!t?.classList?.contains?.("is-open")) return !1; } catch { return !1; } let n = String(s("activeAssetId", "") || "").trim(); if (!n) return !1; let r = null; try { r = Gg(e, n); } catch (e) { console.debug?.(e); } let a = r?._mjrAsset; if (!a) return !1; try { await i(t, a, (e) => d(r, a, e)); try { c("sidebarOpen", !0); } catch (e) { console.debug?.(e); } return !0; } catch (e) { console.debug?.(e); } return !1; }, h = !1, g = () => { try { if (!t?.classList?.contains?.("is-open")) return; } catch { return; } h || (h = !0, queueMicrotask(async () => { h = !1; try { await m(); } catch (e) { console.debug?.(e); } })); }; e.addEventListener("mjr:selection-changed", g); let _ = (t) => { if (t.defaultPrevented || (t.key?.toLowerCase?.() || "") !== "d" || t.ctrlKey || t.metaKey || t.altKey || t.target?.isContentEditable || t.target?.closest?.("input, textarea, select, [contenteditable='true']")) return; let n = Pt(t.target, ".mjr-asset-card"); n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), Ug(e, n), $g(e), t_({ gridContainer: e, state: o, activeId: n?.dataset?.mjrAssetId, readState: s, writeState: c }), p()); }; e.addEventListener("keydown", _); let v = () => { try { c("sidebarOpen", !1); } catch (e) { console.debug?.(e); } }; t?.addEventListener?.("mjr:sidebar-closed", v); try { e._mjrOpenDetails = p; } catch (e) { console.debug?.(e); } let y = () => { try { e.removeEventListener("click", f); } catch (e) { console.debug?.(e); } try { e.removeEventListener("focusin", l); } catch (e) { console.debug?.(e); } try { e.removeEventListener("focusout", u); } catch (e) { console.debug?.(e); } try { e.removeEventListener("keydown", _); } catch (e) { console.debug?.(e); } try { e.removeEventListener("mjr:selection-changed", g); } catch (e) { console.debug?.(e); } try { t?.removeEventListener?.("mjr:sidebar-closed", v); } catch (e) { console.debug?.(e); } try { e._mjrOpenDetails === p && delete e._mjrOpenDetails; } catch (e) { console.debug?.(e); } try { e._mjrSelectionResizeObserver?.disconnect?.(); } catch (e) { console.debug?.(e); } try { delete e._mjrSelectionResizeObserver; } catch (e) { console.debug?.(e); } try { delete e._mjrSidebarOpenBound; } catch (e) { console.debug?.(e); } try { delete e._mjrSidebarOpenDispose; } catch (e) { console.debug?.(e); } }; return e._mjrSidebarOpenDispose = y, { dispose: y, toggleDetails: p, refreshActiveAsset: m }; } //#endregion //#region ui/features/panel/controllers/panelHotkeysController.ts function r_({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleFloatingViewer: r, onFocusSearch: i, onClearSearch: a, allowListKeys: o } = {}) { let s = !1, c = !1, l = null, u = o instanceof Set ? o : /* @__PURE__ */ new Set([ " ", "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "PageUp", "PageDown", "Home", "End", "Enter", "Escape", "Tab" ]), d = () => s || c, f = (e) => { if (d()) return !0; try { let t = e?.target; if (l && t && typeof l.contains == "function" && (l === t || l.contains(t))) return !0; } catch (e) { console.debug?.(e); } try { let e = document.activeElement; return !!(l?.isConnected && e && e !== document.body && l.contains?.(e)); } catch (e) { return console.debug?.(e), !1; } }, p = (e) => { try { if (e?.target?.closest?.(".mjr-grid")) return !0; } catch (e) { console.debug?.(e); } try { let e = Zn(); return e && (document.activeElement === document.body || e.contains?.(document.activeElement)) || !1; } catch (e) { return console.debug?.(e), !1; } }, m = { focusin: () => { s = !0; }, focusout: () => { s = !1; }, mouseenter: () => { c = !0; }, mouseleave: () => { c = !1; }, keydown: (o) => { if (Se() || ge().scope === "viewer") return; if (o.key?.toLowerCase?.() === "v" && !o.ctrlKey && !o.metaKey && !o.altKey && !o.shiftKey && !(o.target?.isContentEditable || o.target?.closest?.("input, textarea, select, [contenteditable='true']")) && l?.isConnected && f(o)) { let e = !1; try { let t = document.activeElement; t && t !== document.body && !l.contains?.(t) && (e = t.matches?.("input, textarea, select, [contenteditable='true']") || t.isContentEditable); } catch (e) { console.debug?.(e); } if (!e) { o.preventDefault(), o.stopPropagation(), o.stopImmediatePropagation?.(); try { r?.(); } catch (e) { console.debug?.(e); } return; } } if (!f(o)) return; let s = o.key?.toLowerCase?.() || "", c = o.target?.isContentEditable || o.target?.closest?.("input, textarea, select, [contenteditable='true']"); if (s === "s" && (o.ctrlKey || o.metaKey)) { o.preventDefault(), o.stopPropagation(), o.stopImmediatePropagation?.(); try { let n = typeof t == "function" ? t() : null; e?.(n); } catch (e) { console.debug?.(e); } return; } if ((s === "f" || s === "k") && (o.ctrlKey || o.metaKey)) { o.preventDefault(), o.stopPropagation(), o.stopImmediatePropagation?.(); try { i?.(); } catch (e) { console.debug?.(e); } return; } if (s === "h" && (o.ctrlKey || o.metaKey)) { o.preventDefault(), o.stopPropagation(), o.stopImmediatePropagation?.(); try { a?.(); } catch (e) { console.debug?.(e); } return; } if (s === "d" && !o.ctrlKey && !o.metaKey && !o.altKey) { if (c) return; o.preventDefault(), o.stopPropagation(), o.stopImmediatePropagation?.(); try { n?.(); } catch (e) { console.debug?.(e); } return; } if (s === "v" && !o.ctrlKey && !o.metaKey && !o.altKey && !o.shiftKey) { if (c) return; o.preventDefault(), o.stopPropagation(), o.stopImmediatePropagation?.(); try { r?.(); } catch (e) { console.debug?.(e); } return; } if (u.has(o.key) && f(o)) { if (c || p(o)) return; o.preventDefault(), o.stopPropagation(), o.stopImmediatePropagation?.(); } } }, h = (e) => { if (!(!e || l === e)) { l && g(), l = e; try { l.addEventListener("focusin", m.focusin), l.addEventListener("focusout", m.focusout), l.addEventListener("mouseenter", m.mouseenter), l.addEventListener("mouseleave", m.mouseleave); } catch (e) { console.debug?.(e); } try { window.addEventListener("keydown", m.keydown, { capture: !0 }); } catch (e) { console.debug?.(e); } P("panel"); } }, g = () => { if (l) { try { l.removeEventListener("focusin", m.focusin), l.removeEventListener("focusout", m.focusout), l.removeEventListener("mouseenter", m.mouseenter), l.removeEventListener("mouseleave", m.mouseleave); } catch (e) { console.debug?.(e); } try { window.removeEventListener("keydown", m.keydown, { capture: !0 }); } catch (e) { console.debug?.(e); } ge().scope === "panel" && P(null), l = null; } }; return { bind: h, dispose: g }; } //#endregion //#region ui/vue/composables/useGridSelection.ts function i_(e) { return Array.isArray(e) ? e.map((e) => String(e || "").trim()).filter(Boolean) : []; } function a_({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAssetId: n = () => "", writeSelectedAssetIds: r = (e) => {}, writeActiveAssetId: i = (e) => {}, onSelectionChanged: a = () => {}, lifecycleSignal: o = null } = {}) { if (!e) return { restoreSelectionState() {}, dispose() {} }; let s = (e) => { try { let t = e?.detail || {}, n = i_(t.selectedIds); r(n), i(String(t.activeId || n[0] || "").trim()); } catch (e) { console.debug?.(e); } try { a(e?.detail || {}); } catch (e) { console.debug?.(e); } }; try { e.addEventListener("mjr:selection-changed", s, { signal: o || void 0 }); } catch (e) { console.debug?.(e); } return { restoreSelectionState: ({ scrollTop: r = 0 } = {}) => { let i = i_(t()), a = String(n() || i[0] || "").trim(); if (!(!i.length && !a)) { try { typeof e?._mjrSetSelection == "function" && e._mjrSetSelection(i, a); } catch (e) { console.debug?.(e); } if (a) { try { if (typeof e?._mjrScrollToAssetId == "function") { e._mjrScrollToAssetId(a); return; } } catch (e) { console.debug?.(e); } try { iu(e, a)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); } catch (e) { console.debug?.(e); } } } }, dispose() { try { e.removeEventListener("mjr:selection-changed", s); } catch (e) { console.debug?.(e); } } }; } //#endregion //#region ui/vue/composables/useAssetsQuery.ts function o_(e) { try { if (typeof requestAnimationFrame == "function") { requestAnimationFrame(e); return; } } catch (e) { console.debug?.(e); } setTimeout(e, 0); } function s_(e = {}, t = "*") { return e.scope === "output" && !e.collectionId && t === "*" && !e.kindFilter && !e.workflowOnly && !(Number(e.minRating || 0) > 0) && !(Number(e.minSizeMB || 0) > 0) && !(Number(e.maxSizeMB || 0) > 0) && !(Number(e.minWidth || 0) > 0) && !(Number(e.minHeight || 0) > 0) && !(Number(e.maxWidth || 0) > 0) && !(Number(e.maxHeight || 0) > 0) && !String(e.workflowType || "").trim() && !String(e.workflowId || "").trim() && !e.dateRangeFilter && !e.dateExactFilter; } function c_({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => null, gridController: r, captureAnchor: i, restoreAnchor: a, restoreGridUiState: o = null, readScrollTop: s = () => 0, restoreSelectionState: c = () => {}, readActiveAssetId: l = () => "", isSidebarOpen: u = () => !1, toggleSidebarDetails: d = () => {}, getQuery: f = () => "*", getScope: p = () => "output", loadAssets: m = null, lifecycleSignal: h = null } = {}) { let g = 0, _ = !1, v = null, y = null, b = null, x = 0, S = !0, C = "", w = Date.now(), T = () => { try { return Ic(e, (typeof n == "function" ? n() : t) || t || null); } catch (e) { return console.debug?.(e), !1; } }, E = (e = null, { resumeQueuedReload: t = !0 } = {}) => { if (S = typeof e == "boolean" ? e : T(), !S) return v &&= (clearTimeout(v), null), S; if (t && C && !_) { let e = C; C = "", k({ reason: e }).catch((e) => console.debug?.(e)); } if (b && !v) { let e = b, t = x || 50; b = null, x = 0, F(e, Math.min(t, 50)); } return t && g > 0 && !_ && k().catch((e) => console.debug?.(e)), S; }, D = () => { try { let t = e?._mjrGetGridState?.(); if (Array.isArray(t?.assets) && t.assets.length > 0) return !0; } catch (e) { console.debug?.(e); } try { let t = e?._mjrGetAssets?.(); if (Array.isArray(t) && t.length > 0) return !0; } catch (e) { console.debug?.(e); } try { return e?.querySelector?.(".mjr-asset-card") != null; } catch (e) { return console.debug?.(e), !1; } }, O = () => { try { return !!e?._mjrGetGridState?.()?.loading; } catch (e) { return console.debug?.(e), !1; } }, k = async (t = {}) => { if (!(!e || !r?.reloadGrid) && (g += 1, E(null, { resumeQueuedReload: !1 }) && !_)) { _ = !0; try { for (; g > 0;) { if (!E(null, { resumeQueuedReload: !1 })) return; g = 0; let t = typeof i == "function" ? i(e) : null; if (await r.reloadGrid(), !E(null, { resumeQueuedReload: !1 })) return; if (t && typeof a == "function") try { if ((Number(s() || 0) || 0) > (Number(t?.scrollTop || 0) || 0) + 8) continue; await a(e, t); } catch (e) { console.debug?.(e); } } } finally { _ = !1; } } }, A = (e = "external") => { C = String(e || "external"); try { let e = globalThis?.window ?? globalThis; e.__mjrGridDirty = !0; } catch (e) { console.debug?.(e); } if (E(null, { resumeQueuedReload: !1 }) && !_) { let e = C; C = "", k({ reason: e }).catch((e) => console.debug?.(e)); } }, j = (e) => { e?.detail?.source !== "assets-query-controller" && A(e?.detail?.reason || "external"); }, M = (e) => { A(e?.detail?.reason || "manual"); }; try { let e = globalThis?.window ?? globalThis; e?.addEventListener?.("mjr-grid-dirty", j, { signal: h || void 0 }), e?.addEventListener?.("mjr:reload-grid", M, { signal: h || void 0 }); } catch (e) { console.debug?.(e); } let N = async (e) => { if (typeof o == "function") return o(e); try { await e; } catch (e) { console.debug?.(e); } o_(() => { let e = Number(s() || 0) || 0; if (e > 0) try { t.scrollTop = e; } catch (e) { console.debug?.(e); } try { c({ scrollTop: e }); } catch (e) { console.debug?.(e); } if (u() && l()) try { d(); } catch (e) { console.debug?.(e); } }); }, P = async (t) => { try { await t; } catch (e) { console.debug?.(e); } if (!(!e || typeof m != "function") && !h?.aborted) { if (!E()) { b = t, x = 50; return; } if (!D() && !O() && String(p() || "output") === "output" && String(f() || "*") === "*") try { let t = await ae(`${lt.HEALTH_COUNTERS}?scope=output`, { signal: h || void 0 }); t?.ok && (t.data?.total_assets || 0) > 0 && await m(e); } catch (e) { console.debug?.(e); } } }, F = (e, t = 2e3) => (v && clearTimeout(v), E() ? (b = null, x = 0, v = setTimeout(() => { v = null, P(e).catch(() => {}); }, t), v) : (b = e, x = t, null)); return { queuedReload: k, restoreUiState: N, scheduleAutoLoad: F, createCountersUpdateHandler: ({ state: t = {}, getStableQuery: n = () => String(e?.dataset?.mjrQuery || "*").trim() || "*", getRecentUserInteractionAt: r = () => 0 } = {}) => { let i = globalThis?.window ?? globalThis, a = null, o = null, s = null, c = !1; return async (e = {}) => { if (!c) { c = !0, a = e.last_scan_end, o = e.last_index_end, s = Number(e.total_assets ?? null); return; } let l = e.last_scan_end && e.last_scan_end !== a, u = e.last_index_end && e.last_index_end !== o, d = Number(e.total_assets ?? null), f = s_(t, String(n() || "*").trim() || "*"), p = Date.now() - w < 8e3, m = Number.isFinite(d) && Number.isFinite(s) ? d - s : 0, h = Math.max(0, Number(i?.__mjrLastAssetUpsertCount || 0) || 0), g = m >= 20; if (Number.isFinite(d) && (s = d), !f) { a = e.last_scan_end, o = e.last_index_end; return; } if (p && D() && !u && !g) { a = e.last_scan_end, o = e.last_index_end; return; } let _ = Date.now() - Number(i?.__mjrLastAssetUpsert || 0) < 15e3, v = _ && m > 0 && h > 0 && m <= h + 8, y = g && !l && !u && D(); u && (o = e.last_index_end); let b = u && !l && !g && !_; if (v) { a = e.last_scan_end, o = e.last_index_end; try { i.__mjrLastAssetUpsertCount = 0; } catch (e) { console.debug?.(e); } return; } if (y) { a = e.last_scan_end, o = e.last_index_end; return; } if (_ || !l && !g && !b) return; a = e.last_scan_end, o = e.last_index_end; let x = l ? "scan" : u ? "index" : "total"; try { i.__mjrGridDirty = !0, i.dispatchEvent?.(new CustomEvent("mjr-grid-dirty", { detail: { source: "assets-query-controller", reason: x, counters: e } })); } catch (e) { console.debug?.(e); } try { let e = Date.now() - Math.max(0, Number(r() || 0) || 0); D() || (e > 1500 ? A(x) : C = x); } catch (e) { console.debug?.(e); } try { i.__mjrLastAssetUpsertCount = 0; } catch (e) { console.debug?.(e); } }; }, bindSearchInput: ({ searchInputEl: e, lifecycleSignal: t = null, debounceMs: n = 200, onQueryChanged: r = (e) => {}, onBeforeReload: i = () => {}, startSearchTimer: a = () => {}, reloadGrid: o = () => {} } = {}) => { if (!e) return () => {}; let s = "", c = () => { try { i(); } catch (e) { console.debug?.(e); } try { a(); } catch (e) { console.debug?.(e); } try { o(); } catch (e) { console.debug?.(e); } }, l = (e) => { let t = e?.target?.value ?? ""; if (t !== s) { s = t; try { r(t); } catch (e) { console.debug?.(e); } if (y && clearTimeout(y), t.length === 0 || t === "*") { c(); return; } y = setTimeout(() => { y = null, c(); }, n); } }, u = (e) => { e?.key === "Enter" && (y &&= (clearTimeout(y), null), c()); }; return e.addEventListener("input", l, { signal: t || void 0 }), e.addEventListener("keypress", u, { signal: t || void 0 }), () => { y &&= (clearTimeout(y), null); try { e.removeEventListener("input", l); } catch (e) { console.debug?.(e); } try { e.removeEventListener("keypress", u); } catch (e) { console.debug?.(e); } }; }, markGridDirty: A, setVisibility(e = null) { return E(e); }, dispose() { try { let e = globalThis?.window ?? globalThis; e?.removeEventListener?.("mjr-grid-dirty", j), e?.removeEventListener?.("mjr:reload-grid", M); } catch (e) { console.debug?.(e); } v &&= (clearTimeout(v), null), b = null, x = 0, y &&= (clearTimeout(y), null); } }; } //#endregion //#region ui/features/panel/panelBootstrap.ts function l_(e, { useComfyThemeUI: t }) { t ? e.classList.add("mjr-assets-manager") : e.classList.remove("mjr-assets-manager"); let n = e.parentElement || null, r = n ? { height: n.style.height, minHeight: n.style.minHeight, width: n.style.width } : null; try { n && (n.style.height = "100%", n.style.minHeight = "0", n.style.width = "100%"); } catch (e) { console.debug?.(e); } Xn(); for (let t of [ () => e._eventCleanup?.(), () => e._mjrPopoverManager?.dispose?.(), () => e._mjrHotkeys?.dispose?.(), () => e._mjrRatingHotkeys?.dispose?.(), () => e._mjrSidebarController?.dispose?.(), () => e._mjrGridContextMenuUnbind?.() ]) try { t(); } catch (e) { console.debug?.(e); } e.replaceChildren(), e.classList.add("mjr-am-container"); let i = Ki(e); try { e._mjrPopoverManager = i; } catch (e) { console.debug?.(e); } return { popovers: i, hostWrapper: n, hostWrapperPrevStyle: r }; } //#endregion //#region ui/features/panel/panelSettingsSync.ts function u_({ container: e, state: t, sidebar: n, browseSection: r, gridWrapper: i, similarBtn: a, setSemanticEnabled: s, similarEnabledTitle: c, similarDisabledTitle: l, refreshGridFn: u, isSidebarOpen: d, readActiveAssetId: f, getSidebarController: p, panelLifecycleAC: m }) { let h = "", g = () => { try { return !!(mn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } }, _ = (t) => { let n = !!t; try { e.classList.toggle("mjr-ai-disabled", !n); } catch (e) { console.debug?.(e); } try { a.disabled = !n, a.title = n ? c : l; } catch (e) { console.debug?.(e); } try { s?.(n); } catch (e) { console.debug?.(e); } }, v = (e) => { let t = String(e || "right").toLowerCase() === "left" ? "left" : "right", a = t === "left" ? n?.nextElementSibling === i : i?.nextElementSibling === n; if (h === t && a) return; h = t; let o = 0, s = 0; try { o = Number(i?.scrollTop || 0) || 0, s = Number(i?.scrollLeft || 0) || 0; } catch (e) { console.debug?.(e); } try { n.dataset.position = t; let e = n.classList?.contains?.("is-open"), r = "var(--mjr-border, rgba(255,255,255,0.12))"; n.style.borderLeft = t === "left" ? "none" : e ? `1px solid ${r}` : "none", n.style.borderRight = t === "left" && e ? `1px solid ${r}` : "none"; } catch (e) { console.debug?.(e); } try { t === "left" ? (r.appendChild(n), r.appendChild(i), r.insertBefore(n, r.firstChild)) : (r.appendChild(i), r.appendChild(n)); } catch (e) { console.debug?.(e); } try { requestAnimationFrame(() => { try { i.scrollTop = o, i.scrollLeft = s; } catch (e) { console.debug?.(e); } }); } catch { try { i.scrollTop = o, i.scrollLeft = s; } catch (e) { console.debug?.(e); } } }, y = async (e) => { let n = String(e || t.scope || "output").toLowerCase(), r = !!mn()?.watcher?.enabled; if (n === "custom") { try { await S(!1); } catch (e) { console.debug?.(e); } return; } try { await S(r); } catch (e) { console.debug?.(e); } if (r) try { await o({ scope: n, customRootId: "" }); } catch (e) { console.debug?.(e); } }, b = (e) => { let n = String(e?.detail?.key || "").trim(), r = n === "__init__", i = r || n.startsWith("grid.") || n.startsWith("infiniteScroll.") || n.startsWith("siblings.") || n.startsWith("search.") || n.startsWith("rtHydrate.") || n.startsWith("workflowMinimap."), a = r || n.startsWith("sidebar.") || n.startsWith("ai."), o = r || n.startsWith("watcher."); try { let e = mn(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), l = String(e?.ui?.tagColor || "").trim(); if (/^#[0-9a-fA-F]{3,8}$/.test(o) && document.documentElement.style.setProperty("--mjr-card-hover-color", o), /^#[0-9a-fA-F]{3,8}$/.test(s) && document.documentElement.style.setProperty("--mjr-card-selection-color", s), /^#[0-9a-fA-F]{3,8}$/.test(c) && document.documentElement.style.setProperty("--mjr-rating-color", c), /^#[0-9a-fA-F]{3,8}$/.test(l) && document.documentElement.style.setProperty("--mjr-tag-color", l), v(e.sidebar?.position || "right"), _(t), i) { let e = Zn() || null; if (!r && n.startsWith("siblings.")) try { e?.dispatchEvent(new CustomEvent("mjr:reload-grid")); } catch { e && u(e); } else (n.startsWith("grid.") || n.startsWith("workflowMinimap.")) && e && u(e); } a && d() && f() && p()?.refreshActiveAsset?.(); } catch (e) { console.debug?.(e); } try { if (!o) return; y(t.scope); } catch (e) { console.debug?.(e); } }; try { b({ detail: { key: "__init__" } }); } catch (e) { console.debug?.(e); } try { window.addEventListener?.("mjr-settings-changed", b, { signal: m?.signal }); } catch (e) { console.debug?.(e); } return { applyWatcherForScope: y, isAiEnabled: g, applyAiUiState: _, applySidebarPosition: v }; } //#endregion //#region ui/features/panel/panelGridEventBindings.ts function d_({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, notifyContextChanged: r, markUserInteraction: i, writePanelValue: a, popovers: o, collectionsPopover: s, gridController: c, registerSummaryDispose: l }) { let u = null; try { u = () => n(), e.addEventListener("mjr:reload-grid", u, { signal: t?.signal }), l(() => { try { u && e.removeEventListener("mjr:reload-grid", u); } catch (e) { console.debug?.(e); } u = null; }); } catch (e) { console.debug?.(e); } try { let n = (t) => { try { let n = t?.detail || {}, a = String(n?.filenameKey || "").trim().toLowerCase(); if (!a || !e) return; let o = Array.from(e.querySelectorAll(".mjr-asset-card")).filter((e) => String(e?.dataset?.mjrFilenameKey || "").trim().toLowerCase() === a); if (!o.length) return; let s = o.map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean), c = String(o[0]?.dataset?.mjrAssetId || s[0] || "").trim(); s.length && typeof e?._mjrSetSelection == "function" && e._mjrSetSelection(s, c), o[0]?.scrollIntoView?.({ block: "nearest", behavior: "smooth" }), i(), r(); let l = Number(n?.count || s.length || o.length || 0); try { k(R("toast.nameCollisionInView", "Name collision in view: {n} item(s) selected", { n: l }), "info", 1800); } catch (e) { console.debug?.(e); } } catch (e) { console.debug?.(e); } }; e.addEventListener("mjr:badge-duplicates-focus", n, { signal: t?.signal }), l(() => { try { e.removeEventListener("mjr:badge-duplicates-focus", n); } catch (e) { console.debug?.(e); } }); } catch (e) { console.debug?.(e); } try { window.addEventListener("mjr:reload-grid", (e) => { try { if (t?.signal?.aborted) return; } catch (e) { console.debug?.(e); } try { if (globalThis?._mjrMaintenanceActive) return; } catch (e) { console.debug?.(e); } String(e?.detail?.reason || "").trim() && n(); }, { signal: t?.signal }); } catch (e) { console.debug?.(e); } try { window.addEventListener("mjr:sort-changed", () => { try { if (t?.signal?.aborted) return; } catch (e) { console.debug?.(e); } try { r(); } catch (e) { console.debug?.(e); } c.reloadGrid().catch(() => {}); }, { signal: t?.signal }); } catch (e) { console.debug?.(e); } try { window.addEventListener("mjr:collections-changed", (e) => { try { if (t?.signal?.aborted) return; } catch (e) { console.debug?.(e); } let n = e?.detail && typeof e.detail == "object" ? e.detail : {}, i = String(n.collectionId || "").trim(), l = String(n.collectionName || "").trim(); try { a("collectionId", i), a("collectionName", l); } catch (e) { console.debug?.(e); } try { r(); } catch (e) { console.debug?.(e); } try { n.close !== !1 && o.close(s); } catch (e) { console.debug?.(e); } n.reload !== !1 && c.reloadGrid().catch(() => {}); }, { signal: t?.signal }); } catch (e) { console.debug?.(e); } } //#endregion //#region ui/features/panel/panelSimilarSearch.ts var f_ = 500; function p_(e) { return Number(e?.status || 0) === 404 && String(e?.error || "").toLowerCase().includes("non-json"); } function m_(e, t = "") { let n = Array.isArray(e) ? e : []; return n.length <= f_ ? { list: n, title: t, truncated: !1, total: n.length } : { list: n.slice(0, f_), title: `${String(t || "").trim() || "Generation group"} - showing first ${f_}/${n.length}`, truncated: !0, total: n.length }; } function h_(e = {}) { let t = String(e?.stackId || e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.asset?.id || "").trim(); return e?.isDupGroup ? n ? `duplicates:${n}` : "duplicates" : n ? `group:${n}` : "group"; } function g_(e, t) { return String(e?.[t] ?? e?.file_info?.[t] ?? "").trim(); } function __({ similarBtn: e, similarPopover: t, similarFindBtn: n, similarDuplicatesBtn: r, similarSameNodeBtn: i, similarSameWorkflowBtn: a, gridContainer: o, state: s, panelLifecycleAC: c, isAiEnabled: l, similarDisabledTitle: d, readActiveAssetId: f, readSelectedAssetIds: p, readPanelValue: m, writePanelValue: h, scopeController: g, closePopovers: _, closePeerPopovers: v, popovers: y, workflowIdInput: b, reloadGrid: x, getDuplicatesAlert: S }) { let C = () => String(f() || p()[0] || "").trim(), w = () => { let e = Number(C()); return Number.isFinite(e) && e > 0 ? e : 0; }, T = () => { let e = C(); if (!e) return null; try { let t = o?._mjrGetAssets, n = typeof t == "function" ? t() : []; return Array.isArray(n) && n.find((t) => String(t?.id || "") === e) || null; } catch (e) { return console.debug?.(e), null; } }, E = async () => { let e = T(); if (e) return e; let t = w(); return t ? D(t) : null; }, D = async (e = w()) => { if (!e) return null; try { let t = await re(e, { timeoutMs: 3e4 }); return t?.ok && t.data || null; } catch (e) { return console.debug?.(e), null; } }, O = async (e, t) => e && t.some((t) => g_(e, t)) ? e : await D() || e, A = (e = {}) => (Array.isArray(e?.files) ? e.files : []).map((e) => ({ filename: String(e?.filename || "").trim(), subfolder: String(e?.subfolder || "").trim().replace(/\\/g, "/"), type: String(e?.type || "").trim().toLowerCase() })).filter((e) => e.filename), j = async (e, t) => { let n = [], r = /* @__PURE__ */ new Set(); for (let e of t.slice(0, 4)) { let t = e.type === "input" ? "input" : "output"; try { let i = await ae(L({ q: e.filename, scope: t, limit: 50, includeTotal: !1 }), { timeoutMs: 3e4 }); if (!i?.ok) continue; let a = Array.isArray(i?.data?.assets) ? i.data.assets : Array.isArray(i?.data) ? i.data : [], o = e.filename.toLowerCase(), s = (e.subfolder ? `${e.subfolder}/${e.filename}` : e.filename).toLowerCase(); for (let t of a) { let i = String(t?.filename || "").toLowerCase(); if (i !== o) continue; let a = String(t?.filepath || t?.path || "").replace(/\\/g, "/").toLowerCase(); if (e.subfolder && a && !a.endsWith(s)) continue; let c = String(t?.id || a || i); r.has(c) || (r.add(c), n.push(t)); } } catch (e) { console.debug?.(e); } } if (!n.length) { k(R("nodeContext.fileNotIndexed", "The node file is not indexed yet. Run a scan first."), "info", 3200); return; } let i = String(e?.title || e?.sourceNodeType || e?.source_node_type || t[0]?.filename || "").trim(); h("similarResults", n), h("similarSourceAssetId", `node-file:${t[0]?.filename || ""}`), h("similarTitle", R("nodeContext.fileResultsTitle", "Node {node} file ({n} assets)", { node: i || t[0]?.filename || "", n: n.length })), await g?.setScope?.("similar"); }, M = async (e = {}) => { let t = String(e?.sourceNodeId || e?.source_node_id || "").trim(), n = A(e); if (!(!t && !n.length)) { try { _?.(); } catch (e) { console.debug?.(e); } if (!t) { await j(e, n); return; } try { let r = await ae(ut(t, { jobId: e?.jobId || e?.job_id || "", latest: e?.latest !== !1, limit: 500 }), { timeoutMs: 3e4 }); if (!r?.ok) { if (p_(r)) { if (n.length) { await j(e, n); return; } let t = window.MajoorAssetsManager ||= {}; t.nodeContextRouteMissingToastShown || (t.nodeContextRouteMissingToastShown = !0, k(R("nodeContext.routeMissing", "Node context backend route is not loaded yet. Restart ComfyUI after updating Majoor Assets Manager."), "warn", 7e3)); return; } if (n.length) { await j(e, n); return; } k(String(r?.error || R("nodeContext.loadFailed", "Failed to load node assets")), "error", 3e3); return; } let i = Array.isArray(r?.data) ? r.data : []; if (!i.length) { if (n.length) { await j(e, n); return; } k(R("nodeContext.noAssets", "No indexed assets found for this node yet."), "info", 2600); return; } let a = String(e?.title || e?.sourceNodeType || e?.source_node_type || t).trim(); h("similarResults", i), h("similarSourceAssetId", `node:${t}`), h("similarTitle", R("nodeContext.resultsTitle", "Node {node} outputs ({n} assets)", { node: a || t, n: i.length })), await g?.setScope?.("similar"); } catch (e) { console.debug?.(e), k(R("nodeContext.loadFailed", "Failed to load node assets"), "error", 3e3); } } }, N = async () => { if (!l()) { k(d, "info", 2200); return; } try { _(); } catch (e) { console.debug?.(e); } let t = w(); if (!t) { k(R("search.selectAssetForSimilar", "Select an asset first to find similar images/videos."), "info", 2500); return; } let n = e.title; e.disabled = !0, e.title = R("search.findingSimilar", "Finding similar assets..."); try { let e = await u(t, { topK: 100, scope: s.scope || "output", customRootId: s.customRootId || "" }); if (!e?.ok) { k(String(e?.error || R("search.findSimilarFailed", "Failed to find similar assets")), "error", 3e3); return; } let n = Array.isArray(e?.data) ? e.data : []; h("similarResults", n), h("similarSourceAssetId", String(t)), h("similarTitle", R("search.similarResults", "Similar to asset #{id} ({n} results)", { id: t, n: n.length })), await g?.setScope?.("similar"); } catch (e) { console.debug?.(e), k(R("search.findSimilarFailed", "Failed to find similar assets"), "error", 3e3); } finally { e.disabled = !1, e.title = n; } }, P = async () => { try { _?.(); } catch (e) { console.debug?.(e); } let e = await E(), t = String(e?.id || C() || "").trim(), n = Array.isArray(e?._mjrDupMembers) ? e._mjrDupMembers : []; if (n.length >= 2) { h("similarResults", n), h("similarSourceAssetId", t ? `duplicates:${t}` : "duplicates"), h("similarTitle", R("search.duplicateResults", "Duplicates ({n} assets)", { n: n.length })), await g?.setScope?.("similar"); return; } let r = (S?.() || {})?.firstGroup; if (r && Array.isArray(r.assets) && r.assets.length >= 2) { h("similarResults", r.assets), h("similarSourceAssetId", "duplicates"), h("similarTitle", R("search.duplicateResults", "Duplicates ({n} assets)", { n: r.assets.length })), await g?.setScope?.("similar"); return; } k(R("search.noKnownDuplicates", "No duplicate group is available yet. Run duplicate analysis from the duplicate alert first."), "info", 3200); }, F = async () => { let e = await O(await E(), ["source_node_id", "source_node_type"]), t = g_(e, "source_node_id"); if (!t) { k(R("search.noSourceNode", "Selected asset has no persisted source node id."), "info", 2600); return; } await M({ sourceNodeId: t, sourceNodeType: g_(e, "source_node_type"), jobId: g_(e, "job_id"), title: g_(e, "source_node_type") || t }); }, ee = async () => { try { _?.(); } catch (e) { console.debug?.(e); } let e = g_(await O(await E(), ["workflow_id"]), "workflow_id"); if (!e) { k(R("search.noWorkflowId", "Selected asset has no persisted workflow id."), "info", 2600); return; } h("workflowId", e); try { b && (b.value = e); } catch (e) { console.debug?.(e); } try { await g?.setScope?.(s.scope || "output"); } catch (e) { console.debug?.(e); } await x?.(); }; e?.addEventListener("click", (n) => { n.stopPropagation(); try { v?.(); } catch (e) { console.debug?.(e); } y?.toggle?.(t, e); }, { signal: c?.signal }); let te = (e, t) => { e?.addEventListener("click", (e) => { e.stopPropagation(), t(); }, { signal: c?.signal }); }; te(n, N), te(r, P), te(i, F), te(a, ee), o?.addEventListener(B.OPEN_STACK_GROUP, async (e) => { try { let t = e?.detail || {}, n = Array.isArray(t?.members) ? t.members : [], r = `Generation group (${n.length} assets)`, i = m_(n, String(t?.title || "").trim() || r); i.truncated && k(`Large stack truncated to ${f_}/${i.total} assets to keep the grid responsive.`, "warn", 5e3), h("similarResults", i.list), h("similarSourceAssetId", h_(t)), h("similarTitle", i.title || r), await Promise.resolve(), await g?.setScope?.("similar"); } catch (e) { console.debug?.(e); } }, { signal: c?.signal }), window.addEventListener(B.OPEN_NODE_CONTEXT, (e) => { try { let e = window.MajoorAssetsManager; e?.pendingNodeContext && (e.pendingNodeContext = null); } catch (e) { console.debug?.(e); } M(e?.detail || {}); }, { signal: c?.signal }); try { let e = window.MajoorAssetsManager?.pendingNodeContext || null; e && (window.MajoorAssetsManager.pendingNodeContext = null, setTimeout(() => { M(e); }, 0)); } catch (e) { console.debug?.(e); } } //#endregion //#region ui/features/panel/panelPinnedFolders.ts function v_({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFoldersMenu: n = null, pinnedFoldersPopover: r, popovers: i, closeOtherPopovers: a, state: o, gridContainer: s, customSelect: c, scopeController: l, customRootsController: u, gridController: d, applyWatcherForScope: f, refreshDuplicateAlerts: p, notifyContextChanged: m, panelLifecycleAC: h }) { let g = (e) => { let t = String(e?.id || "").trim(); if (!t) return null; let n = String(e?.path || "").trim(); return { id: t, label: String(e?.name || n || t).trim() || t, path: n }; }, _ = async () => { try { let e = await ae(lt.CUSTOM_ROOTS, h?.signal ? { signal: h.signal } : void 0); return e?.ok && Array.isArray(e.data) ? e.data.map(g).filter(Boolean) : []; } catch (e) { return console.debug?.(e), []; } }, v = async (e) => { let t = String(e?.id || "").trim(); if (!t) return; let n = String(e?.label || e?.path || t).trim(); o.scope = "custom"; try { s && (s.dataset.mjrScope = "custom"); } catch (e) { console.debug?.(e); } o.customRootId = t, o.customRootLabel = n, o.currentFolderRelativePath = ""; try { c && (c.value = t); } catch (e) { console.debug?.(e); } try { l?.setActiveTabStyles?.(); } catch (e) { console.debug?.(e); } try { await f(o.scope); } catch (e) { console.debug?.(e); } try { await p(); } catch (e) { console.debug?.(e); } try { m(); } catch (e) { console.debug?.(e); } i.close(r), await d.reloadGrid(); }, y = async (e, t = null) => { t?.preventDefault?.(), t?.stopPropagation?.(); let n = String(e?.id || "").trim(); if (!n) return; let r = String(e?.label || e?.path || n).trim(); if (!await Gt(R("dialog.unpinFolder", "Unpin folder \"{name}\"?", { name: r }))) return; let i = await le(lt.CUSTOM_ROOTS_REMOVE, { id: n }); if (!i?.ok) { k(i?.error || R("toast.unpinFolderFailed", "Failed to unpin folder"), "error"); return; } String(o.customRootId || "") === n && (o.customRootId = "", o.customRootLabel = "", o.currentFolderRelativePath = ""); try { await u.refreshCustomRoots(); } catch (e) { console.debug?.(e); } await S(), await d.reloadGrid(); }, b = (e) => typeof t?.setPinnedFolders == "function" && (t.setPinnedFolders({ roots: e, emptyLabel: R("msg.noPinnedFolders", "No pinned folders"), loadingLabel: R("status.loading", "Loading..."), unpinLabel: R("ctx.unpinFolder", "Unpin folder"), onOpen: v, onUnpin: y, loading: !1 }), !0), x = (e) => { if (n) { try { n.replaceChildren(); } catch (e) { console.debug?.(e); } if (!e.length) { let e = document.createElement("div"); e.className = "mjr-muted", e.style.cssText = "padding:10px 12px; opacity:0.75;", e.textContent = R("msg.noPinnedFolders", "No pinned folders"), n.appendChild(e); return; } for (let t of e) { let e = document.createElement("div"); e.className = "mjr-pinned-folder-row"; let r = document.createElement("button"); r.type = "button", r.className = "mjr-menu-item mjr-pinned-folder-open", r.textContent = t.label, r.addEventListener("click", () => v(t), { signal: h?.signal }); let i = document.createElement("button"); i.type = "button", i.className = "mjr-menu-item mjr-pinned-folder-unpin", i.title = R("ctx.unpinFolder", "Unpin folder"), i.textContent = "x", i.addEventListener("click", (e) => y(t, e), { signal: h?.signal }), e.appendChild(r), e.appendChild(i), n.appendChild(e); } } }; async function S() { try { t?.setPinnedFoldersLoading?.(!0, R("status.loading", "Loading...")); } catch (e) { console.debug?.(e); } let e = await _(); b(e) || x(e); } e?.addEventListener("click", async (t) => { t.stopPropagation(); try { await S(); } catch (e) { console.debug?.(e); } a(), i.toggle(r, e); }, { signal: h?.signal }); } //#endregion //#region ui/features/filters/calendar/AgendaCalendar.ts var y_ = (e) => String(e).padStart(2, "0"); function b_(e) { try { let t = String(e || "").trim(); if (!/^\d{4}-\d{2}-\d{2}$/.test(t)) return null; let [n, r, i] = t.split("-").map((e) => Number(e)); if (!n || !r || !i) return null; let a = new Date(n, r - 1, i); return Number.isNaN(a.getTime()) || a.getFullYear() !== n || a.getMonth() !== r - 1 || a.getDate() !== i ? null : a; } catch { return null; } } function x_(e) { try { let t = e.getFullYear(), n = e.getMonth() + 1, r = e.getDate(); return `${t}-${y_(n)}-${y_(r)}`; } catch { return ""; } } function S_(e) { try { return `${e.getFullYear()}-${y_(e.getMonth() + 1)}`; } catch { return ""; } } function C_(e) { try { return new Date(e.getFullYear(), e.getMonth(), 1); } catch { return /* @__PURE__ */ new Date(); } } function w_(e, t) { try { return new Date(e.getFullYear(), e.getMonth() + t, 1); } catch { return /* @__PURE__ */ new Date(); } } function T_(e) { try { return new Date(e.getFullYear(), e.getMonth() + 1, 0).getDate(); } catch { return 31; } } function E_(e) { try { return (e.getDay() + 6) % 7; } catch { return 0; } } function D_(e, t) { if (e) try { let n = String(e.value || ""); e.value = t || "", n !== e.value && e.dispatchEvent?.(new Event("change", { bubbles: !0 })); } catch (e) { console.debug?.(e); } } async function O_({ state: e, monthKey: t }) { try { let n = String(e?.scope || "output"); if (n === "collection") return { ok: !0, days: {} }; let r = String(e?.currentFolderRelativePath || "").trim(), i = n === "custom" && !e?.customRootId ? null : r || null, a = st({ scope: n, customRootId: e?.customRootId || null, subfolder: i, month: t, kind: e?.kindFilter || null, hasWorkflow: e?.workflowOnly ? !0 : null, minRating: Number(e?.minRating || 0) || 0, minSizeMB: Number(e?.minSizeMB || 0) || 0, maxSizeMB: Number(e?.maxSizeMB || 0) || 0, minWidth: Number(e?.minWidth || 0) || 0, minHeight: Number(e?.minHeight || 0) || 0, maxWidth: Number(e?.maxWidth || 0) || 0, maxHeight: Number(e?.maxHeight || 0) || 0, workflowType: String(e?.workflowType || "").trim().toUpperCase() || null, dateRange: null, dateExact: null }), o = await ae(a); return !o || !o.ok ? { ok: !1, error: o?.error || "Histogram error" } : { ok: !0, days: o?.data?.days && typeof o.data.days == "object" ? o.data.days : {} }; } catch (e) { return { ok: !1, error: e?.message || "Histogram error" }; } } function k_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = null } = {}) { if (!e || !(e instanceof HTMLElement) || !t) return { dispose() {}, refresh() {} }; let i = document.createElement("div"); i.className = "mjr-agenda-calendar"; let a = document.createElement("div"); a.className = "mjr-agenda-header"; let o = document.createElement("button"); o.type = "button", o.className = "mjr-btn mjr-agenda-nav", o.textContent = "<"; let s = document.createElement("div"); s.className = "mjr-agenda-month", s.textContent = ""; let c = document.createElement("button"); c.type = "button", c.className = "mjr-btn mjr-agenda-nav", c.textContent = ">", a.appendChild(o), a.appendChild(s), a.appendChild(c); let l = document.createElement("div"); l.className = "mjr-agenda-grid"; let u = document.createElement("div"); u.className = "mjr-agenda-footer"; let d = document.createElement("button"); d.type = "button", d.className = "mjr-btn mjr-agenda-clear", d.textContent = R("action.clear", "Clear"); let f = document.createElement("button"); f.type = "button", f.className = "mjr-btn mjr-agenda-refresh", f.textContent = R("action.refresh", "Refresh"), u.appendChild(d), u.appendChild(f), i.appendChild(a), i.appendChild(l), i.appendChild(u), e.appendChild(i); let p = C_(b_(t.value) || /* @__PURE__ */ new Date()), m = {}, h = 0, g = !1, _ = () => { if (g) return; let e = p.getFullYear(), n = p.getMonth(); s.textContent = p.toLocaleString(void 0, { month: "long", year: "numeric" }), l.innerHTML = ""; let r = [ R("weekday.monShort", "Mon"), R("weekday.tueShort", "Tue"), R("weekday.wedShort", "Wed"), R("weekday.thuShort", "Thu"), R("weekday.friShort", "Fri"), R("weekday.satShort", "Sat"), R("weekday.sunShort", "Sun") ]; for (let e of r) { let t = document.createElement("div"); t.className = "mjr-agenda-weekday", t.textContent = e, l.appendChild(t); } let i = E_(new Date(e, n, 1)), a = T_(p), o = b_(t.value), c = o ? x_(o) : ""; for (let e = 0; e < i; e++) { let e = document.createElement("div"); e.className = "mjr-agenda-day mjr-agenda-day--blank", l.appendChild(e); } for (let r = 1; r <= a; r++) { let i = x_(new Date(e, n, r)), a = Number(m?.[i] || 0) || 0, o = document.createElement("button"); if (o.type = "button", o.className = "mjr-agenda-day", o.textContent = String(r), o.dataset.date = i, a > 0) { o.classList.add("mjr-agenda-day--has-assets"); let e = R(a === 1 ? "tooltip.assetsDaySingular" : "tooltip.assetsDayPlural", a === 1 ? "{count} asset" : "{count} assets", { count: a }); o.title = e; let t = document.createElement("span"); t.className = "mjr-agenda-day-badge", t.textContent = a > 99 ? "99+" : String(a), t.setAttribute("aria-label", e), o.appendChild(t); } else o.title = R("tooltip.noAssetsDay", "No assets on this day"); i === c && o.classList.add("mjr-agenda-day--selected"), o.addEventListener("click", () => { D_(t, String(t.value || "").trim() === i ? "" : i); }), l.appendChild(o); } }, v = async () => { if (g) return; let e = S_(p); if (!e) return; h += 1; let t = h, r = await O_({ state: n, monthKey: e }); g || t === h && (m = r.ok && r.days || {}, _()); }; return o.addEventListener("click", async () => { p = w_(p, -1), await v(); }), c.addEventListener("click", async () => { p = w_(p, 1), await v(); }), d.addEventListener("click", () => { D_(t, ""); try { r?.(); } catch (e) { console.debug?.(e); } }), f.addEventListener("click", async () => { await v(); }), t.addEventListener("change", () => { let e = b_(t.value); if (e) { let t = C_(e); (t.getFullYear() !== p.getFullYear() || t.getMonth() !== p.getMonth()) && (p = t); } _(); }), _(), v(), { refresh: v, dispose() { g = !0; try { i.remove(); } catch (e) { console.debug?.(e); } } }; } //#endregion //#region ui/features/panel/controllers/filtersController.ts var A_ = (e) => { let t = String(e ?? "").trim(); if (!t) return 0; let n = t.replace(",", "."), r = Number(n); return Number.isFinite(r) ? r : 0; }; function j_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, workflowIdInput: i, workflowModelInput: a, workflowRunsOnSelect: o, ratingSelect: s, minSizeInput: c, maxSizeInput: l, resolutionPresetSelect: u, minWidthInput: d, minHeightInput: f, maxWidthInput: p, maxHeightInput: m, dateRangeSelect: h, dateExactInput: g, reloadGrid: _, reconcileSelection: v = null, onFiltersChanged: y = null, lifecycleSignal: b = null }) { let { write: x } = kh(e, [ "kindFilter", "workflowOnly", "minRating", "workflowType", "workflowId", "workflowModelFilter", "workflowRunsOnFilter", "minSizeMB", "maxSizeMB", "minWidth", "minHeight", "maxWidth", "maxHeight", "dateRangeFilter", "dateExactFilter" ]), S = null, C = () => { S && clearTimeout(S), S = setTimeout(() => { S = null; try { v?.(); } catch (e) { console.debug?.(e); } _().catch(() => {}); }, 250); }, w = []; w.push(() => { S &&= (clearTimeout(S), null); }); let T = (e, t, n, r) => { if (!(!e?.addEventListener || typeof n != "function")) { try { e.addEventListener(t, n, r); } catch { try { e.addEventListener(t, n); } catch { return; } } w.push(() => { try { e.removeEventListener(t, n, r); } catch { try { e.removeEventListener(t, n); } catch (e) { console.debug?.(e); } } }); } }; T(t, "change", () => { x("kindFilter", t.value || ""); try { y?.(); } catch (e) { console.debug?.(e); } C(); }, b ? { signal: b } : void 0), T(n, "change", () => { x("workflowOnly", !!n.checked); try { y?.(); } catch (e) { console.debug?.(e); } C(); }, b ? { signal: b } : void 0), T(s, "change", () => { x("minRating", Number(s.value || 0) || 0); try { y?.(); } catch (e) { console.debug?.(e); } C(); }, b ? { signal: b } : void 0), r && T(r, "change", () => { x("workflowType", String(r.value || "").trim().toUpperCase()); try { y?.(); } catch (e) { console.debug?.(e); } C(); }, b ? { signal: b } : void 0), i && T(i, "change", () => { x("workflowId", String(i.value || "").trim()); try { y?.(); } catch (e) { console.debug?.(e); } C(); }, b ? { signal: b } : void 0), a && T(a, "change", () => { x("workflowModelFilter", String(a.value || "").trim()); try { y?.(); } catch (e) { console.debug?.(e); } C(); }, b ? { signal: b } : void 0), o && T(o, "change", () => { x("workflowRunsOnFilter", String(o.value || "").trim().toLowerCase()); try { y?.(); } catch (e) { console.debug?.(e); } C(); }, b ? { signal: b } : void 0); let E = () => { let e = A_(c?.value || 0), t = A_(l?.value || 0), n = Number.isFinite(e) && e > 0 ? e : 0, r = Number.isFinite(t) && t > 0 ? t : 0; r > 0 && n > 0 && r < n && (r = n, l && (l.value = String(r))), x("minSizeMB", n), x("maxSizeMB", r); try { y?.(); } catch (e) { console.debug?.(e); } C(); }; T(c, "change", E, b ? { signal: b } : void 0), T(l, "change", E, b ? { signal: b } : void 0); let D = () => { let e = A_(d?.value || 0), t = A_(f?.value || 0), n = A_(p?.value || 0), r = A_(m?.value || 0), i = Number.isFinite(e) && e > 0 ? Math.round(e) : 0, a = Number.isFinite(t) && t > 0 ? Math.round(t) : 0, o = Number.isFinite(n) && n > 0 ? Math.round(n) : 0, s = Number.isFinite(r) && r > 0 ? Math.round(r) : 0; o > 0 && i > 0 && o < i && (o = i, p && (p.value = String(o))), s > 0 && a > 0 && s < a && (s = a, m && (m.value = String(s))), x("minWidth", i), x("minHeight", a), x("maxWidth", o), x("maxHeight", s); try { u && (u.value = { "1280x720": "hd", "1920x1080": "fhd", "2560x1440": "qhd", "3840x2160": "uhd" }[`${i}x${a}`] || ""); } catch (e) { console.debug?.(e); } try { y?.(); } catch (e) { console.debug?.(e); } C(); }; if (T(d, "change", D, b ? { signal: b } : void 0), T(f, "change", D, b ? { signal: b } : void 0), T(p, "change", D, b ? { signal: b } : void 0), T(m, "change", D, b ? { signal: b } : void 0), u && T(u, "change", () => { let e = { hd: [1280, 720], fhd: [1920, 1080], qhd: [2560, 1440], uhd: [3840, 2160] }[String(u.value || "")] || [0, 0], t = Number(e[0] || 0), n = Number(e[1] || 0); x("minWidth", t), x("minHeight", n), x("maxWidth", 0), x("maxHeight", 0), d && (d.value = t > 0 ? String(t) : ""), f && (f.value = n > 0 ? String(n) : ""), p && (p.value = ""), m && (m.value = ""); try { y?.(); } catch (e) { console.debug?.(e); } C(); }, b ? { signal: b } : void 0), h && T(h, "change", () => { x("dateRangeFilter", h.value || ""), e.dateRangeFilter && e.dateExactFilter && (x("dateExactFilter", ""), g && (g.value = "")); try { y?.(); } catch (e) { console.debug?.(e); } C(); }, b ? { signal: b } : void 0), g) { let t = (e) => { g.classList.toggle("mjr-agenda-filled", e === "filled"), g.classList.toggle("mjr-agenda-empty", e === "empty"); }; T(g, "change", () => { x("dateExactFilter", g.value ? String(g.value) : ""), e.dateExactFilter && e.dateRangeFilter && (x("dateRangeFilter", ""), h && (h.value = "")), e.dateExactFilter || t(""); try { y?.(); } catch (e) { console.debug?.(e); } C(); }, b ? { signal: b } : void 0); let n = (e) => { if (!e?.detail) return; let { date: n, hasResults: r } = e.detail; if (!g.value) { t(""); return; } n === g.value && t(r ? "filled" : "empty"); }; try { let e = b ? { passive: !0, signal: b } : { passive: !0 }, t = typeof window < "u" ? window : null; t?.addEventListener?.("MJR:AgendaStatus", n, e), w.push(() => { try { t?.removeEventListener?.("MJR:AgendaStatus", n, e); } catch (e) { console.debug?.(e); } }); } catch (e) { console.debug?.(e); } } return () => { for (let e of w.splice(0)) try { e(); } catch (e) { console.debug?.(e); } }; } //#endregion //#region ui/features/panel/panelFiltersInit.ts function M_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, workflowIdInput: a, workflowModelInput: o, workflowRunsOnSelect: s, ratingSelect: c, minSizeInput: l, maxSizeInput: u, resolutionPresetSelect: d, minWidthInput: f, minHeightInput: p, maxWidthInput: m, maxHeightInput: h, dateRangeSelect: g, dateExactInput: _, agendaContainer: v, gridController: y, reconcileVisibleSelection: b, exitSimilarViewIfActive: x, notifyContextChanged: S, panelLifecycleAC: C, popovers: w = null, filterPopover: T = null }) { let E = null; try { try { n.value = e.kindFilter || "", r.checked = !!e.workflowOnly, i.value = String(e.workflowType || "").trim().toUpperCase(), a && (a.value = String(e.workflowId || "").trim()), o && (o.value = String(e.workflowModelFilter || "").trim()), s && (s.value = String(e.workflowRunsOnFilter || "").trim().toLowerCase()), c.value = String(Number(e.minRating || 0) || 0), l.value = Number(e.minSizeMB || 0) > 0 ? String(e.minSizeMB) : "", u.value = Number(e.maxSizeMB || 0) > 0 ? String(e.maxSizeMB) : "", f.value = Number(e.minWidth || 0) > 0 ? String(e.minWidth) : "", p.value = Number(e.minHeight || 0) > 0 ? String(e.minHeight) : "", m.value = Number(e.maxWidth || 0) > 0 ? String(e.maxWidth) : "", h.value = Number(e.maxHeight || 0) > 0 ? String(e.maxHeight) : ""; let t = Number(e.minWidth || 0) || 0, v = Number(e.minHeight || 0) || 0; d.value = t >= 3840 && v >= 2160 ? "uhd" : t >= 2560 && v >= 1440 ? "qhd" : t >= 1920 && v >= 1080 ? "fhd" : t >= 1280 && v >= 720 ? "hd" : "", g.value = e.dateRangeFilter || "", _.value = e.dateExactFilter || ""; } catch (e) { console.debug?.(e); } E = k_({ container: v, hiddenInput: _, state: e, onRequestReloadGrid: () => y.reloadGrid() }); } catch (e) { console.debug?.(e); } let D = () => {}; if (t) { let e = null, t = () => { try { if (C?.signal?.aborted) return; } catch (e) { console.debug?.(e); } x({ reload: !1 }); try { E?.refresh?.(); } catch (e) { console.debug?.(e); } S(), e && clearTimeout(e), e = setTimeout(() => { e = null; try { b(); } catch (e) { console.debug?.(e); } y.reloadGrid().catch(() => {}); }, 250); }; try { window.addEventListener("mjr:filters-changed", t, { signal: C?.signal }); } catch (e) { console.debug?.(e); } D = () => { e &&= (clearTimeout(e), null); }; } else D = j_({ state: e, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, workflowIdInput: a, workflowModelInput: o, workflowRunsOnSelect: s, ratingSelect: c, minSizeInput: l, maxSizeInput: u, resolutionPresetSelect: d, minWidthInput: f, minHeightInput: p, maxWidthInput: m, maxHeightInput: h, dateRangeSelect: g, dateExactInput: _, reloadGrid: y.reloadGrid, reconcileSelection: b, lifecycleSignal: C?.signal || null, onFiltersChanged: () => { x({ reload: !1 }); try { E?.refresh?.(); } catch (e) { console.debug?.(e); } S(); } }); return { agendaCalendar: E, disposeFilters: D }; } //#endregion //#region ui/features/panel/panelContextMenuExtraActions.ts function N_({ state: e, scopeController: t, browserNav: n, gridController: r, getDuplicatesAlert: i, refreshDuplicateAlerts: a }) { return { clearSimilarScope: async () => { try { await t?.clearSimilarScope?.(); } catch (e) { console.debug?.(e); } }, clearTransientContext: async () => { try { e.viewScope = "", e.similarResults = [], e.similarTitle = "", e.similarSourceAssetId = ""; } catch (e) { console.debug?.(e); } }, resetBrowserHistory: () => { try { n?.resetHistory?.(); } catch (e) { console.debug?.(e); } }, onDuplicateAlertClick: async (e) => { let t = (e || i() || {}).firstGroup; if (t && Array.isArray(t.assets) && t.assets.length >= 2) { let e = t.assets[0] || {}, n = t.assets.slice(1).map((e) => Number(e?.id || 0)).filter((e) => e > 0); if (n.length) { if (await Gt(R("dialog.mergeDuplicateTags", "Exact duplicates detected ({count}). Merge tags into \"{target}\"?", { count: t.assets.length, target: e?.filename || e?.id }))) { let t = await me(Number(e?.id || 0), n); t?.ok ? k(R("toast.tagsMerged", "Tags merged"), "success", 2200) : k(R("toast.tagMergeFailed", "Tag merge failed: {error}", { error: t?.error || "error" }), "warning", 3500); } if (await Gt(R("dialog.deleteExactDuplicates", "Delete {count} exact duplicate(s)?", { count: n.length }))) { let e = await T(n); e?.ok ? (k(R("toast.duplicatesDeleted", "Duplicates deleted"), "success", 2200), await r.reloadGrid()) : k(R("toast.deleteFailed", "Delete failed: {error}", { error: e?.error || "error" }), "warning", 3500); } await a(); return; } } if (!await Gt(R("dialog.startDuplicateAnalysis", "Start duplicate analysis in background?"))) return; let n = await g(500); n?.ok ? k(R("toast.dupAnalysisStarted", "Duplicate analysis started"), "info", 2200) : k(R("toast.analysisNotStarted", "Analysis not started: {error}", { error: n?.error || "error" }), "warning", 3500), await a(); } }; } //#endregion //#region ui/features/panel/panelRuntime.ts async function P_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { return F_(e, { useComfyThemeUI: t, external: n }); } async function F_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { nm("panelRender"), am("panelRender"); let r = typeof AbortController < "u" ? new AbortController() : null, { popovers: i, hostWrapper: a, hostWrapperPrevStyle: o } = l_(e, { useComfyThemeUI: t }), s = Oh(); if (!s) throw Error("[Majoor] mountAssetsManagerPanelRuntime requires an active Pinia panel store"); for (let e of [ "statusSection", "statusDot", "statusText", "capabilitiesSection", "headerSection", "summaryBar", "updateSummaryBar", "folderBreadcrumb", "browseSection", "gridWrapper", "gridContainer", "sidebar" ]) if (!n?.[e]) throw Error(`[Majoor] mountAssetsManagerPanelRuntime now requires external.${e}`); let c = kh(null, [ "searchQuery", "scrollTop", "scope", "customRootId", "customRootLabel", "currentFolderRelativePath", "sort", "lastGridCount", "lastGridTotal", "activeAssetId", "selectedAssetIds", "sidebarOpen", "collectionId", "collectionName", "viewScope", "similarResults", "similarTitle", "similarSourceAssetId" ]); s.viewScope = String(s.viewScope || "").trim().toLowerCase() === "similar" ? "similar" : "", s.similarResults = Array.isArray(s.similarResults) ? s.similarResults : [], s.similarTitle = String(s.similarTitle || ""), s.similarSourceAssetId = String(s.similarSourceAssetId || ""); let l = (e, t = "") => c.read(e, s?.[e] ?? t), u = (e, t) => c.write(e, t), d = () => { let e = l("selectedAssetIds", []); return Array.isArray(e) ? e.map(String).filter(Boolean) : []; }, p = () => String(l("activeAssetId", "") || "").trim(), m = () => !!l("sidebarOpen", !1), { header: h, tabButtons: g, customMenuBtn: _, filterBtn: v, sortBtn: y, collectionsBtn: b, pinnedFoldersBtn: x, messageBtn: S, settingsBtn: C, customPopover: w, customSelect: T, customAddBtn: E, customRemoveBtn: D, filterPopover: O, kindSelect: A, wfCheckbox: j, workflowTypeSelect: M, workflowIdInput: N, workflowModelInput: F, workflowRunsOnSelect: ee, ratingSelect: te, minSizeInput: I, maxSizeInput: ne, resolutionPresetSelect: re, minWidthInput: ie, minHeightInput: oe, maxWidthInput: se, maxHeightInput: ce, dateRangeSelect: ue, dateExactInput: de, agendaContainer: fe, sortPopover: pe, sortMenu: me, collectionsPopover: he, pinnedFoldersPopover: _e, pinnedFoldersController: ve, pinnedFoldersMenu: be, messagePopoverTitle: xe, messagePopover: Se, messageTabBtn: Ce, messageTabBadge: we, historyTabBtn: Te, historyTabBadge: Ee, historyTabCount: De, historyPanel: Oe, shortcutsTabBtn: ke, messageList: Ae, shortcutsPanel: je, markReadBtn: Me, searchSection: Ne, searchInputEl: Pe, similarBtn: Fe, similarPopover: Ie, similarFindBtn: Le, similarDuplicatesBtn: Re, similarSameNodeBtn: ze, similarSameWorkflowBtn: Be, setSemanticEnabled: Ve, _headerDispose: He } = n.headerSection, Ue = !!n?.headerSection?.isVueHeader; c.read("searchQuery", "") && (Pe.value = c.read("searchQuery", "")), Pe.addEventListener("input", (e) => { c.write("searchQuery", e.target.value); }, { signal: r?.signal }); let We = n.summaryBar, Ge = n.updateSummaryBar, Ke = n.folderBreadcrumb, qe = n.folderBreadcrumbController || null, Je = n.statusSection, Ye = n.statusDot, Xe = n.statusText, Ze = n.capabilitiesSection, Qe = n.browseSection, $e = n.gridWrapper, et = n.sidebar; mn(); let tt = document.createElement("div"); tt.classList.add("mjr-am-content"); let L = null, nt = null; e.tabIndex = -1; let z = null, rt = 0, it = () => { try { rt = Date.now(); } catch { rt = 0; } }, at = typeof n?.bindGridHostState == "function" && typeof n?.restoreGridUiState == "function", ot = !at; $e.addEventListener("scroll", () => { it(), ot && (z && clearTimeout(z), z = setTimeout(() => { try { c.write("scrollTop", $e.scrollTop); } catch (e) { console.debug?.(e); } }, 100)); }, { passive: !0, signal: r?.signal }), L = n.gridContainer, L.parentElement !== $e && $e.appendChild(L), er(L); try { L.dataset.mjrScope = String(l("scope", s.scope || "output") || "output"); } catch (e) { console.debug?.(e); } let st = [], ct = (e) => { typeof e == "function" && st.push(e); }; L._mjrSummaryBarDispose = () => { for (let e of st.splice(0)) try { e(); } catch (e) { console.debug?.(e); } }; try { let e = () => { try { Ge?.({ state: s, gridContainer: L }); } catch (e) { console.debug?.(e); } }; L.addEventListener("mjr:grid-stats", e, { signal: r?.signal }), ct(() => { try { L.removeEventListener("mjr:grid-stats", e); } catch (e) { console.debug?.(e); } }); } catch (e) { console.debug?.(e); } let ut = n.loadAssets ?? Pi, dt = n.loadAssetsFromList ?? Fi, ft = n.prepareGridForScopeSwitch ?? Ii, pt = n.disposeGrid ?? Li, mt = n.refreshGrid ?? Ri, ht = n.captureAnchor ?? zi, gt = n.restoreAnchor ?? Bi, vt = n.hydrateGridFromSnapshot ?? Ni; if (typeof n?.onGridContainerReady == "function") try { n.onGridContainerReady(L, { getState: () => s }); } catch (e) { console.debug?.(e); } else e._mjrGridContextMenuUnbind = to({ gridContainer: L, getState: () => s }); let yt = R("search.findSimilar", "Find Similar"), bt = R("search.similarDisabled", "AI features are disabled in settings"), { applyWatcherForScope: xt, isAiEnabled: St } = u_({ container: e, state: s, sidebar: et, browseSection: Qe, gridWrapper: $e, similarBtn: Fe, setSemanticEnabled: Ve, similarEnabledTitle: yt, similarDisabledTitle: bt, refreshGridFn: mt, isSidebarOpen: m, readActiveAssetId: p, getSidebarController: () => nt, panelLifecycleAC: r }); tt.appendChild(Je), tt.appendChild(Ne), tt.appendChild(Ke), tt.appendChild(We), tt.appendChild(Qe), e.appendChild(h); try { e._mjrVersionUpdateCleanup?.(); } catch (e) { console.debug?.(e); } e._mjrVersionUpdateCleanup = He || h._mjrVersionUpdateCleanup, e.appendChild(tt); let Ct = () => Ag(Pe), wt = jg({ gridContainer: L, loadAssets: ut, loadAssetsFromList: dt, getCollectionAssets: ye, disposeGrid: pt, getQuery: Ct, searchInputEl: Pe, state: s }), Tt = null, Dt = null, Ot = null, kt = null, At = null, jt = null, Mt = null, Nt = null, Pt = null, Ft = !1, It = (e) => !!e && String(e?.style?.display || "").toLowerCase() === "block", Lt = () => { let e = [ [v, O], [y, pe], [b, he], [x, _e], [S, Se], [Fe, Ie] ]; for (let [t, n] of e) try { t?.classList?.toggle?.("mjr-popover-open", It(n)), t?.setAttribute?.("aria-expanded", It(n) ? "true" : "false"); } catch (e) { console.debug?.(e); } try { C?.classList?.toggle?.("mjr-popover-open", Ft), C?.setAttribute?.("aria-expanded", Ft ? "true" : "false"); } catch (e) { console.debug?.(e); } }, Rt = () => { try { Dt?.update?.(); } catch (e) { console.debug?.(e); } try { jt?.renderBreadcrumb?.(); } catch (e) { console.debug?.(e); } Lt(); }; at || (Nt = a_({ gridContainer: L, readSelectedAssetIds: d, readActiveAssetId: () => p(), writeSelectedAssetIds: (e) => u("selectedAssetIds", e), writeActiveAssetId: (e) => u("activeAssetId", e), onSelectionChanged: () => { it(), Rt(); }, lifecycleSignal: r?.signal || null })), jt = Mg({ state: s, gridContainer: L, folderBreadcrumb: Ke, folderBreadcrumbController: qe, customSelect: T, reloadGrid: () => wt.reloadGrid(), clearSelection: () => { try { L?._mjrSetSelection?.([], ""); } catch (e) { console.debug?.(e); } }, onContextChanged: () => { try { Dt?.update?.(); } catch (e) { console.debug?.(e); } }, lifecycleSignal: r?.signal || null }); try { Mt = jt.bindGridFolderNavigation(); } catch (e) { console.debug?.(e); } let zt = async () => { let e = String(l("scope", s.scope || "output") || "output").toLowerCase(), t = String(l("customRootId", s.customRootId || "") || "").trim(); if (e === "custom" && !t) { Ot = null, Rt(); return; } try { let n = await f({ scope: e, customRootId: t, maxGroups: 4, maxPairs: 4 }, { signal: r?.signal }); if (!n?.ok) return; let i = n.data || {}; Ot = { exactCount: Array.isArray(i.exact_groups) ? i.exact_groups.length : 0, similarCount: Array.isArray(i.similar_pairs) ? i.similar_pairs.length : 0, firstGroup: Array.isArray(i.exact_groups) ? i.exact_groups[0] : null, firstPair: Array.isArray(i.similar_pairs) ? i.similar_pairs[0] : null }, Rt(); } catch (e) { console.debug?.(e); } }, Bt = null; d_({ gridContainer: L, panelLifecycleAC: r, requestQueuedReload: () => { try { Bt && clearTimeout(Bt); } catch (e) { console.debug?.(e); } Bt = setTimeout(() => { Bt = null, tn().catch((e) => { try { console.warn("[Majoor] queuedReload failed", e); } catch (e) { console.debug?.(e); } }); }, 120); }, notifyContextChanged: Rt, markUserInteraction: it, writePanelValue: u, popovers: i, collectionsPopover: he, gridController: wt, registerSummaryDispose: ct }); let Vt = Lg({ state: s, customSelect: T, customRemoveBtn: D, comfyConfirm: Gt, comfyPrompt: Et, comfyToast: k, get: ae, post: le, ENDPOINTS: lt, reloadGrid: wt.reloadGrid, onRootChanged: async () => { try { jt?.resetHistory?.(); } catch (e) { console.debug?.(e); } try { await xt(s.scope); } catch (e) { console.debug?.(e); } try { await zt(); } catch (e) { console.debug?.(e); } } }), Ht = Vt.bind({ customAddBtn: E, customRemoveBtn: D }); try { window.addEventListener("mjr:custom-roots-changed", async (e) => { let t = String(e?.detail?.preferredId || "").trim() || null; await Vt.refreshCustomRoots(t); }, { signal: r?.signal }); } catch (e) { console.debug?.(e); } let Wt = () => { try { let e = L?._mjrGetAssets, t = L?._mjrSetSelection; if (typeof e != "function" || typeof t != "function") return; let n = (Array.isArray(e()) ? e() : []).map((e) => String(e?.id ?? "").trim()).filter(Boolean), r = d(), i = r.filter((e) => n.includes(e)), a = r.length - i.length; if (a <= 0) return; let o = p(); t(i, i.includes(o) ? o : i[0] || ""), k(R("toast.selectionPruned", "{count} items deselected - not visible in current view", { count: a }), "info", 2600, { noHistory: !0 }); } catch (e) { console.debug?.(e); } }; Tt = Ng({ state: s, tabButtons: g, customMenuBtn: _, customPopover: w, popovers: i, refreshCustomRoots: Vt.refreshCustomRoots, reloadGrid: wt.reloadGrid, reconcileSelection: Wt, onChanged: () => { try { L && (L.dataset.mjrScope = String(l("scope", s.scope || "output") || "output")); } catch (e) { console.debug?.(e); } Rt(); }, onScopeChanged: async () => { try { await xt(String(l("scope", s.scope || "output") || "output")); } catch (e) { console.debug?.(e); } try { await zt(); } catch (e) { console.debug?.(e); } }, onBeforeReload: async () => { try { L.dataset.mjrScope = l("scope", "output"), L.dataset.mjrCustomRootId = l("customRootId", "") || "", L.dataset.mjrSubfolder = l("currentFolderRelativePath", "") || "", L.dataset.mjrCollectionId = l("collectionId", "") || "", L.dataset.mjrViewScope = l("viewScope", "") || ""; } catch (e) { console.debug?.(e); } try { ft(L); } catch (e) { console.debug?.(e); } try { await Gm(Ye, Xe, Ze, { scope: l("scope", s.scope || "output"), customRootId: l("customRootId", s.customRootId || "") }, null, { signal: r?.signal || null }); } catch (e) { console.debug?.(e); } } }); let Kt = async ({ reload: e = !1 } = {}) => { try { if (String(l("viewScope", s.viewScope || "") || "").trim().toLowerCase() !== "similar") return; await Tt?.clearSimilarScope?.({ reload: e }); } catch (e) { console.debug?.(e); } }; Object.values(g).forEach((e) => { e.addEventListener("click", () => Tt.setScope(e.dataset.scope), { signal: r?.signal }); }), Dg({ messageBtn: S, messagePopover: Se, title: xe, messageList: Ae, historyTabBtn: Te, historyTabBadge: Ee, historyTabCount: De, historyPanel: Oe, shortcutsPanel: je, messageTabBtn: Ce, messageTabBadge: we, shortcutsTabBtn: ke, markReadBtn: Me, popovers: i, signal: r?.signal, onBeforeToggle: () => { i.close(w), i.close(O), i.close(pe), i.close(he), i.close(_e); } }), i.setDismissWhitelist([ w, O, pe, he, _e, Se, Ie, _, v, y, b, x, S, Fe ]), i.setOnVisibilityChanged?.(() => Lt()); try { window.addEventListener(Kn, (e) => { Ft = !!e?.detail?.open, Lt(); }, { signal: r?.signal }); } catch (e) { console.debug?.(e); } Lt(), _.addEventListener("click", (e) => { e.stopPropagation(), i.close(O), i.close(pe), i.close(he), i.close(Se), i.close(Ie), i.toggle(w, _); }, { signal: r?.signal }), v.addEventListener("click", (e) => { e.stopPropagation(), i.close(w), i.close(pe), i.close(he), i.close(Se), i.close(Ie), i.toggle(O, v); }, { signal: r?.signal }), b.addEventListener("click", (e) => { e.stopPropagation(), i.close(w), i.close(O), i.close(pe), i.close(Se), i.close(Ie), i.toggle(he, b); }, { signal: r?.signal }); let qt = Ue ? null : Rg({ state: s, sortBtn: y, sortMenu: me, sortPopover: pe, popovers: i, reloadGrid: wt.reloadGrid, onChanged: () => Rt() }); qt ? qt.bind({ onBeforeToggle: () => { i.close(w), i.close(O), i.close(he), i.close(Se), i.close(Ie); } }) : y.addEventListener("click", (e) => { e.stopPropagation(), i.close(w), i.close(O), i.close(he), i.close(Se), i.close(Ie), i.toggle(pe, y); }, { signal: r?.signal }), __({ similarBtn: Fe, similarPopover: Ie, similarFindBtn: Le, similarDuplicatesBtn: Re, similarSameNodeBtn: ze, similarSameWorkflowBtn: Be, gridContainer: L, state: s, panelLifecycleAC: r, isAiEnabled: St, similarDisabledTitle: bt, readActiveAssetId: p, readSelectedAssetIds: d, readPanelValue: l, writePanelValue: u, scopeController: Tt, closePopovers: () => { i.close(w), i.close(O), i.close(pe), i.close(he), i.close(Se), i.close(Ie); }, closePeerPopovers: () => { i.close(w), i.close(O), i.close(pe), i.close(he), i.close(Se), i.close(_e); }, popovers: i, workflowIdInput: N, reloadGrid: () => wt.reloadGrid(), getDuplicatesAlert: () => Ot }), v_({ pinnedFoldersBtn: x, pinnedFoldersController: ve, pinnedFoldersMenu: be, pinnedFoldersPopover: _e, popovers: i, closeOtherPopovers: () => { i.close(w), i.close(O), i.close(pe), i.close(he), i.close(Se), i.close(Ie); }, state: s, gridContainer: L, customSelect: T, scopeController: Tt, customRootsController: Vt, gridController: wt, applyWatcherForScope: xt, refreshDuplicateAlerts: zt, notifyContextChanged: Rt, panelLifecycleAC: r }); let { agendaCalendar: Jt, disposeFilters: Yt } = M_({ state: s, hasVueHeaderSection: Ue, kindSelect: A, wfCheckbox: j, workflowTypeSelect: M, workflowIdInput: N, workflowModelInput: F, workflowRunsOnSelect: ee, ratingSelect: te, minSizeInput: I, maxSizeInput: ne, resolutionPresetSelect: re, minWidthInput: ie, minHeightInput: oe, maxWidthInput: se, maxHeightInput: ce, dateRangeSelect: ue, dateExactInput: de, agendaContainer: fe, gridController: wt, reconcileVisibleSelection: Wt, exitSimilarViewIfActive: Kt, notifyContextChanged: Rt, panelLifecycleAC: r, popovers: i, filterPopover: O }), Xt = N_({ state: s, scopeController: Tt, browserNav: jt, gridController: wt, getDuplicatesAlert: () => Ot, refreshDuplicateAlerts: zt }); try { Dt = Ig({ state: s, gridContainer: L, filterBtn: v, sortBtn: y, collectionsBtn: b, searchInputEl: Pe, kindSelect: A, wfCheckbox: j, workflowTypeSelect: M, workflowIdInput: N, workflowModelInput: F, workflowRunsOnSelect: ee, ratingSelect: te, minSizeInput: I, maxSizeInput: ne, minWidthInput: ie, minHeightInput: oe, maxWidthInput: se, maxHeightInput: ce, resolutionPresetSelect: re, dateRangeSelect: ue, dateExactInput: de, scopeController: Tt, sortController: qt, updateSummaryBar: Ge, reloadGrid: () => wt.reloadGrid(), getExtraContext: () => ({ duplicatesAlert: Ot }), extraActions: Xt }); } catch (e) { console.debug?.(e); } try { if (Rt(), at) ct(n.bindGridHostState({ onContextChanged: Rt, markUserInteraction: it })); else { let e = () => Rt(); L.addEventListener("mjr:grid-stats", e, { signal: r?.signal }), window.addEventListener?.("mjr-settings-changed", e, { signal: r?.signal }); let t = null, n = null, i = () => { n && clearTimeout(n), n = setTimeout(() => { n = null, t && cancelAnimationFrame(t), t = requestAnimationFrame(() => { t = null, Rt(); }); }, 250); }, a = new MutationObserver(() => i()); a.observe(L, { childList: !0 }), L._mjrSummaryBarObserver = a, ct(() => { try { L.removeEventListener("mjr:grid-stats", e); } catch (e) { console.debug?.(e); } try { window.removeEventListener?.("mjr-settings-changed", e); } catch (e) { console.debug?.(e); } try { n && clearTimeout(n); } catch (e) { console.debug?.(e); } try { a.disconnect(); } catch (e) { console.debug?.(e); } }); } } catch (e) { console.debug?.(e); } nt = n_({ gridContainer: L, sidebar: et, createRatingBadge: _t, createTagsBadge: Ut, showAssetInSidebar: hh, closeSidebar: gh, state: s }); let Zt = { gridController: wt, captureAnchor: ht, restoreAnchor: gt, restoreGridUiState: at ? (e) => n.restoreGridUiState(e, { onRestoreSidebar: () => { try { nt?.toggleDetails?.(); } catch (e) { console.debug?.(e); } } }) : null, readScrollTop: () => c.read("scrollTop", s.scrollTop || 0), restoreSelectionState: ({ scrollTop: e } = {}) => { Nt?.restoreSelectionState?.({ scrollTop: e }); }, readActiveAssetId: p, isSidebarOpen: m, toggleSidebarDetails: () => { nt?.toggleDetails?.(); }, getQuery: Ct, getScope: () => c.read("scope", s.scope), loadAssets: ut, lifecycleSignal: r?.signal || null }; Pt = typeof n?.initAssetsQueryController == "function" ? n.initAssetsQueryController(Zt) : c_({ gridContainer: L, gridWrapper: $e, ...Zt }); let Qt = r_({ onTriggerScan: (e) => { Lm(Ye, Xe, Ze, e || {}); }, onToggleDetails: () => { nt?.toggleDetails?.(); }, onToggleFloatingViewer: () => { try { window.dispatchEvent(new Event(B.MFV_TOGGLE)); } catch (e) { console.debug?.(e); } }, onFocusSearch: () => { try { Pe?.focus?.(); let e = Pe?.value?.length || 0; Pe?.setSelectionRange?.(e, e); } catch (e) { console.debug?.(e); } }, onClearSearch: () => { try { if (!Pe) return; u("searchQuery", ""), Pe.value = "", Pe.dispatchEvent?.(new Event("input", { bubbles: !0 })); } catch (e) { console.debug?.(e); } }, getScanContext: () => ({ scope: c.read("scope", s.scope), customRootId: c.read("customRootId", s.customRootId) }) }), $t = co({ gridContainer: L, createRatingBadge: _t }), en = null; if (e._eventCleanup) try { e._eventCleanup(); } catch (e) { console.debug?.(e); } Qt.bind(tt), $t.bind(), P("grid"); try { e._mjrHotkeys = Qt, e._mjrRatingHotkeys = $t, e._mjrSidebarController = nt; } catch (e) { console.debug?.(e); } e._eventCleanup = () => { try { r?.abort?.(); } catch (e) { console.debug?.(e); } try { Je?._mjrStatusPollDispose?.(); } catch (e) { console.debug?.(e); } try { e._mjrVersionUpdateCleanup?.(); } catch (e) { console.debug?.(e); } e._mjrVersionUpdateCleanup = null; try { z && clearTimeout(z), z = null; } catch (e) { console.debug?.(e); } try { Qt.dispose(); } catch (e) { console.debug?.(e); } try { $t.dispose(); } catch (e) { console.debug?.(e); } ge().scope === "grid" && P(null); try { Jt?.dispose?.(); } catch (e) { console.debug?.(e); } try { Yt?.(); } catch (e) { console.debug?.(e); } try { en?.(); } catch (e) { console.debug?.(e); } en = null; try { et?.dispose?.(); } catch (e) { console.debug?.(e); } try { nt?.dispose?.(); } catch (e) { console.debug?.(e); } try { kt && clearInterval(kt), kt = null; } catch (e) { console.debug?.(e); } try { At && clearTimeout(At), At = null; } catch (e) { console.debug?.(e); } try { Pt?.dispose?.(); } catch (e) { console.debug?.(e); } Pt = null; try { Nt?.dispose?.(); } catch (e) { console.debug?.(e); } Nt = null; try { L?._mjrSummaryBarDispose?.(); } catch (e) { console.debug?.(e); } try { L?._mjrSummaryBarObserver?.disconnect?.(); } catch (e) { console.debug?.(e); } try { L?._mjrGridContextMenuUnbind?.(); } catch (e) { console.debug?.(e); } try { Ht?.(); } catch (e) { console.debug?.(e); } try { Mt?.(); } catch (e) { console.debug?.(e); } try { L && pt(L); } catch (e) { console.debug?.(e); } Xn(L), L = null; try { i.dispose(); } catch (e) { console.debug?.(e); } try { e._mjrPopoverManager === i && (e._mjrPopoverManager = null); } catch (e) { console.debug?.(e); } try { a && o && (a.style.height = o.height, a.style.minHeight = o.minHeight, a.style.width = o.width); } catch (e) { console.debug?.(e); } }; let tn = async () => { await Pt?.queuedReload?.(); }; th(Ye, Xe, Je, Ze, Pt?.createCountersUpdateHandler?.({ state: s, getStableQuery: () => String(L?.dataset?.mjrQuery || "*").trim() || "*", getRecentUserInteractionAt: () => Number(rt || 0) }) ?? (async () => { await tn(); }), () => ({ scope: c.read("scope", s.scope), customRootId: c.read("customRootId", s.customRootId) })), Tt.setActiveTabStyles(), jt?.renderBreadcrumb?.(), Vt.refreshCustomRoots().catch(() => {}), en = Pt?.bindSearchInput?.({ searchInputEl: Pe, lifecycleSignal: r?.signal || null, debounceMs: 120, onQueryChanged: () => { Kt({ reload: !1 }), Rt(); }, onBeforeReload: () => { Kt({ reload: !1 }), Rt(); }, startSearchTimer: () => { nm("searchQuery"); }, reloadGrid: () => { wt.reloadGrid(); } }); let nn = !1; try { nn = await vt(L, { scope: l("scope", s.scope || "output") || "output", query: String(Ag(c.read("searchQuery", s.searchQuery || "*") || "*") || "*"), customRootId: l("customRootId", s.customRootId || "") || "", subfolder: l("currentFolderRelativePath", s.currentFolderRelativePath || "") || "", collectionId: l("collectionId", s.collectionId || "") || "", viewScope: l("viewScope", s.viewScope || "") || "", kind: l("kindFilter", s.kindFilter || "") || "", workflowOnly: !!l("workflowOnly", s.workflowOnly), minRating: l("minRating", s.minRating || "") || "", minSizeMB: l("minSizeMB", s.minSizeMB || "") || "", maxSizeMB: l("maxSizeMB", s.maxSizeMB || "") || "", resolutionCompare: l("resolutionCompare", s.resolutionCompare || "") || "", minWidth: l("minWidth", s.minWidth || "") || "", minHeight: l("minHeight", s.minHeight || "") || "", maxWidth: l("maxWidth", s.maxWidth || "") || "", maxHeight: l("maxHeight", s.maxHeight || "") || "", workflowType: l("workflowType", s.workflowType || "") || "", workflowId: l("workflowId", s.workflowId || "") || "", workflowModel: l("workflowModelFilter", s.workflowModelFilter || "") || "", workflowRunsOn: l("workflowRunsOnFilter", s.workflowRunsOnFilter || "") || "", dateRange: l("dateRangeFilter", s.dateRangeFilter || "") || "", dateExact: l("dateExactFilter", s.dateExactFilter || "") || "", sort: l("sort", s.sort || "mtime_desc") || "mtime_desc" }, { title: l("collectionName", s.collectionName || "") || c.read("searchQuery", s.searchQuery || "") || "Cached" }); } catch (e) { console.debug?.(e); } let rn = !1; try { rn = !!L?.querySelector?.(".mjr-asset-card"); } catch (e) { console.debug?.(e); } let an = ap(), on = !an && (nn || rn) ? Promise.resolve({ ok: !0, hydrated: !!nn, cached: !!rn }) : wt.reloadGrid({ reason: an ? "pending-generated-assets" : "initial-load", preserveVisibleUntilReady: !an }); if (nn) try { setTimeout(() => { try { if (r?.signal?.aborted) return; } catch (e) { console.debug?.(e); } wt.reloadGrid().catch(() => {}); }, 200); } catch (e) { console.debug?.(e); } zt().catch(() => {}); try { kt = setInterval(() => { try { if (r?.signal?.aborted) return; } catch (e) { console.debug?.(e); } zt().catch(() => {}); }, 15e3); } catch (e) { console.debug?.(e); } Pt?.restoreUiState?.(on); try { window.__mjrLastAssetUpsert = 0, window.__mjrLastAssetUpsertCount = 0; } catch (e) { console.debug?.(e); } return cm(rm("panelRender", "gridRender") ?? 0), { gridContainer: L }; } //#endregion //#region ui/vue/components/status/StatusSection.vue var I_ = { __name: "StatusSection", setup(e, { expose: t }) { let n = Im({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); return Or(() => { try { n?._mjrStatusPollDispose?.(); } catch {} }), t({ statusSection: n, statusDot: r, statusText: i, capabilitiesSection: a }), (e, t) => null; } }, L_ = Sr({ open: !1, initial: null, resolve: null }); function R_(e = {}) { return L_.open = !0, L_.initial = e || {}, new Promise((e) => { L_.resolve = e; }); } function z_(e = null) { let t = L_.resolve; L_.open = !1, L_.initial = null, L_.resolve = null, t && t(e); } //#endregion //#region ui/vue/components/panel/SimilarSearchPopover.vue var B_ = { class: "mjr-popover mjr-similar-popover", style: { display: "none" } }, V_ = { class: "mjr-menu mjr-similar-menu" }, H_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, U_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, W_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, G_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, K_ = { __name: "SimilarSearchPopover", setup(e, { expose: t }) { let n = Z(null), r = Z(null), i = Z(null), a = Z(null), o = (e) => e?.$el || e || null; return t({ get findSimilarBtn() { return o(n.value); }, get findDuplicatesBtn() { return o(r.value); }, get sameNodeBtn() { return o(i.value); }, get sameWorkflowBtn() { return o(a.value); } }), (e, t) => { let o = gr("MButton"); return V(), Y("div", B_, [U("div", V_, [ J(o, { ref_key: "findSimilarBtnRef", ref: n, type: "button", class: "mjr-menu-item", severity: "secondary", text: "", title: K(R)("search.findSimilarWarning", "Find similar assets. This may be heavy on very large libraries.") }, { default: Q(() => [U("span", H_, [t[0] ||= U("i", { class: "pi pi-sparkles", "aria-hidden": "true" }, null, -1), U("span", null, q(K(R)("search.findSimilar", "Find Similar")), 1)])]), _: 1 }, 8, ["title"]), J(o, { ref_key: "findDuplicatesBtnRef", ref: r, type: "button", class: "mjr-menu-item", severity: "secondary", text: "" }, { default: Q(() => [U("span", U_, [t[1] ||= U("i", { class: "pi pi-clone", "aria-hidden": "true" }, null, -1), U("span", null, q(K(R)("search.findDuplicates", "Find Duplicate")), 1)])]), _: 1 }, 512), t[4] ||= U("div", { class: "mjr-menu-divider" }, null, -1), J(o, { ref_key: "sameNodeBtnRef", ref: i, type: "button", class: "mjr-menu-item", severity: "secondary", text: "" }, { default: Q(() => [U("span", W_, [t[2] ||= U("i", { class: "pi pi-share-alt", "aria-hidden": "true" }, null, -1), U("span", null, q(K(R)("search.generatedWithSameSaveNode", "Generated with same save node")), 1)])]), _: 1 }, 512), J(o, { ref_key: "sameWorkflowBtnRef", ref: a, type: "button", class: "mjr-menu-item", severity: "secondary", text: "" }, { default: Q(() => [U("span", G_, [t[3] ||= U("i", { class: "pi pi-sitemap", "aria-hidden": "true" }, null, -1), U("span", null, q(K(R)("search.generatedFromSameWorkflow", "Generated from same workflow")), 1)])]), _: 1 }, 512) ])]); }; } }, q_ = { class: "mjr-am-search-pill" }, J_ = ["id"], Y_ = { class: "mjr-am-search-tools" }, X_ = { class: "mjr-popover-anchor" }, Z_ = { class: "mjr-popover-anchor" }, Q_ = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", $_ = "AND", ev = { __name: "SearchBar", emits: ["search-change"], setup(e, { expose: t, emit: n }) { let r = n, i = Dh(), a = Z(null), o = Z(null), s = Z(null), c = Z(null), l = Z(null), u = Z(null), d = dt("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, p = () => f(o.value), m = Z(!1), h = Z(!0), g = Z($_), _ = null, v = null, y = G(() => m.value ? R("search.semanticPlaceholder", "Describe what you're looking for...") : R("search.placeholder", "Search assets...")), b = G(() => m.value ? Ht(R("search.semanticTitle", "AI semantic search — describe your image in natural language"), Q_) : Ht(R("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), Q_)), x = G(() => m.value ? { background: "rgba(0, 188, 212, 0.2)", borderColor: "rgba(0, 188, 212, 0.6)", color: "#00BCD4", boxShadow: "0 0 6px rgba(0, 188, 212, 0.3)" } : { background: "transparent", borderColor: "rgba(0, 188, 212, 0.25)", color: "rgba(0, 188, 212, 0.5)", boxShadow: "none" }), S = () => { try { let e = p(); if (!e) return; e.dataset.mjrSemanticMode = m.value ? "1" : "0", e.dataset.mjrMetadataMode = g.value; } catch (e) { console.debug?.(e); } }, C = (e = {}) => { r("search-change", { query: p()?.value || "", semantic: m.value, metadataMode: g.value, ...e }); }, w = () => { if (h.value) { m.value = !m.value, S(); try { p()?.dispatchEvent?.(new Event("input", { bubbles: !0 })); } catch (e) { console.debug?.(e); } C({ semantic: m.value }); } }, T = async (e) => { let t = e.target.value || ""; i.searchQuery = t, i.metadataSearchMode = $_, S(), C({ query: t }), await A(); }, E = (e) => { let t = String(e || "").split(/\s+/); return t[t.length - 1] || ""; }; async function D() { return _ || (v ||= ae(lt.METADATA_KEYS, { limit: 600 }).then((e) => { let t = e?.data || {}; return _ = t, t; }), v); } function O(e, t) { let n = String(e || "").match(/^(.*?)(\S*)$/); return `${n ? n[1] : ""}${t}`.trimStart(); } function k(e, t) { let n = E(e), r = n.replace(/^-/, ""), i = wn(); if (!r.includes(":")) { let t = r.toLowerCase(); return Object.keys(i).filter((e) => e.startsWith(t)).slice(0, 12).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${t}:`)); } let [a, o = ""] = r.split(/:(.*)/s); if (!In(a)) return []; let s = o.toLowerCase(), c = Array.isArray(t?.keys) ? t.keys : [], l = t?.workflow_nodes || {}; return [...c, ...Object.keys(l).flatMap((e) => (l[e] || []).map((t) => `workflow_nodes.${e}.${t}`))].filter((e) => String(e || "").toLowerCase().includes(s)).slice(0, 16).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${a}:${t}`)); } let A = xn(async () => { let e = (p()?.value || "").trim(); if (!(m.value || e.length < 1)) try { let t = [], n = await D(); if (t.push(...k(e, n)), !e.includes(":") && e.length >= 2) { let n = await ae("/mjr/am/autocomplete", { q: e, limit: 10 }); n && n.ok && Array.isArray(n.data) && t.push(...n.data); } s.value && (s.value.innerHTML = "", [...new Set(t)].slice(0, 18).forEach((e) => { let t = document.createElement("option"); t.value = e, s.value.appendChild(t); })); } catch {} }, 300); return ir(() => i.searchQuery, (e) => { let t = p(); t && t.value !== e && (t.value = e); }), ir(h, (e) => { !e && m.value && (m.value = !1), S(); }), ir(m, () => { S(); }), ir(() => i.metadataSearchMode, (e) => { String(e || "").toUpperCase() !== $_ && (i.metadataSearchMode = $_), g.value !== $_ && (g.value = $_), S(); }), fr(() => { try { let e = p(); e && (e.value = i.searchQuery || ""), i.metadataSearchMode = $_; } catch (e) { console.debug?.(e); } S(); }), t({ get searchSection() { return a.value; }, get searchInputEl() { return p(); }, get similarBtn() { return f(c.value); }, get similarPopover() { return l.value?.$el ?? null; }, get similarFindBtn() { return l.value?.findSimilarBtn ?? null; }, get similarDuplicatesBtn() { return l.value?.findDuplicatesBtn ?? null; }, get similarSameNodeBtn() { return l.value?.sameNodeBtn ?? null; }, get similarSameWorkflowBtn() { return l.value?.sameWorkflowBtn ?? null; }, get semanticBtn() { return f(u.value); }, setSemanticEnabled: (e) => { h.value = !!e, S(); } }), (e, t) => { let n = gr("MInputText"), r = gr("MButton"); return V(), Y("div", { ref_key: "searchSectionRef", ref: a, class: "mjr-am-search" }, [U("div", q_, [ t[0] ||= U("span", { class: "mjr-am-search-icon" }, [U("i", { class: "pi pi-search" })], -1), J(n, { ref_key: "searchInputRef", ref: o, id: "mjr-search-input", class: "mjr-input", type: "text", placeholder: y.value, title: b.value, list: K(d), onInput: T }, null, 8, [ "placeholder", "title", "list" ]), U("datalist", { ref_key: "dataListRef", ref: s, id: K(d) }, null, 8, J_) ]), U("div", Y_, [ U("div", X_, [J(r, { ref_key: "semanticBtnRef", ref: u, type: "button", class: "mjr-icon-btn mjr-ai-control", severity: "secondary", text: "", rounded: "", disabled: !h.value, "aria-disabled": !h.value, title: h.value ? K(R)("search.semanticToggle", "Toggle AI semantic search (CLIP-based)") : K(R)("search.semanticDisabled", "AI semantic search is disabled in settings"), style: Cr(x.value), onClick: w }, { default: Q(() => [...t[1] ||= [U("i", { class: "pi pi-sparkles" }, null, -1)]]), _: 1 }, 8, [ "disabled", "aria-disabled", "title", "style" ])]), U("div", Z_, [J(r, { ref_key: "similarBtnRef", ref: c, type: "button", class: "mjr-icon-btn mjr-ai-control", severity: "secondary", text: "", rounded: "", title: K(R)("search.findSimilar", "Find Similar") }, { default: Q(() => [...t[2] ||= [U("i", { class: "pi pi-search" }, null, -1)]]), _: 1 }, 8, ["title"]), J(K_, { ref_key: "similarPopoverRef", ref: l }, null, 512)]), mr(e.$slots, "filter-anchor"), mr(e.$slots, "sort-anchor"), mr(e.$slots, "collections-anchor"), mr(e.$slots, "pinned-folders-anchor") ])], 512); }; } }, tv = { class: "mjr-popover mjr-sort-popover", style: { display: "none" } }, nv = { class: "mjr-menu-item-label" }, rv = { __name: "SortPopover", setup(e) { let t = Dh(), n = G(() => t.sort || "mtime_desc"), r = (e) => { t.sort = e; try { window.dispatchEvent(new CustomEvent("mjr:sort-changed", { detail: { sort: e } })); } catch (e) { console.debug?.(e); } }, i = G(() => [ { key: "mtime_desc", label: R("sort.newest"), icon: "pi pi-sort-amount-down" }, { key: "mtime_asc", label: R("sort.oldest"), icon: "pi pi-sort-amount-up-alt" }, { key: "name_asc", label: R("sort.nameAZ"), icon: "pi pi-sort-alpha-down" }, { key: "name_desc", label: R("sort.nameZA"), icon: "pi pi-sort-alpha-up" }, { key: "rating_desc", label: R("sort.ratingHigh"), icon: "pi pi-star-fill" }, { key: "size_desc", label: R("sort.sizeDesc"), icon: "pi pi-sort-numeric-down-alt" }, { key: "size_asc", label: R("sort.sizeAsc"), icon: "pi pi-sort-numeric-up-alt" } ].map((e) => ({ ...e, class: { "is-active": n.value === e.key }, command: () => r(e.key) }))); return (e, t) => { let r = gr("MMenu"); return V(), Y("div", tv, [J(r, { model: i.value, class: "mjr-menu mjr-prime-menu mjr-sort-menu", pt: { list: { class: "mjr-menu mjr-prime-menu-list" } } }, { item: Q(({ item: e }) => [U("div", { class: X(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [U("span", nv, q(e.label), 1), U("i", { class: X([e.icon, "mjr-menu-item-check"]), style: Cr({ opacity: +(n.value === e.key) }) }, null, 6)], 2)]), _: 1 }, 8, ["model"])]); }; } }, iv = { class: "mjr-popover mjr-filter-popover mjr-popover--hidden" }, av = { class: "mjr-filter-head" }, ov = { class: "mjr-filter-head-left" }, sv = { class: "mjr-filter-kicker" }, cv = { class: "mjr-filter-subtitle" }, lv = { class: "mjr-filter-head-actions" }, uv = { class: "mjr-filter-active-count" }, dv = { class: "mjr-filter-group-title" }, fv = { class: "mjr-filter-group-chevron", "aria-hidden": "true" }, pv = { class: "mjr-filter-group-body" }, mv = { class: "mjr-filter-card" }, hv = { class: "mjr-popover-row" }, gv = { class: "mjr-popover-label" }, _v = { class: "mjr-popover-row" }, vv = { class: "mjr-popover-label" }, yv = ["title"], bv = { class: "mjr-filter-card" }, xv = { class: "mjr-popover-row" }, Sv = { class: "mjr-popover-label" }, Cv = { class: "mjr-popover-row" }, wv = { class: "mjr-popover-label" }, Tv = { class: "mjr-popover-row" }, Ev = { class: "mjr-popover-label" }, Dv = { class: "mjr-filter-stack" }, Ov = { class: "mjr-popover-row" }, kv = { class: "mjr-popover-label" }, Av = { class: "mjr-popover-row" }, jv = { class: "mjr-popover-label" }, Mv = { class: "mjr-filter-group-title" }, Nv = { class: "mjr-filter-group-chevron", "aria-hidden": "true" }, Pv = { class: "mjr-filter-group-body" }, Fv = { class: "mjr-filter-card" }, Iv = { class: "mjr-popover-row mjr-popover-row--3col" }, Lv = { class: "mjr-popover-label" }, Rv = { class: "mjr-popover-row" }, zv = { class: "mjr-popover-label" }, Bv = { class: "mjr-popover-row mjr-popover-row--3col" }, Vv = { class: "mjr-popover-label" }, Hv = { class: "mjr-popover-row mjr-popover-row--3col" }, Uv = { class: "mjr-popover-label" }, Wv = { class: "mjr-filter-group-title" }, Gv = { class: "mjr-filter-group-chevron", "aria-hidden": "true" }, Kv = { class: "mjr-filter-group-body" }, qv = { class: "mjr-filter-card mjr-filter-card--agenda" }, Jv = { class: "mjr-popover-row" }, Yv = { class: "mjr-popover-label" }, Xv = { class: "mjr-popover-row" }, Zv = { class: "mjr-popover-label" }, Qv = { __name: "FilterPopover", setup(e, { expose: t }) { let n = Dh(), i = Z(null), a = Z(null), o = Z(null), s = Z(null), c = Z(null), l = Z(null), u = Z(null), d = Z(null), f = Z(null), p = Z(null), m = Z([{ label: R("filter.any", "Any"), value: "" }]), h = (e) => e?.$el || e || null, g = (e) => h(e.value)?.value || "", _ = (e, t) => { let n = h(e.value); n && (n.value = String(t ?? "")); }, v = Z({ core: !0, media: !1, time: !0 }), y = G(() => [ { label: R("filter.all"), value: "" }, { label: R("filter.images", "Images"), value: "image" }, { label: R("filter.videos", "Videos"), value: "video" }, { label: R("filter.audio", "Audio"), value: "audio" }, { label: "3D", value: "model3d" } ]), b = G(() => [ { label: R("filter.any", "Any"), value: "" }, { label: "T2I", value: "T2I" }, { label: "I2I", value: "I2I" }, { label: "T2V", value: "T2V" }, { label: "I2V", value: "I2V" }, { label: "V2V", value: "V2V" }, { label: "FLF (First/Last Frame)", value: "FLF" }, { label: "UPSCL", value: "UPSCL" }, { label: "INPT", value: "INPT" }, { label: "TTS (Text to Speech)", value: "TTS" }, { label: "A2A (Audio to Audio)", value: "A2A" } ]), x = G(() => [ { label: R("filter.any", "Any"), value: "" }, { label: "Local", value: "local" }, { label: "API", value: "api" }, { label: "Cloud", value: "cloud" }, { label: "Unknown", value: "unknown" } ]), S = G(() => { let e = Array.isArray(m.value) ? m.value.slice() : [{ label: R("filter.any", "Any"), value: "" }]; (!e.length || String(e[0]?.value || "") !== "") && e.unshift({ label: R("filter.any", "Any"), value: "" }); let t = String(n.workflowModelFilter || "").trim(); return t && !e.some((e) => String(e?.value || "") === t) && e.splice(1, 0, { label: t, value: t }), e; }), C = G(() => [ { label: R("filter.anyRating"), value: "0" }, { label: "★ 1+", value: "1" }, { label: "★ 2+", value: "2" }, { label: "★ 3+", value: "3" }, { label: "★ 4+", value: "4" }, { label: "★ 5", value: "5" } ]), w = G(() => [ { label: R("filter.any", "Any"), value: "" }, { label: "HD (1280x720)", value: "hd" }, { label: "FHD (1920x1080)", value: "fhd" }, { label: "QHD (2560x1440)", value: "qhd" }, { label: "4K (3840x2160)", value: "uhd" } ]), T = G(() => [ { label: R("filter.anytime"), value: "" }, { label: R("filter.today"), value: "today" }, { label: R("filter.thisWeek"), value: "this_week" }, { label: R("filter.thisMonth"), value: "this_month" } ]), E = G(() => { let e = Number(n.minWidth || 0) || 0, t = Number(n.minHeight || 0) || 0; return e >= 3840 && t >= 2160 ? "uhd" : e >= 2560 && t >= 1440 ? "qhd" : e >= 1920 && t >= 1080 ? "fhd" : e >= 1280 && t >= 720 ? "hd" : ""; }), D = G(() => { let e = String(n.dateExactFilter || "").trim().length > 0; return { "mjr-agenda-filled": e, "mjr-agenda-empty": !e }; }), O = (e) => { let t = String(e ?? "").trim(); if (!t) return 0; let n = t.replace(",", "."), r = Number(n); return Number.isFinite(r) ? r : 0; }, k = () => { try { window.dispatchEvent(new CustomEvent("mjr:filters-changed")); } catch (e) { console.debug?.(e); } }, A = async () => { try { let e = await r(); if (!e?.ok) return; let t = (Array.isArray(e.data?.model_families) ? e.data.model_families : []).map((e) => ({ label: String(e?.label || e?.value || "").trim(), value: String(e?.value || e?.label || "").trim() })).filter((e) => e.value).slice(0, 200); m.value = [{ label: R("filter.any", "Any"), value: "" }, ...t]; } catch (e) { console.debug?.(e); } }; fr(() => { A(); }); let j = (e, { emit: t = !0 } = {}) => { n.kindFilter = String(e || ""), t && k(); }, M = (e, { emit: t = !0 } = {}) => { n.workflowOnly = !!e, t && k(); }, N = (e, { emit: t = !0 } = {}) => { n.workflowType = String(e || "").trim().toUpperCase(), t && k(); }, P = (e, { emit: t = !0 } = {}) => { n.workflowId = String(e || "").trim(), t && k(); }, F = (e, { emit: t = !0 } = {}) => { n.workflowModelFilter = String(e || "").trim(), t && k(); }, ee = (e, { emit: t = !0 } = {}) => { n.workflowRunsOnFilter = String(e || "").trim().toLowerCase(), t && k(); }, te = (e, { emit: t = !0 } = {}) => { n.minRating = Number(e || 0) || 0, t && k(); }, I = () => { let e = O(g(i) || 0), t = O(g(a) || 0); t > 0 && e > 0 && t < e && (t = e, _(a, t)), n.minSizeMB = e > 0 ? e : 0, n.maxSizeMB = t > 0 ? t : 0, k(); }, ne = () => { let e = Math.max(0, Math.round(O(g(o) || 0))), t = Math.max(0, Math.round(O(g(s) || 0))), r = Math.max(0, Math.round(O(g(c) || 0))), i = Math.max(0, Math.round(O(g(l) || 0))); r > 0 && e > 0 && r < e && (r = e, _(c, r)), i > 0 && t > 0 && i < t && (i = t, _(l, i)), n.minWidth = e, n.minHeight = t, n.maxWidth = r, n.maxHeight = i, k(); }, re = (e, { emit: t = !0 } = {}) => { let [r, i] = { hd: [1280, 720], fhd: [1920, 1080], qhd: [2560, 1440], uhd: [3840, 2160] }[String(e || "").trim()] || [0, 0]; n.minWidth = Number(r || 0), n.minHeight = Number(i || 0), n.maxWidth = 0, n.maxHeight = 0, _(o, n.minWidth || ""), _(s, n.minHeight || ""), _(c, ""), _(l, ""), t && k(); }, ie = (e, { emit: t = !0 } = {}) => { n.dateRangeFilter = String(e || ""), n.dateRangeFilter && n.dateExactFilter && (n.dateExactFilter = "", _(d, "")), t && k(); }, ae = (e) => { n.dateExactFilter = String(e?.target?.value || "").trim(), n.dateExactFilter && n.dateRangeFilter && (n.dateRangeFilter = ""), k(); }, oe = (e) => { let t = String(e || "").trim().toLowerCase(); !t || !(t in v.value) || (v.value = { ...v.value, [t]: !v.value[t] }); }, se = (e) => !!v.value[String(e || "").trim().toLowerCase()], ce = ({ getValue: e, setValue: t }) => ({ get value() { return e(); }, set value(e) { t(e, { emit: !1 }); }, addEventListener() {}, removeEventListener() {}, dispatchEvent() { return !0; } }), le = ({ getChecked: e, setChecked: t }) => ({ get checked() { return e(); }, set checked(e) { t(e, { emit: !1 }); }, addEventListener() {}, removeEventListener() {}, dispatchEvent() { return !0; } }), ue = ce({ getValue: () => String(n.kindFilter || ""), setValue: j }), de = le({ getChecked: () => !!n.workflowOnly, setChecked: M }), fe = ce({ getValue: () => String(n.workflowType || "").trim().toUpperCase(), setValue: N }), pe = ce({ getValue: () => String(n.workflowId || "").trim(), setValue: P }), me = ce({ getValue: () => String(n.workflowModelFilter || "").trim(), setValue: F }), he = ce({ getValue: () => String(n.workflowRunsOnFilter || "").trim().toLowerCase(), setValue: ee }), ge = ce({ getValue: () => String(Number(n.minRating || 0) || 0), setValue: te }), _e = ce({ getValue: () => E.value, setValue: re }), ve = ce({ getValue: () => String(n.dateRangeFilter || ""), setValue: ie }), ye = G(() => { let e = 0; return String(n.kindFilter || "").trim() && (e += 1), n.workflowOnly && (e += 1), String(n.workflowType || "").trim() && (e += 1), String(n.workflowId || "").trim() && (e += 1), String(n.workflowModelFilter || "").trim() && (e += 1), String(n.workflowRunsOnFilter || "").trim() && (e += 1), (Number(n.minRating || 0) || 0) > 0 && (e += 1), ((Number(n.minSizeMB || 0) || 0) > 0 || (Number(n.maxSizeMB || 0) || 0) > 0) && (e += 1), ((Number(n.minWidth || 0) || 0) > 0 || (Number(n.minHeight || 0) || 0) > 0 || (Number(n.maxWidth || 0) || 0) > 0 || (Number(n.maxHeight || 0) || 0) > 0) && (e += 1), String(n.dateRangeFilter || "").trim() && (e += 1), String(n.dateExactFilter || "").trim() && (e += 1), e; }), be = () => { n.kindFilter = "", n.workflowOnly = !1, n.workflowType = "", n.workflowId = "", n.workflowModelFilter = "", n.workflowRunsOnFilter = "", n.minRating = 0, n.minSizeMB = 0, n.maxSizeMB = 0, n.minWidth = 0, n.minHeight = 0, n.maxWidth = 0, n.maxHeight = 0, n.dateRangeFilter = "", n.dateExactFilter = "", _(i, ""), _(a, ""), _(o, ""), _(s, ""), _(c, ""), _(l, ""), _(d, ""), _(f, ""), _(p, ""), k(); }; return t({ get kindSelect() { return ue; }, get wfCheckbox() { return de; }, get workflowTypeSelect() { return fe; }, get workflowIdInput() { return pe; }, get workflowModelInput() { return me; }, get workflowModelFamilyOptions() { return S.value; }, get workflowRunsOnSelect() { return he; }, get ratingSelect() { return ge; }, get minSizeInput() { return h(i.value); }, get maxSizeInput() { return h(a.value); }, get resolutionPresetSelect() { return _e; }, get minWidthInput() { return h(o.value); }, get minHeightInput() { return h(s.value); }, get maxWidthInput() { return h(c.value); }, get maxHeightInput() { return h(l.value); }, get dateRangeSelect() { return ve; }, get dateExactInput() { return h(d.value); }, get agendaContainer() { return u.value; } }), (e, t) => { let r = gr("MButton"), m = gr("MSelect"), h = gr("MCheckbox"), g = gr("MInputText"); return V(), Y("div", iv, [ U("div", av, [U("div", ov, [U("div", sv, q(K(R)("label.filters", "Filters")), 1), U("div", cv, q(K(R)("label.refineResults", "Refine your results")), 1)]), U("div", lv, [U("span", uv, q(ye.value), 1), J(r, { type: "button", class: "mjr-filter-clear-all", severity: "secondary", text: "", disabled: ye.value === 0, onClick: be }, { default: Q(() => [tr(q(K(R)("action.clearAll", "Clear all")), 1)]), _: 1 }, 8, ["disabled"])])]), U("div", { class: X(["mjr-filter-group mjr-filter-group--core", { "is-open": se("core") }]) }, [J(r, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", text: "", "aria-expanded": String(se("core")), onClick: t[0] ||= (e) => oe("core") }, { default: Q(() => [U("span", dv, q(K(R)("group.core", "Core")), 1), U("span", fv, q(se("core") ? "▾" : "▸"), 1)]), _: 1 }, 8, ["aria-expanded"]), sr(U("div", pv, [U("div", mv, [U("div", hv, [U("div", gv, q(K(R)("label.type")), 1), J(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: K(R)("tooltip.filterByFileType", "Filter by file type"), "model-value": String(K(n).kindFilter || ""), options: y.value, "option-label": "label", "option-value": "value", "onUpdate:modelValue": j }, null, 8, [ "title", "model-value", "options" ])]), U("div", _v, [U("div", vv, q(K(R)("label.workflow")), 1), U("label", { class: "mjr-popover-toggle", title: K(R)("tooltip.filterWorkflowOnly", "Show only assets with embedded workflow data") }, [J(h, { class: "mjr-checkbox", "model-value": !!K(n).workflowOnly, binary: "", "onUpdate:modelValue": M }, null, 8, ["model-value"]), U("span", null, q(K(R)("filter.onlyWithWorkflow")), 1)], 8, yv)])]), U("div", bv, [ U("div", xv, [U("div", Sv, q(K(R)("label.workflowType", "Workflow type")), 1), J(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(K(n).workflowType || "").trim().toUpperCase(), options: b.value, "option-label": "label", "option-value": "value", "onUpdate:modelValue": N }, null, 8, ["model-value", "options"])]), U("div", Cv, [U("div", wv, q(K(R)("label.sameWorkflow", "Generated with Same Workflow")), 1), J(g, { ref_key: "workflowIdInputRef", ref: f, class: "mjr-input", title: K(R)("tooltip.filterWorkflowId", "Filter assets generated from the same embedded workflow id"), placeholder: K(R)("placeholder.workflowId", "Workflow ID"), "model-value": String(K(n).workflowId || ""), "onUpdate:modelValue": P, onChange: t[1] ||= (e) => P(e?.target?.value) }, null, 8, [ "title", "placeholder", "model-value" ])]), U("div", Tv, [U("div", Ev, q(K(R)("label.workflowModelFamily", "Model family")), 1), U("div", Dv, [J(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(K(n).workflowModelFilter || ""), options: S.value, "option-label": "label", "option-value": "value", "onUpdate:modelValue": F }, null, 8, ["model-value", "options"]), J(g, { ref_key: "workflowModelInputRef", ref: p, class: "mjr-input", placeholder: K(R)("placeholder.workflowModelFamily", "Flux, Wan, SDXL..."), "model-value": String(K(n).workflowModelFilter || ""), "onUpdate:modelValue": F, onChange: t[2] ||= (e) => F(e?.target?.value) }, null, 8, ["placeholder", "model-value"])])]), U("div", Ov, [U("div", kv, q(K(R)("label.workflowRunsOn", "Runs on")), 1), J(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(K(n).workflowRunsOnFilter || "").trim().toLowerCase(), options: x.value, "option-label": "label", "option-value": "value", "onUpdate:modelValue": ee }, null, 8, ["model-value", "options"])]), U("div", Av, [U("div", jv, q(K(R)("label.rating")), 1), J(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: K(R)("tooltip.filterMinRating", "Filter by minimum rating"), "model-value": String(Number(K(n).minRating || 0) || 0), options: C.value, "option-label": "label", "option-value": "value", "onUpdate:modelValue": te }, null, 8, [ "title", "model-value", "options" ])]) ])], 512), [[_r, se("core")]])], 2), U("div", { class: X(["mjr-filter-group mjr-filter-group--media", { "is-open": se("media") }]) }, [J(r, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", text: "", "aria-expanded": String(se("media")), onClick: t[3] ||= (e) => oe("media") }, { default: Q(() => [U("span", Mv, q(K(R)("group.media", "Media")), 1), U("span", Nv, q(se("media") ? "▾" : "▸"), 1)]), _: 1 }, 8, ["aria-expanded"]), sr(U("div", Pv, [U("div", Fv, [ U("div", Iv, [ U("div", Lv, q(K(R)("label.fileSizeMB", "File size (MB)")), 1), J(g, { ref_key: "minSizeInputRef", ref: i, type: "number", min: "0", step: "0.1", class: "mjr-input", placeholder: K(R)("label.min", "Min"), value: K(n).minSizeMB || "", onChange: I }, null, 8, ["placeholder", "value"]), J(g, { ref_key: "maxSizeInputRef", ref: a, type: "number", min: "0", step: "0.1", class: "mjr-input", placeholder: K(R)("label.max", "Max"), value: K(n).maxSizeMB || "", onChange: I }, null, 8, ["placeholder", "value"]) ]), U("div", Rv, [U("div", zv, q(K(R)("label.resolutionPx", "Resolution (px)")), 1), J(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": E.value, options: w.value, "option-label": "label", "option-value": "value", "onUpdate:modelValue": re }, null, 8, ["model-value", "options"])]), U("div", Bv, [ U("div", Vv, q(K(R)("label.resolutionMinWxH", "Min WxH (px)")), 1), J(g, { ref_key: "minWidthInputRef", ref: o, type: "number", min: "0", step: "1", class: "mjr-input", placeholder: K(R)("label.widthPx", "W (px)"), title: K(R)("tooltip.widthPx", "Minimum width in pixels"), value: K(n).minWidth || "", onChange: ne }, null, 8, [ "placeholder", "title", "value" ]), J(g, { ref_key: "minHeightInputRef", ref: s, type: "number", min: "0", step: "1", class: "mjr-input", placeholder: K(R)("label.heightPx", "H (px)"), title: K(R)("tooltip.heightPx", "Minimum height in pixels"), value: K(n).minHeight || "", onChange: ne }, null, 8, [ "placeholder", "title", "value" ]) ]), U("div", Hv, [ U("div", Uv, q(K(R)("label.resolutionMaxWxH", "Max WxH (px)")), 1), J(g, { ref_key: "maxWidthInputRef", ref: c, type: "number", min: "0", step: "1", class: "mjr-input", placeholder: K(R)("label.widthPx", "W (px)"), title: K(R)("tooltip.widthPx", "Maximum width in pixels"), value: K(n).maxWidth || "", onChange: ne }, null, 8, [ "placeholder", "title", "value" ]), J(g, { ref_key: "maxHeightInputRef", ref: l, type: "number", min: "0", step: "1", class: "mjr-input", placeholder: K(R)("label.heightPx", "H (px)"), title: K(R)("tooltip.heightPx", "Maximum height in pixels"), value: K(n).maxHeight || "", onChange: ne }, null, 8, [ "placeholder", "title", "value" ]) ]) ])], 512), [[_r, se("media")]])], 2), U("div", { class: X(["mjr-filter-group mjr-filter-group--time", { "is-open": se("time") }]) }, [J(r, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", text: "", "aria-expanded": String(se("time")), onClick: t[4] ||= (e) => oe("time") }, { default: Q(() => [U("span", Wv, q(K(R)("group.time", "Time")), 1), U("span", Gv, q(se("time") ? "▾" : "▸"), 1)]), _: 1 }, 8, ["aria-expanded"]), sr(U("div", Kv, [U("div", qv, [U("div", Jv, [U("div", Yv, q(K(R)("label.dateRange")), 1), J(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: K(R)("tooltip.filterByDateRange", "Filter by date range"), "model-value": String(K(n).dateRangeFilter || ""), options: T.value, "option-label": "label", "option-value": "value", "onUpdate:modelValue": ie }, null, 8, [ "title", "model-value", "options" ])]), U("div", Xv, [U("div", Zv, q(K(R)("label.agenda")), 1), U("div", { ref_key: "agendaContainerRef", ref: u, class: "mjr-agenda-container" }, [J(g, { ref_key: "dateExactInputRef", ref: d, type: "date", class: X(["mjr-input mjr-agenda-input", D.value]), value: K(n).dateExactFilter, onChange: ae }, null, 8, ["class", "value"])], 512)])])], 512), [[_r, se("time")]])], 2) ]); }; } }, $v = 128, ey = Object.freeze([ { key: "portraits", label: "Portraits", query: "portrait photo face person closeup", iconClass: "pi pi-user" }, { key: "landscapes", label: "Landscapes", query: "landscape nature scenery mountains outdoor", iconClass: "pi pi-image" }, { key: "anime", label: "Anime / Illustration", query: "anime illustration manga cartoon drawing", iconClass: "pi pi-palette" }, { key: "cyberpunk", label: "Cyberpunk / Sci-Fi", query: "cyberpunk sci-fi futuristic neon city", iconClass: "pi pi-bolt" }, { key: "fantasy", label: "Fantasy", query: "fantasy magic medieval dragon castle", iconClass: "pi pi-star" }, { key: "abstract", label: "Abstract", query: "abstract art pattern geometric colors", iconClass: "pi pi-circle" } ]); function ty(e) { try { let t = String(e ?? "").trim(); if (!t || t.length > $v || t.includes("\0")) return ""; for (let e = 0; e < t.length; e += 1) { let n = t.charCodeAt(e); if (n <= 31 || n === 127) return ""; } return t; } catch { return ""; } } function ny(e) { if (!e || typeof e != "object") return null; let t = String(e.filepath || "").trim(); return t ? { filepath: t, filename: String(e.filename || "").trim(), subfolder: String(e.subfolder || "").trim(), type: String(e.type || "output").trim().toLowerCase() || "output", kind: String(e.kind || "").trim().toLowerCase(), root_id: String(e.root_id || e.rootId || e.custom_root_id || "").trim() || void 0 } : null; } function ry(e) { let t = [], n = [], r = /* @__PURE__ */ new Set(); for (let i of Array.isArray(e) ? e : []) { let e = ny(i); if (e?.filepath) { let n = e.filepath.toLowerCase(); if (r.has(n)) continue; r.add(n), t.push(e); continue; } let a = Number(i?.asset_id ?? i?.id); Number.isFinite(a) && a > 0 && n.push(a); } return { assets: t, missingIds: n }; } async function iy(e) { let t = Array.from(new Set((Array.isArray(e) ? e : []).map((e) => Number(e)).filter((e) => Number.isFinite(e) && e > 0))); if (!t.length) return { ok: !0, data: [] }; let n = await A(t); if (!n?.ok) return { ok: !1, error: String(n?.error || "Failed to fetch assets") }; let { assets: r } = ry(Array.isArray(n?.data) ? n.data : Array.isArray(n?.data?.assets) ? n.data.assets : []); return { ok: !0, data: r }; } function ay(e) { let t = String(e?.label || "").trim(); if (!(!t || /^group\b/i.test(t))) return t; let n = (Array.isArray(e?.dominant_tags) ? e.dominant_tags : []).map((e) => String(e || "").trim()).filter(Boolean); if (n.length) return n.slice(0, 2).join(" / "); let r = Array.isArray(e?.sample_assets) ? e.sample_assets : [], i = String(r.find((e) => String(e?.subfolder || "").trim())?.subfolder || "").trim(), a = i ? i.split(/[\\/]/).filter(Boolean).pop() : "", o = { image: 0, video: 0, audio: 0, other: 0 }; for (let e of r) { let t = String(e?.kind || "").toLowerCase(); t in o ? o[t] += 1 : o.other += 1; } let s = Object.entries(o).sort((e, t) => t[1] - e[1])[0]?.[0] || "other", c = s === "image" ? "Images" : s === "video" ? "Videos" : s === "audio" ? "Audio" : "Media", l = Number(e?.cluster_id), u = Number.isFinite(l) ? ` ${l + 1}` : ""; return a ? `${a} - ${c}` : `${c} Cluster${u}`; } function oy() { try { return !!(mn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } } //#endregion //#region ui/vue/components/panel/CollectionsPopover.vue var sy = { class: "mjr-menu mjr-collections-menu" }, cy = { class: "mjr-menu-item-label" }, ly = { class: "mjr-menu-item-label" }, uy = { class: "mjr-menu-item-right" }, dy = { key: 0, class: "mjr-menu-item-hint" }, fy = { key: 1, class: "mjr-muted" }, py = { key: 2, class: "mjr-state-block is-error" }, my = { key: 3, class: "mjr-muted" }, hy = { class: "mjr-collection-row" }, gy = { class: "mjr-menu-item-label" }, _y = { class: "mjr-menu-item-right" }, vy = { key: 0, class: "mjr-menu-item-hint" }, yy = { class: "mjr-state-block" }, by = { class: "mjr-section-title mjr-section-title--cyan" }, xy = { class: "mjr-section-hint" }, Sy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, Cy = { class: "mjr-section-title mjr-section-title--violet" }, wy = { class: "mjr-section-hint" }, Ty = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, Ey = { key: 0, class: "mjr-state-block is-error" }, Dy = { class: "mjr-cluster-thumbs" }, Oy = ["src", "alt"], ky = { class: "mjr-cluster-info" }, Ay = ["title"], jy = { class: "mjr-cluster-count" }, My = "mjr:collections-changed", Ny = { __name: "CollectionsPopover", setup(e, { expose: t }) { let n = Dh(), r = Z(null), i = Z([]), a = Z(!1), o = Z(""), s = Z(!1), c = Z(!0), l = Z(!1), u = Z(!1), d = Z(!1), f = Z([]), g = Z(""), _ = Z(""), v = 0, y = null, b = !1, x = G(() => String(n.collectionId || "").trim()), S = G(() => String(n.collectionName || "").trim()), C = G(() => !!x.value), w = G(() => !c.value || u.value), T = G(() => c.value && l.value), D = G(() => `${Math.max(1, Math.min(i.value.length, 6)) * 48}px`); function A() { let e = r.value; return !!e && String(e.style.display || "").toLowerCase() !== "none"; } function j({ collectionId: e = x.value, collectionName: t = S.value, close: n = !0, reload: r = !0 } = {}) { try { window.dispatchEvent(new CustomEvent(My, { detail: { collectionId: String(e || ""), collectionName: String(t || ""), close: n !== !1, reload: r !== !1 } })); } catch (e) { console.debug?.(e); } } function M(e) { try { return ot(e) || ""; } catch (e) { return console.debug?.(e), ""; } } async function N() { if (!oy()) return { enabled: !1, vectorAvailable: !1, vectorDisabled: !1 }; try { let e = await be(), t = !e?.ok && (String(e?.code || "").toUpperCase() === "SERVICE_UNAVAILABLE" || /vector search is not enabled/i.test(String(e?.error || ""))); return { enabled: !0, vectorAvailable: !!(e?.ok && e?.data?.total > 0), vectorDisabled: t }; } catch (e) { return console.debug?.(e), { enabled: !0, vectorAvailable: !1, vectorDisabled: !1 }; } } function P(...e) { let t = [], n = /* @__PURE__ */ new Set(); for (let r of e) for (let e of Array.isArray(r) ? r : []) { let r = String(e?.filepath || "").trim().toLowerCase(); !r || n.has(r) || (n.add(r), t.push(e)); } return t; } async function F() { let e = ++v; a.value = !0, s.value = !0, o.value = "", g.value = ""; try { let [t, n] = await Promise.all([ne(), N()]); if (e !== v) return; t?.ok ? i.value = Array.isArray(t?.data) ? t.data : [] : (o.value = String(t?.error || R("msg.failedLoadCollections", "Failed to load collections")), i.value = []), c.value = !!n.enabled, l.value = !!n.vectorAvailable, u.value = !!n.vectorDisabled, l.value || (f.value = [], d.value = !1); } catch (t) { if (e !== v) return; console.debug?.(t), o.value = R("msg.failedLoadCollections", "Failed to load collections"), i.value = []; } finally { e === v && (a.value = !1, s.value = !1); } } function ee(e, t) { return async (...n) => { if (!_.value) { _.value = e; try { await t(...n); } finally { _.value === e && (_.value = ""); } } }; } let te = ee("create", async () => { let e = await Et(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "Collection name")); if (!e) return; let t = ty(e); if (!t) { k(R("toast.invalidCollectionName", "Invalid collection name"), "error"); return; } let n = await E(t); if (!n?.ok) { k(n?.error || R("toast.failedCreateCollection", "Failed to create collection"), "error"); return; } j({ collectionId: String(n?.data?.id || ""), collectionName: String(n?.data?.name || t) }); }), I = ee("exit", async () => { j({ collectionId: "", collectionName: "" }); }), re = ee("open", async (e) => { let t = String(e?.id || ""), n = String(e?.name || t); if (t) { if (t === x.value) { j({ collectionId: t, collectionName: n, reload: !1 }); return; } j({ collectionId: t, collectionName: n }); } }), ie = ee("delete", async (e) => { let t = String(e?.id || ""), n = String(e?.name || t); if (!t || !await Gt(R("dialog.deleteCollection", "Delete collection \"{name}\"?", { name: n }))) return; let r = await O(t); if (!r?.ok) { k(r?.error || R("toast.failedDeleteCollection", "Failed to delete collection"), "error"); return; } if (t === x.value) { j({ collectionId: "", collectionName: "" }); return; } await F(); }); async function ae(e) { let t = String(e?.label || "").trim(); if (!t) return; let n = await E(t); if (!n?.ok) { k(n?.error || R("toast.failedCreateSmartCollection", "Failed to create smart collection"), "error"); return; } let r = String(n?.data?.id || ""); if (!r) return; let i = await m(String(e?.query || ""), 50); if (i?.ok && Array.isArray(i?.data) && i.data.length > 0) { let e = ry(i.data), n = e.assets; if (e.missingIds.length) { let t = await iy(e.missingIds); t.ok && Array.isArray(t.data) && (n = P(n, t.data)); } if (n.length) { let e = await h(r, n); if (!e?.ok) { k(e?.error || R("toast.failedAddAssetsToSmartCollection", "Failed to add assets to smart collection"), "error"); return; } let i = Number(e?.data?.added || n.length || 0); k(R("toast.smartCollectionCreated", "Smart collection \"{name}\" created with {count} assets!", { name: t, count: i }), "success", 3e3); } else k(R("toast.smartCollectionEmpty", "Collection \"{name}\" created but no matching assets found. Index more assets first.", { name: t }), "info", 3e3); } else k(R("toast.smartCollectionEmpty", "Collection \"{name}\" created but no matching assets found. Index more assets first.", { name: t }), "info", 3e3); j({ collectionId: r, collectionName: t }); } async function oe(e) { if (!e?.key) return; let t = `smart:${e.key}`; if (!_.value) { _.value = t; try { await ae(e); } catch (e) { console.error("[Majoor] Smart collection creation failed:", e), k(R("toast.failedCreateSmartCollection", "Failed to create smart collection"), "error"); } finally { _.value === t && (_.value = ""); } } } async function se() { if (!(d.value || _.value)) { d.value = !0, g.value = "", f.value = []; try { let e = await p(8); if (!e?.ok || !Array.isArray(e?.data) || !e.data.length) { k(R("toast.noGroupsFoundIndexFirst", "No groups found. Index more assets first."), "info", 3e3); return; } f.value = e.data.map((e) => ({ ...e, _label: ay(e) })); } catch (e) { console.error("[Majoor] Discover groups failed:", e), g.value = R("toast.clusterAnalysisFailed", "Cluster analysis failed"), k(R("toast.clusterAnalysisFailed", "Cluster analysis failed"), "error"); } finally { d.value = !1; } } } async function ce(e) { let t = `cluster:${String(e?.cluster_id ?? "")}`; if (!_.value) { _.value = t; try { let t = String(e?._label || ay(e) || "").trim(); if (!t) return; let n = await E(t); if (!n?.ok) { k(n?.error || R("toast.failedCreateCollection", "Failed to create collection"), "error"); return; } let r = String(n?.data?.id || ""), i = Array.isArray(e?.all_asset_ids) ? e.all_asset_ids : []; if (r && i.length) { let e = await iy(i); if (!e.ok) { k(e.error || R("toast.failedLoadClusterAssets", "Failed to load cluster assets"), "error"); return; } let n = await h(r, e.data || []); if (!n?.ok) { k(n?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection"), "error"); return; } let a = Number(n?.data?.added || e.data?.length || 0); k(R("toast.collectionCreatedWithAssets", "Collection \"{name}\" created with {count} assets!", { name: t, count: a }), "success", 3e3); } else k(R("toast.collectionCreatedNamed", "Collection \"{name}\" created.", { name: t }), "success", 2200); j({ collectionId: r, collectionName: t }); } catch (e) { console.error("[Majoor] Cluster collection creation failed:", e), k(R("toast.failedCreateCollection", "Failed to create collection"), "error"); } finally { _.value === t && (_.value = ""); } } } function le() { let e = A(); e && !b && F().catch(() => {}), b = e; } return fr(() => { le(), !(typeof MutationObserver > "u" || !r.value) && (y = new MutationObserver(() => le()), y.observe(r.value, { attributes: !0, attributeFilter: ["style"] })); }), Or(() => { try { y?.disconnect?.(); } catch (e) { console.debug?.(e); } y = null; }), t({ refresh: F }), (e, t) => { let n = gr("MButton"), l = gr("MVirtualScroller"); return V(), Y("div", { ref_key: "rootRef", ref: r, class: "mjr-popover mjr-collections-popover", style: { display: "none" } }, [U("div", sy, [ J(n, { type: "button", class: "mjr-menu-item", severity: "secondary", text: "", disabled: _.value !== "", onClick: K(te) }, { default: Q(() => [U("span", cy, q(K(R)("ctx.createCollection", "Create collection")), 1), t[0] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 1 }, 8, ["disabled", "onClick"]), C.value ? (V(), nr(n, { key: 0, type: "button", class: "mjr-menu-item", severity: "secondary", text: "", disabled: _.value !== "", onClick: K(I) }, { default: Q(() => [U("span", ly, q(K(R)("ctx.exitCollection", "Exit collection")), 1), U("span", uy, [S.value ? (V(), Y("span", dy, q(S.value), 1)) : W("", !0), t[1] ||= U("i", { class: "pi pi-times mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)])]), _: 1 }, 8, ["disabled", "onClick"])) : W("", !0), t[9] ||= U("div", { class: "mjr-menu-divider" }, null, -1), a.value ? (V(), Y("div", fy, q(K(R)("label.loading", "Loading...")), 1)) : o.value ? (V(), Y("div", py, q(o.value), 1)) : i.value.length ? (V(), nr(l, { key: 4, items: i.value, "item-size": 48, "scroll-height": D.value, "num-tolerated-items": 4, class: "mjr-collections-virtual-list" }, { item: Q(({ item: e }) => [U("div", hy, [J(n, { type: "button", class: X(["mjr-menu-item", { "is-active": x.value === String(e.id || "") }]), severity: "secondary", text: "", disabled: _.value !== "", onClick: (t) => K(re)(e) }, { default: Q(() => [U("span", gy, q(e.name || e.id), 1), U("span", _y, [Number(e.count || 0) ? (V(), Y("span", vy, q(Number(e.count || 0)), 1)) : W("", !0), t[2] ||= U("i", { class: "pi pi-check mjr-menu-item-check" }, null, -1)])]), _: 2 }, 1032, [ "class", "disabled", "onClick" ]), J(n, { type: "button", class: "mjr-menu-item mjr-delete-btn", severity: "secondary", text: "", disabled: _.value !== "", title: K(R)("tooltip.deleteCollection", "Delete collection"), onClick: pr((t) => K(ie)(e), ["stop", "prevent"]) }, { default: Q(() => [...t[3] ||= [U("i", { class: "pi pi-trash" }, null, -1)]]), _: 1 }, 8, [ "disabled", "title", "onClick" ])])]), _: 1 }, 8, ["items", "scroll-height"])) : (V(), Y("div", my, q(K(R)("msg.noCollections", "No collections yet")), 1)), !s.value && w.value ? (V(), Y(H, { key: 5 }, [t[4] ||= U("div", { class: "mjr-menu-divider" }, null, -1), U("div", yy, q(c.value ? "AI Smart Collections are disabled (enable vector search env var)." : "AI Smart Collections are disabled in settings."), 1)], 64)) : W("", !0), !s.value && T.value ? (V(), Y(H, { key: 6 }, [ t[7] ||= U("div", { class: "mjr-menu-divider" }, null, -1), U("div", by, q(K(R)("label.smartSuggestions", "Smart Suggestions")), 1), U("div", xy, q(K(R)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), (V(!0), Y(H, null, ar(K(ey), (e) => (V(), nr(n, { key: e.key, type: "button", class: "mjr-menu-item mjr-menu-item--smart", severity: "secondary", text: "", disabled: _.value !== "", onClick: (t) => oe(e) }, { default: Q(() => [U("span", Sy, [U("i", { class: X(e.iconClass) }, null, 2), U("span", null, q(e.label), 1)]), t[5] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 2 }, 1032, ["disabled", "onClick"]))), 128)), t[8] ||= U("div", { class: "mjr-menu-divider" }, null, -1), U("div", Cy, q(K(R)("label.discoverGroups", "Discover Groups")), 1), U("div", wy, q(K(R)("label.discoverGroupsHint", "AI clusters assets by visual similarity")), 1), J(n, { type: "button", class: "mjr-menu-item mjr-menu-item--cluster", severity: "secondary", text: "", disabled: d.value || _.value !== "", onClick: se }, { default: Q(() => [U("span", Ty, [t[6] ||= U("i", { class: "pi pi-search" }, null, -1), U("span", null, q(d.value ? K(R)("label.analyzing", "Analyzing...") : K(R)("label.analyzeLibrary", "Analyze library")), 1)])]), _: 1 }, 8, ["disabled"]), g.value ? (V(), Y("div", Ey, q(g.value), 1)) : W("", !0), (V(!0), Y(H, null, ar(f.value, (e) => (V(), Y("div", { key: e.cluster_id, class: "mjr-cluster-row" }, [ U("div", Dy, [(V(!0), Y(H, null, ar(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (V(), Y("img", { key: `${e.cluster_id}-${n}`, class: "mjr-cluster-thumb", src: M(t), alt: String(t?.filename || e._label || ""), loading: "lazy" }, null, 8, Oy))), 128))]), U("div", ky, [U("div", { class: "mjr-cluster-name", title: e._label }, q(e._label), 9, Ay), U("div", jy, q(Number(e.size || 0)) + " " + q(K(R)("label.assets", "assets")), 1)]), J(n, { type: "button", class: "mjr-cluster-create-btn", severity: "secondary", disabled: _.value !== "", title: K(R)("ctx.createCollection", "Create collection"), onClick: (t) => ce(e) }, { default: Q(() => [tr(q(_.value === `cluster:${String(e.cluster_id ?? "")}` ? K(R)("label.loading", "Loading...") : K(R)("label.create", "Create")), 1)]), _: 2 }, 1032, [ "disabled", "title", "onClick" ]) ]))), 128)) ], 64)) : W("", !0) ])], 512); }; } }, Py = { class: "mjr-popover mjr-pinned-folders-popover mjr-popover--hidden" }, Fy = { key: 0, class: "mjr-muted mjr-pinned-folders-empty" }, Iy = { key: 1, class: "mjr-muted mjr-pinned-folders-empty" }, Ly = { class: "mjr-pinned-folder-label" }, Ry = { key: 0, class: "mjr-menu-item-hint mjr-pinned-folder-path" }, zy = { __name: "PinnedFoldersPopover", setup(e, { expose: t }) { let n = Z(null), r = Z([]), i = Z(!1), a = Z("No pinned folders"), o = Z("Loading..."), s = Z("Unpin folder"), c = Z(null), l = Z(null); function u(e) { let t = String(e?.id || "").trim(); return t ? { id: t, label: String(e?.label || e?.name || e?.path || t).trim() || t, path: String(e?.path || "").trim() } : null; } function d({ roots: e = [], emptyLabel: t = "", loadingLabel: n = "", unpinLabel: d = "", onOpen: f = null, onUnpin: p = null, loading: m = !1 } = {}) { r.value = Array.isArray(e) ? e.map(u).filter(Boolean) : [], t && (a.value = String(t)), n && (o.value = String(n)), d && (s.value = String(d)), c.value = typeof f == "function" ? f : null, l.value = typeof p == "function" ? p : null, i.value = !!m; } function f(e, t = "") { i.value = !!e, t && (o.value = String(t)); } function p(e) { c.value?.(e); } function m(e, t) { t?.preventDefault?.(), t?.stopPropagation?.(), l.value?.(e, t); } return t({ get pinnedFoldersMenu() { return n.value; }, setPinnedFolders: d, setPinnedFoldersLoading: f }), (e, t) => { let c = gr("MButton"); return V(), Y("div", Py, [U("div", { ref_key: "menuRef", ref: n, class: "mjr-menu mjr-pinned-folders-menu", role: "menu" }, [i.value ? (V(), Y("div", Fy, q(o.value), 1)) : r.value.length ? (V(!0), Y(H, { key: 2 }, ar(r.value, (e) => (V(), Y("div", { key: e.id, class: "mjr-pinned-folder-row" }, [J(c, { type: "button", class: "mjr-menu-item mjr-pinned-folder-open", role: "menuitem", severity: "secondary", onClick: (t) => p(e) }, { default: Q(() => [U("span", Ly, q(e.label), 1), e.path ? (V(), Y("span", Ry, q(e.path), 1)) : W("", !0)]), _: 2 }, 1032, ["onClick"]), J(c, { type: "button", class: "mjr-menu-item mjr-pinned-folder-unpin", role: "menuitem", severity: "danger", title: s.value, "aria-label": `${s.value}: ${e.label}`, onClick: (t) => m(e, t) }, { default: Q(() => [...t[0] ||= [U("i", { class: "pi pi-times", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, [ "title", "aria-label", "onClick" ])]))), 128)) : (V(), Y("div", Iy, q(a.value), 1))], 512)]); }; } }, By = { class: "mjr-popover mjr-custom-popover", style: { display: "none" } }, Vy = { class: "mjr-popover-row" }, Hy = { class: "mjr-popover-label" }, Uy = { class: "mjr-popover-row mjr-popover-row--actions" }, Wy = { __name: "CustomRootsPopover", setup(e, { expose: t }) { let n = Z([{ label: R("label.selectFolder", "Select folder..."), value: "", disabled: !1 }]), r = Z(""), i = Z(!1), a = Z(null), o = Z(null), s = (e) => e?.$el || e || null, c = new EventTarget(), l = (e) => ({ value: String(e?.value || ""), label: String(e?.textContent || e?.text || e?.label || ""), text: String(e?.text || e?.textContent || e?.label || ""), textContent: String(e?.textContent || e?.text || e?.label || ""), disabled: !!e?.disabled }), u = (e) => n.value.find((t) => String(t.value || "") === String(e || "")) || null, d = { get value() { return r.value; }, set value(e) { let t = String(e || ""); r.value = u(t) ? t : ""; }, get disabled() { return i.value; }, set disabled(e) { i.value = !!e; }, get options() { return n.value; }, get selectedIndex() { return Math.max(0, n.value.findIndex((e) => String(e.value || "") === String(r.value || ""))); }, set selectedIndex(e) { let t = n.value[Number(e) || 0] || n.value[0]; r.value = String(t?.value || ""); }, get selectedOptions() { let e = n.value[this.selectedIndex] || null; return e ? [e] : []; }, get innerHTML() { return ""; }, set innerHTML(e) { n.value = [], r.value = ""; }, appendChild(e) { let t = l(e); return n.value = [...n.value, t], e; }, querySelector(e) { return e === "option[value=\"\"]" ? u("") : null; }, addEventListener(e, t, n) { c.addEventListener(e, t, n); }, removeEventListener(e, t, n) { c.removeEventListener(e, t, n); }, dispatchEvent(e) { return c.dispatchEvent(e); } }; function f(e) { d.value = e; try { d.dispatchEvent(new Event("change")); } catch (e) { console.debug?.(e); } } return t({ get customSelect() { return d; }, get customAddBtn() { return s(a.value); }, get customRemoveBtn() { return s(o.value); } }), (e, t) => { let s = gr("MSelect"), c = gr("MButton"); return V(), Y("div", By, [U("div", Vy, [U("div", Hy, q(K(R)("label.folder")), 1), J(s, { class: "mjr-select", "model-value": r.value, options: n.value, "option-label": "label", "option-value": "value", disabled: i.value, "onUpdate:modelValue": f }, null, 8, [ "model-value", "options", "disabled" ])]), U("div", Uy, [J(c, { ref_key: "customAddBtnRef", ref: a, type: "button", class: "mjr-btn", severity: "secondary" }, { default: Q(() => [tr(q(K(R)("btn.add")), 1)]), _: 1 }, 512), J(c, { ref_key: "customRemoveBtnRef", ref: o, type: "button", class: "mjr-btn", severity: "secondary", disabled: "" }, { default: Q(() => [tr(q(K(R)("btn.remove")), 1)]), _: 1 }, 512)])]); }; } }, Gy = ["aria-label"], Ky = { class: "mjr-messages-head" }, qy = { class: "mjr-messages-actions" }, Jy = ["title"], Yy = { class: "mjr-messages-star-label" }, Xy = { class: "mjr-messages-tabs", role: "tablist" }, Zy = { class: "mjr-messages-panels" }, Qy = { class: "mjr-messages-empty" }, $y = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", eb = { __name: "MessagePopover", setup(e, { expose: t }) { let n = Z(null), r = Z(null), i = Z(null), a = Z(null), o = Z(null), s = Z(null), c = Z(null), l = Z(null), u = Z(null), d = Z(null), f = Z(null), p = (e) => e?.$el || e || null; return t({ get title() { return n.value; }, get markReadBtn() { return p(r.value); }, get messageTabBtn() { return p(i.value); }, get messageTabBadge() { return a.value; }, get historyTabBtn() { return p(o.value); }, get historyTabBadge() { return s.value; }, get historyTabCount() { return c.value; }, get shortcutsTabBtn() { return p(l.value); }, get messageList() { return u.value; }, get historyPanel() { return d.value; }, get shortcutsPanel() { return f.value; } }), (e, t) => { let p = gr("MButton"), m = gr("MDialog"); return V(), Y("div", { class: "mjr-popover mjr-messages-popover", id: "mjr-messages-popover", role: "dialog", "aria-label": K(R)("label.messages", "Messages"), "aria-hidden": "true", tabindex: "-1", style: { display: "none" } }, [J(m, { visible: !0, modal: !1, "show-header": !1, closable: !1, "close-on-escape": !1, draggable: !1, "auto-z-index": !1, "append-to": "self", class: "mjr-inline-dialog mjr-messages-dialog", "content-class": "mjr-inline-dialog-content", pt: { mask: { class: "mjr-inline-dialog-mask" }, root: { class: "mjr-inline-dialog-root" } } }, { default: Q(() => [ U("div", Ky, [U("div", { ref_key: "titleRef", ref: n, class: "mjr-messages-title" }, q(K(R)("label.messages", "Messages")), 513), U("div", qy, [U("a", { href: $y, target: "_blank", rel: "noopener noreferrer", class: "mjr-btn mjr-messages-star-link", title: K(R)("tooltip.starGithub", "Open GitHub and give a star") }, [t[0] ||= U("span", { class: "mjr-messages-star-icon", "aria-hidden": "true" }, "★", -1), U("span", Yy, q(K(R)("btn.giveStar", "Give a star")), 1)], 8, Jy), J(p, { ref_key: "markReadBtnRef", ref: r, type: "button", class: "mjr-btn mjr-messages-mark-read-btn", severity: "secondary", title: K(R)("tooltip.markMessagesRead", "Mark all messages as read") }, { default: Q(() => [tr(q(K(R)("btn.markAllRead", "Mark all read")), 1)]), _: 1 }, 8, ["title"])])]), U("div", Xy, [ J(p, { ref_key: "messageTabBtnRef", ref: i, type: "button", class: "mjr-messages-tab is-active", severity: "secondary", text: "", role: "tab", "aria-selected": "true", "aria-controls": "mjr-messages-panel", id: "mjr-messages-tab" }, { default: Q(() => [U("span", null, q(K(R)("label.messages", "Messages")), 1), U("span", { ref_key: "messageTabBadgeRef", ref: a, class: "mjr-tab-count-badge", "aria-hidden": "true", style: { display: "none" } }, null, 512)]), _: 1 }, 512), J(p, { ref_key: "historyTabBtnRef", ref: o, type: "button", class: "mjr-messages-tab", severity: "secondary", text: "", role: "tab", "aria-selected": "false", "aria-controls": "mjr-history-panel", id: "mjr-history-tab" }, { default: Q(() => [ U("span", null, q(K(R)("label.toastHistory", "History")), 1), U("span", { ref_key: "historyTabCountRef", ref: c, class: "mjr-tab-count-badge", "aria-hidden": "true", style: { display: "none" } }, null, 512), U("span", { ref_key: "historyTabBadgeRef", ref: s, class: "mjr-tab-unread-dot", "aria-hidden": "true", style: { display: "none" } }, null, 512) ]), _: 1 }, 512), J(p, { ref_key: "shortcutsTabBtnRef", ref: l, type: "button", class: "mjr-messages-tab", severity: "secondary", text: "", role: "tab", "aria-selected": "false", "aria-controls": "mjr-shortcuts-panel", id: "mjr-shortcuts-tab" }, { default: Q(() => [tr(q(K(R)("msg.shortcuts.title", "Shortcut Guide")), 1)]), _: 1 }, 512) ]), U("div", Zy, [ U("div", { ref_key: "messageListRef", ref: u, class: "mjr-messages-list", id: "mjr-messages-panel", role: "tabpanel", "aria-labelledby": "mjr-messages-tab" }, [U("div", Qy, q(K(R)("msg.noMessages", "No messages for now.")), 1)], 512), U("div", { ref_key: "historyPanelRef", ref: d, class: "mjr-messages-history-panel", id: "mjr-history-panel", role: "tabpanel", "aria-labelledby": "mjr-history-tab", hidden: "" }, null, 512), U("div", { ref_key: "shortcutsPanelRef", ref: f, class: "mjr-messages-shortcuts-panel", id: "mjr-shortcuts-panel", role: "tabpanel", "aria-labelledby": "mjr-shortcuts-tab", hidden: "" }, null, 512) ]) ]), _: 1 })], 8, Gy); }; } }, tb = { class: "mjr-am-header-row" }, nb = { class: "mjr-am-header-left" }, rb = { class: "mjr-am-header-title" }, ib = ["data-mjr-version-channel", "title"], ab = { class: "mjr-tabs" }, ob = { class: "mjr-am-header-tools" }, sb = { class: "mjr-popover-anchor", style: { display: "none" } }, cb = { class: "mjr-popover-anchor" }, lb = { class: "mjr-popover-anchor" }, ub = { class: "mjr-popover-anchor" }, db = { class: "mjr-popover-anchor" }, fb = { class: "mjr-popover-anchor" }, pb = "mjr-am-version-badge-label", mb = "V", hb = { __name: "HeaderSection", setup(e, { expose: n }) { let r = null; function i() { return r ||= Promise.resolve({}).catch((e) => { throw r = null, e; }), r; } function a(e, t = "") { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(); return [ "nightly", "dev", "alpha", "experimental" ].some((e) => n.includes(e) || r.includes(e)) || n.includes("+") || n.length > 10 && /^[a-f0-9]+$/i.test(n); } function o() { try { if (typeof window < "u" && window?.MajoorAssetsManagerBranch) return String(window.MajoorAssetsManagerBranch); } catch (e) { console.debug?.(e); } try { if (typeof process < "u" && process?.env?.MAJOR_ASSETS_MANAGER_BRANCH) return String(process.env.MAJOR_ASSETS_MANAGER_BRANCH); } catch (e) { console.debug?.(e); } return ""; } let s = { name_asc: "pi pi-sort-alpha-down", name_desc: "pi pi-sort-alpha-up", mtime_asc: "pi pi-sort-amount-up-alt", rating_desc: "pi pi-star-fill", size_desc: "pi pi-sort-numeric-down-alt", size_asc: "pi pi-sort-numeric-up-alt" }, c = Dh(), l = o() === "nightly", u = Z(null), f = Z(null), p = Z(null), m = Z(null), h = Z(null), g = Z(null), _ = Z(null), v = Z(null), y = Z(null), b = Z(null), x = Z(null), S = Z(null), C = Z(null), w = Z(null), T = Z(null), E = Z(null), D = Z(null), O = Z(null), A = Z(null), j = Z(null), M = Z(null), N = Z(null), P = Z(null), F = Z(null), ee = Z(null), te = Z(null), I = (e) => e?.$el || e || null, ne = Z(l ? "nightly" : "v?"), re = Z(l ? "nightly" : "stable"), ie = Z(!1), oe = Z(!1), se = Z(!1), ce = G(() => s[c.sort] ?? "pi pi-sort-amount-down"), ue = G(() => String(c.viewScope || c.scope || "output").toLowerCase()), de = G(() => ue.value === "similar" || Array.isArray(c.similarResults) && c.similarResults.length > 0 || !!c.similarTitle), fe = G(() => { let e = String(c.similarSourceAssetId || ""); return e.startsWith("stack:") || e.startsWith("duplicates:") || e.startsWith("group:") || e.startsWith("node:") ? "group" : "similar"; }), pe = G(() => fe.value === "group" ? R("tab.group", "Group") : R("tab.similar", "Similar")), me = G(() => fe.value === "group" ? R("tooltip.tab.group", "Browse current grouped assets") : R("tooltip.tab.similar", "Browse current similar findings")), he = { get tabAll() { return I(M.value); }, get tabInputs() { return I(N.value); }, get tabOutputs() { return I(P.value); }, get tabCustom() { return I(F.value); }, get tabWorkflow() { return I(ee.value); }, get tabSimilar() { return I(te.value); } }, ge = G(() => ({ position: "relative", fontSize: "10px", opacity: oe.value ? "1" : "0.6", marginLeft: "6px", padding: "2px 5px", borderRadius: "4px", background: oe.value ? "rgba(255,255,255,0.15)" : "rgba(255,255,255,0.08)", color: "inherit", textDecoration: "none", cursor: "pointer", transition: "opacity 0.2s, background 0.2s", verticalAlign: "middle" })), _e = G(() => se.value ? R("tooltip.closeMFV", "Close Majoor Floating Viewer") : R("tooltip.openMFV", "Open Majoor Floating Viewer")), ve = G(() => "pi pi-eye"), ye = G(() => R("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings")); async function be() { let e = Fe(); if (!e || typeof e != "object") { k(R("toast.workflowSerializeFailed", "Could not read the current ComfyUI workflow."), "error"); return; } let n = await R_({ workflow: e, name: String(e?.name || e?.title || "workflow").trim() }), r = String(n?.name || "").trim(); if (!r) return; let i = await t({ workflow: e, name: r, task: n?.task || "", model_family: n?.model_family || "", provider: n?.provider || "", runs_on: n?.runs_on || "", notes: n?.notes || "" }, { timeoutMs: 3e4 }); if (!i?.ok) { k(i?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); return; } k(R("toast.workflowSaved", "Workflow saved"), "success", 1800); try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-save" } })); } catch (e) { console.debug?.(e); } } async function xe() { let e = ""; try { let t = await le(lt.BROWSE_FOLDER, {}); t?.ok && (e = String(t?.data?.path || "").trim()); } catch (e) { console.debug?.(e); } if (!e) { let t = await Et(R("dialog.enterWorkflowRootPath", "Workflow root folder"), "", R("tab.workflow", "Workflow")); e = String(t || "").trim(); } if (!e) return; let t = await d(e, { timeoutMs: 3e4 }); if (!t?.ok) { k(t?.error || R("toast.failedSetWorkflowRoots", "Failed to set workflow roots"), "error"); return; } try { let n = mn(); n.paths = n.paths || {}, n.paths.workflowRoots = String(t?.data?.workflow_roots_text || e).trim(), Xt(n), window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { key: "paths.workflowRoots", value: e } })), window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-root-pick" } })); } catch (e) { console.debug?.(e); } k(R("toast.workflowRootsSaved", "Workflow roots saved"), "success", 1800); } function Se() { let e = C.value; if (e) try { e.value = "", e.click(); } catch (e) { console.debug?.(e); } } function Ce(e) { return new Promise((t, n) => { let r = new FileReader(); r.onload = () => { try { t(JSON.parse(String(r.result || ""))); } catch (e) { n(e); } }, r.onerror = () => n(r.error || /* @__PURE__ */ Error("Failed to read workflow file")), r.readAsText(e, "utf-8"); }); } async function we(e) { let n = Array.from(e?.target?.files || []).filter((e) => String(e?.name || "").toLowerCase().endsWith(".json")); if (!n.length) return; let r = 0; for (let e of n) try { let n = await Ce(e); if (!n || typeof n != "object") { k(R("toast.workflowImportInvalid", "Invalid workflow JSON."), "error"); continue; } let i = String(e.name || "workflow.json").replace(/\.json$/i, "").trim() || "workflow", a = await t({ workflow: n, name: i }, { timeoutMs: 3e4 }); if (!a?.ok) { k(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); continue; } r += 1; } catch (e) { console.debug?.(e), k(R("toast.workflowImportInvalid", "Invalid workflow JSON."), "error"); } if (r > 0) { k(r === 1 ? R("toast.workflowImported", "Workflow imported") : R("toast.workflowsImported", "{count} workflows imported", { count: r }), "success", 1800); try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-import" } })); } catch (e) { console.debug?.(e); } } } function Te(e, { channel: t = "" } = {}) { ne.value = String(e || ""), t && (re.value = t); } function Ee(e) { i().then((t) => { let n = re.value.toLowerCase() === "nightly" || ne.value.toLowerCase() === "nightly"; if (!e && !n) { let e = (typeof t?.version == "string" ? t.version.trim() : "") || ""; e && Te(`v${e}`, { channel: "stable" }); } }).catch(() => { r = null; }); } async function De(e) { try { let t = await ae(lt.VERSION, { cache: "no-cache" }); if (!t?.ok) return; let n = String(t.data?.version || "").trim(); if (a(n, String(t.data?.branch || "").trim().toLowerCase()) || e) { Te("nightly", { channel: "nightly" }); return; } n && Te(n.startsWith("v") ? n : `v${n}`, { channel: "stable" }); } catch {} } function Oe(e) { let t = String(e?.channel || "").trim().toLowerCase(), n = String(e?.current || "").trim().toLowerCase(), r = String(e?.latest || "").trim().toLowerCase(); (t === "nightly" || n === "nightly" || r === "nightly") && Te("nightly", { channel: "nightly" }), ie.value = !!e?.available; } function ke() { try { zt(I(v.value), _e.value, mb); } catch (e) { console.debug?.(e); } } function Ae() { try { if (typeof document > "u") return; se.value = !!document.querySelector(".mjr-mfv.is-visible"); } catch (e) { console.debug?.(e); } } function je(e) { se.value = !!e?.detail?.visible; } function Me(e) { try { Oe(e?.detail); } catch (e) { console.debug?.(e); } } function Ne() { window.dispatchEvent(new CustomEvent(B.MFV_TOGGLE)); } function Pe() { Jn(); } function Ie() { try { typeof window < "u" && (window.removeEventListener(si, Me), window.removeEventListener(B.MFV_VISIBILITY_CHANGED, je)); } catch (e) { console.debug?.(e); } } return ir(se, () => { ke(); }), fr(async () => { await or(); try { Oe(Ti()); } catch (e) { console.debug?.(e); } Ae(), ke(), Ee(l), De(l); try { typeof window < "u" && (window.addEventListener(si, Me), window.addEventListener(B.MFV_VISIBILITY_CHANGED, je)); } catch (e) { console.debug?.(e); } try { u.value._mjrVersionUpdateCleanup = Ie; } catch (e) { console.debug?.(e); } }), Or(() => { Ie(); }), n({ isVueHeader: !0, get header() { return u.value; }, get headerActions() { return f.value; }, get tabButtons() { return he; }, get customMenuBtn() { return I(p.value); }, get filterBtn() { return I(m.value); }, get sortBtn() { return I(h.value); }, get collectionsBtn() { return I(g.value); }, get pinnedFoldersBtn() { return I(_.value); }, get messageBtn() { return I(y.value); }, get settingsBtn() { return I(b.value); }, get customPopover() { return A.value?.$el ?? null; }, get customSelect() { return A.value?.customSelect ?? null; }, get customAddBtn() { return A.value?.customAddBtn ?? null; }, get customRemoveBtn() { return A.value?.customRemoveBtn ?? null; }, get filterPopover() { return E.value?.$el ?? null; }, get kindSelect() { return E.value?.kindSelect ?? null; }, get wfCheckbox() { return E.value?.wfCheckbox ?? null; }, get workflowTypeSelect() { return E.value?.workflowTypeSelect ?? null; }, get workflowIdInput() { return E.value?.workflowIdInput ?? null; }, get workflowModelInput() { return E.value?.workflowModelInput ?? null; }, get workflowRunsOnSelect() { return E.value?.workflowRunsOnSelect ?? null; }, get ratingSelect() { return E.value?.ratingSelect ?? null; }, get minSizeInput() { return E.value?.minSizeInput ?? null; }, get maxSizeInput() { return E.value?.maxSizeInput ?? null; }, get resolutionPresetSelect() { return E.value?.resolutionPresetSelect ?? null; }, get minWidthInput() { return E.value?.minWidthInput ?? null; }, get minHeightInput() { return E.value?.minHeightInput ?? null; }, get maxWidthInput() { return E.value?.maxWidthInput ?? null; }, get maxHeightInput() { return E.value?.maxHeightInput ?? null; }, get dateRangeSelect() { return E.value?.dateRangeSelect ?? null; }, get dateExactInput() { return E.value?.dateExactInput ?? null; }, get agendaContainer() { return E.value?.agendaContainer ?? null; }, get sortPopover() { return T.value?.$el ?? null; }, sortMenu: document.createElement("div"), get collectionsPopover() { return D.value?.$el ?? null; }, get refreshCollectionsPopover() { return D.value?.refresh ?? null; }, get pinnedFoldersPopover() { return O.value?.$el ?? null; }, get pinnedFoldersController() { return O.value ?? null; }, get pinnedFoldersMenu() { return O.value?.pinnedFoldersMenu ?? null; }, get messagePopover() { return j.value?.$el ?? null; }, get messagePopoverTitle() { return j.value?.title ?? null; }, get messageTabBtn() { return j.value?.messageTabBtn ?? null; }, get messageTabBadge() { return j.value?.messageTabBadge ?? null; }, get historyTabBtn() { return j.value?.historyTabBtn ?? null; }, get historyTabBadge() { return j.value?.historyTabBadge ?? null; }, get historyTabCount() { return j.value?.historyTabCount ?? null; }, get historyPanel() { return j.value?.historyPanel ?? null; }, get shortcutsTabBtn() { return j.value?.shortcutsTabBtn ?? null; }, get messageList() { return j.value?.messageList ?? null; }, get shortcutsPanel() { return j.value?.shortcutsPanel ?? null; }, get markReadBtn() { return j.value?.markReadBtn ?? null; }, get searchSection() { return w.value?.searchSection ?? null; }, get searchInputEl() { return w.value?.searchInputEl ?? null; }, get similarBtn() { return w.value?.similarBtn ?? null; }, get similarPopover() { return w.value?.similarPopover ?? null; }, get similarFindBtn() { return w.value?.similarFindBtn ?? null; }, get similarDuplicatesBtn() { return w.value?.similarDuplicatesBtn ?? null; }, get similarSameNodeBtn() { return w.value?.similarSameNodeBtn ?? null; }, get similarSameWorkflowBtn() { return w.value?.similarSameWorkflowBtn ?? null; }, setSemanticEnabled(e) { w.value?.setSemanticEnabled?.(e); }, _headerDispose: Ie }), (e, t) => { let n = gr("MButton"); return V(), Y(H, null, [U("div", { ref_key: "headerRef", ref: u, class: "mjr-am-header" }, [U("div", tb, [U("div", nb, [ t[2] ||= U("i", { class: "mjr-am-header-icon pi pi-folder", "aria-hidden": "true" }, null, -1), U("div", rb, q(K(R)("manager.title")), 1), U("a", { href: "https://ko-fi.com/majoorwaldi", target: "_blank", rel: "noopener noreferrer", class: "mjr-am-version-badge", "data-mjr-version-channel": re.value, title: K(R)("tooltip.supportKofi"), style: Cr(ge.value), onMouseenter: t[0] ||= (e) => oe.value = !0, onMouseleave: t[1] ||= (e) => oe.value = !1 }, [U("span", { class: X(pb) }, q(ne.value), 1), U("span", { "aria-hidden": "true", style: Cr({ position: "absolute", top: "2px", right: "-3px", width: "6px", height: "6px", borderRadius: "50%", background: "#f44336", boxShadow: "0 0 0 1px rgba(255,255,255,0.6)", display: ie.value ? "block" : "none", pointerEvents: "none" }) }, null, 4)], 44, ib) ]), U("div", { ref_key: "headerActionsRef", ref: f, class: "mjr-am-header-actions" }, [U("div", ab, [ J(n, { ref_key: "tabAllRef", ref: M, type: "button", class: X(["mjr-tab", { "is-active": ue.value === "all" }]), severity: "secondary", text: "", "data-scope": "all", title: K(R)("tooltip.tab.all") }, { default: Q(() => [tr(q(K(R)("tab.all")), 1)]), _: 1 }, 8, ["class", "title"]), J(n, { ref_key: "tabInputsRef", ref: N, type: "button", class: X(["mjr-tab", { "is-active": ue.value === "input" }]), severity: "secondary", text: "", "data-scope": "input", title: K(R)("tooltip.tab.input") }, { default: Q(() => [tr(q(K(R)("tab.input")), 1)]), _: 1 }, 8, ["class", "title"]), J(n, { ref_key: "tabOutputsRef", ref: P, type: "button", class: X(["mjr-tab", { "is-active": ue.value === "output" }]), severity: "secondary", text: "", "data-scope": "output", title: K(R)("tooltip.tab.output") }, { default: Q(() => [tr(q(K(R)("tab.output")), 1)]), _: 1 }, 8, ["class", "title"]), J(n, { ref_key: "tabCustomRef", ref: F, type: "button", class: X(["mjr-tab", { "is-active": ue.value === "custom" }]), severity: "secondary", text: "", "data-scope": "custom", title: K(R)("tooltip.tab.custom") }, { default: Q(() => [tr(q(K(R)("tab.custom")), 1)]), _: 1 }, 8, ["class", "title"]), J(n, { ref_key: "tabWorkflowRef", ref: ee, type: "button", class: X(["mjr-tab", { "is-active": ue.value === "workflow" }]), severity: "secondary", text: "", "data-scope": "workflow", title: K(R)("tooltip.tab.workflow", "Browse saved workflows") }, { default: Q(() => [tr(q(K(R)("tab.workflow", "Workflow")), 1)]), _: 1 }, 8, ["class", "title"]), J(n, { ref_key: "tabSimilarRef", ref: te, type: "button", class: X(["mjr-tab", { "is-active": ue.value === "similar" }]), severity: "secondary", text: "", "data-scope": "similar", style: Cr({ display: de.value ? "" : "none" }), title: me.value }, { default: Q(() => [tr(q(pe.value), 1)]), _: 1 }, 8, [ "class", "style", "title" ]) ]), U("div", ob, [ ue.value === "workflow" ? (V(), nr(n, { key: 0, ref_key: "saveWorkflowBtnRef", ref: x, type: "button", class: "mjr-icon-btn mjr-save-workflow-btn", severity: "secondary", text: "", rounded: "", title: K(R)("tooltip.saveCurrentWorkflow", "Save current workflow"), "aria-label": K(R)("tooltip.saveCurrentWorkflow", "Save current workflow"), onClick: be }, { default: Q(() => [...t[3] ||= [U("i", { class: "pi pi-save", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : W("", !0), ue.value === "workflow" ? (V(), nr(n, { key: 1, ref_key: "pickWorkflowRootBtnRef", ref: S, type: "button", class: "mjr-icon-btn mjr-pick-workflow-root-btn", severity: "secondary", text: "", rounded: "", title: K(R)("tooltip.pickWorkflowRoot", "Pick saved workflow root"), "aria-label": K(R)("tooltip.pickWorkflowRoot", "Pick saved workflow root"), onClick: xe }, { default: Q(() => [...t[4] ||= [U("i", { class: "pi pi-folder-plus", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : W("", !0), ue.value === "workflow" ? (V(), nr(n, { key: 2, type: "button", class: "mjr-icon-btn mjr-import-workflow-btn", severity: "secondary", text: "", rounded: "", title: K(R)("tooltip.importWorkflow", "Import workflow"), "aria-label": K(R)("tooltip.importWorkflow", "Import workflow"), onClick: Se }, { default: Q(() => [...t[5] ||= [U("i", { class: "pi pi-upload", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : W("", !0), U("input", { ref_key: "importWorkflowInputRef", ref: C, type: "file", accept: ".json,application/json", multiple: "", style: { display: "none" }, onChange: we }, null, 544), U("div", sb, [J(n, { ref_key: "customMenuBtnRef", ref: p, type: "button", class: "mjr-icon-btn", severity: "secondary", text: "", rounded: "", title: K(R)("tooltip.browserFolders"), "aria-label": K(R)("tooltip.browserFolders") }, { default: Q(() => [...t[6] ||= [U("i", { class: "pi pi-folder-open", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"]), J(Wy, { ref_key: "customPopoverRef", ref: A }, null, 512)]), J(n, { ref_key: "mfvBtnRef", ref: v, type: "button", class: X(["mjr-icon-btn", { "mjr-mfv-btn-active": se.value }]), severity: "secondary", text: "", rounded: "", title: _e.value, "aria-label": _e.value, onClick: Ne }, { default: Q(() => [U("i", { class: X(ve.value), "aria-hidden": "true" }, null, 2)]), _: 1 }, 8, [ "class", "title", "aria-label" ]), U("div", cb, [J(n, { ref_key: "messageBtnRef", ref: y, type: "button", class: "mjr-icon-btn mjr-message-btn", severity: "secondary", text: "", rounded: "", title: K(R)("tooltip.openMessages", "Messages and updates"), "aria-label": K(R)("tooltip.openMessages", "Messages and updates") }, { default: Q(() => [...t[7] ||= [U("i", { class: "pi pi-info-circle", "aria-hidden": "true" }, null, -1), U("span", { class: "mjr-message-badge", style: { display: "none" }, "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"]), J(eb, { ref_key: "messagePopoverRef", ref: j }, null, 512)]), J(n, { ref_key: "settingsBtnRef", ref: b, type: "button", class: "mjr-icon-btn mjr-settings-shortcut-btn", severity: "secondary", text: "", rounded: "", title: ye.value, "aria-label": ye.value, onClick: Pe }, { default: Q(() => [...t[8] ||= [U("i", { class: "pi pi-cog", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"]) ])], 512)])], 512), J(ev, { ref_key: "searchBarRef", ref: w }, { "filter-anchor": Q(() => [U("div", lb, [J(n, { ref_key: "filterBtnRef", ref: m, type: "button", class: "mjr-icon-btn", severity: "secondary", text: "", rounded: "", title: K(R)("label.filters"), "aria-label": K(R)("label.filters") }, { default: Q(() => [...t[9] ||= [U("i", { class: "pi pi-filter", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"]), J(Qv, { ref_key: "filterPopoverRef", ref: E }, null, 512)])]), "sort-anchor": Q(() => [U("div", ub, [J(n, { ref_key: "sortBtnRef", ref: h, type: "button", class: "mjr-icon-btn", severity: "secondary", text: "", rounded: "", title: K(R)("label.sort"), "aria-label": K(R)("label.sort") }, { default: Q(() => [U("i", { class: X(ce.value), "aria-hidden": "true" }, null, 2)]), _: 1 }, 8, ["title", "aria-label"]), J(rv, { ref_key: "sortPopoverRef", ref: T }, null, 512)])]), "collections-anchor": Q(() => [U("div", db, [J(n, { ref_key: "collectionsBtnRef", ref: g, type: "button", class: "mjr-icon-btn", severity: "secondary", text: "", rounded: "", title: K(R)("label.collections"), "aria-label": K(R)("label.collections") }, { default: Q(() => [...t[10] ||= [U("i", { class: "pi pi-bookmark", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"]), J(Ny, { ref_key: "collectionsPopoverRef", ref: D }, null, 512)])]), "pinned-folders-anchor": Q(() => [U("div", fb, [J(n, { ref_key: "pinnedFoldersBtnRef", ref: _, type: "button", class: "mjr-icon-btn", severity: "secondary", text: "", rounded: "", title: K(R)("tooltip.pinnedFolders"), "aria-label": K(R)("tooltip.pinnedFolders") }, { default: Q(() => [...t[11] ||= [U("i", { class: "pi pi-folder", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"]), J(zy, { ref_key: "pinnedFoldersPopoverRef", ref: O }, null, 512)])]), _: 1 }, 512)], 64); }; } }, gb = (e) => { try { return String(e ?? ""); } catch { return ""; } }, _b = (e) => { let t = String(e || ""); return R(t === "name_asc" ? "sort.nameAZ" : t === "name_desc" ? "sort.nameZA" : t === "mtime_asc" ? "sort.oldest" : "sort.newest"); }, vb = (e) => { let t = String(e || "").toLowerCase(); return t === "similar" ? R("scope.similar", "Similar") : t === "custom" ? R("scope.customBrowser") : t === "workflow" ? R("scope.workflow", "Workflow") : R(t === "all" ? "tab.all" : t === "input" || t === "inputs" ? "scope.input" : "scope.output"); }; function yb({ label: e, value: t, onClear: n } = {}) { let r = document.createElement("div"); r.className = "mjr-context-pill"; let i = document.createElement("span"); if (i.className = "mjr-context-pill-text", i.textContent = t != null && String(t).length ? `${e}: ${String(t)}` : String(e || ""), r.appendChild(i), typeof n == "function") { let t = document.createElement("button"); t.type = "button", t.className = "mjr-context-pill-x", t.title = R("tooltip.clearFilter", { label: e || R("label.filters") }), t.setAttribute("aria-label", R("tooltip.clearFilter", { label: e || R("label.filters") })), t.textContent = "x", t.addEventListener("click", (e) => { try { e.preventDefault(), e.stopPropagation(); } catch (e) { console.debug?.(e); } try { n(); } catch (e) { console.debug?.(e); } }), r.appendChild(t); } return r; } function bb() { let e = document.createElement("div"); return e.className = "mjr-am-context-pills", { wrap: e, update: ({ state: t, rawQuery: n = "", actions: r = null } = {}) => { let i = r && typeof r == "object" ? r : {}, a = gb(n || "").trim(), o = a.length > 0 && a !== "*", s = !!(gb(t?.kindFilter || "").trim() || t?.workflowOnly || (Number(t?.minRating || 0) || 0) > 0 || (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0 || (Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0 || gb(t?.workflowType || "").trim() || gb(t?.workflowId || "").trim() || gb(t?.workflowModelFilter || "").trim() || gb(t?.workflowRunsOnFilter || "").trim() || gb(t?.dateRangeFilter || "").trim() || gb(t?.dateExactFilter || "").trim()), c = gb(t?.sort || "mtime_desc").trim() !== "mtime_desc", l = gb(t?.collectionId || "").trim().length > 0, u = String(t?.viewScope || t?.scope || "output").toLowerCase(), d = u === "similar", f = u === "custom", p = u !== "output", m = gb(t?.similarSourceAssetId || "").trim(); if (!(!(o || s || c || l || p || d) && !e.childElementCount)) { try { e.replaceChildren(); } catch (e) { console.debug?.(e); } if (!f && l && e.appendChild(yb({ label: R("label.collections"), value: gb(t?.collectionName || t?.collectionId || "").trim(), onClear: () => i?.clearCollection?.() })), d && e.appendChild(yb({ label: R("search.findSimilar", "Find Similar"), value: m ? R("search.similarReference", "Reference #{id}", { id: m }) : R("scope.similar", "Similar"), onClear: () => i?.clearSimilarScope?.() })), p && e.appendChild(yb({ label: R("label.scope"), value: vb(u || "output"), onClear: () => d ? i?.clearSimilarScope?.() : i?.clearScope?.() })), o && e.appendChild(yb({ label: R("label.query"), value: a, onClear: () => i?.clearQuery?.() })), gb(t?.kindFilter || "").trim() && e.appendChild(yb({ label: R("label.type"), value: gb(t?.kindFilter || "").trim(), onClear: () => i?.clearKind?.() })), Number(t?.minRating || 0) > 0 && e.appendChild(yb({ label: R("label.rating"), value: `>= ${Number(t?.minRating || 0)}`, onClear: () => i?.clearMinRating?.() })), t?.workflowOnly && e.appendChild(yb({ label: R("label.workflow"), value: R("label.only"), onClear: () => i?.clearWorkflowOnly?.() })), gb(t?.workflowType || "").trim() && e.appendChild(yb({ label: R("label.workflowType"), value: gb(t?.workflowType || "").trim(), onClear: () => i?.clearWorkflowType?.() })), gb(t?.workflowId || "").trim()) { let n = gb(t?.workflowId || "").trim(); e.appendChild(yb({ label: R("label.sameWorkflow", "Generated with Same Workflow"), value: n.length > 18 ? `${n.slice(0, 8)}...${n.slice(-6)}` : n, onClear: () => i?.clearWorkflowId?.() })); } if (gb(t?.workflowModelFilter || "").trim() && e.appendChild(yb({ label: R("label.workflowModelFamily", "Model family"), value: gb(t?.workflowModelFilter || "").trim(), onClear: () => i?.clearWorkflowModel?.() })), gb(t?.workflowRunsOnFilter || "").trim() && e.appendChild(yb({ label: R("label.workflowRunsOn", "Runs on"), value: gb(t?.workflowRunsOnFilter || "").trim(), onClear: () => i?.clearWorkflowRunsOn?.() })), (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0) { let n = Number(t?.minSizeMB || 0) || 0, r = Number(t?.maxSizeMB || 0) || 0, a = n > 0 && r > 0 ? `${n}-${r} MB` : n > 0 ? `>= ${n} MB` : `<= ${r} MB`; e.appendChild(yb({ label: R("sidebar.size"), value: a, onClear: () => i?.clearSize?.() })); } if ((Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0) { let n = String(t?.resolutionCompare || "gte") === "lte", r = Number(n ? t?.maxWidth : t?.minWidth || 0) || 0, a = Number(n ? t?.maxHeight : t?.minHeight || 0) || 0; e.appendChild(yb({ label: R("label.resolution"), value: `${n ? "<=" : ">="} ${r || 0}x${a || 0} px`, onClear: () => i?.clearResolution?.() })); } gb(t?.dateRangeFilter || "").trim() && e.appendChild(yb({ label: R("sidebar.date"), value: gb(t?.dateRangeFilter || "").trim(), onClear: () => i?.clearDateRange?.() })), gb(t?.dateExactFilter || "").trim() && e.appendChild(yb({ label: R("label.day"), value: gb(t?.dateExactFilter || "").trim(), onClear: () => i?.clearDateExact?.() })), c && e.appendChild(yb({ label: R("label.sort"), value: _b(t?.sort), onClear: () => i?.clearSort?.() })); } } }; } //#endregion //#region ui/vue/components/panel/summaryBarState.ts var xb = (e, t = "") => R(e, t, void 0), Sb = (e) => { try { return String(e ?? ""); } catch { return ""; } }, Cb = (e) => { let t = String(e || "").toLowerCase(); return t === "similar" ? xb("scope.similar", "Similar") : t === "workflow" ? xb("scope.workflow", "Workflow") : xb(t === "input" || t === "inputs" ? "scope.input" : t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : "scope.output"); }; function wb(e) { try { let t = e?._mjrGetRenderedCards; if (typeof t == "function") { let e = t(); return Array.isArray(e) ? e : []; } } catch (e) { console.debug?.(e); } return []; } function Tb(e) { try { let t = String(e?.dataset?.mjrSelectedAssetIds || "").trim(); if (t) { let e = JSON.parse(t); if (Array.isArray(e)) return e.length; } } catch (e) { console.debug?.(e); } try { if (String(e?.dataset?.mjrSelectedAssetId || "").trim()) return 1; } catch (e) { console.debug?.(e); } return 0; } function Eb({ state: e, gridContainer: t, context: n = null } = {}) { let r = wb(t), i = (() => { try { let e = 0; for (let t of r) String(t?._mjrAsset?.kind || "").toLowerCase() === "folder" && (e += 1); return { total: r.length, folders: e }; } catch { return { total: 0, folders: 0 }; } })(), a = Number(r.length || 0) || 0, o = (() => { try { let t = Array.isArray(e?.selectedAssetIds) ? e.selectedAssetIds.length : 0; if (t > 0) return t; } catch (e) { console.debug?.(e); } return Tb(t); })(), s = Number(t?.dataset?.mjrTotal || 0) || Math.max(0, Number(e?.lastGridTotal ?? 0) || 0), c = Number(t?.dataset?.mjrShown || 0) || Math.max(0, Number(e?.lastGridCount ?? 0) || 0) || a, l = String(e?.viewScope || e?.scope || t?.dataset?.mjrScope || "output").toLowerCase(), u = s && s >= c ? `${c}/${s}` : `${c}`, d = [`${c > 0 && i.total > 0 && i.folders === i.total ? xb("summary.folders") : xb("summary.assets")}: ${u}`]; o > 0 && d.push(`${xb("summary.selected")}: ${o}`), d.push(Cb(l)); try { let e = Number(t?.dataset?.mjrHiddenPngSiblings || 0) || 0; String(t?.dataset?.mjrHidePngSiblingsEnabled || "") === "1" && e > 0 && d.push(`${xb("summary.hidden")}: ${e}`); } catch (e) { console.debug?.(e); } let f = n?.duplicatesAlert || null, p = Number(f?.exactCount || 0) || 0, m = Number(f?.similarCount || 0) || 0, h = l !== "similar" && (p > 0 || m > 0); return { shown: c, total: s, activeScope: l, summaryText: d.filter(Boolean).join(" | "), duplicateText: h ? `${xb("summary.duplicates")}: ${p} | ${xb("summary.similar")}: ${m}` : "", showDuplicates: h, rawQuery: Sb(n?.rawQuery || "").trim() }; } //#endregion //#region ui/vue/components/panel/SummaryBarSection.vue var Db = { key: 2, class: "mjr-folder-breadcrumb-separator" }, Ob = { key: 0, class: "mjr-folder-breadcrumb-separator" }, kb = { class: "mjr-am-summary-left" }, Ab = { class: "mjr-am-summary-text" }, jb = { class: "mjr-am-summary-right" }, Mb = ["aria-label"], Nb = { __name: "SummaryBarSection", setup(e, { expose: t }) { let n = Dh(), r = Z(null), i = Z(null), a = Z(null), o = Z(""), s = Z(""), c = Z(!1), l = Z(!1), u = Z(null), d = Z(null), f = Z([]), p = bb(), m = G(() => String(n.kindFilter || "").trim().toLowerCase()), h = G(() => { let e = R("label.type", "Type"); return [ { kind: "image", icon: "pi pi-image", title: `${e}: ${R("filter.images", "Images")}` }, { kind: "video", icon: "pi pi-video", title: `${e}: ${R("filter.videos", "Videos")}` }, { kind: "audio", icon: "pi pi-volume-up", title: `${e}: ${R("filter.audio", "Audio")}` }, { kind: "model3d", icon: "pi pi-box", title: `${e}: 3D` } ]; }), g = null; function _() { try { g?.(); } catch (e) { console.debug?.(e); } } function v(e) { return m.value === String(e || "").trim().toLowerCase(); } function y() { try { window.dispatchEvent(new CustomEvent("mjr:filters-changed")); } catch (e) { console.debug?.(e); } } function b(e) { let t = String(e || "").trim().toLowerCase(); t && (n.kindFilter = v(t) ? "" : t, y()); } function x({ state: e, gridContainer: t, context: r = null, actions: i = null } = {}) { let a = Eb({ state: e, gridContainer: t, context: r }); n.lastGridCount = a.shown, n.lastGridTotal = a.total, n.viewScope = a.activeScope, o.value = a.summaryText, s.value = a.duplicateText, c.value = a.showDuplicates, g = a.showDuplicates ? () => { try { i?.onDuplicateAlertClick?.(r?.duplicatesAlert || null); } catch (e) { console.debug?.(e); } } : null; try { p.update({ state: e, gridContainer: t, rawQuery: a.rawQuery, actions: i }); } catch (e) { console.debug?.(e); } } function S({ visible: e = !1, back: t = null, up: n = null, items: r = [] } = {}) { l.value = !!e, u.value = t && typeof t == "object" ? t : null, d.value = n && typeof n == "object" ? n : null, f.value = Array.isArray(r) ? r.map((e) => ({ label: String(e?.label || ""), target: String(e?.target || ""), current: !!e?.current, onClick: typeof e?.onClick == "function" ? e.onClick : null })).filter((e) => e.label) : []; } function C(e) { if (!(!e || e.disabled || typeof e.onClick != "function")) try { e.onClick(); } catch (e) { console.debug?.(e); } } return fr(() => { try { a.value?.appendChild?.(p.wrap); } catch (e) { console.debug?.(e); } }), t({ summaryBar: r, updateSummaryBar: x, folderBreadcrumb: i, setFolderBreadcrumb: S }), (e, t) => { let n = gr("MButton"); return V(), Y(H, null, [U("div", { ref_key: "folderBreadcrumb", ref: i, class: X(["mjr-folder-breadcrumb", { "is-visible": l.value }]), "aria-label": "Folder breadcrumb" }, [ u.value ? (V(), nr(n, { key: 0, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", severity: "secondary", text: "", disabled: u.value.disabled, onClick: t[0] ||= (e) => C(u.value) }, { default: Q(() => [tr(q(u.value.label), 1)]), _: 1 }, 8, ["disabled"])) : W("", !0), d.value ? (V(), nr(n, { key: 1, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", severity: "secondary", text: "", disabled: d.value.disabled, onClick: t[1] ||= (e) => C(d.value) }, { default: Q(() => [tr(q(d.value.label), 1)]), _: 1 }, 8, ["disabled"])) : W("", !0), u.value || d.value ? (V(), Y("span", Db, " | ")) : W("", !0), (V(!0), Y(H, null, ar(f.value, (e, t) => (V(), Y(H, { key: `${e.target}:${t}` }, [t > 0 ? (V(), Y("span", Ob, "/")) : W("", !0), J(n, { type: "button", class: X(["mjr-btn-link mjr-folder-breadcrumb-segment", { "is-current": e.current }]), severity: "secondary", text: "", disabled: e.current, onClick: (t) => C(e) }, { default: Q(() => [tr(q(e.label), 1)]), _: 2 }, 1032, [ "class", "disabled", "onClick" ])], 64))), 128)) ], 2), U("div", { ref_key: "summaryBar", ref: r, class: "mjr-am-summary", "aria-live": "polite" }, [U("div", kb, [U("div", Ab, q(o.value), 1)]), U("div", jb, [ U("div", { class: "mjr-media-shortcuts", "aria-label": K(R)("label.type", "Type"), role: "group" }, [(V(!0), Y(H, null, ar(h.value, (e) => (V(), nr(n, { key: e.kind, type: "button", class: X(["mjr-icon-btn mjr-media-shortcut-btn", { "mjr-context-active": v(e.kind) }]), severity: "secondary", text: "", rounded: "", title: e.title, "aria-label": e.title, "aria-pressed": String(v(e.kind)), onClick: (t) => b(e.kind) }, { default: Q(() => [U("i", { class: X(e.icon), "aria-hidden": "true" }, null, 2)]), _: 2 }, 1032, [ "title", "aria-label", "aria-pressed", "class", "onClick" ]))), 128))], 8, Mb), c.value ? (V(), nr(n, { key: 0, type: "button", class: "mjr-am-dup-alert", severity: "secondary", text: "", title: s.value, onClick: _ }, { default: Q(() => [tr(q(s.value), 1)]), _: 1 }, 8, ["title"])) : W("", !0), U("div", { ref_key: "pillsHost", ref: a }, null, 512) ])], 512)], 64); }; } }; //#endregion //#region ui/vue/composables/useGridContextMenu.ts function Pb(e, t) { let n = null; function r(e) { if (!(!e || e._mjrGridContextMenuBound)) try { n = to({ gridContainer: e, getState: t }); } catch (e) { console.debug?.("[useGridContextMenu] bind failed", e); } } function i() { try { n?.(); } catch {} n = null; } ir(e, (e, t) => { t && i(), e && r(e); }, { immediate: !0 }), Or(i); } //#endregion //#region ui/vue/composables/useGridKeyboard.ts function Fb(e) { if (!e) return () => {}; let t = e; try { let n = ea({ gridContainer: e, getState: () => t._mjrGetGridState?.() || {}, getSelectedAssets: () => t._mjrGetSelectedAssets?.() || [], getActiveAsset: () => t._mjrGetActiveAsset?.() || null, onAssetChanged: (e) => { t._mjrOnKeyboardAssetChanged?.(e); }, onOpenDetails: () => { t._mjrOpenKeyboardDetails?.(); }, onOpenTagsEditor: (n) => { let r = e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${CSS?.escape ? CSS.escape(String(n?.id || "")) : n?.id || ""}"]`) || null, i = null; try { i = r?.getBoundingClientRect?.() || e.getBoundingClientRect(); } catch (e) { console.debug?.("[useGridKeyboard] rect lookup failed", e); } eo(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), n, () => { t._mjrOnKeyboardAssetChanged?.(n); }); } }); return n.bind(), t._mjrGridKeyboard = n, () => { try { n.dispose?.(); } catch (e) { console.debug?.("[useGridKeyboard] dispose failed", e); } t._mjrGridKeyboard === n && (t._mjrGridKeyboard = null); }; } catch (e) { return console.debug?.("[useGridKeyboard] bind failed", e), () => {}; } } function Ib(e) { let t = null, n = () => { try { t?.(); } catch (e) { console.debug?.("[useGridKeyboard] cleanup failed", e); } t = null; }; ir(e, (e, r) => { r && n(), e && (t = Fb(e)); }, { immediate: !0 }), Or(n); } //#endregion //#region ui/vue/components/grid/assetsGridHostState.ts function Lb() {} function Rb() { return new Promise((e) => { try { if (typeof requestAnimationFrame == "function") { requestAnimationFrame(() => e()); return; } } catch (e) { console.debug?.(e); } e(); }); } function zb(e, ...t) { try { return typeof e == "function" ? e(...t) : void 0; } catch (e) { console.debug?.(e); return; } } function Bb(e = {}) { let t = Array.isArray(e.selectedIds) ? e.selectedIds.map(String).filter(Boolean) : []; return { ids: t, activeId: String(e.activeId || t[0] || "").trim() }; } function Vb(e, t = {}, n = null) { return { count: Number(t.count ?? t.shown ?? e?.dataset?.mjrShown ?? n?.lastGridCount ?? 0) || 0, total: Number(t.total ?? e?.dataset?.mjrTotal ?? n?.lastGridTotal ?? 0) || 0 }; } function Hb(e, t = Oh()) { if (!e || !t) return Lb; let n = 0, r = () => { if (!n) try { n = requestAnimationFrame(() => { n = 0, t.scrollTop = Math.max(0, Math.floor(Number(e?.scrollTop || 0) || 0)); }); } catch (n) { console.debug?.(n), t.scrollTop = Math.max(0, Math.floor(Number(e?.scrollTop || 0) || 0)); } }; return e.addEventListener("scroll", r, { passive: !0 }), () => { try { e.removeEventListener("scroll", r); } catch (e) { console.debug?.(e); } if (n) { try { cancelAnimationFrame(n); } catch (e) { console.debug?.(e); } n = 0; } }; } function Ub(e, { panelStore: t = Oh(), onContextChanged: n = null, markUserInteraction: r = null } = {}) { if (!e) return Lb; let i = 0, a = () => { if (i) try { cancelAnimationFrame(i); } catch (e) { console.debug?.(e); } try { i = requestAnimationFrame(() => { i = 0, zb(n); }); } catch (e) { console.debug?.(e), i = 0, zb(n); } }, o = (r) => { let i = r?.detail || {}; if (t) { let { count: n, total: r } = Vb(e, i, t); t.lastGridCount = n, t.lastGridTotal = r; } zb(n); }, s = (e) => { if (zb(r), t) { let { ids: n, activeId: r } = Bb(e?.detail || {}); t.selectedAssetIds = n, t.activeAssetId = r; } zb(n); }; e.addEventListener("mjr:grid-stats", o), e.addEventListener("mjr:selection-changed", s); try { globalThis?.window?.addEventListener?.("mjr-settings-changed", o); } catch (e) { console.debug?.(e); } let c = null; try { typeof MutationObserver == "function" && (c = new MutationObserver(() => a()), c.observe(e, { childList: !0, subtree: !0 })); } catch (e) { console.debug?.(e); } return () => { try { e.removeEventListener("mjr:grid-stats", o); } catch (e) { console.debug?.(e); } try { e.removeEventListener("mjr:selection-changed", s); } catch (e) { console.debug?.(e); } try { globalThis?.window?.removeEventListener?.("mjr-settings-changed", o); } catch (e) { console.debug?.(e); } try { c?.disconnect?.(); } catch (e) { console.debug?.(e); } if (i) { try { cancelAnimationFrame(i); } catch (e) { console.debug?.(e); } i = 0; } }; } async function Wb({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, panelStore: r = Oh(), onRestoreSidebar: i = null } = {}) { if (!t || !n || !r) return; try { await e; } catch (e) { console.debug?.(e); } await Rb(); let a = Number(r.scrollTop || 0) || 0; if (a > 0) try { t.scrollTop = a; } catch (e) { console.debug?.(e); } let o = Array.isArray(r.selectedAssetIds) ? r.selectedAssetIds.map(String).filter(Boolean) : [], s = String(r.activeAssetId || o[0] || "").trim(); if (o.length || s) { try { typeof n?._mjrSetSelection == "function" && n._mjrSetSelection(o, s); } catch (e) { console.debug?.(e); } if (s) { let e = () => { try { typeof n?._mjrScrollToAssetId == "function" ? n._mjrScrollToAssetId(s) : iu(n, s)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); } catch (e) { console.debug?.(e); } }; e(), setTimeout(e, 160); } } r.sidebarOpen && s && zb(i); } //#endregion //#region ui/vue/components/grid/AssetsGrid.vue var Gb = { __name: "AssetsGrid", setup(e, { expose: t }) { let n = Z(null), r = Z(null), i = Z(null), a = Dh(), o = G(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; function d() { try { l?.setVisibility?.(); } catch (e) { console.debug?.(e); } } function f() { try { let e = o.value; e && er(e); } catch (e) { console.debug?.(e); } d(); } function p() { try { u?.(); } catch (e) { console.debug?.(e); } let e = [], t = 0, i = () => { if (!t) try { t = requestAnimationFrame(() => { t = 0, d(); }); } catch (e) { console.debug?.(e), t = 0, d(); } }; try { window.addEventListener("resize", i), e.push(() => window.removeEventListener("resize", i)); } catch (e) { console.debug?.(e); } try { if (typeof ResizeObserver == "function") { let t = new ResizeObserver(() => { i(); }), a = [ n.value, r.value, n.value?.parentElement || null ].filter(Boolean); for (let e of a) t.observe(e); e.push(() => t.disconnect()); } } catch (e) { console.debug?.(e); } try { if (typeof MutationObserver == "function") { let t = new MutationObserver(() => { i(); }), a = [ n.value, r.value, n.value?.parentElement || null ].filter(Boolean); for (let e of a) t.observe(e, { attributes: !0, attributeFilter: [ "class", "style", "hidden", "aria-hidden" ] }); e.push(() => t.disconnect()); } } catch (e) { console.debug?.(e); } u = () => { if (t) { try { cancelAnimationFrame(t); } catch (e) { console.debug?.(e); } t = 0; } for (; e.length;) { let t = e.pop(); try { t?.(); } catch (e) { console.debug?.(e); } } }; } hr("mjr-grid-container-ref", o), Pb(o, () => a), Ib(o); function m() { return o.value || null; } function h(e = {}) { let t = m(); if (t) { try { c?.(); } catch (e) { console.debug?.(e); } c = Ub(t, { panelStore: a, ...e }); } } return fr(() => { s = Hb(r.value, a), r.value && Number(a.scrollTop || 0) > 0 && (r.value.scrollTop = Number(a.scrollTop || 0)), p(); try { window.addEventListener("mjr:keepalive-attached", f), document.addEventListener("visibilitychange", d); } catch (e) { console.debug?.(e); } d(); }), lr(() => { try { Xn(m()); } catch (e) { console.debug?.(e); } try { s?.(); } catch (e) { console.debug?.(e); } s = null; try { u?.(); } catch (e) { console.debug?.(e); } u = null; try { c?.(); } catch (e) { console.debug?.(e); } c = null; try { l?.dispose?.(); } catch (e) { console.debug?.(e); } l = null; try { window.removeEventListener("mjr:keepalive-attached", f), document.removeEventListener("visibilitychange", d); } catch (e) { console.debug?.(e); } }), ir(o, (e, t) => { try { t && t !== e && Xn(t); } catch (e) { console.debug?.(e); } try { e && er(e); } catch (e) { console.debug?.(e); } }, { immediate: !0 }), t({ get browseSection() { return n.value; }, get gridWrapper() { return r.value; }, get gridContainer() { return m(); }, onGridContainerReady(e) { return e && m(), m(); }, bindGridHostState(e = {}) { return h(e), () => { try { c?.(); } catch (e) { console.debug?.(e); } c = null; }; }, restoreGridUiState(e, t = {}) { return Wb({ initialLoadPromise: e, gridWrapper: r.value, gridContainer: m(), panelStore: a, ...t }); }, initAssetsQueryController(e = {}) { let t = m(); if (!t || !r.value) return null; try { l?.dispose?.(); } catch (e) { console.debug?.(e); } return l = c_({ gridContainer: t, gridWrapper: r.value, ...e }), d(), l; }, loadAssets(...e) { return i.value?.loadAssets?.(...e); }, loadAssetsFromList(...e) { return i.value?.loadAssetsFromList?.(...e); }, prepareGridForScopeSwitch(...e) { return i.value?.prepareGridForScopeSwitch?.(...e); }, refreshGrid(...e) { return i.value?.refreshGrid?.(...e); }, captureAnchor(...e) { return i.value?.captureAnchor?.(...e); }, restoreAnchor(...e) { return i.value?.restoreAnchor?.(...e); }, hydrateGridFromSnapshot(...e) { return i.value?.hydrateFromSnapshot?.(...e); }, upsertAsset(...e) { return i.value?.upsertAsset?.(...e); }, removeAssets(...e) { return i.value?.removeAssets?.(...e); }, disposeGrid(...e) { return i.value?.dispose?.(...e); } }), (e, t) => (V(), Y("div", { ref_key: "browseSectionRef", ref: n, class: "mjr-am-browse", style: { flex: "1", display: "flex", "flex-direction": "row", overflow: "hidden" } }, [U("div", { ref_key: "gridWrapperRef", ref: r, class: "mjr-am-grid-scroll", style: { flex: "1", overflow: "auto", position: "relative" } }, [J(hd, { ref_key: "gridHostRef", ref: i, "scroll-element": r.value }, null, 8, ["scroll-element"])], 512)], 512)); } }, Kb = { class: "mjr-sidebar-header", style: { display: "flex", "align-items": "center", "justify-content": "space-between", padding: "10px 12px", "border-bottom": "1px solid var(--mjr-border,rgba(255,255,255,0.12))", "flex-shrink": "0", background: "var(--mjr-surface-2,#2e2e2e)" } }, qb = ["title"], Jb = { __name: "SidebarHeaderSection", props: { asset: { type: Object, required: !0 } }, emits: ["close"], setup(e, { emit: t }) { let n = t; return (t, r) => { let i = gr("MButton"); return V(), Y("div", Kb, [U("div", { class: "mjr-sidebar-filename", title: e.asset.filename, style: { "font-size": "0.9em", "font-weight": "600", overflow: "hidden", "text-overflow": "ellipsis", "white-space": "nowrap", flex: "1", "min-width": "0", "padding-right": "8px" } }, q(e.asset.filename), 9, qb), J(i, { type: "button", class: "mjr-sidebar-close", severity: "secondary", text: "", rounded: "", title: "Close sidebar (Esc)", "aria-label": "Close sidebar (Esc)", style: { background: "none", border: "1px solid transparent", "border-radius": "4px", color: "var(--mjr-text,#ccc)", cursor: "pointer", "font-size": "18px", "line-height": "1", padding: "2px 6px", "flex-shrink": "0", transition: "background 0.15s,border-color 0.15s" }, onClick: r[0] ||= (e) => n("close"), onMouseenter: r[1] ||= (e) => (e.currentTarget.style.background = "rgba(255,255,255,0.1)") && (e.currentTarget.style.borderColor = "rgba(255,255,255,0.2)"), onMouseleave: r[2] ||= (e) => (e.currentTarget.style.background = "none") && (e.currentTarget.style.borderColor = "transparent") }, { default: Q(() => [...r[3] ||= [tr("x", -1)]]), _: 1 })]); }; } }; //#endregion //#region ui/components/sidebar/utils/format.ts function Yb(e) { if (!e) return "Unknown"; let t = e / 1024; if (t < 1024) return `${t.toFixed(1)} KB`; let n = t / 1024; return n < 1024 ? `${n.toFixed(1)} MB` : `${(n / 1024).toFixed(2)} GB`; } function Xb(e) { if (!e) return ""; let t = /* @__PURE__ */ new Date(Number(e) * 1e3); if (Number.isNaN(t.getTime())) return ""; let n = (e) => String(e).padStart(2, "0"); return `${t.getFullYear()}-${n(t.getMonth() + 1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`; } //#endregion //#region ui/vue/components/panel/sidebar/SidebarPreviewSection.vue var Zb = { class: "mjr-sidebar-preview" }, Qb = ["src"], $b = ["src"], ex = ["src"], tx = { key: 3, style: { color: "rgba(255, 255, 255, 0.4)", "font-size": "14px" } }, nx = { class: "mjr-sidebar-preview-meta", style: { "margin-top": "10px", "font-size": "12px", color: "var(--mjr-muted, rgba(255, 255, 255, 0.65))", display: "flex", "flex-wrap": "wrap", gap: "6px", "align-items": "center", "line-height": "1.3", "padding-bottom": "12px", "border-bottom": "1px solid var(--mjr-border, rgba(255, 255, 255, 0.12))" } }, rx = { __name: "SidebarPreviewSection", props: { asset: { type: Object, required: !0 }, showPreviewThumb: { type: Boolean, default: !0 } }, setup(e) { let t = e, n = Z(null), r = null, i = G(() => ot(t.asset) || ""), a = G(() => { let e = String(t.asset?.filename || ""), n = e.lastIndexOf("."); return n === -1 ? "" : e.slice(n + 1).toUpperCase(); }), o = G(() => { let e = []; a.value && e.push(a.value), t.asset?.kind && e.push(String(t.asset.kind).toLowerCase()); let n = Yb(t.asset?.size); n && e.push(n); let r = Xb(t.asset?.mtime); return r && e.push(r), e.join(" | "); }); function s() { try { r?.destroy?.(); } catch (e) { console.debug?.(e); } r = null; } function c(e) { try { let t = e?.play?.(); t && typeof t.catch == "function" && t.catch(() => {}); } catch (e) { console.debug?.(e); } } function l() { if (s(), !t.showPreviewThumb || String(t.asset?.kind || "").toLowerCase() !== "video") return; let e = n.value, i = e?.querySelector?.("video"); if (!(!e || !i)) { c(i); try { r = Vt(i, { variant: "preview", hostEl: e }); } catch (e) { console.debug?.(e); } } } return ir(() => [t.asset, t.showPreviewThumb], () => { s(); }, { flush: "post" }), ir(i, () => { setTimeout(() => { l(); }, 0); }), fr(() => { l(); }), lr(() => { s(); }), (t, r) => (V(), Y("div", Zb, [e.showPreviewThumb ? (V(), Y("div", { key: 0, ref_key: "previewContainerRef", ref: n, style: { width: "100%", "aspect-ratio": "1", background: "black", "border-radius": "8px", overflow: "hidden", display: "flex", "align-items": "center", "justify-content": "center", position: "relative" } }, [e.asset.kind === "image" ? (V(), Y("img", { key: 0, src: i.value, style: { "max-width": "100%", "max-height": "100%", "object-fit": "contain" } }, null, 8, Qb)) : e.asset.kind === "video" ? (V(), Y("video", { key: 1, src: i.value, muted: !0, autoplay: !0, loop: !0, playsinline: "", preload: "metadata", style: { "max-width": "100%", "max-height": "100%", "object-fit": "contain" } }, null, 8, $b)) : e.asset.kind === "audio" ? (V(), Y("audio", { key: 2, src: i.value, controls: "", preload: "metadata", style: { width: "92%", "max-width": "560px" } }, null, 8, ex)) : (V(), Y("div", tx, q(String(e.asset.kind || "PREVIEW").toUpperCase()), 1))], 512)) : W("", !0), U("div", nx, q(o.value), 1)])); } }, ix = { class: "mjr-sidebar-section", style: { background: "rgba(255, 255, 255, 0.03)", border: "1px solid var(--mjr-border, rgba(255, 255, 255, 0.12))", "border-radius": "8px", padding: "10px" } }, ax = { style: { "font-size": "12px", "font-weight": "700", color: "#26a69a", "margin-bottom": "8px", "text-transform": "uppercase", "letter-spacing": "0.4px" } }, ox = { style: { display: "flex", "flex-direction": "column", gap: "6px" } }, sx = { style: { "font-size": "12px", opacity: "0.68", "min-width": "92px" } }, cx = ["title"], lx = { __name: "SidebarFolderSection", props: { asset: { type: Object, required: !0 } }, setup(e) { let t = e; function n(e) { let t = Number(e || 0); if (!Number.isFinite(t) || t <= 0) return "0 B"; let n = [ "B", "KB", "MB", "GB", "TB" ], r = t, i = 0; for (; r >= 1024 && i < n.length - 1;) r /= 1024, i += 1; return `${r.toFixed(+(i > 0))} ${n[i]}`; } let r = G(() => { let e = t.asset || {}, r = e.folder_info || e.folderInfo || {}, i = String(r.path || e.filepath || e.subfolder || ""), a = String(r.name || e.filename || "").trim(), o = Number(r.files ?? 0), s = Number(r.folders ?? 0), c = Number(r.size ?? 0), l = Number(r.mtime ?? e.mtime ?? 0), u = Number(r.ctime ?? 0), d = !!r.truncated, f = [ { label: R("sidebar.folder.name", "Name"), value: a || "-" }, { label: R("sidebar.folder.path", "Path"), value: i || "-" }, { label: R("sidebar.folder.folders", "Folders"), value: Number.isFinite(s) ? String(s) : "-" }, { label: R("sidebar.folder.files", "Files"), value: Number.isFinite(o) ? String(o) : "-" }, { label: R("sidebar.size", "Size"), value: n(c) } ]; return u > 0 && f.push({ label: R("sidebar.folder.created", "Created"), value: `${zn(u) || "-"} ${Nn(u) || ""}`.trim() }), l > 0 && f.push({ label: R("sidebar.folder.modified", "Modified"), value: `${zn(l) || "-"} ${Nn(l) || ""}`.trim() }), d && f.push({ label: R("sidebar.folder.note", "Note"), value: R("sidebar.folder.scanTruncated", "Scan was truncated for performance"), valueStyle: "color:#FFB74D;font-weight:600;" }), f; }); return (e, t) => (V(), Y("div", ix, [U("div", ax, q(K(R)("sidebar.folder.details", "Folder Details")), 1), U("div", ox, [(V(!0), Y(H, null, ar(r.value, (e) => (V(), Y("div", { key: e.label, style: { display: "flex", gap: "10px", "align-items": "flex-start", "justify-content": "space-between" } }, [U("div", sx, q(e.label), 1), U("div", { style: Cr(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), title: String(e.value || "") }, q(e.value), 13, cx)]))), 128))])])); } }, ux = [ "aria-busy", "aria-disabled", "aria-label", "aria-valuenow", "tabindex" ], dx = { __name: "RatingEditor", props: { asset: { type: Object, required: !0 }, modelValue: { type: [Number, String], default: 0 }, disabled: { type: Boolean, default: !1 }, size: { type: [Number, String], default: 16 } }, emits: ["update:modelValue", "rating-change"], setup(e, { emit: t }) { function n(e) { return Math.max(0, Math.min(5, Number(e) || 0)); } let r = e, i = t, a = n(r.asset?.rating ?? r.modelValue), o = Z(a), s = Z(0), c = Z(!1), l = a, u = a, d = null, f = G(() => s.value > 0 ? s.value : o.value), p = (e) => e <= f.value ? "#FFD45A" : "#555", m = (e) => e <= f.value ? "scale(1.1)" : "scale(1)", h = G(() => { let e = r.size; return typeof e == "number" ? `${Math.max(8, e)}px` : String(e || "").trim() || "16px"; }), g = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), _ = (e) => new Promise((t) => setTimeout(t, e)); function v(e) { if (c.value) return; let t = n(e); l = t, u = t, t !== o.value && (o.value = t); } function y(e = null) { o.value = l, u = l, i("update:modelValue", l), e && k(e, "error"); } async function x() { if (c.value) return; c.value = !0; let e = Date.now(); try { let t = 0; for (; t < 10;) { if (Date.now() - e > 3e4) { y(R("toast.ratingUpdateFailed", "Rating update failed")); break; } t > 0 && await _(g(t)), t += 1; let a = n(u), s = typeof AbortController < "u" ? new AbortController() : null; d = s; let c = null; try { c = await b(r.asset, a, s ? { signal: s.signal } : {}); } catch (e) { console.error("Failed to update rating:", e); } if (!c?.ok) { if (c?.code === "ABORTED" && u !== a) continue; y(c?.error || R("toast.ratingUpdateFailed", "Rating update failed")); break; } try { let e = c?.data?.asset_id ?? null; e != null && !Be(r.asset.id) && (r.asset.id = e); } catch (e) { console.debug?.(e); } l = a, o.value = a; try { r.asset.rating = a; } catch (e) { console.debug?.(e); } if (i("update:modelValue", a), i("rating-change", { assetId: r.asset?.id, rating: a }), Rt(ct, { assetId: r.asset?.id == null ? "" : String(r.asset.id), rating: a }), u === a) { k(R("toast.ratingSetN", { n: a }), "success", 1e3); break; } } t >= 10 && y(R("toast.ratingUpdateFailed", "Rating update failed")); } finally { d = null, c.value = !1; } } function S(e) { if (r.disabled) return; let t = n(e); u = t, o.value = t, s.value = 0, i("update:modelValue", t); try { d?.abort?.(); } catch (e) { console.debug?.(e); } x(); } function C(e) { S(e); } function w(e) { r.disabled || (s.value = e); } function T() { s.value = 0; } function E(e) { if (r.disabled) return; let t = null; switch (e.key) { case "ArrowRight": case "ArrowUp": e.preventDefault(), t = Math.min(5, o.value + 1); break; case "ArrowLeft": case "ArrowDown": e.preventDefault(), t = Math.max(0, o.value - 1); break; case "Home": e.preventDefault(), t = 0; break; case "End": e.preventDefault(), t = 5; break; default: e.key >= "0" && e.key <= "5" && (e.preventDefault(), t = parseInt(e.key, 10)); } t !== null && t !== o.value && S(t); } return lr(() => { try { d?.abort?.(); } catch (e) { console.debug?.(e); } }), ir(() => r.modelValue, (e) => { v(e); }), ir(() => r.asset?.rating, (e) => { v(e); }), (t, n) => { let r = gr("MButton"); return V(), Y("div", { class: "mjr-rating-editor", style: Cr({ display: "inline-flex", gap: "2px", pointerEvents: e.disabled ? "none" : "auto", opacity: e.disabled ? .6 : 1 }), "aria-busy": c.value, "aria-disabled": e.disabled, role: "slider", "aria-label": K(R)("rating.label", "Rating"), "aria-valuemin": 0, "aria-valuemax": 5, "aria-valuenow": o.value, tabindex: e.disabled ? -1 : 0, onKeydown: E }, [(V(), Y(H, null, ar(5, (t) => J(r, { key: t, type: "button", class: "mjr-rating-star", severity: "secondary", text: "", rounded: "", style: Cr({ color: p(t), transform: m(t), fontSize: h.value, background: "none", border: "none", cursor: e.disabled ? "default" : "pointer", padding: "0", transition: "all 0.15s ease" }), "aria-label": K(R)("rating.setN", { n: t }), "aria-pressed": t <= o.value, disabled: e.disabled, onClick: (e) => C(t), onMouseenter: (e) => w(t), onMouseleave: T }, { default: Q(() => [...n[0] ||= [tr(" ★ ", -1)]]), _: 1 }, 8, [ "style", "aria-label", "aria-pressed", "disabled", "onClick", "onMouseenter" ])), 64))], 44, ux); }; } }, fx = ["aria-label"], px = { class: "mjr-context-menu-title" }, mx = { class: "mjr-context-menu-item-left" }, hx = { key: 0, class: "mjr-context-menu-note" }, gx = { key: 1, class: "mjr-context-menu-note is-error" }, _x = { key: 2, class: "mjr-context-menu-note" }, vx = { class: "mjr-context-menu-item-left" }, yx = { key: 0, class: "mjr-context-menu-hint" }, bx = { __name: "AddToCollectionMenu", setup(e) { let t = Z(null), n = Z(!1), r = Z([]), i = Z(""), a = 0, o = null, s = G(() => ({ position: "fixed", left: `${Math.round(Number(qt.x) || 0)}px`, top: `${Math.round(Number(qt.y) || 0)}px`, display: "block", zIndex: "10004" })), c = G(() => qt.assets.length || 0), l = G(() => R("ctx.addToCollection", "Add to collection") + (c.value > 1 ? ` (${c.value})` : "")); function u({ collectionName: e, selectedCount: t, addRes: n }) { let r = Number(n?.data?.added ?? 0) || 0, i = Number(n?.data?.skipped_existing ?? 0) || 0, a = Number(n?.data?.skipped_duplicate ?? 0) || 0, o = String(e || "").trim() || R("label.collection", "collection"), s = R("msg.collectionAdd.added", "Added {added} item(s) to \"{name}\".", { added: r, name: o }); return i > 0 && (s += `\n\n${R("msg.collectionAdd.skippedExisting", "Skipped {count} item(s): already present in the collection.", { count: i })}`), a > 0 && (s += `\n\n${R("msg.collectionAdd.skippedDuplicate", "Ignored {count} duplicate(s) in selection.", { count: a })}`), r === 0 && i > 0 && t > 0 && (s = R("msg.collectionAdd.noneAddedExisting", "No new items added to \"{name}\" (all exist).", { name: o })), s; } function d() { let e = t.value; if (!qt.open || !e) return; let n = e.getBoundingClientRect(), r = Number(window.innerWidth || 0), i = Number(window.innerHeight || 0), a = Number(qt.x) || 0, o = Number(qt.y) || 0; a + n.width > r && (a = Math.max(8, r - n.width - 10)), o + n.height > i && (o = Math.max(8, i - n.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), qt.x = a, qt.y = o; } async function f() { let e = ++a; n.value = !0, i.value = ""; try { let t = await ne(); if (e !== a) return; r.value = Array.isArray(t?.data) ? t.data : []; } catch (t) { if (console.error("[AddToCollectionMenu.vue] listCollections failed:", t), e !== a) return; r.value = [], i.value = R("toast.failedLoadCollections", "Failed to load collections."); } finally { if (e === a) { n.value = !1, await or(), d(); try { t.value?.querySelector?.(".mjr-context-menu-item:not([aria-disabled=\"true\"])")?.focus?.(); } catch (e) { console.debug?.(e); } } } } async function p(e, t) { let n = Array.isArray(qt.assets) ? qt.assets : []; Nt(); let r = await h(e, n); if (!r?.ok) { k(r?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); return; } k(u({ collectionName: t, selectedCount: n.length, addRes: r }), "success", 4e3); } async function m() { let e = Array.isArray(qt.assets) ? qt.assets : []; Nt(); let t = await Et(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "My collection")); if (!t) return; let n = await E(t); if (!n?.ok) { k(n?.error || R("toast.failedCreateCollectionDot", "Failed to create collection."), "error"); return; } let r = n.data?.id, i = await h(r, e); if (!i?.ok) { k(i?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); return; } k(u({ collectionName: n.data?.name || t, selectedCount: e.length, addRes: i }), "success", 4e3); } function g(e) { t.value?.contains?.(e?.target) || Nt(); } function _(e) { e?.key === "Escape" && Nt(); } function v() { Nt(); } return ir(() => qt.open, async (e) => { e && (r.value = [], await f()); }), fr(() => { o = new AbortController(); let e = { capture: !0, passive: !0, signal: o.signal }; window.addEventListener("pointerdown", g, e), window.addEventListener("keydown", _, { capture: !0, signal: o.signal }), window.addEventListener("scroll", v, e), window.addEventListener("wheel", v, e), window.addEventListener("resize", v, { passive: !0, signal: o.signal }), window.addEventListener("mjr-close-all-menus", v, { signal: o.signal }); }), Or(() => { try { o?.abort(); } catch (e) { console.debug?.(e); } o = null, Nt(); }), (e, a) => { let o = gr("MButton"); return V(), nr(Tr, { to: "body" }, [K(qt).open ? (V(), Y("div", { key: 0, ref_key: "menuRef", ref: t, class: "mjr-add-to-collection-menu mjr-context-menu", style: Cr(s.value), role: "menu", "aria-label": l.value }, [ U("div", px, q(l.value), 1), J(o, { type: "button", class: "mjr-context-menu-item", severity: "secondary", text: "", role: "menuitem", onClick: m }, { default: Q(() => [U("span", mx, [a[0] ||= U("i", { class: "pi pi-plus" }, null, -1), U("span", null, q(K(R)("dialog.createCollection", "Create collection")) + "...", 1)])]), _: 1 }), a[2] ||= U("div", { class: "mjr-context-menu-separator" }, null, -1), n.value ? (V(), Y("div", hx, q(K(R)("msg.loadingCollections", "Loading collections...")), 1)) : i.value ? (V(), Y("div", gx, q(i.value), 1)) : r.value.length ? W("", !0) : (V(), Y("div", _x, q(K(R)("msg.noCollections", "No collections yet.")), 1)), (V(!0), Y(H, null, ar(r.value, (e) => (V(), nr(o, { key: String(e?.id || ""), type: "button", class: "mjr-context-menu-item", severity: "secondary", text: "", role: "menuitem", onClick: (t) => p(String(e?.id || ""), String(e?.name || e?.id || "")) }, { default: Q(() => [U("span", vx, [a[1] ||= U("i", { class: "pi pi-bookmark" }, null, -1), U("span", null, q(String(e?.name || e?.id || "")), 1)]), Number(e?.count || 0) > 0 ? (V(), Y("span", yx, q(Number(e?.count || 0)), 1)) : W("", !0)]), _: 2 }, 1032, ["onClick"]))), 128)) ], 12, fx)) : W("", !0)]); }; } }, xx = { key: 0, class: "mjr-context-menu-separator" }, Sx = { class: "mjr-context-menu-item-left" }, Cx = { class: "mjr-context-menu-item-right" }, wx = { key: 0, class: "mjr-context-menu-hint" }, Tx = { key: 1, class: "mjr-context-menu-submenu-arrow" }, Ex = { key: 0, class: "mjr-context-menu-separator" }, Dx = { class: "mjr-context-menu-item-left" }, Ox = { key: 0, class: "mjr-context-menu-hint" }, kx = { __name: "GridContextMenu", setup(e) { let t = Z(null), n = Z(null), r = Z(null), i = null, a = null, o = G(() => l(an.main, 10031)), s = G(() => l(an.submenu, 10032)), c = G(() => l(an.tags, 10033)); function l(e, t) { return { position: "fixed", left: `${Math.round(Number(e?.x) || 0)}px`, top: `${Math.round(Number(e?.y) || 0)}px`, display: "block", zIndex: String(t) }; } function u() { i &&= (clearTimeout(i), null); } function d() { u(), i = setTimeout(() => { yn(); }, 180); } function f(e, t) { if (!e?.open || !t) return; let n = t.getBoundingClientRect(), r = Number(window.innerWidth || 0), i = Number(window.innerHeight || 0), a = Number(e.x) || 0, o = Number(e.y) || 0; a + n.width > r && (a = Math.max(8, r - n.width - 10)), o + n.height > i && (o = Math.max(8, i - n.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), e.x = a, e.y = o; } async function p(e, t) { await or(), f(e, t?.value || null); } function m(e) { try { e?.value?.querySelector?.(".mjr-context-menu-item:not([aria-disabled=\"true\"])")?.focus?.(); } catch (e) { console.debug?.(e); } } function h(e, t) { if (!Array.isArray(e?.submenu) || !e.submenu.length) { yn(); return; } u(); let n = (t?.currentTarget)?.getBoundingClientRect?.(); rn({ x: Math.round((n?.right || an.main.x || 0) + 6), y: Math.round((n?.top || an.main.y || 0) - 4), items: e.submenu, title: e.label || "" }); } async function g(e, t, n = "main") { if (!(!e || e.type !== "item" || e.disabled)) { if (Array.isArray(e.submenu) && e.submenu.length) { h(e, t); return; } try { await e.action?.(); } catch (e) { console.error("[GridContextMenu.vue] Action failed:", e); } finally { e.closeOnSelect === !1 ? n === "submenu" && yn() : Qt(); } } } function _(e, t) { if (Array.isArray(e?.submenu) && e.submenu.length) { h(e, t); return; } yn(); } function v(e) { Array.isArray(e?.submenu) && e.submenu.length && d(); } function y() { u(); } function b() { d(); } function x(e) { let i = e?.target; t.value?.contains?.(i) || n.value?.contains?.(i) || r.value?.contains?.(i) || Qt(); } function S(e) { e?.key === "Escape" && Qt(); } function C() { Qt(); } function w(e) { String(e?.detail?.source || "") !== "grid" && Qt(); } function T(e) { let t = an.tags.asset; t && (t.tags = Array.isArray(e) ? [...e] : []); } function E(e) { let t = Array.isArray(e?.tags) ? e.tags : []; try { an.tags.onChanged?.(t); } catch (e) { console.debug?.(e); } } return ir(() => an.main.open, async (e) => { e && (await p(an.main, t), m(t)); }), ir(() => an.submenu.open, async (e) => { e && (await p(an.submenu, n), m(n)); }), ir(() => an.tags.open, async (e) => { e && await p(an.tags, r); }), fr(() => { a = new AbortController(); let e = { capture: !0, passive: !0, signal: a.signal }; window.addEventListener("pointerdown", x, e), window.addEventListener("keydown", S, { capture: !0, signal: a.signal }), window.addEventListener("scroll", C, e), window.addEventListener("wheel", C, e), window.addEventListener("resize", C, { passive: !0, signal: a.signal }), window.addEventListener("mjr-close-all-menus", w, { signal: a.signal }); }), Or(() => { u(); try { a?.abort(); } catch (e) { console.debug?.(e); } a = null, Qt(); }), (e, i) => { let a = gr("MButton"); return V(), nr(Tr, { to: "body" }, [ K(an).main.open ? (V(), Y("div", { key: 0, ref_key: "mainMenuRef", ref: t, class: "mjr-grid-context-menu mjr-context-menu", style: Cr(o.value), role: "menu", "aria-label": "Grid context menu" }, [(V(!0), Y(H, null, ar(K(an).main.items, (e) => (V(), Y(H, { key: e.id }, [e.type === "separator" ? (V(), Y("div", xx)) : (V(), nr(a, { key: 1, type: "button", class: X(["mjr-context-menu-item", { "is-disabled": e.disabled, "has-submenu": Array.isArray(e.submenu) && e.submenu.length, "is-tone-graph-map": e.tone === "graph-map", "is-tone-rename": e.tone === "rename", "is-tone-delete": e.tone === "delete", "is-tone-floating-viewer": e.tone === "floating-viewer" }]), severity: "secondary", text: "", role: "menuitem", "aria-disabled": e.disabled ? "true" : "false", tabindex: e.disabled ? -1 : 0, onClick: (t) => g(e, t), onMouseenter: (t) => _(e, t), onMouseleave: (t) => v(e) }, { default: Q(() => [U("span", Sx, [e.iconClass ? (V(), Y("i", { key: 0, class: X(e.iconClass) }, null, 2)) : W("", !0), U("span", null, q(e.label), 1)]), U("span", Cx, [e.rightHint ? (V(), Y("span", wx, q(e.rightHint), 1)) : W("", !0), Array.isArray(e.submenu) && e.submenu.length ? (V(), Y("span", Tx, " > ")) : W("", !0)])]), _: 2 }, 1032, [ "class", "aria-disabled", "tabindex", "onClick", "onMouseenter", "onMouseleave" ]))], 64))), 128))], 4)) : W("", !0), K(an).submenu.open ? (V(), Y("div", { key: 1, ref_key: "submenuRef", ref: n, class: "mjr-grid-rating-submenu mjr-context-menu", style: Cr(s.value), role: "menu", "aria-label": "Grid context submenu", onMouseenter: y, onMouseleave: b }, [(V(!0), Y(H, null, ar(K(an).submenu.items, (e) => (V(), Y(H, { key: e.id }, [e.type === "separator" ? (V(), Y("div", Ex)) : (V(), nr(a, { key: 1, type: "button", class: X(["mjr-context-menu-item", { "is-disabled": e.disabled, "is-tone-graph-map": e.tone === "graph-map", "is-tone-rename": e.tone === "rename", "is-tone-delete": e.tone === "delete", "is-tone-floating-viewer": e.tone === "floating-viewer" }]), severity: "secondary", text: "", role: "menuitem", "aria-disabled": e.disabled ? "true" : "false", tabindex: e.disabled ? -1 : 0, onClick: (t) => g(e, t, "submenu") }, { default: Q(() => [U("span", Dx, [e.iconClass ? (V(), Y("i", { key: 0, class: X(e.iconClass) }, null, 2)) : W("", !0), U("span", null, q(e.label), 1)]), e.rightHint ? (V(), Y("span", Ox, q(e.rightHint), 1)) : W("", !0)]), _: 2 }, 1032, [ "class", "aria-disabled", "tabindex", "onClick" ]))], 64))), 128))], 36)) : W("", !0), K(an).tags.open && K(an).tags.asset ? (V(), Y("div", { key: 2, ref_key: "tagsPopoverRef", ref: r, class: "mjr-grid-popover", style: Cr(c.value) }, [J(jr, { asset: K(an).tags.asset, "model-value": K(an).tags.asset?.tags || [], "onUpdate:modelValue": T, onTagsChange: E }, null, 8, ["asset", "model-value"])], 4)) : W("", !0) ]); }; } }, Ax = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, jx = { class: "mjr-workflow-picker-header" }, Mx = { class: "mjr-workflow-picker-title" }, Nx = { class: "mjr-workflow-picker-subtitle" }, Px = { class: "mjr-workflow-info-form" }, Fx = { class: "is-wide" }, Ix = { class: "mjr-workflow-picker-footer" }, Lx = { __name: "WorkflowInfoDialog", setup(e) { let t = Sr({ task: "", model_family: "", provider: "", runs_on: "", notes: "" }), n = G(() => na.workflow || null), r = G(() => String(n.value?.display_name || n.value?.filename || "Workflow")); ir(() => na.open, (e) => { if (!e) return; let r = n.value || {}; t.task = String(r.user_task || r.task || ""), t.model_family = String(r.user_model_family || r.model_family || ""), t.provider = String(r.user_provider || r.provider || ""), t.runs_on = String(r.user_runs_on || r.runs_on || ""), t.notes = String(r.notes || ""); }); function i() { ia(); } async function a() { let e = String(n.value?.filepath || "").trim(); if (!e) { k(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } let r = await _({ filepath: e, ...t }, { timeoutMs: 2e4 }); if (!r?.ok) { k(r?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); return; } k(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-info" } })), i(); } return (e, n) => (V(), nr(Tr, { to: "body" }, [K(na).open ? (V(), Y("div", { key: 0, class: "mjr-workflow-picker-backdrop", onClick: pr(i, ["self"]) }, [U("section", Ax, [ U("header", jx, [U("div", null, [U("div", Mx, q(K(R)("ctx.editWorkflowInfo", "Edit infos")), 1), U("div", Nx, q(r.value), 1)]), U("button", { type: "button", class: "mjr-workflow-picker-close", onClick: i }, [...n[5] ||= [U("i", { class: "pi pi-times" }, null, -1)]])]), U("div", Px, [ U("label", null, [n[6] ||= U("span", null, "Task", -1), sr(U("input", { "onUpdate:modelValue": n[0] ||= (e) => t.task = e, type: "text", placeholder: "I2V, I2I, T2V, Image Edit..." }, null, 512), [[Dr, t.task]])]), U("label", null, [n[7] ||= U("span", null, "Model family", -1), sr(U("input", { "onUpdate:modelValue": n[1] ||= (e) => t.model_family = e, type: "text", placeholder: "Flux, Qwen, Wan..." }, null, 512), [[Dr, t.model_family]])]), U("label", null, [n[8] ||= U("span", null, "Provider", -1), sr(U("input", { "onUpdate:modelValue": n[2] ||= (e) => t.provider = e, type: "text", placeholder: "Google, ByteDance, local..." }, null, 512), [[Dr, t.provider]])]), U("label", null, [n[10] ||= U("span", null, "Runs on", -1), sr(U("select", { "onUpdate:modelValue": n[3] ||= (e) => t.runs_on = e }, [...n[9] ||= [ U("option", { value: "" }, "Auto", -1), U("option", { value: "local" }, "local", -1), U("option", { value: "api" }, "api", -1), U("option", { value: "cloud" }, "cloud", -1) ]], 512), [[wr, t.runs_on]])]), U("label", Fx, [n[11] ||= U("span", null, "Notes", -1), sr(U("textarea", { "onUpdate:modelValue": n[4] ||= (e) => t.notes = e, rows: "5", placeholder: "Notes displayed on workflow hover" }, null, 512), [[Dr, t.notes]])]) ]), U("footer", Ix, [U("button", { type: "button", class: "mjr-workflow-picker-secondary", onClick: i }, q(K(R)("btn.cancel", "Cancel")), 1), U("button", { type: "button", class: "mjr-workflow-picker-primary", onClick: a }, q(K(R)("btn.apply", "Apply")), 1)]) ])])) : W("", !0)])); } }, Rx = { class: "mjr-workflow-picker-header" }, zx = { class: "mjr-workflow-picker-title" }, Bx = { key: 0, class: "mjr-workflow-picker-source" }, Vx = { class: "mjr-workflow-picker-toolbar" }, Hx = { class: "mjr-workflow-picker-search" }, Ux = ["placeholder"], Wx = { value: "" }, Gx = ["value"], Kx = { value: "" }, qx = ["value"], Jx = { value: "" }, Yx = ["value"], Xx = { class: "mjr-workflow-picker-body" }, Zx = { key: 0, class: "mjr-workflow-picker-empty" }, Qx = { key: 1, class: "mjr-workflow-picker-empty is-error" }, $x = { key: 2, class: "mjr-workflow-picker-empty" }, eS = ["onClick"], tS = { class: "mjr-workflow-picker-thumb" }, nS = ["src", "alt"], rS = { key: 1, class: "pi pi-sitemap" }, iS = { class: "mjr-workflow-picker-card-info" }, aS = ["disabled"], oS = { class: "mjr-workflow-picker-card-info" }, sS = { class: "mjr-workflow-picker-footer" }, cS = ["disabled"], lS = 120, uS = { __name: "WorkflowPickerDialog", setup(e) { let t = Z(""), n = Z(!1), r = Z(!1), i = Z(""), o = Z([]), s = Z(""), c = Z(0), l = Z(!1), u = 0, d = G(() => On.sourceAsset || null), f = G(() => On.workflow || null), p = G(() => String(On.mode || "") === "asset"), m = G(() => String(d.value?.filename || d.value?.display_name || f.value?.display_name || f.value?.filename || d.value?.filepath || f.value?.filepath || "")), h = G(() => x("task")), g = G(() => x("model_family")), _ = G(() => x("runs_on")), v = Z(""), y = Z(""), b = Z(""); function x(e) { let t = /* @__PURE__ */ new Set(); for (let n of o.value || []) { let r = String(n?.[e] || "").trim(); r && t.add(r); } return Array.from(t).sort((e, t) => e.localeCompare(t)); } let S = G(() => { let e = t.value.trim().toLowerCase(); return (o.value || []).filter((t) => !p.value && (v.value && String(t?.task || "") !== v.value || y.value && String(t?.model_family || "") !== y.value || b.value && String(t?.runs_on || "") !== b.value) ? !1 : !e || [ t?.display_name, t?.filename, t?.description, t?.task, t?.model_family, t?.provider, t?.subfolder, t?.kind, t?.filepath ].join(" ").toLowerCase().includes(e)); }), C = G(() => (o.value || []).find((e) => String(e?.filepath || "") === s.value) || null); function w(e) { return String(e?.display_name || e?.name || e?.filename || "Workflow"); } function T(e) { return p.value ? [e?.kind, e?.mtime ? (/* @__PURE__ */ new Date(Number(e.mtime) * 1e3)).toLocaleString() : ""].map((e) => String(e || "").trim()).filter(Boolean).join(" / ") : [ e?.task, e?.model_family, e?.runs_on, e?.subfolder ].map((e) => String(e || "").trim()).filter(Boolean).join(" / "); } function E(e) { return String(e?.thumbnail_url || e?.animated_thumbnail_url || e?.thumb_url || e?.preview_url || e?.graph_map_thumbnail_url || "").trim(); } async function D({ reset: e = !1 } = {}) { let t = ++u; e && (c.value = 0, l.value = !1); let d = e ? 0 : c.value; e ? n.value = !0 : r.value = !0, i.value = ""; try { if (p.value) { o.value = Array.isArray(On.items) ? On.items.filter((e) => String(e?.filepath || "").trim()) : [], !s.value && o.value[0]?.filepath && (s.value = String(o.value[0].filepath)); return; } let n = await a({ q: "*", limit: lS, offset: d, sort: "mtime" }, { timeoutMs: 2e4 }); if (t !== u) return; if (!n?.ok) { i.value = String(n?.error || "Failed to load workflows"), e && (o.value = []); return; } let r = (Array.isArray(n?.data?.assets) ? n.data.assets : Array.isArray(n?.data) ? n.data : []).filter((e) => String(e?.filepath || "").trim()); o.value = e ? r : [...o.value, ...r], c.value = d + r.length, l.value = r.length >= lS, !s.value && o.value[0]?.filepath && (s.value = String(o.value[0].filepath)); } catch (e) { t === u && (i.value = String(e?.message || e || "Failed to load workflows"), o.value = []); } finally { t === u && (n.value = !1, r.value = !1); } } async function O() { return D({ reset: !0 }); } async function k() { if (!(n.value || r.value || !l.value)) return D({ reset: !1 }); } function A() { C.value && Ln(C.value); } function j() { Ln(null); } function M(e) { e.key === "Escape" && (e.preventDefault(), j()); } return ir(() => On.open, (e) => { if (!e) { try { window.removeEventListener("keydown", M); } catch {} return; } s.value = "", c.value = 0, l.value = !1, t.value = "", v.value = "", y.value = "", b.value = "", O(); try { window.addEventListener("keydown", M); } catch {} }), lr(() => { try { window.removeEventListener("keydown", M); } catch {} }), (e, a) => (V(), nr(Tr, { to: "body" }, [K(On).open ? (V(), Y("div", { key: 0, class: "mjr-workflow-picker-backdrop", onMousedown: pr(j, ["self"]) }, [U("section", { class: X(["mjr-workflow-picker-dialog", { "is-asset-mode": p.value }]), role: "dialog", "aria-modal": "true" }, [ U("header", Rx, [U("div", zx, [a[4] ||= U("i", { class: "pi pi-sitemap" }, null, -1), U("span", null, q(K(On).title), 1)]), U("button", { class: "mjr-workflow-picker-icon-btn", type: "button", onClick: j }, [...a[5] ||= [U("i", { class: "pi pi-times" }, null, -1)]])]), m.value ? (V(), Y("div", Bx, [U("span", null, q(p.value ? K(R)("tab.workflow", "Workflow") : K(R)("dialog.workflowThumbnailSource", "Source")), 1), U("strong", null, q(m.value), 1)])) : W("", !0), U("div", Vx, [ U("label", Hx, [a[6] ||= U("i", { class: "pi pi-search" }, null, -1), sr(U("input", { "onUpdate:modelValue": a[0] ||= (e) => t.value = e, type: "search", placeholder: K(R)("search.workflows", "Search workflows...") }, null, 8, Ux), [[Dr, t.value]])]), p.value ? W("", !0) : sr((V(), Y("select", { key: 0, "onUpdate:modelValue": a[1] ||= (e) => v.value = e }, [U("option", Wx, q(K(R)("filter.task", "Task")), 1), (V(!0), Y(H, null, ar(h.value, (e) => (V(), Y("option", { key: e, value: e }, q(e), 9, Gx))), 128))], 512)), [[wr, v.value]]), p.value ? W("", !0) : sr((V(), Y("select", { key: 1, "onUpdate:modelValue": a[2] ||= (e) => y.value = e }, [U("option", Kx, q(K(R)("filter.model", "Model")), 1), (V(!0), Y(H, null, ar(g.value, (e) => (V(), Y("option", { key: e, value: e }, q(e), 9, qx))), 128))], 512)), [[wr, y.value]]), p.value ? W("", !0) : sr((V(), Y("select", { key: 2, "onUpdate:modelValue": a[3] ||= (e) => b.value = e }, [U("option", Jx, q(K(R)("filter.runsOn", "Runs on")), 1), (V(!0), Y(H, null, ar(_.value, (e) => (V(), Y("option", { key: e, value: e }, q(e), 9, Yx))), 128))], 512)), [[wr, b.value]]) ]), U("div", Xx, [n.value ? (V(), Y("div", Zx, q(K(R)("status.loading", "Loading...")), 1)) : i.value ? (V(), Y("div", Qx, q(i.value), 1)) : S.value.length ? (V(), Y(H, { key: 3 }, [(V(!0), Y(H, null, ar(S.value, (e) => (V(), Y("button", { key: e.filepath, type: "button", class: X(["mjr-workflow-picker-card", { "is-selected": s.value === String(e.filepath || "") }]), onClick: (t) => s.value = String(e.filepath || ""), onDblclick: A }, [U("div", tS, [E(e) ? (V(), Y("img", { key: 0, src: E(e), alt: w(e), loading: "lazy" }, null, 8, nS)) : (V(), Y("i", rS))]), U("div", iS, [ U("strong", null, q(w(e)), 1), U("span", null, q(T(e)), 1), U("small", null, q(e.filename), 1) ])], 42, eS))), 128)), !p.value && l.value ? (V(), Y("button", { key: 0, type: "button", class: "mjr-workflow-picker-card mjr-workflow-picker-load-more", disabled: r.value, onClick: k }, [a[7] ||= U("div", { class: "mjr-workflow-picker-thumb" }, [U("i", { class: "pi pi-angle-down" })], -1), U("div", oS, [ U("strong", null, q(r.value ? K(R)("status.loading", "Loading...") : K(R)("action.loadMore", "Load more")), 1), U("span", null, q(K(R)("tab.workflow", "Workflow")), 1), U("small", null, q(c.value) + " loaded", 1) ])], 8, aS)) : W("", !0)], 64)) : (V(), Y("div", $x, q(K(R)("toast.noWorkflowsFound", "No workflows found.")), 1))]), U("footer", sS, [U("button", { type: "button", class: "mjr-workflow-picker-btn", onClick: j }, q(K(R)("action.cancel", "Cancel")), 1), U("button", { type: "button", class: "mjr-workflow-picker-btn is-primary", disabled: !C.value, onClick: A }, q(K(R)("action.apply", "Apply")), 9, cS)]) ], 2)], 32)) : W("", !0)])); } }, dS = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, fS = { class: "mjr-workflow-picker-header" }, pS = { class: "mjr-workflow-picker-title" }, mS = { class: "mjr-workflow-picker-subtitle" }, hS = { class: "mjr-workflow-info-form" }, gS = { class: "is-wide" }, _S = { class: "is-wide" }, vS = { class: "mjr-workflow-picker-footer" }, yS = { __name: "WorkflowSaveInfoDialog", setup(e) { let t = Sr({ name: "", task: "", model_family: "", provider: "", runs_on: "", notes: "" }), n = G(() => L_.initial || {}), r = G(() => R("dialog.saveWorkflowWithInfo", "Save workflow")), i = G(() => R("dialog.workflowInfoAutoFallback", "Leave fields empty to use automatic workflow detection.")); ir(() => L_.open, (e) => { if (!e) return; let r = n.value || {}; t.name = String(r.name || r.workflow?.name || r.workflow?.title || "workflow").trim(), t.task = String(r.task || ""), t.model_family = String(r.model_family || ""), t.provider = String(r.provider || ""), t.runs_on = String(r.runs_on || ""), t.notes = String(r.notes || ""); }); function a() { z_(null); } function o() { let e = String(t.name || "").trim(); e && z_({ name: e, task: String(t.task || "").trim(), model_family: String(t.model_family || "").trim(), provider: String(t.provider || "").trim(), runs_on: String(t.runs_on || "").trim(), notes: String(t.notes || "").trim() }); } return (e, n) => { let s = gr("MButton"), c = gr("MInputText"), l = gr("MSelect"), u = gr("MTextarea"); return V(), nr(Tr, { to: "body" }, [K(L_).open ? (V(), Y("div", { key: 0, class: "mjr-workflow-picker-backdrop", onClick: pr(a, ["self"]) }, [U("section", dS, [ U("header", fS, [U("div", null, [U("div", pS, q(r.value), 1), U("div", mS, q(i.value), 1)]), J(s, { type: "button", class: "mjr-workflow-picker-close", onClick: a }, { default: Q(() => [...n[6] ||= [U("i", { class: "pi pi-times" }, null, -1)]]), _: 1 })]), U("div", hS, [ U("label", gS, [U("span", null, q(K(R)("dialog.workflowSaveName", "Workflow name")), 1), J(c, { modelValue: t.name, "onUpdate:modelValue": n[0] ||= (e) => t.name = e, type: "text", placeholder: "workflow", onKeydown: Er(pr(o, ["prevent"]), ["enter"]) }, null, 8, ["modelValue", "onKeydown"])]), U("label", null, [n[7] ||= U("span", null, "Task", -1), J(c, { modelValue: t.task, "onUpdate:modelValue": n[1] ||= (e) => t.task = e, type: "text", placeholder: "Auto" }, null, 8, ["modelValue"])]), U("label", null, [n[8] ||= U("span", null, "Model family", -1), J(c, { modelValue: t.model_family, "onUpdate:modelValue": n[2] ||= (e) => t.model_family = e, type: "text", placeholder: "Auto" }, null, 8, ["modelValue"])]), U("label", null, [n[9] ||= U("span", null, "Provider", -1), J(c, { modelValue: t.provider, "onUpdate:modelValue": n[3] ||= (e) => t.provider = e, type: "text", placeholder: "Auto" }, null, 8, ["modelValue"])]), U("label", null, [n[10] ||= U("span", null, "Runs on", -1), J(l, { modelValue: t.runs_on, "onUpdate:modelValue": n[4] ||= (e) => t.runs_on = e, options: [ { label: "Auto", value: "" }, { label: "local", value: "local" }, { label: "api", value: "api" }, { label: "cloud", value: "cloud" } ], "option-label": "label", "option-value": "value", placeholder: "Auto" }, null, 8, ["modelValue"])]), U("label", _S, [n[11] ||= U("span", null, "Notes", -1), J(u, { modelValue: t.notes, "onUpdate:modelValue": n[5] ||= (e) => t.notes = e, rows: "5", placeholder: "Notes displayed on workflow hover" }, null, 8, ["modelValue"])]) ]), U("footer", vS, [J(s, { type: "button", class: "mjr-workflow-picker-secondary", onClick: a }, { default: Q(() => [tr(q(K(R)("btn.cancel", "Cancel")), 1)]), _: 1 }), J(s, { type: "button", class: "mjr-workflow-picker-primary", disabled: !String(t.name || "").trim(), onClick: o }, { default: Q(() => [tr(q(K(R)("btn.save", "Save")), 1)]), _: 1 }, 8, ["disabled"])]) ])])) : W("", !0)]); }; } }, bS = { __name: "ContextMenuPortal", setup(e) { let t = Z(""), n = G(() => vn(t.value)); return fr(() => { t.value = Un(); }), Or(() => { Rn(t.value), t.value = ""; }), (e, t) => n.value ? (V(), Y(H, { key: 0 }, [ J(kx), J(bx), J(uS), J(Lx), J(yS) ], 64)) : W("", !0); } }, xS = { class: "mjr-sidebar-content", style: { flex: "1", "overflow-y": "auto", padding: "10px 12px", display: "flex", "flex-direction": "column", gap: "16px" } }, SS = { class: "mjr-sidebar-rating-tags", style: { display: "flex", "flex-direction": "column", gap: "10px" } }, CS = { style: { display: "flex", "align-items": "center", gap: "8px" } }, wS = { style: { "font-size": "0.8em", opacity: "0.6", "min-width": "44px" } }, TS = { style: { display: "flex", "flex-direction": "column", gap: "4px" } }, ES = { style: { "font-size": "0.8em", opacity: "0.6" } }, DS = { __name: "AssetSidebarContent", props: { asset: { type: Object, required: !0 }, onUpdate: { type: Function, default: null }, sidebar: { type: Object, default: null } }, emits: ["close"], setup(e, { emit: t }) { let r = e, i = t, a = G(() => String(r.asset?.kind || "").toLowerCase() === "folder"), o = G(() => { let e = String(r.asset?.kind || "").toLowerCase(), t = String(r.asset?.source || r.asset?.scope || "").toLowerCase(), n = String(r.asset?.filepath || r.asset?.path || "").toLowerCase(); return e === "workflow" || t === "workflow" || n.endsWith(".json"); }), s = G(() => Number(r.asset?.rating) || 0), c = G(() => r.asset?.tags || []), l = G(() => { try { return !!(mn()?.sidebar?.showPreviewThumb ?? !0); } catch { return !0; } }); function u() { if (r.sidebar) try { gh(r.sidebar); } catch (e) { console.debug?.(e); } else i("close"); } let d = Z(!1), f = G(() => String(r.asset?.filepath || r.asset?.path || r.asset?.file_info?.filepath || "").trim()); async function p() { if (!(d.value || !f.value)) { d.value = !0; try { k(R("toast.collectingFiles", "Collecting files..."), "info", 2500); let e = await n(f.value); if (!e?.ok) { k(e?.error || R("toast.collectFilesFailed", "Collect files failed"), "error"); return; } let t = e?.data || {}, r = Array.isArray(t.missing) ? t.missing.length : 0, i = t.fallback_used ? R("toast.collectFallbackDir", "output folder (source folder not writable)") : R("toast.collectSameDir", "asset folder"), a = R("toast.collectedFiles", "Collected {name} in {where}", { name: String(t.zip_name || "zip"), where: i }); r > 0 && (a += ` \u2014 ${r} ${R("toast.collectMissingInputs", "input(s) missing")}`), k(a, r > 0 ? "warning" : "success", 6e3); } catch (e) { console.debug?.(e), k(R("toast.collectFilesFailed", "Collect files failed"), "error"); } finally { d.value = !1; } } } return (t, n) => { let r = gr("MButton"); return V(), Y(H, null, [ J(Jb, { asset: e.asset, onClose: u }, null, 8, ["asset"]), U("div", xS, [a.value ? (V(), nr(lx, { key: 0, asset: e.asset }, null, 8, ["asset"])) : (V(), Y(H, { key: 1 }, [o.value ? W("", !0) : (V(), Y(H, { key: 0 }, [ J(rx, { asset: e.asset, "show-preview-thumb": l.value }, null, 8, ["asset", "show-preview-thumb"]), U("div", SS, [U("div", CS, [U("span", wS, q(K(R)("sidebar.rating", "Rating")), 1), J(dx, { asset: e.asset, "model-value": s.value, size: 60 }, null, 8, ["asset", "model-value"])]), U("div", TS, [U("span", ES, q(K(R)("sidebar.tags", "Tags")), 1), J(jr, { asset: e.asset, "model-value": c.value }, null, 8, ["asset", "model-value"])])]), J(An, { asset: e.asset }, null, 8, ["asset"]), f.value ? (V(), nr(r, { key: 0, type: "button", class: "mjr-btn mjr-sidebar-collect-btn", severity: "secondary", disabled: d.value, title: K(R)("sidebar.collectFilesTooltip", "Create a ZIP next to this asset with the workflow JSON, its media inputs and a manifest"), style: { display: "flex", "align-items": "center", "justify-content": "center", gap: "6px", width: "100%" }, onClick: p }, { default: Q(() => [U("i", { class: X(d.value ? "pi pi-spin pi-spinner" : "pi pi-box") }, null, 2), U("span", null, q(d.value ? K(R)("sidebar.collectingFiles", "Collecting...") : K(R)("sidebar.collectFiles", "Collect files")), 1)]), _: 1 }, 8, ["disabled", "title"])) : W("", !0), J(Fn, { asset: e.asset }, null, 8, ["asset"]) ], 64)), J(Bn, { asset: e.asset }, null, 8, ["asset"])], 64))]), J(bS) ], 64); }; } }, OS = { key: 1, class: "mjr-sidebar-placeholder", style: { flex: "1", display: "flex", "align-items": "center", "justify-content": "center", padding: "20px", opacity: "0.4", "font-size": "0.85em", "text-align": "center" } }, kS = { __name: "SidebarSection", setup(e, { expose: t }) { let n = Z(null), { activeAsset: r, onUpdateCallback: i } = ih(); return fr(() => { let e = n.value; if (!e) return; e.style.flex = "0 0 0px", e.style.width = "0", e.style.maxWidth = "0", e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = "none", e.style.borderRight = "none", e._requestSeq = 0, e._currentAsset = null, e._currentFullAsset = null, e._ratingTagsSection = null; let t = (t) => { let n = e._currentAsset?.id ?? e._currentFullAsset?.id ?? r.value?.id; return n == null || t == null ? !1 : String(n) === String(t); }, a = (n) => { let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Number(r.rating); if (!(!t(a) || !Number.isFinite(o))) { sh({ rating: o }, i.value); try { e._currentAsset && (e._currentAsset.rating = o), e._currentFullAsset && (e._currentFullAsset.rating = o); } catch (e) { console.debug?.(e); } } }, o = (n) => { let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Array.isArray(r.tags) ? r.tags : null; if (!(!t(a) || !o)) { sh({ tags: o }, i.value); try { e._currentAsset && (e._currentAsset.tags = o), e._currentFullAsset && (e._currentFullAsset.tags = o); } catch (e) { console.debug?.(e); } } }, s = [], c = typeof AbortController < "u" ? new AbortController() : null; e._mjrAbortController = c, e.dispose = () => { try { c?.abort?.(); } catch (e) { console.debug?.(e); } for (let e of s.splice(0)) try { e?.(); } catch (e) { console.debug?.(e); } }, e._dispose = e.dispose; let l = c ? { signal: c.signal } : void 0; try { window.addEventListener(ct, a, l), window.addEventListener(nt, o, l); } catch (e) { console.debug?.(e); try { window.addEventListener(ct, a), window.addEventListener(nt, o), s.push(() => window.removeEventListener(ct, a)), s.push(() => window.removeEventListener(nt, o)); } catch (e) { console.debug?.(e); } } }), Or(() => { try { n.value?.dispose?.(); } catch {} try { n.value?._currentFetchAbortController?.abort?.(); } catch {} }), t({ get sidebar() { return n.value; } }), (e, t) => (V(), Y("div", { ref_key: "sidebarEl", ref: n, class: "mjr-inline-sidebar", "data-position": "right", style: { display: "flex", "flex-direction": "column", background: "var(--mjr-surface-1,#262626)", transition: "width 140ms ease,max-width 140ms ease,flex-basis 140ms ease,border-color 140ms ease", contain: "layout paint style" } }, [K(r) ? (V(), nr(DS, { key: 0, asset: K(r), "on-update": K(i), sidebar: n.value }, null, 8, [ "asset", "on-update", "sidebar" ])) : (V(), Y("div", OS, q(K(R)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); } }, AS = { __name: "App", setup(e) { let t = Z(null), n = Z(null), r = Z(null), i = Z(null), a = Z(null), o = Z(null), s = null; return fr(async () => { if (!t.value) return; let e = {}; n.value && (e.statusSection = n.value.statusSection, e.statusDot = n.value.statusDot, e.statusText = n.value.statusText, e.capabilitiesSection = n.value.capabilitiesSection), r.value && (e.headerSection = r.value), i.value && (e.summaryBar = i.value.summaryBar, e.updateSummaryBar = i.value.updateSummaryBar, e.folderBreadcrumb = i.value.folderBreadcrumb, e.folderBreadcrumbController = i.value), a.value && (e.browseSection = a.value.browseSection, e.gridWrapper = a.value.gridWrapper, e.gridContainer = a.value.gridContainer, e.onGridContainerReady = (...e) => a.value?.onGridContainerReady?.(...e), e.bindGridHostState = (...e) => a.value?.bindGridHostState?.(...e), e.restoreGridUiState = (...e) => a.value?.restoreGridUiState?.(...e), e.initAssetsQueryController = (...e) => a.value?.initAssetsQueryController?.(...e), e.loadAssets = (e, t = "*", n = {}) => a.value?.loadAssets?.(t, n), e.loadAssetsFromList = (e, t = [], n = {}) => a.value?.loadAssetsFromList?.(t, n), e.prepareGridForScopeSwitch = (e) => a.value?.prepareGridForScopeSwitch?.(), e.refreshGrid = (e) => a.value?.refreshGrid?.(), e.captureAnchor = (e) => a.value?.captureAnchor?.(), e.restoreAnchor = (e, t) => a.value?.restoreAnchor?.(t), e.hydrateGridFromSnapshot = (e, t = {}, n = {}) => a.value?.hydrateGridFromSnapshot?.(t, n), e.upsertAsset = (e, t) => a.value?.upsertAsset?.(t), e.removeAssets = (e, t = [], n = {}) => a.value?.removeAssets?.(t, n), e.disposeGrid = (e) => a.value?.disposeGrid?.()), o.value && (e.sidebar = o.value.sidebar); try { s = await P_(t.value, { useComfyThemeUI: !0, external: e }); } catch (e) { console.warn("[Majoor] App.vue: mountAssetsManagerPanelRuntime failed", e); } try { Dh().validatePersistedCustomRoot?.(); } catch {} }), Or(() => { try { s?.dispose?.(); } catch {} s = null; }), (e, s) => (V(), Y(H, null, [ J(I_, { ref_key: "statusSectionRef", ref: n }, null, 512), J(hb, { ref_key: "headerSectionRef", ref: r }, null, 512), J(Nb, { ref_key: "summaryBarSectionRef", ref: i }, null, 512), J(Gb, { ref_key: "assetsGridRef", ref: a }, null, 512), J(kS, { ref_key: "sidebarSectionRef", ref: o }, null, 512), J(bS), U("div", { ref_key: "containerRef", ref: t, class: "mjr-vue-root", style: { height: "100%", width: "100%", overflow: "hidden", "box-sizing": "border-box" } }, null, 512) ], 64)); } }, jS = { __name: "GeneratedFeedApp", setup(e) { let t = Z(null), n = null; function r(e) { if (!e) return; let t = [ e, e.parentElement, e.parentElement?.parentElement ]; for (let e = 0; e < t.length; e += 1) { let n = t[e]; if (!(!n || !(n instanceof HTMLElement))) try { n.style.minHeight = "0", e <= 1 && (n.style.height = "100%", n.style.width = "100%", n.style.overflow = "hidden", n.style.display = "flex", n.style.flexDirection = "column"); } catch (e) { console.debug?.(e); } } } return fr(() => { if (t.value) try { r(t.value), n = pf(t.value); } catch (e) { console.warn("[Majoor] GeneratedFeedApp.vue: createGeneratedFeedHost failed", e); } }), Or(() => { try { mf(n); } catch {} n = null; }), (e, n) => (V(), Y(H, null, [J(bS), U("div", { ref_key: "containerRef", ref: t, class: "mjr-vue-feed-root", style: { height: "100%", width: "100%", "min-height": "0", overflow: "hidden", display: "flex", "flex-direction": "column", "box-sizing": "border-box" } }, null, 512)], 64)); } }, MS = "data-mjr-topbar-mfv-host", NS = "data-mjr-topbar-mfv-button", PS = "data-mjr-topbar-mfv-slot", FS = "label.floatingViewer", IS = "Viewer", LS = "V", RS = "viewer.mfvTopbarButton", zS = null, BS = null, VS = null, HS = null, US = null, WS = null, GS = !1, KS = null, qS = !1, JS = !1; function YS(e) { if (!(zS && BS === e)) { if (!e) { !VS && typeof MutationObserver < "u" && (VS = new MutationObserver(() => { XS() && (VS?.disconnect?.(), VS = null, uC()); }), VS.observe(document.body, { childList: !0, subtree: !0 })); return; } try { zS?.disconnect?.(); } catch {} zS = new MutationObserver(() => uC()), zS.observe(e, { childList: !0 }), BS = e; try { VS?.disconnect?.(); } catch {} VS = null; } } function XS() { return typeof document > "u" ? null : document.querySelector(".actionbar-container"); } function ZS(e = XS()) { if (typeof document > "u") return; let t = document.documentElement?.style; if (!t) return; if (!e) { t.setProperty("--mjr-mfv-top-offset", "60px"); return; } let n = e.getBoundingClientRect(), r = Math.max(60, Math.ceil(n.bottom + 12)); t.setProperty("--mjr-mfv-top-offset", `${r}px`); } function QS(e) { return e && e.querySelector(".queue-button-group") || null; } function $S(e) { if (!e) return null; let t = e.querySelector(`[${PS}]`); t || (t = document.createElement("div"), t.setAttribute(PS, "1"), t.className = "flex h-full items-center pointer-events-auto", t.style.position = "relative", t.style.zIndex = "10030", t.style.padding = "0 4px"); let n = QS(e), r = n?.parentElement || e; return t.parentElement === r ? n && r && t.previousElementSibling !== n ? r.insertBefore(t, n.nextSibling) : !n && t !== r.lastElementChild && r.appendChild(t) : n && r ? r.insertBefore(t, n.nextSibling) : r.appendChild(t), t; } function eC(e = "pi pi-eye") { let t = document.createElement("i"); return t.className = e, t.setAttribute("aria-hidden", "true"), t; } function tC(e = "Viewer") { let t = document.createElement("span"); return t.className = "mjr-topbar-mfv-label", t.textContent = e, t; } function nC(e) { if (!e) return; let t = qS ? R("tooltip.closeMFV", "Close Floating Viewer") : R("tooltip.openMFV", "Open Floating Viewer"); zt(e, t, LS, { ariaLabel: t }), e.setAttribute("aria-pressed", qS ? "true" : "false"), e.classList.toggle("primary", qS), e.classList.toggle("mjr-topbar-mfv-active", qS), e.replaceChildren(eC(qS ? "pi pi-eye-slash" : "pi pi-eye"), tC(R(FS, IS))); } function rC() { try { window.dispatchEvent(new Event(B.MFV_TOGGLE)); } catch (e) { console.debug?.("[Majoor] top bar MFV launch failed", e); } uC(); } function iC() { let e = document.createElement("button"); return e.type = "button", e.setAttribute(NS, "1"), e.className = "comfyui-button mjr-topbar-mfv-button", e.style.position = "relative", e.style.zIndex = "10030", e.style.width = "auto", e.style.height = "32px", e.style.minWidth = "32px", e.style.padding = "0 10px", e.style.gap = "6px", e.style.display = "inline-flex", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.whiteSpace = "nowrap", e.addEventListener("click", rC), nC(e), e; } function aC() { let e = document.createElement("div"); return e.setAttribute(MS, "1"), e.className = "mjr-topbar-mfv-button-host", e.style.position = "relative", e.appendChild(iC()), e; } function oC() { if (typeof document > "u" || JS) return; let e = !!document.querySelector(".mjr-mfv.is-visible"); qS !== e && (qS = e); } function sC() { return z.MFV_TOPBAR_BUTTON !== !1; } function cC() { try { document.querySelector(`[${MS}]`)?.remove?.(), document.querySelector(`[${PS}]`)?.remove?.(); } catch (e) { console.debug?.(e); } } function lC() { let e = XS(); if (!e) return ZS(null), null; if (!sC()) return cC(), ZS(e), null; YS(e), oC(); let t = $S(e); if (!t) return ZS(e), null; let n = t.querySelector(`[${MS}]`); return n ||= aC(), n.parentElement !== t && t.replaceChildren(n), ZS(e), nC(n.querySelector(`[${NS}]`)), t; } function uC() { GS || (GS = !0, KS = window.setTimeout(() => { GS = !1, KS = null, lC(); }, 32)); } function dC() { return typeof window > "u" || typeof document > "u" || !document.body ? !1 : (uC(), HS || (HS = (e) => { qS = !!e?.detail?.visible, JS = !0, uC(); }, window.addEventListener(B.MFV_VISIBILITY_CHANGED, HS)), US || (US = () => uC(), window.addEventListener("resize", US)), WS || (WS = (e) => { let t = e?.detail?.key; (t === RS || t === "storage") && uC(); }, window.addEventListener("mjr-settings-changed", WS)), YS(XS()), !0); } function fC() { try { zS?.disconnect?.(); } catch (e) { console.debug?.(e); } zS = null, BS = null; try { VS?.disconnect?.(); } catch (e) { console.debug?.(e); } VS = null; try { KS && window.clearTimeout(KS); } catch (e) { console.debug?.(e); } KS = null, HS && typeof window < "u" && window.removeEventListener(B.MFV_VISIBILITY_CHANGED, HS), HS = null, US && typeof window < "u" && window.removeEventListener("resize", US), US = null, WS && typeof window < "u" && window.removeEventListener("mjr-settings-changed", WS), WS = null, GS = !1, qS = !1, JS = !1; try { document.documentElement?.style?.setProperty("--mjr-mfv-top-offset", "60px"), document.querySelector(`[${MS}]`)?.remove?.(), document.querySelector(`[${PS}]`)?.remove?.(); } catch (e) { console.debug?.(e); } } //#endregion //#region ui/features/runtime/entryUiRegistration.ts var pC = "mjr-global-runtime-root", mC = "_mjrGlobalRuntimeVueApp", hC = "_mjrSidebarVueApp", gC = "_mjrFeedVueApp", _C = "majoor-generated-feed", vC = null; function yC() { if (typeof document > "u" || !document?.body) return null; let e = document.getElementById(pC); return e || (e = document.createElement("div"), e.id = pC, e.setAttribute("role", "presentation"), e.style.cssText = "position:fixed;inset:0;overflow:visible;pointer-events:none;z-index:10020;", document.body.appendChild(e), e); } function bC() { try { let e = yC(); if (!e) return !1; let t = !!En(e, $p, mC); return dC(), t; } catch { return !1; } } function xC() { try { fC(); let e = document.getElementById(pC); if (!e) return; Dn(e, mC), e.remove?.(); } catch {} } function SC(e, t) { let n = Ge(e, t); if (np(), !n) try { window.dispatchEvent(new Event(B.OPEN_ASSETS_MANAGER)); } catch (e) { console.debug?.(e); } return n; } function CC() { try { window.dispatchEvent(new CustomEvent(B.RELOAD_GRID, { detail: { reason: "command" } })); } catch (e) { console.debug?.(e); } } function wC(e) { let t = Qe(e, _C); if (!t) try { Xd(); } catch (e) { console.debug?.(e); } return t; } async function TC() { try { let e = await le(lt.BROWSE_FOLDER, {}); if (e?.ok) return String(e?.data?.path || "").trim(); let t = String(e?.code || "").trim(); t && t !== "CANCELLED" && k(e?.error || R("toast.nativeFolderBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), "warning", 3500); } catch (e) { console.debug?.(e), k(R("toast.nativeFolderBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), "warning", 3500); } return ""; } async function EC(e, { settingId: t, settingsPathKey: n, save: r, successMessage: i, restartRequired: a = !1 }) { let o = await TC(); if (!o) return !1; let s = await r(o); if (!s?.ok) return k(s?.error || R("toast.settingsPathSaveFailed", "Failed to save path"), "error"), !1; try { let r = mn(); r.paths = r.paths || {}, r.paths[n] = o, Xt(r), Le(e, t, o), window.dispatchEvent(new CustomEvent(B.SETTINGS_CHANGED, { detail: { key: `paths.${n}`, value: o } })); } catch (e) { console.debug?.(e); } return k(a ? `${i} ${R("toast.restartComfyUiToApply", "Restart ComfyUI to apply.")}` : i, "success", 2800), !0; } function DC(e) { return XC(e).find(YC) || null; } function OC(e) { let t = String(e?.id ?? e?.nodeId ?? e?.node_id ?? "").trim(); if (!t) return null; let n = String(e?.comfyClass || e?.type || e?.constructor?.type || "").trim(); return { source_node_id: t, sourceNodeId: t, source_node_type: n, sourceNodeType: n, title: String(e?.title || e?.properties?.title || e?.properties?.name || n || "").trim() }; } async function kC(e) { if (!e) return []; try { let t = (await import("./chunks/NodeStreamController-DpGjUOfx.js")).extractNodeFileData?.(e), n = String(t?.filename || "").trim(); return n ? [{ filename: n, subfolder: String(t?.subfolder || ""), type: String(t?.type || "output"), kind: String(t?.kind || "") }] : []; } catch (e) { return console.debug?.(e), []; } } function AC(e) { try { if (typeof window > "u") return; window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.pendingNodeContext = e, window.dispatchEvent(new CustomEvent(B.OPEN_NODE_CONTEXT, { detail: e })); } catch (e) { console.debug?.(e); } } async function jC(e, t, n) { SC(e, t); let r = OC(n) || {}, i = await kC(n); i.length && (r.files = i); let a = String(n?.comfyClass || n?.type || "").toLowerCase(); return i.length && /load|upload/.test(a) && (delete r.source_node_id, delete r.sourceNodeId), !r.source_node_id && !i.length ? (k(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1) : (AC(r), !0); } async function MC(e) { try { let t = await kC(e); if (t.length) { let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-BVG4XDLW.js").then((e) => e.n); if (await e.openAssets({ assets: t, index: 0 })) return !0; } } catch (e) { console.debug?.(e); } try { window.dispatchEvent(new Event(B.MFV_OPEN)); } catch (e) { console.debug?.(e); } return !1; } function NC(e, t) { let n = vC; return n ? (jC(e, t, n), !0) : (k(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1); } function PC(e, { sidebarTabId: t, triggerStartupScan: n }) { return [ { id: "mjr.openAssetsManager", label: R("manager.title", "Assets Manager"), tooltip: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), title: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), description: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), icon: "pi pi-folder-open", function: () => SC(e, t) }, { id: "mjr.scanAssets", label: R("command.scanAssets", "Scan assets"), icon: "pi pi-refresh", function: () => n() }, { id: "mjr.toggleFloatingViewer", label: R("command.toggleFloatingViewer", "Toggle floating viewer"), icon: "pi pi-images", function: () => { try { window.dispatchEvent(new Event(B.MFV_TOGGLE)); } catch (e) { console.debug?.(e); } } }, { id: "mjr.refreshAssetsGrid", label: R("command.refreshAssetsGrid", "Refresh assets grid"), icon: "pi pi-sync", function: () => CC() }, { id: "mjr.openFloatingViewer", label: R("command.openFloatingViewer", "Open floating viewer"), tooltip: R("tooltip.openFloatingViewer", "Open Majoor floating viewer"), title: R("tooltip.openFloatingViewer", "Open Majoor floating viewer"), description: R("tooltip.openFloatingViewer", "Open Majoor floating viewer"), icon: "pi pi-window-maximize", function: () => { try { window.dispatchEvent(new Event(B.MFV_OPEN)); } catch (e) { console.debug?.(e); } } }, { id: "mjr.openGeneratedFeed", label: R("command.openGeneratedFeed", "Open generated feed"), tooltip: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), title: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), description: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), icon: "pi pi-list", function: () => wC(e) }, { id: "mjr.openSettings", label: R("command.openSettings", "Open Majoor settings"), icon: "pi pi-cog", function: () => Jn(e) }, { id: "mjr.pickOutputDirectory", label: R("command.pickOutputDirectory", "Pick output directory"), tooltip: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), title: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), description: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), icon: "pi pi-folder", function: () => EC(e, { settingId: "Majoor.Paths.OutputDirectory", settingsPathKey: "outputDirectory", save: ue, successMessage: R("toast.outputDirectorySaved", "Output directory saved.") }) }, { id: "mjr.pickIndexDirectory", label: R("command.pickIndexDirectory", "Pick index directory"), tooltip: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), title: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), description: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), icon: "pi pi-database", function: () => EC(e, { settingId: "Majoor.Paths.IndexDirectory", settingsPathKey: "indexDirectory", save: w, successMessage: R("toast.indexDirectorySaved", "Index directory saved."), restartRequired: !0 }) }, { id: "mjr.openNodeContext", label: R("command.openNodeContext", "Show assets from selected node"), tooltip: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), title: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), description: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), icon: "pi pi-sitemap", function: () => NC(e, t) }, { id: "mjr.openNodeInFloatingViewer", label: R("command.openNodeInFloatingViewer", "Open node media in floating viewer"), tooltip: R("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), title: R("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), description: R("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), icon: "pi pi-window-maximize", function: () => { MC(vC); } } ]; } function FC() { return [{ combo: { alt: !0, shift: !0, key: "a" }, commandId: "mjr.openAssetsManager" }, { combo: { alt: !0, shift: !0, key: "v" }, commandId: "mjr.toggleFloatingViewer" }]; } function IC() { return [{ path: ["Extensions", "Majoor Assets Manager"], commands: [ "mjr.openAssetsManager", "mjr.openFloatingViewer", "mjr.openGeneratedFeed", "mjr.refreshAssetsGrid", "mjr.scanAssets", "mjr.openSettings", "mjr.pickOutputDirectory", "mjr.pickIndexDirectory" ] }]; } function LC(e, { sidebarTabId: t, triggerStartupScan: n }) { return [null, { content: "Majoor Assets Manager", submenu: { options: [ { content: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), callback: () => SC(e, t) }, { content: R("command.openFloatingViewer", "Open floating viewer"), callback: () => { try { window.dispatchEvent(new Event(B.MFV_OPEN)); } catch (e) { console.debug?.(e); } } }, { content: R("command.openGeneratedFeed", "Open generated feed"), callback: () => wC(e) }, null, { content: R("command.refreshAssetsGrid", "Refresh assets grid"), callback: () => CC() }, { content: R("command.scanAssets", "Scan assets"), callback: () => n() }, { content: R("command.openSettings", "Open Majoor settings"), callback: () => Jn(e) } ] } }]; } function RC() { return [ { label: "Majoor Assets Manager", icon: "pi pi-folder" }, { label: "v2.5.1", icon: "pi pi-tag" }, { label: "Docs", icon: "pi pi-book", url: "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager/blob/main/user_guide.html" } ]; } function zC(e, t) { for (let n of PC(e, t)) Ie(e, n); } function BC(e) { for (let t of FC()) Ve(e, t); } function VC(e, { sidebarTabId: t }) { return ep({ sidebarTabId: t }), He(e, { id: t, icon: "pi pi-folder", title: R("manager.title"), label: R("manager.sidebarLabel"), tooltip: R("tooltip.sidebarTab"), type: "custom", render(e) { np(), ii({ idleOnly: !0 }).catch(() => null), En(e, AS, hC), setTimeout(() => { let e = ap(); if (e) try { window.dispatchEvent(new CustomEvent(B.RELOAD_GRID, { detail: { reason: "pending-generated-assets", pending: e } })); } catch (e) { console.debug?.(e); } }, 0); }, destroy(e) {} }); } function HC() { try { Dn(null, hC); } catch {} } var UC = !1, WC = "mjr-sidebar-prewarm-host"; function GC() { if (UC || typeof document > "u" || !document?.body) return !1; UC = !0; try { let e = document.getElementById(WC); return e || (e = document.createElement("div"), e.id = WC, e.style.cssText = "position:fixed;left:-99999px;top:0;width:360px;height:600px;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict;", e.setAttribute("aria-hidden", "true"), document.body.appendChild(e)), En(e, AS, hC), !0; } catch (e) { return console.debug?.(e), UC = !1, !1; } } function KC() { return { id: _C, title: R("bottomFeed.title", "Generated Feed"), icon: "pi pi-images", type: "custom", render(e) { En(e, jS, gC); }, destroy(e) {} }; } function qC() { return [KC()]; } function JC() { try { Dn(null, gC); } catch {} } function YC(e) { let t = String(e?.comfyClass || e?.type || e?.constructor?.type || "").trim(); return t ? /save|load|preview/i.test(t) : !1; } function XC(e) { return e ? Array.isArray(e) ? e.filter(Boolean) : e instanceof Set ? Array.from(e).filter(Boolean) : e instanceof Map ? Array.from(e.values()).filter(Boolean) : Array.isArray(e?.items) ? e.items.filter(Boolean) : Array.isArray(e?.nodes) ? e.nodes.filter(Boolean) : [e] : []; } function ZC(e) { return vC = DC(e), vC ? [ "mjr.openNodeContext", "mjr.openAssetsManager", "mjr.openNodeInFloatingViewer" ] : []; } function QC(e, t) { return { content: e, callback: t }; } function $C(e, t, { sidebarTabId: n }) { return YC(e) ? [ QC("View in Assets Manager", () => { jC(t, n, e); }), QC("Open in Floating Viewer", () => { MC(e); }), QC("Index Output", () => { try { CC(), k(R("toast.rescanningFile", "Rescanning file..."), "info", 1800); } catch (e) { console.debug?.(e); } }) ] : []; } //#endregion //#region ui/features/runtime/entryRuntimeLifecycle.ts var ew = "__MJR_ENTRY_RUNTIME__"; function tw(e, t) { if (e) try { e._mjrAssetUpdateReloadTimer &&= (clearTimeout(e._mjrAssetUpdateReloadTimer), null), e._mjrExecutedHandler && e.removeEventListener("executed", e._mjrExecutedHandler), e._mjrAssetAddedHandler && e.removeEventListener("mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler && e.removeEventListener("mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler && e.removeEventListener(B.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler && e.removeEventListener(B.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrScanProgressHandler && e.removeEventListener(B.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler && e.removeEventListener(B.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler && e.removeEventListener(B.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrExecutionStartHandler && e.removeEventListener("execution_start", e._mjrExecutionStartHandler), e._mjrExecutionEndHandler && (e.removeEventListener("execution_success", e._mjrExecutionEndHandler), e.removeEventListener("execution_error", e._mjrExecutionEndHandler), e.removeEventListener("execution_interrupted", e._mjrExecutionEndHandler)), e._mjrStacksUpdatedHandler && e.removeEventListener("mjr.stacks.updated", e._mjrStacksUpdatedHandler), e._mjrEnrichmentStatusHandler && e.removeEventListener(B.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler && e.removeEventListener(B.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler), e._mjrRuntimeStatusHandler && (e.removeEventListener("progress", e._mjrRuntimeStatusHandler), e.removeEventListener("status", e._mjrRuntimeStatusHandler), e.removeEventListener(B.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), e.removeEventListener("execution_cached", e._mjrExecutionCachedHandler)); } catch (e) { t?.(e, "entry.removeApiHandlers"); } } function nw(e, t) { try { let t = e?.assetsDeletedHandler; t && typeof window < "u" && window.removeEventListener(B.ASSETS_DELETED, t); } catch (e) { t?.(e, "entry.removeRuntimeWindowHandlers"); } } function rw(e, { reportError: t } = {}) { if (!(!e || typeof e != "object")) { try { let t = Array.isArray(e._listenerCleanupFns) ? e._listenerCleanupFns : []; for (let e of t) try { e?.(); } catch (e) { console.debug?.(e); } e._listenerCleanupFns = []; } catch (e) { console.warn("[MJR teardown]", e); } try { let t = Array.isArray(e._cleanupControllers) ? e._cleanupControllers : []; for (let e of t) try { e?.abort?.(); } catch (e) { console.debug?.(e); } e._cleanupControllers = []; } catch (e) { console.warn("[MJR teardown]", e); } try { tw(e.api || null, t), nw(e, t); } catch (e) { console.warn("[MJR teardown]", e); } } } function iw(e, t, n, r, i = void 0) { if (!e || !t?.addEventListener || typeof r != "function") return null; let a = i && typeof i == "object" ? { ...i } : i; if (typeof AbortController < "u") try { let i = new AbortController(), o = a && typeof a == "object" ? { ...a, signal: i.signal } : { signal: i.signal }; return t.addEventListener(n, r, o), e._cleanupControllers = Array.isArray(e._cleanupControllers) ? e._cleanupControllers : [], e._cleanupControllers.push(i), i; } catch (e) { console.debug?.(e); } return t.addEventListener(n, r, a), e._listenerCleanupFns = Array.isArray(e._listenerCleanupFns) ? e._listenerCleanupFns : [], e._listenerCleanupFns.push(() => { try { t.removeEventListener(n, r, a); } catch (e) { console.debug?.(e); } }), null; } function aw({ cleanupEntryRuntimeFn: e = rw, teardownLiveStreamTracker: t, teardownNodeStream: n, teardownFloatingViewerManager: r, teardownGeneratedFeed: i, teardownAssetsSidebar: a, teardownGlobalRuntime: o, teardownTopBarMfvButton: s, reportError: c }) { try { if (typeof window < "u") { try { let t = window[ew]; e(t, { reportError: c }); } catch (e) { console.warn("[MJR teardown]", e); } try { t?.(window.__MJR_RUNTIME_APP__); } catch (e) { console.warn("[MJR teardown]", e); } try { n?.(window.__MJR_RUNTIME_APP__); } catch (e) { console.warn("[MJR teardown]", e); } try { r?.(); } catch (e) { console.warn("[MJR teardown]", e); } try { a?.(); } catch (e) { console.warn("[MJR teardown]", e); } try { i?.(); } catch (e) { console.warn("[MJR teardown]", e); } try { s?.(); } catch (e) { console.warn("[MJR teardown]", e); } try { o?.(); } catch (e) { console.warn("[MJR teardown]", e); } window[ew] = { api: null, assetsDeletedHandler: null, _cleanupControllers: [], _listenerCleanupFns: [] }, window.__MJR_RUNTIME_APP__ = null; } } catch (e) { console.warn("[MJR teardown]", e); } } //#endregion //#region ui/entry.ts var ow = null, sw = null, cw = null; function lw() { return cw ||= import("./chunks/floatingViewerManager-BVG4XDLW.js").then((e) => e.n), cw; } function uw() { cw && cw.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); } var dw = "majoor-assets", fw = "__MJR_EXECUTION_RUNTIME__", pw = "Majoor.AssetsManager", mw = { active: null, promptId: "" }, hw = null, gw = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, _w = /^[0-9a-f]{20,}$/i; function vw(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } function yw(e) { let t = String(e || "").trim(); return gw.test(t) || _w.test(t); } function bw(e) { return vw(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); } function xw(e) { if (!e || typeof e != "object") return []; if (Array.isArray(e.nodes)) return e.nodes.filter(Boolean); if (Array.isArray(e._nodes)) return e._nodes.filter(Boolean); let t = e._nodes_by_id ?? e.nodes_by_id ?? null; return t instanceof Map ? Array.from(t.values()).filter(Boolean) : t && typeof t == "object" ? Object.values(t).filter(Boolean) : []; } function Sw(e) { return xw(e).length > 0; } function Cw(e) { return !e || typeof e != "object" ? !1 : [ e.subgraph, e._subgraph, e.subgraph?.graph, e.subgraph?.lgraph, e.properties?.subgraph, e.subgraph_instance, e.subgraph_instance?.graph, e.inner_graph, e.subgraph_graph ].some(Sw) || Array.isArray(e.nodes) && e.nodes.length > 0 && e.nodes !== e.graph?.nodes ? !0 : yw(e.type) && !!bw(e); } function ww(e, t) { let n = String(e?.type || t || "").trim(), r = bw(e); return yw(n) ? r || "Subgraph" : n || r || "Node"; } function Tw() { try { return typeof window > "u" ? { active_prompt_id: null, queue_remaining: null, progress_node: null, progress_value: null, progress_max: null, cached_nodes: [] } : ((!window[fw] || typeof window[fw] != "object") && (window[fw] = { active_prompt_id: null, queue_remaining: null, progress_node: null, progress_value: null, progress_max: null, cached_nodes: [] }), window[fw]); } catch (e) { return console.debug?.(e), {}; } } function Ew(e = {}) { try { let t = Tw(); Object.assign(t, e || {}), window.dispatchEvent(new CustomEvent(B.RUNTIME_STATUS, { detail: { ...t } })); } catch (e) { console.debug?.(e); } } async function Dw({ active: e, promptId: t = "" } = {}) { let n = !!e, r = String(t || "").trim(); if (mw.active !== n || mw.promptId !== r) { mw = { active: n, promptId: r }; try { await le(lt.RUNTIME_EXECUTION, { active: n, prompt_id: r || void 0, cooldown_ms: Number(z.EXECUTION_IDLE_GRACE_MS) || 6e3 }); } catch (e) { F(e, "entry.execution_state_sync"); } } } function Ow() { try { return !!String(Tw()?.active_prompt_id || "").trim(); } catch (e) { return console.debug?.(e), !1; } } function kw(e = 1200) { try { hw && clearTimeout(hw); } catch (e) { console.debug?.(e); } hw = setTimeout(() => { if (hw = null, Ow()) { kw(e); return; } let t = Zn(); t && Pi(t); }, Math.max(250, Number(e) || 0)); } function Aw(e) { import("./chunks/LiveStreamTracker-0EQGV-lK.js").then((t) => { ow = t; try { t.initLiveStreamTracker(e); } catch (e) { console.warn("[MJR setup] initLiveStreamTracker failed:", e); } }).catch((e) => console.warn("[MJR setup] LiveStreamTracker load failed:", e)), import("./chunks/NodeStreamController-DpGjUOfx.js").then((t) => { sw = t; try { t.initNodeStream({ app: e, onOutput: (e) => { lw().then((t) => t?.floatingViewerManager?.feedNodeStream?.(e)).catch((e) => console.debug?.("[NodeStream] MFV output failed", e)); }, onStatus: (t, n) => { try { let r = (e?.graph ?? e?.canvas?.graph ?? null)?.getNodeById?.(Number(t)), i = Cw(r), a = bw(r), o = i ? "Subgraph" : ww(r, n); lw().then((e) => { e?.floatingViewerManager?.setNodeStreamSelection?.(t, o, i ? a || ww(r, n) : a); }).catch((e) => console.debug?.("[NodeStream] MFV status failed", e)); } catch (e) { console.debug?.("[NodeStream] onStatus failed", e); } } }); } catch (e) { console.warn("[MJR setup] initNodeStream failed:", e); } }).catch((e) => console.warn("[MJR setup] NodeStream load failed:", e)); } async function jw(e, t) { let n = await je({ app: e, timeoutMs: 4e3 }) || Ue(e); if (We(n || null), !n) { console.warn("Majoor API not available, real-time updates disabled"); return; } Wn({ api: n, app: e }).catch((e) => console.debug?.("[Majoor] MFV progress tracking init failed", e)); let r = null; try { r = typeof window < "u" && window.__MJR_ENTRY_RUNTIME__ || null; } catch (e) { console.debug?.(e); } tw(r?.api || null, F), n !== r?.api && tw(n, F), nw(r, F), await vp({ api: n, runtime: r, executionRuntime: t, appRef: Mr, liveStreamModule: ow, ensureExecutionRuntime: Tw, emitRuntimeStatus: Ew, getActiveGridContainer: Zn, pushGeneratedAsset: ff, upsertAsset: Hi, upsertAssetNow: Ui, removeAssetsFromGrid: Vi, getEnrichmentState: Lt, setEnrichmentState: Ct, comfyToast: k, t: R, reportError: F, registerCleanableListener: iw, syncExecutionBackendState: Dw }); } var Mw = Pf({ post: le, ENDPOINTS: lt, reportError: F, extractOutputFiles: Ff, ensureExecutionRuntime: Tw, emitRuntimeStatus: Ew, refreshGeneratedFeedHosts: Xd, getActiveGridContainer: Zn }), Nw = { name: pw, settings: sn(Mr), commands: PC(Mr, { sidebarTabId: dw, triggerStartupScan: ni }), keybindings: FC(), menuCommands: IC(), aboutPageBadges: RC(), bottomPanelTabs: qC(), async setup() { aw({ cleanupEntryRuntimeFn: rw, teardownLiveStreamTracker: (e) => ow?.teardownLiveStreamTracker(e), teardownNodeStream: (e) => sw?.teardownNodeStream(e), teardownFloatingViewerManager: uw, teardownGeneratedFeed: JC, teardownAssetsSidebar: HC, teardownGlobalRuntime: xC, teardownTopBarMfvButton: fC, reportError: F }), Sp(), ze(Mr); let e = await Xe({ timeoutMs: 12e3 }) || Mr; ze(e), Zp(e); try { typeof window < "u" && (window.__MJR_RUNTIME_APP__ = e); } catch (e) { console.debug?.(e); } oi(), Oi({ enabled: !0 }), bC(), Aw(e), Sn(e, () => { let e = Zn(); if (e) { if (z.DEFER_GRID_FETCH_DURING_EXECUTION && Ow()) { kw(); return; } Pi(e); } }), zC(e, { sidebarTabId: dw, triggerStartupScan: ni }), BC(e), setTimeout(() => { Ei(); }, 5e3), jw(e, Mw).catch((e) => F(e, "entry.api_setup")), VC(e, { sidebarTabId: dw }) ? we("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); try { let e = typeof window < "u" ? window.requestIdleCallback : null, t = () => { try { GC(); } catch (e) { console.debug?.(e); } }; typeof e == "function" ? e(t, { timeout: 2500 }) : setTimeout(t, 600); } catch (e) { console.debug?.(e); } yp({ resolveNodeStreamModule: async () => (sw ||= await import("./chunks/NodeStreamController-DpGjUOfx.js"), sw) }); }, onNodeOutputsUpdated(e) { try { Mw.handleNodeOutputsUpdated(e); } catch (e) { console.debug?.("[Majoor] onNodeOutputsUpdated error", e); } }, getNodeMenuItems(e) { return $C(e, Mr, { sidebarTabId: dw }); }, getCanvasMenuItems(e) { return LC(Mr, { sidebarTabId: dw, triggerStartupScan: ni }); }, getSelectionToolboxCommands(e) { return ZC(e); } }; try { Mr.registerExtension(Nw); } catch (e) { console.warn("[Majoor] registerExtension() threw (extension already registered) - re-running setup() directly", e), Nw.setup().catch((e) => F(e, "entry.setup_after_duplicate_registration")); } //#endregion