@aerogel/plugin-local-first 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aerogel-plugin-local-first.d.ts +48 -17
- package/dist/aerogel-plugin-local-first.js +1219 -1232
- package/dist/aerogel-plugin-local-first.js.map +1 -1
- package/package.json +5 -5
- package/src/components/Account.vue +9 -0
- package/src/components/AccountLoggedIn.vue +85 -0
- package/src/components/AccountLoggedOut.vue +26 -0
- package/src/components/AccountLoginModal.vue +36 -0
- package/src/components/AccountModal.vue +206 -0
- package/src/components/index.ts +5 -3
- package/src/components/settings/PurgeData.vue +43 -0
- package/src/components/settings/index.ts +10 -0
- package/src/index.css +1 -0
- package/src/index.ts +5 -1
- package/src/jobs/Migrate.test.ts +1 -1
- package/src/jobs/Migrate.ts +8 -1
- package/src/jobs/Sync.test.ts +313 -35
- package/src/jobs/Sync.ts +183 -77
- package/src/jobs/mixins/LoadsChildren.ts +48 -31
- package/src/jobs/mixins/LoadsTypeIndex.ts +7 -5
- package/src/jobs/mixins/TracksLocalModels.ts +4 -4
- package/src/lib/mirroring.ts +45 -21
- package/src/services/Cloud.ts +84 -25
- package/src/services/DocumentsCache.ts +6 -2
- package/src/testing/cloud.ts +1 -1
- package/src/testing/setup.ts +3 -2
- package/src/testing/stubs/Person.schema.ts +9 -0
- package/src/testing/stubs/Person.ts +18 -0
- package/src/testing/stubs/Post.schema.ts +17 -0
- package/src/testing/stubs/Post.ts +18 -0
- package/dist/InruptAuthenticator.lazy-BvpQLGoj-BvpQLGoj.js +0 -9
- package/dist/InruptAuthenticator.lazy-BvpQLGoj-BvpQLGoj.js.map +0 -1
- package/dist/LegacyAuthenticator.lazy-ChFFqP14-ChFFqP14.js +0 -5
- package/dist/LegacyAuthenticator.lazy-ChFFqP14-ChFFqP14.js.map +0 -1
- package/src/components/AGCloudStatus.vue +0 -31
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aerogel-plugin-local-first.js","sources":["../../plugin-solid/dist/aerogel-plugin-solid.js","../../plugin-soukai/dist/aerogel-plugin-soukai.js","../src/lib/inference.ts","../src/lib/SyncQueue.ts","../src/lib/mirroring.ts","../src/jobs/Backup.ts","../src/services/DocumentsCache.ts","../src/lib/utils.ts","../src/jobs/mixins/LoadsChildren.ts","../src/jobs/mixins/LoadsTypeIndex.ts","../src/jobs/mixins/TracksLocalModels.ts","../src/jobs/Migrate.ts","../src/jobs/Sync.ts","../src/services/Cloud.state.ts","../src/services/Cloud.ts","../src/index.ts"],"sourcesContent":["var ie = Object.defineProperty;\nvar ne = (n, e, i) => e in n ? ie(n, e, { enumerable: !0, configurable: !0, writable: !0, value: i }) : n[e] = i;\nvar u = (n, e, i) => ne(n, typeof e != \"symbol\" ? e + \"\" : e, i);\nimport { persistent as re, defineServiceState as se, Events as g, App as f, UI as T, translateWithDefault as c, Colors as oe, Storage as ae, Errors as B, defineFormValidationRule as le, requiredStringProp as ue, computedAsync as ce, Cache as R, useForm as de, requiredStringInput as he, AGMarkdown as A, AGButton as P, AGForm as ge, AGInput as fe, AGLink as me, registerErrorHandler as pe, bootServices as we } from \"@aerogel/core\";\nimport { SolidEngine as Se, SolidTypeIndex as y, SolidContainer as k, SolidACLAuthorization as ye, SolidDocument as ve, bootSolidModels as be } from \"soukai-solid\";\nimport { JSError as O, arr as Ie, fail as C, PromisedValue as Ae, Storage as x, after as G, required as V, facade as Pe, tap as F, arrayUnique as j, objectWithout as z, asyncMemo as H, hasLocationQueryParameter as L, getLocationQueryParameter as q, arrayFilter as Le, setAsyncMemo as Y, urlRoot as $e, requireUrlParse as Ee, objectWithoutEmpty as Ce, parseBoolean as Q, arrayWithout as Ue } from \"@noeldemartin/utils\";\nimport { fetchLoginUserProfile as Te } from \"@noeldemartin/solid-utils\";\nimport { setEngine as Re } from \"soukai\";\nimport { defineComponent as M, createElementBlock as S, openBlock as d, unref as a, computed as J, renderSlot as $, createCommentVNode as _, createVNode as h, createElementVNode as b, withCtx as p, createTextVNode as v, toDisplayString as w, createBlock as I } from \"vue\";\nclass ke extends O {\n}\nfunction xe(n, e) {\n return n;\n}\nclass U extends O {\n constructor(i, t, r) {\n super(xe(i), r);\n u(this, \"description\");\n this.description = t;\n }\n}\nclass Fe extends O {\n constructor(e, i) {\n super(`Container at ${e.url} is already in use`, i);\n }\n}\nconst E = {};\nclass K {\n constructor() {\n u(this, \"name\");\n u(this, \"authenticatedFetch\");\n u(this, \"booted\");\n u(this, \"listeners\", Ie([]));\n u(this, \"_engine\");\n }\n get engine() {\n return this._engine = this._engine ?? new Se(this.requireAuthenticatedFetch()), this._engine;\n }\n getAuthenticatedFetch() {\n return this.authenticatedFetch ?? null;\n }\n requireAuthenticatedFetch() {\n return this.authenticatedFetch ?? C(\"Authenticated fetch is not ready\");\n }\n addListener(e) {\n return this.listeners.includes(e) || this.listeners.push(e), () => {\n this.removeListener(e);\n };\n }\n removeListener(e) {\n this.listeners.includes(e) && this.listeners.remove(e);\n }\n async boot() {\n if (this.booted)\n return this.booted;\n this.booted = new Ae(), await this.restoreSession(), this.booted.resolve();\n }\n async initAuthenticatedFetch(e) {\n this.authenticatedFetch = e, await this.notifyListeners(\"onAuthenticatedFetchReady\", e);\n }\n async startSession(e) {\n const i = {\n authenticator: this,\n ...e\n };\n return await this.notifyListeners(\"onSessionStarted\", i), i;\n }\n async failSession(e, i) {\n await this.notifyListeners(\"onSessionFailed\", e, i);\n }\n async endSession() {\n await this.notifyListeners(\"onSessionEnded\");\n }\n async notifyListeners(e, ...i) {\n await Promise.all(\n this.listeners.toArray().map(async (t) => {\n const r = t[e];\n await (r == null ? void 0 : r(...i));\n })\n );\n }\n}\nconst D = \"inrupt-authenticator\";\nclass qe extends K {\n constructor() {\n super(...arguments);\n u(this, \"_events\");\n u(this, \"_fetch\");\n u(this, \"_login\");\n u(this, \"_logout\");\n u(this, \"_handleIncomingRedirect\");\n }\n async login(i) {\n x.set(D, i);\n const t = {\n oidcIssuer: i\n };\n return E.clientID && (t.clientId = E.clientID.client_id, t.clientName = E.clientID.client_name, t.redirectUrl = E.clientID.redirect_uris[0]), await this._login(t), await G({ seconds: 60 }), C(\"Browser should have redirected, but it didn't\");\n }\n async logout() {\n await this._logout(), await this.endSession();\n }\n async restoreSession() {\n const { events: i, fetch: t, handleIncomingRedirect: r, login: s, logout: l } = await import(\"./InruptAuthenticator.lazy-BvpQLGoj.js\");\n this._fetch = t, this._login = s, this._logout = l, this._events = i, this._handleIncomingRedirect = r, await this.loginFromRedirect();\n }\n async loginFromRedirect() {\n const i = x.get(D);\n if (!i)\n return;\n this._events().on(\"error\", (r, s) => {\n r ?? (r = \"Error using Inrupt Authenticator method\"), typeof s == \"object\" ? this.failSession(i, new U(r, null, { cause: s })) : this.failSession(i, new U(r, s));\n });\n const t = await this._handleIncomingRedirect(globalThis.location.href);\n x.remove(D), t != null && t.isLoggedIn && t.webId && await this.initSession(t.webId);\n }\n async initSession(i) {\n await this.initAuthenticatedFetch(this._fetch);\n try {\n const t = await m.requireUserProfile(i);\n await this.startSession({ user: t, loginUrl: i });\n } catch (t) {\n await this.failSession(i, t);\n }\n }\n}\nclass _e extends K {\n constructor() {\n super();\n u(this, \"store\");\n this.store = re(\"legacy-authenticator\", {});\n }\n async login(i, t) {\n const { SolidAuthClient: r } = await import(\"./LegacyAuthenticator.lazy-ChFFqP14.js\");\n throw this.store.webId = t == null ? void 0 : t.webId, this.store.loginUrl = (t == null ? void 0 : t.oidcIssuerUrl) ?? i, await r.login(this.store.loginUrl) === null ? (delete this.store.webId, delete this.store.loginUrl, new U(\"Could not log in with Solid using the legacy authenticator\")) : (await G({ seconds: 60 }), new Error(\"Browser should have redirected, but it didn't\"));\n }\n async logout() {\n const { SolidAuthClient: i } = await import(\"./LegacyAuthenticator.lazy-ChFFqP14.js\");\n delete this.store.webId, delete this.store.loginUrl, await i.logout(), await this.endSession();\n }\n async restoreSession() {\n if (!this.store.loginUrl)\n return;\n const { SolidAuthClient: i } = await import(\"./LegacyAuthenticator.lazy-ChFFqP14.js\"), t = await i.currentSession(), r = V(this.store.loginUrl);\n await this.initAuthenticatedFetch((s, l) => i.fetch(s, l));\n try {\n const s = await m.requireUserProfile(V((t == null ? void 0 : t.webId) ?? this.store.webId));\n await this.startSession({ user: s, loginUrl: r });\n } catch (s) {\n await this.failSession(r, s);\n }\n }\n}\nconst W = {}, De = {\n inrupt: new qe(),\n legacy: new _e()\n};\nfunction Oe(n) {\n W.default = n;\n}\nfunction X(n) {\n return W[n];\n}\nfunction Ge(n) {\n Object.entries(n).forEach(([e, i]) => Me(e, i));\n}\nfunction Me(n, e) {\n W[n] = e, e.name = e.name ?? n;\n}\nconst N = { autoReconnect: !0 }, We = se({\n name: \"solid\",\n persist: [\"autoReconnect\", \"dismissed\", \"previousSession\", \"profiles\", \"staleProfiles\"],\n initialState: {\n autoReconnect: N.autoReconnect,\n dismissed: !1,\n ignorePreviousSessionError: !1,\n loginStartupError: null,\n loginOngoing: !1,\n preferredAuthenticator: null,\n previousSession: null,\n profiles: {},\n session: null,\n loginStale: !1,\n staleProfiles: []\n },\n serialize(n) {\n var e;\n return ((e = n.previousSession) == null ? void 0 : e.error) instanceof Error && (n.previousSession.error = n.previousSession.error.message), n;\n },\n computed: {\n user: (n) => {\n var e, i;\n return ((e = n.session) == null ? void 0 : e.user) ?? ((i = n.previousSession) == null ? void 0 : i.profile) ?? null;\n },\n authenticator: (n) => {\n var e;\n return ((e = n.session) == null ? void 0 : e.authenticator) ?? null;\n },\n fetch() {\n var n;\n return ((n = this.authenticator) == null ? void 0 : n.getAuthenticatedFetch()) ?? globalThis.fetch.bind(globalThis);\n },\n error(n) {\n var e;\n return n.loginStartupError ? n.loginStartupError ?? null : n.ignorePreviousSessionError ? null : ((e = n.previousSession) == null ? void 0 : e.error) ?? null;\n }\n }\n});\nclass Ne extends We {\n isLoggedIn() {\n return !!this.session;\n }\n wasLoggedIn() {\n return !!this.previousSession;\n }\n hasLoggedIn() {\n return !!(this.session || this.previousSession);\n }\n requireAuthenticator() {\n return this.authenticator ?? C(\"Could not get authenticator\");\n }\n requireUser() {\n return this.user ?? C(\"Could not get user profile (are you logged in?)\");\n }\n requireUserProfile(e) {\n return this.getUserProfile(e, { required: !0 });\n }\n /* eslint-enable max-len */\n async getUserProfile(e, i = {}) {\n var l;\n let t = null;\n const r = i.markStale ?? !((l = this.authenticator) != null && l.getAuthenticatedFetch()), s = this.profiles[e] ?? await F(\n await Te(e, {\n fetch: this.fetch,\n required: i.required ?? !1,\n onLoaded(o) {\n t = o;\n }\n }),\n async (o) => {\n o && (t && await g.emit(\"solid:user-profile-loaded\", [o, t]), this.rememberProfile(o));\n }\n );\n return s && r && this.setState({ staleProfiles: j(this.staleProfiles.concat([s.webId])) }), s;\n }\n async refreshUserProfile() {\n if (!this.isLoggedIn())\n return;\n this.setState({ profiles: z(this.profiles, [this.user.webId]) });\n const e = await this.requireUserProfile(this.user.webId);\n this.setState({\n session: {\n ...this.session,\n user: e\n }\n });\n }\n async login(e, i = {}) {\n if (f.development && e === \"dev\" && (e = \"http://localhost:3000\"), /^https?:\\/\\//.test(e) || (i.fallbackUrl ?? (i.fallbackUrl = `http://${e}`), e = `https://${e}`), this.isLoggedIn())\n return !0;\n if (this.loginOngoing)\n throw new Error(\"Authentication already in progress\");\n return i.loading ? T.loading(c(\"solid.loggingIn\", \"Logging in...\"), () => this.attemptLogin(e, i)) : this.attemptLogin(e, i);\n }\n async reconnect(e = {}) {\n const { force: i, ...t } = e;\n this.isLoggedIn() || !this.previousSession || this.previousSession.error !== null && !i || await this.login(this.previousSession.loginUrl, {\n authenticator: this.previousSession.authenticator,\n ...t,\n loading: t.loading ?? !1\n });\n }\n async logout(e = !1) {\n var l, o;\n const i = !f.plugin(\"@aerogel/local-first\") || !!((l = f.service(\"$cloud\")) != null && l.ready), t = !f.plugin(\"@aerogel/local-first\") || !!((o = f.service(\"$cloud\")) != null && o.dirty), [r, s] = e ? [!0, { wipeLocalData: i }] : await T.confirm(\n i ? c(\"solid.logoutConfirmTitle\", \"Log out from this device?\") : c(\"solid.disconnectConfirmTitle\", \"Disconnect account?\"),\n i ? t ? c(\n \"solid.logoutConfirmMessageWithLocalChanges\",\n \"There are some changes that haven't been synchronized and will be lost, but the rest of the data will remain in your Solid POD.\"\n ) : c(\n \"solid.logoutConfirmMessage\",\n \"Logging out will remove all the data from this device, but you'll still have it in your Solid POD.\"\n ) : c(\n \"solid.disconnectConfirmMessage\",\n \"You'll need to introduce your credentials again to connect to your Solid POD.\"\n ),\n {\n acceptText: c(\"solid.logoutConfirmAccept\", \"Log out\"),\n acceptColor: oe.Danger,\n cancelText: c(\n \"solid.logoutConfirmCancel\",\n c(\"ui.cancel\", \"Cancel\")\n ),\n checkboxes: i ? t ? {\n wipeLocalData: {\n label: c(\n \"solid.logoutConfirmWipeNotice\",\n \"I understand that changes that haven't been synchronized will be lost.\"\n ),\n default: !1,\n required: !0\n }\n } : void 0 : {\n wipeLocalData: {\n label: c(\n \"solid.logoutConfirmWipe\",\n \"Also remove all existing data (tasks, lists, etc.)\"\n ),\n default: !1\n }\n }\n }\n );\n r && this.previousSession && await T.loading(c(\"solid.logoutOngoing\", \"Logging out...\"), async () => {\n this.setState({\n dismissed: !1,\n ignorePreviousSessionError: !1,\n loginStartupError: null,\n previousSession: null,\n ...N\n }), this.isLoggedIn() && await this.authenticator.logout(), (s.wipeLocalData ?? !0) && await ae.purge(), await g.emit(\"auth:logout\"), await g.emit(\"auth:after-logout\");\n });\n }\n async whenLoggedIn(e) {\n return this.isLoggedIn() ? e(this.session) : new Promise((i) => {\n const t = (r) => i(e(r));\n g.once(\"auth:login\", t);\n });\n }\n dismiss() {\n this.setState({ dismissed: !0 });\n }\n async findOrCreatePrivateTypeIndex() {\n return await this.findPrivateTypeIndex() ?? await this.createPrivateTypeIndex();\n }\n async findPrivateTypeIndex() {\n const { webId: e, privateTypeIndexUrl: i } = this.requireUser(), t = this.requireAuthenticator().engine;\n return i ? H(`${e}-privateTypeIndex`, () => y.withEngine(t).find(i)) : null;\n }\n async findOrCreatePublicTypeIndex() {\n return await this.findPublicTypeIndex() ?? await this.createPublicTypeIndex();\n }\n async findPublicTypeIndex() {\n const { webId: e, publicTypeIndexUrl: i } = this.requireUser(), t = this.requireAuthenticator().engine;\n return i ? H(`${e}-publicTypeIndex`, () => y.withEngine(t).find(i)) : null;\n }\n async createPrivateContainer(e) {\n const i = this.requireAuthenticator().engine;\n return k.withEngine(i, async () => {\n const t = await k.find(e.url);\n if (t && !e.reuseExisting)\n throw new Fe(t);\n const r = t ?? new k({ url: e.url, name: e.name });\n if (await r.save(), e.registerFor) {\n const s = await this.findOrCreatePrivateTypeIndex();\n await r.register(s, e.registerFor);\n }\n return r;\n });\n }\n async boot() {\n var e, i;\n await B.booted, L(\"authenticator\") && this.setState({\n preferredAuthenticator: q(\"authenticator\")\n }), L(\"refreshProfile\") && this.setState({\n staleProfiles: j(\n this.staleProfiles.concat(Le([(e = this.session) == null ? void 0 : e.user.webId, (i = this.previousSession) == null ? void 0 : i.loginUrl]))\n )\n }), await this.restorePreviousSession(), await this.startupReconnect();\n }\n async createPrivateTypeIndex() {\n const e = this.requireUser(), i = this.requireAuthenticator(), t = await y.withEngine(i.engine).createPrivate(e);\n return F(t, () => {\n e.privateTypeIndexUrl = t.url, Y(`${e.webId}-privateTypeIndex`, t), this.rememberProfile(e);\n });\n }\n async createPublicTypeIndex() {\n const e = this.requireUser(), i = this.requireAuthenticator(), t = await y.withEngine(i.engine).createPublic(e);\n return F(t, () => {\n e.privateTypeIndexUrl = t.url, Y(`${e.webId}-publicTypeIndex`, t), this.rememberProfile(e);\n });\n }\n async attemptLogin(e, i) {\n const t = i.authenticator ?? this.preferredAuthenticator ?? \"default\", r = i.onError ?? ((o) => f.isMounted() ? B.report(o) : this.setState({ loginStartupError: o })), s = setTimeout(() => this.loginStale = !0, 1e4), l = {\n dismissed: this.dismissed,\n ignorePreviousSessionError: this.ignorePreviousSessionError,\n previousSession: this.previousSession\n };\n this.loginOngoing = !0;\n try {\n const o = await this.getUserProfile(e, { markStale: !0 }), Z = (o == null ? void 0 : o.oidcIssuerUrl) ?? $e((o == null ? void 0 : o.webId) ?? e), ee = await this.bootAuthenticator(t), { domain: te } = Ee(e);\n return this.setState({\n dismissed: !1,\n ignorePreviousSessionError: !0,\n previousSession: Ce({\n profile: o,\n loginUrl: e,\n authenticator: t,\n error: c(\n \"auth.stuckConnecting\",\n `We didn't hear back from the identity provider at \\`${te}\\`, maybe try reconnecting?`\n )\n })\n }), await g.emit(\"auth:before-login\"), await ee.login(Z, o), !0;\n } catch (o) {\n return this.setState(l), o instanceof ke ? !1 : i.fallbackUrl ? G().then(() => this.login(i.fallbackUrl ?? \"\", z(i, \"fallbackUrl\"))) : (r(o), !1);\n } finally {\n clearTimeout(s), this.setState({\n loginOngoing: !1,\n loginStale: !1\n });\n }\n }\n async restorePreviousSession() {\n this.previousSession && await this.bootAuthenticator(this.previousSession.authenticator);\n }\n async startupReconnect() {\n this.reconnectOnStartup() && await this.reconnect({ force: this.forcingReconnect() });\n }\n reconnectOnStartup() {\n return L(\"autoReconnect\") ? Q(q(\"autoReconnect\")) : this.autoReconnect;\n }\n forcingReconnect() {\n return L(\"autoReconnect\") && Q(q(\"autoReconnect\"));\n }\n async bootAuthenticator(e) {\n const i = X(e);\n return i.addListener({\n onSessionStarted: async (t) => {\n this.setState({\n session: t,\n previousSession: {\n authenticator: i.name,\n loginUrl: t.loginUrl,\n profile: t.user,\n error: null\n }\n }), this.staleProfiles.includes(t.user.webId) && await this.refreshUserProfile(), f.plugin(\"@aerogel/local-first\") || Re(t.authenticator.engine), ye.setEngine(t.authenticator.engine), y.setEngine(t.authenticator.engine), ve.setEngine(t.authenticator.engine), await g.emit(\"auth:login\", t);\n },\n onSessionFailed: async (t, r) => {\n var s;\n this.setState({\n session: null,\n previousSession: {\n profile: (s = this.previousSession) == null ? void 0 : s.profile,\n authenticator: i.name,\n loginUrl: t,\n error: r\n }\n });\n },\n onSessionEnded: () => this.setState({ session: null }),\n onAuthenticatedFetchReady: (t) => g.emit(\"auth:fetch-ready\", t)\n }), await i.boot(), i;\n }\n rememberProfile(e) {\n this.setState({\n profiles: {\n ...this.profiles,\n [e.webId]: e\n },\n staleProfiles: Ue(this.staleProfiles, e.webId)\n });\n }\n}\nconst m = Pe(Ne);\nfunction Be() {\n le(\"container_url\", (n) => {\n if (!n.endsWith(\"/\"))\n return \"containerEndingSlashMissing\";\n });\n}\nconst Ve = [\"src\"], je = /* @__PURE__ */ M({\n __name: \"AGSolidImage\",\n props: { src: ue() },\n setup(n) {\n const e = n, i = ce(async () => {\n const r = await R.get(e.src) ?? await t(e.src), s = await (r == null ? void 0 : r.blob());\n return s && URL.createObjectURL(s);\n });\n async function t(r) {\n try {\n const s = await m.fetch(r);\n return s.status !== 200 ? null : (await R.store(r, s), R.get(r));\n } catch {\n return null;\n }\n }\n return (r, s) => (d(), S(\"img\", { src: a(i) }, null, 8, Ve));\n }\n}), ze = { class: \"flex flex-col gap-3\" }, He = { class: \"flex flex-col\" }, Ye = {\n key: 1,\n class: \"mt-1 self-center text-sm text-red-800\"\n}, lt = /* @__PURE__ */ M({\n __name: \"AGSolidStatus\",\n setup(n) {\n const e = de({ url: he() }), i = J(\n () => f.development && (!e.url || e.url === \"dev\" || e.url.trim().length === 0)\n );\n return (t, r) => (d(), S(\"div\", null, [\n t.$solid.loginStale ? $(t.$slots, \"login-stale\", { key: 0 }, () => [\n h(a(A), {\n text: t.$td(\"solid.loginStale\", \"This is taking too long...\")\n }, null, 8, [\"text\"])\n ]) : _(\"\", !0),\n t.$solid.loginOngoing ? $(t.$slots, \"login-ongoing\", { key: 1 }, () => [\n h(a(A), {\n text: t.$td(\"ui.loading\", \"Loading...\")\n }, null, 8, [\"text\"])\n ]) : t.$solid.isLoggedIn() ? $(t.$slots, \"logged-in\", {\n key: 2,\n session: t.$solid.session\n }, () => [\n b(\"div\", ze, [\n h(a(A), {\n text: t.$td(\"solid.loggedIn\", \"You are logged in as [{userName}]({userWebId})\", {\n userName: t.$solid.user.name ?? t.$solid.user.webId,\n userWebId: t.$solid.user.webId\n })\n }, null, 8, [\"text\"]),\n h(a(P), {\n onClick: r[0] || (r[0] = (s) => t.$solid.logout())\n }, {\n default: p(() => [\n v(w(t.$td(\"solid.logout\", \"Logout\")), 1)\n ]),\n _: 1\n })\n ])\n ]) : $(t.$slots, \"logged-out\", { key: 3 }, () => {\n var s;\n return [\n b(\"div\", He, [\n h(a(ge), {\n form: a(e),\n class: \"flex\",\n onSubmit: r[2] || (r[2] = (l) => t.$solid.login(a(e).url))\n }, {\n default: p(() => [\n h(a(fe), {\n name: \"url\",\n \"aria-label\": t.$td(\"solid.url\", \"Login url\"),\n placeholder: t.$td(\"solid.placeholder\", \"https://...\")\n }, null, 8, [\"aria-label\", \"placeholder\"]),\n i.value ? (d(), I(a(P), {\n key: 0,\n submit: \"\",\n onClick: r[1] || (r[1] = (l) => a(e).url = \"dev\")\n }, {\n default: p(() => [\n v(w(t.$td(\"solid.devLogin\", \"Dev login\")), 1)\n ]),\n _: 1\n })) : (d(), I(a(P), {\n key: 1,\n submit: \"\"\n }, {\n default: p(() => [\n v(w(t.$td(\"solid.login\", \"Login\")), 1)\n ]),\n _: 1\n }))\n ]),\n _: 1\n }, 8, [\"form\"]),\n t.$solid.wasLoggedIn() ? (d(), I(a(P), {\n key: 0,\n class: \"mt-3\",\n onClick: r[3] || (r[3] = (l) => t.$solid.reconnect({ force: !0 }))\n }, {\n default: p(() => [\n v(w(t.$td(\"solid.reconnect\", \"Reconnect\")), 1)\n ]),\n _: 1\n })) : _(\"\", !0),\n (s = t.$solid.previousSession) != null && s.error || t.$solid.loginStartupError ? (d(), S(\"p\", Ye, [\n h(a(A), {\n text: t.$td(\"solid.previousLoginError\", \"Previous login attempt failed\"),\n inline: \"\"\n }, null, 8, [\"text\"]),\n h(a(me), {\n onClick: r[4] || (r[4] = (l) => {\n var o;\n return t.$errors.inspect(((o = t.$solid.previousSession) == null ? void 0 : o.error) || t.$solid.loginStartupError);\n })\n }, {\n default: p(() => [\n v(\" (\" + w(t.$td(\"errors.viewDetails\", \"View details\")) + \") \", 1)\n ]),\n _: 1\n })\n ])) : _(\"\", !0)\n ])\n ];\n })\n ]));\n }\n}), Qe = {\n viewBox: \"0 0 20 20\",\n width: \"1.2em\",\n height: \"1.2em\"\n};\nfunction Je(n, e) {\n return d(), S(\"svg\", Qe, e[0] || (e[0] = [\n b(\"path\", {\n fill: \"currentColor\",\n d: \"M15 2H5L4 8h12zM0 10s2 1 10 1s10-1 10-1l-4-2H4zm8 4h4v1H8z\"\n }, null, -1),\n b(\"circle\", {\n cx: \"6\",\n cy: \"15\",\n r: \"3\",\n fill: \"currentColor\"\n }, null, -1),\n b(\"circle\", {\n cx: \"14\",\n cy: \"15\",\n r: \"3\",\n fill: \"currentColor\"\n }, null, -1)\n ]));\n}\nconst Ke = { name: \"ooui-user-anonymous\", render: Je }, Xe = { class: \"relative flex items-center justify-center rounded-full bg-gray-200\" }, Ze = {\n key: 1,\n class: \"text-sm font-semibold tracking-wider text-gray-500\",\n \"aria-hidden\": \"true\"\n}, ut = /* @__PURE__ */ M({\n __name: \"AGSolidUserAvatar\",\n setup(n) {\n const e = J(() => {\n var t;\n return (((t = m.user) == null ? void 0 : t.name) ?? \"\").trim().split(\" \").map((r) => {\n var s;\n return (s = r[0]) == null ? void 0 : s.toUpperCase();\n }).join(\"\").slice(0, 3);\n });\n return (i, t) => {\n var r, s;\n return d(), S(\"div\", Xe, [\n (r = i.$solid.user) != null && r.avatarUrl ? (d(), I(je, {\n key: 0,\n src: (s = i.$solid.user) == null ? void 0 : s.avatarUrl,\n alt: \"\",\n class: \"absolute inset-0 h-full w-full rounded-full\"\n }, null, 8, [\"src\"])) : e.value ? (d(), S(\"span\", Ze, w(e.value), 1)) : (d(), I(a(Ke), {\n key: 2,\n class: \"h-6 w-6 text-gray-500\"\n }))\n ]);\n };\n }\n}), et = { $solid: m };\nfunction ct(n = {}) {\n return {\n async install(e) {\n be(), Ge({ ...De, ...n.authenticators ?? {} }), Be(), Oe(X(n.defaultAuthenticator ?? \"inrupt\")), pe((i) => {\n if (i instanceof U)\n return i.description ? `${i.message} (${i.description})` : i.message;\n }), typeof n.autoReconnect == \"boolean\" && (N.autoReconnect = n.autoReconnect, m.hasPersistedState() || (m.autoReconnect = n.autoReconnect)), n.onUserProfileLoaded && g.on(\"solid:user-profile-loaded\", ([i, t]) => {\n var r;\n (r = n.onUserProfileLoaded) == null || r.call(n, i, t);\n }), await we(e, et);\n }\n };\n}\nexport {\n je as AGSolidImage,\n lt as AGSolidStatus,\n ut as AGSolidUserAvatar,\n ke as AuthenticationCancelledError,\n U as AuthenticationFailedError,\n K as Authenticator,\n Fe as ContainerAlreadyInUse,\n m as Solid,\n Ne as SolidService,\n De as authenticators,\n ct as default,\n X as getAuthenticator,\n Me as registerAuthenticator,\n Ge as registerAuthenticators,\n Oe as setDefaultAuthenticator\n};\n//# sourceMappingURL=aerogel-plugin-solid.js.map\n","import { requireBootedModel as A, IndexedDBEngine as _, setEngine as F, bootModelsFromViteGlob as L } from \"soukai\";\nimport { Events as l, onCleanMounted as U } from \"@aerogel/core\";\nimport { map as d, tap as w, isArray as v, isObject as y, required as D } from \"@noeldemartin/utils\";\nimport { shallowRef as q, computed as b, triggerRef as m, toRaw as g, customRef as S, getCurrentScope as E, onScopeDispose as T, watchEffect as f, ref as x, onUnmounted as j, reactive as M } from \"vue\";\nfunction z(e) {\n return A(e);\n}\nconst B = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n model: z\n}, Symbol.toStringTag, { value: \"Module\" }));\nlet p = /* @__PURE__ */ new WeakMap();\nfunction I(e) {\n const t = q(d([], \"id\")), i = b(() => t.value.getItems()), o = /* @__PURE__ */ new Set([e.collection]), n = {\n modelsMap: t,\n modelsArray: i,\n collectionsSet: o,\n async refresh() {\n const r = d([], \"id\");\n for (const c of o)\n (await e.withCollection(c, () => e.all())).forEach((a) => r.add(a));\n t.value = r;\n }\n };\n return p.set(e, n), e.on(\"created\", (r) => (t.value.add(g(r)), m(t))), e.on(\"deleted\", (r) => (t.value.delete(g(r)), m(t))), e.on(\"updated\", (r) => (t.value.add(g(r)), m(t))), l.on(\"purge-storage\", () => t.value = d([], \"id\")), l.on(\"cloud:migration-completed\", () => n.refresh()), l.on(\"cloud:migration-cancelled\", () => n.refresh()), l.on(\"cloud:backup-completed\", () => n.refresh()), n;\n}\nfunction k() {\n return p;\n}\nfunction W(e) {\n p = e;\n}\nfunction O(e) {\n return p.get(e) ?? I(e);\n}\nfunction h(e) {\n return \"isSoftDeleted\" in e ? e.isSoftDeleted() : !1;\n}\nfunction R(e, t, i = !0) {\n const o = t ?? /* @__PURE__ */ new Map();\n return v(e) ? (e.forEach((n) => o.set(n.id, n)), o) : y(e) ? i ? (Object.values(e).forEach((n) => R(n, o, !1)), o) : (o.set(e.id, e), o) : o;\n}\nfunction G(e, t) {\n return S((i, o) => {\n let n;\n const r = () => (n = t(), o()), c = [\n e.on(\"deleted\", r),\n e.on(\"created\", r),\n e.on(\"updated\", r),\n e.on(\"modified\", r),\n e.on(\"relation-loaded\", r),\n l.on(\"cloud:migration-cancelled\", r),\n l.on(\"cloud:migration-completed\", r)\n ], s = () => {\n c.forEach((a) => a()), c.splice(0, c.length);\n };\n return E() && T(s), f(r), {\n get: () => w(n, () => i()),\n // eslint-disable-next-line no-console\n set: () => console.warn(\"Computed models ref was not set (it is immutable).\")\n };\n });\n}\nfunction K(e, t) {\n const i = G(e, t), o = b(() => v(i.value) ? i.value.filter((c) => !h(c)).map((c) => M(c)) : y(i.value) ? Object.entries(i.value).reduce((c, [s, a]) => (v(a) ? c[s] = a.filter((u) => !h(u)).map((u) => M(u)) : h(a) || (c[s] = M(a)), c), {}) : i.value), n = b(() => R(o.value)), r = e.on(\"modified\", (c, s) => {\n Object.assign(n.value.get(c.id) ?? {}, {\n [s]: c.getAttribute(s)\n });\n });\n return j(r), o;\n}\nfunction V(e) {\n return S((t, i) => {\n let o;\n const n = [], r = (s) => s.id === (o == null ? void 0 : o.id) && i(), c = () => {\n n.forEach((s) => s()), n.splice(0, n.length);\n };\n return E() && T(c), f(() => {\n const s = e();\n (s == null ? void 0 : s.static()) !== (o == null ? void 0 : o.static()) && c(), o = s, i(), o && !n.length && (n.push(l.on(\"cloud:migration-completed\", i)), n.push(l.on(\"cloud:migration-cancelled\", i)), n.push(o.static().on(\"modified\", r)), n.push(o.static().on(\"updated\", r)), n.push(o.static().on(\"relation-loaded\", r)));\n }), {\n get: () => w(o, () => t()),\n // eslint-disable-next-line no-console\n set: () => console.warn(\"Computed model ref was not set (it is immutable).\")\n };\n });\n}\nfunction X(e, t) {\n return K(e, t);\n}\nfunction Y(e) {\n const t = x([]), i = O(e);\n return f(() => t.value.splice(0, t.value.length, ...i.modelsArray.value)), U(() => e.on(\"updated\", () => t.value = t.value.slice(0))), i.refresh(), t;\n}\nfunction Z(e, t, i) {\n const o = e.on(t, i);\n j(o);\n}\nfunction $(e) {\n var t;\n return ((t = k().get(e)) == null ? void 0 : t.modelsArray.value) ?? [];\n}\nfunction C() {\n W(/* @__PURE__ */ new WeakMap());\n}\nfunction ee(e, t) {\n D(\n k().get(e),\n \"Failed ignoring models collection, please track the model first using trackModels()\"\n ).collectionsSet.delete(t);\n}\nasync function te(e, t, i = {}) {\n const o = i.refresh ?? !0, n = D(\n k().get(e),\n \"Failed tracking models collection, please track the model first using trackModels()\"\n );\n if (!n.collectionsSet.has(t) && (n.collectionsSet.add(t), o)) {\n const r = n.modelsArray.value;\n (await e.withCollection(t, () => e.all())).forEach((s) => r.push(s)), n.modelsMap.value = d(r, \"id\");\n }\n}\nasync function oe(e, t) {\n const { service: i, property: o, transform: n, ...r } = t ?? {}, c = n ?? ((a) => a), s = O(e);\n for (const [a, u] of Object.entries(r))\n e.on(a, u);\n i && o && f(() => i.setState(o, c(s.modelsArray.value))), await s.refresh();\n}\nfunction P() {\n globalThis.testingRuntime && Object.assign(globalThis.testingRuntime, B);\n}\nfunction ne(e) {\n return {\n install() {\n const t = new _();\n P(), F(t), L(e.models), l.on(\"purge-storage\", () => t.purgeDatabase());\n }\n };\n}\nexport {\n V as computedModel,\n X as computedModels,\n ne as default,\n $ as getTrackedModels,\n ee as ignoreModelsCollection,\n C as resetTrackedModels,\n B as testingRuntime,\n oe as trackModels,\n te as trackModelsCollection,\n Y as useModelCollection,\n Z as useModelEvent\n};\n//# sourceMappingURL=aerogel-plugin-soukai.js.map\n","import {\n Metadata,\n Operation,\n SolidACLAuthorization,\n SolidContainer,\n SolidContainsRelation,\n SolidDocument,\n SolidModel,\n isContainerClass,\n isSolidDocumentRelation,\n} from 'soukai-solid';\nimport { arrayFilter, isInstanceOf } from '@noeldemartin/utils';\n\nimport type { SolidContainerConstructor, SolidModelConstructor } from 'soukai-solid';\n\nconst containerRelations: WeakMap<typeof SolidModel, string[]> = new WeakMap();\nconst sameDocumentRelations: WeakMap<typeof SolidModel, string[]> = new WeakMap();\n\nexport function getContainerRegisteredClasses(modelClass: SolidContainerConstructor): SolidModelConstructor[] {\n return arrayFilter(\n getContainerRelations(modelClass).map((relation) => {\n const relatedClass = modelClass.instance().requireRelation<SolidContainsRelation>(relation).relatedClass;\n\n if (isContainerClass(relatedClass)) {\n return false;\n }\n\n return relatedClass;\n }),\n );\n}\n\nexport function getContainerRelations(modelClass: typeof SolidModel): string[] {\n if (!containerRelations.has(modelClass)) {\n containerRelations.set(\n modelClass,\n modelClass.relations.filter((relation) => {\n if (SolidModel.reservedRelations.includes(relation)) {\n return false;\n }\n\n const relationInstance = modelClass.instance().requireRelation(relation);\n\n return relationInstance instanceof SolidContainsRelation;\n }),\n );\n }\n\n return containerRelations.get(modelClass) ?? [];\n}\n\nexport function getContainedModels(model: SolidContainer): SolidModel[] {\n const relations = getContainerRelations(model.static());\n\n return relations.reduce(\n (models, relation) => models.concat(model.getRelationModels(relation) ?? []),\n [] as SolidModel[],\n );\n}\n\nexport function getRelatedClasses(modelClass: SolidModelConstructor): SolidModelConstructor[] {\n const relatedClasses = new Set<SolidModelConstructor>();\n const instance = modelClass.instance();\n\n relatedClasses.add(modelClass);\n\n for (const relation of modelClass.relations) {\n if (modelClass.reservedRelations.includes(relation)) {\n continue;\n }\n\n relatedClasses.add(instance.requireRelation(relation).relatedClass);\n }\n\n return [...relatedClasses.values()];\n}\n\nexport function getRelatedAppModels(model: SolidModel): SolidModel[] {\n return model\n .getRelatedModels()\n .filter(\n (related) =>\n !isInstanceOf(related, SolidACLAuthorization) &&\n !isInstanceOf(related, SolidDocument) &&\n !isInstanceOf(related, Metadata) &&\n !isInstanceOf(related, Operation) &&\n related.static() !== SolidContainer,\n );\n}\n\nexport function getSameDocumentRelations(modelClass: typeof SolidModel): string[] {\n if (!sameDocumentRelations.has(modelClass)) {\n sameDocumentRelations.set(\n modelClass,\n modelClass.relations.filter((relation) => {\n if (SolidModel.reservedRelations.includes(relation)) {\n return false;\n }\n\n const relationInstance = modelClass.instance().requireRelation(relation);\n\n return isSolidDocumentRelation(relationInstance) && relationInstance.useSameDocument;\n }),\n );\n }\n\n return sameDocumentRelations.get(modelClass) ?? [];\n}\n\nexport function isDirtyOrHasDirtyChildren(model: SolidModel): boolean {\n if (model.isDirty()) {\n return true;\n }\n\n if (!(model instanceof SolidContainer)) {\n return false;\n }\n\n const relationHasDirtyModels = (relation: string) => {\n return model.getRelationModels(relation)?.some((relatedModel) => isDirtyOrHasDirtyChildren(relatedModel));\n };\n\n return getContainerRelations(model.static()).some(relationHasDirtyModels);\n}\n","import { after, arrayRemove, facade, required } from '@noeldemartin/utils';\nimport { App } from '@aerogel/core';\nimport { type SolidModel, isContainer } from 'soukai-solid';\n\nimport { getContainedModels } from '@aerogel/plugin-local-first/lib/inference';\n\nconst Cloud = required(() => App.service('$cloud'));\n\nclass SyncQueue {\n\n private models: Set<SolidModel> = new Set();\n private promises: Promise<unknown>[] = [];\n\n public push(model: SolidModel): void {\n this.models.add(model);\n this.syncAfter(after({ seconds: 1 }));\n }\n\n public clear(models?: SolidModel[]): void {\n if (!models) {\n this.models = new Set();\n\n return;\n }\n\n for (const model of models) {\n this.models.delete(model);\n }\n }\n\n protected async syncAfter<T = void>(operationOrPromise: Promise<T> | (() => Promise<T>)): Promise<T> {\n const promise = typeof operationOrPromise === 'function' ? operationOrPromise() : operationOrPromise;\n\n this.promises.push(promise);\n\n promise.then(() => arrayRemove(this.promises, promise));\n\n if (this.promises.length === 1) {\n this.schedule();\n }\n\n return promise as Promise<T>;\n }\n\n private schedule(): void {\n Promise.all(this.promises)\n .then(() => after())\n .then(() => {\n if (this.promises.length !== 0) {\n this.schedule();\n\n return;\n }\n\n const models = this.consume();\n\n if (models.length === 0) {\n return;\n }\n\n Cloud.syncIfOnline(models);\n });\n }\n\n private consume(): SolidModel[] {\n const models: SolidModel[] = [];\n const children: Set<SolidModel> = new Set();\n\n for (const model of this.models) {\n if (!isContainer(model)) {\n continue;\n }\n\n this.models.delete(model);\n getContainedModels(model).forEach((child) => children.add(child));\n models.push(model);\n }\n\n for (const model of this.models) {\n this.models.delete(model);\n\n if (children.has(model)) {\n continue;\n }\n\n models.push(model);\n }\n\n return models;\n }\n\n}\n\nexport default facade(SyncQueue);\n","import { bootModels } from 'soukai';\nimport {\n fail,\n objectWithout,\n requireUrlParentDirectory,\n required,\n tap,\n toString,\n urlResolveDirectory,\n urlRoute,\n} from '@noeldemartin/utils';\nimport { App } from '@aerogel/core';\nimport { getTrackedModels, trackModelsCollection as trackSoukaiModelsCollection } from '@aerogel/plugin-soukai';\nimport { Solid } from '@aerogel/plugin-solid';\nimport { PropertyOperation, SolidContainer, SolidContainsRelation, Tombstone } from 'soukai-solid';\nimport type { ObjectsMap } from '@noeldemartin/utils';\nimport type { Attributes } from 'soukai';\nimport type { SolidModel, SolidModelConstructor, SolidSchemaDefinition } from 'soukai-solid';\n\nimport SyncQueue from '@aerogel/plugin-local-first/lib/SyncQueue';\nimport { getContainerRelations, getRelatedAppModels } from '@aerogel/plugin-local-first/lib/inference';\n\ninterface CloneOptions {\n clean?: boolean;\n}\n\nconst Cloud = required(() => App.service('$cloud'));\nconst remoteClasses: WeakMap<SolidModelConstructor, SolidModelConstructor> = new WeakMap();\nconst localClasses: WeakMap<SolidModelConstructor, SolidModelConstructor> = new WeakMap();\n\nfunction cleanRemoteModelClone(remoteModel: SolidModel): void {\n const relatedModels = remoteModel.getRelatedModels().concat([remoteModel]);\n\n for (const relatedModel of relatedModels) {\n relatedModel.cleanDirty(true);\n }\n}\n\nfunction fixRemoteModelClone(remoteModel: SolidModel): void {\n const relatedModels = getRelatedAppModels(remoteModel).concat([remoteModel]);\n\n for (const relatedModel of relatedModels) {\n if (!relatedModel.operations || relatedModel.operations.length === 0) {\n continue;\n }\n\n const operations = (relatedModel.operations ?? []).filter((operation) => {\n return (\n !(operation instanceof PropertyOperation) ||\n !relatedModel.ignoreRdfPropertyHistory(operation.property, true)\n );\n });\n\n if (!operations.some((operation) => !operation.isInception(relatedModel))) {\n relatedModel.setRelationModels('operations', []);\n\n continue;\n }\n\n relatedModel.setRelationModels('operations', operations);\n }\n}\n\nexport async function createRemoteModel(localModel: SolidModel): Promise<void> {\n Cloud.setState({\n localModelUpdates: {\n ...Cloud.localModelUpdates,\n [localModel.url]: 1,\n },\n });\n\n if (isRegisteredModelClass(localModel.static())) {\n await trackModelsCollection(localModel.static(), requireUrlParentDirectory(localModel.url));\n }\n\n if (Cloud.autoPush && Cloud.ready && !Cloud.syncing) {\n SyncQueue.push(localModel);\n }\n}\n\nexport async function trackModelsCollection(modelClass: SolidModelConstructor, collection: string): Promise<void> {\n if (Cloud.modelCollections[modelClass.modelName]?.includes(collection)) {\n return;\n }\n\n Cloud.setState('modelCollections', {\n ...Cloud.modelCollections,\n [modelClass.modelName]: (Cloud.modelCollections[modelClass.modelName] ?? []).concat(collection),\n });\n\n await trackSoukaiModelsCollection(modelClass, collection);\n}\n\nexport async function updateRemoteModel(localModel: SolidModel): Promise<void> {\n if (ignoreModelUpdates(localModel)) {\n return;\n }\n\n const modelUpdates = Cloud.localModelUpdates[localModel.url] ?? 0;\n\n Cloud.setState({\n localModelUpdates: localModel.isSoftDeleted()\n ? objectWithout(Cloud.localModelUpdates, localModel.url)\n : {\n ...Cloud.localModelUpdates,\n [localModel.url]: modelUpdates + 1,\n },\n });\n\n if (Cloud.autoPush && Cloud.ready && !Cloud.syncing) {\n SyncQueue.push(localModel);\n }\n}\n\nexport function clearLocalModelUpdates(models?: SolidModel[], malformedDocuments?: Set<string>): void {\n const syncedModelUrls = models?.map((model) => toString(model.getDeletedPrimaryKey() ?? model.getPrimaryKey()));\n const localModelUpdates = {} as Record<string, number>;\n\n for (const [url, count] of Object.entries(Cloud.localModelUpdates)) {\n const documentUrl = urlRoute(url);\n const wasSynced =\n !syncedModelUrls ||\n syncedModelUrls.some(\n (modelUrl) => url === modelUrl || (modelUrl.endsWith('/') && url.startsWith(modelUrl)),\n );\n\n if (wasSynced && !malformedDocuments?.has(documentUrl)) {\n continue;\n }\n\n localModelUpdates[url] = count;\n }\n\n Cloud.setState({ localModelUpdates });\n}\n\nexport function cloneLocalModel(localModel: SolidModel, options: CloneOptions = {}): SolidModel {\n const localModelClasses = new Set<typeof SolidModel>();\n\n localModelClasses.add(localModel.static());\n\n if (localModel instanceof SolidContainer) {\n for (const relation of getContainerRelations(localModel.static())) {\n localModelClasses.add(localModel.requireRelation<SolidContainsRelation>(relation).relatedClass);\n }\n }\n\n const constructors = [...localModelClasses.values()].map(\n (localClass) => [localClass, getRemoteClass(localClass)] as [typeof SolidModel, typeof SolidModel],\n );\n\n return tap(localModel.clone({ constructors }), (model) => {\n fixRemoteModelClone(model);\n\n options.clean && cleanRemoteModelClone(model);\n });\n}\n\nexport function cloneRemoteModel(remoteModel: SolidModel): SolidModel {\n const remoteModelClasses = new Set<typeof SolidModel>();\n\n remoteModelClasses.add(remoteModel.static());\n\n if (remoteModel instanceof SolidContainer) {\n for (const relation of getContainerRelations(remoteModel.static())) {\n remoteModelClasses.add(remoteModel.requireRelation<SolidContainsRelation>(relation).relatedClass);\n }\n }\n\n const constructors = [...remoteModelClasses.values()].map(\n (remoteClass) => [remoteClass, getLocalClass(remoteClass)] as [typeof SolidModel, typeof SolidModel],\n );\n\n return remoteModel.clone({ constructors });\n}\n\nexport async function completeRemoteModels(\n localModels: SolidModel[],\n remoteModels: SolidModel[],\n malformedDocuments: Set<string>,\n): Promise<SolidModel[]> {\n const RemoteTombstone = getRemoteClass(Tombstone);\n const remoteModelUrls = remoteModels.map((remoteModel) => remoteModel.url);\n const missingModelDocumentUrls = localModels\n .filter((localModel) => !remoteModelUrls.includes(localModel.url))\n .map((localModel) => localModel.requireDocumentUrl())\n .filter((documentUrl) => !malformedDocuments.has(documentUrl));\n const tombstones = await RemoteTombstone.all({ $in: missingModelDocumentUrls });\n\n return remoteModels.concat(tombstones);\n}\n\nexport function ignoreModelUpdates(localModel: SolidModel): boolean {\n const updatedAt = localModel.metadata.updatedAt?.getTime();\n\n return !localModel.operations.some((operation) => {\n if (operation.date.getTime() !== updatedAt) {\n return false;\n }\n\n if (!(operation instanceof PropertyOperation)) {\n return true;\n }\n\n return !localModel.ignoreRdfPropertyHistory(operation.property, true);\n });\n}\n\nexport function getLocalModel(remoteModel: SolidModel, localModels: ObjectsMap<SolidModel>): SolidModel {\n return localModels.get(remoteModel.url) ?? cloneRemoteModel(remoteModel);\n}\n\nexport function getLocalModels(): SolidModel[] {\n return [...Cloud.registeredModels].map(({ modelClass }) => getTrackedModels(modelClass)).flat();\n}\n\nexport function getSchemaMigrations(): Map<SolidModelConstructor, SolidModelConstructor | SolidSchemaDefinition> {\n return Cloud.schemaMigrations;\n}\n\nexport function clearSchemaMigrations(): void {\n Cloud.schemaMigrations.clear();\n}\n\nexport function getSchemaMigration(\n modelClass: SolidModelConstructor,\n): SolidModelConstructor | SolidSchemaDefinition | undefined {\n return Cloud.schemaMigrations.get(modelClass);\n}\n\nexport function getRemoteClass<T extends SolidModelConstructor>(localClass: T): T {\n return (remoteClasses.get(localClass) as T) ?? makeRemoteClass(localClass);\n}\n\nexport function getRemoteContainersCollection(path?: string): string {\n const rootStorage = Solid.requireUser().storageUrls[0];\n\n return path\n ? urlResolveDirectory((path.startsWith('/') ? rootStorage.slice(0, -1) : rootStorage) + path)\n : rootStorage;\n}\n\nexport function getRemoteModel(localModel: SolidModel, remoteModels: ObjectsMap<SolidModel>): SolidModel {\n return remoteModels.get(localModel.url) ?? cloneLocalModel(localModel);\n}\n\nexport function isRegisteredModel(model: SolidModel): boolean {\n for (const { modelClass } of Cloud.registeredModels) {\n const models = getTrackedModels(modelClass);\n\n if (models.some((registeredModel) => registeredModel.url === model.url)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isRemoteModel(model: SolidModel): boolean {\n return localClasses.has(model.static());\n}\n\nexport function isLocalModel(model: SolidModel): boolean {\n return !isRemoteModel(model);\n}\n\nexport function isRegisteredModelClass(modelClass: SolidModelConstructor): boolean {\n return Cloud.registeredModels.some(({ modelClass: registeredModelClass }) => registeredModelClass === modelClass);\n}\n\nexport function makeRemoteClass<T extends SolidModelConstructor>(localClass: T): T {\n const LocalClass = localClass as typeof SolidModel;\n const withLocalHistoryConfig = (modelClass: typeof SolidModel, operation: () => unknown) => {\n modelClass.timestamps = LocalClass.timestamps;\n modelClass.history = LocalClass.history;\n\n operation();\n\n modelClass.timestamps = [];\n modelClass.history = false;\n };\n const RemoteClass = class extends LocalClass {\n\n public static override timestamps = false;\n public static override history = false;\n\n protected override initialize(attributes: Attributes, exists: boolean): void {\n withLocalHistoryConfig(this._proxy.static(), () => super.initialize(attributes, exists));\n }\n\n protected override initializeRelations(): void {\n super.initializeRelations();\n\n for (const relation of Object.values(this._relations)) {\n if (!(relation instanceof SolidContainsRelation)) {\n continue;\n }\n\n relation.relatedClass = getRemoteClass(relation.relatedClass);\n }\n }\n\n public override fixMalformedAttributes(): void {\n withLocalHistoryConfig(this.static(), () => super.fixMalformedAttributes());\n }\n \n } as unknown as T;\n\n remoteClasses.set(LocalClass, RemoteClass);\n localClasses.set(RemoteClass, LocalClass);\n\n LocalClass.on('schema-updated', async (schema) => {\n await RemoteClass.updateSchema({\n ...schema,\n timestamps: false,\n history: false,\n });\n });\n\n bootModels({ [`Remote${localClass.modelName}`]: RemoteClass });\n\n return RemoteClass;\n}\n\nexport function getLocalClass<T extends SolidModelConstructor>(remoteClass: T): T {\n return (localClasses.get(remoteClass) as T) ?? fail(`Couldn't find local class for ${remoteClass.modelName}`);\n}\n","import { Job } from '@aerogel/core';\nimport { requireEngine } from 'soukai';\nimport { requireUrlParentDirectory } from '@noeldemartin/utils';\nimport { ignoreModelsCollection, trackModelsCollection } from '@aerogel/plugin-soukai';\nimport type { EngineDocument, IndexedDBEngine } from 'soukai';\nimport type { SolidModelConstructor } from 'soukai-solid';\n\ninterface Migration {\n modelClass: SolidModelConstructor;\n local: string;\n remote: string;\n}\n\nexport default class Backup extends Job {\n\n private urlMigrations: Migration[] = [];\n private collectionMigrations: Migration[] = [];\n\n public migrateUrl(modelClass: SolidModelConstructor, local: string, remote: string): void {\n this.urlMigrations.push({\n modelClass,\n local,\n remote,\n });\n }\n\n public migrateCollection(modelClass: SolidModelConstructor, local: string, remote: string): void {\n this.collectionMigrations.push({\n modelClass,\n local,\n remote,\n });\n }\n\n protected async run(): Promise<void> {\n const engine = requireEngine<IndexedDBEngine>();\n const collections = await engine.getCollections();\n\n for (const collection of collections) {\n const documents = await engine.readMany(collection);\n\n for (const [id, document] of Object.entries(documents)) {\n const url = this.replaceUrl(id);\n\n await engine.create(requireUrlParentDirectory(url), this.replaceDocumentUrls(document), url);\n await engine.delete(collection, id);\n }\n }\n\n for (const { modelClass, remote } of this.urlMigrations) {\n trackModelsCollection(modelClass, requireUrlParentDirectory(remote), { refresh: false });\n }\n\n for (const { modelClass, local, remote } of this.collectionMigrations) {\n ignoreModelsCollection(modelClass, local);\n trackModelsCollection(modelClass, remote, { refresh: false });\n }\n }\n\n protected replaceDocumentUrls(document: EngineDocument): EngineDocument {\n for (const [key, value] of Object.entries(document)) {\n if (key === '@id' && typeof value === 'string') {\n document[key] = this.replaceUrl(value);\n\n continue;\n }\n\n if (typeof value !== 'object' || value === null) {\n continue;\n }\n\n document[key] = this.replaceDocumentUrls(value as EngineDocument);\n }\n\n return document;\n }\n\n protected replaceUrl(url: string): string {\n for (const { local, remote } of this.urlMigrations) {\n if (!url.startsWith(local)) {\n continue;\n }\n\n return url.replace(local, remote);\n }\n\n for (const { local, remote } of this.collectionMigrations) {\n if (!url.startsWith(local)) {\n continue;\n }\n\n return url.replace(local, remote);\n }\n\n return url;\n }\n\n}\n","import { Events, Service } from '@aerogel/core';\nimport { IndexedDBMap, facade } from '@noeldemartin/utils';\n\nexport class DocumentsCacheService extends Service {\n\n private cache = new IndexedDBMap<{ modifiedAt: number }>('documents-cache');\n\n public async isFresh(documentUrl: string, modifiedAt: Date | number): Promise<boolean> {\n const meta = await this.cache.get(documentUrl);\n const modifiedAtTime = typeof modifiedAt !== 'number' ? modifiedAt.getTime() : modifiedAt;\n\n return !!meta?.modifiedAt && meta.modifiedAt >= modifiedAtTime;\n }\n\n public async remember(documentUrl: string, modifiedAt: Date | number): Promise<void> {\n await this.cache.set(documentUrl, {\n modifiedAt: typeof modifiedAt !== 'number' ? modifiedAt.getTime() : modifiedAt,\n });\n }\n\n public async forget(documentUrl: string): Promise<void> {\n await this.cache.delete(documentUrl);\n }\n\n protected override async boot(): Promise<void> {\n Events.on('auth:logout', async () => {\n await this.cache.clear();\n\n this.cache.close();\n });\n }\n\n}\n\nexport default facade(DocumentsCacheService);\n","export function mapFromArray<K, V>(items: [K, V][]): Map<K, V> {\n const itemsMap = new Map();\n\n for (const [key, value] of items) {\n itemsMap.set(key, value);\n }\n\n return itemsMap;\n}\n\nexport function lazy<T>(getter: () => Promise<T>): () => Promise<T> {\n const result: { value?: T } = {};\n\n return async () => {\n if (!('value' in result)) {\n result.value = await getter();\n }\n\n return result.value as T;\n };\n}\n","import { arrayChunk, arrayFrom, isInstanceOf, map, required } from '@noeldemartin/utils';\nimport { DocumentNotFound } from 'soukai';\nimport { MalformedSolidDocumentError } from '@noeldemartin/solid-utils';\nimport { Tombstone } from 'soukai-solid';\nimport type { JobStatus } from '@aerogel/core';\nimport type { ObjectsMap } from '@noeldemartin/utils';\nimport type { SolidContainer, SolidContainsRelation, SolidDocument, SolidModel } from 'soukai-solid';\n\nimport DocumentsCache from '@aerogel/plugin-local-first/services/DocumentsCache';\nimport { cloneLocalModel, isLocalModel } from '@aerogel/plugin-local-first/lib/mirroring';\nimport { getContainerRelations } from '@aerogel/plugin-local-first/lib/inference';\nimport { lazy } from '@aerogel/plugin-local-first/lib/utils';\n\nexport interface ResourceJobStatus extends JobStatus {\n documentUrl?: string;\n children?: ResourceJobStatus[];\n}\n\nexport default class LoadsChildren {\n\n declare protected localModels?: ObjectsMap<SolidModel>;\n\n protected async loadContainedModels(\n model: SolidContainer,\n options: {\n ignoreTombstones?: boolean;\n status?: ResourceJobStatus;\n onLoaded?: (urls: string[]) => unknown;\n onMalformedDocument?: (url: string) => unknown;\n } = {},\n ): Promise<SolidModel[]> {\n if (isLocalModel(model)) {\n const children = [];\n\n for (const relation of getContainerRelations(model.static())) {\n const relationModels =\n (await model.loadRelationIfUnloaded<SolidModel | SolidModel[] | null>(relation)) ?? [];\n\n children.push(...arrayFrom(relationModels));\n }\n\n return children;\n }\n\n const children: Record<string, SolidModel[]> = {};\n const tombstones: Tombstone[] = [];\n const documents = map(model.documents, 'url');\n const documentUrlChunks = arrayChunk(model.resourceUrls, 10);\n const statusChildren = documentUrlChunks.flat().map((url) => ({\n documentUrl: url,\n completed: false,\n }));\n const statusChildrenMap = map(statusChildren, 'documentUrl');\n\n if (options.status) {\n options.status.children = statusChildren;\n }\n\n for (const documentUrls of documentUrlChunks) {\n await Promise.all(\n documentUrls.map(async (documentUrl) => {\n const { children: documentChildren, tombstones: documentTombstones } =\n await this.loadDocumentChildren(model, documentUrl, documents, options.onMalformedDocument);\n\n tombstones.push(...documentTombstones);\n\n for (const [relation, documentModels] of Object.entries(documentChildren)) {\n const relationChildren = (children[relation] ??= []);\n\n relationChildren.push(...documentModels);\n }\n }),\n );\n\n for (const documentUrl of documentUrls) {\n if (documentUrl.endsWith('/')) {\n continue;\n }\n\n required(statusChildrenMap.get(documentUrl)).completed = true;\n }\n\n await options.onLoaded?.(documentUrls);\n }\n\n for (const [relation, relationModels] of Object.entries(children)) {\n model.setRelationModels(relation, relationModels);\n }\n\n const childrenArray = options.ignoreTombstones\n ? Object.values(children).flat()\n : Object.values(children).flat().concat(tombstones);\n\n if (options.status) {\n options.status.children = childrenArray.map((child) => {\n return required(statusChildrenMap.get(child.requireDocumentUrl()));\n });\n }\n\n return childrenArray;\n }\n\n protected async loadDocumentChildren(\n model: SolidModel,\n documentUrl: string,\n documents: ObjectsMap<SolidDocument>,\n onMalformedDocument?: (url: string) => unknown,\n ): Promise<{ children: Record<string, SolidModel[]>; tombstones: Tombstone[] }> {\n const document = documents.get(documentUrl);\n\n if (\n document &&\n (await DocumentsCache.isFresh(document.url, document.updatedAt ?? new Date())) &&\n this.localModels?.hasKey(model.url)\n ) {\n return {\n children: await this.loadDocumentChildrenFromLocal(model, document),\n tombstones: [],\n };\n }\n\n return this.loadDocumentChildrenFromRemote(model, documentUrl, onMalformedDocument);\n }\n\n protected async loadDocumentChildrenFromLocal(\n model: SolidModel,\n document: SolidDocument,\n ): Promise<Record<string, SolidModel[]>> {\n const children: Record<string, SolidModel[]> = {};\n\n for (const relation of getContainerRelations(model.static())) {\n const relationInstance = model.requireRelation<SolidContainsRelation>(relation);\n\n if (relationInstance.loaded) {\n children[relation] = relationInstance.getLoadedModels();\n\n continue;\n }\n\n const relatedLocalModels = this.localModels?.get(model.url)?.getRelationModels(relation) ?? [];\n\n children[relation] = relatedLocalModels\n .filter((relatedLocalModel) => relatedLocalModel.getDocumentUrl() === document.url)\n .map((relatedLocalModel) => cloneLocalModel(relatedLocalModel, { clean: true }));\n }\n\n return children;\n }\n\n protected async loadDocumentChildrenFromRemote(\n model: SolidModel,\n documentUrl: string,\n onMalformedDocument?: (url: string) => unknown,\n ): Promise<{ children: Record<string, SolidModel[]>; tombstones: Tombstone[] }> {\n const children: Record<string, SolidModel[]> = {};\n const tombstones: Tombstone[] = [];\n const readDocument = lazy(async () => {\n try {\n const document = await model.requireEngine().readOne(model.static('collection'), documentUrl);\n const documentTombstones = await Tombstone.createManyFromEngineDocuments({\n [documentUrl]: document,\n });\n\n tombstones.push(...documentTombstones);\n\n return document;\n } catch (error) {\n if (isInstanceOf(error, DocumentNotFound)) {\n return null;\n }\n\n if (isInstanceOf(error, MalformedSolidDocumentError)) {\n // eslint-disable-next-line no-console\n console.warn(error.message);\n\n await onMalformedDocument?.(documentUrl);\n\n return null;\n }\n\n throw error;\n }\n });\n\n for (const relation of getContainerRelations(model.static())) {\n const relationInstance = model.requireRelation<SolidContainsRelation>(relation);\n\n if (relationInstance.loaded) {\n children[relation] = relationInstance.getLoadedModels();\n\n continue;\n }\n\n const document = await readDocument();\n\n if (!document) {\n continue;\n }\n\n const documentChildren = await relationInstance.relatedClass.createManyFromEngineDocuments({\n [documentUrl]: document,\n });\n\n children[relation] = documentChildren;\n }\n\n return { children, tombstones };\n }\n\n}\n","import { Solid } from '@aerogel/plugin-solid';\nimport type { SolidTypeIndex } from 'soukai-solid';\nimport type { SolidUserProfile } from '@noeldemartin/solid-utils';\n\nconst typeIndexes: WeakMap<SolidUserProfile, SolidTypeIndex | null> = new WeakMap();\n\nexport default class LoadsTypeIndex {\n\n protected async loadTypeIndex(options: { create: true }): Promise<SolidTypeIndex>;\n protected async loadTypeIndex(options?: { create: false }): Promise<SolidTypeIndex | null>;\n protected async loadTypeIndex(options: { create?: boolean } = {}): Promise<SolidTypeIndex | null> {\n const user = Solid.requireUser();\n\n if (options.create && !typeIndexes.get(user)) {\n typeIndexes.set(user, await Solid.findOrCreatePrivateTypeIndex());\n } else if (!typeIndexes.has(user)) {\n typeIndexes.set(user, await Solid.findPrivateTypeIndex());\n }\n\n return typeIndexes.get(user) ?? null;\n }\n\n}\n","import type { ObjectsMap } from '@noeldemartin/utils';\nimport type { SolidModel } from 'soukai-solid';\n\nimport { getContainerRelations } from '@aerogel/plugin-local-first/lib/inference';\n\nexport default class TracksLocalModels {\n\n declare protected localModels?: ObjectsMap<SolidModel>;\n\n protected async indexLocalModels(models: SolidModel[]): Promise<void> {\n for (const localModel of models) {\n await this.addLocalModel(localModel);\n }\n }\n\n protected async addLocalModel(localModel: SolidModel): Promise<void> {\n if (!this.localModels || this.localModels.hasKey(localModel.url)) {\n return;\n }\n\n this.localModels.add(localModel);\n\n for (const relation of getContainerRelations(localModel.static())) {\n await localModel.loadRelationIfUnloaded(relation);\n }\n\n for (const relatedModel of localModel.getRelatedModels()) {\n await this.addLocalModel(relatedModel);\n }\n }\n\n}\n","import { PropertyOperation, isContainer } from 'soukai-solid';\nimport { Job } from '@aerogel/core';\nimport { isInstanceOf, map, mixed, objectMap, tap } from '@noeldemartin/utils';\nimport type { JobListener, JobStatus } from '@aerogel/core';\nimport type { Nullable } from '@noeldemartin/utils';\nimport type { SolidModel, SolidTypeIndex } from 'soukai-solid';\n\nimport {\n clearSchemaMigrations,\n getRemoteClass,\n getSchemaMigration,\n getSchemaMigrations,\n} from '@aerogel/plugin-local-first/lib/mirroring';\nimport { getContainerRegisteredClasses } from '@aerogel/plugin-local-first/lib/inference';\n\nimport LoadsChildren from './mixins/LoadsChildren';\nimport LoadsTypeIndex from './mixins/LoadsTypeIndex';\nimport TracksLocalModels from './mixins/TracksLocalModels';\n\nconst BaseJob = Job as typeof Job<JobListener, MigrateJobStatus, MigrateJobStatus>;\n\nexport interface MigrateJobStatus extends JobStatus {\n children?: MigrateModelJobStatus[];\n}\n\nexport interface MigrateModelJobStatus extends JobStatus {\n modelUrl: string;\n children?: MigrateModelJobStatus[];\n}\n\nexport default class Migrate extends mixed(BaseJob, [LoadsChildren, LoadsTypeIndex, TracksLocalModels]) {\n\n public static restore(status: MigrateJobStatus): Migrate {\n return tap(new Migrate(), (job) => {\n job.status = status;\n });\n }\n\n protected _models?: SolidModel[];\n\n public get models(): SolidModel[] | undefined {\n return this._models;\n }\n\n public set models(models: SolidModel[] | undefined) {\n if (!models) {\n delete this._models;\n delete this.localModels;\n\n return;\n }\n\n const childrenStatus = objectMap(this.status.children ?? [], 'modelUrl');\n\n this._models = models;\n this.localModels = map([], 'url');\n this.status.children = models.map(\n (model) =>\n childrenStatus[model.url] ?? {\n modelUrl: model.url,\n completed: false,\n },\n );\n }\n\n protected async run(): Promise<void> {\n if (!this.models) {\n throw new Error('Cant start migration without models');\n }\n\n await this.indexLocalModels(this.models);\n\n const modelStatuses = this.status.children ?? [];\n const typeIndex = await this.loadTypeIndex();\n\n for (const modelStatus of modelStatuses) {\n const model = this.models.find(({ url }) => modelStatus.modelUrl === url);\n\n if (!model || modelStatus.completed) {\n continue;\n }\n\n await this.migrateRegisteredModel(model, modelStatus, typeIndex);\n await this.updateProgress(() => (modelStatus.completed = true));\n }\n\n for (const [modelClass, schema] of getSchemaMigrations()) {\n await modelClass.updateSchema(schema);\n }\n\n clearSchemaMigrations();\n }\n\n protected async migrateRegisteredModel(\n model: SolidModel,\n status: MigrateModelJobStatus,\n typeIndex?: Nullable<SolidTypeIndex>,\n ): Promise<void> {\n await this.migrate(model, status);\n\n if (!isContainer(model)) {\n return;\n }\n\n const registeredClasses = getContainerRegisteredClasses(model.static());\n const registration = typeIndex?.registrations.find(({ instanceContainer }) => instanceContainer === model.url);\n\n if (!typeIndex || !registration || registeredClasses.length === 0) {\n return;\n }\n\n registration.setAttribute(\n 'forClass',\n registeredClasses\n .map((modelClass) => getSchemaMigration(modelClass)?.rdfsClasses ?? modelClass.rdfsClass)\n .flat(),\n );\n\n await typeIndex.save();\n }\n\n protected async migrate(localModel: SolidModel, status: MigrateModelJobStatus): Promise<void> {\n this.assertNotCancelled();\n\n await this.migrateChildren(localModel, status);\n\n const schema = getSchemaMigration(localModel.static());\n\n if (!schema) {\n return;\n }\n\n const remoteModel = await getRemoteClass(localModel.static()).find(localModel.url);\n const migratedModel = await remoteModel?.migrateSchema(schema);\n\n await localModel.migrateSchema(schema, {\n mintOperationUrl: (operation) => {\n return migratedModel?.operations?.find((migratedOperation) => {\n if (\n !isInstanceOf(operation, PropertyOperation) ||\n !isInstanceOf(migratedOperation, PropertyOperation)\n ) {\n return false;\n }\n\n return (\n operation.property === migratedOperation.property &&\n operation.date.getTime() === migratedOperation.date.getTime()\n );\n })?.url;\n },\n });\n }\n\n protected async migrateChildren(localModel: SolidModel, status: MigrateModelJobStatus): Promise<void> {\n if (!isContainer(localModel)) {\n return;\n }\n\n const children = await this.loadContainedModels(localModel, { ignoreTombstones: true });\n\n status.children ??= children.map((child) => ({\n modelUrl: child.url,\n completed: false,\n }));\n\n for (const childStatus of status.children) {\n const child = children.find(({ url }) => childStatus.modelUrl === url);\n\n if (!child || childStatus.completed) {\n continue;\n }\n\n await this.migrate(child, childStatus);\n await this.updateProgress(() => (childStatus.completed = true));\n }\n }\n\n}\n","import { App, Job } from '@aerogel/core';\nimport { isInstanceOf, map, mixed, requireUrlParentDirectory, required, round } from '@noeldemartin/utils';\nimport { MalformedSolidDocumentError } from '@noeldemartin/solid-utils';\nimport { Solid } from '@aerogel/plugin-solid';\nimport { SolidModel, Tombstone, isContainer, isContainerClass } from 'soukai-solid';\nimport type { ObjectsMap } from '@noeldemartin/utils';\nimport type { JobListener, JobStatus } from '@aerogel/core';\nimport type { SolidContainsRelation, SolidEngine, SolidTypeRegistration } from 'soukai-solid';\n\nimport {\n clearLocalModelUpdates,\n cloneLocalModel,\n cloneRemoteModel,\n completeRemoteModels,\n getLocalModel,\n getLocalModels,\n getRemoteClass,\n getRemoteModel,\n isRegisteredModel,\n isRemoteModel,\n trackModelsCollection,\n} from '@aerogel/plugin-local-first/lib/mirroring';\nimport {\n getContainerRegisteredClasses,\n getContainerRelations,\n getRelatedAppModels,\n isDirtyOrHasDirtyChildren,\n} from '@aerogel/plugin-local-first/lib/inference';\nimport DocumentsCache from '@aerogel/plugin-local-first/services/DocumentsCache';\n\nimport LoadsChildren from './mixins/LoadsChildren';\nimport LoadsTypeIndex from './mixins/LoadsTypeIndex';\nimport TracksLocalModels from './mixins/TracksLocalModels';\nimport type { ResourceJobStatus } from './mixins/LoadsChildren';\n\nconst Cloud = required(() => App.service('$cloud'));\nconst BaseJob = Job as typeof Job<JobListener, SyncJobStatus, SyncJobStatus>;\n\ninterface SyncJobStatus extends JobStatus {\n root: true;\n children: [SyncPullJobStatus, JobStatus];\n}\n\ninterface SyncPullJobStatus extends JobStatus {\n children?: ResourceJobStatus[];\n}\n\nfunction isRootStatus(status?: JobStatus): status is SyncJobStatus {\n return !!status && 'root' in status;\n}\n\nexport default class Sync extends mixed(BaseJob, [LoadsChildren, LoadsTypeIndex, TracksLocalModels]) {\n\n protected models?: SolidModel[];\n protected dirtyRemoteModels?: SolidModel[];\n protected rootLocalModels: SolidModel[];\n protected tombstones: ObjectsMap<Tombstone>;\n protected malformedDocuments: Set<string>;\n protected documentsModifiedAt: Record<string, Date>;\n protected override localModels: ObjectsMap<SolidModel>;\n\n constructor(models?: SolidModel[]) {\n super();\n\n this.models = models;\n this.rootLocalModels = [];\n this.localModels = map([], 'url');\n this.tombstones = map([], 'resourceUrl');\n this.malformedDocuments = new Set();\n this.documentsModifiedAt = {};\n }\n\n protected async run(): Promise<void> {\n const engine = Solid.requireAuthenticator().engine as SolidEngine;\n const updateDocumentDate = (url: string, { headers }: { headers: Headers }) => {\n const date = headers?.get('last-modified');\n\n if (!date || url.endsWith('/')) {\n return;\n }\n\n this.documentsModifiedAt[url] = new Date(date);\n };\n const clearListener = engine.listeners.add({\n onDocumentRead: updateDocumentDate,\n onDocumentUpdated: updateDocumentDate,\n });\n\n try {\n this.rootLocalModels = this.models ?? getLocalModels();\n\n await this.indexLocalModels(this.rootLocalModels);\n await this.pullChanges();\n await this.pushChanges();\n } finally {\n clearListener();\n }\n }\n\n protected override getInitialStatus(): SyncJobStatus {\n return {\n root: true,\n completed: false,\n children: [{ completed: false }, { completed: false }],\n };\n }\n\n protected override calculateCurrentProgress(status?: JobStatus): number {\n status ??= this.status;\n\n if (isRootStatus(status)) {\n return round(\n this.calculateCurrentProgress(status.children[0]) * 0.9 +\n this.calculateCurrentProgress(status.children[1]) * 0.1,\n 2,\n );\n }\n\n return super.calculateCurrentProgress(status);\n }\n\n private async pullChanges(): Promise<void> {\n const remoteModelsArray = this.models\n ? await this.fetchRemoteModelsForLocal(this.models)\n : await this.fetchRemoteModels();\n const remoteModels = map(remoteModelsArray, (model) => {\n if (model instanceof Tombstone) {\n return model.resourceUrl;\n }\n\n return model.url;\n });\n\n this.dirtyRemoteModels = await this.synchronizeModels(remoteModels);\n\n await this.updateProgress((status) => (status.children[0].completed = true));\n }\n\n private async pushChanges(): Promise<void> {\n const remoteModels = this.dirtyRemoteModels ?? [];\n const childrenStatus = (this.status.children[1].children = remoteModels.map(() => ({ completed: false })));\n\n for (let index = 0; index < remoteModels.length; index++) {\n const remoteModel = remoteModels[index] as SolidModel;\n const childStatus = childrenStatus[index] as JobStatus;\n\n if (remoteModel.isSoftDeleted()) {\n remoteModel.enableHistory();\n remoteModel.enableTombstone();\n\n await remoteModel.delete();\n await this.updateProgress(() => (childStatus.completed = true));\n\n return;\n }\n\n await this.saveModelAndChildren(remoteModel, childStatus);\n await this.updateTypeRegistrations(remoteModel);\n await this.updateProgress(() => (childStatus.completed = true));\n }\n\n for (const [documentUrl, modifiedAt] of Object.entries(this.documentsModifiedAt)) {\n await DocumentsCache.remember(documentUrl, modifiedAt);\n }\n\n clearLocalModelUpdates(this.models, this.malformedDocuments);\n\n await this.updateProgress((status) => (status.children[1].completed = true));\n }\n\n private async fetchRemoteModels(): Promise<SolidModel[]> {\n const pullStatus = this.status.children[0];\n const typeIndex = await this.loadTypeIndex();\n\n if (!typeIndex) {\n return [];\n }\n\n const remoteModels: SolidModel[] = [];\n const processedContainerUrls = new Set();\n const registeredModels = [...Cloud.registeredModels].map(({ modelClass }) => {\n const registeredChildren = isContainerClass(modelClass) ? getContainerRegisteredClasses(modelClass) : [];\n\n return {\n modelClass,\n rdfsClasses:\n registeredChildren.length > 0\n ? registeredChildren.map((childrenClass) => childrenClass.rdfsClasses).flat()\n : modelClass.rdfsClasses,\n };\n });\n const registrations = typeIndex.registrations\n .map((registration) => {\n const registeredModel = registeredModels.find(\n ({ rdfsClasses }) =>\n !!registration.instanceContainer &&\n rdfsClasses.some((rdfsClass) => registration.forClass.includes(rdfsClass)),\n );\n\n if (\n !registeredModel ||\n !registration.instanceContainer ||\n processedContainerUrls.has(registration.instanceContainer)\n ) {\n return null;\n }\n\n processedContainerUrls.add(registration.instanceContainer);\n\n return [registration, registeredModel] as [SolidTypeRegistration, (typeof registeredModels)[number]];\n })\n .filter((match) => !!match);\n\n pullStatus.children = registrations.map(() => ({ completed: false }));\n\n for (let index = 0; index < registrations.length; index++) {\n await this.ignoringMalformedDocumentErrors(async () => {\n const registration = required(registrations[index])[0];\n const registeredModel = required(registrations[index])[1];\n const remoteClass = getRemoteClass(registeredModel.modelClass);\n\n if (!registration.instanceContainer) {\n return;\n }\n\n if (isContainerClass(remoteClass)) {\n await trackModelsCollection(\n registeredModel.modelClass,\n requireUrlParentDirectory(registration.instanceContainer),\n );\n\n const container = await remoteClass.find(registration.instanceContainer);\n\n if (container) {\n await this.loadChildren(container, required(pullStatus.children?.[index]));\n\n remoteModels.push(container);\n }\n\n await this.updateProgress(() => (required(pullStatus.children?.[index]).completed = true));\n\n return;\n }\n\n await trackModelsCollection(registeredModel.modelClass, registration.instanceContainer);\n\n remoteModels.push(...(await remoteClass.from(registration.instanceContainer).all()));\n\n await this.updateProgress(() => (required(pullStatus.children?.[index]).completed = true));\n });\n }\n\n return completeRemoteModels(this.rootLocalModels, remoteModels, this.malformedDocuments);\n }\n\n private async fetchRemoteModelsForLocal(models: SolidModel[]): Promise<SolidModel[]> {\n const remoteModels = [] as SolidModel[];\n const statusChildren = (this.status.children[0].children = models.map(() => ({ completed: false })));\n\n for (let index = 0; index < models.length; index++) {\n await this.ignoringMalformedDocumentErrors(async () => {\n const localModel = models[index] as SolidModel;\n const childStatus = statusChildren[index] as JobStatus;\n const remoteModel = await getRemoteClass(localModel.static()).find(localModel.url);\n\n if (!remoteModel) {\n await this.updateProgress(() => (childStatus.completed = true));\n\n return;\n }\n\n isContainer(remoteModel) && (await this.loadChildren(remoteModel, childStatus));\n\n remoteModels.push(remoteModel);\n\n await this.updateProgress(() => (childStatus.completed = true));\n });\n }\n\n return completeRemoteModels(models, remoteModels, this.malformedDocuments);\n }\n\n private async updateTypeRegistrations(remoteModel: SolidModel): Promise<void> {\n if (!isContainer(remoteModel) || !isRegisteredModel(remoteModel)) {\n return;\n }\n\n const registeredChildren = getContainerRegisteredClasses(remoteModel.static());\n\n if (registeredChildren.length === 0) {\n return;\n }\n\n const typeIndex = await this.loadTypeIndex({ create: true });\n\n if (typeIndex.registrations.some((registration) => registration.instanceContainer === remoteModel.url)) {\n return;\n }\n\n await remoteModel.register(typeIndex, registeredChildren);\n }\n\n private async loadChildren(model: SolidModel, childStatus?: JobStatus): Promise<void> {\n this.assertNotCancelled();\n\n if (!isContainer(model)) {\n return;\n }\n\n const children = await this.loadContainedModels(model, {\n status: childStatus,\n onLoaded: async () => {\n this.assertNotCancelled();\n\n await this.updateProgress();\n },\n onMalformedDocument: (url) => this.malformedDocuments.add(url),\n });\n\n for (let index = 0; index < children.length; index++) {\n const child = children[index] as SolidModel;\n\n if (child instanceof Tombstone) {\n this.tombstones.add(child);\n\n continue;\n }\n\n if (this.tombstones.hasKey(child.url)) {\n await this.deleteChild(model, child);\n\n continue;\n }\n\n await this.loadChildren(child, childStatus?.children?.[index]);\n\n if (childStatus?.children?.[index]) {\n await this.updateProgress(() => (required(childStatus.children?.[index]).completed = true));\n }\n }\n }\n\n private async deleteChild(model: SolidModel, child: SolidModel): Promise<void> {\n for (const relation of model.static('relations')) {\n const relationInstance = model.requireRelation(relation);\n\n if (!relationInstance.related) {\n continue;\n }\n\n if (Array.isArray(relationInstance.related)) {\n relationInstance.related = relationInstance.related.filter((relatedModel) => relatedModel !== child);\n\n continue;\n }\n\n if (relationInstance.related === child) {\n relationInstance.related = null;\n\n continue;\n }\n }\n\n await child.delete();\n }\n\n private async saveModelAndChildren(model: SolidModel, status?: JobStatus): Promise<void> {\n this.assertNotCancelled();\n\n if (isRemoteModel(model) && model.isSoftDeleted()) {\n model.enableHistory();\n model.enableTombstone();\n await model.delete();\n\n return;\n }\n\n if (this.malformedDocuments.has(model.requireDocumentUrl())) {\n return;\n }\n\n await model.save();\n\n if (!isContainer(model)) {\n if (isRemoteModel(model)) {\n const documentUrl = model.requireDocumentUrl();\n const modifiedAt = this.documentsModifiedAt[documentUrl] ?? new Date();\n\n await DocumentsCache.remember(documentUrl, modifiedAt);\n\n delete this.documentsModifiedAt[documentUrl];\n }\n\n return;\n }\n\n const children = getContainerRelations(model.static())\n .map((relation) => model.getRelationModels(relation) ?? [])\n .flat();\n\n const childrenStatuses = status ? children.map(() => ({ completed: false })) : [];\n\n if (status) {\n status.children = childrenStatuses;\n }\n\n for (let index = 0; index < children.length; index++) {\n const child = children[index] as SolidModel;\n const childStatus = childrenStatuses[index];\n\n await this.saveModelAndChildren(child, childStatus);\n\n if (childStatus) {\n await this.updateProgress(() => (childStatus.completed = true));\n }\n }\n }\n\n private async synchronizeModels(remoteModels: ObjectsMap<SolidModel>): Promise<SolidModel[]> {\n const synchronizedModelUrls = new Set<string>();\n const deletedModels = new Set<SolidModel>();\n\n for (const remoteModel of remoteModels.items()) {\n if (remoteModel instanceof Tombstone) {\n const localModel = this.localModels.get(remoteModel.resourceUrl);\n\n if (localModel) {\n await localModel.delete();\n\n deletedModels.add(localModel);\n }\n\n continue;\n }\n\n const localModel = getLocalModel(remoteModel, this.localModels);\n\n await this.loadChildren(localModel);\n await SolidModel.synchronize(localModel, remoteModel);\n await this.reconcileInconsistencies(localModel, remoteModel);\n await this.saveModelAndChildren(localModel);\n await this.addLocalModel(localModel);\n\n this.rootLocalModels.push(localModel);\n synchronizedModelUrls.add(localModel.url);\n }\n\n for (const localModel of this.rootLocalModels) {\n if (deletedModels.has(localModel) || synchronizedModelUrls.has(localModel.url)) {\n continue;\n }\n\n await this.loadChildren(localModel);\n\n const remoteModel = getRemoteModel(localModel, remoteModels);\n\n await SolidModel.synchronize(localModel, remoteModel);\n\n remoteModels.add(remoteModel);\n }\n\n const dirtyRemoteModels = [];\n\n for (const remoteModel of remoteModels.getItems()) {\n if (isDirtyOrHasDirtyChildren(remoteModel)) {\n dirtyRemoteModels.push(remoteModel);\n\n continue;\n }\n\n await this.rememberModelDocuments(remoteModel);\n }\n\n return dirtyRemoteModels;\n }\n\n private async reconcileInconsistencies(\n localModel: SolidModel,\n remoteModel: SolidModel,\n processedModels?: Set<SolidModel>,\n ): Promise<void> {\n localModel.rebuildAttributesFromHistory();\n localModel.setAttributes(remoteModel.getAttributes(true));\n\n processedModels ??= new Set();\n processedModels.add(localModel);\n\n for (const relation of getContainerRelations(localModel.static())) {\n await this.synchronizeContainerDocuments(\n localModel.requireRelation<SolidContainsRelation>(relation),\n remoteModel.requireRelation<SolidContainsRelation>(relation),\n );\n }\n\n const remoteRelatedModels = map(getRelatedAppModels(remoteModel), 'url');\n\n for (const localRelatedModel of getRelatedAppModels(localModel)) {\n if (\n processedModels.has(localRelatedModel) ||\n !localRelatedModel.isRelationLoaded('operations') ||\n !remoteRelatedModels.hasKey(localRelatedModel.url)\n ) {\n continue;\n }\n\n await this.reconcileInconsistencies(localRelatedModel, remoteRelatedModels.require(localRelatedModel.url));\n }\n\n if (localModel.isDirty()) {\n await localModel.save();\n await SolidModel.synchronize(localModel, remoteModel);\n }\n }\n\n private async synchronizeContainerDocuments(\n localRelation: SolidContainsRelation,\n remoteRelation: SolidContainsRelation,\n ): Promise<void> {\n const localModels = map(localRelation.related ?? [], 'url');\n const remoteModels = map(remoteRelation.related ?? [], 'url');\n const newLocalModelUrls = localModels\n .getKeys()\n .filter((url) => !remoteModels.hasKey(url) && !remoteModels.hasKey(encodeURI(url)));\n const newRemoteModelUrls = remoteModels\n .getKeys()\n .filter((url) => !localModels.hasKey(url) && !localModels.hasKey(encodeURI(url)));\n\n for (const url of newLocalModelUrls) {\n const localModel = localModels.require(url);\n const remoteModel = cloneLocalModel(localModel);\n\n remoteRelation.addRelated(remoteModel);\n remoteModels.add(remoteModel);\n }\n\n for (const url of newRemoteModelUrls) {\n const remoteModel = remoteModels.require(url);\n const localModel = cloneRemoteModel(remoteModel);\n\n localRelation.addRelated(localModel);\n localModels.add(localModel);\n }\n\n for (const localModel of localModels.items()) {\n const remoteModel = remoteModels.require(localModel.url);\n\n await SolidModel.synchronize(localModel, remoteModel);\n await this.saveModelAndChildren(localModel);\n }\n }\n\n private async rememberModelDocuments(model: SolidModel): Promise<void> {\n if (!isContainer(model)) {\n const documentUrl = model.requireDocumentUrl();\n const modifiedAt = this.documentsModifiedAt[documentUrl] ?? new Date();\n\n await DocumentsCache.remember(documentUrl, modifiedAt);\n\n delete this.documentsModifiedAt[documentUrl];\n\n return;\n }\n\n const children = getContainerRelations(model.static())\n .map((relation) => model.getRelationModels(relation) ?? [])\n .flat();\n\n for (const child of children) {\n await this.rememberModelDocuments(child);\n }\n }\n\n private async ignoringMalformedDocumentErrors(operation: Function): Promise<void> {\n try {\n await operation();\n } catch (error) {\n if (isInstanceOf(error, MalformedSolidDocumentError)) {\n // eslint-disable-next-line no-console\n console.warn(error.message);\n\n error.documentUrl && this.malformedDocuments.add(error.documentUrl);\n\n return;\n }\n\n throw error;\n }\n }\n\n}\n","import { defineServiceState, replaceExisting, translateWithDefault } from '@aerogel/core';\nimport { Solid } from '@aerogel/plugin-solid';\nimport type { ErrorSource } from '@aerogel/core';\nimport type { Nullable } from '@noeldemartin/utils';\nimport type { SolidModelConstructor, SolidSchemaDefinition } from 'soukai-solid';\n\nimport Migrate from '@aerogel/plugin-local-first/jobs/Migrate';\nimport type Sync from '@aerogel/plugin-local-first/jobs/Sync';\n\nexport const CloudStatus = {\n Disconnected: 'disconnected',\n Online: 'online',\n Syncing: 'syncing',\n Migrating: 'migrating',\n} as const;\n\nexport interface ModelRegistration {\n modelClass: SolidModelConstructor;\n path?: string;\n}\n\nexport type TCloudStatus = (typeof CloudStatus)[keyof typeof CloudStatus];\n\nexport default defineServiceState({\n name: 'cloud',\n persist: [\n 'localModelUpdates',\n 'migrationDismissed',\n 'migrationJob',\n 'modelCollections',\n 'pollingEnabled',\n 'pollingMinutes',\n 'ready',\n 'startupSync',\n ],\n initialState: () => ({\n autoPush: true,\n localModelUpdates: {} as Record<string, number>,\n migrationDismissed: false,\n migrationJob: null as Nullable<Migrate>,\n migrationPostponed: false,\n modelCollections: {} as Record<string, string[]>,\n pollingEnabled: true,\n pollingMinutes: 10,\n ready: false,\n registeredModels: [] as ModelRegistration[],\n schemaMigrations: new Map<SolidModelConstructor, SolidModelConstructor | SolidSchemaDefinition>(),\n setupDismissed: false,\n setupOngoing: false,\n startupSync: true,\n status: CloudStatus.Disconnected as TCloudStatus,\n syncError: null as Nullable<ErrorSource>,\n syncJob: null as Nullable<Sync>,\n }),\n serialize: (state) => replaceExisting(state, { migrationJob: state.migrationJob?.serialize() }),\n restore: (state) =>\n replaceExisting(state, {\n migrationJob: state.migrationJob && Migrate.restore(state.migrationJob),\n }),\n watch: {\n migrationJob(migrationJob) {\n migrationJob?.listeners.add({ onUpdated: () => this.updatePersistedState('migrationJob') });\n },\n },\n computed: {\n disconnected: ({ status }) => status === CloudStatus.Disconnected,\n online: ({ status }) => status === CloudStatus.Online,\n syncing: ({ status }) => status === CloudStatus.Syncing,\n migrating: ({ status }) => status === CloudStatus.Migrating,\n localChanges({ localModelUpdates }) {\n return Object.values(localModelUpdates).reduce((total, count) => total + count, 0);\n },\n dirty(): boolean {\n return this.localChanges > 0;\n },\n migrationStarted({ migrationJob }): boolean {\n return !!migrationJob;\n },\n migrationDisabledReason({ status, ready }): string | null {\n if (!Solid.isLoggedIn()) {\n return translateWithDefault(\n 'cloud.migrationNotLoggedIn',\n 'You need to reconnect before starting the migration',\n );\n }\n\n if (!ready) {\n return translateWithDefault(\n 'cloud.migrationNotReady',\n 'You need to backup your data before starting the migration',\n );\n }\n\n if (status === CloudStatus.Syncing || status === CloudStatus.Migrating) {\n return translateWithDefault(\n 'cloud.migrationNotSyncing',\n 'Wait for syncing to finish before starting the migration',\n );\n }\n\n if (!this.online) {\n return translateWithDefault(\n 'cloud.migrationNotOnline',\n 'You need to be online in order to start the migration',\n );\n }\n\n return null;\n },\n },\n});\n","import {\n Semaphore,\n after,\n facade,\n fail,\n getLocationQueryParameter,\n hasLocationQueryParameter,\n isArray,\n parseBoolean,\n} from '@noeldemartin/utils';\nimport { App, Errors, Events, dispatch, translateWithDefault } from '@aerogel/core';\nimport { Solid } from '@aerogel/plugin-solid';\nimport { SolidModel, Tombstone, isContainer, isContainerClass } from 'soukai-solid';\nimport { getTrackedModels, trackModels, trackModelsCollection } from '@aerogel/plugin-soukai';\nimport { watchEffect } from 'vue';\nimport type { Authenticator } from '@aerogel/plugin-solid';\nimport type { Engine } from 'soukai';\nimport type { JobListener } from '@aerogel/core';\nimport type { SolidContainsRelation, SolidModelConstructor, SolidSchemaDefinition } from 'soukai-solid';\n\nimport {\n clearLocalModelUpdates,\n createRemoteModel,\n getLocalModels,\n getRemoteClass,\n getRemoteContainersCollection,\n updateRemoteModel,\n} from '@aerogel/plugin-local-first/lib/mirroring';\nimport Backup from '@aerogel/plugin-local-first/jobs/Backup';\nimport Migrate from '@aerogel/plugin-local-first/jobs/Migrate';\nimport Sync from '@aerogel/plugin-local-first/jobs/Sync';\nimport SyncQueue from '@aerogel/plugin-local-first/lib/SyncQueue';\nimport {\n getContainedModels,\n getContainerRelations,\n getRelatedClasses,\n} from '@aerogel/plugin-local-first/lib/inference';\n\nimport Service, { CloudStatus } from './Cloud.state';\n\nexport interface RegisterOptions {\n path?: string;\n}\n\nexport interface SyncOptions extends JobListener {\n refreshUserProfile?: boolean;\n model?: SolidModel;\n models?: SolidModel[];\n}\n\nexport class CloudService extends Service {\n\n protected asyncLock: Semaphore = new Semaphore();\n protected engine: Engine | null = null;\n protected pollingInterval: NodeJS.Timeout | null = null;\n\n public async whenReady<T>(callback: () => T): Promise<T> {\n if (this.ready) {\n return callback();\n }\n\n return new Promise((resolve) => {\n const onReady = () => resolve(callback());\n\n Events.once('cloud:ready', onReady);\n });\n }\n\n public async setup(modelUrlMappings?: WeakMap<SolidModelConstructor, Record<string, string>>): Promise<void> {\n this.setupOngoing = true;\n\n try {\n await this.backup(modelUrlMappings);\n await this.setReady(true);\n await this.sync();\n } finally {\n this.setupOngoing = false;\n }\n }\n\n public dismissSetup(): void {\n this.setupDismissed = true;\n }\n\n public dismissMigration(): void {\n this.migrationDismissed = true;\n }\n\n public postponeMigration(): void {\n this.migrationPostponed = true;\n }\n\n public async syncIfOnline(options?: SyncOptions): Promise<void>;\n public async syncIfOnline(model: SolidModel): Promise<void>;\n public async syncIfOnline(models: SolidModel[]): Promise<void>;\n public async syncIfOnline(config: SyncOptions | SolidModel | SolidModel[] = {}): Promise<void> {\n if (!this.online) {\n return;\n }\n\n await this.sync(config as SyncOptions);\n }\n\n public async sync(options?: SyncOptions): Promise<void>;\n public async sync(model: SolidModel): Promise<void>;\n public async sync(models: SolidModel[]): Promise<void>;\n public async sync(config: SyncOptions | SolidModel | SolidModel[] = {}): Promise<void> {\n const options = isArray(config)\n ? { models: config }\n : config instanceof SolidModel\n ? { model: config }\n : config;\n\n if (!Solid.isLoggedIn() || !this.ready || !this.online) {\n return;\n }\n\n await this.asyncLock.run(async () => {\n const start = Date.now();\n const models = options.model ? [options.model] : options.models;\n\n this.syncError = null;\n this.status = CloudStatus.Syncing;\n\n SyncQueue.clear(models);\n\n try {\n await Events.emit('cloud:sync-started', models);\n\n if (options.refreshUserProfile) {\n await Solid.refreshUserProfile();\n }\n\n this.syncJob = new Sync(models);\n\n this.syncJob.listeners.add(options);\n\n await dispatch(this.syncJob);\n\n if (this.syncJob.cancelled) {\n return;\n }\n\n if (!App.testing) {\n await after({ milliseconds: Math.max(500, 1000 - (Date.now() - start)) });\n }\n\n this.syncJob = null;\n } catch (error) {\n if (App.testing) {\n throw error;\n }\n\n this.syncJob = null;\n this.syncError = error;\n\n await Errors.report(error, translateWithDefault('cloud.syncFailed', 'Sync failed'));\n } finally {\n this.status = CloudStatus.Online;\n\n await Events.emit('cloud:sync-completed', models);\n }\n });\n }\n\n public shouldMigrate(): boolean {\n return this.schemaMigrations.size > 0;\n }\n\n public async migrate(listener?: JobListener): Promise<void> {\n if (!this.online || !Solid.isLoggedIn() || !this.ready) {\n throw new Error('Data cannot be migrated at the moment');\n }\n\n if (!this.shouldMigrate()) {\n return;\n }\n\n await this.asyncLock.run(async () => {\n this.status = CloudStatus.Migrating;\n this.migrationJob ??= new Migrate();\n\n const start = Date.now();\n const removeListeners: Function[] = [];\n const models = (this.migrationJob.models ??= getLocalModels());\n\n SyncQueue.clear(models);\n\n try {\n listener && removeListeners.push(this.migrationJob.listeners.add(listener));\n\n await Events.emit('cloud:migration-started', models);\n await dispatch(this.migrationJob);\n\n if (this.migrationJob.cancelled) {\n await Events.emit('cloud:migration-cancelled', models);\n\n return;\n }\n\n this.migrationJob = null;\n this.migrationDismissed = false;\n this.migrationPostponed = false;\n\n await after({ milliseconds: Math.max(0, 1000 - (Date.now() - start)) });\n await Events.emit('cloud:migration-completed', models);\n } catch (error) {\n await Errors.report(error, translateWithDefault('cloud.migrationFailed', 'Migration failed'));\n } finally {\n this.status = CloudStatus.Online;\n\n removeListeners.forEach((removeListener) => removeListener?.());\n }\n });\n }\n\n public async register(modelClass: SolidModelConstructor, options: RegisterOptions = {}): Promise<void> {\n if (this.registeredModels.find((registered) => modelClass === registered.modelClass)) {\n return;\n }\n\n const engine = this.engine;\n\n if (engine) {\n getRelatedClasses(modelClass).forEach((relatedClass) => getRemoteClass(relatedClass).setEngine(engine));\n }\n\n this.whenReady(() => {\n if (!isContainerClass(modelClass)) {\n return;\n }\n\n modelClass.collection = getRemoteContainersCollection(options.path);\n });\n\n await trackModels(modelClass, {\n created: (model) => createRemoteModel(model),\n updated: (model) => updateRemoteModel(model),\n deleted: (model) => clearLocalModelUpdates([model]),\n });\n\n if (isContainerClass(modelClass)) {\n getContainerRelations(modelClass).forEach((relation) => {\n const relatedClass = modelClass\n .instance()\n .requireRelation<SolidContainsRelation>(relation).relatedClass;\n\n relatedClass.on('created', (model) => createRemoteModel(model));\n relatedClass.on('updated', (model) => updateRemoteModel(model));\n relatedClass.on('deleted', (model) => clearLocalModelUpdates([model]));\n });\n }\n\n this.registeredModels.push({ modelClass, path: options.path });\n\n for (const collection of this.modelCollections[modelClass.modelName] ?? []) {\n await trackModelsCollection(modelClass, collection);\n }\n }\n\n public registerSchemaMigration(\n modelClass: SolidModelConstructor,\n schema: SolidModelConstructor | SolidSchemaDefinition,\n ): void {\n this.schemaMigrations.set(modelClass, schema);\n }\n\n public requireRemoteCollection(modelClass: SolidModelConstructor): string {\n for (const registration of this.registeredModels) {\n if (modelClass !== registration.modelClass) {\n continue;\n }\n\n return getRemoteContainersCollection(registration.path);\n }\n\n throw new Error(`Failed resolving remote collection for '${modelClass.modelName}' model`);\n }\n\n protected override async boot(): Promise<void> {\n await Solid.booted;\n\n Solid.isLoggedIn() && this.login(Solid.authenticator);\n\n Events.on('auth:login', ({ authenticator }) => this.login(authenticator));\n Events.on('auth:logout', () => this.logout());\n Events.once('application-ready', () => this.onApplicationReady());\n Events.once('application-mounted', () => this.onApplicationMounted());\n\n watchEffect(() => {\n this.pollingInterval && clearInterval(this.pollingInterval);\n\n if (!this.pollingEnabled || this.migrationJob) {\n this.pollingInterval = null;\n\n return;\n }\n\n this.pollingInterval = setInterval(() => this.sync(), this.pollingMinutes * 60 * 1000);\n });\n }\n\n protected getDirtyLocalModels(): SolidModel[] {\n const urls = Object.keys(this.localModelUpdates);\n const dirtyLocalModels = [];\n\n for (const { modelClass } of this.registeredModels) {\n for (const model of getTrackedModels(modelClass)) {\n dirtyLocalModels.push(...this.getModelsIn(urls, model));\n }\n }\n\n return dirtyLocalModels;\n }\n\n protected getModelsIn(urls: string[], model: SolidModel): SolidModel[] {\n const models = [];\n\n if (urls.includes(model.url)) {\n models.push(model);\n }\n\n if (isContainer(model)) {\n models.push(\n ...getContainedModels(model)\n .map((containedModel) => this.getModelsIn(urls, containedModel))\n .flat(),\n );\n }\n\n return models;\n }\n\n protected requireEngine(): Engine {\n return this.engine ?? fail('Could not get required Engine');\n }\n\n protected async setReady(ready: boolean): Promise<void> {\n if (this.ready || !ready) {\n return;\n }\n\n await Events.emit('cloud:ready');\n\n this.ready = true;\n }\n\n protected async backup(modelUrlMappings?: WeakMap<SolidModelConstructor, Record<string, string>>): Promise<void> {\n await Events.emit('cloud:backup-started');\n\n modelUrlMappings ??= new WeakMap();\n\n const job = new Backup();\n\n for (const { modelClass, path } of this.registeredModels) {\n if (!isContainerClass(modelClass)) {\n continue;\n }\n\n for (const [local, remote] of Object.entries(modelUrlMappings.get(modelClass) ?? {})) {\n job.migrateUrl(modelClass, local, remote);\n }\n\n const localCollection = modelClass.collection;\n const remoteCollection = getRemoteContainersCollection(path);\n\n modelClass.collection = remoteCollection;\n\n job.migrateCollection(modelClass, localCollection, remoteCollection);\n }\n\n await dispatch(job);\n await Events.emit('cloud:backup-completed');\n }\n\n protected async onApplicationReady(): Promise<void> {\n if (this.ready || !Solid.isLoggedIn()) {\n return;\n }\n\n await this.setReady(!getLocalModels().some((model) => model.url.startsWith('solid://')));\n }\n\n protected async onApplicationMounted(): Promise<void> {\n if (!this.syncOnStartup()) {\n return;\n }\n\n await this.sync();\n }\n\n protected login(authenticator: Authenticator): void {\n const relatedClasses = [...this.registeredModels]\n .map(({ modelClass }) => getRelatedClasses(modelClass))\n .flat()\n .concat([Tombstone]);\n\n this.status = CloudStatus.Online;\n this.engine = authenticator.engine;\n\n for (const relatedClass of relatedClasses) {\n getRemoteClass(relatedClass).setEngine(this.engine);\n }\n }\n\n protected logout(): void {\n this.setState({\n localModelUpdates: {},\n migrationDismissed: false,\n migrationJob: null,\n migrationPostponed: false,\n modelCollections: {},\n pollingEnabled: true,\n pollingMinutes: 10,\n ready: false,\n setupDismissed: false,\n setupOngoing: false,\n startupSync: true,\n status: CloudStatus.Disconnected,\n });\n }\n\n private syncOnStartup(): boolean {\n if (hasLocationQueryParameter('startupSync')) {\n return parseBoolean(getLocationQueryParameter('startupSync'));\n }\n\n if (this.migrationJob) {\n return false;\n }\n\n return this.startupSync;\n }\n\n}\n\nexport default facade(CloudService);\n\ndeclare module '@aerogel/core' {\n export interface EventsPayload {\n 'cloud:ready': void;\n 'cloud:backup-started': void;\n 'cloud:backup-completed': void;\n 'cloud:migration-started': SolidModel[];\n 'cloud:migration-cancelled': SolidModel[];\n 'cloud:migration-completed': SolidModel[];\n 'cloud:sync-started': SolidModel[] | undefined;\n 'cloud:sync-completed': SolidModel[] | undefined;\n }\n}\n","import { bootServices } from '@aerogel/core';\nimport type { Plugin } from '@aerogel/core';\n\nimport Cloud from '@aerogel/plugin-local-first/services/Cloud';\nimport DocumentsCache from '@aerogel/plugin-local-first/services/DocumentsCache';\n\nconst services = { $cloud: Cloud };\n\nexport { Cloud };\nexport * from './components';\nexport * from './services/Cloud';\n\nexport type LocalFirstServices = typeof services;\n\nexport default function localFirst(): Plugin {\n return {\n name: '@aerogel/local-first',\n async install(app) {\n await bootServices(app, {\n ...services,\n $_documentsCache: DocumentsCache,\n });\n },\n };\n}\n\ndeclare module '@aerogel/core' {\n interface Services extends LocalFirstServices {}\n}\n"],"names":["ie","ne","e","i","u","ke","O","xe","U","t","r","Fe","E","K","Ie","Se","C","Ae","D","qe","x","G","l","m","_e","re","V","W","X","N","We","se","Ne","s","F","Te","o","g","j","z","f","T","c","oe","ae","H","y","k","B","L","q","Le","Y","Z","$e","ee","te","Ee","Ce","Q","Re","ye","ve","Ue","Pe","Ve","ue","ze","He","Ye","lt","M","de","he","J","d","S","$","h","a","A","_","b","P","p","v","w","ge","fe","I","me","n","containerRelations","getContainerRegisteredClasses","modelClass","arrayFilter","getContainerRelations","relation","relatedClass","isContainerClass","SolidModel","SolidContainsRelation","getContainedModels","model","models","getRelatedClasses","relatedClasses","instance","getRelatedAppModels","related","isInstanceOf","SolidACLAuthorization","SolidDocument","Metadata","Operation","SolidContainer","isDirtyOrHasDirtyChildren","relationHasDirtyModels","_a","relatedModel","Cloud","required","App","SyncQueue","__publicField","after","operationOrPromise","promise","arrayRemove","children","isContainer","child","SyncQueue$1","facade","remoteClasses","localClasses","cleanRemoteModelClone","remoteModel","relatedModels","fixRemoteModelClone","operations","operation","PropertyOperation","createRemoteModel","localModel","isRegisteredModelClass","trackModelsCollection","requireUrlParentDirectory","collection","trackSoukaiModelsCollection","updateRemoteModel","ignoreModelUpdates","modelUpdates","objectWithout","clearLocalModelUpdates","malformedDocuments","syncedModelUrls","toString","localModelUpdates","url","count","documentUrl","urlRoute","modelUrl","cloneLocalModel","options","localModelClasses","constructors","localClass","getRemoteClass","tap","cloneRemoteModel","remoteModelClasses","remoteClass","getLocalClass","completeRemoteModels","localModels","remoteModels","RemoteTombstone","Tombstone","remoteModelUrls","missingModelDocumentUrls","tombstones","updatedAt","getLocalModel","getLocalModels","getTrackedModels","getSchemaMigrations","clearSchemaMigrations","getSchemaMigration","makeRemoteClass","getRemoteContainersCollection","path","rootStorage","Solid","urlResolveDirectory","getRemoteModel","isRegisteredModel","registeredModel","isRemoteModel","isLocalModel","registeredModelClass","LocalClass","withLocalHistoryConfig","RemoteClass","attributes","exists","schema","bootModels","fail","Backup","Job","local","remote","engine","requireEngine","collections","documents","id","document","ignoreModelsCollection","key","value","DocumentsCacheService","Service","IndexedDBMap","modifiedAt","meta","modifiedAtTime","Events","DocumentsCache","lazy","getter","result","LoadsChildren","relationModels","arrayFrom","map","documentUrlChunks","arrayChunk","statusChildren","statusChildrenMap","documentUrls","documentChildren","documentTombstones","documentModels","childrenArray","onMalformedDocument","relationInstance","relatedLocalModels","_b","relatedLocalModel","readDocument","error","DocumentNotFound","MalformedSolidDocumentError","typeIndexes","LoadsTypeIndex","user","TracksLocalModels","BaseJob","Migrate","mixed","status","job","childrenStatus","objectMap","modelStatuses","typeIndex","modelStatus","registeredClasses","registration","instanceContainer","migratedModel","migratedOperation","childStatus","isRootStatus","Sync","updateDocumentDate","headers","date","clearListener","round","remoteModelsArray","index","pullStatus","processedContainerUrls","registeredModels","registeredChildren","childrenClass","registrations","rdfsClasses","rdfsClass","match","container","childrenStatuses","synchronizedModelUrls","deletedModels","dirtyRemoteModels","processedModels","remoteRelatedModels","localRelatedModel","localRelation","remoteRelation","newLocalModelUrls","newRemoteModelUrls","CloudStatus","defineServiceState","state","replaceExisting","migrationJob","total","ready","translateWithDefault","CloudService","Semaphore","callback","resolve","onReady","modelUrlMappings","config","isArray","start","dispatch","Errors","listener","removeListeners","removeListener","registered","trackModels","authenticator","watchEffect","urls","dirtyLocalModels","containedModel","localCollection","remoteCollection","hasLocationQueryParameter","parseBoolean","getLocationQueryParameter","services","localFirst","app","bootServices"],"mappings":";;;;;;;;;AAAA,IAAIA,KAAK,OAAO,gBACZC,KAAK,CAAC,GAAGC,GAAGC,MAAMD,KAAK,IAAIF,GAAG,GAAGE,GAAG,EAAE,YAAY,IAAI,cAAc,IAAI,UAAU,IAAI,OAAOC,EAAC,CAAE,IAAI,EAAED,CAAC,IAAIC,GAC3GC,IAAI,CAAC,GAAGF,GAAGC,MAAMF,GAAG,GAAG,OAAOC,KAAK,WAAWA,IAAI,KAAKA,GAAGC,CAAC;AAO/D,MAAME,WAAWC,GAAE;AACnB;AACA,SAASC,GAAG,GAAGL,GAAG;AAChB,SAAO;AACT;AACA,MAAMM,WAAUF,GAAE;AAAA,EAChB,YAAYH,GAAGM,GAAGC,GAAG;AACnB,UAAMH,GAAGJ,CAAC,GAAGO,CAAC,GACdN,EAAE,MAAM,aAAa,GACrB,KAAK,cAAcK;AAAA,EACvB;AACA;AACA,MAAME,WAAWL,GAAE;AAAA,EACjB,YAAYJ,GAAGC,GAAG;AAChB,UAAM,gBAAgBD,EAAE,GAAG,sBAAsBC,CAAC;AAAA,EACtD;AACA;AACA,MAAMS,IAAI,CAAE;AACZ,MAAMC,GAAE;AAAA,EACN,cAAc;AACZ,IAAAT,EAAE,MAAM,MAAM,GACdA,EAAE,MAAM,oBAAoB,GAC5BA,EAAE,MAAM,QAAQ,GAChBA,EAAE,MAAM,aAAaU,GAAG,CAAE,CAAA,CAAC,GAC3BV,EAAE,MAAM,SAAS;AAAA,EACrB;AAAA,EACE,IAAI,SAAS;AACX,WAAO,KAAK,UAAU,KAAK,WAAW,IAAIW,GAAG,KAAK,0BAAyB,CAAE,GAAG,KAAK;AAAA,EACzF;AAAA,EACE,wBAAwB;AACtB,WAAO,KAAK,sBAAsB;AAAA,EACtC;AAAA,EACE,4BAA4B;AAC1B,WAAO,KAAK,sBAAsBC,EAAE,kCAAkC;AAAA,EAC1E;AAAA,EACE,YAAYd,GAAG;AACb,WAAO,KAAK,UAAU,SAASA,CAAC,KAAK,KAAK,UAAU,KAAKA,CAAC,GAAG,MAAM;AACjE,WAAK,eAAeA,CAAC;AAAA,IACtB;AAAA,EACL;AAAA,EACE,eAAeA,GAAG;AAChB,SAAK,UAAU,SAASA,CAAC,KAAK,KAAK,UAAU,OAAOA,CAAC;AAAA,EACzD;AAAA,EACE,MAAM,OAAO;AACX,QAAI,KAAK;AACP,aAAO,KAAK;AACd,SAAK,SAAS,IAAIe,MAAM,MAAM,KAAK,kBAAkB,KAAK,OAAO,QAAS;AAAA,EAC9E;AAAA,EACE,MAAM,uBAAuBf,GAAG;AAC9B,SAAK,qBAAqBA,GAAG,MAAM,KAAK,gBAAgB,6BAA6BA,CAAC;AAAA,EAC1F;AAAA,EACE,MAAM,aAAaA,GAAG;AACpB,UAAMC,IAAI;AAAA,MACR,eAAe;AAAA,MACf,GAAGD;AAAA,IACJ;AACD,WAAO,MAAM,KAAK,gBAAgB,oBAAoBC,CAAC,GAAGA;AAAA,EAC9D;AAAA,EACE,MAAM,YAAYD,GAAGC,GAAG;AACtB,UAAM,KAAK,gBAAgB,mBAAmBD,GAAGC,CAAC;AAAA,EACtD;AAAA,EACE,MAAM,aAAa;AACjB,UAAM,KAAK,gBAAgB,gBAAgB;AAAA,EAC/C;AAAA,EACE,MAAM,gBAAgBD,MAAMC,GAAG;AAC7B,UAAM,QAAQ;AAAA,MACZ,KAAK,UAAU,QAAS,EAAC,IAAI,OAAOM,MAAM;AACxC,cAAMC,IAAID,EAAEP,CAAC;AACb,eAAOQ,KAAK,OAAO,SAASA,EAAE,GAAGP,CAAC;AAAA,MACnC,CAAA;AAAA,IACF;AAAA,EACL;AACA;AACA,MAAMe,KAAI;AACV,MAAMC,WAAWN,GAAE;AAAA,EACjB,cAAc;AACZ,UAAM,GAAG,SAAS,GAClBT,EAAE,MAAM,SAAS,GACjBA,EAAE,MAAM,QAAQ,GAChBA,EAAE,MAAM,QAAQ,GAChBA,EAAE,MAAM,SAAS,GACjBA,EAAE,MAAM,yBAAyB;AAAA,EACrC;AAAA,EACE,MAAM,MAAMD,GAAG;AACbiB,IAAAA,GAAE,IAAIF,IAAGf,CAAC;AACV,UAAMM,IAAI;AAAA,MACR,YAAYN;AAAA,IACb;AACD,WAAOS,EAAE,aAAaH,EAAE,WAAWG,EAAE,SAAS,WAAWH,EAAE,aAAaG,EAAE,SAAS,aAAaH,EAAE,cAAcG,EAAE,SAAS,cAAc,CAAC,IAAI,MAAM,KAAK,OAAOH,CAAC,GAAG,MAAMY,EAAE,EAAE,SAAS,GAAI,CAAA,GAAGL,EAAE,+CAA+C;AAAA,EACnP;AAAA,EACE,MAAM,SAAS;AACb,UAAM,KAAK,QAAO,GAAI,MAAM,KAAK,WAAY;AAAA,EACjD;AAAA,EACE,MAAM,iBAAiB;AACrB,UAAM,EAAE,QAAQb,GAAG,OAAOM,GAAG,wBAAwBC,GAAG,OAAO,GAAG,QAAQY,EAAC,IAAK,MAAM,OAAO,iDAAwC;AACrI,SAAK,SAASb,GAAG,KAAK,SAAS,GAAG,KAAK,UAAUa,GAAG,KAAK,UAAUnB,GAAG,KAAK,0BAA0BO,GAAG,MAAM,KAAK,kBAAmB;AAAA,EAC1I;AAAA,EACE,MAAM,oBAAoB;AACxB,UAAMP,IAAIiB,GAAE,IAAIF,EAAC;AACjB,QAAI,CAACf;AACH;AACF,SAAK,QAAO,EAAG,GAAG,SAAS,CAACO,GAAG,MAAM;AACnC,MAAAA,MAAMA,IAAI,4CAA4C,OAAO,KAAK,WAAW,KAAK,YAAYP,GAAG,IAAIK,GAAEE,GAAG,MAAM,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,YAAYP,GAAG,IAAIK,GAAEE,GAAG,CAAC,CAAC;AAAA,IACtK,CAAK;AACD,UAAMD,IAAI,MAAM,KAAK,wBAAwB,WAAW,SAAS,IAAI;AACrEW,IAAAA,GAAE,OAAOF,EAAC,GAAGT,KAAK,QAAQA,EAAE,cAAcA,EAAE,SAAS,MAAM,KAAK,YAAYA,EAAE,KAAK;AAAA,EACvF;AAAA,EACE,MAAM,YAAYN,GAAG;AACnB,UAAM,KAAK,uBAAuB,KAAK,MAAM;AAC7C,QAAI;AACF,YAAMM,IAAI,MAAMc,EAAE,mBAAmBpB,CAAC;AACtC,YAAM,KAAK,aAAa,EAAE,MAAMM,GAAG,UAAUN,GAAG;AAAA,IACjD,SAAQM,GAAG;AACV,YAAM,KAAK,YAAYN,GAAGM,CAAC;AAAA,IACjC;AAAA,EACA;AACA;AACA,MAAMe,WAAWX,GAAE;AAAA,EACjB,cAAc;AACZ,UAAO,GACPT,EAAE,MAAM,OAAO,GACf,KAAK,QAAQqB,GAAG,wBAAwB,CAAA,CAAE;AAAA,EAC9C;AAAA,EACE,MAAM,MAAMtB,GAAGM,GAAG;AAChB,UAAM,EAAE,iBAAiBC,MAAM,MAAM,OAAO,iDAAwC;AACpF,UAAM,KAAK,MAAM,QAAQD,KAAK,OAAO,SAASA,EAAE,OAAO,KAAK,MAAM,YAAYA,KAAK,OAAO,SAASA,EAAE,kBAAkBN,GAAG,MAAMO,EAAE,MAAM,KAAK,MAAM,QAAQ,MAAM,QAAQ,OAAO,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,UAAU,IAAIF,GAAE,4DAA4D,MAAM,MAAMa,EAAE,EAAE,SAAS,GAAE,CAAE,GAAG,IAAI,MAAM,+CAA+C;AAAA,EAC7X;AAAA,EACE,MAAM,SAAS;AACb,UAAM,EAAE,iBAAiBlB,MAAM,MAAM,OAAO,iDAAwC;AACpF,WAAO,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,UAAU,MAAMA,EAAE,OAAM,GAAI,MAAM,KAAK,WAAY;AAAA,EAClG;AAAA,EACE,MAAM,iBAAiB;AACrB,QAAI,CAAC,KAAK,MAAM;AACd;AACF,UAAM,EAAE,iBAAiBA,EAAC,IAAK,MAAM,OAAO,iDAAwC,GAAGM,IAAI,MAAMN,EAAE,eAAgB,GAAEO,IAAIgB,EAAE,KAAK,MAAM,QAAQ;AAC9I,UAAM,KAAK,uBAAuB,CAAC,GAAGJ,MAAMnB,EAAE,MAAM,GAAGmB,CAAC,CAAC;AACzD,QAAI;AACF,YAAM,IAAI,MAAMC,EAAE,mBAAmBG,GAAGjB,KAAK,OAAO,SAASA,EAAE,UAAU,KAAK,MAAM,KAAK,CAAC;AAC1F,YAAM,KAAK,aAAa,EAAE,MAAM,GAAG,UAAUC,GAAG;AAAA,IACjD,SAAQ,GAAG;AACV,YAAM,KAAK,YAAYA,GAAG,CAAC;AAAA,IACjC;AAAA,EACA;AACA;AACK,MAACiB,KAAI,CAAE;AACF,IAAIR,GAAI,GACR,IAAIK,GAAE;AAKhB,SAASI,GAAE,GAAG;AACZ,SAAOD,GAAE,CAAC;AACZ;AAOA,MAAME,KAAI,EAAE,eAAe,GAAE,GAAIC,KAAKC,GAAG;AAAA,EACvC,MAAM;AAAA,EACN,SAAS,CAAC,iBAAiB,aAAa,mBAAmB,YAAY,eAAe;AAAA,EACtF,cAAc;AAAA,IACZ,eAAeF,GAAE;AAAA,IACjB,WAAW;AAAA,IACX,4BAA4B;AAAA,IAC5B,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,wBAAwB;AAAA,IACxB,iBAAiB;AAAA,IACjB,UAAU,CAAE;AAAA,IACZ,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,eAAe,CAAA;AAAA,EAChB;AAAA,EACD,UAAU,GAAG;AACX,QAAI3B;AACJ,aAASA,IAAI,EAAE,oBAAoB,OAAO,SAASA,EAAE,kBAAkB,UAAU,EAAE,gBAAgB,QAAQ,EAAE,gBAAgB,MAAM,UAAU;AAAA,EAC9I;AAAA,EACD,UAAU;AAAA,IACR,MAAM,CAAC,MAAM;AACX,UAAIA,GAAGC;AACP,eAASD,IAAI,EAAE,YAAY,OAAO,SAASA,EAAE,WAAWC,IAAI,EAAE,oBAAoB,OAAO,SAASA,EAAE,YAAY;AAAA,IACjH;AAAA,IACD,eAAe,CAAC,MAAM;AACpB,UAAID;AACJ,eAASA,IAAI,EAAE,YAAY,OAAO,SAASA,EAAE,kBAAkB;AAAA,IAChE;AAAA,IACD,QAAQ;AACN,UAAI;AACJ,eAAS,IAAI,KAAK,kBAAkB,OAAO,SAAS,EAAE,sBAAqB,MAAO,WAAW,MAAM,KAAK,UAAU;AAAA,IACnH;AAAA,IACD,MAAM,GAAG;AACP,UAAIA;AACJ,aAAO,EAAE,oBAAoB,EAAE,qBAAqB,OAAO,EAAE,6BAA6B,SAASA,IAAI,EAAE,oBAAoB,OAAO,SAASA,EAAE,UAAU;AAAA,IAC/J;AAAA,EACA;AACA,CAAC;AACD,MAAM8B,WAAWF,GAAG;AAAA,EAClB,aAAa;AACX,WAAO,CAAC,CAAC,KAAK;AAAA,EAClB;AAAA,EACE,cAAc;AACZ,WAAO,CAAC,CAAC,KAAK;AAAA,EAClB;AAAA,EACE,cAAc;AACZ,WAAO,CAAC,EAAE,KAAK,WAAW,KAAK;AAAA,EACnC;AAAA,EACE,uBAAuB;AACrB,WAAO,KAAK,iBAAiBd,EAAE,6BAA6B;AAAA,EAChE;AAAA,EACE,cAAc;AACZ,WAAO,KAAK,QAAQA,EAAE,iDAAiD;AAAA,EAC3E;AAAA,EACE,mBAAmBd,GAAG;AACpB,WAAO,KAAK,eAAeA,GAAG,EAAE,UAAU,GAAE,CAAE;AAAA,EAClD;AAAA;AAAA,EAEE,MAAM,eAAeA,GAAGC,IAAI,IAAI;AAC9B,QAAImB;AACJ,QAAIb,IAAI;AACR,UAAMC,IAAIP,EAAE,aAAa,GAAGmB,IAAI,KAAK,kBAAkB,QAAQA,EAAE,sBAAuB,IAAGW,IAAI,KAAK,SAAS/B,CAAC,KAAK,MAAMgC;AAAAA,MACvH,MAAMC,GAAGjC,GAAG;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,UAAUC,EAAE,YAAY;AAAA,QACxB,SAASiC,GAAG;AACV,UAAA3B,IAAI2B;AAAA,QACd;AAAA,MACA,CAAO;AAAA,MACD,OAAOA,MAAM;AACX,QAAAA,MAAM3B,KAAK,MAAM4B,EAAE,KAAK,6BAA6B,CAACD,GAAG3B,CAAC,CAAC,GAAG,KAAK,gBAAgB2B,CAAC;AAAA,MAC5F;AAAA,IACK;AACD,WAAOH,KAAKvB,KAAK,KAAK,SAAS,EAAE,eAAe4B,GAAE,KAAK,cAAc,OAAO,CAACL,EAAE,KAAK,CAAC,CAAC,EAAG,CAAA,GAAGA;AAAA,EAChG;AAAA,EACE,MAAM,qBAAqB;AACzB,QAAI,CAAC,KAAK,WAAY;AACpB;AACF,SAAK,SAAS,EAAE,UAAUM,GAAE,KAAK,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC,EAAC,CAAE;AAC/D,UAAMrC,IAAI,MAAM,KAAK,mBAAmB,KAAK,KAAK,KAAK;AACvD,SAAK,SAAS;AAAA,MACZ,SAAS;AAAA,QACP,GAAG,KAAK;AAAA,QACR,MAAMA;AAAA,MACd;AAAA,IACA,CAAK;AAAA,EACL;AAAA,EACE,MAAM,MAAMA,GAAGC,IAAI,IAAI;AACrB,QAAIqC,EAAE,eAAetC,MAAM,UAAUA,IAAI,0BAA0B,eAAe,KAAKA,CAAC,MAAMC,EAAE,gBAAgBA,EAAE,cAAc,UAAUD,CAAC,KAAKA,IAAI,WAAWA,CAAC,KAAK,KAAK,WAAY;AACpL,aAAO;AACT,QAAI,KAAK;AACP,YAAM,IAAI,MAAM,oCAAoC;AACtD,WAAOC,EAAE,UAAUsC,GAAE,QAAQC,EAAE,mBAAmB,eAAe,GAAG,MAAM,KAAK,aAAaxC,GAAGC,CAAC,CAAC,IAAI,KAAK,aAAaD,GAAGC,CAAC;AAAA,EAC/H;AAAA,EACE,MAAM,UAAUD,IAAI,IAAI;AACtB,UAAM,EAAE,OAAOC,GAAG,GAAGM,EAAG,IAAGP;AAC3B,SAAK,WAAU,KAAM,CAAC,KAAK,mBAAmB,KAAK,gBAAgB,UAAU,QAAQ,CAACC,KAAK,MAAM,KAAK,MAAM,KAAK,gBAAgB,UAAU;AAAA,MACzI,eAAe,KAAK,gBAAgB;AAAA,MACpC,GAAGM;AAAA,MACH,SAASA,EAAE,WAAW;AAAA,IAC5B,CAAK;AAAA,EACL;AAAA,EACE,MAAM,OAAOP,IAAI,IAAI;AACnB,QAAIoB,GAAGc;AACP,UAAMjC,IAAI,CAACqC,EAAE,OAAO,sBAAsB,KAAK,CAAC,GAAGlB,IAAIkB,EAAE,QAAQ,QAAQ,MAAM,QAAQlB,EAAE,QAAQb,IAAI,CAAC+B,EAAE,OAAO,sBAAsB,KAAK,CAAC,GAAGJ,IAAII,EAAE,QAAQ,QAAQ,MAAM,QAAQJ,EAAE,QAAQ,CAAC,GAAGH,CAAC,IAAI/B,IAAI,CAAC,IAAI,EAAE,eAAeC,EAAG,CAAA,IAAI,MAAMsC,GAAE;AAAA,MAC5OtC,IAAIuC,EAAE,4BAA4B,2BAA2B,IAAIA,EAAE,gCAAgC,qBAAqB;AAAA,MACxHvC,IAAIM,IAAIiC;AAAAA,QACN;AAAA,QACA;AAAA,MACR,IAAUA;AAAAA,QACF;AAAA,QACA;AAAA,MACR,IAAUA;AAAAA,QACF;AAAA,QACA;AAAA,MACD;AAAA,MACD;AAAA,QACE,YAAYA,EAAE,6BAA6B,SAAS;AAAA,QACpD,aAAaC,GAAG;AAAA,QAChB,YAAYD;AAAAA,UACV;AAAA,UACAA,EAAE,aAAa,QAAQ;AAAA,QACxB;AAAA,QACD,YAAYvC,IAAIM,IAAI;AAAA,UAClB,eAAe;AAAA,YACb,OAAOiC;AAAAA,cACL;AAAA,cACA;AAAA,YACD;AAAA,YACD,SAAS;AAAA,YACT,UAAU;AAAA,UACtB;AAAA,QACS,IAAG,SAAS;AAAA,UACX,eAAe;AAAA,YACb,OAAOA;AAAAA,cACL;AAAA,cACA;AAAA,YACD;AAAA,YACD,SAAS;AAAA,UACrB;AAAA,QACA;AAAA,MACA;AAAA,IACK;AACD,SAAK,KAAK,mBAAmB,MAAMD,GAAE,QAAQC,EAAE,uBAAuB,gBAAgB,GAAG,YAAY;AACnG,WAAK,SAAS;AAAA,QACZ,WAAW;AAAA,QACX,4BAA4B;AAAA,QAC5B,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,QACjB,GAAGb;AAAA,MACX,CAAO,GAAG,KAAK,WAAU,KAAM,MAAM,KAAK,cAAc,OAAQ,IAAGI,EAAE,iBAAiB,OAAO,MAAMW,GAAG,SAAS,MAAMP,EAAE,KAAK,aAAa,GAAG,MAAMA,EAAE,KAAK,mBAAmB;AAAA,IAC5K,CAAK;AAAA,EACL;AAAA,EACE,MAAM,aAAanC,GAAG;AACpB,WAAO,KAAK,WAAY,IAAGA,EAAE,KAAK,OAAO,IAAI,IAAI,QAAQ,CAACC,MAAM;AAC9D,YAAMM,IAAI,CAACC,MAAMP,EAAED,EAAEQ,CAAC,CAAC;AACvB2B,MAAAA,EAAE,KAAK,cAAc5B,CAAC;AAAA,IAC5B,CAAK;AAAA,EACL;AAAA,EACE,UAAU;AACR,SAAK,SAAS,EAAE,WAAW,GAAE,CAAE;AAAA,EACnC;AAAA,EACE,MAAM,+BAA+B;AACnC,WAAO,MAAM,KAAK,qBAAsB,KAAI,MAAM,KAAK,uBAAwB;AAAA,EACnF;AAAA,EACE,MAAM,uBAAuB;AAC3B,UAAM,EAAE,OAAOP,GAAG,qBAAqBC,EAAG,IAAG,KAAK,YAAa,GAAEM,IAAI,KAAK,qBAAsB,EAAC;AACjG,WAAON,IAAI0C,GAAE,GAAG3C,CAAC,qBAAqB,MAAM4C,EAAE,WAAWrC,CAAC,EAAE,KAAKN,CAAC,CAAC,IAAI;AAAA,EAC3E;AAAA,EACE,MAAM,8BAA8B;AAClC,WAAO,MAAM,KAAK,oBAAqB,KAAI,MAAM,KAAK,sBAAuB;AAAA,EACjF;AAAA,EACE,MAAM,sBAAsB;AAC1B,UAAM,EAAE,OAAOD,GAAG,oBAAoBC,EAAG,IAAG,KAAK,YAAa,GAAEM,IAAI,KAAK,qBAAsB,EAAC;AAChG,WAAON,IAAI0C,GAAE,GAAG3C,CAAC,oBAAoB,MAAM4C,EAAE,WAAWrC,CAAC,EAAE,KAAKN,CAAC,CAAC,IAAI;AAAA,EAC1E;AAAA,EACE,MAAM,uBAAuBD,GAAG;AAC9B,UAAMC,IAAI,KAAK,qBAAoB,EAAG;AACtC,WAAO4C,EAAE,WAAW5C,GAAG,YAAY;AACjC,YAAMM,IAAI,MAAMsC,EAAE,KAAK7C,EAAE,GAAG;AAC5B,UAAIO,KAAK,CAACP,EAAE;AACV,cAAM,IAAIS,GAAGF,CAAC;AAChB,YAAMC,IAAID,KAAK,IAAIsC,EAAE,EAAE,KAAK7C,EAAE,KAAK,MAAMA,EAAE,KAAI,CAAE;AACjD,UAAI,MAAMQ,EAAE,QAAQR,EAAE,aAAa;AACjC,cAAM+B,IAAI,MAAM,KAAK,6BAA8B;AACnD,cAAMvB,EAAE,SAASuB,GAAG/B,EAAE,WAAW;AAAA,MACzC;AACM,aAAOQ;AAAA,IACb,CAAK;AAAA,EACL;AAAA,EACE,MAAM,OAAO;AACX,QAAIR,GAAGC;AACP,UAAM6C,EAAE,QAAQC,EAAE,eAAe,KAAK,KAAK,SAAS;AAAA,MAClD,wBAAwBC,EAAE,eAAe;AAAA,IAC1C,CAAA,GAAGD,EAAE,gBAAgB,KAAK,KAAK,SAAS;AAAA,MACvC,eAAeX;AAAAA,QACb,KAAK,cAAc,OAAOa,GAAG,EAAEjD,IAAI,KAAK,YAAY,OAAO,SAASA,EAAE,KAAK,QAAQC,IAAI,KAAK,oBAAoB,OAAO,SAASA,EAAE,QAAQ,CAAC,CAAC;AAAA,MACpJ;AAAA,IACA,CAAK,GAAG,MAAM,KAAK,uBAAwB,GAAE,MAAM,KAAK,iBAAkB;AAAA,EAC1E;AAAA,EACE,MAAM,yBAAyB;AAC7B,UAAMD,IAAI,KAAK,YAAa,GAAEC,IAAI,KAAK,qBAAsB,GAAEM,IAAI,MAAMqC,EAAE,WAAW3C,EAAE,MAAM,EAAE,cAAcD,CAAC;AAC/G,WAAOgC,EAAEzB,GAAG,MAAM;AAChB,MAAAP,EAAE,sBAAsBO,EAAE,KAAK2C,GAAE,GAAGlD,EAAE,KAAK,qBAAqBO,CAAC,GAAG,KAAK,gBAAgBP,CAAC;AAAA,IAChG,CAAK;AAAA,EACL;AAAA,EACE,MAAM,wBAAwB;AAC5B,UAAMA,IAAI,KAAK,YAAa,GAAEC,IAAI,KAAK,qBAAsB,GAAEM,IAAI,MAAMqC,EAAE,WAAW3C,EAAE,MAAM,EAAE,aAAaD,CAAC;AAC9G,WAAOgC,EAAEzB,GAAG,MAAM;AAChB,MAAAP,EAAE,sBAAsBO,EAAE,KAAK2C,GAAE,GAAGlD,EAAE,KAAK,oBAAoBO,CAAC,GAAG,KAAK,gBAAgBP,CAAC;AAAA,IAC/F,CAAK;AAAA,EACL;AAAA,EACE,MAAM,aAAaA,GAAGC,GAAG;AACvB,UAAMM,IAAIN,EAAE,iBAAiB,KAAK,0BAA0B,WAAWO,IAAIP,EAAE,YAAY,CAACiC,MAAMI,EAAE,UAAS,IAAKQ,EAAE,OAAOZ,CAAC,IAAI,KAAK,SAAS,EAAE,mBAAmBA,EAAG,CAAA,IAAIH,IAAI,WAAW,MAAM,KAAK,aAAa,IAAI,GAAG,GAAGX,IAAI;AAAA,MAC3N,WAAW,KAAK;AAAA,MAChB,4BAA4B,KAAK;AAAA,MACjC,iBAAiB,KAAK;AAAA,IACvB;AACD,SAAK,eAAe;AACpB,QAAI;AACF,YAAMc,IAAI,MAAM,KAAK,eAAelC,GAAG,EAAE,WAAW,GAAE,CAAE,GAAGmD,KAAKjB,KAAK,OAAO,SAASA,EAAE,kBAAkBkB,IAAIlB,KAAK,OAAO,SAASA,EAAE,UAAUlC,CAAC,GAAGqD,IAAK,MAAM,KAAK,kBAAkB9C,CAAC,GAAG,EAAE,QAAQ+C,EAAI,IAAGC,GAAGvD,CAAC;AAC7M,aAAO,KAAK,SAAS;AAAA,QACnB,WAAW;AAAA,QACX,4BAA4B;AAAA,QAC5B,iBAAiBwD,GAAG;AAAA,UAClB,SAAStB;AAAA,UACT,UAAUlC;AAAA,UACV,eAAeO;AAAA,UACf,OAAOiC;AAAAA,YACL;AAAA,YACA,uDAAuDc,CAAE;AAAA,UACrE;AAAA,QACS,CAAA;AAAA,MACF,CAAA,GAAG,MAAMnB,EAAE,KAAK,mBAAmB,GAAG,MAAMkB,EAAG,MAAMF,GAAGjB,CAAC,GAAG;AAAA,IAC9D,SAAQA,GAAG;AACV,aAAO,KAAK,SAASd,CAAC,GAAGc,aAAa/B,KAAK,KAAKF,EAAE,cAAckB,EAAC,EAAG,KAAK,MAAM,KAAK,MAAMlB,EAAE,eAAe,IAAIoC,GAAEpC,GAAG,aAAa,CAAC,CAAC,KAAKO,EAAE0B,CAAC,GAAG;AAAA,IACpJ,UAAc;AACR,mBAAaH,CAAC,GAAG,KAAK,SAAS;AAAA,QAC7B,cAAc;AAAA,QACd,YAAY;AAAA,MACpB,CAAO;AAAA,IACP;AAAA,EACA;AAAA,EACE,MAAM,yBAAyB;AAC7B,SAAK,mBAAmB,MAAM,KAAK,kBAAkB,KAAK,gBAAgB,aAAa;AAAA,EAC3F;AAAA,EACE,MAAM,mBAAmB;AACvB,SAAK,wBAAwB,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,iBAAgB,GAAI;AAAA,EACxF;AAAA,EACE,qBAAqB;AACnB,WAAOgB,EAAE,eAAe,IAAIU,GAAET,EAAE,eAAe,CAAC,IAAI,KAAK;AAAA,EAC7D;AAAA,EACE,mBAAmB;AACjB,WAAOD,EAAE,eAAe,KAAKU,GAAET,EAAE,eAAe,CAAC;AAAA,EACrD;AAAA,EACE,MAAM,kBAAkBhD,GAAG;AACzB,UAAMC,IAAIyB,GAAE1B,CAAC;AACb,WAAOC,EAAE,YAAY;AAAA,MACnB,kBAAkB,OAAOM,MAAM;AAC7B,aAAK,SAAS;AAAA,UACZ,SAASA;AAAA,UACT,iBAAiB;AAAA,YACf,eAAeN,EAAE;AAAA,YACjB,UAAUM,EAAE;AAAA,YACZ,SAASA,EAAE;AAAA,YACX,OAAO;AAAA,UACnB;AAAA,QACA,CAAS,GAAG,KAAK,cAAc,SAASA,EAAE,KAAK,KAAK,KAAK,MAAM,KAAK,mBAAkB,GAAI+B,EAAE,OAAO,sBAAsB,KAAKoB,GAAGnD,EAAE,cAAc,MAAM,GAAGoD,GAAG,UAAUpD,EAAE,cAAc,MAAM,GAAGqC,EAAE,UAAUrC,EAAE,cAAc,MAAM,GAAGqD,GAAG,UAAUrD,EAAE,cAAc,MAAM,GAAG,MAAM4B,EAAE,KAAK,cAAc5B,CAAC;AAAA,MAChS;AAAA,MACD,iBAAiB,OAAOA,GAAGC,MAAM;AAC/B,YAAIuB;AACJ,aAAK,SAAS;AAAA,UACZ,SAAS;AAAA,UACT,iBAAiB;AAAA,YACf,UAAUA,IAAI,KAAK,oBAAoB,OAAO,SAASA,EAAE;AAAA,YACzD,eAAe9B,EAAE;AAAA,YACjB,UAAUM;AAAA,YACV,OAAOC;AAAA,UACnB;AAAA,QACA,CAAS;AAAA,MACF;AAAA,MACD,gBAAgB,MAAM,KAAK,SAAS,EAAE,SAAS,KAAI,CAAE;AAAA,MACrD,2BAA2B,CAACD,MAAM4B,EAAE,KAAK,oBAAoB5B,CAAC;AAAA,IAC/D,CAAA,GAAG,MAAMN,EAAE,KAAI,GAAIA;AAAA,EACxB;AAAA,EACE,gBAAgBD,GAAG;AACjB,SAAK,SAAS;AAAA,MACZ,UAAU;AAAA,QACR,GAAG,KAAK;AAAA,QACR,CAACA,EAAE,KAAK,GAAGA;AAAA,MACZ;AAAA,MACD,eAAe6D,GAAG,KAAK,eAAe7D,EAAE,KAAK;AAAA,IACnD,CAAK;AAAA,EACL;AACA;AACA,MAAMqB,IAAIyC,GAAGhC,EAAE,GAOTiC,KAAK,CAAC,KAAK;AAEDC;AAgBZ,MAAAC,KAAK,EAAE,OAAO,sBAAuB,GAAEC,KAAK,EAAE,OAAO,gBAAiB,GAAEC,KAAK;AAAA,EAC/E,KAAK;AAAA,EACL,OAAO;AACT,GAAGC,KAAqBC,gBAAAA,GAAE;AAAA,EACxB,QAAQ;AAAA,EACR,MAAM,GAAG;AACP,UAAMrE,IAAIsE,GAAG,EAAE,KAAKC,KAAM,CAAA,GAAGtE,IAAIuE;AAAAA,MAC/B,MAAMlC,EAAE,gBAAgB,CAACtC,EAAE,OAAOA,EAAE,QAAQ,SAASA,EAAE,IAAI,KAAM,EAAC,WAAW;AAAA,IAC9E;AACD,WAAO,CAACO,GAAGC,OAAOiE,EAAG,GAAEC,GAAE,OAAO,MAAM;AAAA,MACpCnE,EAAE,OAAO,aAAaoE,EAAEpE,EAAE,QAAQ,eAAe,EAAE,KAAK,EAAC,GAAI,MAAM;AAAA,QACjEqE,EAAEC,EAAEC,CAAC,GAAG;AAAA,UACN,MAAMvE,EAAE,IAAI,oBAAoB,4BAA4B;AAAA,QACtE,GAAW,MAAM,GAAG,CAAC,MAAM,CAAC;AAAA,MAC5B,CAAO,IAAIwE,GAAE,IAAI,EAAE;AAAA,MACbxE,EAAE,OAAO,eAAeoE,EAAEpE,EAAE,QAAQ,iBAAiB,EAAE,KAAK,EAAC,GAAI,MAAM;AAAA,QACrEqE,EAAEC,EAAEC,CAAC,GAAG;AAAA,UACN,MAAMvE,EAAE,IAAI,cAAc,YAAY;AAAA,QAChD,GAAW,MAAM,GAAG,CAAC,MAAM,CAAC;AAAA,MAC5B,CAAO,IAAIA,EAAE,OAAO,WAAU,IAAKoE,EAAEpE,EAAE,QAAQ,aAAa;AAAA,QACpD,KAAK;AAAA,QACL,SAASA,EAAE,OAAO;AAAA,MAC1B,GAAS,MAAM;AAAA,QACPyE,GAAE,OAAOf,IAAI;AAAA,UACXW,EAAEC,EAAEC,CAAC,GAAG;AAAA,YACN,MAAMvE,EAAE,IAAI,kBAAkB,kDAAkD;AAAA,cAC9E,UAAUA,EAAE,OAAO,KAAK,QAAQA,EAAE,OAAO,KAAK;AAAA,cAC9C,WAAWA,EAAE,OAAO,KAAK;AAAA,YAC1B,CAAA;AAAA,UACF,GAAE,MAAM,GAAG,CAAC,MAAM,CAAC;AAAA,UACpBqE,EAAEC,EAAEI,CAAC,GAAG;AAAA,YACN,SAASzE,EAAE,CAAC,MAAMA,EAAE,CAAC,IAAI,CAACuB,MAAMxB,EAAE,OAAO,OAAQ;AAAA,UAC7D,GAAa;AAAA,YACD,SAAS2E,EAAE,MAAM;AAAA,cACfC,EAAEC,EAAE7E,EAAE,IAAI,gBAAgB,QAAQ,CAAC,GAAG,CAAC;AAAA,YACrD,CAAa;AAAA,YACD,GAAG;AAAA,UACJ,CAAA;AAAA,QACF,CAAA;AAAA,MACT,CAAO,IAAIoE,EAAEpE,EAAE,QAAQ,cAAc,EAAE,KAAK,EAAC,GAAI,MAAM;AAC/C,YAAIwB;AACJ,eAAO;AAAA,UACLiD,GAAE,OAAOd,IAAI;AAAA,YACXU,EAAEC,EAAEQ,EAAE,GAAG;AAAA,cACP,MAAMR,EAAE7E,CAAC;AAAA,cACT,OAAO;AAAA,cACP,UAAUQ,EAAE,CAAC,MAAMA,EAAE,CAAC,IAAI,CAACY,MAAMb,EAAE,OAAO,MAAMsE,EAAE7E,CAAC,EAAE,GAAG;AAAA,YACtE,GAAe;AAAA,cACD,SAASkF,EAAE,MAAM;AAAA,gBACfN,EAAEC,EAAES,EAAE,GAAG;AAAA,kBACP,MAAM;AAAA,kBACN,cAAc/E,EAAE,IAAI,aAAa,WAAW;AAAA,kBAC5C,aAAaA,EAAE,IAAI,qBAAqB,aAAa;AAAA,gBACtD,GAAE,MAAM,GAAG,CAAC,cAAc,aAAa,CAAC;AAAA,gBACzCN,EAAE,SAASwE,EAAC,GAAIc,EAAEV,EAAEI,CAAC,GAAG;AAAA,kBACtB,KAAK;AAAA,kBACL,QAAQ;AAAA,kBACR,SAASzE,EAAE,CAAC,MAAMA,EAAE,CAAC,IAAI,CAACY,MAAMyD,EAAE7E,CAAC,EAAE,MAAM;AAAA,gBAC7D,GAAmB;AAAA,kBACD,SAASkF,EAAE,MAAM;AAAA,oBACfC,EAAEC,EAAE7E,EAAE,IAAI,kBAAkB,WAAW,CAAC,GAAG,CAAC;AAAA,kBAChE,CAAmB;AAAA,kBACD,GAAG;AAAA,gBACJ,CAAA,MAAMkE,EAAG,GAAEc,EAAEV,EAAEI,CAAC,GAAG;AAAA,kBAClB,KAAK;AAAA,kBACL,QAAQ;AAAA,gBAC1B,GAAmB;AAAA,kBACD,SAASC,EAAE,MAAM;AAAA,oBACfC,EAAEC,EAAE7E,EAAE,IAAI,eAAe,OAAO,CAAC,GAAG,CAAC;AAAA,kBACzD,CAAmB;AAAA,kBACD,GAAG;AAAA,gBACrB,CAAiB;AAAA,cACjB,CAAe;AAAA,cACD,GAAG;AAAA,YACjB,GAAe,GAAG,CAAC,MAAM,CAAC;AAAA,YACdA,EAAE,OAAO,iBAAiBkE,EAAG,GAAEc,EAAEV,EAAEI,CAAC,GAAG;AAAA,cACrC,KAAK;AAAA,cACL,OAAO;AAAA,cACP,SAASzE,EAAE,CAAC,MAAMA,EAAE,CAAC,IAAI,CAACY,MAAMb,EAAE,OAAO,UAAU,EAAE,OAAO,GAAE,CAAE;AAAA,YAC9E,GAAe;AAAA,cACD,SAAS2E,EAAE,MAAM;AAAA,gBACfC,EAAEC,EAAE7E,EAAE,IAAI,mBAAmB,WAAW,CAAC,GAAG,CAAC;AAAA,cAC7D,CAAe;AAAA,cACD,GAAG;AAAA,YACjB,CAAa,KAAKwE,GAAE,IAAI,EAAE;AAAA,aACbhD,IAAIxB,EAAE,OAAO,oBAAoB,QAAQwB,EAAE,SAASxB,EAAE,OAAO,qBAAqBkE,EAAG,GAAEC,GAAE,KAAKP,IAAI;AAAA,cACjGS,EAAEC,EAAEC,CAAC,GAAG;AAAA,gBACN,MAAMvE,EAAE,IAAI,4BAA4B,+BAA+B;AAAA,gBACvE,QAAQ;AAAA,cACT,GAAE,MAAM,GAAG,CAAC,MAAM,CAAC;AAAA,cACpBqE,EAAEC,EAAEW,EAAE,GAAG;AAAA,gBACP,SAAShF,EAAE,CAAC,MAAMA,EAAE,CAAC,IAAI,CAACY,MAAM;AAC9B,sBAAIc;AACJ,yBAAO3B,EAAE,QAAQ,UAAU2B,IAAI3B,EAAE,OAAO,oBAAoB,OAAO,SAAS2B,EAAE,UAAU3B,EAAE,OAAO,iBAAiB;AAAA,gBACnH;AAAA,cACjB,GAAiB;AAAA,gBACD,SAAS2E,EAAE,MAAM;AAAA,kBACfC,EAAE,OAAOC,EAAE7E,EAAE,IAAI,sBAAsB,cAAc,CAAC,IAAI,MAAM,CAAC;AAAA,gBACnF,CAAiB;AAAA,gBACD,GAAG;AAAA,cACJ,CAAA;AAAA,YACf,CAAa,KAAKwE,GAAE,IAAI,EAAE;AAAA,UACf,CAAA;AAAA,QACF;AAAA,MACF,CAAA;AAAA,IACP,CAAK;AAAA,EACL;AACA,CAAC;AC1kBD,IAAIG,KAAoB,oBAAI,QAAS;AACrC,SAASK,GAAEvF,GAAG;AACZ,QAAM,IAAIgD,GAAEyB,EAAE,CAAA,GAAI,IAAI,CAAC,GAAGxE,IAAI+E,GAAE,MAAM,EAAE,MAAM,SAAQ,CAAE,GAAG9C,IAAoB,oBAAI,IAAI,CAAClC,EAAE,UAAU,CAAC,GAAGyF,IAAI;AAAA,IAC1G,WAAW;AAAA,IACX,aAAaxF;AAAA,IACb,gBAAgBiC;AAAA,IAChB,MAAM,UAAU;AACd,YAAM1B,IAAIiE,EAAE,CAAE,GAAE,IAAI;AACpB,iBAAWjC,KAAKN;AACd,SAAC,MAAMlC,EAAE,eAAewC,GAAG,MAAMxC,EAAE,IAAG,CAAE,GAAG,QAAQ,CAAC,MAAMQ,EAAE,IAAI,CAAC,CAAC;AACpE,QAAE,QAAQA;AAAA,IAChB;AAAA,EACG;AACD,SAAO0E,GAAE,IAAIlF,GAAGyF,CAAC,GAAGzF,EAAE,GAAG,WAAW,CAACQ,OAAO,EAAE,MAAM,IAAI2B,GAAE3B,CAAC,CAAC,GAAGa,GAAE,CAAC,EAAE,GAAGrB,EAAE,GAAG,WAAW,CAACQ,OAAO,EAAE,MAAM,OAAO2B,GAAE3B,CAAC,CAAC,GAAGa,GAAE,CAAC,EAAE,GAAGrB,EAAE,GAAG,WAAW,CAACQ,OAAO,EAAE,MAAM,IAAI2B,GAAE3B,CAAC,CAAC,GAAGa,GAAE,CAAC,EAAE,GAAGD,EAAE,GAAG,iBAAiB,MAAM,EAAE,QAAQqD,EAAE,IAAI,IAAI,CAAC,GAAGrD,EAAE,GAAG,6BAA6B,MAAMqE,EAAE,QAAO,CAAE,GAAGrE,EAAE,GAAG,6BAA6B,MAAMqE,EAAE,SAAS,GAAGrE,EAAE,GAAG,0BAA0B,MAAMqE,EAAE,QAAS,CAAA,GAAGA;AACrY;AACA,SAAS5C,KAAI;AACX,SAAOqC;AACT;AAIA,SAAS9E,GAAEJ,GAAG;AACZ,SAAOkF,GAAE,IAAIlF,CAAC,KAAKuF,GAAEvF,CAAC;AACxB;AAgEA,SAAS2E,GAAE3E,GAAG;AACZ,MAAI;AACJ,WAAS,IAAI6C,GAAC,EAAG,IAAI7C,CAAC,MAAM,OAAO,SAAS,EAAE,YAAY,UAAU,CAAE;AACxE;AAIA,SAASqD,GAAGrD,GAAG,GAAG;AAChBgB,EAAAA;AAAAA,IACE6B,GAAG,EAAC,IAAI7C,CAAC;AAAA,IACT;AAAA,EACJ,EAAI,eAAe,OAAO,CAAC;AAC3B;AACA,eAAesD,GAAGtD,GAAG,GAAGC,IAAI,CAAA,GAAI;AAC9B,QAAMiC,IAAIjC,EAAE,WAAW,IAAIwF,IAAIzE;AAAAA,IAC7B6B,GAAG,EAAC,IAAI7C,CAAC;AAAA,IACT;AAAA,EACD;AACD,MAAI,CAACyF,EAAE,eAAe,IAAI,CAAC,MAAMA,EAAE,eAAe,IAAI,CAAC,GAAGvD,IAAI;AAC5D,UAAM1B,IAAIiF,EAAE,YAAY;AACxB,KAAC,MAAMzF,EAAE,eAAe,GAAG,MAAMA,EAAE,IAAG,CAAE,GAAG,QAAQ,CAAC+B,MAAMvB,EAAE,KAAKuB,CAAC,CAAC,GAAG0D,EAAE,UAAU,QAAQhB,EAAEjE,GAAG,IAAI;AAAA,EACvG;AACA;AACA,eAAeiC,GAAGzC,GAAG,GAAG;AACtB,QAAM,EAAE,SAASC,GAAG,UAAUiC,GAAG,WAAWuD,GAAG,GAAGjF,EAAG,IAAG,KAAK,IAAIgC,IAAIiD,MAAM,CAACZ,MAAMA,IAAI9C,IAAI3B,GAAEJ,CAAC;AAC7F,aAAW,CAAC6E,GAAG3E,CAAC,KAAK,OAAO,QAAQM,CAAC;AACnC,IAAAR,EAAE,GAAG6E,GAAG3E,CAAC;AACX,EAAAD,KAAKiC,KAAKI,GAAE,MAAMrC,EAAE,SAASiC,GAAGM,EAAET,EAAE,YAAY,KAAK,CAAC,CAAC,GAAG,MAAMA,EAAE,QAAS;AAC7E;AC/GA,MAAM2D,yBAA+D,QAAQ;AAGtE,SAASC,GAA8BC,GAAgE;AACnG,SAAAC;AAAA,IACHC,EAAsBF,CAAU,EAAE,IAAI,CAACG,MAAa;AAChD,YAAMC,IAAeJ,EAAW,SAAW,EAAA,gBAAuCG,CAAQ,EAAE;AAExF,aAAAE,EAAiBD,CAAY,IACtB,KAGJA;AAAA,IACV,CAAA;AAAA,EACL;AACJ;AAEO,SAASF,EAAsBF,GAAyC;AAC3E,SAAKF,GAAmB,IAAIE,CAAU,KACfF,GAAA;AAAA,IACfE;AAAA,IACAA,EAAW,UAAU,OAAO,CAACG,MACrBG,EAAW,kBAAkB,SAASH,CAAQ,IACvC,KAGcH,EAAW,SAAS,EAAE,gBAAgBG,CAAQ,aAEpCI,EACtC;AAAA,EACL,GAGGT,GAAmB,IAAIE,CAAU,KAAK,CAAC;AAClD;AAEO,SAASQ,GAAmBC,GAAqC;AAGpE,SAFkBP,EAAsBO,EAAM,OAAA,CAAQ,EAErC;AAAA,IACb,CAACC,GAAQP,MAAaO,EAAO,OAAOD,EAAM,kBAAkBN,CAAQ,KAAK,EAAE;AAAA,IAC3E,CAAA;AAAA,EACJ;AACJ;AAEO,SAASQ,GAAkBX,GAA4D;AACpF,QAAAY,wBAAqB,IAA2B,GAChDC,IAAWb,EAAW,SAAS;AAErC,EAAAY,EAAe,IAAIZ,CAAU;AAElB,aAAAG,KAAYH,EAAW;AAC9B,IAAIA,EAAW,kBAAkB,SAASG,CAAQ,KAIlDS,EAAe,IAAIC,EAAS,gBAAgBV,CAAQ,EAAE,YAAY;AAGtE,SAAO,CAAC,GAAGS,EAAe,QAAQ;AACtC;AAEO,SAASE,GAAoBL,GAAiC;AAC1D,SAAAA,EACF,mBACA;AAAA,IACG,CAACM,MACG,CAACC,EAAaD,GAASE,EAAqB,KAC5C,CAACD,EAAaD,GAASG,EAAa,KACpC,CAACF,EAAaD,GAASI,EAAQ,KAC/B,CAACH,EAAaD,GAASK,EAAS,KAChCL,EAAQ,aAAaM;AAAA,EAC7B;AACR;AAqBO,SAASC,GAA0Bb,GAA4B;AAC9D,MAAAA,EAAM;AACC,WAAA;AAGP,MAAA,EAAEA,aAAiBY;AACZ,WAAA;AAGL,QAAAE,IAAyB,CAACpB,MAAqB;;AAC1C,YAAAqB,IAAAf,EAAM,kBAAkBN,CAAQ,MAAhC,gBAAAqB,EAAmC,KAAK,CAACC,MAAiBH,GAA0BG,CAAY;AAAA,EAC3G;AAEA,SAAOvB,EAAsBO,EAAM,OAAQ,CAAA,EAAE,KAAKc,CAAsB;AAC5E;ACrHA,MAAMG,KAAQC,EAAS,MAAMC,EAAI,QAAQ,QAAQ,CAAC;AAElD,MAAMC,GAAU;AAAA,EAAhB;AAEY,IAAAC,EAAA,oCAA8B,IAAI;AAClC,IAAAA,EAAA,kBAA+B,CAAC;AAAA;AAAA,EAEjC,KAAKrB,GAAyB;AAC5B,SAAA,OAAO,IAAIA,CAAK,GACrB,KAAK,UAAUsB,EAAM,EAAE,SAAS,EAAG,CAAA,CAAC;AAAA,EAAA;AAAA,EAGjC,MAAMrB,GAA6B;AACtC,QAAI,CAACA,GAAQ;AACJ,WAAA,6BAAa,IAAI;AAEtB;AAAA,IAAA;AAGJ,eAAWD,KAASC;AACX,WAAA,OAAO,OAAOD,CAAK;AAAA,EAC5B;AAAA,EAGJ,MAAgB,UAAoBuB,GAAiE;AACjG,UAAMC,IAAU,OAAOD,KAAuB,aAAaA,EAAuB,IAAAA;AAE7E,gBAAA,SAAS,KAAKC,CAAO,GAE1BA,EAAQ,KAAK,MAAMC,GAAY,KAAK,UAAUD,CAAO,CAAC,GAElD,KAAK,SAAS,WAAW,KACzB,KAAK,SAAS,GAGXA;AAAA,EAAA;AAAA,EAGH,WAAiB;AACb,YAAA,IAAI,KAAK,QAAQ,EACpB,KAAK,MAAMF,EAAM,CAAC,EAClB,KAAK,MAAM;AACJ,UAAA,KAAK,SAAS,WAAW,GAAG;AAC5B,aAAK,SAAS;AAEd;AAAA,MAAA;AAGE,YAAArB,IAAS,KAAK,QAAQ;AAExB,MAAAA,EAAO,WAAW,KAItBgB,GAAM,aAAahB,CAAM;AAAA,IAAA,CAC5B;AAAA,EAAA;AAAA,EAGD,UAAwB;AAC5B,UAAMA,IAAuB,CAAC,GACxByB,wBAAgC,IAAI;AAE/B,eAAA1B,KAAS,KAAK;AACjB,MAAC2B,EAAY3B,CAAK,MAIjB,KAAA,OAAO,OAAOA,CAAK,GACLD,GAAAC,CAAK,EAAE,QAAQ,CAAC4B,MAAUF,EAAS,IAAIE,CAAK,CAAC,GAChE3B,EAAO,KAAKD,CAAK;AAGV,eAAAA,KAAS,KAAK;AAGjB,MAFC,KAAA,OAAO,OAAOA,CAAK,GAEpB,CAAA0B,EAAS,IAAI1B,CAAK,KAItBC,EAAO,KAAKD,CAAK;AAGd,WAAAC;AAAA,EAAA;AAGf;AAEA,MAAe4B,KAAAC,GAAOV,EAAS,GCnEzBH,IAAQC,EAAS,MAAMC,EAAI,QAAQ,QAAQ,CAAC,GAC5CY,yBAA2E,QAAQ,GACnFC,yBAA0E,QAAQ;AAExF,SAASC,GAAsBC,GAA+B;AAC1D,QAAMC,IAAgBD,EAAY,mBAAmB,OAAO,CAACA,CAAW,CAAC;AAEzE,aAAWlB,KAAgBmB;AACvB,IAAAnB,EAAa,WAAW,EAAI;AAEpC;AAEA,SAASoB,GAAoBF,GAA+B;AACxD,QAAMC,IAAgB9B,GAAoB6B,CAAW,EAAE,OAAO,CAACA,CAAW,CAAC;AAE3E,aAAWlB,KAAgBmB,GAAe;AACtC,QAAI,CAACnB,EAAa,cAAcA,EAAa,WAAW,WAAW;AAC/D;AAGJ,UAAMqB,KAAcrB,EAAa,cAAc,CAAA,GAAI,OAAO,CAACsB,MAEnD,EAAEA,aAAqBC,OACvB,CAACvB,EAAa,yBAAyBsB,EAAU,UAAU,EAAI,CAEtE;AAEG,QAAA,CAACD,EAAW,KAAK,CAACC,MAAc,CAACA,EAAU,YAAYtB,CAAY,CAAC,GAAG;AAC1D,MAAAA,EAAA,kBAAkB,cAAc,EAAE;AAE/C;AAAA,IAAA;AAGS,IAAAA,EAAA,kBAAkB,cAAcqB,CAAU;AAAA,EAAA;AAE/D;AAEA,eAAsBG,GAAkBC,GAAuC;AAC3ExB,EAAAA,EAAM,SAAS;AAAA,IACX,mBAAmB;AAAA,MACf,GAAGA,EAAM;AAAA,MACT,CAACwB,EAAW,GAAG,GAAG;AAAA,IAAA;AAAA,EACtB,CACH,GAEGC,GAAuBD,EAAW,OAAO,CAAC,KAC1C,MAAME,GAAsBF,EAAW,OAAA,GAAUG,EAA0BH,EAAW,GAAG,CAAC,GAG1FxB,EAAM,YAAYA,EAAM,SAAS,CAACA,EAAM,WACxCG,GAAU,KAAKqB,CAAU;AAEjC;AAEsB,eAAAE,GAAsBpD,GAAmCsD,GAAmC;;AAC9G,GAAI5B,IAAAA,EAAM,iBAAiB1B,EAAW,SAAS,MAA3C0B,QAAAA,EAA8C,SAAS4B,OAI3D5B,EAAM,SAAS,oBAAoB;AAAA,IAC/B,GAAGA,EAAM;AAAA,IACT,CAAC1B,EAAW,SAAS,IAAI0B,EAAM,iBAAiB1B,EAAW,SAAS,KAAK,IAAI,OAAOsD,CAAU;AAAA,EAAA,CACjG,GAEK,MAAAC,GAA4BvD,GAAYsD,CAAU;AAC5D;AAEA,eAAsBE,GAAkBN,GAAuC;AACvE,MAAAO,GAAmBP,CAAU;AAC7B;AAGJ,QAAMQ,IAAehC,EAAM,kBAAkBwB,EAAW,GAAG,KAAK;AAEhExB,EAAAA,EAAM,SAAS;AAAA,IACX,mBAAmBwB,EAAW,kBACxBS,GAAcjC,EAAM,mBAAmBwB,EAAW,GAAG,IACrD;AAAA,MACE,GAAGxB,EAAM;AAAA,MACT,CAACwB,EAAW,GAAG,GAAGQ,IAAe;AAAA,IAAA;AAAA,EACrC,CACP,GAEGhC,EAAM,YAAYA,EAAM,SAAS,CAACA,EAAM,WACxCG,GAAU,KAAKqB,CAAU;AAEjC;AAEgB,SAAAU,GAAuBlD,GAAuBmD,GAAwC;AAClG,QAAMC,IAAkBpD,KAAA,gBAAAA,EAAQ,IAAI,CAACD,MAAUsD,GAAStD,EAAM,qBAA0B,KAAAA,EAAM,cAAe,CAAA,IACvGuD,IAAoB,CAAC;AAEhB,aAAA,CAACC,GAAKC,CAAK,KAAK,OAAO,QAAQxC,EAAM,iBAAiB,GAAG;AAC1D,UAAAyC,IAAcC,GAASH,CAAG;AAOhC,KALI,CAACH,KACDA,EAAgB;AAAA,MACZ,CAACO,MAAaJ,MAAQI,KAAaA,EAAS,SAAS,GAAG,KAAKJ,EAAI,WAAWI,CAAQ;AAAA,IACxF,MAEa,EAACR,KAAA,QAAAA,EAAoB,IAAIM,QAI1CH,EAAkBC,CAAG,IAAIC;AAAA,EAAA;AAGvBxC,EAAAA,EAAA,SAAS,EAAE,mBAAAsC,GAAmB;AACxC;AAEO,SAASM,GAAgBpB,GAAwBqB,IAAwB,IAAgB;AACtF,QAAAC,wBAAwB,IAAuB;AAIrD,MAFkBA,EAAA,IAAItB,EAAW,QAAQ,GAErCA,aAAsB7B;AACtB,eAAWlB,KAAYD,EAAsBgD,EAAW,OAAQ,CAAA;AAC5D,MAAAsB,EAAkB,IAAItB,EAAW,gBAAuC/C,CAAQ,EAAE,YAAY;AAItG,QAAMsE,IAAe,CAAC,GAAGD,EAAkB,OAAA,CAAQ,EAAE;AAAA,IACjD,CAACE,MAAe,CAACA,GAAYC,EAAeD,CAAU,CAAC;AAAA,EAC3D;AAEO,SAAAE,EAAI1B,EAAW,MAAM,EAAE,cAAAuB,EAAc,CAAA,GAAG,CAAChE,MAAU;AACtD,IAAAoC,GAAoBpC,CAAK,GAEjB8D,EAAA,SAAS7B,GAAsBjC,CAAK;AAAA,EAAA,CAC/C;AACL;AAEO,SAASoE,GAAiBlC,GAAqC;AAC5D,QAAAmC,wBAAyB,IAAuB;AAItD,MAFmBA,EAAA,IAAInC,EAAY,QAAQ,GAEvCA,aAAuBtB;AACvB,eAAWlB,KAAYD,EAAsByC,EAAY,OAAQ,CAAA;AAC7D,MAAAmC,EAAmB,IAAInC,EAAY,gBAAuCxC,CAAQ,EAAE,YAAY;AAIxG,QAAMsE,IAAe,CAAC,GAAGK,EAAmB,OAAA,CAAQ,EAAE;AAAA,IAClD,CAACC,MAAgB,CAACA,GAAaC,GAAcD,CAAW,CAAC;AAAA,EAC7D;AAEA,SAAOpC,EAAY,MAAM,EAAE,cAAA8B,GAAc;AAC7C;AAEsB,eAAAQ,GAClBC,GACAC,GACAtB,GACqB;AACf,QAAAuB,IAAkBT,EAAeU,CAAS,GAC1CC,IAAkBH,EAAa,IAAI,CAACxC,MAAgBA,EAAY,GAAG,GACnE4C,IAA2BL,EAC5B,OAAO,CAAChC,MAAe,CAACoC,EAAgB,SAASpC,EAAW,GAAG,CAAC,EAChE,IAAI,CAACA,MAAeA,EAAW,mBAAoB,CAAA,EACnD,OAAO,CAACiB,MAAgB,CAACN,EAAmB,IAAIM,CAAW,CAAC,GAC3DqB,IAAa,MAAMJ,EAAgB,IAAI,EAAE,KAAKG,GAA0B;AAEvE,SAAAJ,EAAa,OAAOK,CAAU;AACzC;AAEO,SAAS/B,GAAmBP,GAAiC;;AAChE,QAAMuC,KAAYjE,IAAA0B,EAAW,SAAS,cAApB,gBAAA1B,EAA+B;AAEjD,SAAO,CAAC0B,EAAW,WAAW,KAAK,CAACH,MAC5BA,EAAU,KAAK,QAAQ,MAAM0C,IACtB,KAGL1C,aAAqBC,KAIpB,CAACE,EAAW,yBAAyBH,EAAU,UAAU,EAAI,IAHzD,EAId;AACL;AAEgB,SAAA2C,GAAc/C,GAAyBuC,GAAiD;AACpG,SAAOA,EAAY,IAAIvC,EAAY,GAAG,KAAKkC,GAAiBlC,CAAW;AAC3E;AAEO,SAASgD,KAA+B;AAC3C,SAAO,CAAC,GAAGjE,EAAM,gBAAgB,EAAE,IAAI,CAAC,EAAE,YAAA1B,EAAA,MAAiB4F,GAAiB5F,CAAU,CAAC,EAAE,KAAK;AAClG;AAEO,SAAS6F,KAAiG;AAC7G,SAAOnE,EAAM;AACjB;AAEO,SAASoE,KAA8B;AAC1CpE,EAAAA,EAAM,iBAAiB,MAAM;AACjC;AAEO,SAASqE,GACZ/F,GACyD;AAClD,SAAA0B,EAAM,iBAAiB,IAAI1B,CAAU;AAChD;AAEO,SAAS2E,EAAgDD,GAAkB;AAC9E,SAAQlC,GAAc,IAAIkC,CAAU,KAAWsB,GAAgBtB,CAAU;AAC7E;AAEO,SAASuB,GAA8BC,GAAuB;AACjE,QAAMC,IAAcC,EAAM,YAAY,EAAE,YAAY,CAAC;AAErD,SAAOF,IACDG,IAAqBH,EAAK,WAAW,GAAG,IAAIC,EAAY,MAAM,GAAG,EAAE,IAAIA,KAAeD,CAAI,IAC1FC;AACV;AAEgB,SAAAG,GAAepD,GAAwBiC,GAAkD;AACrG,SAAOA,EAAa,IAAIjC,EAAW,GAAG,KAAKoB,GAAgBpB,CAAU;AACzE;AAEO,SAASqD,GAAkB9F,GAA4B;AAC1D,aAAW,EAAE,YAAAT,OAAgB0B,EAAM;AAG3B,QAFWkE,GAAiB5F,CAAU,EAE/B,KAAK,CAACwG,MAAoBA,EAAgB,QAAQ/F,EAAM,GAAG;AAC3D,aAAA;AAIR,SAAA;AACX;AAEO,SAASgG,GAAchG,GAA4B;AACtD,SAAOgC,GAAa,IAAIhC,EAAM,OAAA,CAAQ;AAC1C;AAEO,SAASiG,GAAajG,GAA4B;AAC9C,SAAA,CAACgG,GAAchG,CAAK;AAC/B;AAEO,SAAS0C,GAAuBnD,GAA4C;AACxE,SAAA0B,EAAM,iBAAiB,KAAK,CAAC,EAAE,YAAYiF,EAAA,MAA2BA,MAAyB3G,CAAU;AACpH;AAEO,SAASgG,GAAiDtB,GAAkB;;AAC/E,QAAMkC,IAAalC,GACbmC,IAAyB,CAAC7G,GAA+B+C,MAA6B;AACxF,IAAA/C,EAAW,aAAa4G,EAAW,YACnC5G,EAAW,UAAU4G,EAAW,SAEtB7D,EAAA,GAEV/C,EAAW,aAAa,CAAC,GACzBA,EAAW,UAAU;AAAA,EACzB,GACM8G,KAActF,IAAA,cAAcoF,EAAW;AAAA,IAKtB,WAAWG,GAAwBC,GAAuB;AAClD,MAAAH,EAAA,KAAK,OAAO,OAAO,GAAG,MAAM,MAAM,WAAWE,GAAYC,CAAM,CAAC;AAAA,IAAA;AAAA,IAGxE,sBAA4B;AAC3C,YAAM,oBAAoB;AAE1B,iBAAW7G,KAAY,OAAO,OAAO,KAAK,UAAU;AAC5C,QAAEA,aAAoBI,OAIjBJ,EAAA,eAAewE,EAAexE,EAAS,YAAY;AAAA,IAChE;AAAA,IAGY,yBAA+B;AAC3C,MAAA0G,EAAuB,KAAK,OAAO,GAAG,MAAM,MAAM,wBAAwB;AAAA,IAAA;AAAA,EAGlF,GAvBI/E,EAFgBN,GAEO,cAAa,KACpCM,EAHgBN,GAGO,WAAU,KAHjBA;AA2BN,SAAAgB,GAAA,IAAIoE,GAAYE,CAAW,GAC5BrE,GAAA,IAAIqE,GAAaF,CAAU,GAE7BA,EAAA,GAAG,kBAAkB,OAAOK,MAAW;AAC9C,UAAMH,EAAY,aAAa;AAAA,MAC3B,GAAGG;AAAA,MACH,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA,CACZ;AAAA,EAAA,CACJ,GAEUC,GAAA,EAAE,CAAC,SAASxC,EAAW,SAAS,EAAE,GAAGoC,GAAa,GAEtDA;AACX;AAEO,SAAS9B,GAA+CD,GAAmB;AACtE,SAAAtC,GAAa,IAAIsC,CAAW,KAAWoC,EAAK,iCAAiCpC,EAAY,SAAS,EAAE;AAChH;ACzTA,MAAqBqC,WAAeC,GAAI;AAAA,EAAxC;AAAA;AAEY,IAAAvF,EAAA,uBAA6B,CAAC;AAC9B,IAAAA,EAAA,8BAAoC,CAAC;AAAA;AAAA,EAEtC,WAAW9B,GAAmCsH,GAAeC,GAAsB;AACtF,SAAK,cAAc,KAAK;AAAA,MACpB,YAAAvH;AAAA,MACA,OAAAsH;AAAA,MACA,QAAAC;AAAA,IAAA,CACH;AAAA,EAAA;AAAA,EAGE,kBAAkBvH,GAAmCsH,GAAeC,GAAsB;AAC7F,SAAK,qBAAqB,KAAK;AAAA,MAC3B,YAAAvH;AAAA,MACA,OAAAsH;AAAA,MACA,QAAAC;AAAA,IAAA,CACH;AAAA,EAAA;AAAA,EAGL,MAAgB,MAAqB;AACjC,UAAMC,IAASC,GAA+B,GACxCC,IAAc,MAAMF,EAAO,eAAe;AAEhD,eAAWlE,KAAcoE,GAAa;AAClC,YAAMC,IAAY,MAAMH,EAAO,SAASlE,CAAU;AAElD,iBAAW,CAACsE,GAAIC,CAAQ,KAAK,OAAO,QAAQF,CAAS,GAAG;AAC9C,cAAA1D,IAAM,KAAK,WAAW2D,CAAE;AAExB,cAAAJ,EAAO,OAAOnE,EAA0BY,CAAG,GAAG,KAAK,oBAAoB4D,CAAQ,GAAG5D,CAAG,GACrF,MAAAuD,EAAO,OAAOlE,GAAYsE,CAAE;AAAA,MAAA;AAAA,IACtC;AAGJ,eAAW,EAAE,YAAA5H,GAAY,QAAAuH,EAAO,KAAK,KAAK;AACtCnE,MAAAA,GAAsBpD,GAAYqD,EAA0BkE,CAAM,GAAG,EAAE,SAAS,IAAO;AAG3F,eAAW,EAAE,YAAAvH,GAAY,OAAAsH,GAAO,QAAAC,EAAO,KAAK,KAAK;AAC7CO,MAAAA,GAAuB9H,GAAYsH,CAAK,GACxClE,GAAsBpD,GAAYuH,GAAQ,EAAE,SAAS,IAAO;AAAA,EAChE;AAAA,EAGM,oBAAoBM,GAA0C;AACpE,eAAW,CAACE,GAAKC,CAAK,KAAK,OAAO,QAAQH,CAAQ,GAAG;AACjD,UAAIE,MAAQ,SAAS,OAAOC,KAAU,UAAU;AAC5C,QAAAH,EAASE,CAAG,IAAI,KAAK,WAAWC,CAAK;AAErC;AAAA,MAAA;AAGJ,MAAI,OAAOA,KAAU,YAAYA,MAAU,SAI3CH,EAASE,CAAG,IAAI,KAAK,oBAAoBC,CAAuB;AAAA,IAAA;AAG7D,WAAAH;AAAA,EAAA;AAAA,EAGD,WAAW5D,GAAqB;AACtC,eAAW,EAAE,OAAAqD,GAAO,QAAAC,EAAO,KAAK,KAAK;AACjC,UAAKtD,EAAI,WAAWqD,CAAK;AAIlB,eAAArD,EAAI,QAAQqD,GAAOC,CAAM;AAGpC,eAAW,EAAE,OAAAD,GAAO,QAAAC,EAAO,KAAK,KAAK;AACjC,UAAKtD,EAAI,WAAWqD,CAAK;AAIlB,eAAArD,EAAI,QAAQqD,GAAOC,CAAM;AAG7B,WAAAtD;AAAA,EAAA;AAGf;AC9FO,MAAMgE,WAA8BC,GAAQ;AAAA,EAA5C;AAAA;AAEK,IAAApG,EAAA,eAAQ,IAAIqG,GAAqC,iBAAiB;AAAA;AAAA,EAE1E,MAAa,QAAQhE,GAAqBiE,GAA6C;AACnF,UAAMC,IAAO,MAAM,KAAK,MAAM,IAAIlE,CAAW,GACvCmE,IAAiB,OAAOF,KAAe,WAAWA,EAAW,YAAYA;AAE/E,WAAO,CAAC,EAACC,KAAA,QAAAA,EAAM,eAAcA,EAAK,cAAcC;AAAA,EAAA;AAAA,EAGpD,MAAa,SAASnE,GAAqBiE,GAA0C;AAC3E,UAAA,KAAK,MAAM,IAAIjE,GAAa;AAAA,MAC9B,YAAY,OAAOiE,KAAe,WAAWA,EAAW,YAAYA;AAAA,IAAA,CACvE;AAAA,EAAA;AAAA,EAGL,MAAa,OAAOjE,GAAoC;AAC9C,UAAA,KAAK,MAAM,OAAOA,CAAW;AAAA,EAAA;AAAA,EAGvC,MAAyB,OAAsB;AACpC,IAAAoE,EAAA,GAAG,eAAe,YAAY;AAC3B,YAAA,KAAK,MAAM,MAAM,GAEvB,KAAK,MAAM,MAAM;AAAA,IAAA,CACpB;AAAA,EAAA;AAGT;AAEA,MAAeC,IAAAjG,GAAO0F,EAAqB;ACxBpC,SAASQ,GAAQC,GAA4C;AAChE,QAAMC,IAAwB,CAAC;AAE/B,SAAO,aACG,WAAWA,MACNA,EAAA,QAAQ,MAAMD,EAAO,IAGzBC,EAAO;AAEtB;ACFA,MAAqBC,GAAc;AAAA,EAI/B,MAAgB,oBACZnI,GACA8D,IAKI,IACiB;;AACjB,QAAAmC,GAAajG,CAAK,GAAG;AACrB,YAAM0B,IAAW,CAAC;AAElB,iBAAWhC,KAAYD,EAAsBO,EAAM,OAAQ,CAAA,GAAG;AAC1D,cAAMoI,IACD,MAAMpI,EAAM,uBAAyDN,CAAQ,KAAM,CAAC;AAEzFgC,QAAAA,EAAS,KAAK,GAAG2G,GAAUD,CAAc,CAAC;AAAA,MAAA;AAGvC1G,aAAAA;AAAAA,IAAA;AAGX,UAAMA,IAAyC,CAAC,GAC1CqD,IAA0B,CAAC,GAC3BmC,IAAYoB,EAAItI,EAAM,WAAW,KAAK,GACtCuI,IAAoBC,GAAWxI,EAAM,cAAc,EAAE,GACrDyI,IAAiBF,EAAkB,KAAO,EAAA,IAAI,CAAC/E,OAAS;AAAA,MAC1D,aAAaA;AAAA,MACb,WAAW;AAAA,IAAA,EACb,GACIkF,IAAoBJ,EAAIG,GAAgB,aAAa;AAE3D,IAAI3E,EAAQ,WACRA,EAAQ,OAAO,WAAW2E;AAG9B,eAAWE,KAAgBJ,GAAmB;AAC1C,YAAM,QAAQ;AAAA,QACVI,EAAa,IAAI,OAAOjF,MAAgB;AACpC,gBAAM,EAAE,UAAUkF,GAAkB,YAAYC,EAAmB,IAC/D,MAAM,KAAK,qBAAqB7I,GAAO0D,GAAawD,GAAWpD,EAAQ,mBAAmB;AAEnF,UAAAiB,EAAA,KAAK,GAAG8D,CAAkB;AAErC,qBAAW,CAACnJ,IAAUoJ,EAAc,KAAK,OAAO,QAAQF,CAAgB;AAGnD,aAFSlH,EAAAhC,QAAAgC,EAAAhC,MAAuB,CAAC,IAEjC,KAAK,GAAGoJ,EAAc;AAAA,QAE9C,CAAA;AAAA,MACL;AAEA,iBAAWpF,KAAeiF;AAClB,QAAAjF,EAAY,SAAS,GAAG,MAI5BxC,EAASwH,EAAkB,IAAIhF,CAAW,CAAC,EAAE,YAAY;AAGvD,cAAA3C,IAAA+C,EAAQ,aAAR,gBAAA/C,EAAA,KAAA+C,GAAmB6E;AAAA,IAAY;AAGzC,eAAW,CAACjJ,GAAU0I,CAAc,KAAK,OAAO,QAAQ1G,CAAQ;AACtD,MAAA1B,EAAA,kBAAkBN,GAAU0I,CAAc;AAGpD,UAAMW,IAAgBjF,EAAQ,mBACxB,OAAO,OAAOpC,CAAQ,EAAE,KACxB,IAAA,OAAO,OAAOA,CAAQ,EAAE,KAAK,EAAE,OAAOqD,CAAU;AAEtD,WAAIjB,EAAQ,WACRA,EAAQ,OAAO,WAAWiF,EAAc,IAAI,CAACnH,MAClCV,EAASwH,EAAkB,IAAI9G,EAAM,mBAAoB,CAAA,CAAC,CACpE,IAGEmH;AAAA,EAAA;AAAA,EAGX,MAAgB,qBACZ/I,GACA0D,GACAwD,GACA8B,GAC4E;;AACtE,UAAA5B,IAAWF,EAAU,IAAIxD,CAAW;AAE1C,WACI0D,KACC,MAAMW,EAAe,QAAQX,EAAS,KAAKA,EAAS,aAAiB,oBAAA,KAAA,CAAM,OAC5ErG,IAAA,KAAK,gBAAL,QAAAA,EAAkB,OAAOf,EAAM,QAExB;AAAA,MACH,UAAU,MAAM,KAAK,8BAA8BA,GAAOoH,CAAQ;AAAA,MAClE,YAAY,CAAA;AAAA,IAChB,IAGG,KAAK,+BAA+BpH,GAAO0D,GAAasF,CAAmB;AAAA,EAAA;AAAA,EAGtF,MAAgB,8BACZhJ,GACAoH,GACqC;;AACrC,UAAM1F,IAAyC,CAAC;AAEhD,eAAWhC,KAAYD,EAAsBO,EAAM,OAAQ,CAAA,GAAG;AACpD,YAAAiJ,IAAmBjJ,EAAM,gBAAuCN,CAAQ;AAE9E,UAAIuJ,EAAiB,QAAQ;AAChB,QAAAvH,EAAAhC,CAAQ,IAAIuJ,EAAiB,gBAAgB;AAEtD;AAAA,MAAA;AAGE,YAAAC,MAAqBC,KAAApI,IAAA,KAAK,gBAAL,gBAAAA,EAAkB,IAAIf,EAAM,SAA5B,gBAAAmJ,EAAkC,kBAAkBzJ,OAAa,CAAC;AAEpF,MAAAgC,EAAAhC,CAAQ,IAAIwJ,EAChB,OAAO,CAACE,MAAsBA,EAAkB,qBAAqBhC,EAAS,GAAG,EACjF,IAAI,CAACgC,MAAsBvF,GAAgBuF,GAAmB,EAAE,OAAO,GAAK,CAAC,CAAC;AAAA,IAAA;AAGhF,WAAA1H;AAAA,EAAA;AAAA,EAGX,MAAgB,+BACZ1B,GACA0D,GACAsF,GAC4E;AAC5E,UAAMtH,IAAyC,CAAC,GAC1CqD,IAA0B,CAAC,GAC3BsE,IAAerB,GAAK,YAAY;AAC9B,UAAA;AACM,cAAAZ,IAAW,MAAMpH,EAAM,cAAc,EAAE,QAAQA,EAAM,OAAO,YAAY,GAAG0D,CAAW,GACtFmF,IAAqB,MAAMjE,EAAU,8BAA8B;AAAA,UACrE,CAAClB,CAAW,GAAG0D;AAAA,QAAA,CAClB;AAEU,eAAArC,EAAA,KAAK,GAAG8D,CAAkB,GAE9BzB;AAAA,eACFkC,GAAO;AACR,YAAA/I,EAAa+I,GAAOC,EAAgB;AAC7B,iBAAA;AAGP,YAAAhJ,EAAa+I,GAAOE,EAA2B;AAEvC,yBAAA,KAAKF,EAAM,OAAO,GAE1B,OAAMN,KAAA,gBAAAA,EAAsBtF,KAErB;AAGL,cAAA4F;AAAA,MAAA;AAAA,IACV,CACH;AAED,eAAW5J,KAAYD,EAAsBO,EAAM,OAAQ,CAAA,GAAG;AACpD,YAAAiJ,IAAmBjJ,EAAM,gBAAuCN,CAAQ;AAE9E,UAAIuJ,EAAiB,QAAQ;AAChB,QAAAvH,EAAAhC,CAAQ,IAAIuJ,EAAiB,gBAAgB;AAEtD;AAAA,MAAA;AAGE,YAAA7B,IAAW,MAAMiC,EAAa;AAEpC,UAAI,CAACjC;AACD;AAGJ,YAAMwB,IAAmB,MAAMK,EAAiB,aAAa,8BAA8B;AAAA,QACvF,CAACvF,CAAW,GAAG0D;AAAA,MAAA,CAClB;AAED,MAAA1F,EAAShC,CAAQ,IAAIkJ;AAAA,IAAA;AAGlB,WAAA,EAAE,UAAAlH,GAAU,YAAAqD,EAAW;AAAA,EAAA;AAGtC;AC7MA,MAAM0E,wBAAoE,QAAQ;AAElF,MAAqBC,GAAe;AAAA,EAIhC,MAAgB,cAAc5F,IAAgC,IAAoC;AACxF,UAAA6F,IAAOhE,EAAM,YAAY;AAE/B,WAAI7B,EAAQ,UAAU,CAAC2F,EAAY,IAAIE,CAAI,IACvCF,EAAY,IAAIE,GAAM,MAAMhE,EAAM,8BAA8B,IACxD8D,EAAY,IAAIE,CAAI,KAC5BF,EAAY,IAAIE,GAAM,MAAMhE,EAAM,sBAAsB,GAGrD8D,EAAY,IAAIE,CAAI,KAAK;AAAA,EAAA;AAGxC;ACjBA,MAAqBC,GAAkB;AAAA,EAInC,MAAgB,iBAAiB3J,GAAqC;AAClE,eAAWwC,KAAcxC;AACf,YAAA,KAAK,cAAcwC,CAAU;AAAA,EACvC;AAAA,EAGJ,MAAgB,cAAcA,GAAuC;AAC7D,QAAA,GAAC,KAAK,eAAe,KAAK,YAAY,OAAOA,EAAW,GAAG,IAI1D;AAAA,WAAA,YAAY,IAAIA,CAAU;AAE/B,iBAAW/C,KAAYD,EAAsBgD,EAAW,OAAQ,CAAA;AACtD,cAAAA,EAAW,uBAAuB/C,CAAQ;AAGzC,iBAAAsB,KAAgByB,EAAW;AAC5B,cAAA,KAAK,cAAczB,CAAY;AAAA;AAAA,EACzC;AAGR;ACZA,MAAM6I,KAAUjD;AAWK,MAAAkD,WAAgBC,GAAMF,IAAS,CAAC1B,IAAeuB,IAAgBE,EAAiB,CAAC,EAAE;AAAA,EAAnF;AAAA;AAQP,IAAAvI,EAAA;AAAA;AAAA,EANV,OAAc,QAAQ2I,GAAmC;AACrD,WAAO7F,EAAI,IAAI2F,GAAQ,GAAG,CAACG,MAAQ;AAC/B,MAAAA,EAAI,SAASD;AAAA,IAAA,CAChB;AAAA,EAAA;AAAA,EAKL,IAAW,SAAmC;AAC1C,WAAO,KAAK;AAAA,EAAA;AAAA,EAGhB,IAAW,OAAO/J,GAAkC;AAChD,QAAI,CAACA,GAAQ;AACT,aAAO,KAAK,SACZ,OAAO,KAAK;AAEZ;AAAA,IAAA;AAGJ,UAAMiK,IAAiBC,GAAU,KAAK,OAAO,YAAY,IAAI,UAAU;AAEvE,SAAK,UAAUlK,GACf,KAAK,cAAcqI,EAAI,CAAA,GAAI,KAAK,GAC3B,KAAA,OAAO,WAAWrI,EAAO;AAAA,MAC1B,CAACD,MACGkK,EAAelK,EAAM,GAAG,KAAK;AAAA,QACzB,UAAUA,EAAM;AAAA,QAChB,WAAW;AAAA,MAAA;AAAA,IAEvB;AAAA,EAAA;AAAA,EAGJ,MAAgB,MAAqB;AAC7B,QAAA,CAAC,KAAK;AACA,YAAA,IAAI,MAAM,qCAAqC;AAGnD,UAAA,KAAK,iBAAiB,KAAK,MAAM;AAEvC,UAAMoK,IAAgB,KAAK,OAAO,YAAY,CAAC,GACzCC,IAAY,MAAM,KAAK,cAAc;AAE3C,eAAWC,KAAeF,GAAe;AAC/B,YAAApK,IAAQ,KAAK,OAAO,KAAK,CAAC,EAAE,KAAAwD,QAAU8G,EAAY,aAAa9G,CAAG;AAEpE,MAAA,CAACxD,KAASsK,EAAY,cAI1B,MAAM,KAAK,uBAAuBtK,GAAOsK,GAAaD,CAAS,GAC/D,MAAM,KAAK,eAAe,MAAOC,EAAY,YAAY,EAAK;AAAA,IAAA;AAGlE,eAAW,CAAC/K,GAAYiH,CAAM,KAAKpB;AACzB,YAAA7F,EAAW,aAAaiH,CAAM;AAGlB,IAAAnB,GAAA;AAAA,EAAA;AAAA,EAG1B,MAAgB,uBACZrF,GACAgK,GACAK,GACa;AAGT,QAFE,MAAA,KAAK,QAAQrK,GAAOgK,CAAM,GAE5B,CAACrI,EAAY3B,CAAK;AAClB;AAGJ,UAAMuK,IAAoBjL,GAA8BU,EAAM,OAAA,CAAQ,GAChEwK,IAAeH,KAAA,gBAAAA,EAAW,cAAc,KAAK,CAAC,EAAE,mBAAAI,QAAwBA,MAAsBzK,EAAM;AAE1G,IAAI,CAACqK,KAAa,CAACG,KAAgBD,EAAkB,WAAW,MAInDC,EAAA;AAAA,MACT;AAAA,MACAD,EACK,IAAI,CAAChL;;AAAe,iBAAAwB,IAAAuE,GAAmB/F,CAAU,MAA7B,gBAAAwB,EAAgC,gBAAexB,EAAW;AAAA,OAAS,EACvF,KAAK;AAAA,IACd,GAEA,MAAM8K,EAAU,KAAK;AAAA,EAAA;AAAA,EAGzB,MAAgB,QAAQ5H,GAAwBuH,GAA8C;AAC1F,SAAK,mBAAmB,GAElB,MAAA,KAAK,gBAAgBvH,GAAYuH,CAAM;AAE7C,UAAMxD,IAASlB,GAAmB7C,EAAW,OAAA,CAAQ;AAErD,QAAI,CAAC+D;AACD;AAGE,UAAAtE,IAAc,MAAMgC,EAAezB,EAAW,QAAQ,EAAE,KAAKA,EAAW,GAAG,GAC3EiI,IAAgB,OAAMxI,KAAA,gBAAAA,EAAa,cAAcsE;AAEjD,UAAA/D,EAAW,cAAc+D,GAAQ;AAAA,MACnC,kBAAkB,CAAClE,MAAc;;AAC7B,gBAAO6G,KAAApI,IAAA2J,KAAA,gBAAAA,EAAe,eAAf,gBAAA3J,EAA2B,KAAK,CAAC4J,MAEhC,CAACpK,EAAa+B,GAAWC,EAAiB,KAC1C,CAAChC,EAAaoK,GAAmBpI,EAAiB,IAE3C,KAIPD,EAAU,aAAaqI,EAAkB,YACzCrI,EAAU,KAAK,QAAQ,MAAMqI,EAAkB,KAAK,QAAQ,OAV7D,gBAAAxB,EAYH;AAAA,MAAA;AAAA,IACR,CACH;AAAA,EAAA;AAAA,EAGL,MAAgB,gBAAgB1G,GAAwBuH,GAA8C;AAC9F,QAAA,CAACrI,EAAYc,CAAU;AACvB;AAGE,UAAAf,IAAW,MAAM,KAAK,oBAAoBe,GAAY,EAAE,kBAAkB,IAAM;AAEtF,IAAAuH,EAAO,aAAPA,EAAO,WAAatI,EAAS,IAAI,CAACE,OAAW;AAAA,MACzC,UAAUA,EAAM;AAAA,MAChB,WAAW;AAAA,IAAA,EACb;AAES,eAAAgJ,KAAeZ,EAAO,UAAU;AACjC,YAAApI,IAAQF,EAAS,KAAK,CAAC,EAAE,KAAA8B,QAAUoH,EAAY,aAAapH,CAAG;AAEjE,MAAA,CAAC5B,KAASgJ,EAAY,cAIpB,MAAA,KAAK,QAAQhJ,GAAOgJ,CAAW,GACrC,MAAM,KAAK,eAAe,MAAOA,EAAY,YAAY,EAAK;AAAA,IAAA;AAAA,EAClE;AAGR;AC/IA,MAAM3J,KAAQC,EAAS,MAAMC,EAAI,QAAQ,QAAQ,CAAC,GAC5C0I,KAAUjD;AAWhB,SAASiE,GAAab,GAA6C;AACxD,SAAA,CAAC,CAACA,KAAU,UAAUA;AACjC;AAEqB,MAAAc,WAAaf,GAAMF,IAAS,CAAC1B,IAAeuB,IAAgBE,EAAiB,CAAC,EAAE;AAAA,EAUjG,YAAY3J,GAAuB;AACzB,UAAA;AATA,IAAAoB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACS,IAAAA,EAAA;AAKf,SAAK,SAASpB,GACd,KAAK,kBAAkB,CAAC,GACxB,KAAK,cAAcqI,EAAI,CAAA,GAAI,KAAK,GAChC,KAAK,aAAaA,EAAI,CAAA,GAAI,aAAa,GAClC,KAAA,yCAAyB,IAAI,GAClC,KAAK,sBAAsB,CAAC;AAAA,EAAA;AAAA,EAGhC,MAAgB,MAAqB;AAC3B,UAAAvB,IAASpB,EAAM,qBAAA,EAAuB,QACtCoF,IAAqB,CAACvH,GAAa,EAAE,SAAAwH,QAAoC;AACrE,YAAAC,IAAOD,KAAA,gBAAAA,EAAS,IAAI;AAE1B,MAAI,CAACC,KAAQzH,EAAI,SAAS,GAAG,MAI7B,KAAK,oBAAoBA,CAAG,IAAI,IAAI,KAAKyH,CAAI;AAAA,IACjD,GACMC,IAAgBnE,EAAO,UAAU,IAAI;AAAA,MACvC,gBAAgBgE;AAAA,MAChB,mBAAmBA;AAAA,IAAA,CACtB;AAEG,QAAA;AACK,WAAA,kBAAkB,KAAK,UAAU7F,GAAe,GAE/C,MAAA,KAAK,iBAAiB,KAAK,eAAe,GAChD,MAAM,KAAK,YAAY,GACvB,MAAM,KAAK,YAAY;AAAA,IAAA,UACzB;AACgB,MAAAgG,EAAA;AAAA,IAAA;AAAA,EAClB;AAAA,EAGe,mBAAkC;AAC1C,WAAA;AAAA,MACH,MAAM;AAAA,MACN,WAAW;AAAA,MACX,UAAU,CAAC,EAAE,WAAW,MAAS,EAAE,WAAW,GAAO,CAAA;AAAA,IACzD;AAAA,EAAA;AAAA,EAGe,yBAAyBlB,GAA4B;AAGhE,WAFJA,UAAW,KAAK,SAEZa,GAAab,CAAM,IACZmB;AAAA,MACH,KAAK,yBAAyBnB,EAAO,SAAS,CAAC,CAAC,IAAI,MAChD,KAAK,yBAAyBA,EAAO,SAAS,CAAC,CAAC,IAAI;AAAA,MACxD;AAAA,IACJ,IAGG,MAAM,yBAAyBA,CAAM;AAAA,EAAA;AAAA,EAGhD,MAAc,cAA6B;AACjC,UAAAoB,IAAoB,KAAK,SACzB,MAAM,KAAK,0BAA0B,KAAK,MAAM,IAChD,MAAM,KAAK,kBAAkB,GAC7B1G,IAAe4D,EAAI8C,GAAmB,CAACpL,MACrCA,aAAiB4E,IACV5E,EAAM,cAGVA,EAAM,GAChB;AAED,SAAK,oBAAoB,MAAM,KAAK,kBAAkB0E,CAAY,GAE5D,MAAA,KAAK,eAAe,CAACsF,MAAYA,EAAO,SAAS,CAAC,EAAE,YAAY,EAAK;AAAA,EAAA;AAAA,EAG/E,MAAc,cAA6B;AACjC,UAAAtF,IAAe,KAAK,qBAAqB,CAAC,GAC1CwF,IAAkB,KAAK,OAAO,SAAS,CAAC,EAAE,WAAWxF,EAAa,IAAI,OAAO,EAAE,WAAW,GAAQ,EAAA;AAExG,aAAS2G,IAAQ,GAAGA,IAAQ3G,EAAa,QAAQ2G,KAAS;AAChD,YAAAnJ,IAAcwC,EAAa2G,CAAK,GAChCT,IAAcV,EAAemB,CAAK;AAEpC,UAAAnJ,EAAY,iBAAiB;AAC7B,QAAAA,EAAY,cAAc,GAC1BA,EAAY,gBAAgB,GAE5B,MAAMA,EAAY,OAAO,GACzB,MAAM,KAAK,eAAe,MAAO0I,EAAY,YAAY,EAAK;AAE9D;AAAA,MAAA;AAGE,YAAA,KAAK,qBAAqB1I,GAAa0I,CAAW,GAClD,MAAA,KAAK,wBAAwB1I,CAAW,GAC9C,MAAM,KAAK,eAAe,MAAO0I,EAAY,YAAY,EAAK;AAAA,IAAA;AAGvD,eAAA,CAAClH,GAAaiE,CAAU,KAAK,OAAO,QAAQ,KAAK,mBAAmB;AACrE,YAAAI,EAAe,SAASrE,GAAaiE,CAAU;AAGlC,IAAAxE,GAAA,KAAK,QAAQ,KAAK,kBAAkB,GAErD,MAAA,KAAK,eAAe,CAAC6G,MAAYA,EAAO,SAAS,CAAC,EAAE,YAAY,EAAK;AAAA,EAAA;AAAA,EAG/E,MAAc,oBAA2C;AACrD,UAAMsB,IAAa,KAAK,OAAO,SAAS,CAAC,GACnCjB,IAAY,MAAM,KAAK,cAAc;AAE3C,QAAI,CAACA;AACD,aAAO,CAAC;AAGZ,UAAM3F,IAA6B,CAAC,GAC9B6G,wBAA6B,IAAI,GACjCC,IAAmB,CAAC,GAAGvK,GAAM,gBAAgB,EAAE,IAAI,CAAC,EAAE,YAAA1B,QAAiB;AACzE,YAAMkM,IAAqB7L,EAAiBL,CAAU,IAAID,GAA8BC,CAAU,IAAI,CAAC;AAEhG,aAAA;AAAA,QACH,YAAAA;AAAA,QACA,aACIkM,EAAmB,SAAS,IACtBA,EAAmB,IAAI,CAACC,MAAkBA,EAAc,WAAW,EAAE,KAAA,IACrEnM,EAAW;AAAA,MACzB;AAAA,IAAA,CACH,GACKoM,IAAgBtB,EAAU,cAC3B,IAAI,CAACG,MAAiB;AACnB,YAAMzE,IAAkByF,EAAiB;AAAA,QACrC,CAAC,EAAE,aAAAI,EACC,MAAA,CAAC,CAACpB,EAAa,qBACfoB,EAAY,KAAK,CAACC,MAAcrB,EAAa,SAAS,SAASqB,CAAS,CAAC;AAAA,MACjF;AAGI,aAAA,CAAC9F,KACD,CAACyE,EAAa,qBACde,EAAuB,IAAIf,EAAa,iBAAiB,IAElD,QAGYe,EAAA,IAAIf,EAAa,iBAAiB,GAElD,CAACA,GAAczE,CAAe;AAAA,IACxC,CAAA,EACA,OAAO,CAAC+F,MAAU,CAAC,CAACA,CAAK;AAE9B,IAAAR,EAAW,WAAWK,EAAc,IAAI,OAAO,EAAE,WAAW,KAAQ;AAEpE,aAASN,IAAQ,GAAGA,IAAQM,EAAc,QAAQN;AACxC,YAAA,KAAK,gCAAgC,YAAY;;AACnD,cAAMb,IAAetJ,EAASyK,EAAcN,CAAK,CAAC,EAAE,CAAC,GAC/CtF,IAAkB7E,EAASyK,EAAcN,CAAK,CAAC,EAAE,CAAC,GAClD/G,IAAcJ,EAAe6B,EAAgB,UAAU;AAEzD,YAACyE,EAAa,mBAId;AAAA,cAAA5K,EAAiB0E,CAAW,GAAG;AACzB,kBAAA3B;AAAA,cACFoD,EAAgB;AAAA,cAChBnD,EAA0B4H,EAAa,iBAAiB;AAAA,YAC5D;AAEA,kBAAMuB,IAAY,MAAMzH,EAAY,KAAKkG,EAAa,iBAAiB;AAEvE,YAAIuB,MACM,MAAA,KAAK,aAAaA,GAAW7K,GAASH,IAAAuK,EAAW,aAAX,gBAAAvK,EAAsBsK,EAAM,CAAC,GAEzE3G,EAAa,KAAKqH,CAAS,IAGzB,MAAA,KAAK,eAAe,MAAA;;AAAO,qBAAA7K,GAASH,IAAAuK,EAAW,aAAX,gBAAAvK,EAAsBsK,EAAM,EAAE,YAAY;AAAA,aAAK;AAEzF;AAAA,UAAA;AAGJ,gBAAM1I,GAAsBoD,EAAgB,YAAYyE,EAAa,iBAAiB,GAEzE9F,EAAA,KAAK,GAAI,MAAMJ,EAAY,KAAKkG,EAAa,iBAAiB,EAAE,KAAM,GAE7E,MAAA,KAAK,eAAe,MAAA;;AAAO,mBAAAtJ,GAASH,IAAAuK,EAAW,aAAX,gBAAAvK,EAAsBsK,EAAM,EAAE,YAAY;AAAA,WAAK;AAAA;AAAA,MAAA,CAC5F;AAGL,WAAO7G,GAAqB,KAAK,iBAAiBE,GAAc,KAAK,kBAAkB;AAAA,EAAA;AAAA,EAG3F,MAAc,0BAA0BzE,GAA6C;AACjF,UAAMyE,IAAe,CAAC,GAChB+D,IAAkB,KAAK,OAAO,SAAS,CAAC,EAAE,WAAWxI,EAAO,IAAI,OAAO,EAAE,WAAW,GAAQ,EAAA;AAElG,aAASoL,IAAQ,GAAGA,IAAQpL,EAAO,QAAQoL;AACjC,YAAA,KAAK,gCAAgC,YAAY;AAC7C,cAAA5I,IAAaxC,EAAOoL,CAAK,GACzBT,IAAcnC,EAAe4C,CAAK,GAClCnJ,IAAc,MAAMgC,EAAezB,EAAW,QAAQ,EAAE,KAAKA,EAAW,GAAG;AAEjF,YAAI,CAACP,GAAa;AACd,gBAAM,KAAK,eAAe,MAAO0I,EAAY,YAAY,EAAK;AAE9D;AAAA,QAAA;AAGJ,QAAAjJ,EAAYO,CAAW,KAAM,MAAM,KAAK,aAAaA,GAAa0I,CAAW,GAE7ElG,EAAa,KAAKxC,CAAW,GAE7B,MAAM,KAAK,eAAe,MAAO0I,EAAY,YAAY,EAAK;AAAA,MAAA,CACjE;AAGL,WAAOpG,GAAqBvE,GAAQyE,GAAc,KAAK,kBAAkB;AAAA,EAAA;AAAA,EAG7E,MAAc,wBAAwBxC,GAAwC;AAC1E,QAAI,CAACP,EAAYO,CAAW,KAAK,CAAC4D,GAAkB5D,CAAW;AAC3D;AAGJ,UAAMuJ,IAAqBnM,GAA8B4C,EAAY,OAAA,CAAQ;AAEzE,QAAAuJ,EAAmB,WAAW;AAC9B;AAGJ,UAAMpB,IAAY,MAAM,KAAK,cAAc,EAAE,QAAQ,IAAM;AAEvD,IAAAA,EAAU,cAAc,KAAK,CAACG,MAAiBA,EAAa,sBAAsBtI,EAAY,GAAG,KAI/F,MAAAA,EAAY,SAASmI,GAAWoB,CAAkB;AAAA,EAAA;AAAA,EAG5D,MAAc,aAAazL,GAAmB4K,GAAwC;;AAG9E,QAFJ,KAAK,mBAAmB,GAEpB,CAACjJ,EAAY3B,CAAK;AAClB;AAGJ,UAAM0B,IAAW,MAAM,KAAK,oBAAoB1B,GAAO;AAAA,MACnD,QAAQ4K;AAAA,MACR,UAAU,YAAY;AAClB,aAAK,mBAAmB,GAExB,MAAM,KAAK,eAAe;AAAA,MAC9B;AAAA,MACA,qBAAqB,CAACpH,MAAQ,KAAK,mBAAmB,IAAIA,CAAG;AAAA,IAAA,CAChE;AAED,aAAS6H,IAAQ,GAAGA,IAAQ3J,EAAS,QAAQ2J,KAAS;AAC5C,YAAAzJ,IAAQF,EAAS2J,CAAK;AAE5B,UAAIzJ,aAAiBgD,GAAW;AACvB,aAAA,WAAW,IAAIhD,CAAK;AAEzB;AAAA,MAAA;AAGJ,UAAI,KAAK,WAAW,OAAOA,EAAM,GAAG,GAAG;AAC7B,cAAA,KAAK,YAAY5B,GAAO4B,CAAK;AAEnC;AAAA,MAAA;AAGJ,YAAM,KAAK,aAAaA,IAAOb,IAAA6J,KAAA,gBAAAA,EAAa,aAAb,gBAAA7J,EAAwBsK,EAAM,IAEzDlC,IAAAyB,KAAA,gBAAAA,EAAa,aAAb,QAAAzB,EAAwBkC,MAClB,MAAA,KAAK,eAAe,MAAA;;AAAO,eAAAnK,GAASH,IAAA6J,EAAY,aAAZ,gBAAA7J,EAAuBsK,EAAM,EAAE,YAAY;AAAA,OAAK;AAAA,IAC9F;AAAA,EACJ;AAAA,EAGJ,MAAc,YAAYrL,GAAmB4B,GAAkC;AAC3E,eAAWlC,KAAYM,EAAM,OAAO,WAAW,GAAG;AACxC,YAAAiJ,IAAmBjJ,EAAM,gBAAgBN,CAAQ;AAEnD,UAACuJ,EAAiB,SAItB;AAAA,YAAI,MAAM,QAAQA,EAAiB,OAAO,GAAG;AACzC,UAAAA,EAAiB,UAAUA,EAAiB,QAAQ,OAAO,CAACjI,MAAiBA,MAAiBY,CAAK;AAEnG;AAAA,QAAA;AAGA,YAAAqH,EAAiB,YAAYrH,GAAO;AACpC,UAAAqH,EAAiB,UAAU;AAE3B;AAAA,QAAA;AAAA;AAAA,IACJ;AAGJ,UAAMrH,EAAM,OAAO;AAAA,EAAA;AAAA,EAGvB,MAAc,qBAAqB5B,GAAmBgK,GAAmC;AAGrF,QAFA,KAAK,mBAAmB,GAEpBhE,GAAchG,CAAK,KAAKA,EAAM,iBAAiB;AAC/C,MAAAA,EAAM,cAAc,GACpBA,EAAM,gBAAgB,GACtB,MAAMA,EAAM,OAAO;AAEnB;AAAA,IAAA;AAGJ,QAAI,KAAK,mBAAmB,IAAIA,EAAM,mBAAoB,CAAA;AACtD;AAKA,QAFJ,MAAMA,EAAM,KAAK,GAEb,CAAC2B,EAAY3B,CAAK,GAAG;AACjB,UAAAgG,GAAchG,CAAK,GAAG;AAChB,cAAA0D,IAAc1D,EAAM,mBAAmB,GACvC2H,IAAa,KAAK,oBAAoBjE,CAAW,yBAAS,KAAK;AAE/D,cAAAqE,EAAe,SAASrE,GAAaiE,CAAU,GAE9C,OAAA,KAAK,oBAAoBjE,CAAW;AAAA,MAAA;AAG/C;AAAA,IAAA;AAGJ,UAAMhC,IAAWjC,EAAsBO,EAAM,OAAO,CAAC,EAChD,IAAI,CAACN,MAAaM,EAAM,kBAAkBN,CAAQ,KAAK,CAAE,CAAA,EACzD,KAAK,GAEJsM,IAAmBhC,IAAStI,EAAS,IAAI,OAAO,EAAE,WAAW,KAAQ,IAAI,CAAC;AAEhF,IAAIsI,MACAA,EAAO,WAAWgC;AAGtB,aAASX,IAAQ,GAAGA,IAAQ3J,EAAS,QAAQ2J,KAAS;AAC5C,YAAAzJ,IAAQF,EAAS2J,CAAK,GACtBT,IAAcoB,EAAiBX,CAAK;AAEpC,YAAA,KAAK,qBAAqBzJ,GAAOgJ,CAAW,GAE9CA,KACA,MAAM,KAAK,eAAe,MAAOA,EAAY,YAAY,EAAK;AAAA,IAClE;AAAA,EACJ;AAAA,EAGJ,MAAc,kBAAkBlG,GAA6D;AACnF,UAAAuH,wBAA4B,IAAY,GACxCC,wBAAoB,IAAgB;AAE/B,eAAAhK,KAAewC,EAAa,SAAS;AAC5C,UAAIxC,aAAuB0C,GAAW;AAClC,cAAMnC,IAAa,KAAK,YAAY,IAAIP,EAAY,WAAW;AAE/D,QAAIO,MACA,MAAMA,EAAW,OAAO,GAExByJ,EAAc,IAAIzJ,CAAU;AAGhC;AAAA,MAAA;AAGJ,YAAMA,IAAawC,GAAc/C,GAAa,KAAK,WAAW;AAExD,YAAA,KAAK,aAAaO,CAAU,GAC5B,MAAA5C,EAAW,YAAY4C,GAAYP,CAAW,GAC9C,MAAA,KAAK,yBAAyBO,GAAYP,CAAW,GACrD,MAAA,KAAK,qBAAqBO,CAAU,GACpC,MAAA,KAAK,cAAcA,CAAU,GAE9B,KAAA,gBAAgB,KAAKA,CAAU,GACdwJ,EAAA,IAAIxJ,EAAW,GAAG;AAAA,IAAA;AAGjC,eAAAA,KAAc,KAAK,iBAAiB;AACvC,UAAAyJ,EAAc,IAAIzJ,CAAU,KAAKwJ,EAAsB,IAAIxJ,EAAW,GAAG;AACzE;AAGE,YAAA,KAAK,aAAaA,CAAU;AAE5B,YAAAP,IAAc2D,GAAepD,GAAYiC,CAAY;AAErD,YAAA7E,EAAW,YAAY4C,GAAYP,CAAW,GAEpDwC,EAAa,IAAIxC,CAAW;AAAA,IAAA;AAGhC,UAAMiK,IAAoB,CAAC;AAEhB,eAAAjK,KAAewC,EAAa,YAAY;AAC3C,UAAA7D,GAA0BqB,CAAW,GAAG;AACxC,QAAAiK,EAAkB,KAAKjK,CAAW;AAElC;AAAA,MAAA;AAGE,YAAA,KAAK,uBAAuBA,CAAW;AAAA,IAAA;AAG1C,WAAAiK;AAAA,EAAA;AAAA,EAGX,MAAc,yBACV1J,GACAP,GACAkK,GACa;AACb,IAAA3J,EAAW,6BAA6B,GACxCA,EAAW,cAAcP,EAAY,cAAc,EAAI,CAAC,GAExDkK,8BAAwB,IAAI,IAC5BA,EAAgB,IAAI3J,CAAU;AAE9B,eAAW/C,KAAYD,EAAsBgD,EAAW,OAAQ,CAAA;AAC5D,YAAM,KAAK;AAAA,QACPA,EAAW,gBAAuC/C,CAAQ;AAAA,QAC1DwC,EAAY,gBAAuCxC,CAAQ;AAAA,MAC/D;AAGJ,UAAM2M,IAAsB/D,EAAIjI,GAAoB6B,CAAW,GAAG,KAAK;AAE5D,eAAAoK,KAAqBjM,GAAoBoC,CAAU;AAC1D,MACI2J,EAAgB,IAAIE,CAAiB,KACrC,CAACA,EAAkB,iBAAiB,YAAY,KAChD,CAACD,EAAoB,OAAOC,EAAkB,GAAG,KAKrD,MAAM,KAAK,yBAAyBA,GAAmBD,EAAoB,QAAQC,EAAkB,GAAG,CAAC;AAGzG,IAAA7J,EAAW,cACX,MAAMA,EAAW,KAAK,GAChB,MAAA5C,EAAW,YAAY4C,GAAYP,CAAW;AAAA,EACxD;AAAA,EAGJ,MAAc,8BACVqK,GACAC,GACa;AACb,UAAM/H,IAAc6D,EAAIiE,EAAc,WAAW,CAAA,GAAI,KAAK,GACpD7H,IAAe4D,EAAIkE,EAAe,WAAW,CAAA,GAAI,KAAK,GACtDC,IAAoBhI,EACrB,UACA,OAAO,CAACjB,MAAQ,CAACkB,EAAa,OAAOlB,CAAG,KAAK,CAACkB,EAAa,OAAO,UAAUlB,CAAG,CAAC,CAAC,GAChFkJ,IAAqBhI,EACtB,UACA,OAAO,CAAClB,MAAQ,CAACiB,EAAY,OAAOjB,CAAG,KAAK,CAACiB,EAAY,OAAO,UAAUjB,CAAG,CAAC,CAAC;AAEpF,eAAWA,KAAOiJ,GAAmB;AAC3B,YAAAhK,IAAagC,EAAY,QAAQjB,CAAG,GACpCtB,IAAc2B,GAAgBpB,CAAU;AAE9C,MAAA+J,EAAe,WAAWtK,CAAW,GACrCwC,EAAa,IAAIxC,CAAW;AAAA,IAAA;AAGhC,eAAWsB,KAAOkJ,GAAoB;AAC5B,YAAAxK,IAAcwC,EAAa,QAAQlB,CAAG,GACtCf,IAAa2B,GAAiBlC,CAAW;AAE/C,MAAAqK,EAAc,WAAW9J,CAAU,GACnCgC,EAAY,IAAIhC,CAAU;AAAA,IAAA;AAGnB,eAAAA,KAAcgC,EAAY,SAAS;AAC1C,YAAMvC,IAAcwC,EAAa,QAAQjC,EAAW,GAAG;AAEjD,YAAA5C,EAAW,YAAY4C,GAAYP,CAAW,GAC9C,MAAA,KAAK,qBAAqBO,CAAU;AAAA,IAAA;AAAA,EAC9C;AAAA,EAGJ,MAAc,uBAAuBzC,GAAkC;AAC/D,QAAA,CAAC2B,EAAY3B,CAAK,GAAG;AACf,YAAA0D,IAAc1D,EAAM,mBAAmB,GACvC2H,IAAa,KAAK,oBAAoBjE,CAAW,yBAAS,KAAK;AAE/D,YAAAqE,EAAe,SAASrE,GAAaiE,CAAU,GAE9C,OAAA,KAAK,oBAAoBjE,CAAW;AAE3C;AAAA,IAAA;AAGJ,UAAMhC,IAAWjC,EAAsBO,EAAM,OAAO,CAAC,EAChD,IAAI,CAACN,MAAaM,EAAM,kBAAkBN,CAAQ,KAAK,CAAE,CAAA,EACzD,KAAK;AAEV,eAAWkC,KAASF;AACV,YAAA,KAAK,uBAAuBE,CAAK;AAAA,EAC3C;AAAA,EAGJ,MAAc,gCAAgCU,GAAoC;AAC1E,QAAA;AACA,YAAMA,EAAU;AAAA,aACXgH,GAAO;AACR,UAAA/I,EAAa+I,GAAOE,EAA2B,GAAG;AAE1C,gBAAA,KAAKF,EAAM,OAAO,GAE1BA,EAAM,eAAe,KAAK,mBAAmB,IAAIA,EAAM,WAAW;AAElE;AAAA,MAAA;AAGE,YAAAA;AAAA,IAAA;AAAA,EACV;AAGR;ACpkBO,MAAMqD,IAAc;AAAA,EACvB,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AACf,GASAlF,KAAemF,GAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,SAAS;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA,cAAc,OAAO;AAAA,IACjB,UAAU;AAAA,IACV,mBAAmB,CAAC;AAAA,IACpB,oBAAoB;AAAA,IACpB,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,kBAAkB,CAAC;AAAA,IACnB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,kBAAkB,CAAC;AAAA,IACnB,sCAAsB,IAA0E;AAAA,IAChG,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,QAAQD,EAAY;AAAA,IACpB,WAAW;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEb,WAAW,CAACE,MAAU;;AAAA,WAAAC,GAAgBD,GAAO,EAAE,eAAc9L,IAAA8L,EAAM,iBAAN,gBAAA9L,EAAoB,aAAa;AAAA;AAAA,EAC9F,SAAS,CAAC8L,MACNC,GAAgBD,GAAO;AAAA,IACnB,cAAcA,EAAM,gBAAgB/C,GAAQ,QAAQ+C,EAAM,YAAY;AAAA,EAAA,CACzE;AAAA,EACL,OAAO;AAAA,IACH,aAAaE,GAAc;AACT,MAAAA,KAAA,QAAAA,EAAA,UAAU,IAAI,EAAE,WAAW,MAAM,KAAK,qBAAqB,cAAc;IAAG;AAAA,EAElG;AAAA,EACA,UAAU;AAAA,IACN,cAAc,CAAC,EAAE,QAAA/C,EAAO,MAAMA,MAAW2C,EAAY;AAAA,IACrD,QAAQ,CAAC,EAAE,QAAA3C,EAAO,MAAMA,MAAW2C,EAAY;AAAA,IAC/C,SAAS,CAAC,EAAE,QAAA3C,EAAO,MAAMA,MAAW2C,EAAY;AAAA,IAChD,WAAW,CAAC,EAAE,QAAA3C,EAAO,MAAMA,MAAW2C,EAAY;AAAA,IAClD,aAAa,EAAE,mBAAApJ,KAAqB;AACzB,aAAA,OAAO,OAAOA,CAAiB,EAAE,OAAO,CAACyJ,GAAOvJ,MAAUuJ,IAAQvJ,GAAO,CAAC;AAAA,IACrF;AAAA,IACA,QAAiB;AACb,aAAO,KAAK,eAAe;AAAA,IAC/B;AAAA,IACA,iBAAiB,EAAE,cAAAsJ,KAAyB;AACxC,aAAO,CAAC,CAACA;AAAA,IACb;AAAA,IACA,wBAAwB,EAAE,QAAA/C,GAAQ,OAAAiD,KAAwB;AAClD,aAACtH,EAAM,eAONsH,IAODjD,MAAW2C,EAAY,WAAW3C,MAAW2C,EAAY,YAClDO;AAAA,QACH;AAAA,QACA;AAAA,MACJ,IAGC,KAAK,SAOH,OANIA;AAAA,QACH;AAAA,QACA;AAAA,MACJ,IAjBOA;AAAA,QACH;AAAA,QACA;AAAA,MACJ,IAVOA;AAAA,QACH;AAAA,QACA;AAAA,MACJ;AAAA,IAwBG;AAAA,EACX;AAER,CAAC;AC5DM,MAAMC,WAAqB1F,GAAQ;AAAA,EAAnC;AAAA;AAEO,IAAApG,EAAA,mBAAuB,IAAI+L,GAAU;AACrC,IAAA/L,EAAA,gBAAwB;AACxB,IAAAA,EAAA,yBAAyC;AAAA;AAAA,EAEnD,MAAa,UAAagM,GAA+B;AACrD,WAAI,KAAK,QACEA,EAAS,IAGb,IAAI,QAAQ,CAACC,MAAY;AAC5B,YAAMC,IAAU,MAAMD,EAAQD,GAAU;AAEjC,MAAAvF,EAAA,KAAK,eAAeyF,CAAO;AAAA,IAAA,CACrC;AAAA,EAAA;AAAA,EAGL,MAAa,MAAMC,GAA0F;AACzG,SAAK,eAAe;AAEhB,QAAA;AACM,YAAA,KAAK,OAAOA,CAAgB,GAC5B,MAAA,KAAK,SAAS,EAAI,GACxB,MAAM,KAAK,KAAK;AAAA,IAAA,UAClB;AACE,WAAK,eAAe;AAAA,IAAA;AAAA,EACxB;AAAA,EAGG,eAAqB;AACxB,SAAK,iBAAiB;AAAA,EAAA;AAAA,EAGnB,mBAAyB;AAC5B,SAAK,qBAAqB;AAAA,EAAA;AAAA,EAGvB,oBAA0B;AAC7B,SAAK,qBAAqB;AAAA,EAAA;AAAA,EAM9B,MAAa,aAAaC,IAAkD,IAAmB;AACvF,IAAC,KAAK,UAIJ,MAAA,KAAK,KAAKA,CAAqB;AAAA,EAAA;AAAA,EAMzC,MAAa,KAAKA,IAAkD,IAAmB;AACnF,UAAM3J,IAAU4J,GAAQD,CAAM,IACxB,EAAE,QAAQA,MACVA,aAAkB5N,IACd,EAAE,OAAO4N,EACT,IAAAA;AAEN,IAAA,CAAC9H,EAAM,gBAAgB,CAAC,KAAK,SAAS,CAAC,KAAK,UAI1C,MAAA,KAAK,UAAU,IAAI,YAAY;AAC3B,YAAAgI,IAAQ,KAAK,IAAI,GACjB1N,IAAS6D,EAAQ,QAAQ,CAACA,EAAQ,KAAK,IAAIA,EAAQ;AAEzD,WAAK,YAAY,MACjB,KAAK,SAAS6I,EAAY,SAE1BvL,GAAU,MAAMnB,CAAM;AAElB,UAAA;AAaI,YAZE,MAAA6H,EAAO,KAAK,sBAAsB7H,CAAM,GAE1C6D,EAAQ,sBACR,MAAM6B,EAAM,mBAAmB,GAG9B,KAAA,UAAU,IAAImF,GAAK7K,CAAM,GAEzB,KAAA,QAAQ,UAAU,IAAI6D,CAAO,GAE5B,MAAA8J,GAAS,KAAK,OAAO,GAEvB,KAAK,QAAQ;AACb;AAGA,QAACzM,EAAI,WACL,MAAMG,EAAM,EAAE,cAAc,KAAK,IAAI,KAAK,OAAQ,KAAK,IAAI,IAAIqM,EAAM,EAAA,CAAG,GAG5E,KAAK,UAAU;AAAA,eACVrE,GAAO;AACZ,YAAInI,EAAI;AACE,gBAAAmI;AAGV,aAAK,UAAU,MACf,KAAK,YAAYA,GAEjB,MAAMuE,EAAO,OAAOvE,GAAO4D,EAAqB,oBAAoB,aAAa,CAAC;AAAA,MAAA,UACpF;AACE,aAAK,SAASP,EAAY,QAEpB,MAAA7E,EAAO,KAAK,wBAAwB7H,CAAM;AAAA,MAAA;AAAA,IACpD,CACH;AAAA,EAAA;AAAA,EAGE,gBAAyB;AACrB,WAAA,KAAK,iBAAiB,OAAO;AAAA,EAAA;AAAA,EAGxC,MAAa,QAAQ6N,GAAuC;AACpD,QAAA,CAAC,KAAK,UAAU,CAACnI,EAAM,gBAAgB,CAAC,KAAK;AACvC,YAAA,IAAI,MAAM,uCAAuC;AAGvD,IAAC,KAAK,mBAIJ,MAAA,KAAK,UAAU,IAAI,YAAY;;AACjC,WAAK,SAASgH,EAAY,WACrB,KAAA,iBAAA,KAAA,eAAiB,IAAI7C,GAAQ;AAE5B,YAAA6D,IAAQ,KAAK,IAAI,GACjBI,IAA8B,CAAC,GAC/B9N,KAAUc,IAAA,KAAK,cAAa,WAAlBA,EAAkB,SAAWmE,GAAe;AAE5D9D,MAAAA,GAAU,MAAMnB,CAAM;AAElB,UAAA;AAMI,YALJ6N,KAAYC,EAAgB,KAAK,KAAK,aAAa,UAAU,IAAID,CAAQ,CAAC,GAEpE,MAAAhG,EAAO,KAAK,2BAA2B7H,CAAM,GAC7C,MAAA2N,GAAS,KAAK,YAAY,GAE5B,KAAK,aAAa,WAAW;AACvB,gBAAA9F,EAAO,KAAK,6BAA6B7H,CAAM;AAErD;AAAA,QAAA;AAGJ,aAAK,eAAe,MACpB,KAAK,qBAAqB,IAC1B,KAAK,qBAAqB,IAE1B,MAAMqB,EAAM,EAAE,cAAc,KAAK,IAAI,GAAG,OAAQ,KAAK,IAAI,IAAIqM,EAAM,EAAA,CAAG,GAChE,MAAA7F,EAAO,KAAK,6BAA6B7H,CAAM;AAAA,eAChDqJ,GAAO;AACZ,cAAMuE,EAAO,OAAOvE,GAAO4D,EAAqB,yBAAyB,kBAAkB,CAAC;AAAA,MAAA,UAC9F;AACE,aAAK,SAASP,EAAY,QAE1BoB,EAAgB,QAAQ,CAACC,MAAmBA,KAAA,gBAAAA,GAAkB;AAAA,MAAA;AAAA,IAClE,CACH;AAAA,EAAA;AAAA,EAGL,MAAa,SAASzO,GAAmCuE,IAA2B,IAAmB;AAC/F,QAAA,KAAK,iBAAiB,KAAK,CAACmK,MAAe1O,MAAe0O,EAAW,UAAU;AAC/E;AAGJ,UAAMlH,IAAS,KAAK;AAEpB,IAAIA,KACkB7G,GAAAX,CAAU,EAAE,QAAQ,CAACI,MAAiBuE,EAAevE,CAAY,EAAE,UAAUoH,CAAM,CAAC,GAG1G,KAAK,UAAU,MAAM;AACb,MAACnH,EAAiBL,CAAU,MAIrBA,EAAA,aAAaiG,GAA8B1B,EAAQ,IAAI;AAAA,IAAA,CACrE,GAED,MAAMoK,GAAY3O,GAAY;AAAA,MAC1B,SAAS,CAACS,MAAUwC,GAAkBxC,CAAK;AAAA,MAC3C,SAAS,CAACA,MAAU+C,GAAkB/C,CAAK;AAAA,MAC3C,SAAS,CAACA,MAAUmD,GAAuB,CAACnD,CAAK,CAAC;AAAA,IAAA,CACrD,GAEGJ,EAAiBL,CAAU,KAC3BE,EAAsBF,CAAU,EAAE,QAAQ,CAACG,MAAa;AACpD,YAAMC,IAAeJ,EAChB,SACA,EAAA,gBAAuCG,CAAQ,EAAE;AAEtD,MAAAC,EAAa,GAAG,WAAW,CAACK,MAAUwC,GAAkBxC,CAAK,CAAC,GAC9DL,EAAa,GAAG,WAAW,CAACK,MAAU+C,GAAkB/C,CAAK,CAAC,GACjDL,EAAA,GAAG,WAAW,CAACK,MAAUmD,GAAuB,CAACnD,CAAK,CAAC,CAAC;AAAA,IAAA,CACxE,GAGL,KAAK,iBAAiB,KAAK,EAAE,YAAAT,GAAY,MAAMuE,EAAQ,MAAM;AAE7D,eAAWjB,KAAc,KAAK,iBAAiBtD,EAAW,SAAS,KAAK;AAC9D,YAAAoD,GAAsBpD,GAAYsD,CAAU;AAAA,EACtD;AAAA,EAGG,wBACHtD,GACAiH,GACI;AACC,SAAA,iBAAiB,IAAIjH,GAAYiH,CAAM;AAAA,EAAA;AAAA,EAGzC,wBAAwBjH,GAA2C;AAC3D,eAAAiL,KAAgB,KAAK;AACxB,UAAAjL,MAAeiL,EAAa;AAIzB,eAAAhF,GAA8BgF,EAAa,IAAI;AAG1D,UAAM,IAAI,MAAM,2CAA2CjL,EAAW,SAAS,SAAS;AAAA,EAAA;AAAA,EAG5F,MAAyB,OAAsB;AAC3C,UAAMoG,EAAM,QAEZA,EAAM,WAAW,KAAK,KAAK,MAAMA,EAAM,aAAa,GAE7CmC,EAAA,GAAG,cAAc,CAAC,EAAE,eAAAqG,QAAoB,KAAK,MAAMA,CAAa,CAAC,GACxErG,EAAO,GAAG,eAAe,MAAM,KAAK,QAAQ,GAC5CA,EAAO,KAAK,qBAAqB,MAAM,KAAK,oBAAoB,GAChEA,EAAO,KAAK,uBAAuB,MAAM,KAAK,sBAAsB,GAEpEsG,GAAY,MAAM;AAGd,UAFK,KAAA,mBAAmB,cAAc,KAAK,eAAe,GAEtD,CAAC,KAAK,kBAAkB,KAAK,cAAc;AAC3C,aAAK,kBAAkB;AAEvB;AAAA,MAAA;AAGC,WAAA,kBAAkB,YAAY,MAAM,KAAK,KAAQ,GAAA,KAAK,iBAAiB,KAAK,GAAI;AAAA,IAAA,CACxF;AAAA,EAAA;AAAA,EAGK,sBAAoC;AAC1C,UAAMC,IAAO,OAAO,KAAK,KAAK,iBAAiB,GACzCC,IAAmB,CAAC;AAE1B,eAAW,EAAE,YAAA/O,OAAgB,KAAK;AACnB,iBAAAS,KAASmF,GAAiB5F,CAAU;AAC3C,QAAA+O,EAAiB,KAAK,GAAG,KAAK,YAAYD,GAAMrO,CAAK,CAAC;AAIvD,WAAAsO;AAAA,EAAA;AAAA,EAGD,YAAYD,GAAgBrO,GAAiC;AACnE,UAAMC,IAAS,CAAC;AAEhB,WAAIoO,EAAK,SAASrO,EAAM,GAAG,KACvBC,EAAO,KAAKD,CAAK,GAGjB2B,EAAY3B,CAAK,KACVC,EAAA;AAAA,MACH,GAAGF,GAAmBC,CAAK,EACtB,IAAI,CAACuO,MAAmB,KAAK,YAAYF,GAAME,CAAc,CAAC,EAC9D,KAAK;AAAA,IACd,GAGGtO;AAAA,EAAA;AAAA,EAGD,gBAAwB;AACvB,WAAA,KAAK,UAAUyG,EAAK,+BAA+B;AAAA,EAAA;AAAA,EAG9D,MAAgB,SAASuG,GAA+B;AAChD,IAAA,KAAK,SAAS,CAACA,MAIb,MAAAnF,EAAO,KAAK,aAAa,GAE/B,KAAK,QAAQ;AAAA,EAAA;AAAA,EAGjB,MAAgB,OAAO0F,GAA0F;AACvG,UAAA1F,EAAO,KAAK,sBAAsB,GAExC0F,8BAAyB,QAAQ;AAE3B,UAAAvD,IAAM,IAAItD,GAAO;AAEvB,eAAW,EAAE,YAAApH,GAAY,MAAAkG,EAAK,KAAK,KAAK,kBAAkB;AAClD,UAAA,CAAC7F,EAAiBL,CAAU;AAC5B;AAGJ,iBAAW,CAACsH,GAAOC,CAAM,KAAK,OAAO,QAAQ0G,EAAiB,IAAIjO,CAAU,KAAK,CAAE,CAAA;AAC3E,QAAA0K,EAAA,WAAW1K,GAAYsH,GAAOC,CAAM;AAG5C,YAAM0H,IAAkBjP,EAAW,YAC7BkP,IAAmBjJ,GAA8BC,CAAI;AAE3D,MAAAlG,EAAW,aAAakP,GAEpBxE,EAAA,kBAAkB1K,GAAYiP,GAAiBC,CAAgB;AAAA,IAAA;AAGvE,UAAMb,GAAS3D,CAAG,GACZ,MAAAnC,EAAO,KAAK,wBAAwB;AAAA,EAAA;AAAA,EAG9C,MAAgB,qBAAoC;AAChD,IAAI,KAAK,SAAS,CAACnC,EAAM,gBAIzB,MAAM,KAAK,SAAS,CAACT,GAAiB,EAAA,KAAK,CAAClF,MAAUA,EAAM,IAAI,WAAW,UAAU,CAAC,CAAC;AAAA,EAAA;AAAA,EAG3F,MAAgB,uBAAsC;AAC9C,IAAC,KAAK,mBAIV,MAAM,KAAK,KAAK;AAAA,EAAA;AAAA,EAGV,MAAMmO,GAAoC;AAC1C,UAAAhO,IAAiB,CAAC,GAAG,KAAK,gBAAgB,EAC3C,IAAI,CAAC,EAAE,YAAAZ,QAAiBW,GAAkBX,CAAU,CAAC,EACrD,OACA,OAAO,CAACqF,CAAS,CAAC;AAEvB,SAAK,SAAS+H,EAAY,QAC1B,KAAK,SAASwB,EAAc;AAE5B,eAAWxO,KAAgBQ;AACvB,MAAA+D,EAAevE,CAAY,EAAE,UAAU,KAAK,MAAM;AAAA,EACtD;AAAA,EAGM,SAAe;AACrB,SAAK,SAAS;AAAA,MACV,mBAAmB,CAAC;AAAA,MACpB,oBAAoB;AAAA,MACpB,cAAc;AAAA,MACd,oBAAoB;AAAA,MACpB,kBAAkB,CAAC;AAAA,MACnB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,aAAa;AAAA,MACb,QAAQgN,EAAY;AAAA,IAAA,CACvB;AAAA,EAAA;AAAA,EAGG,gBAAyB;AACzB,WAAA+B,EAA0B,aAAa,IAChCC,GAAaC,EAA0B,aAAa,CAAC,IAG5D,KAAK,eACE,KAGJ,KAAK;AAAA,EAAA;AAGpB;AAEA,MAAe3N,KAAAa,GAAOqL,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IC9a5B0B,KAAW,EAAE,QAAQ5N,GAAM;AAQjC,SAAwB6N,KAAqB;AAClC,SAAA;AAAA,IACH,MAAM;AAAA,IACN,MAAM,QAAQC,GAAK;AACf,YAAMC,GAAaD,GAAK;AAAA,QACpB,GAAGF;AAAA,QACH,kBAAkB9G;AAAA,MAAA,CACrB;AAAA,IAAA;AAAA,EAET;AACJ;"}
|
|
1
|
+
{"version":3,"file":"aerogel-plugin-local-first.js","sources":["../src/services/DocumentsCache.ts","../src/lib/inference.ts","../src/lib/SyncQueue.ts","../src/lib/mirroring.ts","../src/jobs/Backup.ts","../src/lib/utils.ts","../src/jobs/mixins/LoadsChildren.ts","../src/jobs/mixins/LoadsTypeIndex.ts","../src/jobs/mixins/TracksLocalModels.ts","../src/jobs/Migrate.ts","../src/jobs/Sync.ts","../src/services/Cloud.state.ts","../src/services/Cloud.ts","../src/components/settings/PurgeData.vue","../src/components/settings/index.ts","../src/components/AccountModal.vue","../src/components/AccountLoggedIn.vue","../src/index.ts"],"sourcesContent":["import { Events, Service, appNamespace } from '@aerogel/core';\nimport { IndexedDBMap, facade } from '@noeldemartin/utils';\n\nexport class DocumentsCacheService extends Service {\n\n private cache = new IndexedDBMap<{ modifiedAt: number }>(`${appNamespace()}-documents-cache`);\n\n public async isFresh(documentUrl: string, modifiedAt: Date | number): Promise<boolean> {\n const meta = await this.cache.get(documentUrl);\n const modifiedAtTime = typeof modifiedAt !== 'number' ? modifiedAt.getTime() : modifiedAt;\n\n return !!meta?.modifiedAt && meta.modifiedAt >= modifiedAtTime;\n }\n\n public async remember(documentUrl: string, modifiedAt: Date | number): Promise<void> {\n await this.cache.set(documentUrl, {\n modifiedAt: typeof modifiedAt !== 'number' ? modifiedAt.getTime() : modifiedAt,\n });\n }\n\n public async forget(documentUrl: string): Promise<void> {\n await this.cache.delete(documentUrl);\n }\n\n public async clear(): Promise<void> {\n await this.cache.clear();\n }\n\n protected override async boot(): Promise<void> {\n Events.on('auth:logout', async () => {\n await this.cache.clear();\n\n this.cache.close();\n });\n }\n\n}\n\nexport default facade(DocumentsCacheService);\n","import {\n Metadata,\n Operation,\n SolidACLAuthorization,\n SolidContainer,\n SolidContainsRelation,\n SolidDocument,\n SolidModel,\n isContainerClass,\n isSolidDocumentRelation,\n} from 'soukai-solid';\nimport { arrayFilter, isInstanceOf } from '@noeldemartin/utils';\n\nimport type { SolidContainerConstructor, SolidModelConstructor } from 'soukai-solid';\n\nconst containerRelations: WeakMap<typeof SolidModel, string[]> = new WeakMap();\nconst sameDocumentRelations: WeakMap<typeof SolidModel, string[]> = new WeakMap();\n\nexport function getContainerRegisteredClasses(modelClass: SolidContainerConstructor): SolidModelConstructor[] {\n return arrayFilter(\n getContainerRelations(modelClass).map((relation) => {\n const relatedClass = modelClass.instance().requireRelation<SolidContainsRelation>(relation).relatedClass;\n\n if (isContainerClass(relatedClass)) {\n return false;\n }\n\n return relatedClass;\n }),\n );\n}\n\nexport function getContainerRelations(modelClass: typeof SolidModel): string[] {\n if (!containerRelations.has(modelClass)) {\n containerRelations.set(\n modelClass,\n modelClass.relations.filter((relation) => {\n if (SolidModel.reservedRelations.includes(relation)) {\n return false;\n }\n\n const relationInstance = modelClass.instance().requireRelation(relation);\n\n return relationInstance instanceof SolidContainsRelation;\n }),\n );\n }\n\n return containerRelations.get(modelClass) ?? [];\n}\n\nexport function getContainedModels(model: SolidContainer): SolidModel[] {\n const relations = getContainerRelations(model.static());\n\n return relations.reduce(\n (models, relation) => models.concat(model.getRelationModels(relation) ?? []),\n [] as SolidModel[],\n );\n}\n\nexport function getRelatedClasses(modelClass: SolidModelConstructor): SolidModelConstructor[] {\n const relatedClasses = new Set<SolidModelConstructor>();\n const instance = modelClass.instance();\n\n relatedClasses.add(modelClass);\n\n for (const relation of modelClass.relations) {\n if (modelClass.reservedRelations.includes(relation)) {\n continue;\n }\n\n relatedClasses.add(instance.requireRelation(relation).relatedClass);\n }\n\n return [...relatedClasses.values()];\n}\n\nexport function getRelatedAppModels(model: SolidModel): SolidModel[] {\n return model\n .getRelatedModels()\n .filter(\n (related) =>\n !isInstanceOf(related, SolidACLAuthorization) &&\n !isInstanceOf(related, SolidDocument) &&\n !isInstanceOf(related, Metadata) &&\n !isInstanceOf(related, Operation) &&\n related.static() !== SolidContainer,\n );\n}\n\nexport function getSameDocumentRelations(modelClass: typeof SolidModel): string[] {\n if (!sameDocumentRelations.has(modelClass)) {\n sameDocumentRelations.set(\n modelClass,\n modelClass.relations.filter((relation) => {\n if (SolidModel.reservedRelations.includes(relation)) {\n return false;\n }\n\n const relationInstance = modelClass.instance().requireRelation(relation);\n\n return isSolidDocumentRelation(relationInstance) && relationInstance.useSameDocument;\n }),\n );\n }\n\n return sameDocumentRelations.get(modelClass) ?? [];\n}\n\nexport function isDirtyOrHasDirtyChildren(model: SolidModel): boolean {\n if (model.isDirty()) {\n return true;\n }\n\n if (!(model instanceof SolidContainer)) {\n return false;\n }\n\n const relationHasDirtyModels = (relation: string) => {\n return model.getRelationModels(relation)?.some((relatedModel) => isDirtyOrHasDirtyChildren(relatedModel));\n };\n\n return getContainerRelations(model.static()).some(relationHasDirtyModels);\n}\n","import { after, arrayRemove, facade, required } from '@noeldemartin/utils';\nimport { App } from '@aerogel/core';\nimport { type SolidModel, isContainer } from 'soukai-solid';\n\nimport { getContainedModels } from '@aerogel/plugin-local-first/lib/inference';\n\nconst Cloud = required(() => App.service('$cloud'));\n\nclass SyncQueue {\n\n private models: Set<SolidModel> = new Set();\n private promises: Promise<unknown>[] = [];\n\n public push(model: SolidModel): void {\n this.models.add(model);\n this.syncAfter(after({ seconds: 1 }));\n }\n\n public clear(models?: SolidModel[]): void {\n if (!models) {\n this.models = new Set();\n\n return;\n }\n\n for (const model of models) {\n this.models.delete(model);\n }\n }\n\n protected async syncAfter<T = void>(operationOrPromise: Promise<T> | (() => Promise<T>)): Promise<T> {\n const promise = typeof operationOrPromise === 'function' ? operationOrPromise() : operationOrPromise;\n\n this.promises.push(promise);\n\n promise.then(() => arrayRemove(this.promises, promise));\n\n if (this.promises.length === 1) {\n this.schedule();\n }\n\n return promise as Promise<T>;\n }\n\n private schedule(): void {\n Promise.all(this.promises)\n .then(() => after())\n .then(() => {\n if (this.promises.length !== 0) {\n this.schedule();\n\n return;\n }\n\n const models = this.consume();\n\n if (models.length === 0) {\n return;\n }\n\n Cloud.syncIfOnline(models);\n });\n }\n\n private consume(): SolidModel[] {\n const models: SolidModel[] = [];\n const children: Set<SolidModel> = new Set();\n\n for (const model of this.models) {\n if (!isContainer(model)) {\n continue;\n }\n\n this.models.delete(model);\n getContainedModels(model).forEach((child) => children.add(child));\n models.push(model);\n }\n\n for (const model of this.models) {\n this.models.delete(model);\n\n if (children.has(model)) {\n continue;\n }\n\n models.push(model);\n }\n\n return models;\n }\n\n}\n\nexport default facade(SyncQueue);\n","import { bootModels } from 'soukai';\nimport {\n fail,\n objectWithout,\n requireUrlParentDirectory,\n required,\n tap,\n urlResolveDirectory,\n urlRoute,\n} from '@noeldemartin/utils';\nimport { App } from '@aerogel/core';\nimport { getTrackedModels, trackModelsCollection as trackSoukaiModelsCollection } from '@aerogel/plugin-soukai';\nimport { Solid } from '@aerogel/plugin-solid';\nimport { PropertyOperation, SolidContainer, SolidContainsRelation, Tombstone, isContainerClass } from 'soukai-solid';\nimport type { ObjectsMap } from '@noeldemartin/utils';\nimport type { Attributes } from 'soukai';\nimport type { Operation, SolidModel, SolidModelConstructor, SolidSchemaDefinition } from 'soukai-solid';\n\nimport DocumentsCache from '@aerogel/plugin-local-first/services/DocumentsCache';\nimport SyncQueue from '@aerogel/plugin-local-first/lib/SyncQueue';\nimport { getContainerRelations, getRelatedAppModels } from '@aerogel/plugin-local-first/lib/inference';\n\ninterface CloneOptions {\n clean?: boolean;\n}\n\nconst Cloud = required(() => App.service('$cloud'));\nconst remoteClasses: WeakMap<SolidModelConstructor, SolidModelConstructor> = new WeakMap();\nconst localClasses: WeakMap<SolidModelConstructor, SolidModelConstructor> = new WeakMap();\n\nfunction cleanRemoteModelClone(remoteModel: SolidModel): void {\n const relatedModels = remoteModel.getRelatedModels().concat([remoteModel]);\n\n for (const relatedModel of relatedModels) {\n relatedModel.cleanDirty(true);\n }\n}\n\nfunction fixRemoteModelClone(remoteModel: SolidModel): void {\n const relatedModels = getRelatedAppModels(remoteModel).concat([remoteModel]);\n\n for (const relatedModel of relatedModels) {\n if (!relatedModel.operations || relatedModel.operations.length === 0) {\n continue;\n }\n\n const operations = (relatedModel.operations ?? []).filter((operation) => {\n return (\n !(operation instanceof PropertyOperation) ||\n !relatedModel.ignoreRdfPropertyHistory(operation.property, true)\n );\n });\n\n if (!operations.some((operation) => !operation.isInception(relatedModel))) {\n relatedModel.setRelationModels('operations', []);\n\n continue;\n }\n\n relatedModel.setRelationModels('operations', operations);\n }\n}\n\nexport async function createRemoteModel(localModel: SolidModel): Promise<void> {\n Cloud.setState({\n localModelUpdates: {\n ...Cloud.localModelUpdates,\n [localModel.url]: 1,\n },\n });\n\n if (isRegisteredModelClass(localModel.static())) {\n await trackModelsCollection(localModel.static(), requireUrlParentDirectory(localModel.url));\n }\n\n if (Cloud.autoPush && Cloud.ready && !Cloud.syncing) {\n SyncQueue.push(localModel);\n }\n}\n\nexport async function trackModelsCollection(modelClass: SolidModelConstructor, collection: string): Promise<void> {\n if (Cloud.modelCollections[modelClass.modelName]?.includes(collection)) {\n return;\n }\n\n Cloud.setState('modelCollections', {\n ...Cloud.modelCollections,\n [modelClass.modelName]: (Cloud.modelCollections[modelClass.modelName] ?? []).concat(collection),\n });\n\n if (!Cloud.modelCollections[modelClass.modelName]?.includes(modelClass.collection)) {\n modelClass.collection = collection;\n }\n\n await trackSoukaiModelsCollection(modelClass, collection);\n}\n\nexport async function updateRemoteModel(localModel: SolidModel): Promise<void> {\n if (ignoreModelUpdates(localModel)) {\n return;\n }\n\n const modelUpdates = Cloud.localModelUpdates[localModel.url] ?? 0;\n\n Cloud.setState({\n localModelUpdates: localModel.isSoftDeleted()\n ? objectWithout(Cloud.localModelUpdates, localModel.url)\n : {\n ...Cloud.localModelUpdates,\n [localModel.url]: modelUpdates + 1,\n },\n });\n\n await DocumentsCache.forget(localModel.requireDocumentUrl());\n\n if (Cloud.autoPush && Cloud.ready && !Cloud.syncing) {\n SyncQueue.push(localModel);\n }\n}\n\nexport function clearLocalModelUpdates(syncedModelUrls: Set<string>, documentsWithErrors?: Set<string>): void {\n const localModelUpdates = {} as Record<string, number>;\n const syncedModelUrlsArray = Array.from(syncedModelUrls);\n\n for (const [url, count] of Object.entries(Cloud.localModelUpdates)) {\n const documentUrl = urlRoute(url);\n const wasSynced =\n syncedModelUrls.has(url) ||\n syncedModelUrlsArray.some((modelUrl) => modelUrl.endsWith('/') && url.startsWith(modelUrl));\n\n if (wasSynced && !documentsWithErrors?.has(documentUrl)) {\n continue;\n }\n\n localModelUpdates[url] = count;\n }\n\n Cloud.setState({ localModelUpdates });\n}\n\nexport function cloneLocalModel(localModel: SolidModel, options: CloneOptions = {}): SolidModel {\n const localModelClasses = new Set<typeof SolidModel>();\n\n localModelClasses.add(localModel.static());\n\n if (localModel instanceof SolidContainer) {\n for (const relation of getContainerRelations(localModel.static())) {\n localModelClasses.add(localModel.requireRelation<SolidContainsRelation>(relation).relatedClass);\n }\n }\n\n const constructors = [...localModelClasses.values()].map(\n (localClass) => [localClass, getRemoteClass(localClass)] as [typeof SolidModel, typeof SolidModel],\n );\n\n return tap(localModel.clone({ constructors }), (model) => {\n fixRemoteModelClone(model);\n\n options.clean && cleanRemoteModelClone(model);\n });\n}\n\nexport function cloneRemoteModel(remoteModel: SolidModel): SolidModel {\n const remoteModelClasses = new Set<typeof SolidModel>();\n\n remoteModelClasses.add(remoteModel.static());\n\n if (remoteModel instanceof SolidContainer) {\n for (const relation of getContainerRelations(remoteModel.static())) {\n remoteModelClasses.add(remoteModel.requireRelation<SolidContainsRelation>(relation).relatedClass);\n }\n }\n\n const constructors = [...remoteModelClasses.values()].map(\n (remoteClass) => [remoteClass, getLocalClass(remoteClass)] as [typeof SolidModel, typeof SolidModel],\n );\n\n return remoteModel.clone({ constructors });\n}\n\nexport async function completeRemoteModels(\n localModels: SolidModel[],\n remoteModels: SolidModel[],\n documentsWithErrors: Set<string>,\n): Promise<SolidModel[]> {\n const RemoteTombstone = getRemoteClass(Tombstone);\n const remoteModelUrls = remoteModels.map((remoteModel) => remoteModel.url);\n const missingModelDocumentUrls = localModels\n .filter((localModel) => !remoteModelUrls.includes(localModel.url))\n .map((localModel) => localModel.requireDocumentUrl())\n .filter((documentUrl) => !documentsWithErrors.has(documentUrl));\n const tombstones = await RemoteTombstone.all({ $in: missingModelDocumentUrls });\n\n return remoteModels.concat(tombstones);\n}\n\nexport function ignoreModelUpdates(localModel: SolidModel): boolean {\n const documentModels = localModel.getDocumentModels();\n const documentOperations = documentModels.flatMap(\n (model) => model.operations?.map((operation) => [model, operation] as [SolidModel, Operation]) ?? [],\n );\n\n return !documentOperations.some(([model, operation]) => {\n if (operation.date.getTime() !== model.metadata?.updatedAt?.getTime()) {\n return false;\n }\n\n if (!(operation instanceof PropertyOperation)) {\n return true;\n }\n\n return !model.ignoreRdfPropertyHistory(operation.property, true);\n });\n}\n\nexport function getLocalModel(remoteModel: SolidModel, localModels: ObjectsMap<SolidModel>): SolidModel {\n return localModels.get(remoteModel.url) ?? cloneRemoteModel(remoteModel);\n}\n\nexport function getLocalModels(): SolidModel[] {\n return [...Cloud.registeredModels]\n .map(({ modelClass }) => getTrackedModels(modelClass, { includeSoftDeleted: true }))\n .flat();\n}\n\nexport function getSchemaMigrations(): Map<SolidModelConstructor, SolidModelConstructor | SolidSchemaDefinition> {\n return Cloud.schemaMigrations;\n}\n\nexport function clearSchemaMigrations(): void {\n Cloud.schemaMigrations.clear();\n}\n\nexport function getSchemaMigration(\n modelClass: SolidModelConstructor,\n): SolidModelConstructor | SolidSchemaDefinition | undefined {\n return Cloud.schemaMigrations.get(modelClass);\n}\n\nexport function getRemoteClass<T extends SolidModelConstructor>(localClass: T): T {\n return (remoteClasses.get(localClass) as T) ?? makeRemoteClass(localClass);\n}\n\nexport function getRemoteContainersCollection(modelClass: SolidModelConstructor, path?: string): string {\n const rootStorage = Solid.requireUser().storageUrls[0];\n const containedClass =\n isContainerClass(modelClass) &&\n getContainerRelations(modelClass)\n .map((relation) => {\n const relatedClass = modelClass\n .instance()\n .requireRelation<SolidContainsRelation>(relation).relatedClass;\n\n if (isContainerClass(relatedClass)) {\n return null;\n }\n\n return relatedClass;\n })\n .filter(Boolean)[0];\n\n path ??= `/${(containedClass || modelClass).modelName.toLowerCase()}s/`;\n\n return urlResolveDirectory((path.startsWith('/') ? rootStorage.slice(0, -1) : rootStorage) + path);\n}\n\nexport function getRemoteModel(localModel: SolidModel, remoteModels: ObjectsMap<SolidModel>): SolidModel {\n return remoteModels.get(localModel.url) ?? cloneLocalModel(localModel);\n}\n\nexport function isRegisteredModel(model: SolidModel): boolean {\n for (const { modelClass } of Cloud.registeredModels) {\n const models = getTrackedModels(modelClass);\n\n if (models.some((registeredModel) => registeredModel.url === model.url)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function isRemoteModel(model: SolidModel): boolean {\n return localClasses.has(model.static());\n}\n\nexport function isLocalModel(model: SolidModel): boolean {\n return !isRemoteModel(model);\n}\n\nexport function isRegisteredModelClass(modelClass: SolidModelConstructor): boolean {\n return Cloud.registeredModels.some(({ modelClass: registeredModelClass }) => registeredModelClass === modelClass);\n}\n\nexport function makeRemoteClass<T extends SolidModelConstructor>(localClass: T): T {\n const LocalClass = localClass as typeof SolidModel;\n const withLocalHistoryConfig = (modelClass: typeof SolidModel, operation: () => unknown) => {\n modelClass.timestamps = LocalClass.timestamps;\n modelClass.history = LocalClass.history;\n\n operation();\n\n modelClass.timestamps = [];\n modelClass.history = false;\n };\n const RemoteClass = class extends LocalClass {\n\n public static override timestamps = false;\n public static override history = false;\n\n protected override initialize(attributes: Attributes, exists: boolean): void {\n withLocalHistoryConfig(this._proxy.static(), () => super.initialize(attributes, exists));\n }\n\n protected override initializeRelations(): void {\n super.initializeRelations();\n\n for (const relation of Object.values(this._relations)) {\n if (!(relation instanceof SolidContainsRelation)) {\n continue;\n }\n\n relation.relatedClass = getRemoteClass(relation.relatedClass);\n }\n }\n\n public override fixMalformedAttributes(): void {\n withLocalHistoryConfig(this.static(), () => super.fixMalformedAttributes());\n }\n \n } as unknown as T;\n\n remoteClasses.set(LocalClass, RemoteClass);\n localClasses.set(RemoteClass, LocalClass);\n\n LocalClass.on('schema-updated', async (schema) => {\n await RemoteClass.updateSchema({\n ...schema,\n timestamps: false,\n history: false,\n });\n });\n\n bootModels({ [`Remote${localClass.modelName}`]: RemoteClass });\n\n return RemoteClass;\n}\n\nexport function getLocalClass<T extends SolidModelConstructor>(remoteClass: T): T {\n return (localClasses.get(remoteClass) as T) ?? fail(`Couldn't find local class for ${remoteClass.modelName}`);\n}\n","import { Job } from '@aerogel/core';\nimport { requireEngine } from 'soukai';\nimport { requireUrlParentDirectory } from '@noeldemartin/utils';\nimport { ignoreModelsCollection, trackModelsCollection } from '@aerogel/plugin-soukai';\nimport type { EngineDocument, IndexedDBEngine } from 'soukai';\nimport type { SolidModelConstructor } from 'soukai-solid';\n\ninterface Migration {\n modelClass: SolidModelConstructor;\n local: string;\n remote: string;\n}\n\nexport default class Backup extends Job {\n\n private urlMigrations: Migration[] = [];\n private collectionMigrations: Migration[] = [];\n\n public migrateUrl(modelClass: SolidModelConstructor, local: string, remote: string): void {\n this.urlMigrations.push({\n modelClass,\n local,\n remote,\n });\n }\n\n public migrateCollection(modelClass: SolidModelConstructor, local: string, remote: string): void {\n this.collectionMigrations.push({\n modelClass,\n local,\n remote,\n });\n }\n\n protected async run(): Promise<void> {\n const engine = requireEngine<IndexedDBEngine>();\n const collections = await engine.getCollections();\n\n for (const collection of collections) {\n const documents = await engine.readMany(collection);\n\n for (const [id, document] of Object.entries(documents)) {\n const url = this.replaceUrl(id);\n\n await engine.create(requireUrlParentDirectory(url), this.replaceDocumentUrls(document), url);\n await engine.delete(collection, id);\n }\n }\n\n for (const { modelClass, remote } of this.urlMigrations) {\n trackModelsCollection(modelClass, requireUrlParentDirectory(remote), { refresh: false });\n }\n\n for (const { modelClass, local, remote } of this.collectionMigrations) {\n ignoreModelsCollection(modelClass, local);\n trackModelsCollection(modelClass, remote, { refresh: false });\n }\n }\n\n protected replaceDocumentUrls(document: EngineDocument): EngineDocument {\n for (const [key, value] of Object.entries(document)) {\n if (key === '@id' && typeof value === 'string') {\n document[key] = this.replaceUrl(value);\n\n continue;\n }\n\n if (typeof value !== 'object' || value === null) {\n continue;\n }\n\n document[key] = this.replaceDocumentUrls(value as EngineDocument);\n }\n\n return document;\n }\n\n protected replaceUrl(url: string): string {\n for (const { local, remote } of this.urlMigrations) {\n if (!url.startsWith(local)) {\n continue;\n }\n\n return url.replace(local, remote);\n }\n\n for (const { local, remote } of this.collectionMigrations) {\n if (!url.startsWith(local)) {\n continue;\n }\n\n return url.replace(local, remote);\n }\n\n return url;\n }\n\n}\n","export function mapFromArray<K, V>(items: [K, V][]): Map<K, V> {\n const itemsMap = new Map();\n\n for (const [key, value] of items) {\n itemsMap.set(key, value);\n }\n\n return itemsMap;\n}\n\nexport function lazy<T>(getter: () => Promise<T>): () => Promise<T> {\n const result: { value?: T } = {};\n\n return async () => {\n if (!('value' in result)) {\n result.value = await getter();\n }\n\n return result.value as T;\n };\n}\n","import { arrayChunk, arrayFrom, isInstanceOf, map, required } from '@noeldemartin/utils';\nimport { DocumentNotFound } from 'soukai';\nimport { Tombstone } from 'soukai-solid';\nimport type { JobStatus } from '@aerogel/core';\nimport type { ObjectsMap } from '@noeldemartin/utils';\nimport type { SolidContainer, SolidContainsRelation, SolidDocument, SolidModel } from 'soukai-solid';\n\nimport DocumentsCache from '@aerogel/plugin-local-first/services/DocumentsCache';\nimport { cloneLocalModel, isLocalModel } from '@aerogel/plugin-local-first/lib/mirroring';\nimport { getContainerRelations } from '@aerogel/plugin-local-first/lib/inference';\nimport { lazy } from '@aerogel/plugin-local-first/lib/utils';\n\nexport interface ResourceJobStatus extends JobStatus {\n documentUrl?: string;\n children?: ResourceJobStatus[];\n}\n\nexport default class LoadsChildren {\n\n declare protected localModels?: ObjectsMap<SolidModel>;\n\n protected async loadContainedModels(\n model: SolidContainer,\n options: {\n ignoreTombstones?: boolean;\n status?: ResourceJobStatus;\n onDocumentLoaded?: () => unknown;\n onDocumentError?: (error: unknown) => unknown;\n onDocumentRead?: (document: SolidDocument) => unknown;\n } = {},\n ): Promise<SolidModel[]> {\n if (isLocalModel(model)) {\n const children = [];\n\n for (const relation of getContainerRelations(model.static())) {\n const relationModels =\n (await model.loadRelationIfUnloaded<SolidModel | SolidModel[] | null>(relation)) ?? [];\n\n children.push(...arrayFrom(relationModels));\n }\n\n return children;\n }\n\n const children: Record<string, SolidModel[]> = {};\n const tombstones: Tombstone[] = [];\n const documents = map(model.documents, 'url');\n const documentUrlChunks = arrayChunk(model.resourceUrls, 10);\n const statusChildren = documentUrlChunks.flat().map((url) => ({\n documentUrl: url,\n completed: false,\n }));\n const statusChildrenMap = map(statusChildren, 'documentUrl');\n\n if (options.status) {\n options.status.children = statusChildren;\n }\n\n for (const documentUrls of documentUrlChunks) {\n await Promise.all(\n documentUrls.map(async (documentUrl) => {\n const { children: documentChildren, tombstones: documentTombstones } =\n await this.loadDocumentChildren(\n model,\n documentUrl,\n documents,\n options.onDocumentError,\n options.onDocumentRead,\n );\n\n tombstones.push(...documentTombstones);\n\n for (const [relation, documentModels] of Object.entries(documentChildren)) {\n const relationChildren = (children[relation] ??= []);\n\n relationChildren.push(...documentModels);\n }\n\n if (documentUrl.endsWith('/')) {\n return;\n }\n\n required(statusChildrenMap.get(documentUrl)).completed = true;\n\n await options.onDocumentLoaded?.();\n }),\n );\n }\n\n for (const [relation, relationModels] of Object.entries(children)) {\n model.setRelationModels(relation, relationModels);\n }\n\n const childrenArray = options.ignoreTombstones\n ? Object.values(children).flat()\n : Object.values(children).flat().concat(tombstones);\n\n if (options.status) {\n options.status.children = childrenArray.map((child) => {\n return required(statusChildrenMap.get(child.requireDocumentUrl()));\n });\n }\n\n return childrenArray;\n }\n\n protected async loadDocumentChildren(\n model: SolidContainer,\n documentUrl: string,\n documents: ObjectsMap<SolidDocument>,\n onDocumentError?: (error: unknown) => unknown,\n onDocumentRead?: (document: SolidDocument) => unknown,\n ): Promise<{ children: Record<string, SolidModel[]>; tombstones: Tombstone[] }> {\n const document = documents.get(documentUrl);\n\n if (\n document &&\n document.updatedAt &&\n (await DocumentsCache.isFresh(document.url, document.updatedAt)) &&\n this.localModels?.hasKey(model.url)\n ) {\n return {\n children: await this.loadDocumentChildrenFromLocal(model, document),\n tombstones: [],\n };\n }\n\n return this.loadDocumentChildrenFromRemote(model, documentUrl, onDocumentError, onDocumentRead);\n }\n\n protected async loadDocumentChildrenFromLocal(\n model: SolidModel,\n document: SolidDocument,\n ): Promise<Record<string, SolidModel[]>> {\n const children: Record<string, SolidModel[]> = {};\n\n for (const relation of getContainerRelations(model.static())) {\n const relationInstance = model.requireRelation<SolidContainsRelation>(relation);\n\n if (relationInstance.loaded) {\n children[relation] = relationInstance.getLoadedModels();\n\n continue;\n }\n\n const relatedLocalModels = this.localModels?.get(model.url)?.getRelationModels(relation) ?? [];\n\n children[relation] = relatedLocalModels\n .filter((relatedLocalModel) => relatedLocalModel.getDocumentUrl() === document.url)\n .map((relatedLocalModel) => cloneLocalModel(relatedLocalModel, { clean: true }));\n }\n\n return children;\n }\n\n protected async loadDocumentChildrenFromRemote(\n model: SolidContainer,\n documentUrl: string,\n onDocumentError?: (error: unknown) => unknown,\n onDocumentRead?: (document: SolidDocument) => unknown,\n ): Promise<{ children: Record<string, SolidModel[]>; tombstones: Tombstone[] }> {\n const children: Record<string, SolidModel[]> = {};\n const tombstones: Tombstone[] = [];\n const readDocument = lazy(async () => {\n try {\n const documentModel = model.documents.find((document) => document.url === documentUrl);\n const document = await model.requireEngine().readOne(model.static('collection'), documentUrl);\n const documentTombstones = await Tombstone.createManyFromEngineDocuments({\n [documentUrl]: document,\n });\n\n tombstones.push(...documentTombstones);\n\n if (documentModel) {\n onDocumentRead?.(documentModel);\n }\n\n return document;\n } catch (error) {\n if (isInstanceOf(error, DocumentNotFound)) {\n return null;\n }\n\n if (!onDocumentError) {\n throw error;\n }\n\n onDocumentError(error);\n\n return null;\n }\n });\n\n for (const relation of getContainerRelations(model.static())) {\n const relationInstance = model.requireRelation<SolidContainsRelation>(relation);\n\n if (relationInstance.loaded) {\n children[relation] = relationInstance.getLoadedModels();\n\n continue;\n }\n\n const document = await readDocument();\n\n if (!document) {\n continue;\n }\n\n try {\n const documentChildren = await relationInstance.relatedClass.createManyFromEngineDocuments({\n [documentUrl]: document,\n });\n\n children[relation] = documentChildren;\n } catch (error) {\n if (!onDocumentError) {\n throw error;\n }\n\n onDocumentError(error);\n }\n }\n\n return { children, tombstones };\n }\n\n}\n","import { Solid } from '@aerogel/plugin-solid';\nimport type { SolidTypeIndex } from 'soukai-solid';\nimport type { SolidUserProfile } from '@noeldemartin/solid-utils';\n\nconst typeIndexes: WeakMap<SolidUserProfile, SolidTypeIndex | null> = new WeakMap();\n\nexport default class LoadsTypeIndex {\n\n protected async loadTypeIndex(options?: { create?: false; fresh?: boolean }): Promise<SolidTypeIndex | null>;\n protected async loadTypeIndex(options?: { create?: true; fresh?: boolean }): Promise<SolidTypeIndex>;\n protected async loadTypeIndex(options: { create?: boolean; fresh?: boolean } = {}): Promise<SolidTypeIndex | null> {\n const user = Solid.requireUser();\n\n if (options.fresh || !typeIndexes.has(user)) {\n typeIndexes.set(user, await Solid.findPrivateTypeIndex({ fresh: options.fresh }));\n }\n\n if (options.create && !typeIndexes.get(user)) {\n typeIndexes.set(user, await Solid.findOrCreatePrivateTypeIndex());\n }\n\n return typeIndexes.get(user) ?? null;\n }\n\n}\n","import type { ObjectsMap } from '@noeldemartin/utils';\nimport type { SolidModel } from 'soukai-solid';\n\nimport { getContainerRelations, getRelatedAppModels } from '@aerogel/plugin-local-first/lib/inference';\n\nexport default class TracksLocalModels {\n\n declare protected localModels: ObjectsMap<SolidModel>;\n\n protected async indexLocalModels(models: SolidModel[]): Promise<void> {\n for (const localModel of models) {\n await this.addLocalModel(localModel);\n }\n }\n\n protected async addLocalModel(localModel: SolidModel): Promise<void> {\n if (this.localModels.hasKey(localModel.url)) {\n return;\n }\n\n this.localModels.add(localModel);\n\n for (const relation of getContainerRelations(localModel.static())) {\n await localModel.loadRelationIfUnloaded(relation);\n }\n\n for (const relatedModel of getRelatedAppModels(localModel)) {\n await this.addLocalModel(relatedModel);\n }\n }\n\n}\n","import { PropertyOperation, isContainer } from 'soukai-solid';\nimport { Job } from '@aerogel/core';\nimport { isInstanceOf, map, mixed, objectMap, tap } from '@noeldemartin/utils';\nimport type { JobListener, JobStatus } from '@aerogel/core';\nimport type { Nullable } from '@noeldemartin/utils';\nimport type { SolidModel, SolidTypeIndex } from 'soukai-solid';\n\nimport {\n clearSchemaMigrations,\n getRemoteClass,\n getSchemaMigration,\n getSchemaMigrations,\n} from '@aerogel/plugin-local-first/lib/mirroring';\nimport { getContainerRegisteredClasses } from '@aerogel/plugin-local-first/lib/inference';\n\nimport LoadsChildren from './mixins/LoadsChildren';\nimport LoadsTypeIndex from './mixins/LoadsTypeIndex';\nimport TracksLocalModels from './mixins/TracksLocalModels';\n\nconst BaseJob = Job as typeof Job<JobListener, MigrateJobStatus, MigrateJobStatus>;\n\nexport interface MigrateJobStatus extends JobStatus {\n children?: MigrateModelJobStatus[];\n}\n\nexport interface MigrateModelJobStatus extends JobStatus {\n modelUrl: string;\n children?: MigrateModelJobStatus[];\n}\n\nexport default class Migrate extends mixed(BaseJob, [LoadsChildren, LoadsTypeIndex, TracksLocalModels]) {\n\n public static restore(status: MigrateJobStatus): Migrate {\n return tap(new Migrate(), (job) => {\n job.status = status;\n });\n }\n\n constructor() {\n super();\n\n this.localModels = map([], 'url');\n }\n\n protected _models?: SolidModel[];\n\n public get models(): SolidModel[] | undefined {\n return this._models;\n }\n\n public set models(models: SolidModel[] | undefined) {\n if (!models) {\n delete this._models;\n\n this.localModels = map([], 'url');\n\n return;\n }\n\n const childrenStatus = objectMap(this.status.children ?? [], 'modelUrl');\n\n this._models = models;\n this.localModels = map([], 'url');\n this.status.children = models.map(\n (model) =>\n childrenStatus[model.url] ?? {\n modelUrl: model.url,\n completed: false,\n },\n );\n }\n\n protected async run(): Promise<void> {\n if (!this.models) {\n throw new Error('Cant start migration without models');\n }\n\n await this.indexLocalModels(this.models);\n\n const modelStatuses = this.status.children ?? [];\n const typeIndex = await this.loadTypeIndex();\n\n for (const modelStatus of modelStatuses) {\n const model = this.models.find(({ url }) => modelStatus.modelUrl === url);\n\n if (!model || modelStatus.completed) {\n continue;\n }\n\n await this.migrateRegisteredModel(model, modelStatus, typeIndex);\n await this.updateProgress(() => (modelStatus.completed = true));\n }\n\n for (const [modelClass, schema] of getSchemaMigrations()) {\n await modelClass.updateSchema(schema);\n }\n\n clearSchemaMigrations();\n }\n\n protected async migrateRegisteredModel(\n model: SolidModel,\n status: MigrateModelJobStatus,\n typeIndex?: Nullable<SolidTypeIndex>,\n ): Promise<void> {\n await this.migrate(model, status);\n\n if (!isContainer(model)) {\n return;\n }\n\n const registeredClasses = getContainerRegisteredClasses(model.static());\n const registration = typeIndex?.registrations.find(({ instanceContainer }) => instanceContainer === model.url);\n\n if (!typeIndex || !registration || registeredClasses.length === 0) {\n return;\n }\n\n registration.setAttribute(\n 'forClass',\n registeredClasses\n .map((modelClass) => getSchemaMigration(modelClass)?.rdfsClasses ?? modelClass.rdfsClass)\n .flat(),\n );\n\n await typeIndex.save();\n }\n\n protected async migrate(localModel: SolidModel, status: MigrateModelJobStatus): Promise<void> {\n this.assertNotCancelled();\n\n await this.migrateChildren(localModel, status);\n\n const schema = getSchemaMigration(localModel.static());\n\n if (!schema) {\n return;\n }\n\n const remoteModel = await getRemoteClass(localModel.static()).find(localModel.url);\n const migratedModel = await remoteModel?.migrateSchema(schema);\n\n await localModel.migrateSchema(schema, {\n mintOperationUrl: (operation) => {\n return migratedModel?.operations?.find((migratedOperation) => {\n if (\n !isInstanceOf(operation, PropertyOperation) ||\n !isInstanceOf(migratedOperation, PropertyOperation)\n ) {\n return false;\n }\n\n return (\n operation.property === migratedOperation.property &&\n operation.date.getTime() === migratedOperation.date.getTime()\n );\n })?.url;\n },\n });\n }\n\n protected async migrateChildren(localModel: SolidModel, status: MigrateModelJobStatus): Promise<void> {\n if (!isContainer(localModel)) {\n return;\n }\n\n const children = await this.loadContainedModels(localModel, { ignoreTombstones: true });\n\n status.children ??= children.map((child) => ({\n modelUrl: child.url,\n completed: false,\n }));\n\n for (const childStatus of status.children) {\n const child = children.find(({ url }) => childStatus.modelUrl === url);\n\n if (!child || childStatus.completed) {\n continue;\n }\n\n await this.migrate(child, childStatus);\n await this.updateProgress(() => (childStatus.completed = true));\n }\n }\n\n}\n","import {\n isInstanceOf,\n map,\n mixed,\n requireUrlParentDirectory,\n required,\n round,\n toString,\n urlRoute,\n} from '@noeldemartin/utils';\nimport { App, Errors, Job } from '@aerogel/core';\nimport { InvalidModelAttributes, requireBootedModel } from 'soukai';\nimport { MalformedSolidDocumentError } from '@noeldemartin/solid-utils';\nimport { Solid } from '@aerogel/plugin-solid';\nimport { SolidContainer, SolidModel, Tombstone, isContainer, isContainerClass } from 'soukai-solid';\nimport type { ObjectsMap } from '@noeldemartin/utils';\nimport type { JobListener, JobStatus } from '@aerogel/core';\nimport type { SolidContainsRelation, SolidEngine, SolidTypeIndex } from 'soukai-solid';\n\nimport {\n clearLocalModelUpdates,\n cloneLocalModel,\n cloneRemoteModel,\n completeRemoteModels,\n getLocalModel,\n getLocalModels,\n getRemoteClass,\n getRemoteModel,\n isRegisteredModel,\n isRemoteModel,\n trackModelsCollection,\n} from '@aerogel/plugin-local-first/lib/mirroring';\nimport {\n getContainerRegisteredClasses,\n getContainerRelations,\n getRelatedAppModels,\n isDirtyOrHasDirtyChildren,\n} from '@aerogel/plugin-local-first/lib/inference';\nimport DocumentsCache from '@aerogel/plugin-local-first/services/DocumentsCache';\n\nimport LoadsChildren from './mixins/LoadsChildren';\nimport LoadsTypeIndex from './mixins/LoadsTypeIndex';\nimport TracksLocalModels from './mixins/TracksLocalModels';\nimport type { ResourceJobStatus } from './mixins/LoadsChildren';\n\nconst Cloud = required(() => App.service('$cloud'));\nconst BaseJob = Job as typeof Job<JobListener, SyncJobStatus, SyncJobStatus>;\n\ninterface SyncJobStatus extends JobStatus {\n root: true;\n children: [SyncPullJobStatus, JobStatus];\n}\n\ninterface SyncPullJobStatus extends JobStatus {\n children?: ResourceJobStatus[];\n}\n\nfunction isRootStatus(status?: JobStatus): status is SyncJobStatus {\n return !!status && 'root' in status;\n}\n\nexport default class Sync extends mixed(BaseJob, [LoadsChildren, LoadsTypeIndex, TracksLocalModels]) {\n\n public readonly documentsWithErrors: Set<string>;\n protected models?: SolidModel[];\n protected dirtyRemoteModels?: SolidModel[];\n protected rootLocalModels: SolidModel[];\n protected tombstones: ObjectsMap<Tombstone>;\n protected syncedModelUrls: Set<string>;\n protected documentsModifiedAt: Record<string, Date>;\n protected screenLock: Promise<void | { release(): Promise<void> }> | null = null;\n protected override localModels: ObjectsMap<SolidModel>;\n\n constructor(models?: SolidModel[]) {\n super();\n\n this.documentsWithErrors = new Set();\n this.models = models;\n this.rootLocalModels = [];\n this.localModels = map([], 'url');\n this.tombstones = map([], 'resourceUrl');\n this.syncedModelUrls = new Set();\n this.documentsModifiedAt = {};\n }\n\n protected async run(): Promise<void> {\n const engine = Solid.requireAuthenticator().engine as SolidEngine;\n const updateDocumentDate = (url: string, { headers }: { headers?: Headers }, fallbackDate?: Date) => {\n const date = headers?.get('last-modified') ?? fallbackDate;\n\n if (!date || url.endsWith('/')) {\n return;\n }\n\n this.documentsModifiedAt[url] = new Date(date);\n };\n const clearListener = engine.listeners.add({\n onDocumentRead: (url, metadata) => updateDocumentDate(url, metadata),\n onDocumentUpdated: (url, metadata) => updateDocumentDate(url, metadata, new Date()),\n });\n\n try {\n this.lockScreen();\n this.rootLocalModels = this.models ?? getLocalModels();\n\n await this.indexLocalModels(this.rootLocalModels);\n await this.pullChanges();\n await this.pushChanges();\n } finally {\n this.releaseScreen();\n clearListener();\n }\n }\n\n protected lockScreen(): void {\n const typedNavigator = navigator as {\n wakeLock?: { request(type?: 'screen'): Promise<{ release(): Promise<void> }> };\n };\n\n if (!typedNavigator.wakeLock) {\n return;\n }\n\n try {\n this.screenLock = typedNavigator.wakeLock.request('screen').catch((error) => {\n Errors.reportDevelopmentError(error, 'Could not request screen wake lock');\n });\n } catch (error) {\n Errors.reportDevelopmentError(error, 'Could not request screen wake lock');\n }\n }\n\n protected releaseScreen(): void {\n if (!this.screenLock) {\n return;\n }\n\n this.screenLock.then((lock) => lock?.release());\n this.screenLock = null;\n }\n\n protected override getInitialStatus(): SyncJobStatus {\n return {\n root: true,\n completed: false,\n children: [{ completed: false }, { completed: false }],\n };\n }\n\n protected override calculateCurrentProgress(status?: JobStatus): number {\n status ??= this.status;\n\n if (isRootStatus(status)) {\n return round(\n this.calculateCurrentProgress(status.children[0]) * 0.9 +\n this.calculateCurrentProgress(status.children[1]) * 0.1,\n 2,\n );\n }\n\n return super.calculateCurrentProgress(status);\n }\n\n private async pullChanges(): Promise<void> {\n const remoteModelsArray = this.models\n ? await this.fetchRemoteModelsForLocal(this.models)\n : await this.fetchRemoteModels();\n const remoteModels = map(remoteModelsArray, (model) => {\n if (model instanceof Tombstone) {\n return model.resourceUrl;\n }\n\n return model.url;\n });\n\n this.dirtyRemoteModels = await this.synchronizeModels(remoteModels);\n\n await this.updateProgress((status) => (status.children[0].completed = true));\n }\n\n private async pushChanges(): Promise<void> {\n const remoteModels = this.dirtyRemoteModels ?? [];\n const childrenStatus = (this.status.children[1].children = remoteModels.map(() => ({ completed: false })));\n\n for (let index = 0; index < remoteModels.length; index++) {\n const remoteModel = remoteModels[index] as SolidModel;\n const childStatus = childrenStatus[index] as JobStatus;\n\n if (remoteModel.isSoftDeleted()) {\n remoteModel.enableHistory();\n remoteModel.enableTombstone();\n\n await remoteModel.forceDelete();\n await this.updateProgress(() => (childStatus.completed = true));\n\n return;\n }\n\n await this.saveModelAndChildren(remoteModel, childStatus);\n await this.updateTypeRegistrations(remoteModel);\n await this.updateProgress(() => (childStatus.completed = true));\n }\n\n for (const [documentUrl, modifiedAt] of Object.entries(this.documentsModifiedAt)) {\n await DocumentsCache.remember(documentUrl, modifiedAt);\n }\n\n clearLocalModelUpdates(this.syncedModelUrls, this.documentsWithErrors);\n\n await this.updateProgress((status) => (status.children[1].completed = true));\n }\n\n private async fetchRemoteModels(): Promise<SolidModel[]> {\n const pullStatus = this.status.children[0];\n const typeIndex = await this.loadTypeIndex({ fresh: true });\n\n if (!typeIndex) {\n return [];\n }\n\n const remoteModels: SolidModel[] = [];\n const registrations = this.getTypeRegistrations(typeIndex);\n\n pullStatus.children = registrations.map(() => ({ completed: false }));\n\n for (let index = 0; index < registrations.length; index++) {\n await this.ignoringDocumentErrors(async () => {\n const { registration, registeredModel } = required(registrations[index]);\n const remoteClass = getRemoteClass(registeredModel.modelClass);\n\n if (!registration.instanceContainer) {\n return;\n }\n\n if (isContainerClass(remoteClass)) {\n await trackModelsCollection(\n registeredModel.modelClass,\n requireUrlParentDirectory(registration.instanceContainer),\n );\n\n const container = await remoteClass.find(registration.instanceContainer);\n\n if (container) {\n await this.loadChildren(container, required(pullStatus.children?.[index]));\n\n remoteModels.push(container);\n }\n\n await this.updateProgress(() => (required(pullStatus.children?.[index]).completed = true));\n\n return;\n }\n\n await trackModelsCollection(registeredModel.modelClass, registration.instanceContainer);\n\n remoteModels.push(...(await remoteClass.from(registration.instanceContainer).all()));\n\n await this.updateProgress(() => (required(pullStatus.children?.[index]).completed = true));\n });\n }\n\n return completeRemoteModels(this.rootLocalModels, remoteModels, this.documentsWithErrors);\n }\n\n private async fetchRemoteModelsForLocal(models: SolidModel[]): Promise<SolidModel[]> {\n const remoteModels = [] as SolidModel[];\n const statusChildren = (this.status.children[0].children = models.map(() => ({ completed: false })));\n\n for (let index = 0; index < models.length; index++) {\n await this.ignoringDocumentErrors(async () => {\n const localModel = models[index] as SolidModel;\n const childStatus = statusChildren[index] as JobStatus;\n const remoteModel = await getRemoteClass(localModel.static()).find(localModel.url);\n\n if (!remoteModel) {\n await this.updateProgress(() => (childStatus.completed = true));\n\n return;\n }\n\n isContainer(remoteModel) && (await this.loadChildren(remoteModel, childStatus));\n\n remoteModels.push(remoteModel);\n\n await this.updateProgress(() => (childStatus.completed = true));\n });\n }\n\n return completeRemoteModels(models, remoteModels, this.documentsWithErrors);\n }\n\n private getTypeRegistrations(typeIndex: SolidTypeIndex) {\n const processedContainerUrls = new Set();\n const registeredModels = [...Cloud.registeredModels].map(({ modelClass }) => {\n const registeredChildren = isContainerClass(modelClass) ? getContainerRegisteredClasses(modelClass) : [];\n\n return {\n modelClass,\n rdfsClasses:\n registeredChildren.length > 0\n ? registeredChildren.map((childrenClass) => childrenClass.rdfsClasses).flat()\n : modelClass.rdfsClasses,\n };\n });\n const registrations = typeIndex.registrations\n .map((registration) => {\n const registeredModel = registeredModels.find(\n ({ rdfsClasses }) =>\n !!registration.instanceContainer &&\n rdfsClasses.some((rdfsClass) => registration.forClass.includes(rdfsClass)),\n );\n\n if (\n !registeredModel ||\n !registration.instanceContainer ||\n processedContainerUrls.has(registration.instanceContainer)\n ) {\n return null;\n }\n\n processedContainerUrls.add(registration.instanceContainer);\n\n return { registration, registeredModel };\n })\n .filter((match) => !!match);\n\n // Removed nested registrations.\n const containerUrls = registrations.map(({ registration }) => registration.instanceContainer);\n\n return registrations.filter(({ registration }) => {\n return !containerUrls.some(\n (containerUrl) =>\n containerUrl &&\n containerUrl !== registration.instanceContainer &&\n registration.instanceContainer?.startsWith(containerUrl),\n );\n });\n }\n\n private async updateTypeRegistrations(remoteModel: SolidModel): Promise<void> {\n if (!isRegisteredModel(remoteModel)) {\n return;\n }\n\n const registeredChildren = isContainer(remoteModel)\n ? getContainerRegisteredClasses(remoteModel.static())\n : [remoteModel.static()];\n\n const RemoteSolidContainer = getRemoteClass(SolidContainer);\n const container = isContainer(remoteModel)\n ? remoteModel\n : new RemoteSolidContainer({ url: remoteModel.requireContainerUrl() });\n\n if (registeredChildren.length === 0) {\n return;\n }\n\n const typeIndex = await this.loadTypeIndex({ create: true });\n\n if (typeIndex.registrations.some((registration) => registration.instanceContainer === remoteModel.url)) {\n return;\n }\n\n await container.register(typeIndex, registeredChildren);\n }\n\n private async loadChildren(model: SolidModel, childStatus?: JobStatus): Promise<void> {\n this.assertNotCancelled();\n\n if (!isContainer(model)) {\n return;\n }\n\n const children = await this.loadContainedModels(model, {\n status: childStatus,\n onDocumentError: (error) => this.handleDocumentError(error),\n onDocumentRead: (document) => {\n if (document.url.endsWith('/') || !document.updatedAt || document.url in this.documentsModifiedAt) {\n return;\n }\n\n this.documentsModifiedAt[document.url] = document.updatedAt;\n },\n onDocumentLoaded: async () => {\n this.assertNotCancelled();\n\n await this.updateProgress();\n },\n });\n\n for (let index = 0; index < children.length; index++) {\n const child = children[index] as SolidModel;\n\n if (child instanceof Tombstone) {\n this.tombstones.add(child);\n\n continue;\n }\n\n if (this.tombstones.hasKey(child.url)) {\n await this.deleteChild(model, child);\n\n continue;\n }\n\n await this.loadChildren(child, childStatus?.children?.[index]);\n\n if (childStatus?.children?.[index]) {\n await this.updateProgress(() => (required(childStatus.children?.[index]).completed = true));\n }\n }\n }\n\n private async deleteChild(model: SolidModel, child: SolidModel): Promise<void> {\n for (const relation of model.static('relations')) {\n const relationInstance = model.requireRelation(relation);\n\n if (!relationInstance.related) {\n continue;\n }\n\n if (Array.isArray(relationInstance.related)) {\n relationInstance.related = relationInstance.related.filter((relatedModel) => relatedModel !== child);\n\n continue;\n }\n\n if (relationInstance.related === child) {\n relationInstance.related = null;\n\n continue;\n }\n }\n\n await child.forceDelete();\n }\n\n private async saveModelAndChildren(model: SolidModel, status?: JobStatus): Promise<void> {\n this.assertNotCancelled();\n\n if (isRemoteModel(model) && model.isSoftDeleted()) {\n model.enableHistory();\n model.enableTombstone();\n\n await model.forceDelete();\n\n return;\n }\n\n if (this.documentsWithErrors.has(model.requireDocumentUrl())) {\n return;\n }\n\n const wasDirty = model.isDirty();\n\n await model.save();\n\n if (wasDirty || isRemoteModel(model)) {\n this.syncedModelUrls.add(model.url);\n }\n\n if (!isContainer(model)) {\n if (isRemoteModel(model)) {\n const documentUrl = model.requireDocumentUrl();\n const modifiedAt = this.documentsModifiedAt[documentUrl];\n\n if (modifiedAt) {\n await DocumentsCache.remember(documentUrl, modifiedAt);\n\n delete this.documentsModifiedAt[documentUrl];\n }\n }\n\n return;\n }\n\n const children = getContainerRelations(model.static())\n .map((relation) => model.getRelationModels(relation) ?? [])\n .flat();\n\n const childrenStatuses = status ? children.map(() => ({ completed: false })) : [];\n\n if (status) {\n status.children = childrenStatuses;\n }\n\n for (let index = 0; index < children.length; index++) {\n const child = children[index] as SolidModel;\n const childStatus = childrenStatuses[index];\n\n await this.saveModelAndChildren(child, childStatus);\n\n if (childStatus) {\n await this.updateProgress(() => (childStatus.completed = true));\n }\n }\n }\n\n private async synchronizeModels(remoteModels: ObjectsMap<SolidModel>): Promise<SolidModel[]> {\n const synchronizedModelUrls = new Set<string>();\n const deletedModels = new Set<SolidModel>();\n\n for (const remoteModel of remoteModels.items()) {\n if (remoteModel instanceof Tombstone) {\n const localModel = this.localModels.get(remoteModel.resourceUrl);\n\n if (localModel) {\n await localModel.forceDelete();\n\n deletedModels.add(localModel);\n }\n\n continue;\n }\n\n const localModel = getLocalModel(remoteModel, this.localModels);\n\n if (!localModel.exists()) {\n this.syncedModelUrls.add(localModel.url);\n }\n\n await this.loadChildren(localModel);\n await SolidModel.synchronize(localModel, remoteModel);\n await this.reconcileInconsistencies(localModel, remoteModel);\n await this.saveModelAndChildren(localModel);\n await this.addLocalModel(localModel);\n\n this.rootLocalModels.push(localModel);\n synchronizedModelUrls.add(localModel.url);\n }\n\n for (const localModel of this.rootLocalModels) {\n if (deletedModels.has(localModel) || synchronizedModelUrls.has(localModel.url)) {\n continue;\n }\n\n await this.loadChildren(localModel);\n\n const remoteModel = getRemoteModel(localModel, remoteModels);\n\n await SolidModel.synchronize(localModel, remoteModel);\n\n remoteModels.add(remoteModel);\n }\n\n const dirtyRemoteModels = [];\n\n for (const remoteModel of remoteModels.getItems()) {\n if (isDirtyOrHasDirtyChildren(remoteModel)) {\n dirtyRemoteModels.push(remoteModel);\n\n continue;\n }\n\n await this.rememberModelDocuments(remoteModel);\n }\n\n return dirtyRemoteModels;\n }\n\n private async reconcileInconsistencies(\n localModel: SolidModel,\n remoteModel: SolidModel,\n processedModels?: Set<SolidModel>,\n ): Promise<void> {\n localModel.rebuildAttributesFromHistory();\n localModel.setAttributes(remoteModel.getAttributes(true));\n\n processedModels ??= new Set();\n processedModels.add(localModel);\n\n for (const relation of getContainerRelations(localModel.static())) {\n await this.synchronizeContainerDocuments(\n localModel.requireRelation<SolidContainsRelation>(relation),\n remoteModel.requireRelation<SolidContainsRelation>(relation),\n );\n }\n\n const remoteRelatedModels = map(getRelatedAppModels(remoteModel), 'url');\n\n for (const localRelatedModel of getRelatedAppModels(localModel)) {\n if (\n processedModels.has(localRelatedModel) ||\n !localRelatedModel.isRelationLoaded('operations') ||\n !remoteRelatedModels.hasKey(localRelatedModel.url)\n ) {\n continue;\n }\n\n await this.reconcileInconsistencies(\n localRelatedModel,\n remoteRelatedModels.require(localRelatedModel.url),\n processedModels,\n );\n }\n\n if (localModel.isDirty()) {\n await SolidModel.synchronize(localModel, remoteModel);\n }\n }\n\n private async synchronizeContainerDocuments(\n localRelation: SolidContainsRelation,\n remoteRelation: SolidContainsRelation,\n ): Promise<void> {\n const localModels = map(localRelation.related ?? [], 'url');\n const remoteModels = map(remoteRelation.related ?? [], 'url');\n const newLocalModelUrls = localModels\n .getKeys()\n .filter((url) => !remoteModels.hasKey(url) && !remoteModels.hasKey(encodeURI(url)));\n const newRemoteModelUrls = remoteModels\n .getKeys()\n .filter((url) => !localModels.hasKey(url) && !localModels.hasKey(encodeURI(url)));\n\n for (const url of newLocalModelUrls) {\n const localModel = localModels.require(url);\n const remoteModel = cloneLocalModel(localModel);\n\n remoteRelation.addRelated(remoteModel);\n remoteModels.add(remoteModel);\n }\n\n for (const url of newRemoteModelUrls) {\n const remoteModel = remoteModels.require(url);\n const localModel = cloneRemoteModel(remoteModel);\n\n localRelation.addRelated(localModel);\n localModels.add(localModel);\n this.syncedModelUrls.add(localModel.url);\n }\n\n for (const localModel of localModels.items()) {\n const remoteModel = remoteModels.require(localModel.url);\n\n await SolidModel.synchronize(localModel, remoteModel);\n await this.saveModelAndChildren(localModel);\n }\n }\n\n private async rememberModelDocuments(model: SolidModel): Promise<void> {\n if (!isContainer(model)) {\n const documentUrl = model.requireDocumentUrl();\n const modifiedAt = this.documentsModifiedAt[documentUrl];\n\n if (modifiedAt) {\n await DocumentsCache.remember(documentUrl, modifiedAt);\n\n delete this.documentsModifiedAt[documentUrl];\n }\n\n return;\n }\n\n const children = getContainerRelations(model.static())\n .map((relation) => model.getRelationModels(relation) ?? [])\n .flat();\n\n for (const child of children) {\n await this.rememberModelDocuments(child);\n }\n }\n\n private async ignoringDocumentErrors(operation: Function): Promise<void> {\n try {\n await operation();\n } catch (error) {\n this.handleDocumentError(error);\n }\n }\n\n private handleDocumentError(error: unknown): void {\n if (isInstanceOf(error, MalformedSolidDocumentError)) {\n // eslint-disable-next-line no-console\n console.warn(error.message);\n\n error.documentUrl && this.documentsWithErrors.add(error.documentUrl);\n\n return;\n }\n\n if (isInstanceOf(error, InvalidModelAttributes)) {\n // eslint-disable-next-line no-console\n console.warn(error.message);\n\n const primaryKey = error.attributes[requireBootedModel(error.modelName).primaryKey];\n const documentUrl = primaryKey && urlRoute(toString(primaryKey));\n\n documentUrl && this.documentsWithErrors.add(documentUrl);\n\n return;\n }\n\n throw error;\n }\n\n}\n","import { defineServiceState, replaceExisting, translateWithDefault } from '@aerogel/core';\nimport { Solid } from '@aerogel/plugin-solid';\nimport type { ErrorSource } from '@aerogel/core';\nimport type { Nullable } from '@noeldemartin/utils';\nimport type { SolidModelConstructor, SolidSchemaDefinition } from 'soukai-solid';\n\nimport Migrate from '@aerogel/plugin-local-first/jobs/Migrate';\nimport type Sync from '@aerogel/plugin-local-first/jobs/Sync';\n\nexport const CloudStatus = {\n Disconnected: 'disconnected',\n Online: 'online',\n Syncing: 'syncing',\n Migrating: 'migrating',\n} as const;\n\nexport interface ModelRegistration {\n modelClass: SolidModelConstructor;\n path?: string;\n}\n\nexport type TCloudStatus = (typeof CloudStatus)[keyof typeof CloudStatus];\n\nexport default defineServiceState({\n name: 'cloud',\n persist: [\n 'localModelUpdates',\n 'migrationDismissed',\n 'migrationJob',\n 'modelCollections',\n 'pollingEnabled',\n 'pollingMinutes',\n 'ready',\n 'startupSync',\n ],\n initialState: () => ({\n autoPush: true,\n localModelUpdates: {} as Record<string, number>,\n migrationDismissed: false,\n migrationJob: null as Nullable<Migrate>,\n migrationPostponed: false,\n modelCollections: {} as Record<string, string[]>,\n pollingEnabled: true,\n pollingMinutes: 10,\n ready: false,\n registeredModels: [] as ModelRegistration[],\n schemaMigrations: new Map<SolidModelConstructor, SolidModelConstructor | SolidSchemaDefinition>(),\n setupDismissed: false,\n setupOngoing: false,\n startupSync: true,\n status: CloudStatus.Disconnected as TCloudStatus,\n syncError: null as Nullable<ErrorSource>,\n syncJob: null as Nullable<Sync>,\n }),\n serialize: (state) => replaceExisting(state, { migrationJob: state.migrationJob?.serialize() }),\n restore: (state) =>\n replaceExisting(state, {\n migrationJob: state.migrationJob && Migrate.restore(state.migrationJob),\n }),\n watch: {\n migrationJob(migrationJob) {\n migrationJob?.listeners.add({ onUpdated: () => this.updatePersistedState('migrationJob') });\n },\n },\n computed: {\n disconnected: ({ status }) => status === CloudStatus.Disconnected,\n online: ({ status }) => status === CloudStatus.Online,\n syncing: ({ status }) => status === CloudStatus.Syncing,\n migrating: ({ status }) => status === CloudStatus.Migrating,\n localChanges({ localModelUpdates }) {\n return Object.values(localModelUpdates).reduce((total, count) => total + count, 0);\n },\n dirty(): boolean {\n return this.localChanges > 0;\n },\n migrationStarted({ migrationJob }): boolean {\n return !!migrationJob;\n },\n migrationDisabledReason({ status, ready }): string | null {\n if (!Solid.isLoggedIn()) {\n return translateWithDefault(\n 'cloud.migrationNotLoggedIn',\n 'You need to reconnect before starting the migration',\n );\n }\n\n if (!ready) {\n return translateWithDefault(\n 'cloud.migrationNotReady',\n 'You need to backup your data before starting the migration',\n );\n }\n\n if (status === CloudStatus.Syncing || status === CloudStatus.Migrating) {\n return translateWithDefault(\n 'cloud.migrationNotSyncing',\n 'Wait for syncing to finish before starting the migration',\n );\n }\n\n if (!this.online) {\n return translateWithDefault(\n 'cloud.migrationNotOnline',\n 'You need to be online in order to start the migration',\n );\n }\n\n return null;\n },\n },\n});\n","import {\n Semaphore,\n after,\n facade,\n fail,\n getLocationQueryParameter,\n hasLocationQueryParameter,\n isArray,\n isTesting,\n parseBoolean,\n} from '@noeldemartin/utils';\nimport { Errors, Events, dispatch, translateWithDefault } from '@aerogel/core';\nimport { Solid } from '@aerogel/plugin-solid';\nimport { SolidContainer, SolidModel, Tombstone, isContainer, isContainerClass, isSolidModel } from 'soukai-solid';\nimport { getTrackedModels, trackModels, trackModelsCollection } from '@aerogel/plugin-soukai';\nimport { watchEffect } from 'vue';\nimport { getBootedModels } from 'soukai';\nimport type { Authenticator } from '@aerogel/plugin-solid';\nimport type { Engine } from 'soukai';\nimport type { JobListener } from '@aerogel/core';\nimport type { SolidContainsRelation, SolidModelConstructor, SolidSchemaDefinition } from 'soukai-solid';\n\nimport {\n clearLocalModelUpdates,\n createRemoteModel,\n getLocalModels,\n getRemoteClass,\n getRemoteContainersCollection,\n updateRemoteModel,\n} from '@aerogel/plugin-local-first/lib/mirroring';\nimport Backup from '@aerogel/plugin-local-first/jobs/Backup';\nimport DocumentsCache from '@aerogel/plugin-local-first/services/DocumentsCache';\nimport Migrate from '@aerogel/plugin-local-first/jobs/Migrate';\nimport Sync from '@aerogel/plugin-local-first/jobs/Sync';\nimport SyncQueue from '@aerogel/plugin-local-first/lib/SyncQueue';\nimport {\n getContainedModels,\n getContainerRelations,\n getRelatedClasses,\n} from '@aerogel/plugin-local-first/lib/inference';\n\nimport Service, { CloudStatus } from './Cloud.state';\n\nexport interface RegisterOptions {\n path?: string;\n}\n\nexport interface SyncOptions extends JobListener {\n model?: SolidModel;\n models?: SolidModel[];\n refreshUserProfile?: boolean;\n syncDirty?: boolean;\n}\n\nexport class CloudService extends Service {\n\n protected asyncLock: Semaphore = new Semaphore();\n protected engine: Engine | null = null;\n protected pollingInterval: NodeJS.Timeout | null = null;\n\n public async whenReady<T>(callback: () => T): Promise<T> {\n if (this.ready) {\n return callback();\n }\n\n return new Promise((resolve) => {\n const onReady = () => resolve(callback());\n\n Events.once('cloud:ready', onReady);\n });\n }\n\n public async setup(modelUrlMappings?: WeakMap<SolidModelConstructor, Record<string, string>>): Promise<void> {\n this.setupOngoing = true;\n\n try {\n await this.backup(modelUrlMappings);\n await this.setReady(true);\n await this.sync();\n } finally {\n this.setupOngoing = false;\n }\n }\n\n public dismissSetup(): void {\n this.setupDismissed = true;\n }\n\n public dismissMigration(): void {\n this.migrationDismissed = true;\n }\n\n public postponeMigration(): void {\n this.migrationPostponed = true;\n }\n\n public async syncIfOnline(options?: SyncOptions): Promise<void>;\n public async syncIfOnline(model: SolidModel): Promise<void>;\n public async syncIfOnline(models: SolidModel[]): Promise<void>;\n public async syncIfOnline(config: SyncOptions | SolidModel | SolidModel[] = {}): Promise<void> {\n if (!this.online) {\n return;\n }\n\n await this.sync(config as SyncOptions);\n }\n\n public async sync(options?: SyncOptions): Promise<void>;\n public async sync(model: SolidModel): Promise<void>;\n public async sync(models: SolidModel[]): Promise<void>;\n public async sync(config: SyncOptions | SolidModel | SolidModel[] = {}): Promise<void> {\n const options = isArray(config)\n ? { models: config }\n : config instanceof SolidModel\n ? { model: config }\n : config;\n\n if (!Solid.isLoggedIn() || !this.ready || !this.online) {\n return;\n }\n\n await this.asyncLock.run(async () => {\n let models = options.model ? [options.model] : options.models;\n const start = Date.now();\n\n this.syncError = null;\n this.status = CloudStatus.Syncing;\n\n SyncQueue.clear(models);\n\n try {\n await Events.emit('cloud:sync-started', models);\n\n if (options.refreshUserProfile) {\n await Solid.refreshUserProfile();\n }\n\n const syncDirty = options.syncDirty ?? true;\n let syncs = 0;\n\n do {\n this.syncJob = new Sync(models);\n\n this.syncJob.listeners.add(options);\n\n await dispatch(this.syncJob);\n\n if (this.syncJob.cancelled) {\n return;\n }\n\n syncs++;\n models = this.getDirtyLocalModels().filter(\n (model) => !this.syncJob?.documentsWithErrors.has(model.requireDocumentUrl()),\n );\n } while (syncDirty && models.length > 0 && syncs < 3);\n\n if (!isTesting('unit')) {\n await after({ milliseconds: Math.max(500, 1000 - (Date.now() - start)) });\n }\n\n this.syncJob = null;\n } catch (error) {\n if (isTesting()) {\n throw error;\n }\n\n this.syncJob = null;\n this.syncError = error;\n\n await Errors.report(error, translateWithDefault('cloud.syncFailed', 'Sync failed'));\n } finally {\n this.status = CloudStatus.Online;\n\n await Events.emit('cloud:sync-completed', models);\n }\n });\n }\n\n public shouldMigrate(): boolean {\n return this.schemaMigrations.size > 0;\n }\n\n public async migrate(listener?: JobListener): Promise<void> {\n if (!this.online || !Solid.isLoggedIn() || !this.ready) {\n throw new Error('Data cannot be migrated at the moment');\n }\n\n if (!this.shouldMigrate()) {\n return;\n }\n\n await this.asyncLock.run(async () => {\n this.status = CloudStatus.Migrating;\n this.migrationJob ??= new Migrate();\n\n const start = Date.now();\n const removeListeners: Function[] = [];\n const models = (this.migrationJob.models ??= getLocalModels());\n\n SyncQueue.clear(models);\n\n try {\n listener && removeListeners.push(this.migrationJob.listeners.add(listener));\n\n await Events.emit('cloud:migration-started', models);\n await dispatch(this.migrationJob);\n\n if (this.migrationJob.cancelled) {\n await Events.emit('cloud:migration-cancelled', models);\n\n return;\n }\n\n this.migrationJob = null;\n this.migrationDismissed = false;\n this.migrationPostponed = false;\n\n await after({ milliseconds: Math.max(0, 1000 - (Date.now() - start)) });\n await Events.emit('cloud:migration-completed', models);\n } catch (error) {\n await Errors.report(error, translateWithDefault('cloud.migrationFailed', 'Migration failed'));\n } finally {\n this.status = CloudStatus.Online;\n\n removeListeners.forEach((removeListener) => removeListener?.());\n }\n });\n }\n\n public async register(modelClass: SolidModelConstructor, options: RegisterOptions = {}): Promise<void> {\n if (this.registeredModels.find((registered) => modelClass === registered.modelClass)) {\n return;\n }\n\n const engine = this.engine;\n\n if (engine) {\n getRelatedClasses(modelClass).forEach((relatedClass) => getRemoteClass(relatedClass).setEngine(engine));\n }\n\n this.whenReady(() => {\n const [existingCollection] = this.modelCollections[modelClass.modelName] ?? [];\n\n modelClass.useSoftDeletes(true);\n\n modelClass.collection = existingCollection ?? getRemoteContainersCollection(modelClass, options.path);\n });\n\n await trackModels(modelClass, {\n created: (model) => this.ready && createRemoteModel(model),\n updated: (model) => this.ready && updateRemoteModel(model),\n deleted: (model) =>\n this.ready && clearLocalModelUpdates(new Set([model.url ?? model.getDeletedPrimaryKey()])),\n });\n\n if (isContainerClass(modelClass)) {\n getContainerRelations(modelClass).forEach((relation) => {\n const relatedClass = modelClass\n .instance()\n .requireRelation<SolidContainsRelation>(relation).relatedClass;\n\n relatedClass.on('created', (model) => this.ready && createRemoteModel(model));\n relatedClass.on('updated', (model) => this.ready && updateRemoteModel(model));\n relatedClass.on(\n 'deleted',\n (model) =>\n this.ready && clearLocalModelUpdates(new Set([model.url ?? model.getDeletedPrimaryKey()])),\n );\n });\n }\n\n this.registeredModels.push({ modelClass, path: options.path });\n\n for (const collection of this.modelCollections[modelClass.modelName] ?? []) {\n await trackModelsCollection(modelClass, collection);\n }\n }\n\n public registerSchemaMigration(\n modelClass: SolidModelConstructor,\n schema: SolidModelConstructor | SolidSchemaDefinition,\n ): void {\n this.schemaMigrations.set(modelClass, schema);\n }\n\n public requireRemoteCollection(modelClass: SolidModelConstructor): string {\n for (const registration of this.registeredModels) {\n if (modelClass !== registration.modelClass) {\n continue;\n }\n\n return getRemoteContainersCollection(registration.modelClass, registration.path);\n }\n\n throw new Error(`Failed resolving remote collection for '${modelClass.modelName}' model`);\n }\n\n protected override async boot(): Promise<void> {\n await Solid.booted;\n\n Solid.isLoggedIn() && this.login(Solid.authenticator);\n\n Events.on('auth:login', ({ authenticator }) => this.login(authenticator));\n Events.on('auth:logout', () => this.logout());\n Events.once('application-ready', () => this.onApplicationReady());\n Events.once('application-mounted', () => this.onApplicationMounted());\n\n watchEffect(() => {\n this.pollingInterval && clearInterval(this.pollingInterval);\n\n if (!this.pollingEnabled || this.migrationJob) {\n this.pollingInterval = null;\n\n return;\n }\n\n this.pollingInterval = setInterval(() => this.sync(), this.pollingMinutes * 60 * 1000);\n });\n\n await this.bustDocumentsCache();\n await this.registerModels();\n }\n\n protected getDirtyLocalModels(): SolidModel[] {\n const urls = Object.keys(this.localModelUpdates);\n const dirtyLocalModels = [];\n\n for (const { modelClass } of this.registeredModels) {\n for (const model of getTrackedModels(modelClass, { includeSoftDeleted: true })) {\n dirtyLocalModels.push(...this.getModelsIn(urls, model));\n }\n }\n\n return dirtyLocalModels;\n }\n\n protected getModelsIn(urls: string[], model: SolidModel): SolidModel[] {\n const models = [];\n\n if (urls.includes(model.url)) {\n models.push(model);\n }\n\n if (isContainer(model)) {\n models.push(\n ...getContainedModels(model)\n .map((containedModel) => this.getModelsIn(urls, containedModel))\n .flat(),\n );\n }\n\n return models;\n }\n\n protected requireEngine(): Engine {\n return this.engine ?? fail('Could not get required Engine');\n }\n\n protected async setReady(ready: boolean): Promise<void> {\n if (this.ready || !ready) {\n return;\n }\n\n await Events.emit('cloud:ready');\n\n this.ready = true;\n }\n\n protected async backup(modelUrlMappings?: WeakMap<SolidModelConstructor, Record<string, string>>): Promise<void> {\n await Events.emit('cloud:backup-started');\n\n modelUrlMappings ??= new WeakMap();\n\n const job = new Backup();\n\n for (const { modelClass, path } of this.registeredModels) {\n if (!isContainerClass(modelClass)) {\n continue;\n }\n\n for (const [local, remote] of Object.entries(modelUrlMappings.get(modelClass) ?? {})) {\n job.migrateUrl(modelClass, local, remote);\n }\n\n const localCollection = modelClass.collection;\n const remoteCollection = getRemoteContainersCollection(modelClass, path);\n\n modelClass.collection = remoteCollection;\n\n job.migrateCollection(modelClass, localCollection, remoteCollection);\n }\n\n await dispatch(job);\n await Events.emit('cloud:backup-completed');\n }\n\n protected async onApplicationReady(): Promise<void> {\n if (this.ready || !Solid.isLoggedIn()) {\n return;\n }\n\n await this.setReady(!getLocalModels().some((model) => model.url.startsWith('solid://')));\n }\n\n protected async onApplicationMounted(): Promise<void> {\n if (!this.syncOnStartup()) {\n return;\n }\n\n await this.sync();\n }\n\n protected login(authenticator: Authenticator): void {\n const relatedClasses = [...this.registeredModels]\n .map(({ modelClass }) => getRelatedClasses(modelClass))\n .flat()\n .concat([Tombstone]);\n\n this.status = CloudStatus.Online;\n this.engine = authenticator.engine;\n\n getRemoteClass(SolidContainer).setEngine(this.engine);\n\n for (const relatedClass of relatedClasses) {\n getRemoteClass(relatedClass).setEngine(this.engine);\n }\n }\n\n protected logout(): void {\n this.setState({\n autoPush: true,\n localModelUpdates: {},\n migrationDismissed: false,\n migrationJob: null,\n migrationPostponed: false,\n modelCollections: {},\n pollingEnabled: true,\n pollingMinutes: 10,\n ready: false,\n schemaMigrations: new Map(),\n setupDismissed: false,\n setupOngoing: false,\n startupSync: true,\n status: CloudStatus.Disconnected,\n syncError: null,\n syncJob: null,\n });\n }\n\n private syncOnStartup(): boolean {\n if (hasLocationQueryParameter('startupSync')) {\n return parseBoolean(getLocationQueryParameter('startupSync'));\n }\n\n if (this.migrationJob) {\n return false;\n }\n\n return this.startupSync;\n }\n\n private async bustDocumentsCache(): Promise<void> {\n if (\n !hasLocationQueryParameter('bustDocumentsCache') ||\n !parseBoolean(getLocationQueryParameter('bustDocumentsCache'))\n ) {\n return;\n }\n\n await DocumentsCache.booted;\n await DocumentsCache.clear();\n }\n\n private async registerModels(): Promise<void> {\n const models = getBootedModels();\n\n for (const model of models.values()) {\n if (!isSolidModel(model) || !model.cloud) {\n continue;\n }\n\n await this.register(model, typeof model.cloud === 'boolean' ? {} : model.cloud);\n }\n }\n\n}\n\nexport default facade(CloudService);\n\ndeclare module '@aerogel/core' {\n export interface EventsPayload {\n 'cloud:ready': void;\n 'cloud:backup-started': void;\n 'cloud:backup-completed': void;\n 'cloud:migration-started': SolidModel[];\n 'cloud:migration-cancelled': SolidModel[];\n 'cloud:migration-completed': SolidModel[];\n 'cloud:sync-started': SolidModel[] | undefined;\n 'cloud:sync-completed': SolidModel[] | undefined;\n }\n}\n\ndeclare module 'soukai-solid' {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n namespace SolidModel {\n export const cloud: boolean | RegisterOptions | undefined;\n }\n}\n","<template>\n <details v-if=\"!$solid.hasLoggedIn()\" class=\"mt-4\">\n <summary>\n <span class=\"text-base font-semibold\">{{ $td('settings.dangerZone', 'Danger zone') }}</span>\n </summary>\n <Button variant=\"danger\" class=\"mt-4\" @click=\"purgeData()\">\n <IconTrash class=\"size-4\" />\n <span class=\"ml-1\">{{ $td('settings.purge', 'Purge data') }}</span>\n </Button>\n </details>\n</template>\n\n<script setup lang=\"ts\">\nimport IconTrash from '~icons/zondicons/trash';\n\nimport { Button, Storage, UI, translateWithDefault } from '@aerogel/core';\n\nimport AccountLoginModal from '@aerogel/plugin-local-first/components/AccountLoginModal.vue';\n\nasync function purgeData(): Promise<void> {\n const confirmed = await UI.confirm(\n translateWithDefault('settings.purgeConfirmTitle', 'Delete everything?'),\n translateWithDefault(\n 'settings.purgeConfirmMessage',\n 'If you proceed, all your data will be deleted forever. ' +\n 'If you want to save it before wiping this device, ' +\n 'you can [connect to your Solid account](#action:connect) first.',\n ),\n {\n acceptVariant: 'danger',\n acceptText: translateWithDefault('settings.purgeConfirmAccept', 'Purge data'),\n actions: { connect: () => UI.modal(AccountLoginModal) },\n },\n );\n\n if (!confirmed) {\n return;\n }\n\n await UI.closeAllModals();\n await Storage.purge();\n}\n</script>\n","import { defineSettings } from '@aerogel/core';\n\nimport PurgeData from './PurgeData.vue';\n\nexport default defineSettings([\n {\n priority: 0,\n component: PurgeData,\n },\n]);\n","<template>\n <Modal\n ref=\"$modalRef\"\n title-hidden\n close-hidden\n :title=\"$td('account.title', 'Account')\"\n >\n <div class=\"relative flex items-center rounded-md bg-gray-100 p-4 pr-12\">\n <SolidAvatar class=\"mr-2 size-16 shrink-0\" />\n <div class=\"flex flex-col overflow-hidden\">\n <span class=\"font-semibold\">{{ $solid.user?.name ?? $td('user.anonymous', 'Anonymous') }}</span>\n <Link :href=\"$solid.user?.webId\" class=\"mt-0.5 truncate text-sm font-light text-gray-500\">\n {{ $solid.user?.webId }}\n </Link>\n </div>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n class=\"absolute top-1 right-1 hover:bg-gray-200\"\n :aria-label=\"$td('user.settings', 'Settings')\"\n :title=\"$td('user.settings', 'Settings')\"\n @click=\"$ui.modal(SettingsModal)\"\n >\n <IconCog class=\"size-5\" />\n </Button>\n </div>\n\n <div class=\"px-2\">\n <div v-if=\"$cloud.syncing\" class=\"mt-4 flex items-center gap-2\">\n <IconRefresh class=\"mt-0.5 size-6 shrink-0 animate-spin self-start text-green-500\" />\n <div class=\"flex w-full flex-col\">\n <Markdown lang-key=\"cloud.info.syncing\" lang-default=\"Synchronizing...\" />\n <ProgressBar v-if=\"$cloud.syncJob\" :job=\"$cloud.syncJob\" filled-class=\"bg-green-500\" />\n </div>\n </div>\n <div v-else-if=\"$solid.loginOngoing\" class=\"mt-4 flex items-center gap-2\">\n <IconRefresh class=\"mt-0.5 size-6 shrink-0 animate-spin self-start text-green-500\" />\n <Markdown lang-key=\"cloud.info.reconnecting\" lang-default=\"Reconnecting...\" />\n </div>\n <div v-else-if=\"error\" class=\"mt-4 flex items-center gap-2\">\n <IconWarning class=\"mt-0.5 size-6 shrink-0 self-start text-red-500\" />\n <div>\n <Markdown :text=\"errorDescription\" />\n <Link\n v-if=\"showErrorDetails\"\n class=\"text-sm text-red-700 opacity-50 hover:opacity-75 focus-visible:opacity-75\"\n @click=\"$errors.inspect(error)\"\n >\n {{ $td('errors.viewDetails', 'View details') }}\n </Link>\n </div>\n </div>\n <div v-else-if=\"!$cloud.ready\" class=\"mt-4 flex items-center gap-2\">\n <IconWarning class=\"mt-0.5 size-6 shrink-0 self-start text-yellow-500\" />\n <Markdown lang-key=\"cloud.info.setup\" lang-default=\"Your data is not backed up yet.\" />\n </div>\n <div v-else-if=\"$cloud.dirty\" class=\"mt-4 flex items-center gap-2\">\n <IconWarning class=\"mt-0.5 size-6 shrink-0 self-start text-yellow-500\" />\n <Markdown\n lang-key=\"cloud.info.changes\"\n lang-default=\"Everything is up to date. | There is one local change. | There are {n} local changes.\"\n :lang-params=\"$cloud.localChanges\"\n />\n </div>\n <div v-else-if=\"$cloud.online\" class=\"mt-4 flex items-center gap-2\">\n <IconCheckmarkOutline class=\"mt-0.5 size-6 shrink-0 self-start text-green-500\" />\n <Markdown lang-key=\"cloud.info.changes\" lang-default=\"Everything is up to date.\" :lang-params=\"0\" />\n </div>\n <div v-else class=\"mt-4 flex items-center gap-2\">\n <IconWarning class=\"mt-0.5 size-6 shrink-0 self-start text-yellow-500\" />\n <Markdown\n lang-key=\"cloud.info.disconnected\"\n lang-default=\"You are disconnected from your Solid account, all the changes you make will remain in your device.\"\n />\n </div>\n <AdvancedOptions class=\"mt-2\">\n <ul class=\"flex flex-col gap-2\">\n <li>\n <Checkbox\n v-model=\"$solid.autoReconnect\"\n label-class=\"text-base\"\n :label=\"$td('cloud.advanced.reconnect', 'Reconnect on startup')\"\n />\n </li>\n <li>\n <Checkbox\n v-model=\"$cloud.startupSync\"\n label-class=\"text-base\"\n :label=\"$td('cloud.advanced.startupSync', 'Synchronize on startup')\"\n />\n </li>\n <li>\n <Checkbox v-model=\"$cloud.pollingEnabled\" label-class=\"text-base\">\n <div class=\"flex items-center\">\n <span aria-hidden=\"true\">{{ pollingText[0] }}</span>\n <EditableContent\n type=\"number\"\n :text=\"`${$cloud.pollingMinutes}`\"\n :aria-label=\"\n $td('cloud.advanced.pollingMinutes', 'Synchronization interval (in minutes)')\n \"\n class=\"focus-within:border-primary-600 mx-1 -mb-px border-b\"\n @update=\"$cloud.pollingMinutes = $event as number\"\n >\n {{ $cloud.pollingMinutes }}\n </EditableContent>\n <span v-if=\"pollingText.length > 1\" aria-hidden=\"true\">{{ pollingText[1] }}</span>\n </div>\n </Checkbox>\n </li>\n </ul>\n </AdvancedOptions>\n </div>\n\n <div v-if=\"!$solid.loginOngoing\" class=\"mt-4 flex flex-row-reverse justify-start gap-2\">\n <Button\n v-if=\"$cloud.syncing\"\n variant=\"secondary\"\n :disabled=\"cancellingSync\"\n @click=\"cancelSync()\"\n >\n <IconStop class=\"size-5\" />\n <span>{{\n cancellingSync ? $td('cloud.stopping', 'Stopping...') : $td('cloud.stop', 'Stop synchronization')\n }}</span>\n </Button>\n <Button v-else-if=\"!$solid.isLoggedIn()\" @click=\"$solid.reconnect({ force: true })\">\n <IconRefresh class=\"size-5\" />\n <span>{{ $td('cloud.reconnect', 'Reconnect') }}</span>\n </Button>\n <Button v-else-if=\"$cloud.ready\" @click=\"$cloud.sync({ refreshUserProfile: true })\">\n <IconRefresh class=\"size-5\" />\n <span>{{ $td('cloud.sync', 'Synchronize') }}</span>\n </Button>\n <Button v-else @click=\"(($cloud.setupDismissed = false), $modal?.close())\">\n <IconCloudUpload class=\"size-5\" />\n <span>{{ $td('cloud.setup.submit', 'Back up now') }}</span>\n </Button>\n <Button v-if=\"!$cloud.syncing\" variant=\"secondary\" @click=\"$solid.logout()\">\n <IconLogout class=\"size-5\" />\n <span>{{ $cloud.ready ? $td('cloud.logOut', 'Log out') : $td('cloud.disconnect', 'Disconnect') }}</span>\n </Button>\n </div>\n </Modal>\n</template>\n\n<script setup lang=\"ts\">\nimport IconCheckmarkOutline from '~icons/zondicons/checkmark-outline';\nimport IconCloudUpload from '~icons/ic/sharp-cloud-upload';\nimport IconCog from '~icons/zondicons/cog';\nimport IconLogout from '~icons/material-symbols/logout-rounded';\nimport IconRefresh from '~icons/zondicons/refresh';\nimport IconStop from '~icons/ic/baseline-stop';\nimport IconWarning from '~icons/ion/warning';\n\nimport {\n AdvancedOptions,\n Button,\n Checkbox,\n EditableContent,\n Link,\n Markdown,\n Modal,\n ProgressBar,\n SettingsModal,\n translateWithDefault,\n useEvent,\n} from '@aerogel/core';\nimport { computed, ref, useTemplateRef } from 'vue';\nimport { Solid, SolidAvatar } from '@aerogel/plugin-solid';\n\nimport Cloud from '@aerogel/plugin-local-first/services/Cloud';\n\nconst $modal = useTemplateRef('$modalRef');\nconst cancellingSync = ref(false);\nconst pollingText = translateWithDefault('cloud.advanced.polling', 'Synchronize every {minutes} minutes', {\n minutes: '%%separator%%',\n}).split('%%separator%%');\nconst error = computed(() => Solid.error ?? Cloud.syncError);\nconst errorDescription = computed(() => {\n if (!error.value) {\n return;\n }\n\n if (typeof error.value === 'string') {\n return error.value;\n }\n\n return translateWithDefault('cloud.info.error', 'There has been an error connecting.');\n});\nconst showErrorDetails = computed(() => error.value && typeof error.value !== 'string');\n\nasync function cancelSync() {\n if (!Cloud.syncJob) {\n return;\n }\n\n cancellingSync.value = true;\n\n await Promise.race([Cloud.syncJob.cancel(), Cloud.syncJob.completed]);\n\n cancellingSync.value = false;\n}\n\nuseEvent('auth:logout', () => $modal.value?.close());\n</script>\n","<template>\n <div class=\"relative size-12\">\n <button\n class=\"clickable focus-visible:outline-primary-600 flex size-full rounded-full focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n type=\"button\"\n :aria-label=\"$td('account.open', 'Open account')\"\n :title=\"$td('account.open', 'Open account')\"\n @click=\"$ui.modal(AccountModal)\"\n >\n <SolidAvatar class=\"size-full\" />\n <div\n v-if=\"accountStatus.loading\"\n class=\"absolute -inset-1 animate-spin rounded-full border-2 border-[currentColor_transparent] text-green-500\"\n />\n </button>\n <div\n class=\"pointer-events-none absolute right-0 bottom-0 size-3 rounded-full border-2 border-white\"\n :class=\"accountStatus.classes\"\n >\n <span class=\"sr-only\">{{ accountStatus.message }}</span>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Solid, SolidAvatar } from '@aerogel/plugin-solid';\nimport { translateWithDefault } from '@aerogel/core';\n\nimport Cloud from '@aerogel/plugin-local-first/services/Cloud';\nimport { CloudStatus } from '@aerogel/plugin-local-first/services/Cloud.state';\n\nimport AccountModal from './AccountModal.vue';\n\ninterface AccountStatus {\n classes: string;\n message: string;\n loading?: boolean;\n}\n\nconst accountStatus = computed((): AccountStatus => {\n if (Cloud.syncing || Solid.loginOngoing) {\n return {\n loading: true,\n classes: 'bg-green-500 sr-only',\n message: getAccountStatusMessage() ?? '',\n };\n }\n\n if (Solid.error || Cloud.syncError) {\n return {\n classes: 'bg-red-500',\n message: translateWithDefault('account.error', 'There has been an error connecting with your account.'),\n };\n }\n\n if (!Solid.isLoggedIn() || Cloud.dirty || !Cloud.ready) {\n return {\n classes: 'bg-yellow-500',\n message: translateWithDefault(\n 'account.dirty',\n 'There are local changes that haven\\'t been synchronized yet.',\n ),\n };\n }\n\n return {\n classes: 'bg-green-500',\n message: getAccountStatusMessage() ?? '',\n };\n});\n\nfunction getAccountStatusMessage(): string | undefined {\n switch (Cloud.status) {\n case CloudStatus.Syncing:\n return translateWithDefault('cloud.status.syncing', 'Synchronization in progress');\n case CloudStatus.Migrating:\n return translateWithDefault('cloud.status.migrating', 'Migration in progress');\n case CloudStatus.Online:\n return translateWithDefault('cloud.status.online', 'Online');\n case CloudStatus.Disconnected:\n return translateWithDefault('cloud.status.disconnected', 'Disconnected');\n }\n}\n</script>\n","import { App, bootServices } from '@aerogel/core';\nimport type { Plugin } from '@aerogel/core';\n\nimport Cloud from '@aerogel/plugin-local-first/services/Cloud';\nimport DocumentsCache from '@aerogel/plugin-local-first/services/DocumentsCache';\n\nimport settings from './components/settings';\n\nconst services = { $cloud: Cloud };\n\nexport { Cloud };\nexport * from './components';\nexport * from './services/Cloud';\n\nexport type LocalFirstServices = typeof services;\n\nexport default function localFirst(): Plugin {\n return {\n name: '@aerogel/local-first',\n async install(app) {\n settings.forEach((setting) => App.addSetting(setting));\n\n await bootServices(app, {\n ...services,\n $_documentsCache: DocumentsCache,\n });\n },\n };\n}\n\ndeclare module '@aerogel/core' {\n interface Services extends LocalFirstServices {}\n}\n"],"names":["DocumentsCacheService","Service","__publicField","IndexedDBMap","appNamespace","documentUrl","modifiedAt","meta","modifiedAtTime","Events","DocumentsCache","facade","containerRelations","getContainerRegisteredClasses","modelClass","arrayFilter","getContainerRelations","relation","relatedClass","isContainerClass","SolidModel","SolidContainsRelation","getContainedModels","model","models","getRelatedClasses","relatedClasses","instance","getRelatedAppModels","related","isInstanceOf","SolidACLAuthorization","SolidDocument","Metadata","Operation","SolidContainer","isDirtyOrHasDirtyChildren","relationHasDirtyModels","_a","relatedModel","Cloud","required","App","SyncQueue","after","operationOrPromise","promise","arrayRemove","children","isContainer","child","SyncQueue$1","remoteClasses","localClasses","cleanRemoteModelClone","remoteModel","relatedModels","fixRemoteModelClone","operations","operation","PropertyOperation","createRemoteModel","localModel","isRegisteredModelClass","trackModelsCollection","requireUrlParentDirectory","collection","trackSoukaiModelsCollection","updateRemoteModel","ignoreModelUpdates","modelUpdates","objectWithout","clearLocalModelUpdates","syncedModelUrls","documentsWithErrors","localModelUpdates","syncedModelUrlsArray","url","count","urlRoute","modelUrl","cloneLocalModel","options","localModelClasses","constructors","localClass","getRemoteClass","tap","cloneRemoteModel","remoteModelClasses","remoteClass","getLocalClass","completeRemoteModels","localModels","remoteModels","RemoteTombstone","Tombstone","remoteModelUrls","missingModelDocumentUrls","tombstones","_b","getLocalModel","getLocalModels","getTrackedModels","getSchemaMigrations","clearSchemaMigrations","getSchemaMigration","makeRemoteClass","getRemoteContainersCollection","path","rootStorage","Solid","containedClass","urlResolveDirectory","getRemoteModel","isRegisteredModel","registeredModel","isRemoteModel","isLocalModel","registeredModelClass","LocalClass","withLocalHistoryConfig","RemoteClass","attributes","exists","schema","bootModels","fail","Backup","Job","local","remote","engine","requireEngine","collections","documents","id","document","ignoreModelsCollection","key","value","lazy","getter","result","LoadsChildren","relationModels","arrayFrom","map","documentUrlChunks","arrayChunk","statusChildren","statusChildrenMap","documentUrls","documentChildren","documentTombstones","documentModels","childrenArray","onDocumentError","onDocumentRead","relationInstance","relatedLocalModels","relatedLocalModel","readDocument","documentModel","error","DocumentNotFound","typeIndexes","LoadsTypeIndex","user","TracksLocalModels","BaseJob","Migrate","mixed","status","job","childrenStatus","objectMap","modelStatuses","typeIndex","modelStatus","registeredClasses","registration","instanceContainer","migratedModel","migratedOperation","childStatus","isRootStatus","Sync","updateDocumentDate","headers","fallbackDate","date","clearListener","metadata","typedNavigator","Errors","lock","round","remoteModelsArray","index","pullStatus","registrations","container","processedContainerUrls","registeredModels","registeredChildren","childrenClass","rdfsClasses","rdfsClass","match","containerUrls","containerUrl","RemoteSolidContainer","wasDirty","childrenStatuses","synchronizedModelUrls","deletedModels","dirtyRemoteModels","processedModels","remoteRelatedModels","localRelatedModel","localRelation","remoteRelation","newLocalModelUrls","newRemoteModelUrls","MalformedSolidDocumentError","InvalidModelAttributes","primaryKey","requireBootedModel","toString","CloudStatus","defineServiceState","state","replaceExisting","migrationJob","total","ready","translateWithDefault","CloudService","Semaphore","callback","resolve","onReady","modelUrlMappings","config","isArray","start","syncDirty","syncs","dispatch","isTesting","listener","removeListeners","removeListener","registered","existingCollection","trackModels","authenticator","watchEffect","urls","dirtyLocalModels","containedModel","localCollection","remoteCollection","hasLocationQueryParameter","parseBoolean","getLocationQueryParameter","getBootedModels","isSolidModel","purgeData","UI","AccountLoginModal","Storage","settings","defineSettings","PurgeData","$modal","useTemplateRef","cancellingSync","ref","pollingText","computed","errorDescription","showErrorDetails","cancelSync","useEvent","accountStatus","getAccountStatusMessage","services","localFirst","app","setting","bootServices"],"mappings":"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"}
|