@laminapdf/viewer 0.2.0-alpha.4 → 0.2.0-alpha.6

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 (127) hide show
  1. package/README.md +79 -10
  2. package/dist/client.d.ts +60 -2
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +241 -22
  5. package/dist/client.js.map +1 -1
  6. package/dist/edit/session.d.ts +91 -0
  7. package/dist/edit/session.d.ts.map +1 -0
  8. package/dist/edit/session.js +179 -0
  9. package/dist/edit/session.js.map +1 -0
  10. package/dist/edit-log.d.ts +32 -0
  11. package/dist/edit-log.d.ts.map +1 -0
  12. package/dist/edit-log.js +74 -0
  13. package/dist/edit-log.js.map +1 -0
  14. package/dist/find/controller.d.ts +6 -0
  15. package/dist/find/controller.d.ts.map +1 -1
  16. package/dist/find/controller.js +69 -2
  17. package/dist/find/controller.js.map +1 -1
  18. package/dist/first-draw.d.ts +10 -0
  19. package/dist/first-draw.d.ts.map +1 -0
  20. package/dist/first-draw.js +33 -0
  21. package/dist/first-draw.js.map +1 -0
  22. package/dist/history/history.d.ts +74 -0
  23. package/dist/history/history.d.ts.map +1 -0
  24. package/dist/history/history.js +135 -0
  25. package/dist/history/history.js.map +1 -0
  26. package/dist/index.d.ts +11 -3
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +4 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/layers/copy.d.ts +26 -0
  31. package/dist/layers/copy.d.ts.map +1 -0
  32. package/dist/layers/copy.js +150 -0
  33. package/dist/layers/copy.js.map +1 -0
  34. package/dist/layers/link-layer.d.ts +101 -0
  35. package/dist/layers/link-layer.d.ts.map +1 -0
  36. package/dist/layers/link-layer.js +527 -0
  37. package/dist/layers/link-layer.js.map +1 -0
  38. package/dist/layers/link-preview.d.ts +77 -0
  39. package/dist/layers/link-preview.d.ts.map +1 -0
  40. package/dist/layers/link-preview.js +202 -0
  41. package/dist/layers/link-preview.js.map +1 -0
  42. package/dist/layers/link-url.d.ts +19 -0
  43. package/dist/layers/link-url.d.ts.map +1 -0
  44. package/dist/layers/link-url.js +47 -0
  45. package/dist/layers/link-url.js.map +1 -0
  46. package/dist/layers/spans.d.ts +0 -6
  47. package/dist/layers/spans.d.ts.map +1 -1
  48. package/dist/layers/spans.js +2 -20
  49. package/dist/layers/spans.js.map +1 -1
  50. package/dist/layers/structure-layer.d.ts.map +1 -1
  51. package/dist/layers/structure-layer.js +3 -0
  52. package/dist/layers/structure-layer.js.map +1 -1
  53. package/dist/layers/text-layer.d.ts +27 -6
  54. package/dist/layers/text-layer.d.ts.map +1 -1
  55. package/dist/layers/text-layer.js +310 -28
  56. package/dist/layers/text-layer.js.map +1 -1
  57. package/dist/layout/page-layout.d.ts +7 -0
  58. package/dist/layout/page-layout.d.ts.map +1 -1
  59. package/dist/layout/page-layout.js +15 -0
  60. package/dist/layout/page-layout.js.map +1 -1
  61. package/dist/protocol.d.ts +197 -5
  62. package/dist/protocol.d.ts.map +1 -1
  63. package/dist/protocol.js +33 -6
  64. package/dist/protocol.js.map +1 -1
  65. package/dist/source/opfs.d.ts +35 -0
  66. package/dist/source/opfs.d.ts.map +1 -0
  67. package/dist/source/opfs.js +178 -0
  68. package/dist/source/opfs.js.map +1 -0
  69. package/dist/thumbnails/strip.d.ts +1 -1
  70. package/dist/thumbnails/strip.d.ts.map +1 -1
  71. package/dist/thumbnails/strip.js +48 -4
  72. package/dist/thumbnails/strip.js.map +1 -1
  73. package/dist/view/previews.d.ts +47 -0
  74. package/dist/view/previews.d.ts.map +1 -0
  75. package/dist/view/previews.js +97 -0
  76. package/dist/view/previews.js.map +1 -0
  77. package/dist/view/user-select.d.ts +3 -0
  78. package/dist/view/user-select.d.ts.map +1 -0
  79. package/dist/view/user-select.js +10 -0
  80. package/dist/view/user-select.js.map +1 -0
  81. package/dist/view/viewer.d.ts +143 -5
  82. package/dist/view/viewer.d.ts.map +1 -1
  83. package/dist/view/viewer.js +590 -50
  84. package/dist/view/viewer.js.map +1 -1
  85. package/dist/worker/document.d.ts +66 -6
  86. package/dist/worker/document.d.ts.map +1 -1
  87. package/dist/worker/document.js +139 -23
  88. package/dist/worker/document.js.map +1 -1
  89. package/dist/worker/edit.d.ts +35 -0
  90. package/dist/worker/edit.d.ts.map +1 -0
  91. package/dist/worker/edit.js +305 -0
  92. package/dist/worker/edit.js.map +1 -0
  93. package/dist/worker/find.d.ts +2 -2
  94. package/dist/worker/find.d.ts.map +1 -1
  95. package/dist/worker/find.js +8 -21
  96. package/dist/worker/find.js.map +1 -1
  97. package/dist/worker/fingerprint.d.ts +10 -0
  98. package/dist/worker/fingerprint.d.ts.map +1 -0
  99. package/dist/worker/fingerprint.js +42 -0
  100. package/dist/worker/fingerprint.js.map +1 -0
  101. package/dist/worker/methods.d.ts.map +1 -1
  102. package/dist/worker/methods.js +42 -4
  103. package/dist/worker/methods.js.map +1 -1
  104. package/dist/worker/navigation.d.ts +5 -1
  105. package/dist/worker/navigation.d.ts.map +1 -1
  106. package/dist/worker/navigation.js +22 -4
  107. package/dist/worker/navigation.js.map +1 -1
  108. package/dist/worker/print.d.ts +14 -0
  109. package/dist/worker/print.d.ts.map +1 -0
  110. package/dist/worker/print.js +49 -0
  111. package/dist/worker/print.js.map +1 -0
  112. package/dist/worker/recent-pages.d.ts +16 -0
  113. package/dist/worker/recent-pages.d.ts.map +1 -0
  114. package/dist/worker/recent-pages.js +68 -0
  115. package/dist/worker/recent-pages.js.map +1 -0
  116. package/dist/worker/render.d.ts.map +1 -1
  117. package/dist/worker/render.js +5 -2
  118. package/dist/worker/render.js.map +1 -1
  119. package/dist/worker/session.d.ts +59 -0
  120. package/dist/worker/session.d.ts.map +1 -0
  121. package/dist/worker/session.js +152 -0
  122. package/dist/worker/session.js.map +1 -0
  123. package/dist/worker/text.d.ts +11 -3
  124. package/dist/worker/text.d.ts.map +1 -1
  125. package/dist/worker/text.js +33 -25
  126. package/dist/worker/text.js.map +1 -1
  127. package/package.json +9 -8
@@ -7,13 +7,28 @@
7
7
  import { bytesSource, isRenderError, RenderError, } from "@laminapdf/render";
8
8
  import { initHayro } from "@laminapdf/render-hayro";
9
9
  import { initPdfium } from "@laminapdf/render-pdfium";
10
- import { Document, isLaminaPdfError, loadExtract, wasmMemory } from "@laminapdf/sdk";
10
+ import { Document, isLaminaPdfError, loadExtract, wasmMemory, } from "@laminapdf/sdk";
11
11
  import { emit, yieldToMessages } from "@laminapdf/sdk/worker/server";
12
12
  import { HttpRangeByteSource } from "../source/http-range.js";
13
+ import { COPY_ABOVE, OpfsByteSource } from "../source/opfs.js";
13
14
  import { blobSource, readAll } from "../source.js";
15
+ import { documentFingerprint, HEAD_BYTES } from "./fingerprint.js";
16
+ import { newSession } from "./session.js";
14
17
  let backend;
15
18
  /** Backends loaded or loading, by name; a failed load is forgotten, so the next call retries. */
16
19
  const loading = new Map();
20
+ /** The edit state of a document just opened from `source`. */
21
+ function newEditState(source, renderLimits) {
22
+ return {
23
+ source,
24
+ renderLimits,
25
+ appended: [],
26
+ pending: [],
27
+ diverged: false,
28
+ session: newSession(),
29
+ queue: Promise.resolve(),
30
+ };
31
+ }
17
32
  /**
18
33
  * Rounds of fetching a call may need before it gives up with its last `data-pending`: the SDK's
19
34
  * default for the same loop over Lamina PDF's reads (`Document.openRange`'s `maxRounds`).
@@ -38,12 +53,22 @@ export async function initBackend(init) {
38
53
  }
39
54
  const loaded = await pending;
40
55
  backend = loaded;
41
- // The text layer's module, loaded once the page can render: documents opened after it can give
42
- // their text, and the first page never waits for it.
56
+ return { name: loaded.name, version: loaded.version };
57
+ }
58
+ /** Whether a render has started the extract module's load (once per worker). */
59
+ let warmed = false;
60
+ /**
61
+ * Starts the text layer's module once a page has been drawn (render.ts calls it after each
62
+ * render; only the first call starts anything). Before that its download would compete with the
63
+ * document's bytes and the backend for the first page; text asked for earlier loads it at once.
64
+ */
65
+ export function warmExtract() {
66
+ if (warmed)
67
+ return;
68
+ warmed = true;
43
69
  void extractModule().catch(() => {
44
- // Tried again when text is first asked for.
70
+ // Tried once here; text asked for later tries again, never another render.
45
71
  });
46
- return { name: loaded.name, version: loaded.version };
47
72
  }
48
73
  /** The extract module's load, started after the backend's. */
49
74
  let extract;
@@ -76,26 +101,71 @@ export async function textModel(signal) {
76
101
  if (opened.reopen === undefined)
77
102
  return opened.model;
78
103
  const { bytes, options } = opened.reopen;
104
+ const ranged = opened.remote ?? opened.local;
105
+ if (bytes === undefined && ranged === undefined)
106
+ return opened.model;
79
107
  // One copy for every caller, opened with no caller's signal: a page that scrolls away aborts
80
108
  // its own wait, never the copy the other pages and the structure tree wait for.
81
109
  opened.text = (async () => {
82
110
  await extractModule();
83
111
  const { model } = bytes !== undefined
84
112
  ? await openModel((o) => Document.open(bytes, o), options)
85
- : await openModel((o) => Document.openRange(opened.remote, o), options);
113
+ : await openModel((o) => Document.openRange(ranged, o), options);
86
114
  if (!model.canExtractText) {
87
115
  model.free();
88
116
  throw new RenderError("render-failed", "the extract module didn't load");
89
117
  }
90
118
  // The copy is open: the password and bytes it needed are no longer kept.
91
119
  opened.reopen = undefined;
120
+ // It opened from the file as it was: the edits made since then come next.
121
+ await replayEdits(opened, model);
92
122
  return model;
93
123
  })();
94
124
  opened.text.catch(() => {
95
125
  opened.text = undefined;
126
+ dropUnfollowable(opened);
96
127
  });
97
128
  return untilAborted(opened.text, signal);
98
129
  }
130
+ /**
131
+ * Passes an edit, undo or redo the model committed to the text-capable copy (edit.ts calls it
132
+ * after each). The model reads its text itself when it can, and then nothing is kept. A copy still
133
+ * opening makes them once open; each call waits for the one before, so none is made twice.
134
+ */
135
+ export function followEdit(opened, action) {
136
+ if (opened.text === undefined && opened.reopen === undefined)
137
+ return;
138
+ opened.edit.pending.push(action);
139
+ const text = opened.text;
140
+ if (text === undefined)
141
+ return;
142
+ const synced = text.then(async (copy) => {
143
+ await replayEdits(opened, copy);
144
+ return copy;
145
+ });
146
+ opened.text = synced;
147
+ synced.catch(() => {
148
+ // A copy that can't follow the edits would show the old text: it goes, and text calls then
149
+ // answer `extract-module-not-loaded` from the model.
150
+ if (opened.text === synced)
151
+ opened.text = undefined;
152
+ dropUnfollowable(opened);
153
+ });
154
+ }
155
+ /** With no copy open and none that can open (`reopen` is gone), nothing will apply the pending edits. */
156
+ function dropUnfollowable(opened) {
157
+ if (opened.text === undefined && opened.reopen === undefined)
158
+ opened.edit.pending.length = 0;
159
+ }
160
+ /** Makes in `copy` the edits, undos and redos it hasn't made yet, as the model did. */
161
+ async function replayEdits(opened, copy) {
162
+ const { pending } = opened.edit;
163
+ for (let action = pending[0]; action !== undefined; action = pending[0]) {
164
+ const next = action;
165
+ await copy.ensure(() => (next === "undo" ? copy.undo() : next === "redo" ? copy.redo() : copy.apply(next)));
166
+ pending.shift();
167
+ }
168
+ }
99
169
  /**
100
170
  * What a text-capable copy of `model` would open from: nothing for a document that can already
101
171
  * give its text, since the options hold the password and are kept only while needed.
@@ -112,7 +182,7 @@ function untilAborted(promise, signal) {
112
182
  promise.then(resolve, reject).finally(() => signal.removeEventListener("abort", abort));
113
183
  });
114
184
  }
115
- function currentBackend() {
185
+ export function currentBackend() {
116
186
  // Only a viewer bug gets here (the client loads the backend before anything else), so it stays
117
187
  // an Error: the worker reports it as worker-failed, kind internal.
118
188
  if (backend === undefined)
@@ -124,6 +194,7 @@ function closeOpen() {
124
194
  return;
125
195
  open.render.close();
126
196
  open.model.free();
197
+ open.local?.close();
127
198
  // A text-capable copy goes with it, once opened (a failed one has nothing to free).
128
199
  open.text?.then((copy) => copy.free(), () => { });
129
200
  open = undefined;
@@ -183,30 +254,61 @@ async function openModel(open, options) {
183
254
  return { model: await open({ ...withLimits, password }), needsPassword: true };
184
255
  }
185
256
  }
186
- /** Opens the worker's document (closing any previous one) and reports its warnings as events. */
187
- export async function openDocument(init, options, signal) {
188
- const engine = currentBackend();
189
- let remote;
190
- let bytes;
257
+ /** Where `init`'s bytes will be read from. */
258
+ async function bytesFor(init, options, signal) {
191
259
  if (isRemote(init)) {
192
- remote = await HttpRangeByteSource.open(init.url, { signal, onProgress: (p) => emit("progress", p) });
260
+ const remote = await HttpRangeByteSource.open(init.url, { signal, onProgress: (p) => emit("progress", p) });
193
261
  // A server without range support sent the whole file: read it as a local one.
194
- bytes = remote.whole;
195
- if (bytes !== undefined)
196
- remote = undefined;
262
+ return remote.whole === undefined ? { kind: "remote", source: remote } : { kind: "memory", bytes: remote.whole };
263
+ }
264
+ // A large file is read from its OPFS copy where the browser can keep one, else from memory.
265
+ if (init instanceof File && init.size > (options.copyAbove ?? COPY_ABOVE)) {
266
+ const copy = await OpfsByteSource.open(init, {
267
+ signal,
268
+ onProgress: (loaded, total) => emit("progress", { loaded, total }),
269
+ keep: options.keepCopy ?? true,
270
+ });
271
+ if (copy !== undefined)
272
+ return { kind: "copy", source: copy };
273
+ }
274
+ return { kind: "memory", bytes: await bytesOf(init, signal) };
275
+ }
276
+ /** Opens the worker's document (closing any previous one) and reports its warnings as events. */
277
+ export async function openDocument(init, options, signal, ticket) {
278
+ const engine = currentBackend();
279
+ const from = await bytesFor(init, options, signal);
280
+ try {
281
+ const document = await openFrom(engine, from, options, signal);
282
+ if (open !== undefined)
283
+ open.answer = { document, ticket };
284
+ return document;
197
285
  }
198
- else {
199
- bytes = await bytesOf(init, signal);
286
+ catch (e) {
287
+ if (from.kind === "copy")
288
+ from.source.close();
289
+ throw e;
200
290
  }
291
+ }
292
+ /** The fingerprint of the file `from` holds, from its first {@link HEAD_BYTES}. */
293
+ async function fingerprintOf(from, signal) {
294
+ if (from.kind === "memory")
295
+ return documentFingerprint(from.bytes.subarray(0, HEAD_BYTES));
296
+ const head = await from.source.read(0, Math.min(from.source.size, HEAD_BYTES), { signal });
297
+ return documentFingerprint(head);
298
+ }
299
+ /** Opens Lamina PDF's document and the backend's over `from`. */
300
+ async function openFrom(engine, from, options, signal) {
201
301
  const { password, renderLimits } = options;
202
- const { model, needsPassword } = bytes !== undefined
203
- ? await openModel((o) => Document.open(bytes, o), options)
204
- : await openModel((o) => Document.openRange(remote, { ...o, signal }), options);
302
+ const { model, needsPassword } = from.kind === "memory"
303
+ ? await openModel((o) => Document.open(from.bytes, o), options)
304
+ : await openModel((o) => Document.openRange(from.source, { ...o, signal }), options);
305
+ const remote = from.kind === "remote" ? from.source : undefined;
205
306
  let render;
206
307
  let pages;
207
308
  let title;
309
+ const source = from.kind === "memory" ? bytesSource(from.bytes) : from.source;
310
+ let fingerprint;
208
311
  try {
209
- const source = remote ?? bytesSource(bytes);
210
312
  const renderOptions = {
211
313
  ...(password === undefined ? {} : { password }),
212
314
  ...(renderLimits === undefined ? {} : { limits: renderLimits }),
@@ -215,6 +317,9 @@ export async function openDocument(init, options, signal) {
215
317
  try {
216
318
  pages = await model.ensure(() => model.pages, { signal });
217
319
  title = (await model.ensure(() => model.info, { signal })).title?.trim();
320
+ // Only reading positions need it: without one (no Web Crypto in an insecure context, a failed
321
+ // read of the head) the document opens all the same, at page 1.
322
+ fingerprint = await fingerprintOf(from, signal).catch(() => undefined);
218
323
  }
219
324
  catch (e) {
220
325
  render.close();
@@ -240,8 +345,10 @@ export async function openDocument(init, options, signal) {
240
345
  id: nextDocument++,
241
346
  model,
242
347
  render,
348
+ edit: newEditState(source, renderLimits),
243
349
  remote,
244
- reopen: reopenFor(model, remote === undefined ? bytes : undefined, options),
350
+ local: from.kind === "copy" ? from.source : undefined,
351
+ reopen: reopenFor(model, from.kind === "memory" ? from.bytes : undefined, options),
245
352
  };
246
353
  // ADR 0003 warnings (a repaired xref, a dropped object) for the UI.
247
354
  for (const warning of model.warnings)
@@ -251,6 +358,8 @@ export async function openDocument(init, options, signal) {
251
358
  pages,
252
359
  id: open.id,
253
360
  needsPassword,
361
+ encrypted: model.isEncrypted,
362
+ ...(fingerprint === undefined ? {} : { fingerprint }),
254
363
  backend: { name: engine.name, version: engine.version },
255
364
  ...(title === undefined || title === "" ? {} : { title }),
256
365
  };
@@ -260,6 +369,13 @@ export function workerMemory() {
260
369
  const sdk = Object.values(wasmMemory()).reduce((sum, bytes) => sum + bytes, 0);
261
370
  return { backend: backend?.memory() ?? 0, sdk };
262
371
  }
372
+ /**
373
+ * The open document's answer and the page's number for the open that made it: after a cancelled
374
+ * open, the page asks, since the cancel can cross an open this worker had already committed.
375
+ */
376
+ export function currentDocument() {
377
+ return open?.answer;
378
+ }
263
379
  export function closeDocument() {
264
380
  closeOpen();
265
381
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/worker/document.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/worker/document.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,+FAA+F;AAC/F,gGAAgG;AAChG,gGAAgG;AAChG,iGAAiG;AACjG,+CAA+C;AAE/C,OAAO,EACL,WAAW,EAEX,aAAa,EAGb,WAAW,GAGZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,WAAW,EAIX,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AASrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAgB,MAAM,cAAc,CAAC;AAExD,IAAI,OAAkC,CAAC;AACvC,iGAAiG;AACjG,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkC,CAAC;AAwB1D,8DAA8D;AAC9D,SAAS,YAAY,CAAC,MAAoB,EAAE,YAAyC;IACnF,OAAO;QACL,MAAM;QACN,YAAY;QACZ,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,UAAU,EAAE;QACrB,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE;KACzB,CAAC;AACJ,CAAC;AAgCD;;;GAGG;AACH,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,IAAI,IAAsB,CAAC;AAC3B,IAAI,YAAY,GAAG,CAAC,CAAC;AAErB,mEAAmE;AACnE,SAAS,UAAU,CAAC,IAAqC;IACvD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,WAAW,CAAC,4BAA4B,EAAE,+CAA+C,CAAC,CAC/F,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAiB;IACjD,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;IAC7B,OAAO,GAAG,MAAM,CAAC;IACjB,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AACxD,CAAC;AAED,gFAAgF;AAChF,IAAI,MAAM,GAAG,KAAK,CAAC;AAEnB;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,MAAM;QAAE,OAAO;IACnB,MAAM,GAAG,IAAI,CAAC;IACd,KAAK,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QAC9B,2EAA2E;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8DAA8D;AAC9D,IAAI,OAAkC,CAAC;AAEvC,qFAAqF;AACrF,SAAS,aAAa;IACpB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,OAAO,GAAG,IAAI,CAAC;QACf,+FAA+F;QAC/F,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACd,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,GAAG,SAAS,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAmB;IACjD,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;IACzB,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IACrD,6FAA6F;IAC7F,uDAAuD;IACvD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IACrD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC;IAC7C,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IACrE,6FAA6F;IAC7F,gFAAgF;IAChF,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,aAAa,EAAE,CAAC;QACtB,MAAM,EAAE,KAAK,EAAE,GACb,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC;YAC1D,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAqB,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,IAAI,WAAW,CAAC,eAAe,EAAE,gCAAgC,CAAC,CAAC;QAC3E,CAAC;QACD,yEAAyE;QACzE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,0EAA0E;QAC1E,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,EAAE,CAAC;IACL,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;QACrB,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;QACxB,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAY,EAAE,MAAkB;IACzD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO;IACrE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACtC,MAAM,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;QAChB,2FAA2F;QAC3F,qDAAqD;QACrD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;QACpD,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yGAAyG;AACzG,SAAS,gBAAgB,CAAC,MAAY;IACpC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/F,CAAC;AAED,uFAAuF;AACvF,KAAK,UAAU,WAAW,CAAC,MAAY,EAAE,IAAc;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAChC,KAAK,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,CAAC;QACpB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5G,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,KAAe,EAAE,KAA6B,EAAE,OAA0B;IAC3F,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC/D,CAAC;AAED,mFAAmF;AACnF,SAAS,YAAY,CAAI,OAAmB,EAAE,MAAmB;IAC/D,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,+FAA+F;IAC/F,mEAAmE;IACnE,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACzE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACpB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAClB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;IACpB,oFAAoF;IACpF,IAAI,CAAC,IAAI,EAAE,IAAI,CACb,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EACrB,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;IACF,IAAI,GAAG,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAgB;IAChC,OAAO,OAAQ,IAA8B,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,CAAC;AAC5F,CAAC;AAED,2EAA2E;AAC3E,KAAK,UAAU,OAAO,CAAC,IAAuC,EAAE,MAAmB;IACjF,IAAI,IAAI,YAAY,IAAI;QAAE,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IACnE,OAAO,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAuC,EACvC,CAAU,EACV,MAAmB,EACnB,OAAoB;IAEpB,IAAI,QAA4B,CAAC;IACjC,KAAK,IAAI,KAAK,GAAG,CAAC,GAAI,KAAK,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,CAAC,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc;gBAAE,MAAM,CAAC,CAAC;YACpF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,KAAK,IAAI,eAAe,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,KAAK,QAAQ;gBAAE,MAAM,CAAC,CAAC;YACjF,QAAQ,GAAG,GAAG,CAAC;YACf,OAAO,EAAE,EAAE,CAAC;YACZ,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,SAAS,CACtB,IAA4D,EAC5D,OAA0B;IAE1B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1D,IAAI,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACjE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,mBAAmB,CAAC;YAAE,MAAM,CAAC,CAAC;QACpG,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACjF,CAAC;AACH,CAAC;AAQD,8CAA8C;AAC9C,KAAK,UAAU,QAAQ,CAAC,IAAgB,EAAE,OAA0B,EAAE,MAAmB;IACvF,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5G,8EAA8E;QAC9E,OAAO,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACnH,CAAC;IACD,4FAA4F;IAC5F,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE;YAC3C,MAAM;YACN,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAClE,IAAI,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;SAC/B,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgB,EAChB,OAA0B,EAC1B,MAAmB,EACnB,MAAe;IAEf,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/D,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC3D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9C,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,KAAK,UAAU,aAAa,CAAC,IAAmB,EAAE,MAAmB;IACnE,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3F,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,iEAAiE;AACjE,KAAK,UAAU,QAAQ,CACrB,MAAqB,EACrB,IAAmB,EACnB,OAA0B,EAC1B,MAAmB;IAEnB,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAC3C,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAC5B,IAAI,CAAC,IAAI,KAAK,QAAQ;QACpB,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC;QAC/D,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,IAAI,MAAsB,CAAC;IAC3B,IAAI,KAA8B,CAAC;IACnC,IAAI,KAAyB,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9E,IAAI,WAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,aAAa,GAAG;YACpB,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;YAC/C,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;SAChE,CAAC;QACF,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1D,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;YACzE,8FAA8F;YAC9F,gEAAgE;YAChE,WAAW,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,CAAC,CAAC;IACV,CAAC;IACD,2FAA2F;IAC3F,sDAAsD;IACtD,MAAM,eAAe,EAAE,CAAC;IACxB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IAC/D,CAAC;IACD,4FAA4F;IAC5F,8CAA8C;IAC9C,SAAS,EAAE,CAAC;IACZ,IAAI,GAAG;QACL,EAAE,EAAE,YAAY,EAAE;QAClB,KAAK;QACL,MAAM;QACN,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC;QACxC,MAAM;QACN,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACrD,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC;KACnF,CAAC;IACF,oEAAoE;IACpE,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ;QAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/D,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,MAAM;QACvB,KAAK;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,aAAa;QACb,SAAS,EAAE,KAAK,CAAC,WAAW;QAC5B,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;QACvD,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAG7B,OAAO,IAAI,EAAE,MAAM,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,SAAS,EAAE,CAAC;IACZ,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,OAAO,CAAC,EAAW;IACjC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,WAAW,CAAC,UAAU,EAAE,0CAA0C,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { Op } from "@laminapdf/sdk";
2
+ import type { EditHistory, EditResult, ReplayedStep } from "../protocol.js";
3
+ /** The edit session's history of document `id`. */
4
+ export declare function editHistory(id: number): EditHistory;
5
+ /**
6
+ * Applies `ops` to document `id`'s model as one transaction; when it touched pages, writes the
7
+ * edit and draws those pages from it from now on. The edit session records it as a step named
8
+ * `label`; an edit that changed nothing records none.
9
+ *
10
+ * @throws the op's error (nothing changed); a save or reopen error, after the transaction is
11
+ * undone, so the model again matches what is drawn; an error saying the document must be opened
12
+ * again when that undo failed too, and for every edit after it; an encrypted document's refusal.
13
+ */
14
+ export declare function applyEdit(ops: readonly Op[], id: number, signal: AbortSignal, label?: string): Promise<EditResult>;
15
+ /**
16
+ * Undoes or redoes steps of document `id`'s edit session until `position` of them are done, then
17
+ * draws the pages they touched, once. A move that fails half way is taken back, so the document,
18
+ * the history and the pages drawn stay together.
19
+ */
20
+ export declare function goToStep(position: number, id: number, signal: AbortSignal): Promise<EditResult>;
21
+ /**
22
+ * Undoes (`delta` -1) or redoes (+1) one step of document `id`'s edit session, reading where it
23
+ * stands only once the calls before it are done.
24
+ */
25
+ export declare function stepEdit(delta: -1 | 1, id: number, signal: AbortSignal): Promise<EditResult>;
26
+ /**
27
+ * Applies `steps` to document `id` again, one transaction each, then undoes the newest `undone`
28
+ * of them, and draws once: a restarted worker's document takes back the edits the old one had.
29
+ * The history keeps their labels and times.
30
+ *
31
+ * @throws an op's error, or a save or reopen error: the document is then marked diverged, since
32
+ * the edits applied so far can't all be taken back (the depth limit may have dropped some).
33
+ */
34
+ export declare function restoreEdits(steps: readonly ReplayedStep[], undone: number, id: number, signal: AbortSignal): Promise<EditResult>;
35
+ //# sourceMappingURL=edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/worker/edit.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAY,EAAE,EAAsB,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAgB,MAAM,gBAAgB,CAAC;AAuB1F,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAGnD;AAQD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,SAAS,EAAE,EAAE,EAClB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,WAAW,EACnB,KAAK,SAAgB,GACpB,OAAO,CAAC,UAAU,CAAC,CAErB;AAkCD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAE/F;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAG5F;AAgED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,CAAC,CAErB"}
@@ -0,0 +1,305 @@
1
+ // Edits on screen (E1 plan §6). PDFium draws the pages from the bytes it opened, so an edit to
2
+ // Lamina PDF's model reaches the screen as bytes: after a transaction that touched pages, the
3
+ // model saves incrementally into memory (only the appended revision; the model rebases onto the
4
+ // file with it) and the backend opens the file with every revision appended so far. The new render
5
+ // document replaces the old one only once it is open, so a failure leaves the pages drawn as they
6
+ // were. The worker runs one call at a time, so no render runs while the documents are swapped: a
7
+ // render answered before this call drew the old file, one answered after it draws the new one.
8
+ import { current, currentBackend, filling, followEdit } from "./document.js";
9
+ import { forgetSearch } from "./find.js";
10
+ import { forgetLinks } from "./navigation.js";
11
+ import { clearRedo, historyOf, record, removeStep, restore, snapshot, stepBack, walkTo, } from "./session.js";
12
+ import { forgetText } from "./text.js";
13
+ /** Why an edit that failed left the model and the pages drawn apart: the document must be opened again. */
14
+ const DIVERGED = "an edit failed and couldn't be undone: the document and the pages drawn may differ; open it again";
15
+ /** Why an encrypted document takes no edit: its edits can't be written into memory to be drawn. */
16
+ const ENCRYPTED = "an encrypted document can't be edited yet: its edits can't be saved (encrypted-base)";
17
+ /** The edit session's history of document `id`. */
18
+ export function editHistory(id) {
19
+ const { edit } = current(id);
20
+ return historyOf(edit.session, edit.diverged);
21
+ }
22
+ /** Throws why document `opened` can't take an edit, undo or redo now, if it can't. */
23
+ function editable(opened) {
24
+ if (opened.edit.diverged)
25
+ throw new Error(DIVERGED);
26
+ if (opened.model.isEncrypted)
27
+ throw new Error(ENCRYPTED);
28
+ }
29
+ /**
30
+ * Applies `ops` to document `id`'s model as one transaction; when it touched pages, writes the
31
+ * edit and draws those pages from it from now on. The edit session records it as a step named
32
+ * `label`; an edit that changed nothing records none.
33
+ *
34
+ * @throws the op's error (nothing changed); a save or reopen error, after the transaction is
35
+ * undone, so the model again matches what is drawn; an error saying the document must be opened
36
+ * again when that undo failed too, and for every edit after it; an encrypted document's refusal.
37
+ */
38
+ export function applyEdit(ops, id, signal, label = describe(ops)) {
39
+ return serial(current(id), () => apply(ops, id, signal, label));
40
+ }
41
+ async function apply(ops, id, signal, label) {
42
+ const opened = current(id);
43
+ editable(opened);
44
+ const { model, edit } = opened;
45
+ const count = await model.ensure(() => model.pageCount, { signal });
46
+ const edited = await model.ensure(() => model.apply(ops), { signal });
47
+ if (!edited.changed)
48
+ return { pages: [], history: historyOf(edit.session, false) };
49
+ // The transaction cleared the model's redo stack, whatever happens next.
50
+ clearRedo(edit.session);
51
+ if (edited.touchedPages.length > 0) {
52
+ try {
53
+ await samePages(model, count);
54
+ await redraw(opened);
55
+ }
56
+ catch (e) {
57
+ // The edit never reached the screen: take it back out of the model, so the model matches
58
+ // what is drawn. The undone transaction is left on the model's redo stack, but the session
59
+ // has no step for it, so nothing redoes it, and the next edit clears it.
60
+ await revert(model, edit, "undo", e);
61
+ throw e;
62
+ }
63
+ }
64
+ followEdit(opened, ops);
65
+ const pages = await touched(opened, edited.touchedPages);
66
+ record(edit.session, label, pages.map((page) => page.index), Date.now());
67
+ return { pages, history: historyOf(edit.session, false) };
68
+ }
69
+ /**
70
+ * Undoes or redoes steps of document `id`'s edit session until `position` of them are done, then
71
+ * draws the pages they touched, once. A move that fails half way is taken back, so the document,
72
+ * the history and the pages drawn stay together.
73
+ */
74
+ export function goToStep(position, id, signal) {
75
+ return serial(current(id), () => moveTo(() => position, id, signal));
76
+ }
77
+ /**
78
+ * Undoes (`delta` -1) or redoes (+1) one step of document `id`'s edit session, reading where it
79
+ * stands only once the calls before it are done.
80
+ */
81
+ export function stepEdit(delta, id, signal) {
82
+ const opened = current(id);
83
+ return serial(opened, () => moveTo(() => opened.edit.session.position + delta, id, signal));
84
+ }
85
+ /**
86
+ * Runs `call` after document `opened`'s edit calls before it have settled: the worker serves
87
+ * calls as they come, and an edit's awaits would otherwise let another start against the history
88
+ * it is changing.
89
+ */
90
+ function serial(opened, call) {
91
+ const run = opened.edit.queue.then(call);
92
+ opened.edit.queue = run.catch(() => undefined);
93
+ return run;
94
+ }
95
+ async function moveTo(position, id, signal) {
96
+ const opened = current(id);
97
+ editable(opened);
98
+ const { model, edit } = opened;
99
+ const { session } = edit;
100
+ const kept = snapshot(session);
101
+ const done = [];
102
+ const ids = new Set();
103
+ try {
104
+ await walkTo(session, position(), async (way) => {
105
+ const reverted = await model.ensure(() => (way === "undo" ? model.undo() : model.redo()), { signal });
106
+ // The model has no entry where the session has a step: they disagree, which only a bug does.
107
+ if (reverted === undefined)
108
+ throw new Error(`the document has nothing to ${way}`);
109
+ for (const page of reverted.touchedPages)
110
+ ids.add(page);
111
+ followEdit(opened, way);
112
+ return reverted.outcome;
113
+ }, done);
114
+ if (ids.size > 0)
115
+ await redraw(opened);
116
+ }
117
+ catch (e) {
118
+ await takeBack(opened, kept, done, e);
119
+ throw e;
120
+ }
121
+ const pages = await touched(opened, [...ids]);
122
+ return { pages, history: historyOf(session, false), reverted: done };
123
+ }
124
+ /**
125
+ * Takes back the undos and redos in `done`, newest first, and puts the history back as `kept`
126
+ * was, less the steps the model dropped (a skipped undo or redo leaves it no entry).
127
+ */
128
+ async function takeBack(opened, kept, done, failure) {
129
+ const { model, edit } = opened;
130
+ for (const step of [...done].reverse()) {
131
+ if (step.outcome === "skipped")
132
+ continue;
133
+ await revert(model, edit, step.way === "undo" ? "redo" : "undo", failure);
134
+ followEdit(opened, step.way === "undo" ? "redo" : "undo");
135
+ }
136
+ const { session } = edit;
137
+ restore(session, kept);
138
+ for (const step of done) {
139
+ if (step.outcome !== "skipped")
140
+ continue;
141
+ const index = session.steps.findIndex((s) => s.id === step.step.id);
142
+ if (index >= 0)
143
+ removeStep(session, index, step.way);
144
+ }
145
+ }
146
+ /**
147
+ * Applies `steps` to document `id` again, one transaction each, then undoes the newest `undone`
148
+ * of them, and draws once: a restarted worker's document takes back the edits the old one had.
149
+ * The history keeps their labels and times.
150
+ *
151
+ * @throws an op's error, or a save or reopen error: the document is then marked diverged, since
152
+ * the edits applied so far can't all be taken back (the depth limit may have dropped some).
153
+ */
154
+ export function restoreEdits(steps, undone, id, signal) {
155
+ return serial(current(id), () => replay(steps, undone, id, signal));
156
+ }
157
+ async function replay(steps, undone, id, signal) {
158
+ const opened = current(id);
159
+ editable(opened);
160
+ const { model, edit } = opened;
161
+ const ids = new Set();
162
+ try {
163
+ const count = await model.ensure(() => model.pageCount, { signal });
164
+ for (const step of steps) {
165
+ const edited = await model.ensure(() => model.apply(step.ops), { signal });
166
+ if (!edited.changed)
167
+ continue;
168
+ for (const page of edited.touchedPages)
169
+ ids.add(page);
170
+ followEdit(opened, step.ops);
171
+ const pages = await model.ensure(() => model.pages);
172
+ const wanted = new Set(edited.touchedPages);
173
+ const indices = pages.filter((page) => wanted.has(page.id)).map((page) => page.index);
174
+ record(edit.session, step.label, indices, step.at);
175
+ }
176
+ for (let i = 0; i < undone && edit.session.position > 0; i++) {
177
+ const reverted = await model.ensure(() => model.undo(), { signal });
178
+ if (reverted === undefined)
179
+ break;
180
+ stepBack(edit.session, reverted.outcome);
181
+ followEdit(opened, "undo");
182
+ }
183
+ await samePages(model, count);
184
+ if (ids.size > 0)
185
+ await redraw(opened);
186
+ }
187
+ catch (e) {
188
+ edit.diverged = true;
189
+ throw new Error(DIVERGED, { cause: e });
190
+ }
191
+ // The file reopened as it was: the saved document is the one opened.
192
+ edit.session.saved = 0;
193
+ return { pages: await touched(opened, [...ids]), history: historyOf(edit.session, false) };
194
+ }
195
+ /** A label for an edit whose caller gave none: its ops' names. */
196
+ function describe(ops) {
197
+ return ops.map((op) => op.op).join(", ");
198
+ }
199
+ /**
200
+ * Refuses an edit that added, removed or moved pages: the view finds pages by index, and
201
+ * `EditResult` names pages by their indices after the edit.
202
+ */
203
+ async function samePages(model, before) {
204
+ const after = await model.ensure(() => model.pageCount);
205
+ if (after !== before)
206
+ throw new Error(`an edit that changes the page count (${before} → ${after}) can't be shown yet`);
207
+ }
208
+ /**
209
+ * Undoes (or redoes) the transaction just applied (or undone); when that fails too, marks the
210
+ * document diverged.
211
+ */
212
+ async function revert(model, edit, way, failure) {
213
+ let reverted;
214
+ try {
215
+ reverted = await model.ensure(() => (way === "undo" ? model.undo() : model.redo()));
216
+ }
217
+ catch (e) {
218
+ edit.diverged = true;
219
+ throw new Error(DIVERGED, { cause: [failure, e] });
220
+ }
221
+ // A partial outcome still restored what it could; only nothing at all leaves them apart.
222
+ if (reverted === undefined || reverted.outcome === "skipped") {
223
+ edit.diverged = true;
224
+ throw new Error(DIVERGED, { cause: failure });
225
+ }
226
+ }
227
+ /** The pages with these IDs, as they are now, in index order; what the worker kept of them is forgotten. */
228
+ async function touched(opened, ids) {
229
+ if (ids.length === 0)
230
+ return [];
231
+ const wanted = new Set(ids);
232
+ const { model } = opened;
233
+ const pages = (await model.ensure(() => model.pages)).filter((page) => wanted.has(page.id));
234
+ const indices = pages.map((page) => page.index);
235
+ forgetText(indices);
236
+ forgetSearch(indices);
237
+ forgetLinks(indices);
238
+ return pages;
239
+ }
240
+ /**
241
+ * Saves the model's changes into memory and swaps in a render document opened from the result.
242
+ * The old one keeps drawing until the new one is open, and is closed after.
243
+ */
244
+ async function redraw(opened) {
245
+ const { model, edit } = opened;
246
+ // Only the appended revision: the model rebases onto the old file with it, copying nothing.
247
+ const { bytes } = await model.ensure(() => model.saveWithReport({ mode: "incremental", output: "appendedOnly" }));
248
+ // Kept even if the reopen below fails: the model's file now ends with this revision, and the
249
+ // next save appends to it. Each edit adds one revision, and one more section to the chain of
250
+ // cross-reference sections PDFium reads on open; compacting them is the edit session's to decide.
251
+ edit.appended.push(bytes);
252
+ const source = joined([edit.source, ...edit.appended.map(bytesSource)]);
253
+ const options = edit.renderLimits === undefined ? {} : { limits: edit.renderLimits };
254
+ // Not the caller's signal: the model is already saved, so the reopen finishes either way.
255
+ const next = await filling(opened.remote, () => currentBackend().open(source, options), new AbortController().signal);
256
+ const old = opened.render;
257
+ opened.render = next;
258
+ old.close();
259
+ }
260
+ function bytesSource(bytes) {
261
+ return { size: bytes.length, readSync: (offset, length) => bytes.subarray(offset, offset + length) };
262
+ }
263
+ /**
264
+ * `parts` one after another, read in place: the file and the revisions appended to it, never
265
+ * copied into one buffer. A part that answers `undefined` (a remote file's bytes not fetched yet)
266
+ * makes the read answer `undefined`, which `filling` fetches.
267
+ */
268
+ function joined(parts) {
269
+ const starts = [];
270
+ let size = 0;
271
+ for (const part of parts) {
272
+ starts.push(size);
273
+ size += part.size;
274
+ }
275
+ return {
276
+ size,
277
+ readSync(offset, length) {
278
+ const end = Math.min(size, offset + length);
279
+ const pieces = [];
280
+ for (let i = 0; i < parts.length; i++) {
281
+ const start = starts[i];
282
+ const part = parts[i];
283
+ const from = Math.max(offset, start);
284
+ const to = Math.min(end, start + part.size);
285
+ if (from >= to)
286
+ continue;
287
+ const piece = part.readSync(from - start, to - from);
288
+ if (piece === undefined)
289
+ return undefined;
290
+ pieces.push(piece);
291
+ }
292
+ return pieces.length === 1 ? pieces[0] : concat(pieces);
293
+ },
294
+ };
295
+ }
296
+ function concat(pieces) {
297
+ const out = new Uint8Array(pieces.reduce((sum, piece) => sum + piece.length, 0));
298
+ let at = 0;
299
+ for (const piece of pieces) {
300
+ out.set(piece, at);
301
+ at += piece.length;
302
+ }
303
+ return out;
304
+ }
305
+ //# sourceMappingURL=edit.js.map