@bananapus/nana-sdk-core 2.38.2 → 2.40.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.
Files changed (89) hide show
  1. package/dist/cjs/review/heldWrite.d.ts +113 -0
  2. package/dist/cjs/review/heldWrite.d.ts.map +1 -0
  3. package/dist/cjs/review/heldWrite.js +569 -0
  4. package/dist/cjs/review/heldWrite.js.map +1 -0
  5. package/dist/cjs/review/index.d.ts +2 -0
  6. package/dist/cjs/review/index.d.ts.map +1 -1
  7. package/dist/cjs/review/index.js +2 -0
  8. package/dist/cjs/review/index.js.map +1 -1
  9. package/dist/cjs/review/messages.d.ts +30 -0
  10. package/dist/cjs/review/messages.d.ts.map +1 -1
  11. package/dist/cjs/review/messages.js +34 -1
  12. package/dist/cjs/review/messages.js.map +1 -1
  13. package/dist/cjs/review/react/HeldWritesNotice.d.ts +11 -0
  14. package/dist/cjs/review/react/HeldWritesNotice.d.ts.map +1 -0
  15. package/dist/cjs/review/react/HeldWritesNotice.js +22 -0
  16. package/dist/cjs/review/react/HeldWritesNotice.js.map +1 -0
  17. package/dist/cjs/review/react/index.d.ts +5 -0
  18. package/dist/cjs/review/react/index.d.ts.map +1 -0
  19. package/dist/cjs/review/react/index.js +21 -0
  20. package/dist/cjs/review/react/index.js.map +1 -0
  21. package/dist/cjs/review/react/useHeldWrite.d.ts +63 -0
  22. package/dist/cjs/review/react/useHeldWrite.d.ts.map +1 -0
  23. package/dist/cjs/review/react/useHeldWrite.js +107 -0
  24. package/dist/cjs/review/react/useHeldWrite.js.map +1 -0
  25. package/dist/cjs/review/react/useHeldWrites.d.ts +40 -0
  26. package/dist/cjs/review/react/useHeldWrites.d.ts.map +1 -0
  27. package/dist/cjs/review/react/useHeldWrites.js +95 -0
  28. package/dist/cjs/review/react/useHeldWrites.js.map +1 -0
  29. package/dist/cjs/review/react/useSavedAttempt.d.ts +54 -0
  30. package/dist/cjs/review/react/useSavedAttempt.d.ts.map +1 -0
  31. package/dist/cjs/review/react/useSavedAttempt.js +105 -0
  32. package/dist/cjs/review/react/useSavedAttempt.js.map +1 -0
  33. package/dist/cjs/review/savedAttempt.d.ts +180 -0
  34. package/dist/cjs/review/savedAttempt.d.ts.map +1 -0
  35. package/dist/cjs/review/savedAttempt.js +527 -0
  36. package/dist/cjs/review/savedAttempt.js.map +1 -0
  37. package/dist/cjs/review/writeHold.d.ts +94 -2
  38. package/dist/cjs/review/writeHold.d.ts.map +1 -1
  39. package/dist/cjs/review/writeHold.js +284 -43
  40. package/dist/cjs/review/writeHold.js.map +1 -1
  41. package/dist/cjs/review/writeRecovery.d.ts +58 -0
  42. package/dist/cjs/review/writeRecovery.d.ts.map +1 -1
  43. package/dist/cjs/review/writeRecovery.js +161 -2
  44. package/dist/cjs/review/writeRecovery.js.map +1 -1
  45. package/dist/esm/review/heldWrite.d.ts +113 -0
  46. package/dist/esm/review/heldWrite.d.ts.map +1 -0
  47. package/dist/esm/review/heldWrite.js +562 -0
  48. package/dist/esm/review/heldWrite.js.map +1 -0
  49. package/dist/esm/review/index.d.ts +2 -0
  50. package/dist/esm/review/index.d.ts.map +1 -1
  51. package/dist/esm/review/index.js +2 -0
  52. package/dist/esm/review/index.js.map +1 -1
  53. package/dist/esm/review/messages.d.ts +30 -0
  54. package/dist/esm/review/messages.d.ts.map +1 -1
  55. package/dist/esm/review/messages.js +32 -0
  56. package/dist/esm/review/messages.js.map +1 -1
  57. package/dist/esm/review/react/HeldWritesNotice.d.ts +11 -0
  58. package/dist/esm/review/react/HeldWritesNotice.d.ts.map +1 -0
  59. package/dist/esm/review/react/HeldWritesNotice.js +19 -0
  60. package/dist/esm/review/react/HeldWritesNotice.js.map +1 -0
  61. package/dist/esm/review/react/index.d.ts +5 -0
  62. package/dist/esm/review/react/index.d.ts.map +1 -0
  63. package/dist/esm/review/react/index.js +5 -0
  64. package/dist/esm/review/react/index.js.map +1 -0
  65. package/dist/esm/review/react/useHeldWrite.d.ts +63 -0
  66. package/dist/esm/review/react/useHeldWrite.d.ts.map +1 -0
  67. package/dist/esm/review/react/useHeldWrite.js +104 -0
  68. package/dist/esm/review/react/useHeldWrite.js.map +1 -0
  69. package/dist/esm/review/react/useHeldWrites.d.ts +40 -0
  70. package/dist/esm/review/react/useHeldWrites.d.ts.map +1 -0
  71. package/dist/esm/review/react/useHeldWrites.js +91 -0
  72. package/dist/esm/review/react/useHeldWrites.js.map +1 -0
  73. package/dist/esm/review/react/useSavedAttempt.d.ts +54 -0
  74. package/dist/esm/review/react/useSavedAttempt.d.ts.map +1 -0
  75. package/dist/esm/review/react/useSavedAttempt.js +102 -0
  76. package/dist/esm/review/react/useSavedAttempt.js.map +1 -0
  77. package/dist/esm/review/savedAttempt.d.ts +180 -0
  78. package/dist/esm/review/savedAttempt.d.ts.map +1 -0
  79. package/dist/esm/review/savedAttempt.js +524 -0
  80. package/dist/esm/review/savedAttempt.js.map +1 -0
  81. package/dist/esm/review/writeHold.d.ts +94 -2
  82. package/dist/esm/review/writeHold.d.ts.map +1 -1
  83. package/dist/esm/review/writeHold.js +285 -44
  84. package/dist/esm/review/writeHold.js.map +1 -1
  85. package/dist/esm/review/writeRecovery.d.ts +58 -0
  86. package/dist/esm/review/writeRecovery.d.ts.map +1 -1
  87. package/dist/esm/review/writeRecovery.js +160 -2
  88. package/dist/esm/review/writeRecovery.js.map +1 -1
  89. package/package.json +16 -2
@@ -0,0 +1,524 @@
1
+ import { SAVED_ATTEMPT_CHECK_LINE, SAVED_ATTEMPT_CHECK_WARNING, } from "./messages.js";
2
+ import { createBrowserWriteRecovery, createHeldWriteStorage, } from "./writeRecovery.js";
3
+ /** A call stand-in for an attempt saved without its call: the namespace finds the hold. */
4
+ const NO_CALL = {
5
+ to: "0x0000000000000000000000000000000000000000",
6
+ data: "0x",
7
+ };
8
+ const RETIRED_PREFIX = "nana-sdk:saved-attempt:retired:";
9
+ /** A success some tab's check proved for the attempt: no check or exit retires it. */
10
+ const SUCCESS_PREFIX = "nana-sdk:saved-attempt:success:";
11
+ /** How many times a check the hold moved under is evaluated again. */
12
+ const PASSES = 3;
13
+ const lower = (hash) => hash?.toLowerCase();
14
+ const reasonOf = (error) => error instanceof Error ? error.message : String(error);
15
+ /**
16
+ * Saved-attempt recovery over the app's write hold, framework-free: every
17
+ * app's launches, linked plans, shop updates and other saved writes recover
18
+ * the same way. Pass the hold's own `storage` and `locks` when it was made
19
+ * with custom ones; the defaults are the hold's defaults.
20
+ *
21
+ * - Recovery needs only what was saved: run it right after a saved attempt is
22
+ * found, before any fresh-send preparation.
23
+ * - Absence of evidence is `check`, never `none`: a missing hold record, a
24
+ * refused or unreadable adoption, an empty search and every exception.
25
+ * - A settled success always wins: it is never downgraded by a later failed
26
+ * or empty read, and it blocks discard until followed.
27
+ * - Only the user's exit, the user's check action, a followed settlement and
28
+ * the SDK's own drop of a rejected reservation retire an attempt, persisted under the hold's locks for every tab and
29
+ * reload, and only for the hold evidence they saw.
30
+ */
31
+ export function createSavedAttemptRecovery(options) {
32
+ const { hold, locks } = options;
33
+ const storage = options.storage ?? createHeldWriteStorage();
34
+ /** Retirements the warned exit kept in this tab while storage couldn't be read. */
35
+ const tabRetired = new Map();
36
+ /** Successes a check proved in this tab, kept whatever storage does: the warned exit never retires one. */
37
+ const tabProven = new Set();
38
+ function inputOf(attempt, namespace) {
39
+ return {
40
+ chainId: attempt.chainId,
41
+ account: attempt.account,
42
+ safe: attempt.safe ?? !!attempt.saved?.safeTxHash,
43
+ namespace,
44
+ call: attempt.call ?? NO_CALL,
45
+ };
46
+ }
47
+ function handlesOf(attempt) {
48
+ if (!attempt.namespaces.length)
49
+ throw new Error("A saved attempt names at least one namespace.");
50
+ return attempt.namespaces.map((namespace) => hold.open(inputOf(attempt, namespace)));
51
+ }
52
+ const scopeOf = (attempt) => JSON.stringify([
53
+ attempt.chainId,
54
+ attempt.account.toLowerCase(),
55
+ attempt.namespaces,
56
+ ]);
57
+ const retiredKey = (attempt) => `${RETIRED_PREFIX}${scopeOf(attempt)}`;
58
+ const successKey = (attempt) => `${SUCCESS_PREFIX}${scopeOf(attempt)}`;
59
+ /** `key`'s value, read strictly (a failed read throws) when `strict`. */
60
+ const readKey = (key, strict = false) => strict && storage.getItemStrict
61
+ ? storage.getItemStrict(key)
62
+ : storage.getItem(key);
63
+ /** The success a tab's check proved on exactly this hold evidence, if saved. */
64
+ function provenOf(attempt, evidence, strict = false) {
65
+ const saved = JSON.parse(readKey(successKey(attempt), strict) ?? "null");
66
+ return saved?.evidence === evidence
67
+ ? saved.hash
68
+ ? { hash: saved.hash }
69
+ : {}
70
+ : undefined;
71
+ }
72
+ /** What the hold shows of the attempt now, from storage: what a retirement is bound to. */
73
+ function evidenceOf(attempt, states) {
74
+ return JSON.stringify({
75
+ saved: lower(attempt.saved?.hash ?? attempt.saved?.safeTxHash) ?? null,
76
+ holds: states.map((state, index) => [
77
+ attempt.namespaces[index],
78
+ state.reservation ?? null,
79
+ state.status,
80
+ state.status === "clear" && state.settled && "hash" in state.settled
81
+ ? state.settled.hash.toLowerCase()
82
+ : null,
83
+ ]),
84
+ });
85
+ }
86
+ function retirementOf(attempt, evidence, strict = false) {
87
+ const key = retiredKey(attempt);
88
+ const saved = JSON.parse(tabRetired.get(key) ?? readKey(key, strict) ?? "null");
89
+ return saved?.evidence === evidence ? saved.by : undefined;
90
+ }
91
+ /** Successes and failures the hold settled for this attempt (never one from before it). */
92
+ function settlementsOf(attempt, states) {
93
+ const before = new Set((attempt.saved?.before ?? []).map(lower));
94
+ const success = [];
95
+ const failed = [];
96
+ for (const state of states) {
97
+ if (state.status !== "clear" || !state.settled)
98
+ continue;
99
+ if (!("hash" in state.settled))
100
+ continue;
101
+ const hash = lower(state.settled.hash);
102
+ if (before.has(hash))
103
+ continue;
104
+ (state.settled.result === "success" ? success : failed).push(hash);
105
+ }
106
+ return { success, failed };
107
+ }
108
+ function check(reason, evidence) {
109
+ return {
110
+ status: "check",
111
+ reason,
112
+ line: SAVED_ATTEMPT_CHECK_LINE,
113
+ warning: SAVED_ATTEMPT_CHECK_WARNING,
114
+ evidence,
115
+ };
116
+ }
117
+ /** The evidence the hold shows now, or "" (no check on it can be retired) when unreadable. */
118
+ function evidenceNow(attempt, handles) {
119
+ try {
120
+ return evidenceOf(attempt, handles.map((handle) => handle.peek()));
121
+ }
122
+ catch {
123
+ return "";
124
+ }
125
+ }
126
+ /**
127
+ * Recover one saved attempt: exactly one outcome, never a throw. Its
128
+ * inputs are only what was saved, so call it before preparing any new send.
129
+ */
130
+ async function recover(attempt, client) {
131
+ let outcome = await pass(attempt, client);
132
+ // A check the hold moved under (a settlement landed while the app's check
133
+ // ran) is evaluated again; one that keeps moving stays bound to what it saw.
134
+ for (let again = 0; again < PASSES - 1 && outcome.status === "check"; again++) {
135
+ let handles;
136
+ try {
137
+ handles = handlesOf(attempt);
138
+ }
139
+ catch {
140
+ break;
141
+ }
142
+ if (evidenceNow(attempt, handles) === outcome.evidence)
143
+ break;
144
+ outcome = await pass(attempt, client);
145
+ }
146
+ if (outcome.status === "done" && outcome.result === "success") {
147
+ if (outcome.authenticated)
148
+ await markProven(attempt, outcome.hash);
149
+ return outcome;
150
+ }
151
+ if (outcome.status !== "check")
152
+ return outcome;
153
+ // The warned exit retired it in this tab while storage couldn't be read.
154
+ const kept = JSON.parse(tabRetired.get(retiredKey(attempt)) ?? "null");
155
+ if (kept?.evidence === outcome.evidence &&
156
+ !tabProven.has(successKey(attempt)))
157
+ return { status: "none", retired: "check" };
158
+ // A success that settled while the passes ran, or that another tab's
159
+ // check proved, still wins, by its hash alone.
160
+ try {
161
+ const states = handlesOf(attempt).map((handle) => handle.peek());
162
+ const { success } = settlementsOf(attempt, states);
163
+ const proven = success.length
164
+ ? { hash: success[0] }
165
+ : provenOf(attempt, evidenceOf(attempt, states));
166
+ if (proven)
167
+ return {
168
+ status: "done",
169
+ result: "success",
170
+ authenticated: false,
171
+ ...proven,
172
+ reason: outcome.reason,
173
+ };
174
+ }
175
+ catch {
176
+ /* Unreadable: the check stands. */
177
+ }
178
+ return outcome;
179
+ }
180
+ /**
181
+ * Save that the app's check proved this attempt's success on the hold
182
+ * evidence now, so no tab's stale check or exit retires it. Under the
183
+ * namespaces' locks; a busy lock writes it anyway (it only ever refuses).
184
+ */
185
+ async function markProven(attempt, hash) {
186
+ tabProven.add(successKey(attempt));
187
+ try {
188
+ const write = async () => {
189
+ const value = JSON.stringify({
190
+ evidence: evidenceNow(attempt, handlesOf(attempt)),
191
+ ...(hash ? { hash: lower(hash) } : {}),
192
+ });
193
+ storage.setItem(successKey(attempt), value);
194
+ };
195
+ await underLocks(attempt, write).catch(write);
196
+ }
197
+ catch {
198
+ /* Unsaved: this tab's outcome still says done. */
199
+ }
200
+ }
201
+ async function pass(attempt, client) {
202
+ let evidence = "";
203
+ const reasons = [];
204
+ const prove = async (hash) => {
205
+ try {
206
+ const proof = await attempt.authenticate(hash);
207
+ if (proof?.result === "proven")
208
+ return proof;
209
+ reasons.push(proof?.reason ??
210
+ (proof?.result === "not-this"
211
+ ? "Its transaction is another write."
212
+ : "Its transaction could not be shown here."));
213
+ }
214
+ catch (error) {
215
+ reasons.push(reasonOf(error));
216
+ }
217
+ return undefined;
218
+ };
219
+ /** A settled success wins: shown as this attempt, or else followed by its hash alone; never a check. */
220
+ const followed = async (states) => {
221
+ const { success, failed } = settlementsOf(attempt, states);
222
+ for (const hash of success) {
223
+ const proof = await prove(hash);
224
+ if (proof)
225
+ return {
226
+ status: "done",
227
+ result: "success",
228
+ authenticated: true,
229
+ hash,
230
+ value: proof.value,
231
+ };
232
+ }
233
+ if (success.length) {
234
+ const saved = lower(attempt.saved?.hash);
235
+ const proof = saved && !success.includes(saved) ? await prove(saved) : undefined;
236
+ if (proof)
237
+ return {
238
+ status: "done",
239
+ result: "success",
240
+ authenticated: true,
241
+ hash: saved,
242
+ value: proof.value,
243
+ };
244
+ return {
245
+ status: "done",
246
+ result: "success",
247
+ authenticated: false,
248
+ hash: success[0],
249
+ reason: reasons.join(" "),
250
+ };
251
+ }
252
+ if (failed.length)
253
+ return { status: "done", result: "failed", hash: failed[0] };
254
+ return undefined;
255
+ };
256
+ try {
257
+ const handles = handlesOf(attempt);
258
+ const states = [];
259
+ for (const handle of handles) {
260
+ const state = await handle.state(client).catch(() => handle.peek());
261
+ if (state.status !== "clear")
262
+ return { status: "held", state, handle };
263
+ states.push(state);
264
+ }
265
+ // The snapshot evaluated is the one fingerprinted.
266
+ evidence = evidenceOf(attempt, states);
267
+ const retired = retirementOf(attempt, evidence);
268
+ if (retired &&
269
+ (retired === "settled" ||
270
+ (!settlementsOf(attempt, states).success.length &&
271
+ !provenOf(attempt, evidence))))
272
+ return { status: "none", retired };
273
+ const settled = await followed(states);
274
+ if (settled)
275
+ return settled;
276
+ const saved = attempt.saved ?? {};
277
+ const identity = saved.safeTxHash ?? saved.hash;
278
+ if (!identity) {
279
+ // Nothing reserved, and the app saved it as unsent; or every reservation
280
+ // dropped on a definite rejection (or an abort before the wallet opened).
281
+ if (saved.started === false &&
282
+ saved.nonce === undefined &&
283
+ saved.sentNonce === undefined &&
284
+ saved.fromBlock === undefined &&
285
+ saved.submittedAt === undefined &&
286
+ hold.durable() &&
287
+ states.every((state) => state.reservation === undefined) &&
288
+ provesUnreserved(attempt))
289
+ return { status: "none" };
290
+ // A reservation id names one attempt wherever it is mirrored: a
291
+ // rejection saved at any of its keys covers them all.
292
+ const rejected = new Set(attempt.namespaces.map((namespace) => createBrowserWriteRecovery(inputOf(attempt, namespace), {
293
+ storage,
294
+ locks,
295
+ }).rejectedReservation()));
296
+ if (states.some((state) => state.reservation !== undefined) &&
297
+ states.every((state) => state.reservation === undefined ||
298
+ rejected.has(state.reservation)) &&
299
+ readable(attempt))
300
+ return { status: "none", retired: "rejected" };
301
+ }
302
+ if (identity && attempt.call) {
303
+ // A saved hash the hold doesn't know: adopted against the exact call.
304
+ const adopted = await handles[0].adopt(states[0], {
305
+ ...(saved.safeTxHash
306
+ ? { safe: { safeTxHash: saved.safeTxHash } }
307
+ : { hash: saved.hash }),
308
+ nonce: saved.nonce,
309
+ sentNonce: saved.sentNonce,
310
+ fromBlock: saved.fromBlock,
311
+ submittedAt: saved.submittedAt,
312
+ }, client);
313
+ let state = adopted;
314
+ const declined = "declined" in adopted ? adopted.declined : undefined;
315
+ if (declined)
316
+ reasons.push(declined === "refused"
317
+ ? "Its saved transaction is not this write."
318
+ : "Its saved transaction could not be read.");
319
+ if (saved.safeTxHash &&
320
+ saved.safeNonce !== undefined &&
321
+ state.status !== "clear")
322
+ state = await handles[0].attachSafeNonce(client, {
323
+ safeTxHash: saved.safeTxHash,
324
+ nonce: saved.safeNonce,
325
+ });
326
+ if (state.status !== "clear")
327
+ return { status: "held", state, handle: handles[0] };
328
+ const after = await followed([state]);
329
+ if (after)
330
+ return after;
331
+ }
332
+ // No hold evidence: the app's own search of the saved transaction (or of the attempt).
333
+ const proof = await prove(saved.hash);
334
+ if (proof)
335
+ return {
336
+ status: "done",
337
+ result: "success",
338
+ authenticated: true,
339
+ ...(saved.hash ? { hash: saved.hash } : {}),
340
+ value: proof.value,
341
+ };
342
+ return check(reasons.join(" "), evidence);
343
+ }
344
+ catch (error) {
345
+ return check([...reasons, reasonOf(error)].join(" "), evidence);
346
+ }
347
+ }
348
+ /** Each namespace's write recovery, in one order by key. */
349
+ function journalsOf(attempt) {
350
+ if (!attempt.namespaces.length)
351
+ throw new Error("A saved attempt names at least one namespace.");
352
+ return attempt.namespaces
353
+ .map((namespace) => createBrowserWriteRecovery(inputOf(attempt, namespace), {
354
+ storage,
355
+ locks,
356
+ }))
357
+ .sort(
358
+ // The hold's own lock order.
359
+ (a, b) => Number(a.scopeKey > b.scopeKey) - Number(a.scopeKey < b.scopeKey));
360
+ }
361
+ /**
362
+ * Read every hold record, settlement and marker of the attempt fresh,
363
+ * throwing when any can't be read or parsed: the error-aware snapshot a
364
+ * retirement, a discard or a `none` decides on.
365
+ */
366
+ function readStrictly(attempt) {
367
+ for (const journal of journalsOf(attempt))
368
+ journal.assertReadable();
369
+ for (const key of [retiredKey(attempt), successKey(attempt)]) {
370
+ const raw = readKey(key, true);
371
+ if (raw !== null)
372
+ JSON.parse(raw);
373
+ }
374
+ }
375
+ /** Whether every namespace's records, settlements and markers read strictly now. */
376
+ function readable(attempt) {
377
+ try {
378
+ readStrictly(attempt);
379
+ return true;
380
+ }
381
+ catch {
382
+ return false;
383
+ }
384
+ }
385
+ /** Strict reads prove no namespace ever reserved the attempt. */
386
+ function provesUnreserved(attempt) {
387
+ try {
388
+ readStrictly(attempt);
389
+ return handlesOf(attempt).every((handle) => handle.peek().reservation === undefined);
390
+ }
391
+ catch {
392
+ return false;
393
+ }
394
+ }
395
+ /** Under every namespace key's hold lock, in one order, never waiting on a busy one. */
396
+ async function underLocks(attempt, work) {
397
+ const journals = journalsOf(attempt);
398
+ const run = (index) => index === journals.length
399
+ ? work()
400
+ : journals[index].withLock(() => run(index + 1));
401
+ return run(0);
402
+ }
403
+ /**
404
+ * Retire a saved attempt: the user's exit (once the hold released it), the
405
+ * user's check action on the exact outcome they saw, or a settlement the
406
+ * app followed and recorded. Under the hold's locks, on a fresh
407
+ * error-aware read. Refused (`retired: false`) while anything holds it,
408
+ * while the hold changed since the check was shown, while a success shows
409
+ * (only `settled` retires one), when the attempt's `confirmRetirable()` says
410
+ * no, or while a lock is busy: recover again. `reason: "unreadable"`: the
411
+ * browser has storage it can't read; the warned exit (`force:
412
+ * "unreadable"`) then retires in this tab alone, only if a strict read fails
413
+ * again inside it. `durable: false`: the commit lasts in this tab alone.
414
+ */
415
+ async function retire(attempt, reason) {
416
+ let settled = [];
417
+ let unreadable = false;
418
+ let forced = false;
419
+ try {
420
+ const handles = handlesOf(attempt);
421
+ const done = await underLocks(attempt, async () => {
422
+ try {
423
+ readStrictly(attempt);
424
+ }
425
+ catch {
426
+ // Unresolved: never read as clear. Only the warned exit goes on, in this tab.
427
+ if (reason.by !== "check" || reason.force !== "unreadable") {
428
+ unreadable = true;
429
+ return false;
430
+ }
431
+ forced = true;
432
+ }
433
+ if (forced && reason.by === "check") {
434
+ // Storage can't be read: only what this tab knows and the app's
435
+ // journal decide. A success proved here is never retired.
436
+ if (tabProven.has(successKey(attempt)))
437
+ return false;
438
+ if (typeof attempt.confirmRetirable !== "function" ||
439
+ (await attempt.confirmRetirable()) !== true)
440
+ return false;
441
+ tabRetired.set(retiredKey(attempt), JSON.stringify({ by: "check", evidence: reason.outcome.evidence }));
442
+ return true;
443
+ }
444
+ const states = handles.map((handle) => handle.peek());
445
+ if (states.some((state) => state.status !== "clear"))
446
+ return false;
447
+ const evidence = evidenceOf(attempt, states);
448
+ if (reason.by === "check" && reason.outcome.evidence !== evidence)
449
+ return false;
450
+ if (reason.by !== "settled") {
451
+ // Rule E: only a followed settlement retires a success.
452
+ if (settlementsOf(attempt, states).success.length ||
453
+ provenOf(attempt, evidence))
454
+ return false;
455
+ // The app's own journal has the final say; it is required.
456
+ if (typeof attempt.confirmRetirable !== "function" ||
457
+ (await attempt.confirmRetirable()) !== true)
458
+ return false;
459
+ }
460
+ const key = retiredKey(attempt);
461
+ const value = JSON.stringify({
462
+ by: reason.by,
463
+ evidence,
464
+ ...(reason.by === "settled" && reason.hash
465
+ ? { hash: lower(reason.hash) }
466
+ : {}),
467
+ });
468
+ storage.setItem(key, value);
469
+ if (storage.getItem(key) !== value)
470
+ return false;
471
+ settled = states.flatMap((state, index) => reason.by === "settled" &&
472
+ state.status === "clear" &&
473
+ state.settled &&
474
+ "hash" in state.settled &&
475
+ !state.settled.acknowledged &&
476
+ (!reason.hash || lower(state.settled.hash) === lower(reason.hash))
477
+ ? [{ handle: handles[index], state }]
478
+ : []);
479
+ return true;
480
+ });
481
+ // A followed success no longer blocks a send (outside the lock its acknowledgement takes).
482
+ for (const { handle, state } of settled)
483
+ if (state.status === "clear" &&
484
+ state.settled &&
485
+ "hash" in state.settled)
486
+ await handle.acknowledge(state.settled).catch(() => undefined);
487
+ if (!done)
488
+ return unreadable
489
+ ? { retired: false, reason: "unreadable" }
490
+ : { retired: false };
491
+ return {
492
+ retired: true,
493
+ // Only commit-specific evidence says it outlives the tab.
494
+ durable: !forced && (storage.durableAt?.(retiredKey(attempt)) ?? false),
495
+ };
496
+ }
497
+ catch {
498
+ return { retired: false };
499
+ }
500
+ }
501
+ /**
502
+ * Whether the app may delete its saved attempt now, on a fresh error-aware
503
+ * read: never while the hold holds it, while a success it settled (or a
504
+ * tab proved) hasn't been followed, or while anything can't be read.
505
+ */
506
+ function canDiscard(attempt) {
507
+ try {
508
+ readStrictly(attempt);
509
+ const states = handlesOf(attempt).map((handle) => handle.peek());
510
+ if (states.some((state) => state.status !== "clear"))
511
+ return false;
512
+ const evidence = evidenceOf(attempt, states);
513
+ const unfollowed = settlementsOf(attempt, states).success.length > 0 ||
514
+ !!provenOf(attempt, evidence);
515
+ const retired = retirementOf(attempt, evidence);
516
+ return unfollowed ? retired === "settled" : true;
517
+ }
518
+ catch {
519
+ return false;
520
+ }
521
+ }
522
+ return { recover, retire, canDiscard };
523
+ }
524
+ //# sourceMappingURL=savedAttempt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"savedAttempt.js","sourceRoot":"","sources":["../../../src/review/savedAttempt.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,eAAe,CAAC;AAQvB,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,GAGvB,MAAM,oBAAoB,CAAC;AAoI5B,2FAA2F;AAC3F,MAAM,OAAO,GAAG;IACd,EAAE,EAAE,4CAAuD;IAC3D,IAAI,EAAE,IAAW;CAClB,CAAC;AACF,MAAM,cAAc,GAAG,iCAAiC,CAAC;AACzD,sFAAsF;AACtF,MAAM,cAAc,GAAG,iCAAiC,CAAC;AACzD,sEAAsE;AACtE,MAAM,MAAM,GAAG,CAAC,CAAC;AAEjB,MAAM,KAAK,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,EAAqB,CAAC;AACrE,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,EAAE,CAClC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEzD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAI1C;IACC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,sBAAsB,EAAE,CAAC;IAC5D,mFAAmF;IACnF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,2GAA2G;IAC3G,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,SAAS,OAAO,CAAC,OAA0B,EAAE,SAAiB;QAC5D,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU;YACjD,SAAS;YACT,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO;SAC9B,CAAC;IACJ,CAAC;IACD,SAAS,SAAS,CAAC,OAA0B;QAC3C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM;YAC5B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CACvC,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,OAA0B,EAAE,EAAE,CAC7C,IAAI,CAAC,SAAS,CAAC;QACb,OAAO,CAAC,OAAO;QACf,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE;QAC7B,OAAO,CAAC,UAAU;KACnB,CAAC,CAAC;IACL,MAAM,UAAU,GAAG,CAAC,OAA0B,EAAE,EAAE,CAChD,GAAG,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,CAAC,OAA0B,EAAE,EAAE,CAChD,GAAG,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,yEAAyE;IACzE,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,MAAM,GAAG,KAAK,EAAE,EAAE,CAC9C,MAAM,IAAI,OAAO,CAAC,aAAa;QAC7B,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC;QAC5B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,gFAAgF;IAChF,SAAS,QAAQ,CACf,OAA0B,EAC1B,QAAgB,EAChB,MAAM,GAAG,KAAK;QAEd,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACtB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,IAAI,MAAM,CACH,CAAC;QAC9C,OAAO,KAAK,EAAE,QAAQ,KAAK,QAAQ;YACjC,CAAC,CAAC,KAAK,CAAC,IAAI;gBACV,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;gBACtB,CAAC,CAAC,EAAE;YACN,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IACD,2FAA2F;IAC3F,SAAS,UAAU,CAAC,OAA0B,EAAE,MAAwB;QACtE,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,IAAI;YACtE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;gBAClC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;gBACzB,KAAK,CAAC,WAAW,IAAI,IAAI;gBACzB,KAAK,CAAC,MAAM;gBACZ,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO;oBAClE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE;oBAClC,CAAC,CAAC,IAAI;aACT,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IACD,SAAS,YAAY,CACnB,OAA0B,EAC1B,QAAgB,EAChB,MAAM,GAAG,KAAK;QAEd,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACtB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAI/C,CAAC;QACT,OAAO,KAAK,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,CAAC;IACD,2FAA2F;IAC3F,SAAS,aAAa,CAAC,OAA0B,EAAE,MAAwB;QACzE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAU,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAU,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,SAAS;YACzD,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC;gBAAE,SAAS;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC;YACxC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,SAAS,KAAK,CAAC,MAAc,EAAE,QAAgB;QAC7C,OAAO;YACL,MAAM,EAAE,OAAO;YACf,MAAM;YACN,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,2BAA2B;YACpC,QAAQ;SACT,CAAC;IACJ,CAAC;IACD,8FAA8F;IAC9F,SAAS,WAAW,CAAC,OAA0B,EAAE,OAA0B;QACzE,IAAI,CAAC;YACH,OAAO,UAAU,CACf,OAAO,EACP,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CACvC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,UAAU,OAAO,CACpB,OAAwB,EACxB,MAAuB;QAEvB,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,0EAA0E;QAC1E,6EAA6E;QAC7E,KACE,IAAI,KAAK,GAAG,CAAC,EACb,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAChD,KAAK,EAAE,EACP,CAAC;YACD,IAAI,OAA0B,CAAC;YAC/B,IAAI,CAAC;gBACH,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM;YACR,CAAC;YACD,IAAI,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ;gBAAE,MAAM;YAC9D,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9D,IAAI,OAAO,CAAC,aAAa;gBAAE,MAAM,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACnE,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,OAAO,CAAC;QAC/C,yEAAyE;QACzE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAE7D,CAAC;QACT,IACE,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,QAAQ;YACnC,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAEnC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC9C,qEAAqE;QACrE,+CAA+C;QAC/C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACjE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;gBAC3B,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;gBACtB,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YACnD,IAAI,MAAM;gBACR,OAAO;oBACL,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,SAAS;oBACjB,aAAa,EAAE,KAAK;oBACpB,GAAG,MAAM;oBACT,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,KAAK,UAAU,UAAU,CAAC,OAA0B,EAAE,IAAU;QAC9D,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;gBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC3B,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;oBAClD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvC,CAAC,CAAC;gBACH,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;YAC9C,CAAC,CAAC;YACF,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC;IAED,KAAK,UAAU,IAAI,CACjB,OAAwB,EACxB,MAAuB;QAEvB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,EAAE,IAAqB,EAAE,EAAE;YAC5C,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAI,KAAK,EAAE,MAAM,KAAK,QAAQ;oBAAE,OAAO,KAAK,CAAC;gBAC7C,OAAO,CAAC,IAAI,CACV,KAAK,EAAE,MAAM;oBACX,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU;wBAC3B,CAAC,CAAC,mCAAmC;wBACrC,CAAC,CAAC,0CAA0C,CAAC,CAClD,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAChC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QACF,wGAAwG;QACxG,MAAM,QAAQ,GAAG,KAAK,EACpB,MAAwB,EACqB,EAAE;YAC/C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3D,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,KAAK;oBACP,OAAO;wBACL,MAAM,EAAE,MAAM;wBACd,MAAM,EAAE,SAAS;wBACjB,aAAa,EAAE,IAAI;wBACnB,IAAI;wBACJ,KAAK,EAAE,KAAK,CAAC,KAAK;qBACnB,CAAC;YACN,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACzC,MAAM,KAAK,GACT,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACrE,IAAI,KAAK;oBACP,OAAO;wBACL,MAAM,EAAE,MAAM;wBACd,MAAM,EAAE,SAAS;wBACjB,aAAa,EAAE,IAAI;wBACnB,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,KAAK,CAAC,KAAK;qBACnB,CAAC;gBACJ,OAAO;oBACL,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,SAAS;oBACjB,aAAa,EAAE,KAAK;oBACpB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;oBAChB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;iBAC1B,CAAC;YACJ,CAAC;YACD,IAAI,MAAM,CAAC,MAAM;gBACf,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QACF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,MAAM,GAAqB,EAAE,CAAC;YACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpE,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;oBAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;gBACvE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,mDAAmD;YACnD,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAChD,IACE,OAAO;gBACP,CAAC,OAAO,KAAK,SAAS;oBACpB,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM;wBAC7C,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAElC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;YAE5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC;YAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,yEAAyE;gBACzE,0EAA0E;gBAC1E,IACE,KAAK,CAAC,OAAO,KAAK,KAAK;oBACvB,KAAK,CAAC,KAAK,KAAK,SAAS;oBACzB,KAAK,CAAC,SAAS,KAAK,SAAS;oBAC7B,KAAK,CAAC,SAAS,KAAK,SAAS;oBAC7B,KAAK,CAAC,WAAW,KAAK,SAAS;oBAC/B,IAAI,CAAC,OAAO,EAAE;oBACd,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC;oBACxD,gBAAgB,CAAC,OAAO,CAAC;oBAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;gBAC5B,gEAAgE;gBAChE,sDAAsD;gBACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACnC,0BAA0B,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;oBACtD,OAAO;oBACP,KAAK;iBACN,CAAC,CAAC,mBAAmB,EAAE,CACzB,CACF,CAAC;gBACF,IACE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC;oBACvD,MAAM,CAAC,KAAK,CACV,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,WAAW,KAAK,SAAS;wBAC/B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAClC;oBACD,QAAQ,CAAC,OAAO,CAAC;oBAEjB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;YACnD,CAAC;YAED,IAAI,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC7B,sEAAsE;gBACtE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CACpC,MAAM,CAAC,CAAC,CAAC,EACT;oBACE,GAAG,CAAC,KAAK,CAAC,UAAU;wBAClB,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE;wBAC5C,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACzB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B,EACD,MAAM,CACP,CAAC;gBACF,IAAI,KAAK,GAAmB,OAAO,CAAC;gBACpC,MAAM,QAAQ,GAAG,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtE,IAAI,QAAQ;oBACV,OAAO,CAAC,IAAI,CACV,QAAQ,KAAK,SAAS;wBACpB,CAAC,CAAC,0CAA0C;wBAC5C,CAAC,CAAC,0CAA0C,CAC/C,CAAC;gBACJ,IACE,KAAK,CAAC,UAAU;oBAChB,KAAK,CAAC,SAAS,KAAK,SAAS;oBAC7B,KAAK,CAAC,MAAM,KAAK,OAAO;oBAExB,KAAK,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE;wBAC/C,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,KAAK,EAAE,KAAK,CAAC,SAAS;qBACvB,CAAC,CAAC;gBACL,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;oBAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtC,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC;YAC1B,CAAC;YAED,uFAAuF;YACvF,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,KAAK;gBACP,OAAO;oBACL,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,SAAS;oBACjB,aAAa,EAAE,IAAI;oBACnB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3C,KAAK,EAAE,KAAK,CAAC,KAAK;iBACnB,CAAC;YACJ,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,SAAS,UAAU,CAAC,OAA0B;QAC5C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM;YAC5B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,OAAO,OAAO,CAAC,UAAU;aACtB,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACjB,0BAA0B,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;YACtD,OAAO;YACP,KAAK;SACN,CAAC,CACH;aACA,IAAI;QACH,6BAA6B;QAC7B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CACpE,CAAC;IACN,CAAC;IACD;;;;OAIG;IACH,SAAS,YAAY,CAAC,OAA0B;QAC9C,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,cAAc,EAAE,CAAC;QACpE,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC/B,IAAI,GAAG,KAAK,IAAI;gBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,oFAAoF;IACpF,SAAS,QAAQ,CAAC,OAA0B;QAC1C,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,iEAAiE;IACjE,SAAS,gBAAgB,CAAC,OAA0B;QAClD,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAC7B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,KAAK,SAAS,CACpD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,wFAAwF;IACxF,KAAK,UAAU,UAAU,CACvB,OAA0B,EAC1B,IAAsB;QAEtB,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,CAAC,KAAa,EAAc,EAAE,CACxC,KAAK,KAAK,QAAQ,CAAC,MAAM;YACvB,CAAC,CAAC,IAAI,EAAE;YACR,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,UAAU,MAAM,CACnB,OAA0B,EAC1B,MAA8B;QAE9B,IAAI,OAAO,GAAyD,EAAE,CAAC;QACvE,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;gBAChD,IAAI,CAAC;oBACH,YAAY,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC;oBACP,8EAA8E;oBAC9E,IAAI,MAAM,CAAC,EAAE,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;wBAC3D,UAAU,GAAG,IAAI,CAAC;wBAClB,OAAO,KAAK,CAAC;oBACf,CAAC;oBACD,MAAM,GAAG,IAAI,CAAC;gBAChB,CAAC;gBACD,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;oBACpC,gEAAgE;oBAChE,0DAA0D;oBAC1D,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;wBAAE,OAAO,KAAK,CAAC;oBACrD,IACE,OAAO,OAAO,CAAC,gBAAgB,KAAK,UAAU;wBAC9C,CAAC,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,IAAI;wBAE3C,OAAO,KAAK,CAAC;oBACf,UAAU,CAAC,GAAG,CACZ,UAAU,CAAC,OAAO,CAAC,EACnB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CACnE,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACnE,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC7C,IAAI,MAAM,CAAC,EAAE,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;oBAC/D,OAAO,KAAK,CAAC;gBACf,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;oBAC5B,wDAAwD;oBACxD,IACE,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM;wBAC7C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;wBAE3B,OAAO,KAAK,CAAC;oBACf,2DAA2D;oBAC3D,IACE,OAAO,OAAO,CAAC,gBAAgB,KAAK,UAAU;wBAC9C,CAAC,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,IAAI;wBAE3C,OAAO,KAAK,CAAC;gBACjB,CAAC;gBACD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;gBAChC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC3B,EAAE,EAAE,MAAM,CAAC,EAAE;oBACb,QAAQ;oBACR,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI;wBACxC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;wBAC9B,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC,CAAC;gBACH,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC5B,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK;oBAAE,OAAO,KAAK,CAAC;gBACjD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACxC,MAAM,CAAC,EAAE,KAAK,SAAS;oBACvB,KAAK,CAAC,MAAM,KAAK,OAAO;oBACxB,KAAK,CAAC,OAAO;oBACb,MAAM,IAAI,KAAK,CAAC,OAAO;oBACvB,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY;oBAC3B,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAChE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;oBACrC,CAAC,CAAC,EAAE,CACP,CAAC;gBACF,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,2FAA2F;YAC3F,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,OAAO;gBACrC,IACE,KAAK,CAAC,MAAM,KAAK,OAAO;oBACxB,KAAK,CAAC,OAAO;oBACb,MAAM,IAAI,KAAK,CAAC,OAAO;oBAEvB,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACnE,IAAI,CAAC,IAAI;gBACP,OAAO,UAAU;oBACf,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE;oBAC1C,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,0DAA0D;gBAC1D,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC;aACxE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,SAAS,UAAU,CAAC,OAA0B;QAC5C,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACjE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC;gBAAE,OAAO,KAAK,CAAC;YACnE,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,UAAU,GACd,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBACjD,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAChD,OAAO,UAAU,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC"}