@prosopo/procaptcha-puzzle 2.10.40 → 2.10.41

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 (52) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +4 -4
  2. package/.turbo/turbo-build$colon$tsc.log +19 -19
  3. package/.turbo/turbo-build.log +6 -6
  4. package/CHANGELOG.md +7 -0
  5. package/dist/cjs/components/ProcaptchaWidget.cjs +10 -5
  6. package/dist/cjs/services/Manager.cjs +3 -3
  7. package/dist/components/ProcaptchaWidget.d.ts.map +1 -1
  8. package/dist/components/ProcaptchaWidget.js +10 -5
  9. package/dist/components/ProcaptchaWidget.js.map +1 -1
  10. package/dist/services/Manager.d.ts.map +1 -1
  11. package/dist/services/Manager.js +3 -3
  12. package/dist/services/Manager.js.map +1 -1
  13. package/dist/tests/manager.unit.test.d.ts +2 -0
  14. package/dist/tests/manager.unit.test.d.ts.map +1 -0
  15. package/dist/tests/manager.unit.test.js +506 -0
  16. package/dist/tests/manager.unit.test.js.map +1 -0
  17. package/dist/tests/managerHarness.d.ts +20 -0
  18. package/dist/tests/managerHarness.d.ts.map +1 -0
  19. package/dist/tests/managerHarness.js +86 -0
  20. package/dist/tests/managerHarness.js.map +1 -0
  21. package/dist/tests/procaptchaPuzzle.test-d.d.ts +2 -0
  22. package/dist/tests/procaptchaPuzzle.test-d.d.ts.map +1 -0
  23. package/dist/tests/procaptchaPuzzle.test-d.js +97 -0
  24. package/dist/tests/procaptchaPuzzle.test-d.js.map +1 -0
  25. package/dist/tests/procaptchaPuzzle.unit.test.d.ts +2 -0
  26. package/dist/tests/procaptchaPuzzle.unit.test.d.ts.map +1 -0
  27. package/dist/tests/procaptchaPuzzle.unit.test.js +81 -0
  28. package/dist/tests/procaptchaPuzzle.unit.test.js.map +1 -0
  29. package/dist/tests/procaptchaWidget.unit.test.d.ts +2 -0
  30. package/dist/tests/procaptchaWidget.unit.test.d.ts.map +1 -0
  31. package/dist/tests/procaptchaWidget.unit.test.js +547 -0
  32. package/dist/tests/procaptchaWidget.unit.test.js.map +1 -0
  33. package/dist/tests/puzzleCanvas.unit.test.d.ts +2 -0
  34. package/dist/tests/puzzleCanvas.unit.test.d.ts.map +1 -0
  35. package/dist/tests/puzzleCanvas.unit.test.js +312 -0
  36. package/dist/tests/puzzleCanvas.unit.test.js.map +1 -0
  37. package/dist/tests/setup.d.ts +5 -0
  38. package/dist/tests/setup.d.ts.map +1 -0
  39. package/dist/tests/setup.js +3 -0
  40. package/dist/tests/setup.js.map +1 -0
  41. package/package.json +9 -4
  42. package/src/components/ProcaptchaWidget.tsx +17 -6
  43. package/src/services/Manager.ts +10 -6
  44. package/src/tests/manager.unit.test.ts +763 -0
  45. package/src/tests/managerHarness.ts +169 -0
  46. package/src/tests/procaptchaPuzzle.test-d.ts +191 -0
  47. package/src/tests/procaptchaPuzzle.unit.test.ts +123 -0
  48. package/src/tests/procaptchaWidget.unit.test.ts +789 -0
  49. package/src/tests/puzzleCanvas.unit.test.ts +418 -0
  50. package/src/tests/setup.ts +26 -0
  51. package/tsconfig.tsbuildinfo +1 -1
  52. package/vite.test.config.ts +27 -0
@@ -0,0 +1,547 @@
1
+ import { ModeEnum, } from "@prosopo/types";
2
+ import { act, createElement } from "react";
3
+ import { createRoot } from "react-dom/client";
4
+ import { afterEach, beforeEach, describe, expect, test, vi, } from "vitest";
5
+ import Procaptcha from "../components/ProcaptchaWidget.js";
6
+ import { challengeResponse, config, frictionless } from "./managerHarness.js";
7
+ const mocks = vi.hoisted(() => {
8
+ const start = vi.fn();
9
+ const submitSolution = vi.fn();
10
+ const resetState = vi.fn();
11
+ const constructions = [];
12
+ const loadI18next = vi.fn();
13
+ const checkboxProps = { current: undefined };
14
+ const canvasProps = { current: undefined };
15
+ const honeypotQuestions = [];
16
+ const translationsReady = { current: true };
17
+ return {
18
+ translationsReady,
19
+ start,
20
+ submitSolution,
21
+ resetState,
22
+ constructions,
23
+ loadI18next,
24
+ checkboxProps,
25
+ canvasProps,
26
+ honeypotQuestions,
27
+ };
28
+ });
29
+ vi.mock("../services/Manager.js", () => ({
30
+ Manager: (_config, _state, updateState, _callbacks, _frictionlessState, getHoneypotValue) => {
31
+ mocks.constructions.push({ updateState, getHoneypotValue });
32
+ return {
33
+ start: mocks.start,
34
+ submitSolution: mocks.submitSolution,
35
+ resetState: mocks.resetState,
36
+ };
37
+ },
38
+ }));
39
+ vi.mock("../components/PuzzleCanvas.js", async () => {
40
+ const { createElement: create } = await import("react");
41
+ const PuzzleCanvas = (canvasProps) => {
42
+ mocks.canvasProps.current = canvasProps;
43
+ return create("div", { "data-cy": "canvas-stub" });
44
+ };
45
+ return { PuzzleCanvas };
46
+ });
47
+ vi.mock("@prosopo/procaptcha-common", async (importOriginal) => {
48
+ const actual = await importOriginal();
49
+ const { createElement: create, forwardRef } = await import("react");
50
+ const Checkbox = (checkboxProps) => {
51
+ mocks.checkboxProps.current = checkboxProps;
52
+ return create("input", {
53
+ type: "checkbox",
54
+ readOnly: true,
55
+ checked: checkboxProps.checked,
56
+ "aria-label": checkboxProps.labelText,
57
+ "data-error": checkboxProps.error,
58
+ "data-loading": String(checkboxProps.loading),
59
+ });
60
+ };
61
+ const Honeypot = forwardRef(({ encodedQuestion }, ref) => {
62
+ mocks.honeypotQuestions.push(encodedQuestion);
63
+ return create("input", { type: "text", ref, name: "honeypot" });
64
+ });
65
+ return { ...actual, Checkbox, Honeypot };
66
+ });
67
+ vi.mock("@prosopo/locale", async (importOriginal) => {
68
+ const actual = await importOriginal();
69
+ return {
70
+ ...actual,
71
+ loadI18next: mocks.loadI18next,
72
+ useTranslation: () => ({
73
+ t: (key) => key,
74
+ ready: mocks.translationsReady.current,
75
+ }),
76
+ };
77
+ });
78
+ let container;
79
+ let root;
80
+ const i18nStub = (language, changeLanguage) => ({ language, changeLanguage });
81
+ const props = (overrides = {}) => ({
82
+ config: config(),
83
+ callbacks: {},
84
+ i18n: undefined,
85
+ ...overrides,
86
+ });
87
+ const render = (widgetProps) => {
88
+ act(() => {
89
+ root.render(createElement(Procaptcha, widgetProps));
90
+ });
91
+ };
92
+ beforeEach(() => {
93
+ vi.clearAllMocks();
94
+ mocks.constructions.length = 0;
95
+ mocks.honeypotQuestions.length = 0;
96
+ mocks.translationsReady.current = true;
97
+ mocks.checkboxProps.current = undefined;
98
+ mocks.canvasProps.current = undefined;
99
+ mocks.start.mockResolvedValue(challengeResponse());
100
+ mocks.submitSolution.mockResolvedValue(true);
101
+ mocks.loadI18next.mockResolvedValue(undefined);
102
+ container = document.createElement("div");
103
+ document.body.appendChild(container);
104
+ act(() => {
105
+ root = createRoot(container);
106
+ });
107
+ });
108
+ afterEach(() => {
109
+ act(() => {
110
+ root.unmount();
111
+ });
112
+ container.remove();
113
+ vi.useRealTimers();
114
+ vi.restoreAllMocks();
115
+ });
116
+ const checkbox = () => {
117
+ const element = container.querySelector('input[type="checkbox"]');
118
+ if (!element)
119
+ throw new Error("expected a checkbox to be rendered");
120
+ return element;
121
+ };
122
+ const canvas = () => container.querySelector('[data-cy="canvas-stub"]');
123
+ const honeypotInput = () => {
124
+ const element = container.querySelector('input[name="honeypot"]');
125
+ if (!element)
126
+ throw new Error("expected a honeypot to be rendered");
127
+ return element;
128
+ };
129
+ const click = async (options = {}) => {
130
+ const nativeEvent = {
131
+ isTrusted: options.trusted ?? true,
132
+ clientX: options.clientX ?? 0,
133
+ clientY: options.clientY ?? 0,
134
+ ...(options.touches ? { touches: options.touches } : {}),
135
+ };
136
+ await act(async () => {
137
+ await mocks.checkboxProps.current?.onChange({ nativeEvent });
138
+ });
139
+ };
140
+ const clickWithoutWaiting = () => {
141
+ act(() => {
142
+ void mocks.checkboxProps.current?.onChange({
143
+ nativeEvent: { isTrusted: true, clientX: 0, clientY: 0 },
144
+ });
145
+ });
146
+ };
147
+ const complete = async (x = 200, y = 80, events = [{ x: 200, y: 80, t: 5 }]) => {
148
+ await act(async () => {
149
+ await mocks.canvasProps.current?.onComplete(x, y, events);
150
+ });
151
+ };
152
+ describe("what the widget renders", () => {
153
+ test("a visible widget shows a checkbox", () => {
154
+ render(props());
155
+ expect(checkbox()).toBeDefined();
156
+ });
157
+ test("an invisible widget shows no checkbox at all", () => {
158
+ render(props({ config: config({ mode: ModeEnum.invisible }) }));
159
+ expect(container.querySelector('input[type="checkbox"]')).toBeNull();
160
+ });
161
+ test("no puzzle is shown until a challenge has been fetched", () => {
162
+ render(props());
163
+ expect(canvas()).toBeNull();
164
+ });
165
+ test("a session with a honeypot question renders the honeypot", () => {
166
+ render(props({ frictionlessState: frictionless({ hp: "question" }) }));
167
+ expect(honeypotInput()).toBeDefined();
168
+ expect(mocks.honeypotQuestions.at(-1)).toBe("question");
169
+ });
170
+ test("a session without one renders no bait at all", () => {
171
+ render(props({ frictionlessState: frictionless() }));
172
+ expect(container.querySelector('input[name="honeypot"]')).toBeNull();
173
+ });
174
+ test("the manager can read the honeypot input the widget rendered", () => {
175
+ render(props({ frictionlessState: frictionless({ hp: "question" }) }));
176
+ honeypotInput().value = "bot@example.com";
177
+ expect(mocks.constructions[0]?.getHoneypotValue?.()).toBe("bot@example.com");
178
+ });
179
+ test("a dark-themed widget still renders its checkbox", () => {
180
+ render(props({ config: config({ theme: "dark" }) }));
181
+ expect(checkbox()).toBeDefined();
182
+ });
183
+ test("the checkbox is labelled once the translations are ready", () => {
184
+ render(props());
185
+ expect(mocks.checkboxProps.current?.labelText).toBe("WIDGET.I_AM_HUMAN");
186
+ });
187
+ test("the label is left empty while the translations load", () => {
188
+ mocks.translationsReady.current = false;
189
+ render(props());
190
+ expect(mocks.checkboxProps.current?.labelText).toBe("");
191
+ });
192
+ test("the widget keeps the manager it started with across re-renders", () => {
193
+ render(props());
194
+ render(props());
195
+ act(() => {
196
+ mocks.constructions[0]?.updateState({
197
+ error: {
198
+ message: "from the original manager",
199
+ key: "API.UNKNOWN_ERROR",
200
+ },
201
+ });
202
+ });
203
+ expect(mocks.checkboxProps.current?.error).toBe("from the original manager");
204
+ });
205
+ });
206
+ describe("language", () => {
207
+ test("nothing is loaded when no language is configured", () => {
208
+ render(props());
209
+ expect(mocks.loadI18next).not.toHaveBeenCalled();
210
+ });
211
+ test("a configured language boots i18next with it", () => {
212
+ render(props({ config: config({ language: "fr" }) }));
213
+ expect(mocks.loadI18next).toHaveBeenCalledWith(false, "fr");
214
+ });
215
+ test("an injected i18n on another language is switched over", () => {
216
+ const changeLanguage = vi.fn();
217
+ render(props({
218
+ config: config({ language: "fr" }),
219
+ i18n: i18nStub("en", changeLanguage),
220
+ }));
221
+ expect(changeLanguage).toHaveBeenCalledWith("fr");
222
+ expect(mocks.loadI18next).not.toHaveBeenCalled();
223
+ });
224
+ test("an injected i18n already on that language is left alone", () => {
225
+ const changeLanguage = vi.fn();
226
+ render(props({
227
+ config: config({ language: "fr" }),
228
+ i18n: i18nStub("fr", changeLanguage),
229
+ }));
230
+ expect(changeLanguage).not.toHaveBeenCalled();
231
+ });
232
+ });
233
+ describe("starting from the checkbox", () => {
234
+ test("a click starts the solve and opens the puzzle", async () => {
235
+ render(props());
236
+ await click({ clientX: 12, clientY: 34 });
237
+ expect(mocks.start).toHaveBeenCalledWith(12, 34);
238
+ expect(canvas()).not.toBeNull();
239
+ expect(mocks.canvasProps.current).toMatchObject({
240
+ originX: challengeResponse().originX,
241
+ targetY: challengeResponse().targetY,
242
+ submitting: false,
243
+ showRetry: false,
244
+ });
245
+ });
246
+ test("an untrusted click starts a solve but carries no coordinates", async () => {
247
+ render(props());
248
+ await click({ trusted: false, clientX: 12, clientY: 34 });
249
+ expect(mocks.start).toHaveBeenCalledWith(0, 0);
250
+ });
251
+ test("a tap reports the coordinates of the first touch", async () => {
252
+ render(props());
253
+ await click({ touches: [{ clientX: 7, clientY: 9 }] });
254
+ expect(mocks.start).toHaveBeenCalledWith(7, 9);
255
+ });
256
+ test("a touch event with no touches falls back to the origin", async () => {
257
+ render(props());
258
+ await click({ touches: [] });
259
+ expect(mocks.start).toHaveBeenCalledWith(0, 0);
260
+ });
261
+ test("a second click while the first is in flight is ignored", async () => {
262
+ let release = () => {
263
+ };
264
+ mocks.start.mockReturnValue(new Promise((resolve) => {
265
+ release = resolve;
266
+ }));
267
+ render(props());
268
+ clickWithoutWaiting();
269
+ clickWithoutWaiting();
270
+ expect(mocks.start).toHaveBeenCalledTimes(1);
271
+ await act(async () => {
272
+ release(challengeResponse());
273
+ });
274
+ });
275
+ test("the checkbox shows a spinner while the solve is loading", async () => {
276
+ let release = () => {
277
+ };
278
+ mocks.start.mockReturnValue(new Promise((resolve) => {
279
+ release = resolve;
280
+ }));
281
+ render(props());
282
+ clickWithoutWaiting();
283
+ expect(mocks.checkboxProps.current?.loading).toBe(true);
284
+ await act(async () => {
285
+ release(challengeResponse());
286
+ });
287
+ expect(mocks.checkboxProps.current?.loading).toBe(false);
288
+ });
289
+ test("a start that yields no challenge leaves the checkbox in place", async () => {
290
+ mocks.start.mockResolvedValue(undefined);
291
+ render(props());
292
+ await click();
293
+ expect(canvas()).toBeNull();
294
+ expect(mocks.checkboxProps.current?.loading).toBe(false);
295
+ });
296
+ test("a start that throws returns the user to a usable checkbox", async () => {
297
+ const onError = vi.fn();
298
+ mocks.start.mockRejectedValue(new Error("provider down"));
299
+ render(props({ callbacks: { onError } }));
300
+ await click();
301
+ expect(mocks.checkboxProps.current?.loading).toBe(false);
302
+ expect(onError).toHaveBeenCalledWith(expect.any(Error));
303
+ });
304
+ test("a start that throws without an error callback is still recoverable", async () => {
305
+ mocks.start.mockRejectedValue(new Error("provider down"));
306
+ render(props());
307
+ await click();
308
+ expect(mocks.checkboxProps.current?.loading).toBe(false);
309
+ });
310
+ });
311
+ describe("autoStart", () => {
312
+ test("fetches a challenge and opens the puzzle without a click", async () => {
313
+ await act(async () => {
314
+ root.render(createElement(Procaptcha, props({ autoStart: true, startCoords: { x: 5, y: 6 } })));
315
+ });
316
+ expect(mocks.start).toHaveBeenCalledWith(5, 6);
317
+ expect(canvas()).not.toBeNull();
318
+ });
319
+ test("starts at the origin when no coordinates were handed over", async () => {
320
+ await act(async () => {
321
+ root.render(createElement(Procaptcha, props({ autoStart: true })));
322
+ });
323
+ expect(mocks.start).toHaveBeenCalledWith(0, 0);
324
+ });
325
+ test("a failed autoStart leaves the checkbox usable", async () => {
326
+ mocks.start.mockRejectedValue(new Error("nope"));
327
+ await act(async () => {
328
+ root.render(createElement(Procaptcha, props({ autoStart: true })));
329
+ });
330
+ expect(canvas()).toBeNull();
331
+ expect(mocks.checkboxProps.current?.loading).toBe(false);
332
+ });
333
+ test("no autoStart means no solve until the user acts", () => {
334
+ render(props());
335
+ expect(mocks.start).not.toHaveBeenCalled();
336
+ });
337
+ });
338
+ describe("finishing the drag", () => {
339
+ const openPuzzle = async (widgetProps = props()) => {
340
+ render(widgetProps);
341
+ await click();
342
+ };
343
+ test("submits the drop position and the trail the canvas gathered", async () => {
344
+ await openPuzzle();
345
+ const events = [{ x: 1, y: 2, t: 3 }];
346
+ await complete(150, 60, events);
347
+ expect(mocks.submitSolution).toHaveBeenCalledWith(150, 60, events);
348
+ });
349
+ test("a verified solution closes the puzzle", async () => {
350
+ await openPuzzle();
351
+ await complete();
352
+ expect(canvas()).toBeNull();
353
+ expect(mocks.checkboxProps.current?.loading).toBe(false);
354
+ });
355
+ test("a rejected solution asks for another go on a fresh challenge", async () => {
356
+ mocks.submitSolution.mockResolvedValue(false);
357
+ const retryChallenge = challengeResponse({ originX: 40, targetX: 250 });
358
+ mocks.start
359
+ .mockResolvedValueOnce(challengeResponse())
360
+ .mockResolvedValue(retryChallenge);
361
+ await openPuzzle();
362
+ await complete();
363
+ expect(canvas()).not.toBeNull();
364
+ expect(mocks.canvasProps.current).toMatchObject({
365
+ showRetry: true,
366
+ originX: 40,
367
+ targetX: 250,
368
+ submitting: false,
369
+ });
370
+ });
371
+ test("a rejected solution with no replacement challenge closes the puzzle", async () => {
372
+ mocks.submitSolution.mockResolvedValue(false);
373
+ mocks.start
374
+ .mockResolvedValueOnce(challengeResponse())
375
+ .mockResolvedValue(undefined);
376
+ await openPuzzle();
377
+ await complete();
378
+ expect(canvas()).toBeNull();
379
+ });
380
+ test("a rejected solution whose retry throws closes the puzzle", async () => {
381
+ mocks.submitSolution.mockResolvedValue(false);
382
+ mocks.start
383
+ .mockResolvedValueOnce(challengeResponse())
384
+ .mockRejectedValue(new Error("provider down"));
385
+ await openPuzzle();
386
+ await complete();
387
+ expect(canvas()).toBeNull();
388
+ });
389
+ test("a submit that throws is reported and treated as a failure", async () => {
390
+ const onError = vi.fn();
391
+ mocks.submitSolution.mockRejectedValue(new Error("boom"));
392
+ await openPuzzle(props({ callbacks: { onError } }));
393
+ await complete();
394
+ expect(onError).toHaveBeenCalledWith(expect.any(Error));
395
+ expect(mocks.start).toHaveBeenCalledTimes(2);
396
+ });
397
+ test("a submit that throws a non-error still reaches the callback", async () => {
398
+ const onError = vi.fn();
399
+ mocks.submitSolution.mockRejectedValue("just a string");
400
+ await openPuzzle(props({ callbacks: { onError } }));
401
+ await complete();
402
+ expect(onError).toHaveBeenCalledWith(expect.any(Error));
403
+ });
404
+ test("the puzzle is frozen while the solution is in flight", async () => {
405
+ let release = () => {
406
+ };
407
+ mocks.submitSolution.mockReturnValue(new Promise((resolve) => {
408
+ release = resolve;
409
+ }));
410
+ await openPuzzle();
411
+ act(() => {
412
+ void mocks.canvasProps.current?.onComplete(200, 80, []);
413
+ });
414
+ expect(mocks.canvasProps.current?.submitting).toBe(true);
415
+ expect(mocks.checkboxProps.current?.loading).toBe(true);
416
+ await act(async () => {
417
+ release(true);
418
+ });
419
+ });
420
+ });
421
+ describe("invisible mode", () => {
422
+ const execute = async () => {
423
+ await act(async () => {
424
+ document.dispatchEvent(new Event("procaptcha:execute"));
425
+ await Promise.resolve();
426
+ });
427
+ };
428
+ test("an execute event fetches a challenge and opens the puzzle", async () => {
429
+ render(props({ config: config({ mode: ModeEnum.invisible }) }));
430
+ await execute();
431
+ expect(mocks.start).toHaveBeenCalledTimes(1);
432
+ expect(canvas()).not.toBeNull();
433
+ });
434
+ test("a visible widget ignores the execute event entirely", async () => {
435
+ render(props());
436
+ await execute();
437
+ expect(mocks.start).not.toHaveBeenCalled();
438
+ });
439
+ test("an execute that yields no challenge shows no puzzle", async () => {
440
+ mocks.start.mockResolvedValue(undefined);
441
+ render(props({ config: config({ mode: ModeEnum.invisible }) }));
442
+ await execute();
443
+ expect(canvas()).toBeNull();
444
+ });
445
+ test("an execute that throws is reported to the host page", async () => {
446
+ const onError = vi.fn();
447
+ mocks.start.mockRejectedValue(new Error("provider down"));
448
+ render(props({
449
+ config: config({ mode: ModeEnum.invisible }),
450
+ callbacks: { onError },
451
+ }));
452
+ await execute();
453
+ expect(onError).toHaveBeenCalledWith(expect.any(Error));
454
+ });
455
+ test("an execute that throws a non-error is still reported", async () => {
456
+ const onError = vi.fn();
457
+ mocks.start.mockRejectedValue("just a string");
458
+ render(props({
459
+ config: config({ mode: ModeEnum.invisible }),
460
+ callbacks: { onError },
461
+ }));
462
+ await execute();
463
+ expect(onError).toHaveBeenCalledWith(expect.any(Error));
464
+ });
465
+ test("the listener is dropped when the widget unmounts", async () => {
466
+ render(props({ config: config({ mode: ModeEnum.invisible }) }));
467
+ act(() => {
468
+ root.unmount();
469
+ });
470
+ act(() => {
471
+ root = createRoot(container);
472
+ });
473
+ await execute();
474
+ expect(mocks.start).not.toHaveBeenCalled();
475
+ });
476
+ });
477
+ describe("an invalidated session", () => {
478
+ const invalidate = (key = "CAPTCHA.NO_SESSION_FOUND", message = "session gone") => {
479
+ act(() => {
480
+ mocks.constructions[0]?.updateState({ error: { message, key } });
481
+ });
482
+ };
483
+ test("the error is shown on the checkbox and the puzzle is torn down", async () => {
484
+ render(props());
485
+ await click();
486
+ invalidate("API.UNKNOWN_ERROR", "something broke");
487
+ expect(mocks.checkboxProps.current?.error).toBe("something broke");
488
+ expect(canvas()).toBeNull();
489
+ expect(mocks.checkboxProps.current?.loading).toBe(false);
490
+ });
491
+ test("the host is told to re-mint, with the coordinates of the original click", async () => {
492
+ const onSessionInvalidated = vi.fn();
493
+ render(props({ onSessionInvalidated }));
494
+ await click({ clientX: 12, clientY: 34 });
495
+ invalidate();
496
+ expect(onSessionInvalidated).toHaveBeenCalledWith(12, 34);
497
+ });
498
+ test("the host is told only once, however many errors arrive", async () => {
499
+ const onSessionInvalidated = vi.fn();
500
+ render(props({ onSessionInvalidated }));
501
+ await click();
502
+ invalidate("CAPTCHA.NO_SESSION_FOUND", "gone");
503
+ invalidate("CAPTCHA.NO_SESSION_FOUND", "gone again");
504
+ expect(onSessionInvalidated).toHaveBeenCalledTimes(1);
505
+ });
506
+ test("with no host handler the frictionless session restarts instead", async () => {
507
+ vi.useFakeTimers();
508
+ const restart = vi.fn();
509
+ render(props({ frictionlessState: frictionless({ restart }) }));
510
+ invalidate();
511
+ expect(restart).not.toHaveBeenCalled();
512
+ await act(async () => {
513
+ await vi.advanceTimersByTimeAsync(100);
514
+ });
515
+ expect(restart).toHaveBeenCalledTimes(1);
516
+ vi.useRealTimers();
517
+ });
518
+ test("a restart pending at unmount is cancelled", async () => {
519
+ vi.useFakeTimers();
520
+ const restart = vi.fn();
521
+ render(props({ frictionlessState: frictionless({ restart }) }));
522
+ invalidate();
523
+ act(() => {
524
+ root.unmount();
525
+ });
526
+ await act(async () => {
527
+ await vi.advanceTimersByTimeAsync(200);
528
+ });
529
+ expect(restart).not.toHaveBeenCalled();
530
+ act(() => {
531
+ root = createRoot(container);
532
+ });
533
+ vi.useRealTimers();
534
+ });
535
+ test("a lost session with nothing to recover it is simply surfaced", async () => {
536
+ render(props());
537
+ invalidate();
538
+ expect(mocks.checkboxProps.current?.error).toBe("session gone");
539
+ });
540
+ test("no coordinates are reported when the session was never clicked into", () => {
541
+ const onSessionInvalidated = vi.fn();
542
+ render(props({ onSessionInvalidated }));
543
+ invalidate();
544
+ expect(onSessionInvalidated).toHaveBeenCalledWith(undefined, undefined);
545
+ });
546
+ });
547
+ //# sourceMappingURL=procaptchaWidget.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procaptchaWidget.unit.test.js","sourceRoot":"","sources":["../../src/tests/procaptchaWidget.unit.test.ts"],"names":[],"mappings":"AAeA,OAAO,EAEN,QAAQ,GAIR,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAqB,GAAG,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAa,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAEN,SAAS,EACT,UAAU,EACV,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,EAAE,GACF,MAAM,QAAQ,CAAC;AAChB,OAAO,UAAU,MAAM,mCAAmC,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAO9E,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;IAC7B,MAAM,KAAK,GACV,EAAE,CAAC,EAAE,EAEF,CAAC;IACL,MAAM,cAAc,GACnB,EAAE,CAAC,EAAE,EAAqE,CAAC;IAC5E,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAc,CAAC;IACvC,MAAM,aAAa,GAGb,EAAE,CAAC;IACT,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAiD,CAAC;IAC3E,MAAM,aAAa,GAUf,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAC3B,MAAM,WAAW,GAgBb,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAC3B,MAAM,iBAAiB,GAAa,EAAE,CAAC;IACvC,MAAM,iBAAiB,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5C,OAAO;QACN,iBAAiB;QACjB,KAAK;QACL,cAAc;QACd,UAAU;QACV,aAAa;QACb,WAAW;QACX,aAAa;QACb,WAAW;QACX,iBAAiB;KACjB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,OAAO,EAAE,CACR,OAAgB,EAChB,MAAuB,EACvB,WAAqD,EACrD,UAAmB,EACnB,kBAA2B,EAC3B,gBAA2C,EAC1C,EAAE;QACH,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC5D,OAAO;YACN,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,UAAU,EAAE,KAAK,CAAC,UAAU;SAC5B,CAAC;IACH,CAAC;CACD,CAAC,CAAC,CAAC;AAKJ,EAAE,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;IACnD,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IAcxD,MAAM,YAAY,GAAG,CAAC,WAA4B,EAAE,EAAE;QACrD,KAAK,CAAC,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC;QACxC,OAAO,MAAM,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC;IACF,OAAO,EAAE,YAAY,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAOH,EAAE,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAC9D,MAAM,MAAM,GACX,MAAM,cAAc,EAA+C,CAAC;IACrE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IAQpE,MAAM,QAAQ,GAAG,CAAC,aAAgC,EAAE,EAAE;QACrD,KAAK,CAAC,aAAa,CAAC,OAAO,GAAG,aAAa,CAAC;QAC5C,OAAO,MAAM,CAAC,OAAO,EAAE;YACtB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,YAAY,EAAE,aAAa,CAAC,SAAS;YACrC,YAAY,EAAE,aAAa,CAAC,KAAK;YACjC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;SAC7C,CAAC,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,UAAU,CAC1B,CAAC,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,EAAE;QAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACjE,CAAC,CACD,CAAC;IACF,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACnD,MAAM,MAAM,GAAG,MAAM,cAAc,EAAoC,CAAC;IACxE,OAAO;QACN,GAAG,MAAM;QACT,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;YACtB,CAAC,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;YACvB,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAAC,OAAO;SACtC,CAAC;KACF,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,SAAyB,CAAC;AAC9B,IAAI,IAAU,CAAC;AAEf,MAAM,QAAQ,GAAG,CAChB,QAAgB,EAChB,cAAyC,EACxC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAqB,CAAC;AAExD,MAAM,KAAK,GAAG,CAAC,YAAsC,EAAE,EAAmB,EAAE,CAAC,CAAC;IAC7E,MAAM,EAAE,MAAM,EAAE;IAChB,SAAS,EAAE,EAAE;IACb,IAAI,EAAE,SAA6B;IACnC,GAAG,SAAS;CACZ,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,CAAC,WAA4B,EAAQ,EAAE;IACrD,GAAG,CAAC,GAAG,EAAE;QACR,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,WAAW,CAAiB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,UAAU,CAAC,GAAG,EAAE;IACf,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,KAAK,CAAC,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;IACvC,KAAK,CAAC,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC;IACxC,KAAK,CAAC,WAAW,CAAC,OAAO,GAAG,SAAS,CAAC;IACtC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC/C,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACrC,GAAG,CAAC,GAAG,EAAE;QACR,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACd,GAAG,CAAC,GAAG,EAAE;QACR,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,MAAM,EAAE,CAAC;IAGnB,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,eAAe,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,GAAqB,EAAE;IACvC,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CACtC,wBAAwB,CACxB,CAAC;IACF,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACpE,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,GAAmB,EAAE,CACnC,SAAS,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;AAEpD,MAAM,aAAa,GAAG,GAAqB,EAAE;IAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CACtC,wBAAwB,CACxB,CAAC;IACF,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACpE,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC;AAUF,MAAM,KAAK,GAAG,KAAK,EAAE,UAAwB,EAAE,EAAiB,EAAE;IACjE,MAAM,WAAW,GAAG;QACnB,SAAS,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC;QAC7B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC;QAC7B,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC;IACF,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC;AAMF,MAAM,mBAAmB,GAAG,GAAS,EAAE;IACtC,GAAG,CAAC,GAAG,EAAE;QACR,KAAK,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC;YAC1C,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;SACxD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,QAAQ,GAAG,KAAK,EACrB,CAAC,GAAG,GAAG,EACP,CAAC,GAAG,EAAE,EACN,SAAwB,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACjC,EAAE;IAClB,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACxC,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,aAAa,EAAE,CAAC,KAAK,GAAG,iBAAiB,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CACxD,iBAAiB,CACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAChE,KAAK,CAAC,iBAAiB,CAAC,OAAO,GAAG,KAAK,CAAC;QACxC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;QAI3E,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,EAAE;YACR,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC;gBACnC,KAAK,EAAE;oBACN,OAAO,EAAE,2BAA2B;oBACpC,GAAG,EAAE,mBAAmB;iBACxB;aACD,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAC9C,2BAA2B,CAC3B,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACzB,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAClE,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,EAAuB,CAAC;QACpD,MAAM,CACL,KAAK,CAAC;YACL,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAClC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;SACpC,CAAC,CACF,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACpE,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,EAAuB,CAAC;QACpD,MAAM,CACL,KAAK,CAAC;YACL,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAClC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;SACpC,CAAC,CACF,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC3C,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YAC/C,OAAO,EAAE,iBAAiB,EAAE,CAAC,OAAO;YACpC,OAAO,EAAE,iBAAiB,EAAE,CAAC,OAAO;YACpC,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,KAAK;SAChB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACzE,IAAI,OAAO,GAAkD,GAAG,EAAE;QAElE,CAAC,CAAC;QACF,KAAK,CAAC,KAAK,CAAC,eAAe,CAC1B,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,EAAE;YACjD,OAAO,GAAG,OAAO,CAAC;QACnB,CAAC,CAAC,CACF,CAAC;QACF,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAGhB,mBAAmB,EAAE,CAAC;QACtB,mBAAmB,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACpB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QAC1E,IAAI,OAAO,GAAkD,GAAG,EAAE;QAElE,CAAC,CAAC;QACF,KAAK,CAAC,KAAK,CAAC,eAAe,CAC1B,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,EAAE;YACjD,OAAO,GAAG,OAAO,CAAC;QACnB,CAAC,CAAC,CACF,CAAC;QACF,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,mBAAmB,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACpB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAChF,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAA0B,CAAC;QAChD,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1C,MAAM,KAAK,EAAE,CAAC;QAGd,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QACrF,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IAC1B,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,MAAM,CACV,aAAa,CACZ,UAAU,EACV,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACvC,CACjB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,MAAM,CACV,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAiB,CACrE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAChE,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,MAAM,CACV,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAiB,CACrE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACnC,MAAM,UAAU,GAAG,KAAK,EACvB,cAA+B,KAAK,EAAE,EACtB,EAAE;QAClB,MAAM,CAAC,WAAW,CAAC,CAAC;QACpB,MAAM,KAAK,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM,MAAM,GAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM,QAAQ,EAAE,CAAC;QACjB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC/E,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACxE,KAAK,CAAC,KAAK;aACT,qBAAqB,CAAC,iBAAiB,EAAE,CAAC;aAC1C,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACpC,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM,QAAQ,EAAE,CAAC;QACjB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YAC/C,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,GAAG;YACZ,UAAU,EAAE,KAAK;SACjB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACtF,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9C,KAAK,CAAC,KAAK;aACT,qBAAqB,CAAC,iBAAiB,EAAE,CAAC;aAC1C,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/B,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM,QAAQ,EAAE,CAAC;QACjB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC3E,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9C,KAAK,CAAC,KAAK;aACT,qBAAqB,CAAC,iBAAiB,EAAE,CAAC;aAC1C,iBAAiB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAChD,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM,QAAQ,EAAE,CAAC;QACjB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAA0B,CAAC;QAChD,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,MAAM,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,QAAQ,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAGxD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAA0B,CAAC;QAChD,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,QAAQ,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACvE,IAAI,OAAO,GAAgC,GAAG,EAAE;QAEhD,CAAC,CAAC;QACF,KAAK,CAAC,cAAc,CAAC,eAAe,CACnC,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YAChC,OAAO,GAAG,OAAO,CAAC;QACnB,CAAC,CAAC,CACF,CAAC;QACF,MAAM,UAAU,EAAE,CAAC;QAEnB,GAAG,CAAC,GAAG,EAAE;YACR,KAAK,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC/B,MAAM,OAAO,GAAG,KAAK,IAAmB,EAAE;QACzC,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACpB,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;YACxD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,OAAO,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,OAAO,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACtE,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,OAAO,EAAE,CAAC;QAChB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAA0B,CAAC;QAChD,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAC1D,MAAM,CACL,KAAK,CAAC;YACL,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC5C,SAAS,EAAE,EAAE,OAAO,EAAE;SACtB,CAAC,CACF,CAAC;QACF,MAAM,OAAO,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAA0B,CAAC;QAChD,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAC/C,MAAM,CACL,KAAK,CAAC;YACL,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC5C,SAAS,EAAE,EAAE,OAAO,EAAE;SACtB,CAAC,CACF,CAAC;QACF,MAAM,OAAO,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,GAAG,CAAC,GAAG,EAAE;YACR,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,EAAE;YACR,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,MAAM,UAAU,GAAG,CAClB,GAAG,GAAG,0BAA0B,EAChC,OAAO,GAAG,cAAc,EACjB,EAAE;QACT,GAAG,CAAC,GAAG,EAAE;YACR,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,MAAM,KAAK,EAAE,CAAC;QACd,UAAU,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,EAAoC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,UAAU,EAAE,CAAC;QACb,MAAM,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,EAAoC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,KAAK,EAAE,CAAC;QACd,UAAU,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;QAC/C,UAAU,CAAC,0BAA0B,EAAE,YAAY,CAAC,CAAC;QACrD,MAAM,CAAC,oBAAoB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QACjF,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAc,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,UAAU,EAAE,CAAC;QACb,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACvC,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,EAAE,CAAC,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC5D,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAc,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,UAAU,EAAE,CAAC;QACb,GAAG,CAAC,GAAG,EAAE;YACR,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACvC,GAAG,CAAC,GAAG,EAAE;YACR,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChB,UAAU,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAChF,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,EAAoC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC;QACxC,UAAU,EAAE,CAAC;QACb,MAAM,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=puzzleCanvas.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puzzleCanvas.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/puzzleCanvas.unit.test.ts"],"names":[],"mappings":""}